Skip to content

Competitor menus — read what they sell, what they charge, and how it's moving

The biggest unanswered question on a competitive menu review isn’t usually “what do they offer.” It’s “what do they CHARGE — and is that price moving?” If your spaghetti carbonara is at ฿285 and the place across the square charges ฿340, that’s information you want before printing the next menu. And if their carbonara went from ฿310 to ฿340 in the last two weeks, that’s the kind of signal you’d want a quiet badge to surface for you, not something you have to remember to check. The Competitor menus tab does both — captures the current state and tracks how it shifts over time.

Each competitor card carries a Menu & pricing tab alongside the existing Instagram, Google, and Facebook tabs. The tab reads the competitor’s published menu and lays out every dish they sell, with the price next to the name, grouped by their own categories (“Pasta”, “Antipasti”, “Pizze Rosse”), in the exact order their printed menu lists them. You scan it the way you’d scan a paper menu sitting on a table in front of you — top to bottom, section by section.

The system never makes up prices. If a dish on their menu doesn’t have a price printed, the price stays blank. Everything you see came from a source we can point at — their website, a customer photo on Google Maps, or the files you uploaded.

What it does

When you open the Menu & pricing tab on a competitor for the first time, three big buttons appear:

  • Try their website — uses the menu link or website listed on their Google profile. Best when the competitor has a real menu page online (most modern restaurants do).
  • Try Google menu photos — uses a photo Google customers have uploaded and tagged as “menu” on the competitor’s Maps listing. Free signal — we already pulled the photos when we synced their Google profile.
  • Upload yourself — drop a PDF or up to five phone photos of their printed menu (front, back, the foldout flap, all the pages) and we read them together as ONE menu. Works when neither the website nor a Google photo gets the job done, and works particularly well for printed multi-page menus where no single photo would have the whole story.

Under each button the system tells you what’s available — “3 menu photos from Google (newest 4 months ago)” or “No menu link on Google yet — try Refresh from Google first” — so you know which path is most likely to work before clicking.

Pick one. The system reads the menu, extracts every dish + price + category, and renders them on the same tab a few seconds later. The header carries a small badge — “from their website” / “from a Google menu photo” / “uploaded by you” — and the date the source is from, so you always know HOW old the information is.

The rule

Refreshing doesn’t wipe what you had. The list of dishes for each competitor builds up over time. When you re-read their menu, prices that changed get an amber badge showing the move, dishes the new scan didn’t find get a faded “Not in latest scan” tag, and new dishes simply appear. You never lose a dish you’ve already captured — you just see what changed.

How to use it

Open Growth → Competitors → click a competitor → Menu & pricing tab.

Reading a fresh menu the first time

Pick the source that looks most promising. The helper text under each button tells you what’s possible:

  • If you see “Their Google menu link is on file” under Try their website — that’s the strongest path. The competitor has a curated menu URL on their Google profile. Click it; ~15–30 seconds later the dishes appear.
  • If the website button is greyed out because “No menu link on Google yet” — pull their Google profile first (the Google tab has a Refresh from Google button). If their listing has a menu URL, it’ll show up here on the next visit.
  • Try Google menu photos lights up whenever Google’s actor tagged at least one of their listing photos as a menu — and most well-known restaurants have at least one. This is the “free” path; if the helper says “3 menu photos (newest last week)” you’re in great shape.
  • Upload yourself always works. Pick a PDF or a phone photo; the file uploads and the system reads it the same way it reads their website.

When the extraction finishes, the tab fills with dish cards. Example for a Bangkok pizzeria:

Pizze Rosse

  • Margherita — homemade dough, San Marzano, fior di latte, basil — ฿320
  • Diavola — spicy nduja, smoked mozzarella — ฿380

Pasta

  • Spaghetti alla Carbonara — guanciale, pecorino, egg yolk — ฿340
  • Tagliatelle al Ragù — slow-cooked beef, tomato, parmigiano — ฿360

Now you have a real number to compare against your own menu. If you charge ฿285 for the same carbonara and they charge ฿340, you have a pricing-position decision to make: stay cheaper (deliberate positioning), raise yours, or articulate to your team why theirs is more expensive (better guanciale? more pasta on the plate?).

Reading the source badge + the date

The header tells you exactly what you’re looking at. Two examples:

BadgeWhat it means
from their website · read today · prices in THBFresh — pulled right now from their live website. Trust the prices.
from a Google menu photo · photo from 8 months agoThe information came from a customer photo. Prices may have shifted since.

If the source is more than 12 months old, a small amber warning appears under the title — “These prices may be outdated — the source is over a year old. Upload a fresh menu when you can.” That’s the system telling you to verify before relying on the numbers for a serious pricing decision.

Refreshing later — the dishes you’ve captured stick around

The header carries three small refresh pills — Re-read website, Re-read Google photo, Upload new. Use them anytime the competitor changes their menu, or when the existing reading is going stale. The new reading merges with what you already had instead of wiping it. Three things can happen to any given dish on a refresh:

  • The new scan found it at the same price → nothing visible changes, the dish stays where it was.
  • The new scan found it at a different price → an amber badge appears next to the dish showing the move (“฿310 → ฿340 · 2 weeks ago”). The badge fades away after about three months, so you only see recent movement, not every change ever.
  • The new scan didn’t find it → the dish stays in the list but goes dim with a small “Not in latest scan” tag. It hasn’t been deleted. Maybe your upload only covered some of their pages, or maybe they actually retired the dish — you decide.

Worked example. Spaghetti carbonara at Appia was ฿310 in your last scan. You upload a fresh photo of their menu today and the same dish now reads ฿340. The dish stays in your list, and a small amber badge next to it says “฿310 → ฿340 · today” so you can react before it slips your mind. Meanwhile a dish that was on the previous scan but not on this one — say Tagliatelle al ragù — stays in your list but goes dim with a “Not in latest scan” tag. You decide whether to keep it on file (it might just have been off this week’s printed sheet) or treat it as retired.

Price-direction colour: amber for an increase (they raised the price), emerald for a decrease (rare, but worth seeing immediately when it happens — usually a sign of a promo, a competitive response, or a soft launch).

When the reading doesn’t work

Restaurants run on a wide range of websites. Some are crisp HTML pages with the menu printed in normal text — those read perfectly. Others are heavy JavaScript apps where the menu only appears after you click around — the system can’t navigate those, so it returns the empty-state message “That link didn’t look like a menu” and you fall back to Upload yourself or Try Google menu photos.

A few common reasons the system tells you something didn’t work:

  • “We couldn’t reach that link” — the website is down, blocking automated visitors, or the URL changed. Try Try Google menu photos instead, or take a quick phone photo of their menu and Upload yourself.
  • “That link didn’t look like a menu” — the page exists but isn’t structured like a menu (homepage, contact page, blog). Look for a more specific URL on their site that ends in /menu and paste it into the Try their website button.
  • “We don’t have any photos of this competitor’s menu from Google yet” — Google customers haven’t uploaded a menu shot, or our last refresh didn’t include menu photos. Run Refresh from Google on the Google tab and try again.

The system never silently fails. If a reading didn’t work, the tab tells you why and points you at the next thing to try — uploading a file is always available as the fallback.

Your competitor pricing feeds the AI everywhere

Everything you capture here doesn’t just live on the Menu & pricing tab — the AI model uses it automatically wherever it’s helping you write or plan. If you ask the chat assistant “are we cheaper than Appia on pasta?” it reads the menu data you’ve captured and answers with their actual prices, not a guess. When the system drafts a caption, plans your content calendar, or generates campaign ideas, it sees a short summary of each tracked competitor’s menu and any recent price moves — so it can write things like “while the carbonara across the road just jumped to ฿340, ours is still ฿285” without you having to feed it that context manually.

The more competitors you’ve captured menus for, and the fresher your scans are, the smarter every other AI surface in the app gets. Treat the Menu & pricing tab as the AI’s memory of what’s happening on the street outside.

Concepts

  • [[competitor-menu-intel]]
  • [[competitor-handle]]
  • [[competitor-google-profile]]
  • [[competitive-context]]
  • [[friendly-errors]]