On this page:
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.

menu

menu · Recommended by Google

Appears in

Restaurant

What is it?

menu links a restaurant to its menu. It accepts three value types: a URL pointing to the menu page, a plain text description, or a structured Menu object with sections and items. Google recommends providing the fully qualified URL of the menu for food establishments.

Note: schema.org has superseded menu with hasMenu, but both properties function identically. Google's documentation still references menu as the recommended property name for LocalBusiness markup.

Why this matters for AEO

When someone asks an AI engine "What does [restaurant] serve?" or "Does [restaurant] have a lunch menu?", the answer comes from structured menu data. A menu URL gives AI systems a crawlable source for dish names, prices, and dietary information. Restaurants that provide a structured Menu object with MenuSection and MenuItem entries give AI engines direct access to individual dishes without parsing HTML, which makes them far more likely to appear in voice assistant responses and AI generated recommendations.

What the specs say

Schema.org: Menu, Text, or URL. Either the actual menu as a structured representation, as text, or a URL of the menu. schema.org/menu

Google: Recommended. "For food establishments, the fully-qualified URL of the menu." Google LocalBusiness docs

How to find your value

  • Restaurant website — The "Menu" page URL in main navigation
  • Third-party menu — PDF or page hosted on a delivery platform
  • Multi-menu venue — Separate URLs for lunch, dinner, brunch, drinks
  • No online menu — Use the Menu object type to embed menu data directly in JSON-LD

Format and code

Type: Menu, Text, or URL

URL (simplest approach, Google recommended):

{
  "@context": "https://schema.org",
  "@type": "Restaurant",
  "name": "Chez Panisse",
  "menu": "https://www.chezpanisse.com/menus"
}

Structured Menu object with sections:

{
  "@context": "https://schema.org",
  "@type": "Restaurant",
  "name": "Restaurant Pronto",
  "hasMenu": {
    "@type": "Menu",
    "name": "Dine-In Menu",
    "description": "Menu for in-restaurant dining only.",
    "hasMenuSection": [
      {
        "@type": "MenuSection",
        "name": "Appetizers",
        "hasMenuItem": [
          {
            "@type": "MenuItem",
            "name": "Bruschetta",
            "offers": {
              "@type": "Offer",
              "price": "12.00",
              "priceCurrency": "USD"
            }
          }
        ]
      },
      {
        "@type": "MenuSection",
        "name": "Dinner"
      }
    ]
  }
}

Common mistakes:

  • Using a relative path like /menu instead of the full URL https://yoursite.com/menu
  • Linking to a PDF menu that search engines cannot parse (use an HTML page when possible)
  • Providing "menu": "We serve Italian food" as text when a URL is available

Webflow implementation

Static pages

In Page Settings > Custom Code > Before </head>:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Restaurant",
  "name": "Your Restaurant",
  "menu": "https://yoursite.com/menu"
}
</script>

CMS template pages

If your Webflow CMS has a "Restaurants" collection with a "Menu URL" plain text field:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Restaurant",
  "name": "{{wf {&quot;path&quot;:&quot;name&quot;,&quot;type&quot;:&quot;PlainText&quot;} }}",
  "menu": "{{wf {&quot;path&quot;:&quot;menu-url&quot;,&quot;type&quot;:&quot;PlainText&quot;} }}"
}
</script>

In Schema HQ

The menu field is mapped from CMS URL or plain text fields to the menu property. It validates that the URL is fully qualified and flags relative paths during publishing.

Real examples

Restaurant Pronto (restaurant-website-builder.com):

{
  "@context": "http://schema.org",
  "@type": "Restaurant",
  "url": "http://www.pronto-ny.com",
  "name": "Restaurant Pronto",
  "servesCuisine": ["Italian"],
  "hasMenu": {
    "@type": "Menu",
    "name": "Dine-In Menu",
    "description": "Menu for in-restaurant dining only.",
    "hasMenuSection": [
      {
        "@type": "MenuSection",
        "name": "Dinner"
      }
    ]
  }
}

Uses the structured Menu object approach with hasMenu (the newer property name) and organizes items by MenuSection.

Related fields

FAQ

Should menu use a URL or a Menu object?

Google recommends a fully qualified URL. The structured Menu object with MenuSection and MenuItem provides richer data for AI engines but adds implementation complexity. Start with a URL; add the structured object if AI visibility for individual dishes matters.

What is the difference between menu and hasMenu?

They are functionally identical. Schema.org superseded menu with hasMenu, but both resolve to the same property. Google's LocalBusiness documentation references menu. Either works in JSON-LD.

Does the menu URL need to point to an HTML page?

HTML is strongly preferred. PDF menus are common but difficult for search engines and AI systems to parse. If the only option is a PDF, link to it, but consider creating an HTML version for better structured data coverage.

On this page:
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.

Need help with schema on your site?

We implement structured data for Webflow sites — from audit to deployment.

Work with us

Work with us