Enter the access password to continue.
Data is stored server-side
Each survey sweeps a region with Google Places API to find restaurants.
Give this search a memorable label. It'll appear on your dashboard, in results, and in any CSV exports.
Upload a CSV that has a Company domain column. We'll show you every row from the file. When you click Compare segments we add a Segment column showing which value would be stamped onto each saved chain that matches.
Required for discovery + map display. Enable both Places API (New) and Maps JavaScript API (with Drawing library) in Cloud Console. Pricing: ~$0.032 per Nearby Search call; map loads also count against Maps JS quota (28K/month free).
Will be used for enrichment — looking up each chain's total location count via web search. Get a key at platform.openai.com/api-keys. Used with gpt-4o-mini + web search tool. The actual enrichment flow lands in the next iteration.
Chains in this list won't appear in any survey's results, and will be skipped during OpenAI enrichment. Add them here, or tick the exclude checkbox in the results table. Names are normalized (lowercase, punctuation stripped) before matching.
Emails containing these domains are never stored by enrichment — cloaking services like hidethellama.com serve decoy addresses to scrapers. Built-in domains can't be removed; add your own below. On the next "Enrich info" run, already-stored emails from blocked domains are cleared and re-enriched.
The "✔ Verify emails" button on the saved-chains table checks every contact email through DeBounce and shows a status badge next to each address. Each address is verified once — results are cached.
Use your regular DeBounce API key — the plain KEY value at app.debounce.io/api, not the public_… widget key (that one only works from the browser and is rejected server-side). Verification runs server-side, so you do not need to set CORS/Trusted Domains in DeBounce.
"Enrich data" finds each restaurant's Yelp business page and Facebook page. When a key is set, enrichment looks each up deterministically via Gemini's Google-Search grounding — a real Google search, server-side — instead of leaning on the OpenAI web search (which is billed per search and rate-limits to 403 under load). This is the recommended source: the older Custom Search JSON API is closed to new Google Cloud customers, so it 403s on any account created now.
Get a free key at Google AI Studio → Get API key. Default model gemini-3.1-flash-lite — pick another below and Test it before a run. Note: on Gemini 3 models grounding is billed per search query and capped at 1,500 grounded requests/day on Tier 2; the authoritative meter is ai.dev/rate-limit. Optional — leave blank to use the OpenAI search only.
Superseded by Gemini grounding above. The Custom Search JSON API is now closed to new customers — a key created today returns 403 "This project does not have the access" no matter how the project is configured. Only fill this in if you have a grandfathered key that already works; otherwise use Gemini above. When both are set, Gemini is used.
Key + engine ID (cx) from programmablesearchengine.google.com, engine set to “Search the entire web”.
Yelp and Facebook block bots, so the OpenAI search can't read a page's Yelp Rep (the "About the Business" owner) or a Facebook page's email. When configured, enrichment reads them via Bright Data Web Scrapers — NO AI is used. Both are optional; leave a Dataset ID blank and that column stays empty.
Paste your API token once (Account settings → API tokens). For the Yelp Rep use the "Yelp businesses overview - collect by URL" scraper (returns a structured owner_name); for the Facebook Email use the "Facebook - Pages Information" scraper (returns a structured email). Each Dataset ID looks like gd_…. They run asynchronously, so a run has a "collecting …" tail.
Connect your Google Drive to upload exports (chain list, and the Leads CSV via the ▲ Drive button) directly. Uploads go into the destination folder below, using the drive.file scope — this app only accesses files and folders it creates.
drive.file scope the app can only see folders it created, so it manages this one for you; to point at an existing folder you already have, paste its folder ID here instead of a name.)—GOOGLE_CLIENT_SECRET in Vercel → Settings → Environment Variables, then redeploy. This lets the server keep the connection alive for you (refresh token) so you don't have to reconnect every hour.localStorage when supported. In restricted environments, data stays in-memory for the session only.