Insights · Data Foundations

How to map ZIP codes to DMA, metro area and region: the one table to join to your orders

Sam Gil·Oct 2026·8 min
Key takeaways
1Build one master table with a row per ZIP and every geography as a column, then join it to orders on the first 5 digits of the shipping ZIP.
2State is the default in most tools and the wrong map for most decisions. 97 of the 210 Nielsen DMAs cross a state line, and New Jersey alone splits 76/24 between the New York and Philadelphia TV markets.
3Use division for trend reads, DMA for media, metro for stores and wholesale, urbanicity for shipping and product mix, and ZIP income for pricing.
4The table takes 9 files from 5 publishers. One rule keeps it consistent: pick one county per ZIP and derive every county-level field from it.

Every order already carries a ZIP code, and with one lookup table that ZIP tells you the customer's TV market, metro area, region, how urban the area is and what households there typically earn. Most brands never build that table, so geo reporting stops at state, which is the wrong map for most decisions: 97 of the 210 Nielsen TV markets (DMAs) cross a state line, and they hold about half of the US population.

The table is one row per ZIP, ~39.5k rows, with every geography as its own column, and you join it to orders on the first 5 digits of the shipping ZIP. Here's what it looks like with real rows, and the orders tab shows the join.

The master ZIP table, and the join12 of 39,484 rows
F2411fxNew York
ABCDEFGHIJKL
1zip5usps_citystateregiondivisiondmametro_cbsaurbanicitymedian_hh_incomepopulationcounty_namemetro_type
60502139CambridgeMANortheastNew EnglandBoston (Manchester)Boston-Cambridge-Newton, MA-NHUrban Core134,58640,033Middlesex CountyMetropolitan
148104609Bar HarborMENortheastNew EnglandBangorRural / Remote77,1805244Hancock CountyOutside CBSA
241107030HobokenNJNortheastMiddle AtlanticNew YorkNew York-Newark-Jersey City, NY-NJUrban Core180,57958,668Hudson CountyMetropolitan
293808540PrincetonNJNortheastMiddle AtlanticPhiladelphiaTrenton-Princeton, NJUrban Core176,98350,388Mercer CountyMetropolitan
341611201BrooklynNYNortheastMiddle AtlanticNew YorkNew York-Newark-Jersey City, NY-NJUrban Core173,13670,674Kings CountyMetropolitan
1562438930GreenwoodMSSouthEast South CentralGreenwood-GreenvilleGreenwood, MSSmall City35,45322,700Leflore CountyMicropolitan
2415259715BozemanMTWestMountainButte-BozemanBozeman, MTUrban Core88,40739,643Gallatin CountyMetropolitan
2460760614ChicagoILMidwestEast North CentralChicagoChicago-Naperville-Elgin, IL-INUrban Core136,44870,693Cook CountyMetropolitan
2703966208Prairie VillageKSMidwestWest North CentralKansas CityKansas City, MO-KSUrban Core124,00021,576Johnson CountyMetropolitan
3230578701AustinTXSouthWest South CentralAustinAustin-Round Rock-San Marcos, TXUrban Core162,16811,824Travis CountyMetropolitan
3555490210Beverly HillsCAWestPacificLos AngelesLos Angeles-Long Beach-Anaheim, CAUrban Core187,80119,004Los Angeles CountyMetropolitan
3896198661VancouverWAWestPacificPortland, ORPortland-Vancouver-Hillsboro, OR-WAUrban Core76,91350,743Clark CountyMetropolitan
+≡click orders to see the join
One row per ZIP, every geography as its own column. Hoboken and Princeton are both New Jersey, but one sits in the New York TV market and the other in Philadelphia’s, and Vancouver, WA is part of Portland’s. Real rows from public sources (HUD, Census/OMB, USDA, ACS 2020-2024) plus a licensed Nielsen DMA list.

What each column lets you decide

State answers tax and shipping-rule questions, and for most other decisions a different column does the job. Reading the wrong one doesn't just make a messier chart, it leads to a different call: cutting spend in a "weak state" that is really two healthy TV markets, or picking a store location from raw order counts that mostly track where people live.

