Google Maps Geo-Grid Rank Tracker & Competitor Heatmap
See where a business ranks on Google Maps at every point of a grid around it, and where every competitor ranks too: rank per point to 60, average rank, top-3 counts, a rank matrix per rival and an HTML heatmap.
Verification
Not yet in the weekly verification report.
Output fields
Authoritative field set from the dataset schema.
| Field | Type |
|---|---|
row_type | string|null |
business | string|null |
business_place_id | string|null |
business_address | string|null |
keyword | string|null |
grid_row | integer|null |
grid_col | integer|null |
latitude | number|null |
longitude | number|null |
zoom_m | integer|null |
rank | integer|null |
scanned_to | integer|null |
top3 | array|null |
competitors | array|null |
grid_size | integer|null |
step_km | number|null |
points | integer|null |
points_ranked | integer|null |
average_rank | number|null |
average_total_rank | number|null |
top3_points | integer|null |
top10_points | integer|null |
top20_points | integer|null |
share_of_top3 | number|null |
rating | number|null |
review_count | integer|null |
top3_average_reviews | number|null |
rank_matrix | array|null |
place_id | string|null |
name | string|null |
address | string|null |
categories | array|null |
google_maps_url | string|null |
source_url | string|null |
notice | string|null |
notice_type | string|null |
Sample row
{
"row_type": "summary",
"business": "Blue Bottle Coffee",
"business_place_id": "ChIJLRIbILeAj4ARyWoMWFQmkSY",
"business_address": "480 9th St, Oakland, CA 94607",
"keyword": "coffee shop",
"grid_size": 5,
"step_km": 1,
"zoom_m": 3000,
"points": 25,
"points_ranked": 20,
"average_rank": 35.95,
"average_total_rank": 40.96,
"top3_points": 0,
"top10_points": 1,
"top20_points": 5,
"share_of_top3": 0,
"rating": 4.4,
"review_count": 396,
"top3_average_reviews": 231.3,
"rank_matrix": [
[
46,
56,
null,
null,
null
],
[
33,
17,
38,
49,
null
],
[
24,
14,
6,
39,
59
],
[
24,
12,
13,
22,
51
],
[
54,
50,
54,
58,
null
]
],
"source_url": "https://www.google.com/maps/search/?api=1&query=Blue%20Bottle%20Coffee&query_place_id=ChIJLRIbILeAj4ARyWoMWFQmkSY"
} Inputs
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
businesses | array | no | ["Blue Bottle Coffee 480 9th St Oakland"] | Each business by its name and street address, as you would type it into Google Maps, e.g. "Blue Bottle Coffee 480 9th St Oakland". The grid is centred on the business, and each row names the place it resolved to. Leave empty to map a keyword's competitors around a location instead (below). |
business | string | no | — | A single business, for API calls and saved tasks. Combined with the list above. |
keywords | array | no | ["coffee shop"] | What a customer types into Google Maps, e.g. "coffee shop" or "emergency plumber". Each keyword is one grid scan per business. |
keyword | string | no | — | A single keyword, for API calls and saved tasks. Combined with the list above. |
gridSize | integer | no | 5 | Points per side: 3, 5, 7 or 9 (3 = 9 points, 5 = 25, 7 = 49, 9 = 81). Any other number is rounded to the nearest of these. Each point is one charge per keyword. |
stepKm | number | no | 1 | Kilometres between neighbouring grid points. 1 km suits a city neighbourhood; 3-5 km a suburb or a service-area business. |
zoomMeters | integer | no | 3000 | How wide the Google Maps view is at each point, which is the map's zoom. It changes rankings a lot (in our test one business ranked 2nd with a 1,000 m view and 33rd with a 30,000 m view from the same spot), so keep it the same between runs you compare. 3,000 m is about a neighbourhood on a phone screen. |
maxRank | integer | no | 60 | Look for the business down to this rank: 20, 40 or 60 (Google Maps pages hold 20 places). Included in the price per point. Beyond it the point reads "not ranked". |
includeCompetitorMatrix | boolean | no | true | Adds a free row for every competitor that reaches the top 10 at any point: its rank at every point, average rank, top-3 count, rating and reviews. |
location | string | no | — | With no business above, the grid is centred here and you get the competitor rows only, e.g. "Downtown Oakland, CA". |
centerLatitude | number | no | — | With no business, centre the grid on these coordinates instead of a location name. |
centerLongitude | number | no | — | Pairs with the centre latitude. |
maxGridPoints | integer | no | — | Optional spend cap for the WHOLE run (all businesses and keywords together): scanning stops at this many points and a free row says how many were left. |
proxyConfiguration | object | no | {"useApifyProxy":true} | Apify's datacenter proxy by default, which is what this actor was built for. |
Pricing
Pay per result (grid-point) — no charge for empty runs.
Example: 25 grid points at $0.012/result ≈ $0.30.
FAQ
How is a grid point searched?
The actor searches Google Maps for your keyword with the map view centred on the point, the way the Google Maps site does when you move the map there. It does not fake a phone's GPS. The rank is the business's position in that answer, counting each place once.
Why does the map zoom matter?
Google Maps ranks places inside the visible map, so a wider view brings in more competitors. In our test (2026-11-06) Blue Bottle Coffee in Oakland ranked 2nd for "coffee shop" with a 1,000 m view, 6th at 3,000 m, 16th at 10,000 m and 33rd at 30,000 m, all from the same spot. Pick one zoom and keep it between runs you compare. The default, 3,000 m, is about a neighbourhood on a phone screen.
Will my ranks match another rank tracker's?
Not exactly. Google's answer varies a little with where a search comes from: the same grid read from two different internet connections differed by 1 to 4 places at the same points in our test. Compare runs of this actor with each other, at the same zoom.
What are the competitor rows?
Every place that reaches the top 10 at any point of the grid gets a free row: its rank at every point (rank_matrix), average rank, points in the top 3, rating and review count. They come from the same searches as your ranks, so they cost nothing extra. Turn them off with "Competitor rows".
Can I map a market without a business?
Yes. Leave the business empty and give a location ("Downtown Oakland, CA") or centre coordinates. You get the point rows and the competitor rows; there is no summary, since there is no business to rank.
How am I charged?
$0.012 per grid point per keyword, with every page to rank 60 included. A 5x5 grid for one keyword is $0.30; a 7x7 grid $0.59. Summary, competitor and notice rows are free, and so is a point Google refused. Set "Maximum grid points for the run" to cap the spend.
Where is the heatmap?
In the run's key-value store, one HTML page per business and keyword, named heatmap-<business>-<keyword>: the grid as coloured squares (green top 3, light green top 10, yellow top 20, red beyond), north at the top, the business at the centre.
How long does a run take?
Measured on 2026-11-06: a 5x5 grid for one keyword in about 10 seconds. Each point takes one to three Google Maps searches, five points at a time.
Guides & use cases
Related actors