How We Estimate Your Vehicle's Value

Version 0.1.0-draft · Last updated 2026-08-04 · Download coefficients (CSV) · Changelog

What this is: a transparent estimate, computed from a published formula and cited public data, that you can verify yourself. Every number below is either a cited external source or explicitly labeled as our own calibration.

What this is not: a market quote, an appraisal, an offer to buy your vehicle, or a guarantee of what you'll receive in a sale. It's our documented method applied to your inputs — nothing more, nothing less.


The short version

We start from what typically happens to vehicles like yours as they age and accumulate mileage, using a published industry depreciation study and a government driving-mileage survey — not a black-box model, not live market scraping. The default result is a retention percentage ("your vehicle has retained an estimated X% of its value"). If you tell us what you originally paid, we can convert that into a dollar range, clearly labeled with wider uncertainty than a factory-price-based estimate would carry, because a single purchase price is noisier than a published reference number.

We do not compute a live-market price at request time. We do not use AI/LLM inference to produce the number. Identical inputs always produce identical output.

We estimate dealer asking price — what a comparable vehicle is currently listed for, not a private-party sale price and not a dealer's trade-in/wholesale offer. This is a deliberate choice, not an oversight: our depreciation curves are fitted from iSeeCars' dealer-listing data, so dealer asking price is the quantity we can actually defend with a citation. A private-party transaction typically runs lower (no dealer markup or reconditioning cost built in) — see u_base below for how large that gap tends to be, and why it's a systematic difference, not random noise.


The formula

effective_age = age_years + (actual_miles − expected_miles(age_years)) / current_expected_rate(age_years)

retention = b × e^(−k_segment × effective_age)              [valid roughly from age 1 onward — see below]

[optional, only if you supply a purchase price]
dollar_estimate = purchase_price × e^(−k_segment × (effective_age_now − effective_age_at_purchase))
                                                              [b cancels out of this ratio — see below;
                                                               this is a limitation, not a fix]

u = u_base + u_extrapolation + u_segment_ambiguity + u_condition_unknown + u_anchor_noise + u_anchor_purchase_age

range = estimate × [1 − u, 1 + u]

Where: - age_years — chronological age from model year to today. - effective_age_at_purchase (the purchase age used in anchor mode, t_purchase above) — chronological age from model year to your purchase date, in fractional years (days ÷ 365.25), not whole years. We don't know a vehicle's actual build or on-sale date, only its model year, so "model year" is treated as starting January 1st of that year — a simple, disclosed convention, not a claim of precise manufacture-date knowledge. This matters: buying a same-model-year vehicle is common and normal, and whole-year rounding would floor every such purchase to exactly 0 regardless of whether it happened in January or December. - expected_miles(age_years) — cumulative mileage a typical vehicle of that age would have, from a government driving survey (below). Excess or deficit mileage shifts effective age 1:1 against this baseline — we apply no additional mileage-sensitivity scaling on top of that (see "Mileage, as effective age" below for the sourced basis behind that decision). - b — a single curve-shape parameter, 0.87, shared across all 7 segments. Corrects for the fact that a curve fit only to 3-year and 5-year data points is steeper early on than a naive single-point fit would suggest. Our own calibration — see the derivation below. - k_segment — the per-segment decay rate, one of 7 values, each solved against iSeeCars' 5-year figure given b. - u — the uncertainty band width. No single/High-Medium-Low label — the actual band width and the specific reasons it's wide or narrow are shown with every estimate. Defined term-by-term below.

Valid age range

The curve is fitted from 3-year and 5-year observations — that's the only age range we have real data at. b = 0.87 is an artifact of that fit, not a claim that a brand-new vehicle is worth 87% of anything the moment it's sold. The default retention-percentage estimate is meaningful roughly from age 1 onward and is not defined at or near age 0. Below that, we decline to give a curve-based estimate — the same treatment we give salvage-title or heavily modified vehicles: we don't extrapolate a shape we haven't verified, we say so.

The purchase-price-anchor mode is not exempt from this — if anything it's more exposed, and we got this wrong in an earlier version of this page. b does cancel out of the anchor formula algebraically, but that's not the same as the formula being valid near age 0 — see "Why the anchor projection can't dodge this by algebra" below for exactly why, and how we handle it now.

