# Google Maps Geo-Grid Rank Tracker - Local Falcon Alternative

> See where a business ranks on Google Maps across an N x N grid around it: rank per pin, average rank, share of local voice, top competitors per pin, a heatmap image and changes since the last run. $0.008 per grid point, a 7x7 scan costs $0.40.

- Category: Rank tracking & site SEO
- Price: $8 per 1,000 × grid point, billed per result by Apify (no subscription); any other billed events are listed on the Store page. Cap any run with `maxTotalChargeUsd`.
- Store page: https://apify.com/wrenfield-data/google-maps-grid-rank-tracker
- Human page: https://wrenfielddata.com/tools/google-maps-grid-rank-tracker/
- OpenAPI 3 spec: https://api.apify.com/v2/acts/wrenfield-data~google-maps-grid-rank-tracker/builds/default/openapi.json
- MCP tool: https://mcp.apify.com?tools=wrenfield-data/google-maps-grid-rank-tracker (appears as `wrenfield-data--google-maps-grid-rank-tracker`)

## Call it

Synchronous run that returns the dataset rows as JSON (use `/runs` for long jobs and poll; see the OpenAPI spec):

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/wrenfield-data~google-maps-grid-rank-tracker/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords": ["roofer"], "businessName": "Boise Roofing and Gutters", "businessLocation": "Boise, ID", "gridSize": 5, "radiusKm": 3}'
```

## Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `keywords` | array | yes | `["roofer"]` | What customers search on Google Maps, e.g. plumber, emergency plumber. Up to 20. |
| `businessName` | string |  |  | The business to track, exactly as on Google Maps. |
| `businessLocation` | string |  |  | Helps find the right business, e.g. Boise, ID. |
| `placeId` | string |  |  | Most precise way to identify the business (e.g. ChIJ...). |
| `cid` | string |  |  | Alternative business ID (the number in maps?cid=...). |
| `businessDomain` | string |  |  | Used to match the business when no ID is given. |
| `centerCoordinates` | string |  |  | Latitude, longitude for the grid centre, e.g. 43.6150, -116.2023. Default: the business location. |
| `gridSize` | integer |  | `5` | Points per side (odd number): 3 = 9 points, 5 = 25, 7 = 49, 9 = 81, up to 15 = 225. |
| `radiusKm` | number |  | `3` | Distance from the centre to the outer points. 1-3 km for dense cities, 5-15 km for suburbs and service areas. |
| `depth` | integer |  | `20` | How deep to look in each Google Maps result list (10-100). Ranks beyond this show as "20+". |
| `zoom` | integer |  | `13` | Google Maps zoom level used at each point (13 = city level, 15 = neighbourhood). |
| `trackChanges` | boolean |  | `true` | Remember results in a named key-value store ("maps-grid-rank-history") so each run shows rank changes. |
| `country` | string |  | `"United States"` | Country used to find the business by name. |
| `language` | string |  |  | Language of the results. Default: English. |

## Example input

```json
{
  "keywords": [
    "roofer"
  ],
  "businessName": "Boise Roofing and Gutters",
  "businessLocation": "Boise, ID",
  "gridSize": 5,
  "radiusKm": 3
}
```

## Output fields

One flat row per result:

| Field | Type | Description |
|---|---|---|
| `row_type` | string | pin = rank at one grid point; summary = one row per keyword with averages, competitors and the heatmap |
| `keyword` | string | Keyword checked |
| `business_name` | string | Tracked business |
| `pin` | integer | pin rows: point number (row by row from the north-west corner) |
| `row` | integer | pin rows: grid row (1 = north) |
| `col` | integer | pin rows: grid column (1 = west) |
| `latitude` | number | pin rows: latitude of the point |
| `longitude` | number | pin rows: longitude of the point |
| `distance_km` | number | pin rows: distance from the grid centre |
| `rank` | integer | pin rows: Google Maps rank of the business at this point (null = not in the results checked) |
| `found` | boolean | pin rows: the business appears in the results |
| `in_top3` | boolean | pin rows: rank 1-3 (the local pack) |
| `rank_label` | string | pin rows: rank as text, e.g. "4" or "20+" |
| `previous_rank` | integer | pin rows: rank in the previous run |
| `rank_change` | integer | pin rows: positions gained since the previous run (positive = better) |
| `top_results` | array | pin rows: top 3 businesses at this point |
| `results_checked` | integer | pin rows: results returned at this point |
| `business_place_id` | string | summary: place ID of the tracked business |
| `business_cid` | string | summary: CID of the tracked business |
| `grid_size` | integer | summary: points per side |
| `radius_km` | number | summary: grid radius |
| `zoom` | integer | summary: map zoom |
| `center_latitude` | number | summary: grid centre latitude |
| `center_longitude` | number | summary: grid centre longitude |
| `pins_checked` | integer | summary: points checked |
| `pins_found` | integer | summary: points where the business appears |
| `pins_top3` | integer | summary: points where it ranks 1-3 |
| `pins_top10` | integer | summary: points where it ranks 1-10 |
| `average_rank` | number | summary: average rank where found (ARP) |
| `average_total_rank` | number | summary: average rank over all points, not found = depth + 1 (ATRP) |
| `share_of_local_voice` | number | summary: % of points where the business is in the top 3 (SoLV) |
| `best_rank` | integer | summary: best rank on the grid |
| `previous_average_total_rank` | number | summary: ATRP in the previous run |
| `previous_share_of_local_voice` | number | summary: SoLV in the previous run |
| `average_total_rank_change` | number | summary: ATRP improvement since the previous run (positive = better) |
| `share_of_local_voice_change` | number | summary: SoLV change in percentage points |
| `previous_checked_at` | string | summary: when the previous run checked this keyword |
| `top_competitors` | array | summary: competitors that rank best across the grid (pins in top 3, average rank) |
| `heatmap_url` | string | summary: link to the heatmap PNG in the run key-value store |
| `scraped_at` | string | When the row was produced (ISO 8601, UTC) |

## Notes

- Auth: an Apify API token as `Authorization: Bearer <token>`; the MCP server also supports OAuth sign-in.
- Failed or empty results are not charged on most tools; check the pricing on the Store page.
- Questions: hello@wrenfielddata.com
