What Geocoding a Million Addresses Actually Costs
9 min read · updated August 11, 2026
There is no single answer to this, and any page that gives you one without showing its inputs is guessing. What is durable is the arithmetic: four numbers, three of which you can measure on your own data before you buy anything.
What you are actually billed for
Commercial geocoders bill per request, and the distinctions in that sentence are where budgets go wrong. A request that returns no match is usually still a request. Forward geocoding (string to coordinate) and reverse geocoding (coordinate to string) are commonly separate SKUs at different prices. Address autocomplete is often billed per session — a burst of keystrokes charged once — but only if you pass the session token correctly, and forgetting it converts one session into eight billed requests. Batch endpoints exist and are sometimes cheaper per record than the interactive one.
So the first thing to establish is not the price. It is the number of requests your process will actually emit, which is almost never the number of rows in the file.
Three further multipliers hide in ordinary engineering practice. A retry on timeout is a second billed request for one address. A test suite that runs against the live endpoint bills every run. And a job that fails at row 700,000 and is restarted from the top pays twice for the first 700,000 — which is an argument for writing results to durable storage as they arrive and making the job resumable, not merely an argument about tidiness. Put a hard request counter and a daily cap in the client itself, because the provider’s quota alarm arrives after the money is spent.
The derivation
Four inputs, all of them assumptions, all of them stated so you can substitute your own. The arithmetic is the part worth keeping; the numbers are illustrative.
INPUTS (assumptions) A raw address rows 1,000,000 B duplicate rate after normalising 18% C price per 1,000 forward geocodes $5.00 <- assumed, not quoted D annual churn (new + changed) 5% per month E unmatched rate needing a 2nd pass 3% INITIAL LOAD unique addresses = A * (1 - B) = 1,000,000 * 0.82 = 820,000 billed units = 820,000 / 1,000 = 820 initial cost = 820 * $5.00 = $4,100 without deduplication: 1,000 * $5.00 = $5,000 saving from normalise-and-dedupe = $900 SECOND-PASS FALLBACK unmatched = 820,000 * 0.03 = 24,600 at $4.00 / 1,000 = 24.6 * $4.00 = $98 STEADY STATE monthly new/changed = 820,000 * 0.05 = 41,000 monthly cost = 41 * $5.00 = $205 annual = 12 * $205 = $2,460 FIRST-YEAR TOTAL $4,100 + $98 + $2,460 = $6,658
C and the $4.00 fallback price are assumptions used to make the arithmetic concrete, not quotes. Published per-thousand rates for commercial geocoding vary by more than an order of magnitude between providers and tiers, and they change. Put your own provider’s current figure into the same three lines; the structure does not move.Where the deduplication rate comes from
The 18% is doing more work in that sum than the price is, and it is the one input you can measure for free. Duplicates are rarely byte-identical: “12 High St.”, “12 High Street” and “12 HIGH STREET, Apt 3” are one geocodable building. Exact-string deduplication finds a fraction of them; normalising first — case folding, expanding street-type abbreviations, separating the unit designator from the street address — finds most of the rest, which is the subject of address normalisation.
The unit designator is the single biggest lever in a consumer dataset. A 200-flat apartment block is 200 rows and one geocodable street address, so a dataset with a lot of multi-occupancy housing can deduplicate far above 18% — provided you actually want building-level results, which is a geocoding accuracy decision, not a cost one. Measure the ratio on a sample of ten thousand rows before committing to a plan tier.
The clause that can delete your cache
Every number above after the initial load assumes you may store the coordinates you paid for. Several major commercial geocoding terms restrict exactly that: caching may be limited to a fixed period, or permitted only for use alongside that provider’s own map tiles, or forbidden outright for the purpose of building a competing dataset.
If storage is capped at 30 days, the steady-state line does not read “41,000 requests a month”. It reads “820,000 requests a month”, and the annual cost goes from $2,460 to $49,200 — twenty times larger, from a licence clause rather than from a price. That is why this section exists and why it belongs above the self-hosting comparison. Read the terms before the price sheet.
Self-hosting and its break-even
The open alternative is running your own geocoder over OpenStreetMap data — Nominatim or Pelias, with libpostal for parsing. There is no per-request price, so the comparison is entirely capital and operating cost against the derived figure above.
SELF-HOSTED (assumptions) server able to hold a planet import $250 / month -> $3,000 / yr one-off import + tuning effort several engineer-days ongoing: weekly diff updates, monitoring vs derived hosted first-year total $6,658 vs derived hosted year-two total $2,460
So it breaks even in year one and loses in year two, unless the caching clause above applies — in which case it wins immediately and by a wide margin. Volume is the other switch: at ten million addresses the hosted bill scales linearly and the server does not.
What you give up is match quality, particularly on messy input, non-address place names, and countries where OpenStreetMap address coverage is thin. Do not treat that as a footnote: a geocoder that matches 84% of your addresses instead of 96% costs you 120,000 manual resolutions, and at any plausible labour rate that dwarfs the software bill.
One thing not to do: point a bulk job at the free public Nominatim instance. The OpenStreetMap Foundation’s Nominatim usage policy caps use at an absolute maximum of one request per second and explicitly excludes bulk geocoding. It is a volunteer-funded service, and treating it as free infrastructure gets your addresses blocked and is unfair besides.
Which input actually moves the total
Vary each input alone and the ranking is clear.
baseline first-year total $6,658 price C $5.00 -> $0.50 per 1,000 first year: $ 871 (-87%) dedupe B 18% -> 40% first year: $5,196 (-22%) unmatched E 3% -> 15% first year: $7,150 (+ 7%) caching capped at 30 days first year: $53,398 (+702%)
The order of operations follows: read the terms, then negotiate the rate, then invest in normalisation, and only then worry about the match-failure fallback. Most teams do it in exactly the reverse order.
One caveat about the price column. Per-thousand rates are usually tiered, so the marginal price at the 820,000th request is not the headline price at the first, and a large one-off import can sit in a cheaper band than the steady-state trickle that follows it. That asymmetry occasionally reverses the self-hosting decision: a bulk import is the cheapest thing to buy and the most expensive thing to build, while the ongoing trickle is the reverse. If the numbers are close, the hybrid is legitimate — buy the initial load, then run your own instance for incremental addresses — provided the licence permits keeping what you bought, which returns you to the section above.