Prepared for the Search Atlas team

We measured the local heat maps against their own grid data

We pull Local SEO heat maps for every client we manage and we put those numbers in front of business owners. Before we keep doing that we wanted to know how the numbers are built and whether they say what a reader thinks they say. So we exported all 35,492 grid pins, recomputed the averages from scratch, and compared the result against Google Search Console and Google Analytics. Most of what we found is sound. A few things are not, and one of them reverses the meaning of a chart.

24business records 874keyword grids 35,492grid pins 15.7%outside the rank scale
Prepared 27 July 2026
Window 2026-04-28 to 2026-07-26
Sources Search Atlas, Search Console, Analytics
Scope
WAITING

What we pulled from every account and how much of it we verified

We exported the full grid summary for the account, which returns one row per grid pin rather than one row per keyword. That gave us 35,492 rows covering 874 keyword grids across 24 business records. Every average in this document was recomputed from those rows.

We then pulled Google Search Console and Google Analytics directly, using our own OAuth credentials rather than anything reported back through the platform. That gives us a second opinion that does not originate from Search Atlas.

35,492
Grid pins exported
10.1 MB, one row per pin
874
Keyword grids
24 business records
832
Keywords cross checked
against Search Console
399,942
Sessions reviewed
Analytics, 15 properties

One limit up front. We could not independently confirm any individual rank claim. We tried, and the section near the end lists exactly what we tried and how each attempt failed. Everything in this document is therefore a check of Search Atlas against Search Atlas, or against Google data that measures a different surface. Where we are guessing, we say so.

What holds up
WAITING

Where the local heat maps hold up against the underlying data

We want to lead with this because it is the larger part of the finding. The grid mechanics look real and internally consistent.

Consistent

Detail view matches the pins

For every grid we checked by hand, the average returned by the detail endpoint matched the average we computed from that grid's own pins. The number the detail view shows is the number its data supports.

Real geometry

Pins land where they should

Grid centres sit on the business address for 18 of the 19 active records, at the configured radius, with the standard 39 pin circle. The coordinates are genuine, not synthesised.

Honest about absence

Invisibility is reported

Where the heat map says a business is nowhere, Search Console agrees. Right On Roof On shows nothing on all 25 grids, and Search Console independently finds almost no demand reaching that site.

Deep history

Snapshots go back a year

Long running grids carry monthly snapshots back to September 2025, with competitor names, review counts and appearance counts per pin. That is genuinely useful comparative data.

The problems we found are not with the crawl. They are with how the collected data is summarised into the single number that a client actually reads.

The formula
WAITING

How the average rank on your dashboard is actually calculated

We reverse engineered the headline average by testing candidate formulas against the exported pins. One fits, and it matched the displayed figure for 17 of the 20 business records that show one. The three misses were all within 0.6 of a rounding boundary.

Step 1  For each grid, average the 39 pins. A pin where the business does not appear counts as 21, one worse than the bottom of the visible scale.
Step 2  Discard every grid where the business appeared on no pin at all.
Step 3  Average the grids that are left. That is the number on the dashboard.

Step 1 is defensible and we have no argument with it. Step 2 is the one we would like explained. A keyword where the business is invisible across the entire grid is the strongest possible signal of a visibility problem, and it is the signal that gets removed before the average is taken.

Dropped grids
WAITING

The grids that disappear from the average before you see it

Across the account, 124 of 874 grids (14.2 percent) return no ranking on any pin, and every one of them is excluded from the average its client sees. The effect is not evenly spread. For some businesses it changes the headline substantially.

Displayed average rank compared with the average when fully invisible grids are counted.
BusinessShownCounting dropped gridsDifferenceGrids dropped
Procare Consulting 1115.93 +5.49 26 of 50
Skyline Tent Company 37.48 +4.75 13 of 50
Curated Events Charlotte - Showroom 1315.94 +3.11 19 of 50
Curated Events DC- Leesburg Showroom 56.84 +2.36 5 of 35
Bola Aladegbami, MD 810.00 +2.09 8 of 50
Elegant Event Lighting 57.08 +1.86 6 of 51
Curated Events Savannah 45.73 +1.85 4 of 37
Texas Strong Plumbing 56.98 +1.56 5 of 50
Endometriosis Center of Excellence 33.78 +1.10 3 of 50
Swiff Security 33.24 +0.74 1 of 25
Curated Events D.C. (Tyson Corner Showroom) 44.35 +0.70 2 of 49
WW Air Specialist 66.18 +0.30 1 of 50
Mayday Pest 1312.85 +0.16 1 of 50
The clearest example

