Skip to content
MenuFramer
Articles
MenuFramerArticle

Restaurant menu SEO: how to make your menu findable on Google (2026)

How Google reads a restaurant menu, the structured data it documents, a JSON-LD example to copy, and a checklist for checking your work.

By MenuFramer · · updated · 18 min read

In this article

To make your restaurant menu findable on Google, put every dish on a page of your own website as real text, describe the restaurant and its menu with structured data, and point your Google Business Profile's menu link at that page. Google indexes the text on web pages, so a menu written that way is a menu Google can read. That makes it eligible to appear in search. Nobody can promise where it will appear, or that it will, and Google says the same about its own features.

This guide covers how Google reads a menu, the structured data Google and schema.org document for restaurants, your Business Profile, AI features, embedded menus, and how to check your work.

What restaurant menu SEO means

Menu SEO is the work of making your menu readable by search engines, so that it's eligible to appear when someone searches for your restaurant or a dish you serve. It comes down to three things Google documents: text it can index, structured data that describes your restaurant, and a Business Profile that points to the right page.

Picture two friends deciding where to eat at 6:15 on a Friday. One of them searches for your restaurant and the lamb dish they had there last spring. If that dish is written on your menu page as text, the page holds words Google can read. If the dish only exists inside a photo of the printed menu, the page itself holds no words for it.

The rest of this guide takes each piece in turn, starting with how Google reads a page.

How Google reads a restaurant menu

Text on a web page

Google processes pages in three phases: crawling, rendering and indexing. When its resources allow, a headless Chromium browser renders the page and runs its JavaScript, and Google uses the rendered HTML to index the page (Google, JavaScript SEO basics). So the test for your menu is whether the dishes are there as words once the page has loaded.

Google's guidance on AI features puts the same idea in one line: make sure that important content is available in textual form (Google, AI features). On a restaurant's website, the menu is that content.

Google also uses the mobile version of a site's content, crawled with a smartphone agent, for indexing and ranking. It asks that your mobile site contain the same content as your desktop site (Google, mobile-first indexing). If your menu looks different on a phone, the phone version is the one Google reads, so every dish needs to be there too.

PDF menus

Google can index a PDF. PDF is on Google's list of indexable file types. In a 2011 post, Google said it can index the text in PDF files in any language, that if you can copy and paste the text out of a PDF it should be able to index that text, and that it may run OCR on PDFs made of scanned images (Google, PDFs in Google search results).

So a PDF menu can be read. What a PDF can't give you is an address for each dish. The whole menu is one file at one address, and every dish shares it. The structured data in this guide also needs a web page: the three formats Google supports (JSON-LD, Microdata and RDFa) are all written into a page's HTML (Google, intro to structured data). How a PDF and a menu page compare on a phone, in Google and for a screen reader is covered in PDF menu vs. online menu.

A photo or scan of your printed menu is an image file. Google lists common image formats among the files it indexes, and that page doesn't say Google reads the words inside a picture (Google, indexable file types). Treat a picture of your menu as a picture.

The web's accessibility guidelines ask for the same thing from the guest's side. WCAG success criterion 1.4.5 asks that information be shown as text wherever the technology can produce the same look, so people can change its size, font, spacing and colours (W3C, Understanding images of text). If you love the look of your printed menu, keep the photo, and put the dishes on the page as text as well.

Dishes that load only after a tap

Google says it won't load content that needs a user interaction, such as swiping, clicking or typing, to load (Google, mobile-first indexing). Think of a menu that shows section names and fetches the dishes only when a guest taps Mains. When Google renders that page, those dishes haven't been loaded.

The fix is to have every dish in the page when it first loads. You can still style sections so a guest can jump between them.

Google can generally crawl a link only if it's an <a> element with an href attribute. Links that JavaScript adds to the page are crawlable too (Google, link best practices).

If every dish has its own page on your site, with a plain link to it from the menu, each dish has an address Google can crawl and a guest can share. A page per dish is optional. It gives each dish an address of its own, with its name, description, price and photo as the main subject of the page.

Structured data for restaurants

Structured data is a block of code that describes your page in a standard vocabulary. Guests never see it. Google recommends the JSON-LD format, written in a <script> tag in the page's HTML (Google, intro to structured data). It states facts the page already shows, such as your name, address, cuisine, prices and dishes, in a fixed format.

