How the estimate is built
Data version v2026.1, effective 2026-04-01. Every figure is modelled from published indices and a fixed task library. Nothing is scraped, crowd-sourced or quoted by a contractor.
Each task carries base hours per unit. Hours are multiplied by rule-driven complexity, the specification tier's install-time factor, a site-access factor and a regional productivity index.
Hourly rates start from published national median wages per trade, multiplied by an employer burden factor of 1.45 (payroll tax, insurance, non-billable time) and the local trade index. Each trade also carries a minimum mobilisation charge so a one-hour job never prices as one hour.
Quantities come from the task's expression, increased by a tier-specific waste factor, then rounded up to the way the product is actually sold (bundles, squares, sheets) with minimum order quantities respected.
Unit costs are tiered Good / Better / Best and adjusted by a bounded regional material multiplier. Sales tax and delivery are separate lines, never buried in the unit cost.
Permits, inspections, equipment hire, disposal and protection are allowances gated by rules, scaled by local permit and disposal indices.
Contractor overhead and profit is applied once, as a visible line, in a band that narrows as job size grows: 25% / 21% / 17% at increasing project sizes. Contingency starts from a project base and rises with activated risk rules, capped so it can never dominate the total.
Confidence scores location data quality, how completely conditions were answered, and how much concealed risk the scope carries. The band sets a minimum displayed spread: roughly ±12% at High, ±20% at Moderate and ±32% at Preliminary.
National-average estimates are capped at Preliminary by design. A thinly specified project cannot render a tight number.
Metro samples: Chicago, IL (measured) · San Francisco, CA (measured) · Houston, TX (measured) · Cleveland, OH (measured) · New York, NY (measured) · Billings, MT (interpolated) · Lima, OH (state_default)
State averages: Illinois · California · Texas · Ohio · New York · Montana
Anywhere else falls back to national averages and Preliminary confidence.
No personal data, no free text, no exact totals — money is bucketed before it leaves the page.
| Event | Fires when | Properties |
|---|---|---|
| project_selected | A project card is chosen | project_id |
| calculator_started | The wizard opens step 2 | project_id |
| step_completed | Each wizard step is passed | project_id, step, step_index |
| question_abandoned | A visible required field is left blank when leaving a step | project_id, step, field |
| validation_error | A blocking validation message is shown | project_id, step, field, rule |
| estimate_generated | A calculation returns | project_id, metro_id, data_level, tier, confidence_band, total_expected_bucket, rules_activated |
| web_vital | The browser finalises a Core Web Vital for a real page load | metric, value, rating |
| estimate_recalculated | Inputs change after a first result | project_id, reason |
| cluster_page_view | An SEO cluster page (metro cost page or material variant) is viewed | project_id, metro_id, variant, page_type |
| tier_changed | Good/Better/Best switched | project_id, from, to |
| scenario_saved | A scenario is stored locally | project_id, scenario_count |
| scenario_compared | The comparison view renders 2-3 scenarios | scenario_count, project_ids |
| detailed_scope_opened | A results accordion section is expanded | project_id, section |
| download_initiated | Download button pressed | project_id, format |
| download_completed | File handed to the browser | project_id, format |
| contractor_interest_clicked | Contractor-quote CTA pressed | project_id, placement |
| monetisation_slot_impression | A monetisation slot is ≥50% in the viewport for 1s (once per mount) | slot_id, slot_name, page_type, position, project, metro, visibility_ts, device_type, viewport, route |
| monetisation_slot_impression_ended | A seen slot leaves the viewport or unmounts — carries measured attention | slot_id, slot_name, page_type, position, project, metro, visible_duration_ms |