Skyline Tent Company reads as average rank 3, and 13 of its 50 keywords return nothing at all

Counting those 13 grids at the same value the formula already uses for an absent pin moves the average from 3 to 7.48. Both numbers are defensible as statistics. Only one of them tells an owner that a quarter of the terms being tracked on their behalf are not working.

Computed from 1,950 exported pins for that record.

Procare Consulting is the widest gap in the account: 26 of 50 grids dropped, moving the average from 11 to 15.93.

The zero value
WAITING

A business that ranks nowhere is recorded as position zero

When a business appears on none of the 39 pins, the detail endpoint reports avg_rank: 0 and best_position: 0, alongside a position distribution showing all 39 pins in the worst band. The list endpoint reports the same grid as null.

So the same condition is expressed three different ways across the product: null, 0, and 21 inside the per grid maths. Zero is the one that causes damage, because on any scale where one is the best rank, zero reads as better than first.

122
Grids reporting zero
14.0% of active grids
15
Grids above the scale
values up to 20.9
137
Outside one to twenty
15.7% of all active grids
735
Inside the scale
read as intended

We checked what this does downstream in our own reporting, and we found the fault on our side too. Our report builder passes avg_rank straight through and sorts the map pack table ascending, so a grid reporting zero sorts to the top and is presented to the client as their strongest keyword. That is our bug to fix and we are fixing it. We raise it here because any customer building on this field will hit the same thing.

Chart inversion
WAITING

One keyword where the chart reports the opposite of what really happened

This is the finding that prompted the review. Texas Strong Plumbing tracks the keyword katy plumbing. Its two snapshots read like a collapse.

Snapshot history for the keyword, showing the reported average against what the pins contain.
Snapshot dateReported averageWhat the pins actually contain
2026-05-040Appeared on no pin. Zero is the absence marker.
2026-06-0120.5Ranked first on 1 pin, absent on the other 38.
Why this matters

Plotted on a rank axis this reads as a fall from best to worst, when the business in fact went from nowhere to first place on one pin

The business improved. The chart shows a decline. The cause is that zero and 20.5 both describe near total absence, but they sit at opposite ends of a rank axis. Any client report that charts avg_rank over time inherits this reversal, and the reader has no way to detect it from the chart alone.

Grid 2tuh.ceo8. Distribution reported as 1 pin in positions one to three, 37 beyond twenty, 1 failed.

Worth adding as context rather than criticism: the top competitor on that grid is The Katy Plumbing Company Heating & Air, holding 38 of 39 pins with 3,639 reviews. The keyword is close to that competitor's brand name, so the tracked term may simply be a poor choice on our side.

Endpoint disagreement
WAITING

Two endpoints in the platform return two different average positions

Calling the list endpoint and the detail endpoint for the same grid, within the same minute, returns two different averages. The detail endpoint agrees with the pins. The list endpoint is consistently higher by exactly half a position.

Average position for identical grids as reported by two endpoints and as computed from the pins.
KeywordBusinessList endpointDetail endpointFrom the pinsPin detail
wedding lighting near meElegant Event Lighting 1.5 1 1.00 all 39 pins report rank 1
event lighting rentalElegant Event Lighting 1.8 1.3 1.33 30 pins at 1, 6 at 2, 2 at 3, 1 at 4
uplighting near meElegant Event Lighting 2.4 1.9 1.90 14 pins at 1, 16 at 2, 8 at 3, 1 at 4
tent rental serviceSkyline Tent Company 2.5 2 2.03 10 pins at 1, 18 at 2, 11 at 3

The first row is the cleanest test. All 39 pins report rank one, so the average can only be one. The detail endpoint says one. The list endpoint says 1.5. We would like to know which figure the dashboard and the reporting exports use, because a portfolio view built on the list endpoint would show every client half a position worse than their own detail page.

Above the ceiling
WAITING

Ranks that sit above the top of the twenty position scale

No pin in the export carries a rank above 20, yet 15 grids report an average above 20. This follows directly from counting absent pins as 21, and it is arithmetically correct. It is also unreadable: a client asking what position 20.9 means has no good answer, because the scale stops at 20.

