QR Codes for Restaurant Menus
The mistake is encoding the menu. Encode the address of a page you control, and the menu becomes something you can change on a Tuesday morning without touching a single table card.
Point at a page, not a file
Two versions of the same idea, and they behave completely differently.
A PDF. The phone downloads it and opens a document viewer. The text is the size the designer set, so the guest pinches and drags around an A4 page on a five-inch screen. It works, in the sense that the file arrives. Nobody enjoys it, and older phones handle it badly.
A web page. Text reflows to the screen, loads in a second, works on any phone, and — the part that matters commercially — you can change it. New prices, a sold-out dish, a seasonal section: edit the page, and every printed code in the room is already pointing at the new version.
So: encode a short URL on your own domain, such as restaurantname.com/menu. Better still, encode restaurantname.com/m and make that a redirect, so you can move the real menu page later without the codes caring. The reasoning is in static versus dynamic QR codes.
What the menu page has to do
The code is the easy half. A guest who scans and then waits eight seconds for a page to load has had a worse experience than one handed a card.
- Load in under two seconds on mobile data. Restaurants are frequently places with poor signal. Plain HTML and text, no heavy hero images, no carousel.
- Be readable without zooming. 16px minimum body text. This is the single most common complaint about QR menus and it is entirely a design choice.
- Work without an app, an account or a cookie banner. Anything between the scan and the menu costs you.
- Include allergen information. In much of Europe this is a legal requirement, and a digital menu is a good place to do it properly rather than in a footnote.
- Not be a PDF embedded in a page. That is the worst of both approaches.
Keep a handful of printed menus behind the bar regardless. Some guests will not scan, some phones will not cooperate, and a restaurant that cannot serve someone without a smartphone has a problem that is not technical.
The table card
A table card is read from roughly 30 cm, so the 10:1 rule gives a 30 mm code, and 35–40 mm is more comfortable in a dim room.
| Decision | Recommendation | Why |
|---|---|---|
| Code size | 35–40 mm | Read at 30 cm, in low light, at an angle |
| Error correction | M | Indoors and clean; H would shrink the modules |
| Finish | Matt | Gloss reflects the ceiling lights straight into the camera |
| Text above | “Scan for our menu” | A bare square gets scanned much less |
| Text below | The URL, small | Rescues anyone whose camera will not play |
| Stand angle | Tilted, not flat | A flat card on a table is read at a steep angle |
The finish deserves emphasis. Restaurant lighting is overhead, table cards are near-horizontal, and glossy lamination puts a bright reflection over part of the symbol at exactly the angle a seated guest holds a phone. Matt lamination costs the same and solves it.
If you print table numbers on the same card, consider giving each table its own code — restaurantname.com/m?t=12 — so that if you later add ordering, the table is already known. It costs nothing now and saves a reprint later.
Changing the menu without reprinting
This is the whole benefit, and it depends on one decision made at the start: the code points at an address you control, not at a file and not at a third party.
# Netlify _redirects
/m https://restaurantname.com/menu/autumn 302
# Apache .htaccess
Redirect 302 /m https://restaurantname.com/menu/autumn
Use 302, not 301, so browsers do not permanently cache the old destination. Change the target whenever the menu changes; the cards on the tables never change.
What goes wrong in a dining room
- Testing at the counter, in daylight. Test at a table, in the evening, on the oldest phone in the building. Restaurant light is much dimmer than it feels.
- The code inside a glossy sleeve. See above; it is the most common physical failure.
- The code too small because the designer wanted the card to look clean. 20 mm at a table is marginal.
- The menu page pointing at a PDF anyway. Halfway measures produce all the drawbacks of both.
- Nobody knowing what it is for. A code with no caption gets ignored. Four words fix it.
- Cards laminated with the quiet zone trimmed off. Four empty modules on every side, and the trim line must not come near them.
Before printing a hundred cards, run through the pre-print checklist — most of these are on it.
Written by Manuel Llovet, who builds and maintains QR Code Free Forever. Published 2026-08-31, last checked 2026-09-08. Figures and measurements on this page were produced for this site; the method is described in each caption.