What Google documents for restaurants

Google's local business structured data guide, last updated on 8 September 2026, covers restaurants as a kind of local business. It asks you to use the most specific type you can, and its own example uses Restaurant. The guide requires name and address. Three of its recommended properties are about food:

PropertyWhat Google's guide says
menuFor food establishments, the full URL of the menu
servesCuisineThe type of cuisine the restaurant serves
priceRangeThe relative price range, as a numerical range or a number of currency signs. Under 100 characters, or Google won't show it

The guide also recommends telephone, url, opening hours, geo and a few others. Google states that it doesn't guarantee that features that use structured data will show up in search results.

Google's guide stops at the menu's address. schema.org, the shared vocabulary that structured data is written in, describes the menu itself:

  • Menu: a structured representation of the food or drink items a restaurant offers.
  • MenuSection: a sub-grouping of items in a menu, such as starters or drinks.
  • MenuItem: a food or drink item in a menu or menu section.

Menus and sections hold their contents with hasMenuSection and hasMenuItem. A MenuItem can carry offers, which holds an Offer with a price and a priceCurrency such as USD. It can also carry suitableForDiet, a diet the dish fits.

The expected values for suitableForDiet include schema.org's RestrictedDiet list, which has eleven entries: DiabeticDiet, GlutenFreeDiet, HalalDiet, HinduDiet, KosherDiet, LowCalorieDiet, LowFatDiet, LowLactoseDiet, LowSaltDiet, VeganDiet and VegetarianDiet. None of them names a single allergen. When a guest asks about nuts, the answer belongs in the dish's description on the page, written in words. What US rules ask of that wording is in Allergens on restaurant menus.

One naming change to know about. schema.org now lists hasMenu as the property that supersedes menu, and hasMenu can hold a whole structured Menu, plain text or a URL. Google's guide still documents menu as the URL of your menu. The example below uses both: menu for the address, as Google documents it, and hasMenu for the full menu.

A rich result is a search result with extra features drawn from structured data. Google's search gallery lists 25 structured data features, from Article to Video. Local business is one of them. None of them is a menu or a menu item, so Google doesn't document any special display for Menu markup.

Whether to add Menu markup is your call. It takes little extra work once the menu is text on the page, it describes your dishes, prices and diets in a standard vocabulary, and it sits inside Restaurant markup that Google does document.

A copyable JSON-LD example

This example is for a made-up restaurant, Example Bistro, at example.com. Swap in your own details, keep only dishes and facts that appear on your menu page, and paste it into that page's HTML.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Restaurant",
  "name": "Example Bistro",
  "url": "https://www.example.com/",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Example Street",
    "addressLocality": "Anytown",
    "addressRegion": "OK",
    "addressCountry": "US"
  },
  "servesCuisine": "Mediterranean",
  "priceRange": "$$",
  "menu": "https://www.example.com/menu",
  "hasMenu": {
    "@type": "Menu",
    "name": "Dinner",
    "url": "https://www.example.com/menu",
    "hasMenuSection": [
      {
        "@type": "MenuSection",
        "name": "Small plates",
        "hasMenuItem": [
          {
            "@type": "MenuItem",
            "name": "Charred carrots with tahini",
            "description": "Roasted carrots, tahini, toasted sesame and lemon.",
            "url": "https://www.example.com/menu/charred-carrots",
            "offers": {
              "@type": "Offer",
              "price": "11.00",
              "priceCurrency": "USD"
            },
            "suitableForDiet": [
              "https://schema.org/VeganDiet",
              "https://schema.org/GlutenFreeDiet"
            ]
          },
          {
            "@type": "MenuItem",
            "name": "Lamb meatballs",
            "description": "Lamb, mint and garlic yogurt. Contains dairy.",
            "url": "https://www.example.com/menu/lamb-meatballs",
            "offers": {
              "@type": "Offer",
              "price": "14.00",
              "priceCurrency": "USD"
            }
          }
        ]
      }
    ]
  }
}
</script>

A few notes on the example:

  • Prices use a full stop as the decimal point, and the currency is a code such as USD, as schema.org's Offer guidelines ask.
  • suitableForDiet uses the full schema.org address of each diet. List a diet only when the dish fits it as your kitchen makes it.
  • Each dish's url points to a page for that dish. If your dishes don't have their own pages, leave url out.