What each column lets you decide
division
9 lines, not 51
The 10 biggest states hold 54% of Americans, so a state chart mostly ranks population. Census divisions group states into 9 areas, enough to see a regional shift without a spaghetti chart.
54% 10 largest states46% other 41
Decides: Which part of the country is actually slowing, before you cut spend there
dma
New Jersey is 2 TV markets
76% of New Jerseyans are in the New York DMA and 24% in Philadelphia's. 97 of the 210 DMAs cross a state line, and they hold ~50% of Americans.
76% New York DMA24% Philadelphia DMA
Decides: Where to buy TV, CTV and local media, and which markets to hold out in a test
metro_cbsa
86% live in 387 metros
Metros follow commuting, which is closer to how people shop in person than state lines are. The largest 25 hold 42% of Americans.
Decides: Where to open a store, add wholesale doors or run a pop-up, judged on orders per 1k people
urbanicity
26% of ZIPs, 5% of people
Rural ZIPs cover huge areas with few people, so any map or count by ZIP over-weights them ~5x.
share of ZIPs26%
share of people5%
Decides: Delivery promises, shipping thresholds and product mix by area type
median_hh_income
$24k to $250k+ in one metro
Across the New York metro's ZIPs, median household income runs from ~$24k to the ACS cap of $250k+. The middle 80% spans ~$68k to ~$203k, so a metro or state average hides most of it.
$24k$68k$123k median$203k$250k+
Decides: Price tiers, premium lines and how deep to discount, by area
Computed from ACS 5-year 2020-2024 ZIP population (50 states + DC) rolled up through the HUD ZIP-County crosswalk, OMB July 2023 metro definitions, USDA RUCA 2020 (rural = RUCA 10) and a Nielsen DMA list.

A quick worked example of why the DMA column matters. The New York DMA holds ~6.5% of the US population. If 12% of a brand's orders come from it, its index is ~185 (12 / 6.5), so it over-indexes heavily and that's a TV or CTV conversation about one market. The same orders on a state view get split across New York, New Jersey and Connecticut, and the New Jersey row gets blended with Philadelphia's, so most of the signal washes out (the 12% is illustrative, the population share is real).

The population column is what makes any of these comparable. Raw order counts mostly track where people live, so compare orders per 1k people, or each area's share of orders against its share of population, before deciding a region, market or metro is strong or weak.

Why most brands don't have this table

Because there isn't one file. It takes 9 files from 5 publishers, joined on 3 different keys, and most of the joins are many-to-many. HUD publishes which counties each ZIP falls in, Census and OMB publish which counties make up each metro, USDA and CDC each publish an urban/rural code, Census publishes population, income and land area for ZIP approximations called ZCTAs, and Nielsen licenses the DMA list. Each one updates on its own schedule.

9 files, 5 publishers, 3 join keys
FieldSourceJoin onWhere it breaks
County, USPS city & stateHUD-USPS ZIP-County crosswalk (free login, quarterly)ZIP~29% of ZIPs touch 2+ counties, so the file has ~54.6k rows for ~39.5k ZIPs. Pick one county per ZIP.
Metro (CBSA), CSA, metro divisionOMB / Census delineation, July 2023County FIPSOne row per county, so a lookup by metro code returns whichever county is listed first.
Census region & divisionCensus definitions (fixed since 1984)StateCovers 50 states + DC only. Territories need a label of your own.
Urban / rural, ZIP levelUSDA RUCA 2020ZIP10 codes. Group them into labels a marketer can read.
Urban / rural, county levelNCHS 2023 or USDA RUCC 2023County FIPSDifferent definition from RUCA, so pick one per question.
Lat / long, land areaCensus Gazetteer (ZCTA)ZIP = ZCTA~15% of ZIPs (PO boxes, single businesses) have no ZCTA.
Population, median incomeACS 5-year, B01003 / B19013ZIP = ZCTASuppressed values are large negatives, and 250,001 means 250k+.
DMANielsen (licensed)ZIPNo free official source. Rural Alaska and Puerto Rico sit outside any DMA.
Publishers: HUD, Census/OMB, USDA, CDC/NCHS, Nielsen. The highlighted row is the one that most often goes quietly wrong. The rule that keeps the table consistent is to pick one county per ZIP (highest share of residential addresses, ties broken on total addresses) and derive every county-level field from it.

