Local AI visibility: how to compare city and country results responsibly
Track the same prompt for a city and its country, then read the gap only where each engine actually received the city. A copyable location-testing plan shows how, including fallbacks.
On this page
- In short
- What does "local" mean for an AI answer?
- How does a city actually reach each AI engine?
- Is a city target the same as a customer in that city?
- How do you design a paired city and country prompt set?
- How should you read the gap?
- The deliverable: a location-testing plan
- A worked example
- What this cannot tell you
- Frequently asked questions
- Next step
To compare AI visibility in a city with a whole country, track the same prompt twice, once as a city target and once as a country-wide target, then compare the two only over the engines that actually received the city. A city target passes the place name or coordinates to each engine in whatever form that engine supports; it does not simulate a person standing there. Some engines take the city natively, some only in the prompt text, and one takes no city at all. Read every gap through that lens, and treat it as a description of what those engines answered, not as proof of what local buyers see.
In short
- Pair every local prompt: one city target and one country-wide target of the same wording, same language, same audience.
- Before reading any gap, check how each engine received the location. The delivery method decides whether a city row means "city" at all.
- A city target is not a customer in that city. Answers are collected from servers, not from a phone or browser there.
- Compare like with like: the same engines, the same window, and a sensible minimum sample before you trust a difference.
- Write down fallbacks. An engine that skipped the city, or a city sent at country level, is a finding, not a gap to smooth over.
What does "local" mean for an AI answer?
Local AI visibility is how often, and how prominently, your brand appears in AI answers when a question is asked in the context of a place. Two things are easy to confuse here: the place named in the question ("document review software for law firms in Manchester") and the place the engine is told about separately (a location setting sent with the request).
In DiscoveredBy, the second one is a target location: each tracked prompt has one or more targets, and each target is either a whole country or one city in a country. Add a location and you create its own target row, which uses one prompt slot for each audience and language. The Prompts docs describe this, and the Local page compares a city's answers with the same country's country-wide answers.
Define your terms before you compare anything:
- A country-wide target asks the question for a whole country, with no city.
- A city target asks the same question with a specific city as the location.
- Location delivery is how a given engine received that location: natively in its own request settings, in a block of text added after the prompt, both, or not at all.
- A gap is a city's value minus the same country's country-wide value, in percentage points for a rate.
How does a city actually reach each AI engine?
It reaches each engine in a different way, and the difference controls what a city row can tell you. The engines reference is the source of truth; this table is a condensed copy of its delivery section as of this writing, so recheck it before you plan.
| Engine | Country | City | Text block added to the prompt |
|---|---|---|---|
| Gemini (API) | In the prompt only | In the prompt only | Yes |
| Perplexity | Native, and in the prompt | Native, and in the prompt | Yes |
| Google AI Overviews | Native only | Native only | No |
| Google AI Mode | Native only | Native only | No |
| ChatGPT (app) | Native only | Not sent (city targets do not run) | No |
| Gemini (app) | Native only | Native only (coordinates) | No |
| Claude | Native, and in the prompt | Native, and in the prompt | Yes |
| Grok | Native, and in the prompt | Native, and in the prompt | Yes |
Three details matter most.
Gemini (API) gets a sentence, not a setting. For the chat engines, a "Search context" block names the country and, for a city target, the city, followed by an instruction to use that location when searching and ranking sources. Perplexity, Claude and Grok also get the location in a setting of their own web search tools. For Gemini (API) the block is the only place its request carries a location at all. Each engine decides how much weight to give the location, and you cannot see how much from the outside.
Google and Gemini (app) take coordinates. Google AI Overviews, Google AI Mode and Gemini (app) receive a city as latitude and longitude through the data provider. Every one of the 344 cities DiscoveredBy seeds has coordinates, so this is rare. A city with no coordinates on record is sent at country level instead, and the run records its city as not sent. In that case a city row holds country-level answers from those engines, so it is worth a spot check.
ChatGPT (app) takes no city. A city target does not run on it, so its answers appear in country-wide rows only. It therefore never contributes to a city gap.
Is a city target the same as a customer in that city?
No. Every chat engine's answer comes from an API call made from DiscoveredBy's servers, with no phone, browser or IP address in that city and no signed-in account. Google-based and app-based answers come from a data provider, and how it fetches them is not visible to us. The location is information passed on, and each engine decides how much to weigh it.
A city target therefore shows what an engine answers when given that city as the location. That can differ from what a real person there sees, signed in, on their own device. State this once, plainly, in any report that includes a city number, because it is the sentence most likely to be dropped.
How do you design a paired city and country prompt set?
Keep everything constant except the location, so a difference can only come from the location (or from ordinary variation, which you handle below). The Prompts docs show where the picker sits: a Cities control under the countries on the Add and Edit prompt forms, listing the cities of the countries enabled on your project. You choose from a fixed list; typed city names are not accepted, and if you need a city that is missing you contact support.
Follow these rules when pairing:
- Use one prompt with two targets (the country and the city), so the wording is identical. Do not write two similar prompts by hand.
- Match language and audience across the pair. A persona or language difference would otherwise be mixed into the location difference (see Languages and templates and Personas).
- Put the place in the question only when a real buyer would. "Best document review software for law firms" is a prompt the location setting can act on; "in Manchester" written into the wording changes the question itself, and both targets would carry it.
- Choose prompts where a place plausibly matters. A definition question rarely changes by city, so a flat gap there tells you little about location.
- Mind the slots. Each city uses one prompt slot per audience and language, and a prompt can hold at most 100 active targets. Pick a few cities that matter to the business, not the whole list.
Note one import limit: CSV or Excel import, accepting a suggestion and accepting a discovered prompt all add country-wide targets only. City targets come from the Add and Edit forms and from variant templates.
How should you read the gap?
Read it as a comparison over shared engines, with a sample-size check first. On the Local page, each country has a Country-wide row and a row per city; a city's gap pill is its value minus the country-wide value, and for brand position a negative gap is the better one.
Three rules from the Local docs shape how to read it:
- The gap uses the city's engines only. Its country-wide side counts only the engines that have answers for that city. When the Country-wide row on screen also pools an engine with no city answers (ChatGPT (app), for example), the gap can differ from the visible difference between the two rows, and a note under the table says so.
- Values from fewer than 30 observations are marked provisional. Do not present a provisional value as a finding.
- An empty gap is an en dash, never zero. It means one side has no value, or the country has no country-wide answers on those engines to compare with.
Also watch the comparison window. Choose 7, 28 or 90 days, and with the previous period on, remember that an engine that started answering mid-window counts on one side only. Filter to a single engine to compare like for like. The definitions of brand visibility and the other columns are the same as everywhere else in the product.
The deliverable: a location-testing plan
Copy this into your working document and fill it in before you add city targets. The fallback columns are the part teams usually skip.
LOCATION-TESTING PLAN
Project / brand: ______________________
Owner: ____________ Date started: ____________
Question this test answers: ________________________________________
(e.g. "Are we named as often for London buyers as for UK buyers?")
1. PROMPTS (paired; same wording, language and audience)
Prompt id | Wording | Language | Audience | Place-dependent? (Y/N, why)
2. TARGETS
Prompt id | Country-wide target (country) | City target (city, country) | Slots used
3. ENGINE DELIVERY CHECK (from the engines reference, dated ______)
Engine | Country delivery | City delivery | City runs? | Fallback risk
e.g. Gemini (app) | native | native (coordinates) | Yes | country level only if the city has no coordinates
e.g. ChatGPT (app) | native | not sent | No | never appears in a city row
e.g. Gemini (API) | prompt only | prompt only | Yes | location is a sentence only
4. FALLBACK LOG (check prompt detail on sampled answers)
Answer | Engine | City targeted? | Delivery recorded (country / city) | Country-level fallback? (Y/N)
5. COMPARISON RULES
Window: 7 / 28 / 90 days Compare with previous period: Y / N
Engines included in the gap: ______________________
Engines excluded and why: ______________________
Minimum observations before we report a value: 30 (below = provisional)
6. READING
City | City value | Country-wide value (same engines) | Gap | Provisional? | Notes
7. CAVEATS TO PRINT WITH THE RESULT
- Target location is not a customer's location.
- Engines weigh location differently; we cannot see how much.
- Anything provisional or fallback-affected is labelled as such.
8. NEXT ACTION (a hypothesis to test, not a diagnosis)
________________________________________________________________
Each answer's prompt detail records how its country and city were delivered, for example "Country sent natively; city sent natively", or that a city was targeted but sent at country level because there were no coordinates. The same values appear as country_delivery and city_delivery columns in the answers export, so you can filter fallbacks out in a spreadsheet. An answer collected before this record existed shows "Location delivery not recorded" and is never guessed.
A worked example
Illustrative example: Quillstone and its competitors are fictional, and the numbers are made up to show the method.
Quillstone sells document-review software to legal and compliance teams. It sells through UK offices in London and Leeds and wants to know whether London buyers meet it more often than UK buyers overall. Its rivals are Brieflane and Clausewise.
The team tracks "best document review software for a compliance team" with three targets: United Kingdom country-wide, London, and Leeds. Wording, language and audience match. They tick their delivery table: Perplexity, Claude and Google AI Overviews answered both cities; ChatGPT (app) answered UK-wide only. A spot check of prompt detail on Google AI Overviews answers for both cities reads "Country sent natively; city sent natively", so no fallback affects them.
Over 28 days, comparing the same three engines:
| Row | Analysed answers | Naming Quillstone | Brand visibility | Provisional? |
|---|---|---|---|---|
| UK country-wide (Perplexity, Claude, AI Overviews) | 60 | 15 | 25% | No |
| London | 40 | 14 | 35% | No |
| Leeds | 20 | 4 | 20% | Yes (under 30) |
London is 35% against 25%, a gap of +10 points. Leeds is 20% against 25%, a gap of −5 points, but only 20 answers back it, so the value is provisional and the team does not report it as a Leeds finding.
What the team writes: "On three engines that received the city, Quillstone was named in 14 of 40 London answers against 15 of 60 UK-wide answers. The Leeds sample is provisional." They do not write "London buyers see us more". Their next step is a hypothesis: check which cited pages differ between London and UK-wide answers, using the citations data, before changing any content.
What this cannot tell you
- It cannot tell you what people in a city see. Servers made the requests; no local device, IP address or account was involved.
- It cannot tell you how much an engine weighed the city. For Gemini (API) the city is only a sentence, and for the other chat engines it is a sentence plus a search setting; either way the engine decides how much to use it.
- A gap is not a cause. Small samples, model variation and different engine mixes can all produce a difference. Repeat over more days before acting.
- It cannot make ChatGPT (app) local. It takes a country only, so its city answers do not exist.
- A country-wide local question may be answered for a place you did not choose. On ChatGPT (app) and Gemini (app), a local question tracked for a whole country is answered for wherever the data provider's connection is. Track such prompts as city targets where the engine supports one; ChatGPT (app) does not.
- Rows are capped. The Local table keeps 25 places across all countries, and the page says how many cities are not shown.
Frequently asked questions
How many cities should I track?
Start with the two or three that matter commercially. Each city uses a prompt slot per audience and language, and thin samples from many cities give you mostly provisional values. Add more once the first cities return enough answers to read.
Why does my city row look the same as the country row?
Check the delivery record first. If a city was sent at country level, or the engines simply gave the location little weight, the answers may be alike. The similarity can be real, or it can be a fallback, and the record tells you which.
Can I type any city I want?
No. Cities come from a fixed list of 344 across the 18 countries a project can target. If a city you need is missing, contact support with the city and country and the team can add it.
Should the city name go in the prompt wording?
Only if buyers would write it that way. Adding it to the wording changes the question for both targets. To test the location setting itself, keep the wording identical and vary only the target.
Do paused prompts still count in the comparison?
Answers from paused prompts and targets still count for the window in which they were collected. The list of prompts where a city differs most, though, compares only prompts that still have an active target in that city.
Next step
If you already track prompts in DiscoveredBy, add one city target beside an existing country-wide target and open the Local page after a few days of answers. Fill in the plan above first, so you know which engines belong in the comparison. Related reading: Audit your prompt list before adding more prompts, Track AI visibility across languages without losing comparability, and Allocate a limited prompt budget across products and markets. For engine background, see Perplexity and Google AI Overviews.
- local ai visibility
- city targets
- geo tracking
- prompt design