Grids whose reported average exceeds the maximum rank on the scale.
KeywordBusinessReported averagePins where it ranks
top rated gynecologist near me Endometriosis Center of Excellence20.9 1 of 39
best gynecologist near me Endometriosis Center of Excellence20.9 2 of 39
inguinal hernia surgery fort worth Bola Aladegbami, MD20.9 2 of 39
hernia surgeon fort worth tx Bola Aladegbami, MD20.9 1 of 39
group health insurance florida Procare Consulting20.8 1 of 39
rentals near me Curated Events Savannah20.6 1 of 39
pelvic pain doctor near me Endometriosis Center of Excellence20.6 1 of 39
dental insurance tampa Procare Consulting20.5 1 of 39
group health insurance tampa Procare Consulting20.5 1 of 39
air solutions heating cooling WW Air Specialist20.5 1 of 39

In every one of these cases the business ranks on one or two pins out of 39. A label such as "visible on 2 of 39 points" would carry the same information without implying a position that cannot exist.

Configuration
WAITING

Grid settings drift quietly between clients and inside accounts

Our own standard is a three mile circle. The export shows that is not what every client has, and in one case the difference is large enough to make the client's number incomparable to everyone else's.

Grid configuration and data freshness for each active business record.
BusinessGridsPinsShown avgCounting droppedDroppedPins absentDays since scan
Mayday Pest 503,200 13 12.85 1 46% 26
Elegant Event Lighting 511,989 5 7.08 6 24% 26
Curated Events 461,950 12 12.49 0 11% 0
Curated Events Chesapeake 491,950 2 1.54 0 0% 1
Curated Events - North Nashville Showroom 501,950 2 2.19 0 0% 1
Skyline Tent Company 501,950 3 7.48 13 27% 20
Ventura Rental 501,950 2 1.51 0 0% 26
Curated Events Raleigh 501,950 4 3.67 0 0% 26
Curated Events D.C. (Tyson Corner Showroom) 491,950 4 4.35 2 6% 26
Endometriosis Center of Excellence 501,950 3 3.78 3 12% 26
WW Air Specialist 501,950 6 6.18 1 6% 26
Bola Aladegbami, MD 501,950 8 10.00 8 23% 26
Curated Events Charlotte - Showroom 501,950 13 15.94 19 52% 26
Texas Strong Plumbing 501,950 5 6.98 5 14% 56
Procare Consulting 501,948 11 15.93 26 68% 25
Curated Events Savannah 371,443 4 5.73 4 17% 26
Curated Events DC- Leesburg Showroom 351,365 5 6.84 5 20% 26
Right On Roof On 25975 none 21.00 25 100% 25
Swiff Security 25975 3 3.24 1 8% 26

Spacing. Mayday runs at null miles against a portfolio standard of three, producing a measured grid radius of 25.05 miles. Half that grid sits in towns a local pest control business has no reason to serve, which is most of why it reports 46 percent of pins absent and an average of 13. The number is not wrong. It is measuring a different question.

Mixed spacing inside one account. 0 records carry more than one spacing value across their grids, so a single business average blends grids covering different geographies.

Grid placement. Right On Roof On has its grid centred 21.5 miles from downtown Austin and 2.1 miles from Hutto, while tracking keywords written for Austin. It has no address on record in the platform. All 25 of its grids return nothing, and misplacement is the most likely reason.

Freshness. Texas Strong Plumbing is set to a crawl frequency of zero, meaning one time only. Its last scan was 2026-06-01, 56 days ago, and it will not refresh again. This client received a report during that window.

Account hygiene
WAITING

Records in the account that should not be billed at all

Some of this is ours to clean up rather than yours to fix, but it affects what we are paying for so we are including it.

A home address tracked as a business. The record named 20547 Amberfield Dr is a residential street address carrying 3 grids and 117 pins, tracking the terms house, condo and apartment for rent. Every pin returns nothing, and has since it was created.

Business records that have never produced a usable scan.
BusinessPinsLast scanExported coordinatesAddress on record
Custom Builder Connection 1never scanned lat -84.5021, lng 29.7869 8588 Katy Fwy #450, Houston, TX 77024
Curated Events Nashville (Belle Meade) 1never scanned lat -86.8576, lng 36.1306 95 White Bridge Rd Suite 110, Nashville, TN 37205, USA

Both records above export a single pin and have never been scanned. Their coordinates are also transposed: the Nashville record exports latitude -86.8576 and longitude 36.1306, which are that address's real values in the opposite fields. A latitude of -86.86 is in the Southern Ocean.

