Library · Conversions & Reservations · 9 min read · By The Muntin Desk
How to put your restaurant menu online, the right way.
The menu page is the single most-visited page on a restaurant site, and most operators ship it as a PDF — which hides it from Google, hides it from ChatGPT, and hides it from the diner who tapped “menu” on a phone with one bar of signal. Real HTML, sectioned by service, with descriptions that sell, prices that show, dietary markers inline, and MenuItem schema underneath. This page walks the whole setup.
Open the analytics on any restaurant site that has been live for a year, and the menu page sits at the top of the list — usually two to three times the homepage traffic. It is the page a diner taps after the Google panel, after the Instagram bio, after the friend’s text. It is also, for most independents, the page that has had the least thought put into it. What follows is the plain version: the surfaces, the one technical truth most operators miss, and the eight pieces that turn a printed menu into a menu page that wins both search and the booking.
Why your menu page is the most important page on your site
The menu page is the page a diner reads before deciding to book, walk in, or scroll past. It carries more conversion weight than the homepage and more search weight than every other interior page combined.
That is true across cuisines, across price points, and across cities. The homepage tells a diner who you are; the menu page tells them whether to come. Treat the menu page as the storefront window — the one that decides whether the door opens at all.
Two reads are happening on that page at once. A human diner is scanning for a price band, for two or three dishes that sound like a meal, and for whatever marker fits a partner with a gluten allergy or a vegetarian kid. A search engine or an AI assistant is reading the same page for structured facts — dish names, descriptions, prices, sections — that it can quote back when someone two miles away types “Italian near me with vegetarian options.” A menu page that wins both reads is the page that wins the booking, and the two reads reward the same shape: structured HTML with prices and dietary markers in the body text.
The wider context for this page sits in what should be on a restaurant website; the menu page is one chapter inside that bigger setup. If you are still deciding whether the site is worth building at all, does my restaurant need a website is the prior question; almost every operator finishes that piece deciding the answer is yes, and the menu page is the largest reason why.
One page, two readers. Design the menu page for the human diner first, then verify a machine can read what the diner reads. If the human and the machine read different surfaces — a photo-menu image plus a stripped HTML fallback, say — the machine wins the search and the human bounces.
PDF vs real web menu: the mistake that hides you from search
A PDF link is not a web menu. Google indexes PDFs differently from HTML body text, AI assistants quote HTML, and a phone on slow LTE often will not open a PDF at all before the diner taps back to the search results.
Operators love PDFs because the print designer already made one and it ships in five minutes. The cost is invisible — it shows up as the menu queries you never rank for, the AI answers that never name you, and the mobile diner who never sees the dishes at all.
Google’s own documentation confirms that HTML body text is the primary signal the index reads for ranking and snippet extraction. PDFs are crawlable in a different lane — they appear in results, but the text inside them is harder for the index to associate with the host page, and AI Overviews and assistants overwhelmingly quote HTML. A linked “Menu.pdf” tells the index that the menu lives elsewhere, in a format the index treats as a downloadable document rather than a page of your site. The dish names, the descriptions, the prices — none of it is part of what Google can quote back when a diner types “tacos al pastor in Bethesda.”
Source: Google Search Central on HTML vs PDF indexing
Google Search Central — documentation on PDF and HTML indexing.
Google’s Search Central documentation describes PDFs as a separate document type the crawler handles differently from HTML — it can index PDF text but the surrounding HTML page provides the canonical context for ranking and rich-result extraction. The same documentation set covers MenuItem structured-data requirements, which depend on parseable HTML on the host page. Treat the practical read this way: the dish names a diner reads on a PDF are not the dish names a search index quotes back.
<p><a href="/menu.pdf">See our menu (PDF)</a></p>
Zero dish names, zero prices, zero descriptions on the web page itself. The menu lives in a downloadable document that Google indexes in a separate lane and that AI assistants overwhelmingly do not quote. Dish-level queries miss the site entirely.
<section class="menu-section">
<h3>Tacos</h3>
<article class="menu-item">
<h4>Tacos al Pastor</h4>
<p>Marinated pork, pineapple, white onion, cilantro on house corn tortillas. <span class="dietary">GF</span></p>
<p class="price">$14</p>
</article>
</section>
Dish name, description, price, and dietary marker all sit in HTML body text on the page itself — the surface Google ranks and AI assistants quote.
There is one acceptable use of a PDF on the menu page — offering it as a printable, downloadable supplement alongside the HTML menu, for the small share of diners who want a paper copy in advance of a private event. The PDF lives next to the HTML, never instead of it. If the only way a diner can read your menu is to download a file, your menu is hiding from the diner’s phone and from the index that decides who gets named.
The same trap wears a second costume worth naming, because AI assistants actively recommend it: the Canva menu. Ask an AI which platform to use and it will often suggest designing the menu in Canva and embedding it on the site — and a Canva-designed menu, embedded, is an image. An image is exactly as invisible to Google’s body-text index and to the assistants that quote HTML as a PDF is, for the same reason: the dish names, the descriptions, and the prices are pixels, not text. The menu looks beautiful and ranks for nothing. A Canva graphic is fine as a downloadable supplement next to the HTML menu, the same way a PDF is — never as the menu itself. If the only menu on the page is a Canva image, the page has no menu as far as search and AI are concerned.
Already on a PDF or a Canva image? The fastest path off is to copy the dish names, descriptions, and prices into structured HTML once — ideally pulling from a single source the kitchen will edit going forward. The studio’s menu converter takes a paper menu or a PDF and outputs the sectioned-HTML scaffold described in §3 below, ready to drop into your site.
How to structure a menu page that converts
A menu page that converts walks a diner from section, to dish, to price, to a reservation or order button — in that order. Six moves do the work, and they map to the structured-data steps a search index reads.
The order matters. Each step is a precondition for the next; skipping one breaks the rest. Read them top to bottom.
1. Pick a content source. Choose one place where the menu lives in a structured form — the POS catalog (Toast, Square, Clover all expose menu items as data), a content store like a CMS or a JSON file in your repo, or in the smallest case a Google Sheet the kitchen edits. The web page renders from that source, never from a re-typed copy on the page itself. The discipline up-front saves the drift problem in §5.
2. Organize by service. Diners scan by service first, dish second. A page that mixes brunch, lunch, dinner, and the bar list into one long scroll asks the diner to do triage. Break the page into service-shaped sections — each its own H2 or H3, each with a clear heading the diner can jump to. Three short, scannable sections beat one cathedral menu on every measure.
3. Write extractable descriptions. The description field is the field AI Overviews quote back when someone asks “what are the tacos at this place like.” Write one sentence per dish that names the main ingredient, the preparation, and one detail a diner would otherwise ask the server. “Marinated pork, pineapple, white onion, cilantro on house corn tortillas” beats “our famous tacos” on every reader — human and machine. Adjective-only descriptions tell the diner nothing they did not already assume.
4. Set price display. Show every price as plain digits next to the dish. Skip the currency-stripped trick (printing “14” with no dollar sign and no decimals to soften the bill), skip the hide-on-mobile rule that some templates default to, and skip the worst version — leaving prices off the page entirely. The data is the same one diners get on Google’s panel anyway; hiding it makes the page less useful, not more aspirational.
5. Add dietary markers. Mark vegetarian, vegan, gluten-free, and dairy-free items inline next to the dish — a small V, VG, GF, DF chip, icon, or styled span. Add a one-line allergen note at the top of each section that points diners with anaphylactic allergies to ask the staff directly. Inline markers do four things at once: they help the diner scan, they signal to a search engine that the page covers dietary filters, they reduce the host-stand call volume on dietary questions, and they make the page accessible without forcing every reader through a footnote.
6. Add MenuItem schema. Underneath the HTML, ship a Menu block in JSON-LD with hasMenuSection wrapping hasMenuItem entries — each with name, description, and an Offer block with price and priceCurrency. This is what Google quotes in rich results and what AI assistants extract when they answer dish-level queries. The full payload pattern, with copy-paste JSON-LD, is in the restaurant schema markup guide.
Source: Muntin Digital schema reference
Muntin Digital library — restaurant schema markup guide, §2 (Menu).
The MenuItem pattern above — hasMenuSection wrapping hasMenuItem entries with name, description, and an Offer sub-block — is the schema shape Google documents in its structured-data reference and the one the studio ships in client builds. Empty description fields read as items without context; the AI Overview citation surface depends on that field carrying real text.
One adjacent piece worth naming: photographs of dishes. Real photos on the menu page lift bookings on every measure, but only when shot to the spec the platforms expect — aspect ratio, resolution, and weight all matter. The full reference lives in the restaurant photo spec sheet; the short version is “real photos of your real dishes, never stock, sized for the surface they appear on, lazy-loaded so they do not slow the first paint.”
Source: Muntin photo specifications
Muntin Digital library — restaurant photo spec sheet.
Aspect ratios, pixel widths, file weights, and lazy-load behaviour for menu and surface photos. The photo spec sheet is the canonical reference the studio audits client menu pages against, including the menu-thumbnail and menu-detail surfaces that appear on the page above.
The order is the discipline. If the kitchen edits the source first, the HTML renders from it, the schema reads the HTML, and the photos sit beside the items, the page stays clean for years. Skip any one of those and the menu page drifts — usually quietly — into the version that costs you bookings.
Make it findable: menu schema + AI
Real HTML wins the index; menu schema wins the rich result and the AI citation. The two run together — schema without HTML body text has nothing to anchor to, and HTML without schema asks Google to guess at structure it could have been told.
Think of schema as the labelled version of the page the index already has. The HTML tells Google what the page says; the schema tells Google which strings are dish names, which are descriptions, and which are prices. With both, Google can quote individual items in a rich result, and an AI assistant can answer “does this restaurant have a vegetarian entrée under twenty dollars” from the page itself rather than from a third-party aggregator.
The minimum payload is small. A Menu node, one or more MenuSection entries, and a MenuItem per dish with name, description, and an Offer block. The patterns are the same six on the restaurant schema markup guide, and validation is free — Google’s Rich Results Test tells you whether the page parses before you ship it.
The AI side rewards the same shape. ChatGPT, Perplexity, and Google’s AI Overviews all answer dish-level questions from the structured fields they can read on the page; an empty description field is an answer the assistant cannot give. The practical read is that the description is doing more work than the dish name — the name appears in the menu PDF on the wall, but the description is the part only the web page carries.
One schema gate. When the menu page goes live, run it through Google’s Rich Results Test once. A passing test confirms the index can parse what the page intends. A failing test usually points at a missing priceCurrency or a malformed Offer block — both five-minute fixes.
Keep it current without a developer
The maintenance trap on every menu page is two menus drifting apart — the one the kitchen prints, and the one the web page shows. The fix is structural, not heroic.
Within a season, the prices are off by a dollar, the new pasta is missing, and the discontinued summer cocktail is still on the bar list. None of that is a content problem; it is an architecture problem, and it ends when the page renders from one source.
Pick a single source of truth for menu data, write the web page so it renders from that source, and the drift problem stops being a recurring chore. Three reasonable sources, in order of how often they pay back:
The POS catalog. Toast, Square, and Clover all expose menu items, modifiers, and prices through an API. A sync that pulls from the POS overnight and rebuilds the menu page from the result keeps the printed menu, the order screen, and the web page on one schedule. The kitchen edits the dish once — in the POS, where they were going to edit it anyway — and every downstream surface follows.
A content store the kitchen owns. If the POS is too rigid for descriptive language, a CMS surface or a structured file (a JSON or YAML file in the site repo, edited through a friendly admin) does the same job at a smaller scale. The discipline is the same: one place to edit, one place to render from. The studio ships this pattern in roughly half of client builds; the other half pull from the POS.
A spreadsheet, in the smallest case. A Google Sheet with one row per dish — name, description, price, section, dietary markers — that the kitchen edits and the site renders from on a nightly build is the no-budget version. It is less polished than the POS sync; it is dramatically better than the manual page edit it replaces.
None of these need a developer for the weekly edit. The one-time build does — setting up the sync, the schema generator, the rebuild trigger — but after that the menu page becomes a kitchen edit, not an IT ticket. That is the difference between a menu page that stays current and one that quietly drifts until the host stand starts fielding “is the chicken parm still on the menu” calls.
The first-party order angle. If you take delivery and pickup directly, the same source-of-truth pattern feeds the online ordering surface as well as the menu page. A diner reading the menu and tapping “order direct” should see the same items at the same prices — the kind of direct ordering setup that keeps you off a 15-to-30-percent platform commission. The full walk of that trade-off — ChowNow, Toast, Square, Owner.com, and your own site, compared on the real per-order cost — lives in commission-free online ordering for restaurants, and the choice of where the whole site lives is in best restaurant website platform.
The 8-point menu-page checklist (close)
Eight items, walked top to bottom, decide whether a menu page reads as a working surface or as a placeholder. Run them against your own page; the first failure is where to start.
Each branch below names what passes, what warns, and what fails — with the discipline that earns the pass. None of the eight are optional; the page works when all eight are clean.
-
1Real HTML body text, not a PDF link
Pass Dish names, descriptions, prices, and section headings all render as HTML on the page itself. The PDF, if it exists, is a printable supplement next to the live menu.
Fail The menu page is a single link to a PDF. The diner downloads a file, the index reads no dishes, the AI assistant has nothing to quote.
-
2Sectioned by service
Pass Brunch, lunch, dinner, and bar each sit in their own section with a clear heading. A diner scanning the page jumps to the service they want, then reads dishes inside it.
Warn One long undifferentiated scroll. The diner does the triage the page should have done for them, and roughly two of every three give up before they reach the dinner entrées.
-
3Item descriptions that sell
Pass Every dish carries one sentence naming the main ingredient, the preparation, and one detail a diner would ask the server. The sentence reads as the dish itself, not as marketing.
Fail Adjective-only descriptions — “famous,” “signature,” “perfect” — tell the diner nothing they did not already assume, and give an AI assistant nothing to quote.
-
4Explicit prices, in plain digits
Pass Every dish shows its price next to the name — full dollars and cents, currency sign included, visible on every device. The diner sees the bill before they decide to come.
Fail Currency-stripped prices, hidden price chips, or no prices at all. The diner filters the restaurant out for an unknown-price restaurant down the block before they ever click in.
-
5Allergen and dietary markers inline
Pass V, VG, GF, DF chips sit next to each dish, with a one-line allergen note at the top of each section pointing anaphylactic guests to the staff. Diners scan and filter on the page.
Warn Dietary info buried in a separate footnote section. Diners with restrictions read a wall of text to find their three options — or, more often, walk past.
-
6Real photos, shot to spec
Pass Photographs of your dishes, sized for the surface they appear on, lazy-loaded so they do not slow the first paint. Spec lives in the photo spec sheet.
Fail Stock photography, dish photos from a different restaurant, or oversized images that delay the first meaningful paint. Diners read the page as inauthentic, and the page loads slowly enough that the mobile diner taps back.
-
7MenuItem schema underneath
Pass A JSON-LD Menu block sits in the page head with
hasMenuSectionwrappinghasMenuItementries — each carryingname,description, and anOfferblock withpriceandpriceCurrency. Validates in the Rich Results Test.Warn Schema present but missing
descriptionorOfferfields. Google can identify the items but cannot quote them; AI Overviews skip the page when answering dish-level queries. -
8Single source of truth from kitchen to web
Pass The POS catalog or a content store the kitchen edits is the source the web page renders from. A sync rebuilds the page on every change — or at least nightly. The printed menu and the web menu stay aligned.
Fail A copy-pasted HTML page the developer last touched eight months ago. The prices are off, the new pasta is missing, and the host stand fields the drift as phone calls.
Frequently asked questions
Should my restaurant menu be a PDF or a web page? A web page. PDFs are not crawled and quoted the way HTML body text is, so a PDF link makes the menu invisible to discovery surfaces. Ship structured HTML.
Can I use a Canva menu on my website? Not as your only menu. An embedded Canva menu is an image — the dish names and prices are pixels, not text, so it is invisible to Google and AI the same way a PDF is. Fine as a downloadable supplement next to a real HTML menu; never instead of one.
Should I put prices on my online menu? Yes. The no-prices trick costs more bookings than it saves — diners filter unknown-price restaurants out before they ever click. The only fair exception is a tasting-menu-only restaurant or a daily-changing prix fixe, where one price replaces the line items.
How do I add allergen and dietary info to an online menu? Add concise dietary markers inline next to each item — V, VG, GF, DF chips or icons — plus a one-line allergen note at the top of each section pointing guests to the staff for anaphylactic allergies. Do not make guests dig through a footnote.
Does menu schema help my restaurant show up in Google and AI search? Yes. Menu and MenuItem schema let Google quote items directly in rich results and help AI assistants extract structured answers about your dishes. Real HTML body text plus valid schema is the citation pattern that wins both surfaces.
How do I keep my online menu in sync with the kitchen? Pick a single source of truth — the POS catalog or a content store the kitchen edits — and write a sync that runs on every kitchen change, or at least nightly. Manual updates drift; the menu on the wall ends up different from the one on the web.
Tell us
Be the first field note on this piece.
Tried this in your own restaurant? 100–400 words, your name on it. Don reads every one. Your note shows up here once approved.