Overtaxed makes an estimate from public records. It is not tax or legal advice. Everything below is transparent so you can check our work.
We measure $466,563,956/yr of regressive over-assessment in Cook County, live over real parcels. Scaling that by owner-occupied homes (Cook's ~1.9M residential parcels vs ~86M US owner-occupied homes) gives an order-of-magnitude US figure of ~$21.1B a year. This is a transparent projection, not a measurement, but it isn't a guess: independent national studies find the sameregressive assessment pattern across most US jurisdictions (Avenancio-León & Howard, The Assessment Gap, QJE 2022, ~118M homes; C. Berry, Reassessing the Property Tax, Univ. of Chicago). The UK figure is ~400Kwidely-reported mis-banded homes × a typical one-band annual error.
The point: Cook County is one instance of a national, systemic bias, and the exact same pipeline already generalises (we added Allegheny County and the UK with no code changes).
geoDistance().Nothing here is mocked. These are the real queries behind the answers. ClickHouse is the primary database; every figure is computed live over millions of rows.
-- IAAO uniformity metrics (PRD, COD) over every sold parcel
WITH ratios AS (
SELECT a.assessed_value / ls.sp AS ratio,
a.assessed_value AS av, ls.sp AS sp
FROM overtaxed.assessments a
INNER JOIN ( -- latest_sales MV (AggregatingMergeTree)
SELECT pin, argMaxMerge(sp) AS sp
FROM overtaxed.latest_sales GROUP BY pin
) ls USING (pin)
WHERE a.region = 'Cook County'
AND a.assessed_value / ls.sp BETWEEN 0.2 AND 3.0
)
SELECT count() AS n,
round(avg(ratio) / (sum(av)/sum(sp)), 4) AS prd, -- Price-Related Differential
round(100 * avg(abs(ratio - m)) / m, 2) AS cod -- Coefficient of Dispersion
FROM ratios
CROSS JOIN (SELECT quantileExact(0.5)(ratio) AS m FROM ratios);-- The Tax Divide: 1.6M parcels -> ~1,800 map cells in one pass
SELECT round(lat, 2) AS lat, round(lng, 2) AS lng,
count() AS n,
avg(a.assessed_value / ls.sp) AS ratio
FROM overtaxed.parcels p
INNER JOIN overtaxed.assessments a ON a.pin = p.pin
INNER JOIN (
SELECT pin, argMaxMerge(sp) AS sp FROM overtaxed.latest_sales GROUP BY pin
) ls ON ls.pin = p.pin
WHERE a.region = 'Cook County'
GROUP BY lat, lng
HAVING n >= 8;-- One query across Postgres (OLTP) + ClickHouse (OLAP)
SELECT s.address, a.assessed_value, ls.sp AS last_sale
FROM postgresql('<pg-host>:5432', 'overtaxed', 'saved_properties', ...) AS s
LEFT JOIN overtaxed.assessments a ON a.pin = s.pin
LEFT JOIN (
SELECT pin, argMax(sale_price, sale_date) AS sp
FROM overtaxed.sales GROUP BY pin
) ls ON ls.pin = s.pin;-- Zero-ETL: ClickHouse reads the gov CSV straight off HTTP
INSERT INTO overtaxed.sales
SELECT ... FROM url(
'https://.../pp-complete.csv', 'CSVWithNames'
);These few values are external inputs (not derivable from sales data). They live in one place, lib/assumptions.ts, each cited: