Competitors — see what other venues are posting
Restaurants don’t operate in isolation. The places nearby are running their own campaigns, hitting their own seasons, launching their own menus. The Competitors page is a quiet window onto that world — a daily refresh of up to 10 venues you want to keep tabs on, with their posts, reviews, and engagement side-by-side with yours.
You don’t have to know everything about a competitor before you start. Add them with whatever you have — an Instagram handle if you know it, or just their Google Maps share link. You can pair the other source later and keep adding new sources as we ship them.
What it does
For each competitor, the system pulls public-only data once a day (or on demand). From Instagram: follower count, post count, bio, profile picture, the eight most recent posts with likes + comments. From Google Maps: place name, rating, review count, and the latest reviews. When you have both connected, the AI produces a combined read that tells you where the competitor is strong, where they’re weak, and what angles you could stake out.
This isn’t a stalking tool. Instagram has to be a public Business or Creator account — Meta’s API refuses private/personal accounts. Google Maps is by definition public; the share link from any Maps listing works.
What you get is a quiet read of the local scene. Are competitors posting more this week? Did their rating just dip after a bad service Sunday? Did someone launch a new menu item? Are there themes (truffle season, Songkran specials, brunch pushes) you’re missing? The page surfaces those signals without you scrolling their feeds yourself.
The rule
Public sources only. Public Instagram Business accounts; public Google Maps places. We never pull data the competitor isn’t already publishing.
How to use it
Open Growth → Competitors. The page has two parts.
Adding a competitor
At the top, an Add a competitor card with a small toggle: Instagram handle | Google Maps link. Pick whichever source you have.
Via Instagram — the original flow. Two fields:
- Handle — the username without the
@. Lowercase, letters/numbers/underscores/dots only. - Label (optional) — a human-readable name like “Gaggan Anand” or “Le Du Sukhumvit”. Falls back to the handle if you leave it blank.
Click Add. The handle saves and an immediate refresh fires — within a few seconds you see the first snapshot card appear below.
Via Google Maps — perfect for when you know the restaurant but not their Instagram. Open Maps, find the venue, tap Share, copy the link, and paste it. The button on the right says + Add via Google. A small “Reviews to pull on first fetch” row lets you choose 50, 100, or 200 — pulling more reviews takes a bit longer but gives the AI more signal. Default is 100.
Once you click + Add via Google, the form switches to a calm “Pulling place + reviews from Google… 30-60 seconds” panel. Stay on the page. When it finishes, the new competitor appears below with their Google rating, review count, and most recent reviews — but no Instagram yet. The card shows a small + Add Instagram link so you can attach a handle later.
Via Facebook page — useful when the venue is more Facebook-active than Instagram-active (very common in Southeast Asia, where Facebook is still the default for local restaurants and family-run places). Open the restaurant’s Facebook page in a browser, copy the URL from the address bar, and paste it. The button on the right says + Add via Facebook. The same 50 / 100 / 200 picker controls how many recent posts we pull on the first fetch; 100 is the default.
The URL must be a Business Page with a vanity URL — e.g. facebook.com/peppina31 or facebook.com/biancabangkok. If you paste a personal-profile URL (the kind that looks like facebook.com/profile.php?id=100093386694272), the system stops you with a calm explanation: open the page in Facebook, find the actual Page name in the URL bar, and use that instead. Personal profiles can’t be scraped — the system can’t access them, the same way a regular user couldn’t subscribe to a friend’s wall without being friends.
Once you click + Add via Facebook, the form switches to a calm “Pulling page + posts from Facebook… 30-60 seconds” panel. Stay on the page. When it finishes, the new competitor appears below with their Facebook page name, follower count, and recent posts — but no Instagram or Google Maps yet. From the detail page you can attach the other sources later, exactly like you would for a Google-first competitor.
| You have… | Use the tab… | The card shows… |
|---|---|---|
| Just an Instagram handle | Instagram handle | IG posts + engagement; pair Facebook or Google Maps later. |
| Just a Maps share link | Google Maps link | Place rating + reviews; pair Instagram or Facebook later. |
| Just a Facebook page URL | Facebook page | FB page posts + engagement; pair Instagram or Google Maps later. |
| All three | Pick whichever’s easiest; pair the others from the detail page. | The detail page surfaces Instagram, Google reviews, AND Facebook side-by-side. |
The competitor row is the identity, not the source. Three channels per competitor at most: Instagram (what they post), Google (what customers say), Facebook (the community side). Adding a second or third source enriches the AI read without doubling your competitor count — the 10-per-venue limit applies to competitors, not channels.
If you’ve already added 10 competitors, the Add button refuses with an explanation. Remove one before adding another.
Navigating a busy detail page
A competitor with all three channels attached — Instagram, Google reviews, Facebook — ends up with a long detail page. Top-down you see the Combined competitive analysis (the cross-channel AI synthesis), then the Instagram block (insights + stats + posts), then the Google block (insights + reviews), then the Facebook block (insights + posts).
On wide screens a small Jump to rail floats on the right edge of the viewport at vertical center. Tap any pill — Combined, Instagram, Google, Facebook — and the page scrolls straight to that section. The rail only shows the channels you’ve actually attached for that competitor, so a Google-only competitor sees a 2-pill rail (Combined + Google), and a fully-attached competitor sees all four. The rail hides itself on narrower screens where the page is already vertical and easy to skim.
Each section’s AI insight box now identifies itself by channel — Instagram insights, Google reviews insights, Facebook insights, and Combined competitive analysis — so there’s never doubt about which channel a box is talking about. Underneath every insight title sits a one-line breadcrumb that frames the box’s authority: “Based on 47 posts captured” under the Instagram block; “Based on 128 reviews” under the Google block; “Based on 22 posts captured” under Facebook. The combined synthesis sums across attached channels and only counts channels that actually returned data, so a competitor with 0 reviews shows the breadcrumb without the review count.
The bold number is the answer to “did the AI have anything to work with?” before you read the prose. Eight reviews is a thin read; 128 reviews is a lot of signal. The same number sets the right expectation when you re-read the analysis a week later.
Long lists collapse by default
The Instagram post list, the Google review list, and the Facebook post list each render the first 12 entries by default with a centered Show all N posts (or N reviews) toggle below. Click the toggle and the rest expand in place; click again to collapse. The toggle is purely a display choice — the underlying data is already fetched, so expanding is instant.
This keeps a competitor with 128 captured reviews from dropping a 128-row wall of text into the middle of your page. You see the most recent 12 by default; if you want to read the whole backlog you expand. To pull MORE reviews from Google (or posts from Instagram / Facebook) you’d use the Pull deeper buttons in the channel header — those grow the underlying dataset; the Show all toggle just paginates what’s already there.
Reading reviews on the detail page
Open a competitor’s detail page (View detail on their card). The Recent reviews section shows up to 100 most-recent reviews — when you pulled 200 via the “Pull deeper” button, the page surfaces 100 of them; future pagination will let you scroll the rest.
Each review row carries small signal pills the AI eventually uses to weigh trust:
- Reviewer review count — how many reviews this person has published on Google in total. 50+ shows in green, 5+ in grey, 0–4 in amber. A 1-star from a 0-review account is a different signal than a 1-star from a 200-review reviewer.
- Local Guide — a purple pill when the reviewer is a Google Local Guide (typically active, high-signal reviewers).
- Language code — small uppercase tag (
TH,IT,FR…) when the review’s language differs from your venue’s primary language.
When the language differs, a small Translate to xx button sits below the review text. Click it: we translate the text once via Google Translate and cache the result on the review — the next time anyone opens this page they see the translation instantly (no second call, no extra cost). A Show original toggle flips back to the source text when you want to read what the customer actually wrote.
Attaching Instagram to a Google-anchored competitor
Open the competitor’s detail page (click View detail on their card). Just above the Instagram section, an inline form prompts you to paste the handle. Save, and the system pulls the first IG snapshot in 10–20 seconds. From then on the daily refresh covers both sources and the AI build a combined insight.
Attaching Facebook to an existing competitor
Open the competitor’s detail page. Below the Google section, you’ll find a Facebook page section. If no Facebook page is linked yet, you’ll see a calm card with Link Facebook. Click it, an inline form appears asking for the URL, paste it, and click Save & fetch. The system pulls the first batch of Facebook posts in 30–60 seconds. The same picker (50 / 100 / 200) controls how many posts the first fetch grabs.
From then on, the weekly background refresh covers Facebook automatically. You can also run Refresh posts or one of the Pull deeper buttons (50 / 100 / 200) any time you want a manual fresh pull — useful before a strategy review when you want the model to read the most recent week.
Reading the Facebook section on the detail page
Each Facebook-linked competitor’s detail page shows a dedicated Facebook page section below the Google reviews section.
- Header card — page name, profile picture, followers and page likes. If we know the page’s rating, you’ll see it. Refresh posts does a delta pull; the Pull deeper sub-row has four buttons — 5 (quick test, only the newest 5 posts), 50, 100, 200. The 5-post button is for when you’re not sure whether the latest images came through and want to verify cheaply before committing to a full pull. The 50 / 100 / 200 buttons force a full pull regardless of the cursor.
- Stat cards — followers, page likes, page rating (when present), and how many posts we’ve captured.
- Facebook insight card — empty until you click Analyze. After that, the AI returns a structured read: overall sentiment, engagement trend (rising / flat / falling / noisy), common post themes, strengths, gaps, and a two-to-three sentence narrative. Re-run any time you want a fresh read after pulling more posts.
- Recent posts grid — up to 100 captured posts, newest first. Each thumbnail shows reactions, comments, and (when available) shares. Posts with more than one image carry a small +N badge in the top-right corner of the thumbnail — that’s a carousel post with N additional images beyond the cover. Click any tile to open the post on Facebook itself.
Fixing a wrong menu URL
When the Menu & pricing tab fails to read a competitor’s menu, it’s usually because Google has a stale or wrong URL on file — the link still resolves on Google’s side, but the menu page either moved or never existed at that path. Two things happen automatically before you see a failure:
First, if the stored URL returns a “page not found” (404 or similar) and points at a sub-path like /menu/, the system retries against the root domain (https://venue.com/) and lets the link-finder scan the homepage for the right menu page. Most of the time this rescues the extraction without you doing anything — you’ll see the working URL on the menu card once it succeeds.
If even that fails — the homepage is also unreachable, or no menu link can be found — the tab now shows an editable URL field at the top of the source picker. Paste the correct URL (anything from https://venue.com/our-menu to a direct PDF link), click Save & try, and the extraction runs against your version. The pasted URL sticks — it’s saved against the competitor row, so the next daily refresh and every manual re-read uses your URL instead of Google’s. A small Custom URL on file badge appears next to the field once it’s saved.
If the venue genuinely doesn’t publish their menu online, the Try Google menu photos and Upload yourself options below the URL card cover the other two tiers — pick whichever has the source you have access to.
Unlinking a Facebook page (or Google place)
Every channel section has a small Unlink Facebook (or Unlink Google) link below the Analyze button. Click it when you pasted the wrong URL, or you want to swap a competitor’s Facebook page for a different one, or you’re cleaning up before re-importing.
A confirmation dialog spells out what gets deleted: all captured posts (Facebook) or reviews (Google), the latest snapshot, the per-channel AI insight, AND the combined IG+Google+Facebook insight. The competitor row itself stays — only that one channel is wiped. Re-linking the same page or place later starts from a clean slate (no stale rows, no double-counting). Removing the whole competitor from the list page does the same thing for all three channels at once.
The system keeps your database clean. Unlink doesn’t leave orphans — it wipes the captured data so re-importing is exactly like a first import. That’s deliberate: a competitor row should be cheap to remove and cheap to re-add.
Reading a card
Each handle gets one card. Top section shows the profile picture, name (your label or @handle), follower count and post count. If we have a bio, it’s quoted underneath in small italic.
Below that, an 8-thumbnail grid of the venue’s most recent posts. Hover any thumbnail to see a small overlay with likes and comments for that post. Click to open the post on Instagram itself.
If the refresh hit an error (private account, deleted account, Meta rate limit), an amber strip shows the error message instead of the post grid. Common cases:
- “business_discovery returned error: …” — the handle is private or not a Business account
- “No business_discovery payload for X — handle may be private, not a Business account, or simply unknown.” — typo in the handle, or the venue switched to private after you added them
Hit the Refresh button on the card to retry. Failed refreshes don’t break anything — the card just shows the error and the daily cron retries on its own schedule.
Removing a handle
The Remove button on each card asks for confirmation, then drops both the handle and its snapshot. If you re-add the same handle later, you get a fresh snapshot — old data isn’t preserved.
Worked example
It’s Monday morning. Marco wants to know what his three favourite local competitors did over the weekend.
He opens Growth → Competitors. The Add card. He types gagganxbar and labels it “Gaggan Anand Bangkok”. Add. The card appears below within five seconds — 134k followers, 1,287 posts, biography talking about modern Indian cuisine, and a grid of eight recent posts. The top-left thumbnail is a video — when Marco hovers, it shows 8,400 likes and 184 comments. Big traction.
He adds leduthailand (“Le Du Sukhumvit”) and bocouusa (“BocouUSA”). Three cards now in the grid. Marco scans:
- Gaggan posted four times in the weekend. The Friday post (an ingredient-focused image) got 12k likes — Marco notes the angle.
- Le Du posted twice, both Sunday brunch shots, modest engagement (~1k each).
- BocouUSA posted once, a chef portrait, 6k likes — Marco notes that humans-in-frame is performing.
He closes the page and opens Composer. His next post will feature their head chef, not just the dish — a hypothesis to test.
A week later, Marco notices one of his neighbourhood competitors barely posts on Instagram — but they have a very active Facebook page where families post photos every weekend. He clicks + Add a competitor, picks the Facebook page tab, pastes the page URL, and within a minute he sees the page’s follower count, page rating, and the last 100 posts. Most are video — short clips of the kitchen and the dining room. He opens the Analyze button on the Facebook section, and the AI reads back: “Strong community engagement, video-heavy, weekend-anchored. Strength: family audience and live-event coverage. Gap: no menu storytelling — the food itself rarely takes the spotlight.” Marco notes the angle.
The deep-dive dashboard
Under each competitor’s detail page sits a Deep dive button. Click it and you land on a full-page dashboard that organises everything we know about that one venue, AI-synthesized into a card you can act on, not just read. The page opens with two tabs.
Overview is the strategic narrative — what they’re really doing, the headline numbers in a row of tiles, a bar chart of their post engagement, and a written take from the AI that cites specific posts by date and quotes specific reviews. This is what you read on a Monday morning when you want to know what your top competitor was up to last week.
Menu is the head-to-head pricing dashboard. Their dishes vs yours, the price gaps spelled out, the dishes they have that you don’t (and at what price), the dishes you both have where one of you is cheaper. Below the table, the AI writes a short list of moves to test this week — each one names a specific dish, a specific price change or addition, and the expected outcome. Examples of the kind of move the AI now writes: “Add Carbonara at ฿340–360 — overlaps with our Cacio e Pepe ingredients, captures the ~20% of customers asking about it that we currently turn away.” Or: “Their Tiramisu is ฿180; ours is ฿220. Drop to ฿200 for a week, watch dessert mix — if order volume jumps >15% the price is the friction.”
The dashboard’s job is to convert raw signal into specific moves: dish names, prices, expected outcomes. Vague advice isn’t worth a credit.
Each tab caches its analysis for six hours. The header band at the top of every tab tells you when it was generated, how many credits it cost, and how long until you can refresh it again. The Refresh button is disabled until the cache expires — clicking it earlier wouldn’t see any new data (we don’t re-scrape competitor menus every minute), so it would burn credits for nothing. If you genuinely need a fresh read inside the six-hour window (a competitor just launched a new menu, for example), tell the chat — the strategist can answer ad-hoc questions without needing a full regenerate.
The weekly strategy synthesis
The per-competitor cards are the raw view. Underneath them sits a different surface — one strategic brief that reads every competitor’s posts, every recent customer review, and every menu item the system has captured, then writes you one coherent take on where to play this week. It refreshes itself every seven days in the background, and a Regenerate button on the page reruns it on demand when something material has happened.
The brief is structured into six fixed sections. Headline — the one-line strategic call. Content gaps — topics nobody in your tracked set is covering that you could own (“nobody is running a behind-the-counter video format; the one attempt from Casa Italia last week got four times their normal engagement — open angle for you”). Cadence recommendations — when to post, how often, what format mix, grounded in what your competitors are actually doing. Topics to test — concrete post ideas, each tied to a specific competitor signal that inspired it. What to copy — tactics observed in the set worth borrowing, with the exact post or review that surfaced them. What to differentiate — places where competitors are weak (a recurring complaint pattern in reviews, a saturated format, a price gap on their menus) that you should stake out. Underneath, the overall note is a five-to-eight sentence narrative that ties the moves together the way a senior strategist would explain them to you over coffee.
What makes this version different from the early one is that the brief is grounded in verbatim data, not summaries. Earlier, each competitor was distilled to a handful of bullets before the strategist saw them — the model never read the actual viral post that drove the engagement spike, the actual review that named a service problem, or the actual price the competitor charges for carbonara. Now it does. The brief cites specific posts by date, quotes specific customer complaints, and points to specific menu prices to undercut — because the model is reading the actual evidence, not a pre-digested summary of it.
The strategy reads what your competitors publish, what their customers say, and what they charge — together, in one pass. The recommendations are grounded in the actual evidence, with citations, not in abstract patterns.
The brief is recomputed on the weekly cron and persists between regenerations — so when you open the page on a Tuesday afternoon, the read is fresh enough to act on. Hit Regenerate when something material has changed (a competitor just launched a new menu, a viral post went up, a service incident shows up across three reviews) and you want today’s read, not last Monday’s.
Ask the chat about your competitors
The in-app chat — and, if you’ve paired it, the Telegram bot — can now read everything on this page and answer questions about it. Ask things like “how am I doing on social compared to Appia”, “what’s the most engaged competitor near me posting about this week”, “why are Appia’s reviews so bad lately”, or “who’s running ads on Facebook the most”, and the chat will look up the competitor data, the recent posts, and the AI insights, then answer in plain prose. The chat can also reach across to your own social and review data when the question is comparative — “is my engagement up or down versus theirs over the last month” — so you don’t have to flip between pages.
When multi-agent chat is enabled, these questions are routed automatically to the Growth Strategist — the specialist whose whole job is competitor positioning, social engagement, and review sentiment. It reads competitor data, your own social metrics, scheduled posts, and review backlogs, but it doesn’t post or reply for you. It surfaces the patterns and the recommendation; the Marketing Voice (a sibling specialist) is the one who actually drafts the copy.
If the bot is paired with your Telegram account, the same questions work on your phone. Ask “what did Appia post this week” during a Sunday walk and a summary comes back in seconds.
Related features
- Connections — Business Discovery needs your venue’s IG to be a Business or Creator account AND connected. Without that, the Competitors page can show handles but can’t refresh them.
- Analytics — compare what’s working for them with what’s working for you side-by-side.
- Ideas — future lift will fold competitor signals into the Ideas engine (“competitor X is on a streak posting about negronis; your cocktail menu has 5 options never highlighted”).
- Chat assistants — the multi-agent chat setup that gives you the Growth Strategist specialist.