Duplicate grids. 6 grids export twice the expected rows, at 78 rows across only 39 distinct pin coordinates, which suggests the same keyword is tracked twice for the same business.

Grids exporting duplicate rows per pin coordinate.
KeywordBusinessRows exportedDistinct pins
canopies and tent rentals Curated Events7839
tent rental service Curated Events Chesapeake7839
rental tents for weddings near me Curated Events7839
wedding party decoration rentals Curated Events7839
wedding centerpiece rentals Curated Events7839
event rentals near me Curated Events D.C. (Tyson Corner Showroom)7839

Business record drift. Review counts held against the heat map record differ from the counts held against the same business in the Google Business Profile section of the same platform.

Review counts recorded against the heat map compared with the profile record.
BusinessHeat map recordProfile recordDifference
Mayday Pest434 444+10
Procare Consulting127 135+8
Surfers Point Live6 0-6
WW Air Specialist78 83+5
Curated Events Chesapeake80 81+1
Ventura Rental183 184+1
Curated Events Raleigh154 155+1
Endometriosis Center of Excellence82 81-1
Curated Events Charlotte - Showroom0 1+1
Texas Strong Plumbing307 308+1
Curated Events Nashville (Belle Meade)12 13+1
Google data
WAITING

What Google's own search data says about these keywords

We pulled Search Console for every property we control and matched each tracked heat map keyword against real recorded queries over the ninety day window. 537 of 832 tracked keywords (64.5 percent) appear in Search Console at all.

We want to be careful about what that does and does not prove. Search Console measures the website in web results. The heat map measures the business listing in the map pack. They are different surfaces, and a keyword can carry real map pack demand while producing no web impressions. This table cannot falsify a single rank claim and we are not presenting it as though it does. What it does show is which tracked terms have any demonstrable demand behind them.

Tracked heat map keywords compared against Search Console query data over ninety days.
BusinessTrackedSeen in Search ConsoleShareImpressionsClicksMedian position
Right On Roof On25 2 8% 140 41
WW Air Specialist50 14 28% 970 11.7
Mayday Pest50 16 32% 85912 8.3
Skyline Tent Company50 20 40% 3326 5.3
Procare Consulting50 21 42% 2,5671 21.1
Texas Strong Plumbing50 28 56% 2,0912 21.9
Endometriosis Center of Excellence50 29 58% 9,302238 10.7
Elegant Event Lighting51 30 59% 79513 12.9
Curated Events46 28 61% 5888 10.9
Curated Events Chesapeake49 35 71% 1,68013 8
Swiff Security25 18 72% 1,3650 42.9
Curated Events D.C. (Tyson Corner Showroom)49 39 80% 1,27130 9.3
Bola Aladegbami, MD50 40 80% 1,0730 29.2
Curated Events Raleigh50 43 86% 4,643119 9.5
Ventura Rental50 44 88% 8,30320 20
Curated Events DC- Leesburg Showroom35 32 91% 1,43723 10.7
Curated Events Charlotte - Showroom50 48 96% 6,78884 11.1
Curated Events - North Nashville Showroom50 49 98% 5,85959 18.1

The two ends of that table are both informative. Right On Roof On sits at the bottom, and the heat map already says the same thing, so the two sources agree that this business is invisible. At the other end several records show most tracked terms carrying real impressions, which is the pattern you would expect from a well chosen keyword set.

Analytics over the same window, for context on whether visibility is reaching these sites at all:

Analytics sessions by property over the ninety day window.
BusinessSessionsOrganic searchOrganic share
Curated Events 270,35767,756 25%
Endometriosis Center of Excellence 56,39845,716 81%
Surfers Point Live 25,9721,258 5%
Ventura Rental 23,9839,150 38%
Celebrate 6,7554,411 65%
Skyline Tent Company 4,5002,229 50%
Mayday Pest 3,4551,868 54%
Procare Consulting 3,279926 28%
Elegant Event Lighting 2,628703 27%
Swiff Security 643250 39%
WW Air Specialist 633318 50%
Bola Aladegbami, MD 567303 53%
Custom Builder Connection 35081 23%
Right On Roof On 25469 27%
Texas Strong Plumbing 16818 11%
Where we are blind
WAITING

The checks we ran that Google would not let us complete

We set out to verify a specific claim: that at a given coordinate, for a given keyword, a business holds a given position. We could not complete that check, and we would rather state that than imply a verification we did not perform.

