Methodology

How every number on the map is computed, what it is anchored to, and where the data is thin. Nothing here is modelled or generated; each figure is a LandPortal market-research value, a count, a ratio or a median over the data that matches your filters.

LandPortal layer · trailing 12 months

The default statistic, LP Absorption Rate, and the other “LandPortal” statistics come from LandPortal’s market-research drill (status = sold, 365-day window) for counties, ZIPs and states, loaded from an internal snapshot. They are closed-sale figures. Internal use only.

Loading the LandPortal layer…

County recorded sales · 3 counties, 5–640 ac, 12 complete months

A second sold source, independent of LandPortal: deed-level land sales pulled from the public records of Chatham NC, Union NC and Sevier TN, divided by a fresh count of what is actually listed. These give the three “County …” statistics, the County recorded sales card on the county and ZIP panels of those counties, and the Sold points at street level. Every rate is read from the data file; nothing is modelled.

Loading county recorded sales…

Our listings · definitions

Active inventory (our listings)
LandSearch / LandWatch listings with status active or coming-soon
Under contract (our listings)
listings with status pending (LandSearch) or under_contract (LandWatch)
Contract Absorption % (our listings)
under contract ÷ (active inventory + under contract). Undefined when the denominator is 0. Our own listings-based measure: the share of the current on-market inventory that has gone under contract. It is NOT a closed-sale rate; the LandPortal Absorption Rate is.
Median $/acre (list)
median of asking price ÷ acres over listings where both are known
Median DOM (observed)
median of (date status was last checked − listing date), in days, over listings with a usable listing date
Listing count
listings matching the filters (the Status filter narrows this count, the medians and the pins; it never changes absorption or the score)
Confidence
n < 10 low · 10–29 medium · 30+ high. For a LandPortal-sourced score n = sold + implied active; for a listings-based score n = active + under contract. Low-confidence units render faded and hatched.

Absorption Score

# LandPortal-sourced (unit has LP sales > 0 under the acreage selection; state / county / ZIP)
K      = 15
ar_s   = (sold + K · ar_parent) / (sold + active + K)      ar_parent = parent's LP rate (county -> state, ZIP -> county, state -> US; else US)
score  = round(100 · pctRank(ar_s))                         ranked among LP-sourced units of the same level
n      = sold + implied active                              confidence: < 10 low, 10-29 medium, >= 30 high

# Listings-based (everything else: hexes, radius circles, units without LP sales)
n      = active + underContract
ca_s   = (underContract + K · ca_parent) / (n + K)
dom_s  = (m · medDom + K · medDom_parent) / (m + K)    m = listings with known DOM
score  = round(100 · (0.6 · pctRank(ca_s) + 0.4 · pctRank(−dom_s)))

Every score names its source (panel, hover, rankings, window.__absorption()): “LandPortal absorption, 12 mo” or “Our listings: contract absorption + DOM”. Shrinkage pulls a unit with few observations toward its parent: with K = 15, a unit with 15 sales (or listings) sits halfway between its own rate and its parent’s; with 150 it is 91% its own. Percentile ranks are taken among units of the same level; ties share their midpoint. The radius tool ranks its circle against the national population of res-7 hexes (listings-based).

Time windows

LandPortal numbers are always the trailing 12 months before their scrape date and ignore the Time filter. For our listings, 90 days, 6 months (182 d), 1 year (365 d) and 2 years (730 d) apply to the listing date and are anchored at the newest listing date in the snapshot, not at today, so a thin recent feed does not empty the short windows. “All” (the default) is the only window that includes listings with an unknown listing date. Days on market is observed: the date the status was last checked minus the listing date, clamped at zero.

Status groups (our listings)

Source statusGroupSource
activeactive inventoryLandSearch, LandWatch, MLS
coming-soonactive inventoryLandSearch
pendingunder contractLandSearch only
under_contractunder contractLandWatch only
dead_landlockedexcludednot a market status

The Status filter (All / Active / Under contract) narrows the listing count, the medians, the acreage bands, the pins and the rankings on those columns. Contract Absorption % and the listings-based score always use both groups, because a ratio with one side filtered out is meaningless. Sold stays disabled for per-listing data: sold figures exist only as LandPortal county / ZIP aggregates (the LP statistics).

Dedup and exclusions (our listings)

Geography assignment

Every listing is placed by point-in-polygon on its coordinates, never by its text county or ZIP (17% of raw ZIPs are blank and many are wrong). Counties come from the Census 2023 cartographic boundary file (500k), ZIPs from the Census 2020 ZCTA file; a point that falls in no polygon (coastal generalisation) takes the nearest polygon within 2 km, else stays unassigned. Hexes are Uber H3 cells at resolution 8, with resolutions 5–7 derived on the client; the map picks the resolution from the zoom level. A ZIP's parent county is the county with the largest area overlap; a hex's parent is the county holding most of its listings. LandPortal counties are matched to the same county polygons by name, and LandPortal ZIPs to the same ZCTAs by code (see the ZIP ∩ county rule above).

Data sources

Known gaps

Loading data health…