Skip to main content

Migrating One Endpoint from Google Maps

Problem: We geocode 400,000 addresses a month against Google. Move it to HERE without breaking anything.
Optimize on Google first. Cache, deduplicate, debounce. Re-measure.A meaningful share of teams find the bill halves without a vendor change. What remains is your real migration case — and now you have a clean baseline.Migrating an uncached implementation moves the waste to a cheaper meter. You will save money and still be wrong.

Why geocoding first

Six surfaces, migrated in order. Never two at once. Smallest blast radius, largest saving. Start here.

Step 1 — the facade, shipped against Google

Introduce it before HERE exists in the codebase.
This is where migrations fail. If your Google implementation had no notion of a road-network access point, an interface derived from it has no field for one.Design from the richer capability set.

Step 2 — the two adapters, side by side

Step 3 — request mapping

Step 4 — semantic differences that return 200

These are the ones that survive code review. Failure is signalled differently. Google returns HTTP 200 with status: "ZERO_RESULTS". HERE returns HTTP 200 with items: []. Neither raises. Country codes. Google: ISO 3166-1 alpha-2 (US). HERE: alpha-3 (USA). A naive port silently filters to nothing. Two coordinates per result. HERE returns position (the address) and access (where a vehicle arrives). Google returns one. Route to access. Routing to position may target the geometric centre of a building, or a point separated from the road by a car park. Confidence is not comparable.
queryScore: 0.9 does not mean what partial_match: false means.Do not port your threshold. Recalibrate against your own ground truth before cutover. Plot correctness against queryScore and find your own knee.
fieldScore has no Google equivalent. queryScore: 0.95 with fieldScore.houseNumber: 0.4 matched the street confidently and the house number badly. That is a failed delivery. fieldScore.postalCode: 0.8 is not. A single aggregate number cannot express this. Batch is a job lifecycle. Create → start → poll → fetch errors → fetch results → delete. 429 on start = concurrency limit, queue it. 204 on /errors = zero errors, not a failure. 404 on /result = not ready yet. 403401. 401 is a bad key. 403 is a valid key without entitlement. Retrying 403 is patient, well-engineered, and permanently futile.

Step 5 — shadow write

The flag is per endpoint, not per user.A percentage rollout across a geocoder gives you two populations with different data quality and no way to attribute an incident. A rollback should be one flag and one surface.

Step 6 — compare against ground truth, not against each other

Two wrong answers can agree.
Report the distribution, not the mean. p99 is where failed deliveries live.And measure confidence calibration: among results the platform scored above 0.9, what fraction were actually correct? A geocoder with a lower match rate and well-calibrated confidence is more useful — it lets you route uncertain records to an exception queue. Poorly calibrated confidence silently corrupts your database.

Step 7 — rollback, tested before you need it

A migration you cannot reverse is not a migration. It is a bet.Flip it in production, on a Tuesday, deliberately. Verify traffic moves. Flip it back. An untested rollback is a hypothesis.
Store provider-specific IDs in nullable side columns. If cutting over wrote a here_id onto a core record, rollback must not require unwinding it. Keep both live for one full business cycle. Two invoices for a month is cheaper than one incident. You are not testing the happy path — you are waiting for the edge case that only occurs on the last Friday of the month.

Common mistakes

Migrating before optimizing. Designing the facade from Google’s capabilities. Truck constraints and access points have nowhere to live. Porting the confidence threshold. Country code alpha-2 → alpha-3. Silent empty results. Comparing providers against each other. Comparing means, not distributions. Shadow calls on the response path. Percentage rollout by user. Migrating two surfaces at once. Ambiguous root cause on the first incident. Untested rollback. Retrying 403. Treating Batch API as a bulk endpoint. Revoking the old keys before a full business cycle completes. Presenting savings without migration engineering cost. Your CFO will ask.

Google Migration Architecture

Dual-running, shadow comparison, rollback mechanics.

Reducing Google Maps Costs

Optimize first. You may not need to migrate.

HERE Geocoding vs Google Maps

Where each genuinely wins, and how to benchmark.

Batch Address Cleanup

The one-million-address backfill.

HERE documentation


Need production HERE API keys or implementation support? Placematic is an official HERE Technologies reseller and implementation partner. Talk to us.