Skip to content

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.

Licence terms are provider-specific and are revised. Nothing here is legal advice; read the current terms of the provider you intend to use, and if the answer is commercially material, have somebody qualified read them too.

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.