Checklist Published

Restaurant QR menu best practices for tourist markets (text size, allergens, language toggle)

QR menu best practices for tourist-heavy restaurants — language toggle that uses sibling URLs not query strings, allergen translation pitfalls (crustáceos vs mariscos), sticker placement by seating type, body text size.

Primary intent: qr menu best practices tourist restaurant Sources: S-001,S-008,S-017,S-019,S-024,S-301

Tourist-market restaurants have a harder QR menu problem than neighbourhood restaurants. The diner doesn’t speak the local language, doesn’t know the local allergen vocabulary, and is often on hotel Wi-Fi or roaming. This post is a checklist for restaurants in Lisbon, Berlin, Barcelona, Florence, Seoul, Bangkok, and anywhere else tourists are a meaningful share of covers.

TLDR

Five things matter: (1) language toggle uses sibling URLs (/menu/en, /menu/es) not query strings; (2) hreflang annotations on each version; (3) allergen names are human-translated, not Google-translated; (4) sticker placement adapts to seating type; (5) the page still loads on slow international roaming.

Why tourist menus are different

In our 5-restaurant sample (S-301), the Lisbon and Berlin menus both routed to PDFs that were single-language (Portuguese and German respectively). The Berkeley menu was bilingual EN/ES but rendered as one PDF page with both languages mixed — readable to neither audience.

The pain is the same as in any QR menu — pinch-and-squint (S-001) — magnified by the language barrier.

The 7-row tourist-market checklist

Row 1 — Language toggle uses sibling URLs

Pass: /menu/en, /menu/es, /menu/pt — three distinct URLs, each with its own canonical and meta description.

Fail: /menu?lang=en query strings; or worse, all languages on one page.

Why: Google can index each language version separately and rank for native-language queries (“menu” vs “menú vegano” vs “Speisekarte”). Sibling URLs are cleaner with hreflang.

Row 2 — hreflang annotations are present

In each version’s <head>:

<link rel="alternate" hreflang="en" href="https://yourdomain.com/menu/en">
<link rel="alternate" hreflang="es" href="https://yourdomain.com/menu/es">
<link rel="alternate" hreflang="pt" href="https://yourdomain.com/menu/pt">
<link rel="alternate" hreflang="x-default" href="https://yourdomain.com/menu/en">

This tells Google which version to show for which user’s language preference.

Row 3 — Allergen names are human-translated

Run the allergen line past a human translator for each language. The cost is under $50 per language; the risk of getting it wrong is non-trivial.

Specific pitfalls from the allergen labelling post:

  • “Shellfish” → Spanish mariscos in colloquial use, but EU law splits crustáceos (crab/prawns/lobster) from moluscos (clams/mussels/scallops) (S-019). The right translation is the regulatory term.
  • “Tree nuts” → German Schalenfrüchte, French fruits à coque. But list the actual nuts (almond, hazelnut, walnut…) because the umbrella term is unfamiliar to many.
  • “Wheat” vs “gluten” — the EU groups under gluten-containing cereals (S-019), the US splits wheat out (S-017). Use both terms if in doubt.

Row 4 — Body text scales to 17px+ on mobile

Same as the 10-row audit row 2. WCAG 2.2 SC 1.4.4 applies regardless of language (S-008). Translated menus often have longer words — German item names blow up width; CJK characters need at least 16px to be readable.

Row 5 — Sticker placement adapts to seating

Tourist restaurants have a wider seating mix than neighbourhood spots:

Seating typeBest sticker placement
4-top dining tableCentre of table, near the salt/pepper. Avoid edges where elbows cover it.
Bar stool / stand-up barOn the bar surface near the menu rail, or on a small table-tent if no surface available. Bartenders often prefer the table tent.
Outdoor patioLaminated sticker on the table corner, plus a backup stand. Outdoor sunlight glare matters — see row 7.
Communal long tableRepeat the QR every 4-6 seats. One QR on a 16-seat communal is unfindable.
Counter / takeoutWindow decal at eye level + a small sticker at the register.

Row 6 — The page loads on international roaming

Tourists often roam at slow speeds. LCP under 2.5s on a slow-4G profile (per Google’s Core Web Vitals threshold) is the target. PDFs fail; HTML pages routinely pass.

Workflow test: in Chrome DevTools, throttle to “Slow 4G”, reload your menu URL, check the LCP in the Performance tab. If above 2.5s, the LCP element is probably an image or a font. Inline critical CSS, drop the web font above the fold, lazy-load images.

Row 7 — Glare and laminate considerations for outdoor menus

A small physical detail with a real impact: glossy laminated QR stickers reflect sunlight and become unscannable. Use a matte laminate for outdoor seating. If the QR is on a wood table outdoors, dark sticker + light QR area scans better in direct sun than the reverse.

Language toggle pattern (HTML)

In the header of each language version:

<nav aria-label="Languages">
  <a href="/menu/en" hreflang="en" lang="en"
     aria-current={current === "en" ? "page" : null}>English</a>
  <a href="/menu/es" hreflang="es" lang="es"
     aria-current={current === "es" ? "page" : null}>Español</a>
  <a href="/menu/pt" hreflang="pt" lang="pt"
     aria-current={current === "pt" ? "page" : null}>Português</a>
</nav>

Notes:

  • lang attributes on each link tell screen readers to switch pronunciation.
  • aria-current="page" marks the active version.
  • Don’t auto-redirect based on browser locale — guests often want the local-language menu to learn the names.

Common mistakes

  1. Auto-translating with Google Translate at page load. The menu becomes inconsistent between visits and accents get butchered.
  2. One PDF with all languages stacked. Each language is half-readable; together they fail every accessibility row.
  3. Different QR stickers for each language. Confusing. Use one QR with the language toggle.
  4. Forgetting hreflang. Google ranks the wrong version for tourist searches.
  5. Glossy sticker laminate outdoors. Unscannable in direct sun.

FAQ

What languages should I publish in?

Look at your reservation/walk-in mix. Most tourist markets justify two or three languages (the local language + English + one regional language). Four+ languages means longer maintenance.

Should I use auto-detection?

No — explicit toggle. Auto-detection annoys diners who want the original-language version, and it interferes with hreflang.

What about right-to-left languages (Arabic, Hebrew)?

Use dir="rtl" on the <html> of the RTL version. Mirror the layout so prices land on the left, not the right. Test the toggle UI doesn’t break.

Do I need a translator for the entire menu?

For allergens and dietary labels: yes, human translator. For item names, menu descriptions: human-preferred, but a competent server who speaks the language can review machine-translated text in 30 minutes.

What if the QR sticker is the wrong language?

The QR is language-agnostic — it just encodes a URL. The destination URL routes to the language toggle. Make sure your dynamic QR (S-024) points at the language-selector page, not directly at /menu/en.


For the deeper bilingual setup, see the bilingual QR menu post. For the underlying menu audit, the 10-row scorecard still applies — language compliance is on top.