The underlying problem is that ZIP codes are mail routes, not areas, so they don't nest inside anything. ~29% of ZIPs touch more than one county (~31% of the population lives in one), so HUD's crosswalk has ~54.6k rows for ~39.5k ZIPs. ~15% of ZIPs have no ZCTA at all, mostly PO boxes and single-business ZIPs, so Census has no population or income for them. Census switched Connecticut from counties to planning regions in 2022, so any older county list fails to join for the whole state. Each of these produces a table that looks complete and is quietly wrong somewhere, which is why most brands either don't have one or have one nobody fully trusts.

The rule that keeps it consistent

Pick one county per ZIP, and derive everything county-level from that county. HUD gives the share of each ZIP's residential addresses in each county, so take the county with the largest share and break ties on total addresses (business-only ZIPs have 0 residential addresses everywhere, so without a tie-break the pick is arbitrary). Then look up the metro, combined area, urban/rural code and county name from that one county.

That way the table always rolls up, ZIP to county to metro, and a ZIP can never sit in a county that belongs to a different metro than the one in its metro column. It loses a little for split ZIPs, but less than you'd expect, since only ~7% of ZIPs have no county holding 80%+ of their residential addresses. If an analysis is sensitive to those, allocate their orders across counties using the HUD ratios.

What to do about it

  1. Build the master table once, as a governed dimension in your warehouse, with one row per ZIP and every geography as a column, so nobody rebuilds the joins for each analysis.

  2. Clean the shipping ZIP before joining: first 5 characters, stored as text, leading zeros kept. Checkout data carries ZIP+4, stray spaces and the odd Canadian postal code, and spreadsheets drop the zero from New Jersey and New England ZIPs.

  3. Pick one county per ZIP and derive the rest from it, with the tie-break on total addresses.

  4. Key state, region and division on the USPS mailing state, since that's what customers type at checkout, and keep the county's state as its own column for the ~20 ZIPs where they differ.

  5. Give each decision its column: division for trend reads, DMA for media and test markets, metro for stores and wholesale, urbanicity for shipping and product mix, income for pricing, and state for tax and compliance.

  6. Test it before trusting it. 11201 should come back as Kings County, New York, in the New York-Newark-Jersey City metro and the New York DMA, and 90210 as Los Angeles County. Assert one row per ZIP, and that every ZIP's county is a member of its metro.

  7. Refresh on a calendar: HUD quarterly or annually, ACS each December, metro definitions when OMB revises them (the current set is July 2023).

If you'd rather have this built, tested and refreshed inside your own warehouse, it's usually a 1-2 week piece of work for us. Happy to walk through how we'd approach it for your setup.

Common questions

How do I map ZIP codes to DMA?

Nielsen owns the DMA definitions and licenses its ZIP-to-DMA list, so there's no free official file. Most brands get it through Nielsen directly, a media agency, or a data vendor that resells it. The free ZIP-to-DMA files online are usually old Nielsen extracts, so check the license before using one commercially. Join on the 5-digit ZIP stored as text, and expect rural Alaska and Puerto Rico to have no DMA.

What's the difference between a DMA and an MSA or CBSA?

A DMA is a TV market, defined by Nielsen from which stations people watch, and there are 210 of them. A CBSA (the umbrella term for Metropolitan and Micropolitan Statistical Areas, so an MSA is a type of CBSA) is defined by OMB from commuting patterns between counties, and there are ~925 in the 50 states and DC. Use DMA for media and CBSA for anything physical, like stores, wholesale and delivery.

Where can I get a free ZIP to county crosswalk?

HUD publishes the HUD-USPS ZIP Code Crosswalk Files quarterly. They're free, and you just need a HUD User account to download them (or a free API token). The ZIP-County file gives the share of each ZIP's residential, business and total addresses in each county, which is what you need to pick one county per ZIP.

Why is my county or state name wrong for lots of ZIPs, mostly in big metros?

Usually a field was looked up with a key that matches many rows. For example, a county name looked up by metro code from a file with one row per county returns whichever county is listed first in that metro. VLOOKUP, INDEX/MATCH and XLOOKUP all return the first match without a warning, and so does a SQL join someone "fixed" with LIMIT 1 or MIN(). Look up each field with the key at its own grain, so county fields come from county FIPS and metro fields from the metro code.

Why did revenue go up after I joined in geography?

You probably joined HUD's crosswalk straight onto orders. It has one row per ZIP-county pair, ~54.6k rows for ~39.5k ZIPs, so every order from the ~29% of ZIPs that touch more than one county gets duplicated. Reduce it to one row per ZIP before joining (or allocate across counties on purpose, using the ratios), and compare row counts and revenue before and after any geo join.

