Learning local SEO where the map is not available
Local SEO means getting Google to treat you as the near and relevant option for someone searching in your city. Google itself says local results rest mainly on relevance, distance and prominence, and that there is no way to buy a better local ranking.
- Lesson 9 of 15
- Intermediate
- Free, no signup
The order of local work when a Business Profile is unavailable
Five stops in the order in which each rests on the one before. The spacing on the road is equal because no timeline is being claimed.
-
Base
Write down your real service area
In the words a customer uses, not the official ones
-
Content
Have a reason for every city
A page still true after swapping the city name is a template
-
Consistency
Write name, address and phone identically
On your own site and everywhere else you are listed
-
Proof
Collect local proof
A review from that city and real photos of the place
-
Measure
Measure the rank city by city
Separately, with dates, and never averaged
This is an order of work, not a promise of timing. None of these stops guarantees a ranking, and Google writes that local ranking cannot be bought.
Last checked: Facts and tool names in this lesson are re-checked against their sources on this date.
What does Google weigh for a local ranking?
Google names three factors. Relevance, how well your profile or page matches what was searched. Distance, how far each business is from the person searching, with Google using what it knows about their location when they have not shared it. And prominence, how well known a place is; Google writes that this factor also draws on things like how many websites link to the business and how many reviews it has.
On the same page sits a sentence worth quoting, because the opposite is sold constantly: "There is no way to request or pay for a better local ranking on Google." That is Google's own wording, not ours.
Of the three, distance is the only one outside your control. It is why the ranking for one phrase differs between two cities even when the searcher never typed a city name. We wrote the worked example of that difference, and how to track it, in our piece on city-by-city rankings, and this lesson carries on from there.
The three factors Google names for a local result
All three come from Google's own help page on local ranking. The order is the order on that page.
-
Relevance
How well you match what was searched for
-
Distance
The only factor outside your control
-
Prominence
Google writes that links and reviews feed into it
Google does not disclose algorithm detail. These are three names, not three weights; nobody knows the share of each.
Why the first step everyone teaches does not run in Iran
Every local SEO tutorial opens with one sentence: create and verify your Google Business Profile. Now open Google's own page about supported countries. It says Google must comply with sanctions imposed by the United States Office of Foreign Assets Control, and that as a result Business Profile currently does not support businesses in a short list of places, Iran among them.
So the first step everyone teaches cannot be carried out by an Iranian reader of that tutorial. Nobody writes this plainly, and the result is guides that send a reader chasing a button that will not work for them for several hours.
There are things we do not know, and we write them as such. We do not know whether a place already listed on Google Maps can be claimed and managed from inside Iran; we have not verified it. We do not know how often or where the local results pack appears for Persian searches inside Iran. We neither recommend nor sell any way around the restriction.
The rules of that service are still worth reading, even where it is unavailable, because they say what Google treats as one local identity. Eligibility has two shapes: either you have a physical location a customer can visit, or you travel to the customer; and a rented mailing address you do not operate from is not eligible. No more than one profile is created per location. And the name has to be the one that appears in the real world on your signage and stationery, not the name plus a few keywords. All four rules carry over to the site side: one page per real location, the same name on every page, and no title that is the business name followed by a list of services.
Our position: put aside the step that is unavailable and work on the three factors that remain available. Relevance and prominence are both built from your own site as well.
So what do you actually work on?
Four things, in this order. First, write your real service area on the site, with the names of the cities and districts, phrased the way a customer says them rather than the way the company registration does. Second, have a reason for every city you build a page for; the next section is the test for that. Third, write the name, address and phone number identically everywhere, on your own site and off it. Fourth, collect local proof: a review from a customer in that city, real photographs of the place, a partnership or a mention somewhere the people of that city actually read.
Do not treat the third one lightly. A phone number written once with a leading zero and once with a country code, an address that sometimes says "street" and sometimes does not, a name spelled three ways: all of them make matching harder for any system. The work takes an afternoon, and in the link building lesson we saw that this same consistency is the basis of citations too.
What is missing from the list matters as well: the "listed in hundreds of directories" packages. Google puts low-quality directory links in its link spam list, and adding your name to a hundred sites nobody opens builds neither prominence nor relevance.
When does a city page deserve to exist?
There is a simple and merciless test: count the sentences on that page that are only true of that city. If you take the page "our services in Shiraz", swap Shiraz for Isfahan, and no other sentence becomes false, then the page is a template and you are asking Google to index one page several times.
What does a sentence that is only true there look like? The travel time to a customer in that city, a branch or a warehouse that really is there, a real constraint such as serving that city only three days a week, a price that differs because of transport, the name of a project you delivered there, or even the word the people of that city use for your service and people elsewhere do not.
If you have none of those, you have two options and both are legitimate: write a single page that names every city you cover, or do not build the city page until you have something to say. Which one depends on the real differences between branches, and the city-by-city piece works that choice through.
The boundary: some repetition is fine. Your guarantee, payment terms and FAQ really are the same in every city, and writing them identically is honest. What causes the problem is a page with no unique sentence at all.
The city page: what is unique and what is not
Sentences true only of that city
- Travel time to a customer in that city
- A branch or warehouse that really is there
- A real constraint, such as service three days a week
- A word only the people of that city use
Sentences still true after the city name changes
- "The best service in {city} with an experienced team"
- A description of the city lifted from an encyclopedia
- The service list, identical to the home page
- Twenty other city names at the foot of the page
Repeating the guarantee and the payment terms is fine. The problem is a page with no unique sentence at all.
How much does local structured data help?
The LocalBusiness type on schema.org has two required properties: address and name. Everything else, from opening hours to coordinates and telephone, is recommended. Filling them in is the right move, because it tells a machine that this page is about one business at one specific address.
But let us cut one expectation short right away: this markup does not by itself lift you in local results, and it does not replace a Business Profile. What it does is explain, not rank.
There is a trap inside this very type that turns up constantly: the aggregateRating property. Google's documentation says it is only recommended for sites that capture reviews about other businesses. Meaning a rating you collected about yourself has no place inside a LocalBusiness node. Why, and what we did about that rule on our own site, is in the schema lesson.
How do you measure a local ranking?
The ranking you see in your own browser is not your ranking. Your search is coloured by your location and your history, and if you sit in Tehran you will never learn what a customer in Mashhad sees. So the measurement has to happen outside your browser, with an explicit location.
And here you meet a problem almost no tutorial mentions: rank tools take a city by name, from a location database that does not contain Iran. You cannot send "Mashhad" as the target. The workaround we use, documented in the next block, is to send geographic coordinates instead of a city name.
Keep three things apart so the number does not mislead you. Record each city's rank separately and never average them. Keep the date of every measurement, because local results move day to day. And measure the phrase a customer actually types, not the phrase with the city name appended; those are two different searches. Our own tool for this is rank tracking.
The fast path, with AI
The unique-sentence test can be done by hand, but across ten city pages nobody has the patience, which is exactly why template pages survive for years. What a language model is good for here is not "write the city page"; that produces precisely what this lesson rejects. The right job is subtraction: give it two pages and ask which sentences appear in only one. The interesting part is that the hard half needs no model at all and runs as a script; the model comes in to judge the result.
- Compare two of your own city pages with the script below. It returns three numbers: the sentences on each page and the verbatim shared ones.
- Look at the "only on the first page" number. If it is near zero, stop there: the page is not unique and no AI recipe fixes that.
- Hand the list of unique sentences to the model and ask which are genuinely true only of that city and which merely contain the city name. This is the only place judgement is needed.
- Delete the manufactured sentences and replace them with something only you know. The model cannot write this part, because it does not have the data.
Copy-ready recipe
A="https://example.com/services-city-one/"
B="https://example.com/services-city-two/"
curl -s -A "Mozilla/5.0" "$A" > a.html
curl -s -A "Mozilla/5.0" "$B" > b.html
python3 - <<'PY'
import re, html
def sents(p):
h = open(p, encoding="utf-8", errors="replace").read()
m = re.search(r"<main.*?</main>", h, re.S)
b = m.group(0) if m else h
b = re.sub(r"<(script|style|nav|footer)[^>]*>.*?</\1>", "", b, flags=re.S)
out = []
for p_ in re.findall(r"<p[^>]*>(.*?)</p>", b, re.S):
t = html.unescape(re.sub(r"<[^>]+>", "", p_))
for s in re.split(r"(?<=[.!?])\s+|\n+", t):
s = re.sub(r"\s+", " ", s).strip()
if len(s) > 25:
out.append(s)
return set(out)
a, b = sents("a.html"), sents("b.html")
print("A:", len(a), "| B:", len(b), "| shared verbatim:", len(a & b))
print("ONLY-A:", len(a - b), "| ONLY-B:", len(b - a))
print("\n".join("ONLY-A> " + s for s in sorted(a - b)))
PY
---- the prompt, over the ONLY-A output ----
Role: local content reviewer. Classify only; do not rewrite.
The city of this page: {city name}
The unique sentences of this page:
{the ONLY-A lines}
Put every sentence in one of three classes and give a short reason:
1. "True only here": a sentence that becomes false if the city name is swapped,
because it refers to a real place, time, constraint or event in that city.
2. "Carries the city name only": a sentence that stays entirely true after the
city name is swapped.
3. "Cannot tell": when the sentence itself does not settle it.
Rules:
- Never write a sentence that is not in the input, and rewrite nothing.
- A marketing claim such as "the best in that city" is always class 2, because
any city can be dropped into it.
- General description of the city, its history and population, is always class 2.
- Finish with two numbers only: how many sentences in class 1 and how many in
class 2.
- Do not propose new sentences. Writing a new sentence is my job.
Before you trust the output: Before running this over your city pages, try it once on two pages you already know are similar, so you can see the shape of the output. We did exactly that: two of our own service pages, <a class="text-link" href="/en/linux-hosting/">Linux hosting</a> and <a class="text-link" href="/en/wordpress-hosting/">WordPress hosting</a>, held 64 and 58 sentences on 5 September 2026, and 18 of them were verbatim identical. Those 18 are not a fault: several are the guarantee lines and the measurement method, which genuinely are the same on both pages. The number to watch is not the shared count but the unique one; when that approaches zero, the page has no reason to exist.
AI in this kind of work
In local SEO a language model does two jobs well and one badly. Well: comparing pages to find repeated sentences, and getting district names and the words people in one city use right. Badly: writing the city page, whose output is always the template this lesson rejects.
Tools that actually help
- Gemini Fits classifying sentences across several pages in a row. Our own entry notes Iran is not on Google's supported-countries list, and the payment route is in <a class="text-link" href="/en/ai/buy/">buying AI access</a>.
- Claude Stays more literal when you need sentences quoted rather than paraphrased. Iran is on neither of Anthropic's two supported-countries lists.
- Google Search Console Not AI, but the only place you see which city page is actually shown for which query. A page with no impressions at all does not have a rewriting problem.
Where it backfires
The specific risk in this area is generating city pages at volume with a model. Google defines "scaled content abuse" as producing many pages whose main purpose is to manipulate rankings rather than help users, and states explicitly that the definition holds no matter how the content was created. So a hundred city pages differing only in the name are one and the same thing under the policy, whether a model wrote them or someone copied and replaced by hand. The second risk is smaller but real: models state district names, distances and place names wrongly with full confidence, and a wrong address on a city page is worse than no page. Our position: the model compares and classifies, and a person who knows the city writes the local sentence.
Sources: Google Business Profile Help: supported countries and regions Google Search Central: spam policies, scaled content abuse
Where this advice stops
All of this happens on your own site, and your own site is not the whole of local SEO. Where a Business Profile is available it is a strong signal, and this lesson does not replace it. Distance is in nobody's hands either: if your business is on the other side of town, no amount of text moves it closer. And two things we have not verified and do not claim: whether a place already on the map can be managed from inside Iran, and how often the local results pack appears for Persian searches.
From our own work
Our own rank tracker holds a fixed location table, and in it the row for Iran carries location code zero. Zero means the data service we use does not have that country at all. The note at the top of the same file says the Google location database most providers rely on does not contain Iran, and it carries the date of the live check. Our answer was to store the 31 provincial capitals of Iran with geographic coordinates and to target a city by latitude and longitude instead of by name. In practice, to see a ranking in Mashhad we do not send the word "Mashhad"; we send the point 36.26, 59.62. Before that, any unknown country was silently mapped to the United States code and the user was handed a US result under their own country's name.
Real follow-up questions
Can you show up in local results without a Business Profile?
The ordinary search results are separate from the map pack, and your site page competes in those ordinary results. So for a phrase like "fridge repair in Shiraz" your page can rank. What you do not get without a profile is a place inside the map pack itself.
One page per city, or one page for all of them?
It comes back to the unique-sentence test. If you have at least a few sentences about that city that are not true anywhere else, build the separate page. If you do not, one page naming every city is more honest and does not create internal competition.
Do customer reviews on my own site help local ranking?
Google ties prominence to things like the number of reviews, but it means reviews it sees itself, not the ones you collected on your own site. Those reviews are worth having for the visitor and should be there; just do not expect stars in the results from them, for the reason set out in the schema lesson.