Why the anchor projection can't dodge this by algebra

An earlier version of this page argued that because b cancels out of dollar_estimate = X × e^(−k·(t_now − t_purchase)), the anchor mode stays valid even for a very new vehicle. That reasoning was wrong, and it's worth explaining precisely why, because the fix matters more than the correction.

k is fitted to be accurate specifically in the 3-to-5-year window. b exists because real depreciation is steeper in the first year or so than that fitted rate — that was the entire justification for adding it. The anchor formula applies k uniformly across the whole elapsed interval between your purchase and today, with no adjustment for whichever part of that interval falls in the steeper, unstudied early region. If you bought new and we're projecting from age 0, we're applying the shallow tail rate to a stretch that (by our own stated reasoning for b) should include a steeper early drop — which understates total depreciation and overstates current value. This isn't extra noise, it's a bias in a known direction.

We checked whether evaluating the full curve at both endpoints separately — [b·e^(−k·t_now)] / [b·e^(−k·t_purchase)] — avoids this, instead of using the simplified ratio. It doesn't: b cancels out of that computation too, exactly, for any ages you plug in. That's not a coincidence — for this specific functional form, the proportional rate of decline is mathematically constant at k for every age above zero; b only sets the level at the single instant t=0, it has no effect on the shape of decline anywhere after that. So the model, taken literally, says all the "extra" early drop happens in an instantaneous jump at exactly age 0, with smooth constant-rate decay for every age after that, however small. We don't actually believe that's how real depreciation works (the commonly-understood "steep first year" is a period, not an instant), but we also don't have data isolating a distinct early-region rate to use instead — both our calibration points sit at 3 and 5 years. There's no computational trick that recovers information we don't have.

So: the anchor mode is reliable when both the purchase age and today's age sit inside the calibrated window (roughly 2–8 years). When the purchase age is younger than that, we don't correct it — we disclose it, via u_anchor_purchase_age below. Below age 1, the bias is severe enough that we decline to estimate, same as the default mode's floor. Between 1 and 2 years, we widen the band — but plainly: that widening is a partial, disclosed mitigation for a bias we know the direction of, not a correction that makes the center trustworthy. If your purchase falls in that window, weight the lower end of our range more than the center.

Uncertainty band, u

Term Value Basis
u_base 17% in default (no-anchor) mode; 0% when a purchase-price anchor is supplied Our judgment, but not arbitrary — derivation below. Reflects the systematic gap between dealer asking price (what we estimate with no anchor) and private-party transaction price. Once you supply a real purchase price, the output is naturally on that transaction's basis, not ours — the gap this term discloses no longer applies, so applying it on top of a real anchor would double-count.
u_extrapolation +0% if effective age is 2–8 years; +8% if 1–2 or 8–12 years; +18% beyond that (below 1 year: decline to estimate, see "Valid age range" above). Bands are half-open — a value exactly on a shared boundary (e.g. 8.0 years) falls in the higher band. This is our own tie-break convention, not a distinction the source data draws. Our judgment. iSeeCars' figures are anchored at 3 and 5 years — the further effective age sits from that calibrated window, the more the curve's extrapolated shape is doing the work. Applies to effective_age_now in both modes.
u_segment_ambiguity +0% for a clean match; +10% when the precedence rules fall back to a nearby bucket (e.g. a luxury SUV priced off the plain SUV rate); +20% when body style doesn't map to any of the 7 segments Our judgment, tied directly to the precedence rules above.
u_condition_unknown +5%, applied to every estimate in this version This version doesn't collect vehicle condition at all yet, so there's no case to compare against — the penalty is currently constant, not variable. It becomes a real 0%–X% term once condition capture ships. Our judgment, flagged as a placeholder.
u_anchor_noise +0% for the default retention-percentage output; +15% when you supply a purchase-price anchor Our judgment. A single transaction carries negotiation- and timing-specific noise that a published segment curve doesn't — a genuinely different concern from u_base, and still applicable regardless of price basis.
u_anchor_purchase_age +0% if purchase age ≥ 2 years; +8%, disclosed as a partial mitigation, not a correction, if 1–2 years; decline to estimate if under 1 year Our judgment. Anchor mode uses only the tail rate k, which understates depreciation for any part of the projection window inside the unstudied early region — see "Why the anchor projection can't dodge this by algebra" above. Zero in default mode; only applies when anchoring.

