Menu Display Pro for HubSpot

A restaurant menu module for HubSpot CMS with nested categories and items, 14 dietary tag presets, four layouts (grid, list, classic, magazine), live search, sticky category navigation, seasonal rotation, and built-in Schema.org Menu JSON-LD for search engines. 90+ style controls. No HubDB. Works on CMS Starter.

Demo 1

Maison Clara — Italian Restaurant (Sidebar + 3-Col Grid)

Sticky sidebar on the left with a large serif "MENU" label and a clean vertical category list. Main content is a 3-column grid of dishes — round photo thumbnails, uppercase serif names, italic descriptions, centered prices. Inspired by classic Italian restaurant menu layouts. No search clutter, no filter pills — just the menu.

Demo 2

Classic Steakhouse — Text-Only with Dotted Leaders

The traditional printed-menu aesthetic rendered in HubSpot. Cormorant Garamond serif headings, DM Sans body, dark background, dotted leader lines connecting dish name to price. No photos, no cards — just typography and prices. Three categories with price ranges on some items.

Demo 3

Bramble Café — Modern Minimal List

A contemporary café menu with sans-serif typography, sage green accent, tight vertical rhythm, and compact photo thumbnails. Same list layout as Demo 1 but without the sidebar and with a completely different visual treatment — proving the module handles multiple aesthetics without changing layouts.


About Menu Display Pro

Menu Display Pro is a standalone HubSpot CMS module that turns any page into a full restaurant menu. Nested category and item repeaters edited from the page editor, four layouts (grid, list, classic, magazine), 14 dietary tag presets, seasonal rotation flags, live search, dietary filter pills, sticky category navigation, and built-in Schema.org Menu JSON-LD structured data. 90+ style controls. No HubDB. Works on CMS Starter.

Drop it on any HubSpot page — website pages, landing pages, or blog posts — and it inherits theme fonts and primary color automatically. Three completely different looks above with zero code changes, all driven by field values.

Features at a Glance

Style Fields Summary (90+)

Container (2)

Max width, horizontal padding.

Colors (40+)

Section background, heading, eyebrow, subtitle, category name/description/divider, item name/description/price, card background/border/hover border, featured card border, dots color for classic layout, search background/border/focus/text, filter background/text/border/active background/active text, category nav background/active underline, per-tag colors (vegetarian, vegan, gluten-free, spicy, default), special badge background/text, seasonal badge background/text, shadow.

Typography (14)

Two font pickers (heading + body) with theme inheritance, plus independent font sizes for heading, eyebrow, subtitle, category name, category description, item name, item description, price, dietary tag, special badge, filter, and search.

Card (13)

Padding, border radius, border width, shadow preset, hover shadow preset, photo height, photo radius, gap between cards, tag radius, tag padding vertical/horizontal, badge radius, title font weight.

Toolbar (6)

Search radius, search padding, filter pill radius, filter padding vertical/horizontal, toolbar gap.

Spacing (6)

Section padding top/bottom, header-to-toolbar gap, toolbar-to-content gap, category-to-category gap, category-header-to-items gap.

Responsive (2)

Tablet breakpoint (columns halve) and mobile breakpoint (single column, toolbar stacks).

Schema.org JSON-LD — Built for Google Search, AI Overviews & AI Crawlers

Every module instance outputs a complete Schema.org @graph block containing three linked entities: Restaurant, Menu, and WebPage. All three are cross-referenced via @id so Google, Bing, Google AI Overviews, Perplexity, ChatGPT (browse), and Claude can traverse the graph and answer questions about your restaurant, your menu, and individual dishes from one block of structured data.

Restaurant entity

Menu entity

WebPage entity with Speakable

Why this matters for AI Overviews & AI search

Google AI Overviews, Perplexity, ChatGPT browse, and Claude all parse JSON-LD heavily when generating answers. A weak schema (just Menu, no Restaurant context) gives AI nothing to ground a "what's good at Bramble Café" or "is Maison Clara vegetarian friendly" response. The @graph approach outputs Restaurant + Menu + WebPage together with cross-references so AI models see the full picture in one parse.

The speakable annotation tells Google Assistant which CSS selectors to read aloud when the menu is surfaced in a voice query. Without it, voice assistants fall back to guessing, which usually means reading your navigation or footer instead of your menu.

Toggle the schema off from module settings if you're outputting menu schema from another source (Yext, custom integration, etc.) — one switch, no conflicts.

Accessibility

Responsive Behavior

Demo Notes