menu
menu · Recommended by Google
Appears in
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
Menuobject 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
/menuinstead of the full URLhttps://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 {"path":"name","type":"PlainText"} }}",
"menu": "{{wf {"path":"menu-url","type":"PlainText"} }}"
}
</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
- name — Restaurant name displayed in search results
- servesCuisine — Cuisine type served at the restaurant
- acceptsReservations — Whether the restaurant takes bookings
- url — Restaurant website URL
- priceRange — Price level indicator
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.