Where to put it, and keeping it true

Google's guide says local business markup can go on any page of your site, and a page that describes your business is usually the better fit. Each location gets its own entry. Menu markup belongs on the page where the dishes appear, because of two rules in Google's structured data policies: don't mark up content that isn't visible to readers of the page, and your structured data must be a true representation of the page content.

That second rule matters every time the menu changes. Say the short rib goes up by two dollars. The page gets updated, and the JSON-LD still shows the old price until someone changes it too. Update both together, or generate the markup from the same data as the page.

Google Business Profile Help describes a menu link for food and drink businesses (Google, About the menu editor). Go to your Business Profile, select Edit profile, then Business information, then Contact, then Menu link. Enter the address where your menu can be found, and select Save.

Point it at the menu page on your own site. Then the link on your profile and the page Google indexes are the same page, and there's one menu to keep current. The menu link, the menu editor and menu photos are covered step by step in How to add your menu to Google.

The same help page describes other ways a menu can reach your profile. Some businesses can add menu items with descriptions and prices in the profile's menu editor. There's an experimental option that turns a photo or PDF of your menu into a profile menu. And Google may transcribe menu data from your business website so it appears on your profile. The help page says Google "may" do this, and it doesn't say when it happens or what it reads. Treat it as something Google may do, separate from your structured data.

AI Overviews and AI Mode

Google's page on AI features, last updated on 10 December 2025, covers AI Overviews and AI Mode. It says there are no additional requirements to appear in them. You don't need to create new machine-readable files, AI text files or markup, and there's no special schema.org structured data to add. To be shown as a supporting link, a page must be indexed and eligible to be shown in Google Search with a snippet.

The same page lists the practices that still apply:

  • allow crawling in robots.txt, and by any CDN or hosting service
  • make your content easy to find through internal links on your website
  • give people a good page experience
  • make sure important content is available in textual form
  • support your text with good images and videos, where they help
  • make sure your structured data matches the visible text on the page
  • check that your Business Profile information is up to date

A menu written as text on your own site, with accurate markup and a current Business Profile, covers that list. For the images, How to take menu photos on your phone covers light, angles and the photo sizes Google publishes.

Embedded menus: whose domain gets the credit

Many restaurants don't type the menu into their site by hand. They embed it from a menu tool, an ordering provider or a website builder's app. The kinds of online menu a restaurant can choose from are compared in Online menu options for restaurants. How the embed works decides where the menu's text lives: in your page, on your domain, or in a page at someone else's address.

A frame

A frame, written in HTML as an <iframe>, is a window in your page that shows another page. The menu inside it is a page at the menu provider's address. Your page holds the frame, and the dishes, their text and any links to them sit on the provider's domain. Frames are simple to paste.

Google has said its systems try to treat a framed page's content as part of the page that frames it. It has also said this isn't guaranteed, because each one is a normal page by itself (Google, SEO office hours, December 2023). Google also offers a robots tag, indexifembedded, that a framed page can pair with noindex so its content is indexed only when another page embeds it (Google, indexifembedded).

A script that writes the menu into your page

A script embed runs on your page and writes the menu into it as ordinary HTML. Once it has run, the dishes are text in your page, on your domain. Google renders JavaScript and indexes the rendered HTML (Google, JavaScript SEO basics). It can process structured data that's in the page when it renders (Google, structured data with JavaScript), and links that JavaScript inserts are crawlable.

This works only where your website runs the script inside your own page. If your site places pasted code inside a frame of its own, the menu ends up in a frame too. There are step-by-step guides for pasting an embed into WordPress, Wix and Squarespace. URL Inspection, described below, shows you the HTML Google rendered, so you can see which one you have.

Some restaurants link to a menu hosted elsewhere, such as their ordering page. That menu lives at the other company's address. It's a good fit when the same page is where guests order, and you can keep it for ordering while your own site has a menu page as well.

Where MenuFramer fits