These are additive. u_base now has a documented empirical derivation (below); the other terms remain disclosed judgment calls, not citations. We'll tighten them if we ever get real variance data to calibrate against.

Where u_base = 17% comes from

This is not a measurement-error estimate — we're not claiming two sources tried to measure the same thing and landed 17% apart by chance. They measured two different, both-legitimate things, and the gap between them tells us how much our answer would move if you meant a different question.

That's an 18-percentage-point gap in depreciation, attributable to which price is being measured, not to noise around one shared number. (One imprecision worth naming: "mass-market ICEV car" and "non-luxury sedan" are close but not identical categories across the two sources — this comparison isn't perfectly apples-to-apples.)

We estimate dealer asking price throughout this page (stated above). u_base's 17% is derived as: midpoint of the two retention figures (53.85%), half the gap between them (9.35 percentage points), expressed as a fraction of the midpoint — 9.35 / 53.85 ≈ 17%. That's how far a private-party-basis answer to the same question would likely land from ours. Directionally, dealer asking price tends to run higher than private-party price (no dealer markup or reconditioning cost in a private sale), so if you're mentally converting our estimate to "what a private buyer would pay," expect it to skew toward the lower end of our range more often than not — we're keeping the band symmetric for simplicity, but the underlying gap isn't symmetric in practice.

This term applies only when we're estimating from the curve alone, with no anchor. If you supply a real purchase price, the output inherits that transaction's basis directly — there's no "which price basis" question left to disclose, so u_base drops to 0% and u_anchor_noise (a different, still-relevant concern) takes over instead. See the u table below.


The 7 segments and where their coefficients come from

Every vehicle is assigned to exactly one of 7 segments, each with its own decay rate k, solved from b × e^(−5k) = 5yr_retention given the shared b = 0.87 (see derivation below).

Segment 5-yr depreciation (cited) k
Trucks 34.2% 0.056
Hybrids 35.4% 0.060
Sedans — non-luxury 36.8% 0.064
Sedans — all (fallback, see below) 38.9% 0.071
SUVs 44.9% 0.091
Luxury (sedans) 48.1% 0.103
EVs 57.2% 0.142

Source: iSeeCars 2026 "Cars That Hold Their Value" study, ~950,000 5-year-old vehicles sold March 2025–February 2026, prices inflation-adjusted to 2026 dollars. Heavy-duty trucks/vans, discontinued models, and low-volume models excluded from their analysis.

Where b = 0.87 comes from

A single-parameter curve (b fixed at 1.0, fit through only the 5-year point) is systematically wrong at every other age — too shallow when young, too steep when old — because it forces the entire shape through one point. We fit a proper two-parameter curve instead, using a second iSeeCars data point: a separate study (their car-color resale analysis, ~1.2 million model-year-2022 vehicles, observed Aug 2024–May 2025, same asking-price basis) publishes 3-year depreciation for three segments that overlap ours:

Segment 3-yr depreciation 5-yr depreciation Fitted b
Trucks 27.1% 34.2% 0.850
Sedans (all) 29.9% 38.9% 0.862
SUVs 32.7% 44.9% 0.909

Caveat, stated plainly: these two figures come from two different iSeeCars studies — different vehicle cohorts (model-year-2022 vehicles vs. "5-year-old" vehicles) observed in different windows. Combining them assumes market conditions were reasonably stable between the two observation periods; we can't independently verify that.

The three fits cluster reasonably (0.850–0.909) — Trucks and Sedans are close (0.850 vs. 0.862), SUVs runs moderately higher (0.909). For comparison, Argonne's own independently-derived b values (from a completely different price basis — see below) span 0.80–0.94 across their mass-market segments, a similarly-sized range. We took the mean of our three fits — b = 0.874, rounded to 0.87 — and apply it uniformly across all 7 segments, then re-solved each segment's k against its own iSeeCars 5-year figure using that shared b. This is our own calibration: real data motivates the number, but the decision to average three segments and apply the result to four we couldn't fit directly is a judgment call, not a citation.

