Where the numbers come from
A cost platform is only as good as its provenance. Every price row in our database carries a source, a licence note, the period it describes, the date we collected it, and a status flag — verified, modelled, or sample. This page is that table, rendered.
How reliable is this?
Updated as data lands
- Labour
- Government data
- Materials
- Partly observed
- Local coverage
- 17 cities
- Geometry
- Exact
Bureau of Labor Statistics wage release for May 2025, occupation 47-2181 (roofers), across 15 metro areas.
2 of 24 material rows come from observed prices; the rest are modelled.
Metro-level pricing in 15 markets and written local guidance for 17 cities. Anywhere else falls back to national figures, and the confidence score says so.
Pitch multipliers, roof area and material quantities are arithmetic, not estimates.
About 65% of a typical re-roof is still priced from modelled rows, so every estimate is capped at a confidence of 60 until that changes. We would rather show you that than a confident-looking number we cannot stand behind. Sources and licences
Connected
Sources currently feeding estimates
Right now this is a short and uncomfortable list, and we would rather show you that than dress it up.
Home Cost Doctor internal model (sample data)
Internal model
Our own derivation. Shipped so the application is functional before real feeds are connected. Must not be presented to users as observed market pricing.
Observed material prices
Publicly available market information
Prices we observed ourselves from publicly listed retail and distributor sources, each row recording its own source, URL and observation date. We publish the derived cost range, never a third party's dataset. Where a competitor's published range is recorded it is marked as a benchmark and never becomes a priced record.
BLS Occupational Employment and Wage Statistics
Government / open statistics
US federal government work, generally in the public domain. Ingested: metro-level roofer wage data (SOC 47-2181), May 2025 release, via scripts/ingest-bls-oews.ts. The wage is BLS; the labour burden multiplier that turns a worker's wage into an employer's crew cost is ours, so those records are modelled rather than verified.
BLS Producer Price Index - roofing materials
Government / open statistics
US federal government work, generally in the public domain. Ingested: series WPU1361, prepared asphalt and tar roofing and siding products, via scripts/ingest-ppi.ts. Used for the published price history and to carry anchored material prices forward. The index measures producer price movement and is not itself a price.
Home Cost Doctor homeowner submissions
First-party (our users)
Voluntarily submitted by homeowners with explicit consent, moderated before use, and aggregated so no individual project is identifiable. This is the intended long-term backbone of the model.
The ingestion roadmap
Sources configured but not yet connected
These are already rows in the pricing_sources table with their licence terms recorded. Connecting one is an ingestion job, not an architecture change.
US Census Building Permits Survey
Government / open statistics
US federal government work, generally in the public domain. Intended use: construction activity as a demand proxy per metro. Not yet ingested.
Municipal permit fee schedules
Government / open statistics
Published fee schedules from each authority having jurisdiction. Intended use: replacing our modelled permit allowance with the actual local schedule. Must be collected per jurisdiction and re-checked on their revision cycle.
OpenStreetMap
Open data
Open Database Licence (ODbL). Commercial use is permitted with attribution, and share-alike obligations attach to derivative databases. Intended use: building footprints to pre-fill roof area. Legal review required before any derivative database is published.
Contractor-submitted pricing
Contractor submitted
Supplied by participating contractors under agreement. Carries obvious selection bias and must be weighted accordingly, never used as a sole source for a market.
Commercial construction cost database (licensed)
Commercially licensed
Commercial cost databases such as RSMeans require a paid licence. Do not scrape, redistribute or derive a competing database from them. Ingest only under an executed licence that permits derived estimates.
Ground rules
What we will and will not do to get data
We will not build the business on scraping
Commercial construction cost databases exist because good localised cost data is genuinely valuable and expensive to produce. Scraping one to build a free competitor creates copyright, database-right and contract problems, and it produces a dataset we could never defend or stand behind. If we want that data, we license it.
Automated collection is checked case by case
Where publicly posted prices are useful, collection is assessed individually against that site’s terms, its robots rules, applicable copyright and database rights, and the law in the relevant jurisdiction — before anything is collected, not after.
Open data obligations are obligations
OpenStreetMap is available under the Open Database Licence. Commercial use is permitted, with attribution required and share-alike obligations attaching to derivative databases. That is a real constraint on how a derived building-footprint dataset could be published, and it needs legal review before we rely on it.
Our own users are the endgame
What a homeowner actually paid, with their consent and stripped of anything identifying, is the one dataset nobody else can copy. It is also the only one that lets us measure our own accuracy: we store the estimated, quoted and actually-paid figures separately for exactly that reason. Contribute yours.
Provenance fields
What we record about every price
| source_name / source_url | Who published it and where |
| source_type | Government, open data, licensed, first-party, contractor, internal model |
| license_notes | In plain language, what we are allowed to do with it |
| geo_scope_type / geo_scope_id | Exactly which place the price describes |
| unit | Per square, per hour, per ton, per linear foot, each |
| low / median / high | Never a single point estimate |
| effective_date | The period the price describes |
| collected_date | When we captured it |
| methodology | How it was derived, in a sentence |
| confidence_score | Per record, feeding the estimate-level score |
| data_status | verified, modeled or sample - and it is NOT NULL |
| sample_size | How many observations sit behind it, where applicable |
data_status being non-nullable is deliberate. An unlabelled number cannot enter the system, which means we can never accidentally present a placeholder as a fact.