When a Google Sheet is the right source
A spreadsheet earns its place when the people who know about a change are not the people who run the website. Operations hears that a branch has moved, sales signs a new stockist, a channel manager drops a dealer. If each of them can edit a row they already understand, the locator stays current without a ticket to the web team.
It is not the only option, and for some lists it is not the best one.
| Source | Best when | Watch out for |
|---|---|---|
| Dashboard editing | One person owns a short list | Becomes a bottleneck once several teams need changes |
| CSV import | A one-off migration or a quarterly batch | Each upload is a fresh file, so the source of truth lives on someone's laptop |
| Google Sheets sync | Several people maintain the list and changes happen weekly | Everyone with edit access can change the live locator |
| Airtable, Webflow CMS or HubSpot sync | The list already lives in one of those tools | Same engine and rules as Sheets; pick the system your team already edits |
Lay out the sheet
One location per row, headings in the first row, nothing else on the tab. Totals, notes, merged headings and blank spacer rows all become rows the sync has to reject, so move them to another tab. Your own heading names are fine; you map each one to a locator field when you connect.
| Column | Example | Notes |
|---|---|---|
| Stable ID | MN-014 | Required for sync. Unique, never blank, never reused |
| Name | North Loop | Required on every row |
| Address | 120 N 1st St, Minneapolis, MN 55401 | Or split into street, city, region and postcode columns |
| Country | US | Include it whenever the list spans more than one country |
| Latitude and longitude | 44.9852, -93.2700 | Optional. Rows with both skip the address lookup |
| Phone, email, website | 612-555-0142 | Only what a visitor should see |
| Description | Pickup counter at the rear | Short, public |
| Categories | Pickup, Service | Comma-separated tags; these become filters |
| Location type | storefront | Storefront, service area or online. Blank means storefront |
The stable ID column, and why row numbers fail
A sync has to recognise the same real location from one run to the next. Names change when a store is rebranded, addresses change when it moves, and row positions change every time someone sorts the sheet. None of those can identify a location. A stable ID can: a store number, a dealer code, anything you already use that stays attached to one place and is never reused for another.
The sync treats the ID strictly. A blank ID or one that appears twice is a conflict and is never guessed at, so a copy-pasted row cannot silently overwrite the wrong store. If the column is new, fill it before connecting, and treat it as read-only from then on.
Connect and run the first sync
The steps below are the shape of it; the Google Sheets sync documentation has the current screens.
- Create every category the sheet uses in Handled first. A row carrying a tag that does not exist yet is held as a conflict naming the missing category, rather than inventing a filter nobody approved.
- Open Data, choose Google Sheets and connect the Google account that can open the file. The Google Picker grants access to the one spreadsheet you select, not to the rest of your Drive.
- Choose the tab, confirm the stable ID column, and map only the fields the sheet should control. Anything unmapped stays under dashboard control.
- Read the preview. It lists creates, updates, unchanged rows, invalid rows, conflicts and rows missing from the source. If the account already holds the same locations from an earlier CSV import, matching rows are linked to them instead of creating second copies.
- Apply the first run by hand, then choose a schedule: manual, every 15 minutes, hourly or daily.
What each sync does with each kind of edit
Knowing these rules in advance is what lets you give a team edit access without worrying. The pattern throughout is that the sync applies what is clearly safe and stops for a person on anything ambiguous.
| Change in the sheet | What the sync does |
|---|---|
| New row | Creates a location and looks up its address, unless the row has coordinates |
| Edited mapped field | Updates that field; a changed address is looked up again |
| Edited unmapped column | Nothing; the sync never reads it |
| Row deleted or filtered out | Reports it as missing and leaves the location unchanged |
| Same location also edited in the dashboard | Holds it as a conflict, because both sides changed since the last sync |
| Blank or repeated stable ID | Holds the row as a conflict |
| Tag that is not a category yet | Holds the row until the category exists |
| Renamed heading | Stops the run, since the mapping no longer matches |
| More new rows than the plan holds | Stops the run before creating anything |
What the sheet does not carry
The sync controls the standard location fields and tags. A few things are stored differently and are set elsewhere, so decide where they live before your team assumes the sheet covers everything.
Opening hours are set on each location in the dashboard, through the Location API, or by asking Claude or ChatGPT through the connector. Custom fields, such as a booking link shown as a button, travel through the API or the connector too. Dealer territories can be columns in a CSV import but not in a sync, because they are stored apart from the location row. Hiding a location, or archiving one that has closed, is a deliberate action in Handled, which is the point: a sort or a filter in the sheet can never take a store off the map.
House rules for the team that edits it
The sync is strict so the sheet can be relaxed, but a few habits keep the review queue short. Write them in a note on the sheet's first tab so a new editor sees them.
Edit a synced field in one place only. If the sheet controls phone numbers, change phone numbers in the sheet; a dashboard edit to the same field turns the next change into a conflict. Access matters too: anyone who can edit the tab can change the live locator, and a sheet shared by link can be opened by anyone holding the link, so keep account notes, margins and contacts on a file you do not connect.
- Never edit or reuse the stable ID column.
- Spell tags exactly as the categories are named.
- Do not rename headings; add new columns at the end.
- Mark closures in a status column and archive in Handled, rather than deleting the row.
- Keep test and draft rows on a separate tab.
When a sync does not do what you expected
Start with the latest run's review, which gives a reason for every row it held. The usual causes, in rough order: a tag spelled differently from its category; a stable ID copied onto two rows when someone duplicated a line; an address the lookup could not place, which adding coordinates fixes; and a location edited in both the sheet and the dashboard. If a whole run stopped, check whether a heading was renamed or the plan's location limit was reached. On a large first sheet, the address lookups are spread over more than one run, so a few rows may wait for the next run before they appear.
Frequently asked questions
Can I use Google Sheets as a store locator?
A sheet on its own cannot geocode addresses, sort by distance or draw a map. Connect it to a hosted locator that reads the sheet on a schedule and handles the search and map, and the sheet becomes the place your team edits the live locator.
How quickly do sheet edits reach the live locator?
On the next sync. In Handled you choose manual, every 15 minutes, hourly or daily after the first run, which is always a preview you apply by hand.
What happens if someone deletes a row from the sheet?
The location stays on the locator. A row missing from the sheet is reported for review and never treated as permission to delete, so an accidental sort, filter or cut cannot remove stores. Archive or hide a closed location deliberately in the dashboard.
Does the locator write changes back to my sheet?
No. Handled reads the spreadsheet you select and never writes to it. If the same field is changed in both the sheet and the dashboard, the next sync holds that location as a conflict for you to resolve.
Can opening hours come from the sheet?
Not through the sync. The sheet controls names, addresses, coordinates, contact details, descriptions, location type and tags. Hours are set per location in the dashboard, through the Location API, or through the Claude and ChatGPT connector.

