US county income-migration intelligence (IRS SOI, annual)
Annual US county income-migration panel, 2018-2019 onward: IRS Statistics of Income county-to-county migration files (keyless), reduced to verified per-county totals with fail-loud accounting identities. Net AGI flow (inflow minus outflow, $1,000s), mean arriving vs departing household income and the arrival premium, migration turnover, net income per resident return, a documented 0-100 income-migration heat score with tiers, and a methodology-break flag on the 2022-2023 enhanced-matching vintage. One row per county x tax-year pair (~14k rows, 5 vintages); suppressed micro-counties are dropped and counted, never imputed. Sibling dataset `us_county_migration_annual` covers the 2022-2023 vintage only; this panel spans five vintages (2018-2019 through 2022-2023) with additional intelligence: the heat score, tiers, turnover, and the methodology-break flag. Who joins this: online shops join county_fips + year to test whether net income migration leads local demand; subscription businesses use the tier and arrival premium as geo features for churn/expansion models; sales teams weight territories by the heat score.
- Rows
- 13,631
- Columns
- 28
- Source cadence
- Yearly
- Last refreshed
- Oct 1, 2026
- Theme
- demographics
| Column | Type | Description |
|---|---|---|
| year_pair | string | Tax-year pair of the migration flow, 'YYYY-YYYY' (filing year 2 minus filing year 1); vintage join key. (unit: year range) |
| filing_year | integer | Second tax year of the pair (the year the returns were filed); the vintage's reference year. (unit: year) |
| county_fips | string | 5-digit county FIPS code (2-digit state + 3-digit county); geographic join key. Primary key with year_pair. (unit: FIPS) |
| county_name | string | County name as published by SOI (clean pair-row name where available). (unit: string) |
| state_abbr | string | USPS state abbreviation of the county. (unit: string) |
| state_fips | string | 2-digit state FIPS code. (unit: FIPS) |
| country | string | Country name (shared normalization layer). (unit: string) |
| country_code | string | ISO 3166-1 alpha-3 country code (USA). (unit: string) |
| in_returns | integer | Tax returns filed by households that moved INTO the county that year (SOI 'Total Migration-US and Foreign' inflow, verified by accounting identities). (unit: returns) |
| in_exemptions | integer | Personal exemptions claimed on in-migrant returns (~individuals who moved in). (unit: exemptions) |
| in_agi_k | integer | Total adjusted gross income of in-migrant households, in thousands of USD. (unit: USD 1,000s) |
| out_returns | integer | Tax returns filed by households that moved OUT of the county that year (verified outflow total). (unit: returns) |
| out_exemptions | integer | Personal exemptions claimed on out-migrant returns (~individuals who moved out). (unit: exemptions) |
| out_agi_k | integer | Total adjusted gross income of out-migrant households, in thousands of USD. (unit: USD 1,000s) |
| net_returns | integer | in_returns minus out_returns; positive = net household inflow. (unit: returns) |
| net_exemptions | integer | in_exemptions minus out_exemptions; positive = net individual inflow. (unit: exemptions) |
| net_agi_k | integer | Net AGI flow attributable to migration (in_agi_k minus out_agi_k), in thousands of USD; positive = the county gained purchasing power through migration. (unit: USD 1,000s) |
| avg_agi_per_return_in_usd | float | Mean AGI of arriving households = 1000 * in_agi_k / in_returns. Null when in_returns is 0. (unit: USD) |
| avg_agi_per_return_out_usd | float | Mean AGI of departing households = 1000 * out_agi_k / out_returns. Null when out_returns is 0. (unit: USD) |
| agi_arrival_premium_usd | float | avg_agi_per_return_in_usd minus avg_agi_per_return_out_usd; positive = arrivals are richer than leavers ('brain gain'). Null when either side is null. (unit: USD) |
| nonmigrant_returns | integer | Tax returns filed by non-migrating households in the county (the resident tax base; turnover denominator). (unit: returns) |
| migration_turnover | float | (in_returns + out_returns) / (nonmigrant_returns + in_returns + out_returns): share of the county's tax-return population that moved in or out that year. (unit: fraction 0-1) |
| net_agi_per_resident_return_usd | float | 1000 * net_agi_k / nonmigrant_returns: the migration income flow scaled by the resident tax base. (unit: USD) |
| income_migration_heat_score | float | 0-100 = 100 * Phi(z), Phi = standard normal CDF, z the robust within-vintage z-score of net_agi_per_resident_return_usd (median/MAD). 50 = neutral, ~84 = one robust deviation of income inflow. (unit: score 0-100) |
| migration_income_tier | string | Heat-score bands: strong_gain [80,100], gain [60,80), neutral [40,60), loss [20,40), strong_loss [0,20). (unit: string) |
| methodology_break | integer | 1 for the 2022-2023 vintage (SOI's enhanced return-matching process — a new series, not directly comparable to earlier vintages), else 0. (unit: 0/1) |
| source_url | string | The two SOI CSV URLs behind the vintage's rows. (unit: URL) |
| row_hash | string | Deterministic 16-hex sha256 of year_pair + county_fips + in/out returns + net_agi_k (idempotency key). (unit: string) |
First 10 sample rows — a preview, not the complete dataset.
| year_pair | filing_year | county_fips | county_name | state_abbr | state_fips | country | country_code | in_returns | in_exemptions | in_agi_k | out_returns | out_exemptions | out_agi_k | net_returns | net_exemptions | net_agi_k | avg_agi_per_return_in_usd | avg_agi_per_return_out_usd | agi_arrival_premium_usd | nonmigrant_returns | migration_turnover | net_agi_per_resident_return_usd | income_migration_heat_score | migration_income_tier | methodology_break | source_url | row_hash |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2018-2019 | 2,019 | 01001 | Autauga County | AL | 01 | United States | USA | 1,917 | 4,307 | 104,525 | 1,758 | 3,960 | 95,832 | 159 | 347 | 8,693 | 54,525.3 | 54,511.945 | 13.355 | 18,240 | 0.168 | 476.59 | 72.916 | gain | 0 | https://www.irs.gov/pub/irs-soi/countyinflow1819.csv + https://www.irs.gov/pub/irs-soi/countyoutflow1819.csv | 10b4ef4325031b0c |
| 2018-2019 | 2,019 | 01101 | Montgomery County | AL | 01 | United States | USA | 4,619 | 9,395 | 225,793 | 5,361 | 10,931 | 314,298 | -742 | -1,536 | -88,505 | 48,883.525 | 58,626.749 | -9,743.224 | 74,199 | 0.119 | -1,192.806 | 7.037 | strong_loss | 0 | https://www.irs.gov/pub/irs-soi/countyinflow1819.csv + https://www.irs.gov/pub/irs-soi/countyoutflow1819.csv | dfe539dcfe2907f6 |
| 2018-2019 | 2,019 | 01103 | Morgan County | AL | 01 | United States | USA | 2,377 | 4,856 | 117,540 | 2,305 | 4,579 | 107,664 | 72 | 277 | 9,876 | 49,448.885 | 46,708.894 | 2,739.991 | 40,630 | 0.103 | 243.072 | 62.508 | gain | 0 | https://www.irs.gov/pub/irs-soi/countyinflow1819.csv + https://www.irs.gov/pub/irs-soi/countyoutflow1819.csv | 7f402ed7e98e8470 |
| 2018-2019 | 2,019 | 01107 | Pickens County | AL | 01 | United States | USA | 243 | 486 | 8,984 | 299 | 626 | 11,540 | -56 | -140 | -2,556 | 36,971.193 | 38,595.318 | -1,624.124 | 5,806 | 0.085 | -440.234 | 29.672 | loss | 0 | https://www.irs.gov/pub/irs-soi/countyinflow1819.csv + https://www.irs.gov/pub/irs-soi/countyoutflow1819.csv | 9eff2a7cce60a420 |
| 2018-2019 | 2,019 | 01109 | Pike County | AL | 01 | United States | USA | 577 | 1,091 | 21,720 | 713 | 1,384 | 28,167 | -136 | -293 | -6,447 | 37,642.981 | 39,504.909 | -1,861.928 | 9,563 | 0.119 | -674.161 | 20.446 | loss | 0 | https://www.irs.gov/pub/irs-soi/countyinflow1819.csv + https://www.irs.gov/pub/irs-soi/countyoutflow1819.csv | db87993fefe3a3fa |
| 2018-2019 | 2,019 | 01011 | Bullock County | AL | 01 | United States | USA | 134 | 293 | 4,292 | 173 | 355 | 4,923 | -39 | -62 | -631 | 32,029.851 | 28,456.647 | 3,573.203 | 2,964 | 0.094 | -212.888 | 40.123 | neutral | 0 | https://www.irs.gov/pub/irs-soi/countyinflow1819.csv + https://www.irs.gov/pub/irs-soi/countyoutflow1819.csv | a385b3bd9ed15feb |
| 2018-2019 | 2,019 | 01111 | Randolph County | AL | 01 | United States | USA | 401 | 834 | 19,311 | 395 | 779 | 19,959 | 6 | 55 | -648 | 48,157.107 | 50,529.114 | -2,372.007 | 7,068 | 0.101 | -91.681 | 46.061 | neutral | 0 | https://www.irs.gov/pub/irs-soi/countyinflow1819.csv + https://www.irs.gov/pub/irs-soi/countyoutflow1819.csv | 1271722eb5588b28 |
| 2018-2019 | 2,019 | 01113 | Russell County | AL | 01 | United States | USA | 2,423 | 5,398 | 93,416 | 2,336 | 5,249 | 104,668 | 87 | 149 | -11,252 | 38,553.859 | 44,806.507 | -6,252.648 | 16,778 | 0.221 | -670.64 | 20.571 | loss | 0 | https://www.irs.gov/pub/irs-soi/countyinflow1819.csv + https://www.irs.gov/pub/irs-soi/countyoutflow1819.csv | 048109f2997690e9 |
| 2018-2019 | 2,019 | 01115 | St. Clair County | AL | 01 | United States | USA | 2,364 | 4,752 | 148,717 | 1,983 | 3,955 | 113,744 | 381 | 797 | 34,973 | 62,909.052 | 57,359.556 | 5,549.496 | 28,672 | 0.132 | 1,219.761 | 93.794 | strong_gain | 0 | https://www.irs.gov/pub/irs-soi/countyinflow1819.csv + https://www.irs.gov/pub/irs-soi/countyoutflow1819.csv | 525974bf077da4b1 |
| 2018-2019 | 2,019 | 01117 | Shelby County | AL | 01 | United States | USA | 6,532 | 12,688 | 451,012 | 5,811 | 10,896 | 390,813 | 721 | 1,792 | 60,199 | 69,046.54 | 67,254.001 | 1,792.539 | 72,391 | 0.146 | 831.581 | 85.389 | strong_gain | 0 | https://www.irs.gov/pub/irs-soi/countyinflow1819.csv + https://www.irs.gov/pub/irs-soi/countyoutflow1819.csv | 85fb8fade8210811 |
Profiled Oct 1, 2026 from snapshot 20261001T015444Z-66ec7dc139c4
Measured- Completeness
- 100%
- Rows
- 13,631
- Columns
- 28
- Columns with gaps
- 0
| Column | Missing | Distinct | Range | Distribution |
|---|---|---|---|---|
| year_pairvarchar | 0% | 5 | — |
|
| filing_yearbigint | 0% | 5 | 2,019 → 2,023median 2,021 | |
| county_fipsvarchar | 0% | 2,715 | — |
|
| county_namevarchar | 0% | 1,496 | — |
|
| state_abbrvarchar | 0% | 55 | — |
|
| state_fipsvarchar | 0% | 49 | — |
|
| countryvarchar | 0% | 1 | — |
|
| country_codevarchar | 0% | 1 | — |
|
| in_returnsbigint | 0% | 5,338 | 43 → 124,328median 816 | 273 outside 1st–99th percentile |
| in_exemptionsbigint | 0% | 5,875 | 56 → 182,748median 1,534 | 271 outside 1st–99th percentile |
| in_agi_kbigint | 0% | 13,966 | 1,386 → 14,786,315median 44,127 | 274 outside 1st–99th percentile |
| out_returnsbigint | 0% | 4,501 | 43 → 188,686median 775 | 273 outside 1st–99th percentile |
| out_exemptionsbigint | 0% | 5,807 | 66 → 320,983median 1,415 | 268 outside 1st–99th percentile |
| out_agi_kbigint | 0% | 11,474 | 1,466 → 24,550,778median 38,302 | 274 outside 1st–99th percentile |
| net_returnsbigint | 0% | 2,463 | -70,554 → 21,934median 18 | 274 outside 1st–99th percentile |
| net_exemptionsbigint | 0% | 3,654 | -145,543 → 40,250median 65 | 274 outside 1st–99th percentile |
| net_agi_kbigint | 0% | 12,746 | -16,473,227 → 7,035,958median 1,675 | 274 outside 1st–99th percentile |
| avg_agi_per_return_in_usddouble | 0% | 13,684 | 13,956 → 771,669median 52,599 | 274 outside 1st–99th percentile |
| avg_agi_per_return_out_usddouble | 0% | 12,861 | 14,837 → 341,681median 50,156 | 274 outside 1st–99th percentile |
| agi_arrival_premium_usddouble | 0% | 11,308 | -239,501 → 560,820median 2,057 | 274 outside 1st–99th percentile |
| nonmigrant_returnsbigint | 0% | 8,412 | 346 → 3,944,880median 11,507 | 274 outside 1st–99th percentile |
| migration_turnoverdouble | 0% | 14,253 | 0.0486 → 0.5353median 0.1229 | 274 outside 1st–99th percentile |
| net_agi_per_resident_return_usddouble | 0% | 16,872 | -25,985 → 67,100median 218.9 | 274 outside 1st–99th percentile |
| income_migration_heat_scoredouble | 0% | 12,318 | 0 → 100median 50 | 137 outside 1st–99th percentile |
| migration_income_tiervarchar | 0% | 5 | — |
|
| methodology_breakbigint | 0% | 2 | 0 → 1median 0 | |
| source_urlvarchar | 0% | 5 | — |
|
| row_hashvarchar | 0% | 12,950 | — |
|
- Current
20261001T015444Z-66ec7dc139c4 · sha256 66ec7dc139c4…
13,631 rows · first snapshot
Point any LLM at the metadata endpoint — the documentation above is machine-readable too (JSON-LD + Croissant).
curl "https://datazimuts.com/v1/datasets/irs_soi_county_income_migration_intel/us_county_income_migration_annual" | jq '{title, rows, columns_count, license}'import requests
ds = requests.get("https://datazimuts.com/v1/datasets/irs_soi_county_income_migration_intel/us_county_income_migration_annual").json()
print(ds["title"], ds["rows"], "rows")
# Sample rows for an LLM context window
for row in ds.get("sample_rows", [])[:5]:
print(row)API endpoint: https://datazimuts.com/v1/datasets/irs_soi_county_income_migration_intel/us_county_income_migration_annual
Tip: fetch /llms.txt for the full machine-readable catalog.
Where this data comes from and what was made from it. Other people's work shows as counts; only shared projects are named.
Cite this snapshot
Pinned to snapshot 20261001T015444Z-66ec7dc139c4 and its content hash, so readers get exactly the data you used.
US county income migration (IRS Statistics of Income, keyless). (2026). US county income-migration intelligence (IRS SOI, annual) [Data set, snapshot 20261001T015444Z-66ec7dc139c4, sha256 66ec7dc139c4]. Datazimuts. Retrieved 2026-10-01, from https://datazimuts.com/en/datasets/irs_soi_county_income_migration_intel/us_county_income_migration_annual?snapshot=20261001T015444Z-66ec7dc139c4
@misc{dz_irs_soi_county_income_migration_intel_us_66ec7dc1,
title = {{US county income-migration intelligence (IRS SOI, annual)}},
author = {{US county income migration (IRS Statistics of Income, keyless)}},
year = {2026},
publisher = {Datazimuts},
howpublished = {\url{https://datazimuts.com/en/datasets/irs_soi_county_income_migration_intel/us_county_income_migration_annual?snapshot=20261001T015444Z-66ec7dc139c4}},
note = {Snapshot 20261001T015444Z-66ec7dc139c4, sha256 66ec7dc139c48837d6c457c2bec1f677e22c0045d7acbfd0dbe92ba220cb134e; accessed 2026-10-01}
}Embed a table or a chart
Paste this into any page. The embed is pinned to the same snapshot, follows the reader's light or dark setting, and always shows the source, license and a link back.
<iframe src="https://datazimuts.com/embed/chart?dataset=irs_soi_county_income_migration_intel%2Fus_county_income_migration_annual&lang=en&theme=auto&snapshot=20261001T015444Z-66ec7dc139c4&x=year_pair&y=filing_year&agg=avg" title="US county income-migration intelligence (IRS SOI, annual)" width="100%" height="380" style="border:0" loading="lazy"></iframe>
Ask about this dataset. Answers come only from its catalog record, measured profile and change history, and list the facts they used.