Verification methods attempted and their outcome.
MethodOutcomeDetail
Geo targeted Google search, coordinate encoded uule, fetched through Firecrawl BLOCKED Google returned its automated traffic page and a CAPTCHA instead of results.
Google Maps listing page by CID, fetched through Firecrawl BLOCKED Maps returns a JavaScript shell of map tiles, no rating or review text in the response.
Google Business Profile Performance API, direct BLOCKED businessprofileperformance.googleapis.com returns quota_limit_value 0 on this project.
Google Business Profile Account Management API, direct BLOCKED mybusinessaccountmanagement.googleapis.com returns quota_limit_value 0 on this project.
Google Search Console API, direct AVAILABLE 85,082 query rows pulled across 15 properties, plus 42,995 rows across 6 Curated Events location properties.
Google Analytics 4 Data API, direct AVAILABLE Session and channel data pulled for 15 properties.

4 of the 6 routes we tried are closed to us and 2 are open. The two Google Business Profile interfaces return a quota ceiling of zero on our project, which means the direct profile integration is not available to us at all. That is a gap on our side, not a fault in your product, and we are pursuing access separately.

The honest position

We can show that the summary numbers are internally consistent, and we cannot show that the underlying ranks are correct

Everything in this document compares Search Atlas against Search Atlas, or against Google data describing a different surface. If there is a way for a customer to audit a rank claim at a coordinate, we would like to know what it is. That single answer would resolve most of what follows.

Open questions
WAITING

Questions we would like the Search Atlas team to answer

  1. 1Why are fully invisible grids excluded from the average?Dropping the 124 grids where a business appears nowhere removes the strongest negative signal in the dataset before the headline number is produced. Is that deliberate, and is there a setting to include them?
  2. 2Can the zero value be separated from a real rank?avg_rank: 0 currently means "appears nowhere" but sorts and plots as better than first place. A null, or an explicit flag, would remove a whole class of downstream error for anyone building on the API.
  3. 3Which average is authoritative?The list endpoint and the detail endpoint disagree by exactly half a position on every grid we checked, with the detail endpoint matching the pins. Which one feeds the dashboard, and which feeds report exports?
  4. 4How should an average above twenty be read?15 grids report a value above the top of the scale. Is a count of ranking pins available as an alternative summary?
  5. 5Can a customer verify a rank at a coordinate?We could not reproduce a single position independently. A documented method, or a raw response sample for one pin, would let us stand behind these numbers with clients.
  6. 6What happens to a grid set to a crawl frequency of zero?One of our clients has 50 grids frozen at 2026-06-01. Should a one time grid still present as current data in the interface, and should it be flagged as stale after a period?
  7. 7Why do the heat map and profile records hold different review counts?11 businesses differ between the two sections of the platform, by as much as 10 reviews. Which record is the live one?
  8. 8Are duplicate grids billed twice?6 grids export duplicate rows for the same keyword and business. We would like to know whether these are two tracked grids or one grid exported twice.

The crawl looks sound. The summary is where meaning gets lost.

124 invisible grids removed before averaging, 122 grids reporting zero for absence, and one chart that runs backwards.

Reproduction
WAITING

How to reproduce every single number in this document

Nothing here was typed by hand. Every figure is computed from the exported data by a script, so any number in this document can be traced back to a row in the source files.

1  Export the grid summary for all businesses. One row per pin, 35,492 rows.
2  parse.cjs reads the export and groups pins into 874 keyword grids.
3  analyze.cjs recomputes every average, counts the sentinel values,
    matches keywords against Search Console and writes findings.json.
4  build.cjs renders this page from findings.json alone.

Readings taken directly from the API are recorded verbatim in
api-readings.json so the displayed values can be diffed against the export.

The comparisons in the endpoint section were taken by calling both endpoints for the same grid identifier in the same session. Those identifiers are printed in the tables above so they can be checked directly.

Where we may be wrong

The limits of this review, stated plainly so they are not discovered later

We verified that grid averages match their pins for a sample of grids, not for all 874. We did not verify that any rank is correct, because Google blocked every route we tried. The Search Console comparison measures a different surface from the map pack and cannot confirm or deny a map pack position. The formula in this document is inferred from matching computed values against displayed ones for 17 of 20 records, not from documentation, so it may be wrong in detail. And the review count comparison uses two Search Atlas surfaces, neither of which we could check against live Google.