Services

38 Stores, a US$5,290 Map Bill in One Month: Building a Store Locator That Survives Its Own API Invoice

2026.09.18 · 14 views
38 Stores, a US$5,290 Map Bill in One Month: Building a Store Locator That Survives Its Own API Invoice

Google retired the $200 monthly credit in March 2025 and replaced it with per-SKU free caps; Nearby Search Pro runs US$32 per 1,000 calls. Here is the provider matrix, the nearest-N query, geofencing, real costs and six traps to dodge.

Share:

A 38-store restaurant chain called for help. Two months after launching store search on its website and app, the Google Cloud invoice read US$5,290 — roughly NT$169,000. The cause was singular: every map drag and every keystroke in the search box fired a Places API Nearby Search. On the Google Maps Platform price list, Nearby Search Pro grants only 5,000 free calls a month, then charges US$32 per 1,000 — over four times Dynamic Maps at US$7 per 1,000. Maps are cheap. Unmetered calls are not.

Where it pays off, and where it does not

Worth building

  • More than 10 locations across multiple cities, where "the three nearest to me" genuinely matters
  • Delivery areas that differ by branch and need a geofence to answer coverage questions
  • Frequent openings, relocations and unplanned closures needing self-service admin
  • Website and app sharing one dataset, with an indexable URL per branch

Hold off

  • One to three shops: a Maps Embed (listed by Google as an unlimited free SKU) is enough
  • Online-only businesses, or a store list that changes less than once a year
  • Master data not yet cleaned: inconsistent addresses, missing coordinates, hours as free text
  • Budget under NT$30,000: ship a static branch list now, layer the map on later

Four mapping providers, honestly compared

OptionFree tierOverageTrade-off
Google Maps Platform10,000 map loads and 10,000 geocodes per month, but Nearby Search Pro only 5,000$7/1K loads, $5/1K geocoding, $32/1K Nearby Search ProBest address and POI coverage, but rates vary wildly by SKU
Mapbox50,000 web map loads and 100,000 Temporary Geocoding requests per monthLoads from $5/1K stepping to $2.50, geocoding $0.75/1KGreat custom styling, thinner POI density in some markets
MapTiler CloudFree plan: 5,000 sessions and 1,000 search sessions per month (non-commercial)Flex $30/month with 25,000 sessions, extra at $2.50/1KBest for tight budgets, but commercial use requires a paid plan
Self-hosted OSM + NominatimNo API feesServers estimated at NT$4,000–8,000/monthFull data residency, heavy ops burden

The question is not who is cheapest but whether traffic crosses the free tier. One hard constraint: the public nominatim.openstreetmap.org endpoint is capped at an absolute maximum of one request per second under the OSMF usage policy, which also forbids autocomplete and systematic queries. It is not a production backend.

The build, stage by stage

  • Stage 1 — Data governance (3–5 days): assemble the master file with branch name, address, coordinates, phone, weekly hours and exception closures. Deliverable: master CSV template and field dictionary. Tools: Google Sheets, Notion.
  • Stage 2 — Batch geocoding (2 days): run Geocoding via a Laravel Artisan command, write results into a POINT column, review low-confidence matches by hand. Deliverable: coordinate completion report. Tools: Google Geocoding API (first 10,000 calls free).
  • Stage 3 — Backend queries (5–7 days): MySQL 8 POINT column with a SPATIAL INDEX, bounding-box prefilter then ST_Distance_Sphere ordering; open-now logic in the Asia/Taipei timezone covering past-midnight shifts; all third-party calls behind a cached server-side proxy. Deliverable: nearby endpoint. Tools: Laravel, Redis, Scribe.
  • Stage 4 — Frontend and fallbacks (5–8 days): map-and-list two-column layout on web, google_maps_flutter or flutter_map on mobile, navigation handed to the native map app via Maps URLs deep links. Deliverable: prototype and acceptance checklist. Tools: Figma, Cloudflare.

