Why do they rank above me is the most common question a local business owner has, and it usually gets answered with a guess. It's answerable properly in an afternoon, because local search is unusually transparent: almost everything that decides the order is public by design.
One framing note before the steps, because it changes what this guide is for. The output is a list of things to fix on your own property. Not a dossier on a competitor, and not a list of what they're doing wrong. That isn't a moral point, it's a practical one, since nothing on their side is something you can act on. This guide also never names a real local business, and neither should your sheet if you share it.
The worked example is an Etobicoke HVAC company. The competitor details are illustrative, but the benchmark figures in step 5 are real, from a scan of 44 GTA service businesses published on this site, and they're labelled as such wherever they appear.
Find who actually ranks, not who you think of as a rival
Most owners already have three names in mind. Those names come from bidding against them, meeting them at suppliers, or hearing about them from customers, and they're frequently not who's beating you in search. That gap is the first finding.
- Open a private window. Not just signed out, a fresh private session.
- Search your money query, the one you'd most want to win: your main service plus your city.
- Set the location to your service area. Results default to where you physically are, which for you is your own premises, and that flatters you enormously.
- Write down who appears in the map pack and who holds the top organic results. Three names is enough.
- Repeat for one or two more money queries. Names that recur are your real competitors.
Compare that list to the one in your head. If the names differ, stop and consider it, because it usually means you're competing on reputation with one set of businesses and competing in search with another. The second set is the one this guide is about.
How to know it worked Three names taken from real results, in a private window, with the location set deliberately. If you can point at the search that produced each name, the list is sound. If any name came from memory, take it out.
Common trap Searching from your own office on your own machine. You're close to yourself, signed in, and have visited your own site a thousand times, so you'll see yourself ranking better than you do. Every number after this depends on getting this one honest.
Know what you can and can't see from outside
Decide this before you start recording, because the fastest way to ruin a competitor audit is to fill a column with something you inferred and then treat it as a fact three weeks later.
| Genuinely public | Inference only | Not visible at all |
|---|---|---|
| Review count, average, dates, and whether they reply | Their primary category, which you read from how they present rather than a field | Their Search Console: queries, impressions, click-through |
| Photos, posts, hours, services listed on the profile | Which pages they consider important | Their traffic, conversions, and what a lead costs them |
| Their whole website, including view-source and schema | Whether a change was strategy or an accident | Anything they haven't published |
The middle column is the dangerous one. Primary category is the highest-leverage field on a Business Profile and you can't read it directly, so you're inferring it from their name, their description, and what they rank for. Record it as an inference, in a column marked as such.
The third column matters too, because it's where competitor anxiety lives. You can't see their numbers, nobody can, and any tool claiming otherwise is estimating. Knowing that up front stops you chasing a picture that doesn't exist.
How to know it worked Your sheet has a column marking each finding as observed or inferred, and you filled it in as you went rather than afterwards. If everything is marked observed, you haven't been honest about the category.
Common trap Treating a paid tool's competitor keyword list as observation. It's a model built from sampled tracking, and on the low-volume phrases a local business actually lives on it is at its least reliable.
Read their profile and their site, outside in
Now fill the sheet. The fields worth comparing are the same ones worth auditing on your own profile, so rather than repeat them, the profile audit article lists them and you can run it pointed outward.
Four things read differently from outside, and they're where the useful findings are:
- Review recency and response rate, not count. Count is the number everyone stares at and the slowest to change. A profile with 40 reviews where the newest is three weeks old and the owner replies to most of them is being actively worked. One with 200 reviews, newest from 2023, no replies, is coasting. The second is more beatable than the number suggests.
- Photo and post recency. Same logic. A dead profile is an opportunity even when it currently outranks you.
- Site structure. Do they have a page per service and per area, or one page listing everything? This is the single most common structural gap, and it's visible from the navigation in about a minute.
- What the source says. Right-click, view source, and search for
application/ld+json. If it's there, they have structured data and you can read exactly what they claim to be. If it's absent, that's a real gap you can close cheaply.
Keep this to about fifteen minutes per competitor. The temptation is to go deep on the leader, and depth here has sharply diminishing returns, because the things that matter are visible fast and the rest is unknowable.
How to know it worked You can name three structural things a competitor does that you don't. Not three ways they're better, three concrete structural differences. If your list is impressions rather than structures, go back to view-source and the navigation.
Common trap Recording that their site "looks more professional". It may, and it isn't actionable, not measurable, and not why they rank. Design quality is real and belongs in a different conversation from this one.
The free audit scores any site on the same signals used in step 5, so you can run it on yourself and on a competitor and compare the two directly.
RUN THE FREE AUDITSeparate the gap you can close from the distance you can't
This is the most useful step in the guide and the one nobody wants to do, because it involves accepting that part of the gap is permanent.
Google states the local ranking factors plainly: relevance, which is how well a profile matches what someone searched; distance, which is how far the business is from the searcher; and prominence, which is how well known it is. The same page says there's no way to request or pay for a better local ranking.
Distance isn't a lever. You can't move, and moving wouldn't be worth it. So before you plan anything, go through your sheet and split every difference into two piles:
- Closable. Categories, services, photos, review velocity, response rate, site structure, schema, listings. All of it is work you can do.
- Not closable. They're downtown and you aren't. They've been trading since 1998. They have 400 reviews accumulated over a decade.
The second pile doesn't get deleted, it gets acknowledged and set aside, because knowing that a competitor sits three blocks from the office towers explains a chunk of the gap that would otherwise drive you to rewrite pages that were fine.
Two things worth knowing about distance. There is no radius in kilometres, and anyone quoting one is inventing it, because distance is weighed against the other two factors rather than applied as a cutoff. And your effective reach is set by how much competition sits between you and the searcher, which is why the same business can own one neighbouring town and be invisible in the next.
How to know it worked Every row on your sheet is marked closable or not, and you can say roughly what share of the gap is distance. If nothing is in the not-closable pile, you haven't looked at where they are.
Common trap Concluding the opposite, that it's all proximity and nothing can be done. That's the comfortable version of the same error. Proximity explains part of a gap and almost never all of it, and the closable pile is usually longer than the owner expects.
Benchmark what you found against real base rates
A gap only matters if it's unusual. Without a base rate you can't tell whether a competitor is ahead of you or merely ahead of nobody, and most competitor audits skip this entirely and treat every difference as significant.
So here are real numbers to compare against. These come from a scan of 44 GTA service businesses across six trades in July 2026, all of them businesses that already show up in search. That last part matters: because they already rank, these failure rates are a floor, and the wider market is worse.
| Signal | Failing | What a gap here means |
|---|---|---|
| No BreadcrumbList schema | 66% | Normal. Only worth noting on interior pages |
| Title outside 48 to 65 characters | 55% | Normal, and still worth fixing on your side |
| Image alt text under 85% | 45% | Common. Cheap to close |
| No Google Business Profile link | 34% | A real gap if they have one and you don't |
| Wrong H1 count | 32% | A real gap. Clearest structure signal there is |
| No LocalBusiness schema | 25% | A real gap, and one of the cheapest to close |
| No structured data at all | 11% | Unusual. If a competitor has none and outranks you, the reason is elsewhere |
Read it as a scale rather than a scoreboard. If a competitor is missing something that 66% of the market is also missing, it isn't what's beating you. If they have something 75% of businesses lack, that's worth your attention.
One honest exception. FAQPage schema was the most-missed signal in that scan at 82%, and it's the one the scan's author would now tell you to skip for Google specifically, since the rich result was rolled back. It still helps other consumers parse the page, so it isn't worthless, it's just not the ranking lever it looks like.
How to know it worked Each gap on your sheet is tagged normal or unusual against the table, and your action list in step 7 is drawn from the unusual ones first.
Common trap Treating an audit score as a ranking prediction. A score measures machine-readable signals on a page. It doesn't know your reviews, your proximity, or how long you've been trading, and a site can score 90 and rank fifth.
Check who the assistants name
Short step, and it comes with a caveat bigger than the step.
Ask two or three assistants the question a customer would ask: the best option for your trade in your city. Record who gets named, verbatim, with the date. The full method is here, including which prompts and where to run them.
Treat it as a spot check, never a metric. These outputs are non-deterministic, personalised, and change without notice, so a different answer next month proves nothing on its own. What it's useful for is the gross case: if the same competitor is named by all three assistants and you're named by none, that's a signal worth having, even though you can't measure it precisely.
Don't build a plan on this. Do build a dated record, because the value is in the pattern across several checks rather than in any single one.
How to know it worked A dated record of what each assistant said, quoted rather than summarised, and you have written down which competitor was named most often. One check is a data point and not a trend, and the record should say so.
Common trap Re-running the prompt until you get an answer you like. The outputs vary, so persistence will eventually produce a flattering one, and that answer means nothing. Record the first response.
Convert it into your list, not their list
The last step is the one that decides whether the previous six were worth an afternoon.
Go through the sheet and rewrite every finding as an action on your own property. A finding says Competitor B has a page for each service area. An action says write a page for Etobicoke, then Mimico. If a row can't be rewritten that way, it doesn't belong on the list.
Then order it, using what you already know:
- Closable and unusual first. From step 4 and step 5. These are gaps most of the market doesn't have, which means closing one is a genuine differentiator rather than catching up.
- Closable and normal next. Worth doing, cheap, but not why you're behind.
- Not closable: delete. Not park, delete. A list containing rows you can't act on is a list you'll stop opening.
Expect the finished list to be shorter than the sheet, often much shorter, and expect that to feel anticlimactic after two hours of research. That's the correct outcome. Three actions you'll actually do beats twenty observations, and the twenty observations were how you found the three.
How to know it worked Every row is phrased as something you do to your own site, ranked, with the top item small enough to start this week. No row names a competitor, and no row is about being closer to downtown.
Common trap Keeping the competitor columns in the final list. They were scaffolding. Once the actions are written, the comparison has done its job, and a to-do list that keeps score against somebody else is one you'll read for reassurance rather than work from.
The whole thing, worked
An Etobicoke HVAC company that couldn't understand why it sat below three others for furnace repair etobicoke. Competitor details illustrative; the benchmark figures are the real ones from the 44-site scan.
Step 1 changed the list. Two of the three names the owner expected weren't in the results at all. One of the three actually ranking was a business he had never heard of, operating from two neighbourhoods over.
Step 3 found the structural gap in about ten minutes. All three had a page per service. He had one services page listing eight things. Two of the three had review responses within the last month; his newest reply was from the previous winter. One had no structured data at all, which was worth noting precisely because it ruled something out.
Step 4 was the uncomfortable one. The top-ranked competitor is physically closer to the dense residential pocket most of those searches come from. That's distance, it's real, and no amount of work moves it. Setting it aside stopped the owner concluding his site was broken, because it wasn't, and it left a shorter and more honest gap to close.
Step 5 sorted the rest. His missing breadcrumbs matched 66% of the market, so it went to the bottom. His missing LocalBusiness schema put him with the 25%, which made it worth doing. The page-per-service gap wasn't in the scan at all, and it was the biggest difference on the sheet.
Step 7 produced four rows. Write a furnace repair page, write an AC page, reply to every review from the last year, add LocalBusiness schema. Two hours of research, four things to do, and one permanent disadvantage understood rather than fought.
That last part is the real output. Knowing which part of the gap isn't yours to close is worth as much as the list, because it's what stops you spending a winter fixing the wrong thing.
Copy and paste
Three artifacts. The sheet holds the audit, the search method keeps it honest, and the conversion rubric is what turns it into work.
One row per competitor. Label them A, B, C.
Never put a real business name in a sheet
you might share.
FIELD | YOU | A | B | C | SEEN?
---------------------------|-----|---|---|---|------
Ranks for my money query | | | | | obs
Primary category (guessed) | | | | | INF
Review count | | | | | obs
Newest review (date) | | | | | obs
Replies to reviews? | | | | | obs
Newest photo / post | | | | | obs
Page per service? | | | | | obs
Page per area? | | | | | obs
JSON-LD present? | | | | | obs
(view-source, search for
application/ld+json)
GBP linked from homepage? | | | | | obs
One H1 per page? | | | | | obs
Roughly how far from the
searcher | | | | | obs
SEEN? column, fill as you go, not after
obs = observed, you can point at it
INF = inferred, you reasoned it out
PRIMARY CATEGORY IS ALWAYS INF
It is the highest-leverage field on a
profile and it is not published. You are
reading it from their name, description
and what they rank for.
NEVER GOES IN THIS SHEET
their traffic, their queries, their
conversion rate, their cost per lead.
Nobody can see these. Tools estimate them.
Default search results are personalised and
located. Run from your own office, on your own
machine, and you will see yourself ranking far
better than you do.
EVERY TIME
[ ] private / incognito window
[ ] not signed in to any Google account
[ ] location set to your SERVICE AREA,
not wherever you are sitting
[ ] run each query twice, a minute apart
results move; one look is a snapshot
QUERIES TO RUN
1. [main service] + [city] money query
2. [main service] + "near me"
3. [second service] + [city]
4. [problem a customer would type]
e.g. "furnace not turning on"
RECORD FOR EACH
who is in the map pack (top 3)
who holds the top organic results
whether YOU appear at all
NAMES THAT RECUR = your real competitors.
Names you expected but never saw = you compete
with them offline, not in search. That gap is
itself a finding.
Every row gets rewritten as something YOU do.
finding: "B has a page for each area"
action: "write /furnace-repair/etobicoke"
finding: "A replies to every review"
action: "reply to all reviews from
the last 12 months"
Cannot be rewritten that way? It is not
an action. Cut it.
THEN SORT
1. CLOSABLE + UNUSUAL do first
most of the market does not have this,
so closing it is a differentiator
2. CLOSABLE + NORMAL do next
worth doing, cheap, not why you are behind
3. NOT CLOSABLE DELETE, do not park
distance, 15 years of trading, 400 reviews
built over a decade
"UNUSUAL" = check it against the 44-site
base rates in step 5. If two thirds of the
market also fails it, it is not your problem.
EXPECT A SHORT LIST
Two hours of research producing four rows
is the correct outcome, not a disappointing
one. The research is how you found the four.
NO ROW NAMES A COMPETITOR.
NO ROW IS ABOUT BEING CLOSER TO DOWNTOWN.
The whole audit on one page
Where this stops
The collection is genuinely satisfying and completely DIY. Everything here's public, the tools are a browser and a spreadsheet, and an owner who knows their trade will read a competitor's site faster than an outsider will.
What's hard is weighting. You'll finish with a dozen differences and the question is which one actually explains the ranking gap, rather than which one was easiest to notice. Those are rarely the same, and the visible differences are systematically the least important ones, since anything easy to see is easy for everyone to see and therefore rarely a differentiator. Knowing that a category mismatch outweighs a hundred reviews, or that the page-per-service gap matters more than either, is pattern recognition across a lot of these rather than a rule you can look up.
That weighting is what the Search Roadmap does, with the competitive layer included. If you want a faster read on where you stand, the free audit scores your site on the same signals behind the base rates in step 5, so you can run it on yourself and on a competitor and compare the two directly.
Questions people ask
Can I see which keywords a competitor ranks for?
Not properly, and it's worth knowing that before you go looking. Search Console data is private to whoever owns the property, so nobody can see a competitor's real query list, their impressions or their click-through rates. Paid tools estimate it by tracking a large sample of keywords and inferring positions, which produces a directionally useful picture and a lot of noise on low-volume local terms, exactly the terms a local business lives on. What you can do for free is the reverse: search the queries you care about and record who appears. That gives you a real answer for the phrases you actually chose, rather than an estimated answer for a list somebody else chose. For a single-location business that's usually the better trade.
Does having more reviews than a competitor guarantee a better ranking?
No. Google says more reviews and positive ratings can help local ranking, which is a contribution rather than a guarantee, and reviews are only part of prominence, which is only one of the three factors. A business with fewer reviews can outrank one with more by being closer to the searcher, by matching the query more precisely, or by being better known offline. It's also why review count is a poor thing to fixate on: it's the most visible number on a competitor's profile, so it attracts attention out of proportion to its weight. Recency and response rate tell you more about whether a profile is actively managed, and that's the thing you're really trying to read.
How close do I need to be to the customer to show up?
There's no distance threshold, and anyone quoting one in kilometres is inventing it. Distance is weighed against the other factors rather than applied as a cutoff, so how far you can reach depends on how much competition sits between you and the searcher. In a dense area with many similar businesses, your radius is small because someone closer almost always exists. In a thinly served area you can rank across a much wider region, because relevance and prominence have more room to matter. The practical read is that your effective radius is set by your competition rather than by your address, which is also why the same business can dominate one neighbouring town and be invisible in another.
Should I copy what the top competitor is doing?
Copy the structure, never the content. If they have a page for each service and you have one page listing all of them, the structure is the finding and it's worth acting on. If their opening paragraph is good, writing your own version of it is fine and copying it is both a legal problem and a self-defeating one, since a near-duplicate of a page that already ranks gives a search engine no reason to prefer yours. There's also a trap in assuming the leader is a model. They may rank because they're closer to the searcher, or because they've been established for fifteen years, and copying the visible parts of a business whose advantage is invisible produces effort with no result. Take the structural gaps, leave the rest.
How often should I redo this?
Once or twice a year, and only if something changed. This is the least repeatable audit on the list because competitor positions move slowly and the findings stay actionable for months, so re-running it quarterly mostly produces the same sheet and the feeling of having done something. The genuine triggers are worth watching for instead: a new competitor appearing in results where they weren't before, your own position dropping for a query you used to hold, or a competitor visibly rebuilding their site. Any of those is a reason to look. The calendar on its own isn't, and a competitor audit is a poor substitute for working your own list, which is what step 7 hands you.