Why aren't my New Jersey or New England ZIPs joining?

Leading zeros. ~8% of US ZIPs start with 0, covering all of New Jersey, New England and Puerto Rico, and Excel or a CSV import turns 02139 into 2139. Store ZIPs as 5-character text everywhere, and clean order ZIPs to the first 5 digits.

Why are all my Connecticut ZIPs blank?

In 2022 the Census Bureau switched Connecticut from its 8 old counties to 9 planning regions as official county equivalents (FIPS 09110 to 09190). Current HUD, Census and USDA files all use the new codes, so a county list from before then fails to join for the whole state. Keep every source on the same county vintage.

Why does my lookup return a plausible but wrong value, only for some rows?

Usually an approximate match. MATCH without a final 0 and VLOOKUP without FALSE default to approximate matching, which only works on a sorted lookup column and otherwise returns a nearby row with no error. It can also work by luck until a refresh changes the sort order. Always use exact match for geo lookups.

Why do some ZIPs have no population, income or lat/long?

They have no ZCTA, which is true for ~15% of ZIPs, mostly PO boxes and single-business ZIPs. Census reports population, income and coordinates for ZCTAs, so those ZIPs have nothing to join to. That's expected, so fall back to county or metro figures for them rather than dropping their orders. Also watch for ACS income values of 250,001, which means "250k or more", and large negative numbers, which mean the value was suppressed.

Why does a DC ZIP show up in Virginia?

HUD maps some federal ZIPs, like the Pentagon's, to the county where the building physically sits, so the USPS mailing state and the county's state disagree for ~20 ZIPs. Decide which one your state column means (we use the mailing state, since it matches the shipping address) and keep the other as its own column.

Which urban/rural definition should I use?

USDA's RUCA codes (by ZIP, based on commuting) describe a customer's immediate area, and the NCHS scheme (by county, based on metro size) describes the market around them. They give very different answers, ~74% of Americans in "Urban Core" ZIPs against ~31% in "Large central metro" counties, so pick the one that fits the question and label which one a chart uses.

We build and maintain governed dimensions like this inside your own warehouse, so every report, dashboard and AI answer cuts geography the same way.

See how it works →
Technical notes

Master rows and all population figures come from ACS 5-year 2020-2024 (tables B01003 and B19013) at ZCTA level, joined to ZIPs, counties, metros and DMAs through the HUD-USPS ZIP-County crosswalk for Q2 2026; national shares cover 50 states + DC (~335M people), and ZIPs with no ZCTA carry no population. Metro areas are the OMB July 2023 delineations, urban/rural is USDA ERS RUCA 2020 (rural = RUCA 10), and DMA assignments come from a licensed Nielsen ZIP list. Orders and revenue in the orders tab are illustrative.

SG
Sam Gil
Principal, Growth & Analytics · Meridian Growth
About the team →

Keep reading

Measurement & AttributionOct 2026 · 6 min
Why media affiliates look like your best channel, and the 30-minute test that cut one brand's commission by ~$500k
Read →
Data FoundationsOct 2026 · 8 min
How to map ZIP codes to DMA, metro area and region: the one table to join to your orders
Read →
Measurement & AttributionSep 2026 · 7 min
Why your year-over-year sales look terrible the week before a holiday
Read →
ExperimentationSep 2026 · 6 min
How long to run an ecom A/B test
Read →
ExperimentationSep 2025 · 6 min
Why Most Startup Experiments Fail (and What to Do Instead)
Read →
Retention & LifecycleSep 2025 · 5 min
Retention in Marketplaces: Why Liquidity Beats Variety Alone
Read →
Acquisition & CreativeSep 2025 · 5 min
Why First-Party Pixels Beat GA4 for User Journeys
Read →
Data FoundationsSep 2025 · 5 min
Why creative tagging fails, and what a working ontology looks like
Read →

Get in touch.

Tell us what you are trying to figure out. If we can help, we will say how. If we are not the right fit, we will say that too, and point you somewhere better.

01
Free work first
We start by doing a real piece of work on your data, free, so the first thing you judge is output, not a pitch.
02
First build, fixed scope
A trusted core metric layer in weeks, not quarters, at a fixed price. Small enough to be safe, real enough to matter.
03
Scale when it earns it
Month to month from there, from a few thousand a month. You own every model, dashboard and definition.