MenuFramer fills the menu page you already have: you paste one snippet into it, and you choose between two embeds. "Just the menu" drops the menu in as one piece, in a frame, and the menu's text lives at menuframer.com. On the Pro plan, that's the only option. "Menu + a page per dish", on the Business plan, writes the menu into your page as real text, gives every dish its own address on your domain, and adds Menu, MenuSection, MenuItem, Offer and Restaurant structured data. That makes the menu eligible to be found in search, wherever your website runs the script inside its own page. The details are in Embed on your site, and the plans are on Pricing.

Restaurant menu SEO checklist

What to doWhyHow to check
Put every dish on a web page as textGoogle indexes the text on pagesURL Inspection: View crawled page
Keep the menu at one address, such as /menuYour profile, QR codes and Google all point to one pageOpen the address on your phone
Load every dish without a tapGoogle won't load content that needs a click or swipeURL Inspection live test screenshot
Show the same dishes on mobile and desktopGoogle indexes the mobile versionCompare the page on a phone and a computer
Link to dish pages with plain <a href> linksGoogle crawls <a> elements with an hrefURL Inspection: View crawled page
Add Restaurant markup with menu, servesCuisine and priceRangeGoogle's local business guide recommends themRich Results Test
Add Menu, MenuSection and MenuItem markup that matches the pageMarkup must represent visible contentSchema Markup Validator
Set your Business Profile menu link to the pageYour profile and your site share one menuEdit profile > Business information > Contact
Update the page and its markup togetherPrices in the markup must match the pageCompare them in the Schema Markup Validator

How to check your work

Rich Results Test

Google's Rich Results Test checks the structured data on a page and reports which rich result types it found, with any errors or suggestions (Search Console Help, Rich Results Test). You can test a public URL or paste code. When markup is added by JavaScript, Google recommends testing the URL, and the test works from the page's rendered source.

Local business is one of the types the test supports, so this is where you confirm your Restaurant markup is read without errors. A menu isn't a rich result type. For the Menu, MenuSection and MenuItem parts, paste your code into the Schema Markup Validator, which schema.org links to from its own site.

URL Inspection in Search Console

The URL Inspection tool is part of Google Search Console, and it works on pages in a property you have there. It shows information about Google's indexed version of a page.

  1. Inspect your menu page's address to see whether it's indexed. Select View crawled page to see the HTML Google has for it.
  2. Select Test live URL to fetch the page as it is now. In a live test, View tested page includes a screenshot of the rendered page, so you can see whether every dish loaded.
  3. Look at the Enhancements section, which lists the rich result types (structured data) Google detected on the page.

If you've changed the page, select Request indexing to ask Google to crawl it again. Google says a request doesn't guarantee the page will appear in its index, and there's a daily limit. Crawling can take anywhere from a few days to a few weeks, and asking again for the same address won't speed it up (Google, ask Google to recrawl).

Frequently asked questions

Does Google read PDF menus?

Yes. PDF is one of the file types Google indexes, and Google has said it can index the text in a PDF and may use OCR on scanned ones. The whole menu is one file at one address, so no dish gets an address of its own, and structured data has to go on a web page.

Is there a menu rich result?

No. None of the 25 features in Google's search gallery is a menu or a menu item. Google's local business guide documents a menu property, which takes the address of your menu page.

Do I need schema to appear in AI Overviews?

No. Google says there's no special schema.org structured data to add for AI Overviews or AI Mode. A page has to be indexed and eligible to be shown in Search with a snippet, and Google lists structured data that matches the visible text among the practices that still apply.

Will an embedded menu help my SEO?

That depends on how the embed works. A script that writes the menu into your page puts the dishes on your domain as text, which Google can render and index. A frame shows a page that lives at the provider's address, and Google says counting that content as part of your page isn't guaranteed. In either case, the most anyone can offer is a menu that's eligible to appear.

Do I need a separate page for every dish?

No. A single menu page with every dish written as text is a page Google can read. A page per dish gives each dish an address of its own, which a guest can share and Google can reach through a plain link.

How long until Google sees a change to my menu?

Google says crawling can take anywhere from a few days to a few weeks. You can ask for a recrawl with Request indexing in URL Inspection. Google says a request doesn't guarantee inclusion, and asking again won't speed it up.

Sources

Keep reading

See your menu the way a guest will.

Try the live demo menu, or build yours and paste it into the site you already have.

  • No developer needed
  • Keep your website
  • Update it yourself