Guide
How is a competitive visibility gap measured in local search?
Measure a competitive visibility gap as the competitor benchmark minus the target business's visibility share, expressed in percentage points across eligible observations. Fix the query, searcher location, device and session context, surface, competitor rule, observation window, visibility cutoff, and missing-row treatment before counting. The result is an observation for that sample, not a universal Google ranking score.
By Sergey Sulimko, Founder · · 5 sources, read Oct 22, 2026
| Input | Freeze before capture | Record with the result |
|---|---|---|
| Query set | Exact spelling, language, intent, and any location words | Every query string |
| Searcher location | A named address, map point, grid point, or another reproducible location input | How the location was supplied or estimated |
| Device and session | Device, browser or app, time zone, interface language, and any exposed location or sign-in context | The same context for every comparable run |
| Surface | One named surface, such as Google Maps or Google Search local results | The exact surface and mode |
| Competitor set | A fixed named set or a rule-based set tied to the same query and location context | Names, set size, selection rule, and any displayed cutoff |
| Observation window | One capture timestamp for a snapshot, or like-for-like run dates for a trend | Start and end dates or capture timestamps |
| Visibility cutoff | The position range that counts as visible on the named surface | The chosen cutoff K and how an absence is handled |
| Eligibility | Which rows have complete, comparable inputs | The eligibility flag for every row |
Show all 8 rows
Why must the query and searcher location stay fixed?
Keep the exact query and the searcher's location beside every observation because local visibility changes with the search context. Google says local results appear on Maps and Search for searches near a customer's location. Google defines distance from the customer who is searching and says it uses what it knows about the customer's location when the customer does not share it.1
Write the query exactly as captured. Do not replace several service phrases with a later report label. Record a named address, map point, grid point, or other reproducible location input, plus whether the location came from a device, a selected map point, an IP estimate, or another method.
Read the full section
The guide to tracking local search rankings separates local result observations from website reporting. The local search ranking observation log gives each capture its own query, location, surface, and timestamp.
How should I choose the competitor set?
Choose a competitor set before counting and keep the set tied to the same query, location, surface, and observation window. Use either a fixed list of named businesses or a declared rule that selects the businesses observed in that context.
Public Local Search Grid documentation shows competitors for a selected keyword and grid point, and separately provides a report-level competitor table for a selected keyword. Its displayed top-five list is that service's report behavior, not a Google-wide competitor rule.2 If a measurement service supplies the set, record the service, query, grid point, report date, and displayed cutoff. If you select the businesses yourself, record the names before comparing the target with them.
Read the full section
Do not change the competitor set after seeing which businesses produce a larger gap. If the set changes, label the result as a different comparison.
How do I choose the surface and visibility cutoff?
Choose one surface and state the cutoff that makes a result visible for that measurement. A rule might define visible as “observed within K positions on Google Maps,” but K is an analysis choice for the declared surface, not a Google-wide threshold.
Record whether the capture came from Google Maps, Google Search local results, or another explicitly named view. Keep Search Console website metrics separate from a Business Profile or local-result placement. Google defines Search Console average position as the average position of the topmost result from the site, and says manual results can differ by time, place, device, and recent history.3
Read the full section
Treat an absence consistently. Either exclude an invalid capture from the eligible denominator, or define the row as not visible before counting. Do not let a failed or incomplete capture silently become a competitor win.
How do I fix the observation window?
Use one timestamp for a snapshot and like-for-like runs for a time comparison. Keep the query set, location or grid, device and session context, surface, competitor rule, and cutoff unchanged across the comparison window.
For a trend, write down both run dates before calculating the difference. Public Local Search Grid documentation treats keyword and date selectors as part of the report and notes that its overview, date comparison, competitor table, and direct comparison sections work independently. Its top-100 and top-ten behaviors are limits of that service, not universal Google thresholds.4
Read the full section
Do not compare one manual search capture with a Business Profile activity period. A capture answers whether a result was observed under a context. A reporting period answers a different question about profile activity.
How do I turn observations into a denominator?
Make one row for each query-location-device-session-surface-time unit, then count only the rows that meet the eligibility rule. Let E be the row's eligibility flag, T the target's visibility flag, and C the visibility flag for each selected competitor.
Use this sequence:
- Freeze the target profile and exact query set. Record spelling, language, intent, and location words.
- Freeze the searcher location and how the location was supplied.
- Record device, browser or app, time zone, interface language, and any location or sign-in context the capture exposes.
- Choose one surface and record its exact mode.
- Freeze the competitor set, its selection rule, and any service-specific cutoff.
- Set the observation window and the visibility cutoff K.
- Capture one row per observation unit. Mark incomplete or invalid captures according to the eligibility rule.
- Count the target and every competitor with the same binary visibility rule.
- Label the calculation with its sample, surface, cutoff, competitor set, and eligible-row rule.
The target visibility share is the target's visible eligible rows divided by N, the number of eligible rows. The competitor benchmark is the mean of the selected competitors' visibility shares. The gap is the benchmark minus the target share, expressed in percentage points:
N = sum(E_r)
target_share = sum(E_r * T_r) / N
competitor_share(C) = sum(E_r * C_r) / N
competitor_benchmark = mean(competitor_share(C) for every selected competitor C)
gap_pp = 100 * (competitor_benchmark - target_share)
A positive gap means the target was visible in fewer sampled rows than the selected competitor benchmark. A negative gap means the target was visible in more sampled rows under the same declared rule. Neither sign is a promise about a future position.
What does a symbolic worked calculation look like?
A worked gap table keeps the eligibility flag and every visibility flag beside the capture context; the symbols below are a fill-in model, not a business measurement. Replace them only with records captured under one declared design.
| Observation unit | Eligible E | Target visible T | Competitor C1 visible | Competitor C2 visible | Capture context |
|---|---|---|---|---|---|
| Query qi, location lj, device or session dk, surface sm, time tn | E1 in {0,1} | T1 in {0,1} | C1_1 in {0,1} | C2_1 in {0,1} | Fixed inputs recorded |
| Next eligible unit | E2 in {0,1} | T2 in {0,1} | C1_2 in {0,1} | C2_2 in {0,1} | Same declared design |
| Each remaining unit | Er in {0,1} | Tr in {0,1} | C1_r in {0,1} | C2_r in {0,1} | Same declared design |
For two competitors, fill the table first, then calculate:
N = sum(E_r)
target_share = sum(E_r * T_r) / N
competitor_share(C1) = sum(E_r * C1_r) / N
competitor_share(C2) = sum(E_r * C2_r) / N
competitor_benchmark = (competitor_share(C1) + competitor_share(C2)) / 2
gap_pp = 100 * (competitor_benchmark - target_share)
Replace C1 and C2 with the complete frozen competitor set. If competitors were evaluated over different eligible rows, reconcile the rows before using a shared denominator or report separate denominators.
How do I keep Business Profile Performance out of the denominator?
Use Business Profile Performance as a separate profile-activity record, not as the competitor denominator for local visibility. Google says the report is available for verified Business Profiles and can show searches, views, directions, and other customer interactions for a selected date range.5
Those measures describe how people discovered or used one profile. They do not show how often the target and selected competitors were visible in the same query-location-surface sample. Keep the reporting period, profile identity, and activity metrics in a separate record.
How should I report the result honestly?
Name the result as an observed visibility gap for a declared sample, with its surface, cutoff, competitor set, window, and eligible-row rule. The formula in this guide is a measurement convention for that sample, not a Google metric.
Google's public local-ranking guidance says local results are mainly based on relevance, distance, and popularity, and that search-algorithm details are confidential. It also says there is no way to request or pay for a better local ranking.1 Those boundaries are why the report should say, for example, “the target's observed visibility share was below the selected competitor benchmark in this sample,” rather than claiming a universal rank gap or a cause.
Read the full section
For a related comparison boundary, see citation counts and local ranking statistics. A citation inventory and a local-result observation have different inclusion rules and should not share a denominator unless the records actually match.
Common questions
- No. A local rank is an observed ordinal position on a named surface, while a visibility gap compares binary visibility shares across eligible observation rows. The gap can be positive or negative without claiming a universal position.
- No. Google Search Console's average position describes the topmost result from a website in the selected Search reporting data. A Maps or local-result capture describes a different surface, so keep the two records separate.
- No. A positive gap means the target was visible in fewer eligible rows than the selected competitor benchmark under the declared cutoff. It does not identify a cause or predict a future result.
Maps Agent service
Where your profile stands now
Visibility Score 0-100 · 20 scored factors · free · no signup
- Profile Completeness
- 11 checks · 40% of score
- Performance
- 4 checks · 35% of score
- Competitive Position
- 5 metrics · 25% of score
Sources
All read Oct 22, 2026
- 1Tips to improve your local ranking on GoogleGoogle Business Profile Helpno publication date stated. Google's local-ranking guidance
- 2Can I see my competitors’ ranking results in Local Search Grid reports? (New Platform)BrightLocalno publication date stated. Competitor results in Local Search Grid
- 3Performance report (Search results): Overview and basic setupGoogle Search Console Helpno publication date stated. Search performance report guidance
- 4How do I understand Local Search Grid? (New Platform)BrightLocalno publication date stated. Local Search Grid report guidance
- 5Understand your Business Profile performance & insightsGoogle Business Profile Helpno publication date stated. Business Profile Performance guidance