Independent cross-check: Argonne's own report fits the same two-parameter exponential form (their Equation 5) to a completely different dataset — private-party transaction values (Edmunds True Market Value) against MSRP, not dealer asking prices against nothing. Their fitted b values run 0.80–0.94 for mass-market segments and higher for luxury (up to 1.01). Two independent sources, different price bases, different studies, both landing on a meaningfully front-loaded drop followed by a shallower tail — that's real corroboration the two-parameter shape is right, even though the exact number is ours.

Known limitation — EVs and hybrids specifically: Argonne's data differentiates b by powertrain, and their EV figures don't match our uniform estimate. Mass-market BEV b runs 0.922–0.933, luxury BEV 0.979–1.008 — meaningfully higher (a smaller initial drop) than our uniform 0.87. Mass-market hybrid b runs 0.800–0.838, closer to our estimate. Applying b = 0.87 uniformly likely overstates EVs' early value drop relative to the one piece of powertrain-specific evidence we have — and that evidence didn't come from the segments we fit b from at all. We're not splitting b by source to fix this — that would trade one disclosed simplification for a less consistent, harder-to-audit one. We're naming the limitation instead. This compounds with EVs already being our thinnest-data, highest-uncertainty segment.

Price basis, stated explicitly: iSeeCars' own materials describe their core business as aggregating dealer and marketplace listing feeds and analyzing asking prices across the large majority of US used-car listings — not a completed-transaction feed. Despite the study's own use of the word "sold," we found no evidence of a completed-transaction data pipeline anywhere in their public materials — this is asking/listing-price data, the same basis as the live-comps data we use elsewhere in this product. We're stating this explicitly rather than repeating "sold" uncritically, because the distinction matters and their own word choice is easy to over-read.

A note on the study's own structure: iSeeCars' 7 categories are not mutually exclusive in their data — a hybrid SUV contributes to both the "SUVs" and "Hybrids" averages independently. Our product needs to assign each vehicle to exactly one bucket, so the precedence order below is our decision, not iSeeCars'.