What it actually costs

  • ScriptWalker Store Locator Module from NT$45,000: map and list, nearest-N, open-now filter, admin import
  • Geofence polygon editor from NT$35,000; Flutter app map screen from NT$30,000
  • Hidden cost 1 — provider subscription: Google's Starter plan is US$100/month for 50,000 combined calls, about NT$3,200
  • Hidden cost 2 — data upkeep: 1–2 hours a month maintaining hours and closures
  • Hidden cost 3 — self-hosting: estimated NT$4,000–8,000/month plus refresh labour
  • Hidden cost 4 — monitoring: Cloudflare rate limits, UptimeRobot and budget alerts, roughly 4 hours to configure

Expectation vs reality

  • Expected: addresses go in, coordinates come out. Reality: address conventions vary enough that 3–6 of 38 branches need manual correction.
  • Expected: showing a map is one line item. Reality: map loads, place search, geocoding and routing are four separate SKUs with separate quotas and rates.
  • Expected: hours are one field and a circle is a delivery zone. Reality: you need lunch gaps, past-midnight shifts and typhoon closures, and a 3 km radius can cross a bridgeless river.

Six traps and how to dodge them

  • Unrestricted API keys: a leaked frontend key gets abused fast. Fix: restrict web keys by HTTP referrer, Android by signature, iOS by bundle ID, and set daily quota caps in the Cloud Console.
  • A search call on every map drag: fix by querying your own database, calling the third-party API only when necessary, and adding a 300–500 ms debounce.
  • Treating public Nominatim as production: fix by self-hosting or moving to a commercial provider, and cache either way.
  • No degraded mode: quota exhaustion leaves a blank page. Fix: fall back to a static map image when the map fails.
  • Rolling your own routing: fix by deep-linking navigation to the native map app. Only multi-stop dispatch justifies a Routes API or self-hosted OSRM.
  • No budget alert: fix by setting a Cloud Billing budget with 50%, 80% and 100% notifications, and reviewing SKUs weekly.

Metrics and the 90-day roadmap

  • Day 30: track API calls per session, map load success rate and search-to-store-view conversion; target fewer than three search calls per user.
  • Day 60: compare organic impressions per branch page against navigation clicks; find high-demand areas with no branch coverage.
  • Day 90: calculate mapping cost per 1,000 sessions and choose pay-as-you-go or a subscription; replace circular zones with polygons and backtest rejected orders.

Decision checklist

  • ☐ More than 10 locations
  • ☐ Complete master file with addresses ready for batch geocoding
  • ☐ Users genuinely need "nearest to me"
  • ☐ Open-now logic or a delivery geofence is required
  • ☐ Website and app share one store dataset
  • ☐ Monthly map load and search volume can be estimated
  • ☐ API key restrictions and quota caps decided
  • ☐ Budget alerts configured with a named owner
  • ☐ Degraded mode designed and someone owns monthly upkeep
  • ☐ Each branch needs its own URL for local SEO

FAQ

Do we have to use Google Maps?

No. If you only need your own pins and the nearest few branches, the Mapbox or MapTiler free tiers usually cover it. A common hybrid: base map from MapTiler, address lookup from Google Geocoding.

Is the US$200 monthly credit still available?

No. In March 2025 Google replaced the flat credit with per-SKU free caps: 10,000 calls a month for Essentials, 5,000 for Pro, 1,000 for Enterprise. See the official pricing overview. Mixed-SKU builds need a line-by-line estimate.

How long until launch?

With clean data, about three weeks for the web version and five to six weeks including a Flutter app and geofencing. The usual delay is not engineering but correcting hours and addresses.

What happens when quota runs out or the service goes down?

Serve the store list from your own API and local cache, swap the map for a static map image (first 10,000 calls free, then US$2 per 1,000) or address cards, and keep the navigation button working via deep link.

Next step

Send us three numbers — how many branches, monthly visitors, and whether you need delivery areas — and we return a two-option provider comparison with cost estimates and a schedule. The Store Locator Module starts at NT$45,000 and includes a first-month API call audit.

Share: