Implementation9 min read

How to run a store locator from Google Sheets

Keep your locations in a shared Google Sheet and let a branded locator read it: how to lay out the sheet, what a sync does with each kind of edit, and the rules that keep a live page safe from a bad sort.

In short

You can run a store locator from Google Sheets by keeping the sheet as the list your team edits and connecting it to a hosted locator that reads it on a schedule. The sheet holds names, addresses, contact details and tags; the locator geocodes the addresses, handles search and filters, and renders the map on your site. Nobody editing the sheet needs access to the website.

In Handled Locator the sync reads one spreadsheet you choose and never writes back to it. The first run is always a preview you apply by hand; after that it runs manually, every 15 minutes, hourly or daily. Only the fields you map are controlled by the sheet, conflicts are held for review, and a row that disappears from the sheet is reported rather than deleting the location.

The one column that makes it work is a stable ID for each location, such as a store number. Without it a sync cannot tell a renamed store from a new one. Some things do not travel through the sheet, opening hours and custom fields among them, so plan where those live before you start.

Alderway Cabins website with its store locator: search, filters, result cards and a map
The Alderway Cabins locator on a phone

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.

SourceBest whenWatch out for
Dashboard editingOne person owns a short listBecomes a bottleneck once several teams need changes
CSV importA one-off migration or a quarterly batchEach upload is a fresh file, so the source of truth lives on someone's laptop
Google Sheets syncSeveral people maintain the list and changes happen weeklyEveryone with edit access can change the live locator
Airtable, Webflow CMS or HubSpot syncThe list already lives in one of those toolsSame 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.

ColumnExampleNotes
Stable IDMN-014Required for sync. Unique, never blank, never reused
NameNorth LoopRequired on every row
Address120 N 1st St, Minneapolis, MN 55401Or split into street, city, region and postcode columns
CountryUSInclude it whenever the list spans more than one country
Latitude and longitude44.9852, -93.2700Optional. Rows with both skip the address lookup
Phone, email, website612-555-0142Only what a visitor should see
DescriptionPickup counter at the rearShort, public
CategoriesPickup, ServiceComma-separated tags; these become filters
Location typestorefrontStorefront, 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.

  1. 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.
  2. 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.
  3. Choose the tab, confirm the stable ID column, and map only the fields the sheet should control. Anything unmapped stays under dashboard control.
  4. 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.
  5. 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 sheetWhat the sync does
New rowCreates a location and looks up its address, unless the row has coordinates
Edited mapped fieldUpdates that field; a changed address is looked up again
Edited unmapped columnNothing; the sync never reads it
Row deleted or filtered outReports it as missing and leaves the location unchanged
Same location also edited in the dashboardHolds it as a conflict, because both sides changed since the last sync
Blank or repeated stable IDHolds the row as a conflict
Tag that is not a category yetHolds the row until the category exists
Renamed headingStops the run, since the mapping no longer matches
More new rows than the plan holdsStops 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.