Label on every value: "Estimate, not market data."
What it is
A low–high range of what a model might be worth used, computed only from (1) the sourced new price in models.csv (via tools/data/models.json, which excludes CAD, range and unverified prices) and (2) the model's age. It is not based on any sale, listing or valuation data.
Depreciation source
None citable. We looked for a depreciation curve on allowed sources only (government, NMMA/Discover Boating, USCG, lender/insurer official pages, open data). The only official item found was the Michigan DIFS boat insurance publication (FIS-PUB 6370, michigan.gov/difs), which explains that actual-cash-value policies apply depreciation but gives no rates. Curves found elsewhere were on valuation or listing-adjacent sites, which we do not use. The rates below are MyNextBoat.ai's own assumption.
Assumption (annual loss of value, compounded)
| Age (years) | High estimate uses | Low estimate uses |
|---|---|---|
| 1 | 10% | 20% |
| 2–5 | 6%/yr | 10%/yr |
| 6–10 | 4%/yr | 7%/yr |
| 11+ | 3%/yr | 5%/yr |
The value never goes below 10% of the new price. Results are rounded to $100. No estimate past 25 years. boat_type is recorded in inputs but v1 does not vary by type (we have no sourced basis for per-type rates). Inflation and the gap between new-price year and model year are ignored.
Age
age = basis_year (2026) − launch_year, or model_year if there is no launch_year. launch_year is blank for all 765 priced rows, so model_year is used. When there is no year, or the model year is 2026/2027 (current or upcoming), the main range is blank and blank_reason says why.
Output: used_price_estimates.csv
One row per priced model (765). model_key = the stable site id brand-slug/model-slug, taken from tools models.json id (same as site_data model page ids, including the -2 suffix on repeated names; item 30a). Columns: low, high, currency, basis_year, model_age, method_version, label, inputs, source_url (new price), blank_reason. HYPOTHETICAL columns: HYPOTHETICAL_today_price_at_ageN_low/high (N=1,3,5,10) apply the same assumption to today's new price as if the boat were N years old. They are not an estimate for any real used boat of that model and must be labeled "Hypothetical" wherever shown.
Coverage (2026-10-25, after yearfill2): range shown for 36 of 765; blank for 729 (540 no stated model year, 189 current/upcoming model year 2026/2027). Hypothetical columns filled for all 765.
Model years for 60 priced models were added by yearfill2.py only where the manufacturer's own page states the year (e.g. Scout "Current pricing is based on 2027 model year", Carolina Skiff "the 2026 model year 17 LS", Stingray "2027 Stingray 17CC Model Flyer"); evidence in model_year_src and raw/yearfill2_log.csv. Brochure PDFs (32 checked) stated no model year. USCG MIC data has manufacturer codes, not model years, so it can't date a model. Most current models' sourced prices are for the 2026/2027 model year, so they correctly get no used range.
Code
tools/src/usedPrice.mjs exports usedPriceEstimate(newPrice, age) and formatUsedEstimate() (also exported from src/index.mjs). Tests: tools/test/usedPrice.test.mjs. Regenerate with node tools/build_used_prices.mjs after node build.mjs.
Later phases (not done)
A: J.D. Power license once income covers it. C: partner dealer data.