Embeds render menu items client-side, so the host page's initial HTML response contains no item names, prices, or descriptions — only the widget shell. Confirmed on heightsbrewing.com/menu/: zero matches for any item name in the raw HTML. Googlebot eventually renders JS, but indexed snippets, lastmod-based re-crawl signals, and long-tail keyword matches all derive from the initial HTML, so menu items never become discoverable in search. Stale snippets compound the problem for venues with weekly menus.
Asks, in order of dev effort:
  1. Schema.org Menu JSON-LD output. Emit Menu / MenuItem nodes alongside the widget. Lowest lift, gets rich results and crawlable item names without changing the embed model.
  2. noscript fallback inside the embed. A static HTML mirror of the current menu state inside a <noscript> tag. Trivial server-side template.
  3. SSR endpoint, e.g. GET /v1/venues/{id}/menu.html returning a styled HTML snapshot we can fetch server-side (WordPress shortcode, Next.js getServerSideProps, etc.) and render before paint. Solves it cleanly.
Happy to test any of the above on heightsbrewing.com.