Segment assignment (our precedence order)

  1. EV (NHTSA electrification level = BEV/FCEV) → EV segment
  2. Hybrid (electrification level = HEV/PHEV) → Hybrids segment
  3. Body class = Pickup → Trucks segment
  4. Body class = SUV/MPV → SUVs segment (luxury SUVs land here too — the source study doesn't isolate luxury-SUV depreciation separately, so we widen the confidence band rather than invent a number)
  5. Body class = Sedan, Hatchback, Coupe, Wagon, or Convertible (grouped together — the source study doesn't break these out individually, a disclosed approximation): - Make is on our luxury-make list → Luxury - Make is not on that list → Sedans, non-luxury

The luxury-make list is a small, fixed, disclosed set (~19 brands) — not a lookup against any external database, and not a confidence judgment. It is necessarily incomplete: an obscure or newly-arrived luxury marque we haven't added yet is treated as non-luxury with full confidence, not flagged as uncertain. This is a real, accepted limitation of the list itself, distinct from rule 4's luxury-SUV band-widening and rule 6's unmapped-body-style band-widening — those two happen because our source data doesn't isolate a needed figure; this one happens because our list of brand names is short and static. 6. Body style doesn't map cleanly (minivan, unrecognized/missing body class) → Sedans, all, with the widest band we publish and an on-screen note explaining why.


Mileage, as effective age

We don't apply a separate mileage penalty on top of an age penalty. Instead, mileage shifts your vehicle's effective age on the same depreciation curve — a vehicle with unusually low mileage for its age behaves like a younger vehicle; unusually high mileage, like an older one.

Expected mileage baseline, from the National Household Travel Survey (NHTS), via DOE "Fact of the Week #1046": - Vehicles 1–5 years old: >12,000 mi/year (NHTS reports this as a floor, not an exact average — we use 12,000 as a stated, disclosed lower bound, not a precise figure) - Vehicles 9+ years old: 7,800 mi/year - All-vehicle average: 10,200 mi/year

⚠️ Currency caveat, stated plainly: this is 2017-cycle NHTS data, cited in a 2018 article. We haven't found a published 2022-cycle equivalent. We'll update this the moment a more current public figure is available — we're not aware of one as of this writing.

The 5–9 year gap is not published anywhere we could find. We linearly interpolate between the 12,000/yr (age 5) and 7,800/yr (age 9) anchors. This interpolation is our own choice, not sourced — it's the simplest defensible bridge across a real gap in the public data, not a claim that mileage declines linearly in that window.

Age (years) Expected annual rate Cumulative expected mileage
0–5 12,000/yr 60,000 at year 5
5–9 interpolated, 12,000 → 7,800/yr ~99,600 at year 9
9+ 7,800/yr (flat) +7,800/yr thereafter

Why we don't apply a separate mileage-sensitivity scaling factor

A DOE national laboratory tried to measure this directly and couldn't. Burnham et al. (Argonne National Laboratory, ANL/ESD-22/2 Rev. 1, 2022) tested annual VMT (vehicle miles traveled) as a regression variable across four residual-value models and found it not statistically significant in any of them. The reason is structural, not a data-quality problem: in their dataset, age and VMT are correlated at R² = 0.92 — the two are so entangled that a model can't cleanly attribute value loss to one versus the other. (VMT alone does correlate with value at R² = 0.78, but that's consistent with VMT acting as a proxy for age rather than an independent effect.)

We're stating this precisely, not rounding it up: Argonne did not prove mileage is irrelevant to value. They state explicitly that isolating VMT's independent effect is "an interesting but separate research question" — a gap they identified and left open, not a result they obtained. We're citing an honest null finding, not evidence of absence.

What their sensitivity analysis does give us is a real, bounded, usable threshold: no meaningful value effect for mileage deviations under roughly 3,000 miles/year from expected. Below that threshold, we now apply no adjustment on a sourced basis. Above it — which covers most of the cases our effective-age mechanism actually matters for (a car with 150,000 miles at 5 years is far outside a 3,000mi/yr band) — we still apply no independent scaling factor (mileage shifts effective age 1:1 against the expected-mileage baseline), but that's motivated by Argonne's collinearity finding, not proven by it. No source, including this one, tells us what the correct scaling factor would be at large deviations — that remains an open question, and we're not overstating our footing on it.

One structural note in our favor: folding mileage into a single effective-age shift, rather than modeling it as an independent term, turns out to match what Argonne found empirically — a model that can't statistically separate age and mileage is exactly the kind of model where combining them is the more honest choice, not just a simplification.


Why we don't apply a regional adjustment

We looked. The closest candidate is BLS's regional CPI for "Used Cars and Trucks" (series CUUR0100SETA02 / 0200 / 0300 / 0400 for Northeast/Midwest/South/West). It measures the wrong thing. CPI tracks how much a region's prices have changed relative to a fixed 1982-84 base — it does not measure whether one region's used-car prices are higher or lower than another's right now. Using it as a cross-sectional multiplier would be citing a real government statistic to answer a question it doesn't actually answer. We'd rather apply no regional adjustment than a wrong one dressed up as sourced.

We also have real, measured, cross-sectional evidence that the effect is small. Argonne (ANL/ESD-22/2 Rev. 1) reports value dispersion across 51 US ZIP codes of roughly $300 standard deviation for ICEVs and under $200 for other powertrains — against typical vehicle values in the $25,000–$35,000 range, that's on the order of 1%. This is specific to their mass-market/ICEV-weighted sample, so we're presenting it as directional evidence the effect is genuinely small, not a measured figure for every segment — but it upgrades our reasoning from "we don't have regional data" to "we have regional data, and it's small enough that modeling it in v1 wouldn't move the estimate meaningfully."

Your ZIP code is not currently used to adjust your estimate. If a genuine cross-sectional regional price-level data source becomes available, we'll add this back — with its own citation, not this one.


Why we don't report a dollar estimate by default

We report a retention percentage by default. We only convert to a dollar figure when you supply your own purchase price. This is a trim problem, not a curve problem: a work-trim pickup and a top-trim version of the same year and model retain approximately the same percentage of their original value under our method — trim isn't one of the segment-assignment or curve inputs — but they can differ by tens of thousands of dollars new. Multiplying our percentage by a market-average price for that model would silently erase that difference and imply a precision we don't have.

We looked for a free source of per-vehicle trim-level pricing before settling on this. Four checked, all rejected:

One real, partial exception: Marketcheck's separate NeoVIN endpoint returns an original_msrp field genuinely sourced from manufacturer build data, not an asking-price alias — but only for roughly a third of VINs in our sample, gated behind a 500-call/month cap shared with the rest of our API usage. A feature that works a third of the time, on a quota we don't have budget to scale, isn't something we're building on. If that coverage improves, or a different sourced-MSRP feed becomes available, the correct construction is assumed original MSRP × our existing no-anchor retention output — not a new anchor-mode variant, and not an invented trim delta. Recorded here for if that day comes; not built.

Stated plainly: our retention percentage is trim-blind by construction. Any dollar figure we produce is only as good as the anchor behind it — your own purchase price, which already encodes the trim and options you paid for. Without a real anchor, we report retention only, and say so, rather than manufacture a dollar figure we can't back.


What we checked before calibrating the uncertainty band and mileage term ourselves

Before setting u's five components and deciding how to handle mileage-sensitivity scaling, we looked for published sources that could ground both in real data instead of our own judgment. We found a partial, sourced basis for the mileage question (below) and none for u's components. What we checked:

Result: no external source gives us u's components or a mileage-sensitivity coefficient — those remain our own calibration, disclosed throughout this page. The Argonne report does give us a sourced basis for part of the mileage question (see "Why we don't apply a separate mileage-sensitivity scaling factor" above) — a real, if partial, upgrade from pure judgment. We'll keep revising both as better sources turn up.


Ours vs. sourced — the full list

Coefficient Sourced Our own calibration
k per segment (7 values) ✅ iSeeCars 2026 study (given b)
b = 0.87 (shared curve-shape parameter) ✅ real data motivates it (iSeeCars 3yr+5yr fit, Argonne cross-check) ✅ the mean-of-three and applying it to all 7 segments is our decision
Which price we estimate (dealer asking, not private-party or trade-in) ✅ matches iSeeCars' basis, which is what k/b are fitted from ✅ choosing to report this basis, rather than another, is ours
Expected mileage anchors (12,000 @ 5yr, 7,800 @ 9yr) ✅ NHTS via DOE (2017 data)
5–9yr mileage interpolation (linear) ✅ bridges a published data gap
Mileage scaling below ~3,000mi/yr deviation: none applied ✅ Argonne (ANL/ESD-22/2) sensitivity analysis
Mileage scaling above ~3,000mi/yr deviation: still none applied ✅ motivated by Argonne's age/VMT collinearity finding (R²=0.92), not proven by it — no source gives us a scaling factor at this range
Segment-assignment precedence order ✅ our decision — iSeeCars' categories overlap, ours can't
Uncertainty band u (u_base, u_extrapolation, u_segment_ambiguity, u_condition_unknown, u_anchor_noise, u_anchor_purchase_age) ✅ every term — disclosed judgment, not measured variance
u_base scoped to no-anchor mode only (not applied once a real purchase price is supplied) ✅ our decision, to avoid double-counting a basis question a real anchor already resolves
Anchor mode's known directional bias for young purchase ages (u_anchor_purchase_age, decline below 1yr) ✅ ours — b cancelling out of the anchor ratio is a real mathematical fact, but treating that as "the formula is fine near age 0" was our error, corrected here
Decision not to apply a regional adjustment ✅ justified by BLS series definitions ✅ the "do nothing" choice itself is ours
Decision to report retention only, not a dollar figure, without a real anchor ✅ justified by the per-vehicle MSRP sources we checked and rejected ✅ the "retention-only by default" choice itself is ours
Condition/feature adjustments Not yet part of this version — planned, not yet specified numerically. We're not publishing placeholder numbers we haven't actually calibrated.

Worked example

2019 Chevrolet Silverado LTZ, 80,000 miles, today (2026):

Default output: "This vehicle has retained an estimated 46%–73% of its original value (center estimate ~60%), estimating dealer asking price."

If you also tell us you paid $38,000 for it 3 years ago (purchase age 4.0 years, at roughly average mileage for its age at that time): - Purchase-age check: 4.0 years ≥ 2 — inside the calibrated window, so u_anchor_purchase_age = 0%. - Center estimate: $38,000 × e^(−0.056 × (6.8 − 4.0)) ≈ $32,500. Note b doesn't appear anywhere in this calculation — it cancels algebraically, which is exactly the property that causes the young-purchase bias described above. It's not a problem here only because the purchase age (4.0) is safely inside the window k is actually calibrated for. - Band: u_extrapolation 0% + u_segment_ambiguity 0% + u_condition_unknown 5% + u_anchor_noise 15% + u_anchor_purchase_age 0% = ±20% (u_base doesn't apply here — this estimate is on the anchor's own basis, not ours) - Output: $26,000–$39,000

This anchor-mode band (±20%) is narrower than the default estimate's (±22%) — that's the correct outcome, not a coincidence: a real, recent, specific purchase price is genuinely more informative than a population curve with no anchor at all, and the math should reward that rather than penalize it.

Same vehicle, purchased 8 months ago instead of 3 years ago: purchase age 0.67 years, under the 1-year floor. We decline to give an anchor-mode dollar estimate — for the same reason as the default mode's floor, not a different one. Projecting from a purchase that itself sits in the unstudied steep-drop region, using only the shallow tail rate, would systematically overstate value, not just carry more uncertainty.

Same vehicle, purchased 1.5 years ago: purchase age 1.5 years, inside the 1–2yr disclosed-bias band. We'd show a center estimate and a range widened by u_anchor_purchase_age +8% — flagged plainly that the center itself likely runs high, not just that the range is wide.


FAQ

How is this different from KBB or Edmunds? Those tools give you a number without showing the method behind it. We publish the formula, every coefficient, and where each one comes from — including the parts that are our own judgment call rather than an external citation.

Why don't you show a dollar value by default? Because we don't have a free, per-vehicle source for what your specific trim originally cost new — see "Why we don't report a dollar estimate by default" above for exactly what we checked and why each one fell short. Rather than guess, we default to a retention percentage, which needs no such reference price. If you know what you paid, you can get a dollar range from that instead.

Why no regional pricing adjustment? See above — the only free candidate data measures the wrong thing (price change over time, not price level between regions), and we won't dress up a mismatched statistic as a regional signal.

What if my vehicle doesn't fit neatly into one of the 7 segments? We say so. Vehicles with ambiguous segment fit (an unclear luxury classification, a body style outside our 7 categories) get a visibly wider range and an on-screen explanation of why, instead of a falsely precise number.

What if my car is brand new, or less than a year old? We decline to give an estimate — in either mode. The default retention-percentage estimate is fitted from 3-year and 5-year data and isn't verified near age 0. The purchase-price-anchor mode doesn't fix this either, and it's not just a smaller version of the same gap: projecting from a very recent purchase using our formula would apply a decay rate calibrated for older vehicles across a stretch of time that includes real depreciation our formula can't see, which systematically overstates your car's value rather than just being less certain about it. We'd rather tell you plainly that we don't have a reliable number for a vehicle this new than show you one that's biased in a direction we already know.

Does this change over time? The formula and its version number are stable between publishing dates. Coefficients update only when we find a newer or better public source, or correct an error — always logged in the changelog below.


Coefficient table

Machine-readable version: coefficients-v0.1.0.csv — columns: segment, five_year_depreciation_pct, three_year_depreciation_pct, b, k, source, source_url, basis, retrieved_date. Blank three_year_depreciation_pct means that segment wasn't in the second iSeeCars study's breakdown — b was still applied uniformly, per the derivation above.

Canonical source: coefficients-v0.1.0.json — the segment table above, the full uncertainty (u) term definitions, the mileage table, and the valid-age-range floor, all in one file. The CSV is a generated view of this file's segments block (scripts/generate_coefficients_csv.py), not independently maintained — the two can't drift apart by construction. The valuation engine (valuation/) reads coefficients from this same JSON, not from a separate copy.


Changelog

0.1.0-draft — 2026-08-04 Initial draft. 7-segment taxonomy from iSeeCars 2026 study, NHTS-informed mileage baseline (2017-cycle data, currency caveat disclosed), regional adjustment explicitly dropped, MSRP-table approach abandoned in favor of retention-percentage default with optional user-supplied purchase-price anchor. Uncertainty band u fully defined (5 additive terms, all disclosed as our own calibration) and High/Medium/Low confidence labels removed in favor of stated band width and reasons. Mileage-sensitivity term reworded from "β = 1.0, our calibration" to "no scaling applied, none sourced." Added a documented research pass (lease residual literature, hedonic pricing studies, government fleet schedules, insurance ACV regulation, accounting conventions) confirming no external source provides a mileage coefficient or uncertainty-band basis — MACRS explicitly rejected as a citation despite being real and precise, same reasoning as the regional CPI decision. Manually obtained the full Argonne National Laboratory report (ANL/ESD-22/2 Rev. 1) after automated access was blocked: added a sourced basis for no mileage-sensitivity scaling below ~3,000mi/yr deviation (their VMT variable was not statistically significant in any of 4 models, age/VMT collinearity R²=0.92 — framed explicitly as an unresolved research question, not proof mileage doesn't matter), and added their 51-ZIP-code value dispersion data (~1%) as measured evidence supporting the no-regional-adjustment decision.

Adopted a two-parameter curve, retention = b × e^(−k_segment × effective_age), replacing the single-parameter e^(−λt) form, which was systematically wrong at every age except the 5-year anchor it was fit through. b = 0.87 derived from a three-segment fit (Trucks/SUVs/Sedans) against a second iSeeCars study with 3-year figures, cross-checked against Argonne's independently-derived range (0.80–0.94) from a different price basis — real corroboration for the curve shape, though b itself remains our own calibration. All 7 segments' k values re-solved against this shared b. Documented a known limitation: Argonne's powertrain-specific data suggests our uniform b likely overstates EVs' early value drop. Added an explicit valid-age-range floor (~1 year) below which we decline to give the default estimate rather than extrapolate an unverified curve shape. Stated explicitly, for the first time, that this page estimates dealer asking price specifically. Replaced the arbitrary u_base = 10% with an empirically-derived 17%, computed from the systematic gap between Argonne's (private-party) and iSeeCars' (dealer asking) depreciation figures for comparable mainstream vehicles — reframed explicitly as a price-basis spread, not a measurement-error bar. Worked example fully recomputed under the new formula and u values.

Correction, same day: an earlier pass in this changelog entry claimed the purchase-price-anchor mode was exempt from the age-1 floor because b cancels out of its ratio algebraically. That's true but doesn't mean what we said it meant — confirmed numerically and derived analytically that the cancellation makes the anchor formula blind to b at every age, not safe near age 0; it applies only the tail rate k across the full projection window regardless of whether part of that window falls in the unstudied steep-drop region, which understates depreciation and overstates value for young purchase ages. This is a known-direction bias, not added noise. Added u_anchor_purchase_age (decline below 1yr purchase age, +8% disclosed-not-corrected between 1-2yr, 0% at 2yr+) and a new page section deriving why no algebraic rearrangement fixes this (the model's proportional decay rate is mathematically constant at k for any age above zero — b only sets the level at t=0, confirmed both symbolically and by direct numerical check). Separately, identified and fixed a double-count: u_base (dealer-asking vs. private-party spread) was being applied on top of u_anchor_noise even when a real purchase price was supplied, despite the anchor already resolving the "which price basis" question by construction. u_base now applies only in default (no-anchor) mode. Net effect: a well-behaved anchor (purchase age inside the calibrated window) now produces a narrower band than the default estimate, rewarding real user-supplied data instead of penalizing it. Worked example updated with both the corrected in-window case and two new illustrative cases (decline below 1yr, disclosed-bias 1-2yr). FAQ entry for new vehicles rewritten — no longer points to anchor mode as a workaround, since it's the worse option for that population.