Static or dynamic? For a menu, go dynamic
You could encode a link to a PDF directly into a static code. It is free and it works. But the day you change a price, run out of the special, or update the seasonal menu, that static code is locked to the old version and you are reprinting every table tent.
A dynamic QR code points to a short link you control, so you can swap the destination — the new menu, the new PDF, the new page — and every printed code instantly points to the latest version. Print once, update forever. For a restaurant menu, that alone pays for itself the first time a supplier price changes. If you want the full distinction, we covered it in static vs dynamic QR codes.
Step 1: Put your menu somewhere it can live
Your code has to point at something. You have two clean options:
A web page menu. The best experience — it loads fast, reflows on a phone, and you can update it instantly. A simple page on your own site is ideal.
A hosted PDF. Fine if your menu is already designed as a PDF. Keep it light so it loads quickly on mobile data, and make sure the text is legible without pinching to zoom.
Whichever you choose, the destination should be mobile-first. Most guests will never see it on a desktop.
Step 2: Generate a dynamic QR code that points to it
Create a dynamic code and set its destination to your menu URL. Because it is dynamic, you can come back any time and change that destination without touching the printed code. With EUQR you can do this in seconds, and the scan analytics are privacy-first by default — more on that below.
Step 3: Make it look like it belongs on your table
A raw black-and-white square works, but a little design earns more scans and looks intentional. Set your brand colours, raise the error-correction level if you are adding a centre logo (higher correction keeps the code scannable even with a logo in the middle), and export a crisp SVG for print so it stays sharp at any size — from a small table tent to a window poster.
Practical tips that matter in a real dining room: keep the code at least 2–3 cm wide on a table tent, add a one-line instruction ("Scan for our menu"), and test it under your actual lighting. A code behind glare or printed too small is a frustrated guest waving down a waiter.
Step 4: Keep it GDPR-friendly
Here is the part that turns a menu into a compliance question. A plain menu that just shows dishes collects nothing sensitive. But the moment your menu page does more — an ordering system, a loyalty sign-up, a "leave us a review" prompt, a Wi-Fi login, or embedded Google Analytics and a Meta pixel — you are processing personal data, and EU rules apply.
A few principles keep you clear:
Only collect what you need. A menu does not need a guest's email to show them the soup of the day. If you add ordering or loyalty, collect the minimum and say why.
Get consent for non-essential cookies. If your menu page loads third-party trackers, you need a proper opt-in banner — not a pre-ticked box.
Mind where the scan data lives. Many QR tools route every scan through US servers and log full IP addresses. EUQR computes scan analytics from privacy-preserving daily-rotated hashes, stores no raw IPs, and sets no third-party cookies — so you learn that 80 guests scanned on Friday evening without ever holding data that identifies any of them.
For the full picture, see our guide on whether QR codes are GDPR-compliant.
Step 5: Print, place, and watch what works
Put codes where hands and eyes naturally fall: table tents, the bottom of the physical menu, the window for passers-by, the bill holder. Because your code is dynamic, you also get scan data — when people scan, on what device, roughly where. Use it. If the window code outperforms the table code, you have learned something about how guests find you.
Step 6: Update seasonally, never reprint
This is the long-term payoff. New season, new prices, a sold-out dish, a special event menu for the weekend — change the destination once and every code on every table is current. The printed square never changes; only what it points to does. And if you ever pause your subscription, EUQR keeps the code alive on a branded Recovery Page for 90 days rather than dropping diners on a dead link.