1. Executive summary
HailScore™ is an address-level hail risk score on a 0–100 scale, derived from public meteorological datasets published by the National Oceanic and Atmospheric Administration (NOAA) and the National Weather Service (NWS). The score is intended to give homeowners, roofing professionals, public adjusters, and insurance carriers a calibrated, reproducible answer to the question:
How much hail damage has this specific property been exposed to, and how recent and severe is that exposure?
The score is computed in real time from six independent data feeds, three of which update within minutes of severe weather. Scoring weights, decay curves, and material adjustments are documented in §4 and have remained stable since the v4 calibration of February 24, 2026.
This document is the authoritative reference for the scoring methodology and the data behind it. It is intended to support due diligence by insurance carriers, reinsurers, independent adjusters, and academic reviewers. Comments and corrections may be sent to myhailscore@gmail.com.
2. Problem definition
Hail is the leading cause of severe-convective-storm insured loss in the United States, exceeding $20 billion in annual claim payouts in recent years per insurance industry reporting. Despite the scale of the loss, three operational gaps persist for property-level decision-making:
- Temporal lag. NOAA's finalized hail-event datasets (Storm Events, SWDI radar) carry a 60–90 day quality-control lag. A roof hit on June 15 may not appear in finalized records until mid-September. Adjusters, contractors, and homeowners need an answer the day after the storm.
- Spatial granularity. Most existing hail-event lookups operate at the storm-cell or city level, not the property level. A single supercell may produce dramatically different impacts on properties three blocks apart.
- Integration of disparate feeds. Severe-weather data exists across at least six NOAA/NWS publications, each with different latency, spatial resolution, and confidence characteristics. A score that synthesizes them must be explicit about how.
HailScore is built to close those three gaps. It ingests live and finalized data continuously, scores at the geocoded street-address level, and publishes its full methodology — this document — so that downstream users can audit the inputs and reproduce the outputs.
3. Data sources
Every HailScore is derived from one or more of the following sources. All are publicly available and cited individually on every generated report.
| Source | Publisher | Latency | Role in scoring |
|---|---|---|---|
| MRMS MESH | NOAA NCEP | < 2 hr | Live radar-derived hail size |
| NEXRAD / SWDI | NOAA NCEI | 60–90 day | Finalized radar-derived events |
| Storm Events | NOAA NCEI | 60–90 day | Ground-truth verified events |
| SPC LSR | NOAA SPC | Hours | Preliminary ground reports |
| NWS Alerts | NWS | Real-time | Active warning polygons |
| CoCoRaHS | CSU/CIRES | Hours–days | Volunteer-observed hail size |
3.1 NOAA MRMS — Multi-Radar Multi-Sensor (live)
The Multi-Radar Multi-Sensor system at NOAA's National Centers for Environmental Prediction (NCEP) fuses every NEXRAD WSR-88D radar in CONUS into a continuous 0.01° (~1 km) grid updated every two minutes. The product HailScore ingests is MESH_Max_1440min: maximum estimated hail size at each grid cell over the trailing 24 hours, expressed in millimeters and converted to inches.
We pull MESH grids every 4 hours from https://mrms.ncep.noaa.gov/data/2D/MESH_Max_1440min/. Cells with values ≥ 0.75″ within the CONUS land bbox are written to our mrms_mesh table with the grid's valid-time timestamp. Latency from radar observation to a row in our database is typically under two hours, including ingest interval and processing time.
The MESH algorithm itself is documented in Witt et al. (1998) and the WSR-88D Build documentation maintained by the NWS Radar Operations Center. Estimation skill for MESH degrades for hail sizes above approximately 3.0 inches, where saturation effects in the underlying reflectivity moment become significant; HailScore reflects this by capping the size-score contribution at the same threshold (§4.1).
3.2 NEXRAD via SWDI (finalized radar)
The Severe Weather Data Inventory (SWDI) published by NOAA's National Centers for Environmental Information (NCEI) provides finalized NEXRAD Level-III hail-signature records (nx3hail) after a 60–90 day quality-control review. HailScore has ingested every nx3hail record ≥ 0.75″ for the contiguous US from 2015 onward, yielding 4.7M+ rows in our radar_hail table. This dataset is the historical backbone of the score and is continuously appended as SWDI finalizes more recent quarters.
3.3 NOAA Storm Events Database
The Storm Events Database aggregates spotter reports, emergency-management reports, and law-enforcement observations of hail events ≥ 0.75″, after quality control by NCEI. HailScore uses these as ground truth for event verification (§4.4) and for the largest-event narrative on each report. Approximately 12,500+ verified hail events are currently indexed.
3.4 SPC Local Storm Reports (LSR)
The Storm Prediction Center publishes preliminary ground reports within hours of observation. We poll the day and previous-day CSV exports continuously. These reports are not as quality-controlled as Storm Events but provide significant temporal advantage and serve as a partial bridge in the gap before MESH/NEXRAD finalization.
3.5 NWS Active Alerts (warning polygons)
The NWS API publishes Severe Thunderstorm Warnings and Tornado Warnings with explicit polygon geometry and parsed parameters including maxHailSize and maxWindGust. We poll api.weather.gov/alerts/active every 60 seconds during the April–September hail season. When a polygon contains a queried address and the alert is unexpired, the report surfaces a real-time warning banner. These alerts do not directly enter the score but are surfaced to the user.
3.6 CoCoRaHS
The Community Collaborative Rain, Hail and Snow Network is a volunteer-staffed precipitation observation network coordinated by Colorado State University and the Cooperative Institute for Research in the Environmental Sciences. Observers record hail size at their specific property after each event. CoCoRaHS reports supplement SPC and Storm Events ground truth at finer spatial resolution.
4. Scoring algorithm
The HailScore is the sum of four weighted components plus a cumulative-damage bonus, optionally multiplied by a roof-material factor and clipped to 0–100. The components are:
- Hail size — magnitude of the most damaging event (up to 40 points)
- Frequency — how many qualifying events have occurred (up to 40 points)
- Recency — temporal weighting of the most recent damaging event (up to 20 points)
- Cumulative damage — total weighted hail volume across all events (up to 5 bonus points)
Constants below mirror src/lib/risk-score.ts in the production codebase and are stable across all v5 scores.
4.1 Hail size contribution
For each event near the property, the hail-size points are computed as a piecewise function of the estimated diameter in inches:
hailSizeScore(d) = if d <= 0.75 → d × 0.40 # negligible if d <= 2.00 → 0.30 + (d − 0.75) × 0.42 else → min(1, 0.83 + (d − 2.0) × 0.07)
The function is intentionally non-linear: insurance industry damage thresholds begin near 1.0″, escalate sharply between 1.5″ and 2.0″ where shingle puncture and metal denting become common, and saturate above ~3.0″ where total replacement is essentially certain regardless of additional size.
The hail-size contribution to the final score is the maximum over all events, weighted by distance decay:
weightedHailScore = max over events of [ hailSizeScore(d) × sqrt(distanceDecay) ] hailPoints = min(40, weightedHailScore × 40)
4.2 Frequency contribution
Frequency captures cumulative storm exposure. Each event contributes its full distance-and-recency-weighted value, summed across all events in the lookup window. The total is compressed via log-scaling so that a property with five events does not receive five times the points of a property with one.
frequencyScore = sum over events of [ distanceDecay × recencyDecay ] freqPoints = min(40, log2(1 + frequencyScore) / log2(1 + 50) × 40)
At the calibrated denominator of 50, a single perfectly-weighted event yields ≈ 5 points; ten events yield ≈ 22 points; fifty events approach the 40-point cap.
4.3 Recency contribution
Recency uses an exponential decay with a 10-year half-life, modulated by the roof's age. For a roof installed within the decay window, the effective half-life is shortened proportionally so that scoring is normalized to the roof's lifetime:
recencyDecay(daysAgo, halfLife) = exp(−0.693 × (daysAgo / 365) / halfLife) effectiveHalfLife = max(2, min(10, roofAgeYears × 0.8)) recencyScore = max over events of [ recencyDecay × hailSizeScore ] recPoints = min(20, recencyScore × 20)
4.4 Distance decay
All event contributions are weighted by a steep exponential distance decay measured from event coordinates to the geocoded property location:
distanceDecay(miles) = exp(−1.5 × miles)
At this rate, a storm 0.25 miles away contributes 69% of its full weight, 0.5 miles → 47%, 1.0 mile → 22%, 2.0 miles → 5%, 3.0 miles → 1%. The steepness reflects that hail swaths are typically 0.5–2 miles wide and damage attenuates rapidly beyond the swath core. The lookup radius is 8 miles, beyond which any event's contribution is effectively zero.
4.5 Cumulative damage bonus
In Colorado specifically, our calibration data showed that repeated moderate hail accumulates more total damage than a single severe event. A 5-point bonus is added for cumulative weighted hail volume:
cumulativeHailVolume = sum over events of [ magnitude × distanceDecay × recencyDecay ] cumBonus = min(5, log2(1 + cumulativeHailVolume) / log2(1 + 100) × 5)
4.6 Roof material multiplier
After raw scoring, a material-based multiplier is applied to reflect documented differences in hail impact resistance and — critically — the financial-exposure asymmetry created by insurance matching-of-materials clauses.
| Material | Multiplier | Rationale |
|---|---|---|
| 3-tab asphalt (legacy) | 1.30 | Largely discontinued since the mid-2010s; matching-of-materials clauses typically trigger full replacement on damage |
| Wood shake | 1.25 | Splits readily; matching also often impossible |
| Architectural shingle | 1.00 | Modern US residential standard — Class 3 by default per UL 2218 manufacturing |
| Flat (TPO/EPDM) | 0.85 | Membrane is more impact-resistant than asphalt for typical hail sizes |
| Class 4 IR shingle | 0.65 | UL 2218 Class 4 — highest impact rating, qualifies for 10–28% carrier premium discounts |
| Metal | 0.60 | Dents but rarely fails structurally |
| Tile / slate | 0.50 | Highest natural hail resistance |
Note that modern architectural asphalt shingles are typically Class 3 under UL 2218 by default — Class 3 is not surfaced as a separate tier because it equates to the baseline. Class 4 is the explicit upgrade product line carriers reward with premium discounts. 3-tab is split out because its near-discontinuation makes it materially different from a claims-outcome perspective: any qualifying damage usually forces full roof replacement, regardless of how localized the damage is.
4.7 Final score and tier mapping
rawScore = hailPoints + freqPoints + recPoints + cumBonus finalScore = clip(rawScore × materialMultiplier, 0, 100) tier = Very High if score >= 76 High if score >= 51 Moderate if score >= 26 Low otherwise
The score is computed server-side on every /api/lookup request. The same address, with the same roof inputs and the same data state, will always produce the same score.
5. Data pipeline
HailScore is hosted on Vercel with a Neon PostgreSQL 17 + PostGIS 3.5 backend in US East 1. Ingestion runs from two independent compute environments for redundancy:
- MRMS ingest — Python pipeline (eccodes + pygrib + psycopg) executes every 4 hours via GitHub Actions and via macOS launchd in parallel. Both writers target the same mrms_mesh table; a UNIQUE constraint on (observed_at, product, lat, lon) makes duplicate inserts no-ops.
- NWS alerts poll — TypeScript script polls the active-alerts feed every 60 seconds during hail season (April–September), upserting polygon geometry, parsed hail size, and expiration to storm_alerts.
- SWDI batch — periodic backfill of finalized NEXRAD hail records as NOAA publishes additional quarters.
- Storm Events + CoCoRaHS + SPC LSR — periodic synchronized batch updates.
On a lookup request, the address is geocoded via Mapbox to lat/lon. Six parallel PostGIS queries (storm_events, radar_hail, mrms_mesh, spc_hail_reports, cocorahs_reports, storm_alerts) return all events within 8 miles. Results are deduplicated, scored per §4, and persisted to the scores table. Median end-to-end response time is under 500 ms when cached and under 3 s on cold lookups including external API enrichment.
Every score record retains the lat/lon, roof inputs, score, tier, and a snapshot of the storm-event count and largest hail size at the time of computation. This enables reproducibility audits and forms the foundation of the validation roadmap described in §7.
6. Calibration
The v4 calibration of February 24, 2026 was performed against a reference set of 4,109 Colorado properties with confirmed hail damage outcomes (insurance claims approved, source: contractor partner). The objective was to produce scores that meaningfully discriminated damaged from non-damaged properties without generating excessive false positives.
Selected pre- and post-calibration statistics across the reference set:
| Metric | v3 (pre) | v4 (post) |
|---|---|---|
| Mean score | 37.9 | 48.4 |
| High+ tier rate | 3% | 51% |
| Target high+ rate | 60–75% | (achieved) |
Key constant changes between v3 and v4: hail-size curve relaxed from x2.2 to x1.5; frequency multiplier raised from 0.2 to 0.5; recency half-life extended from 5 years to 8 years (later raised to 10 in v5); distance-decay half-life set at 2.5 miles with square-root penalty for the best event.
The v5 update of May 14, 2026 added MRMS live data to the recency component. Internal calibration showed a surgical impact: only properties with recent (≤90 day) MRMS events showed score changes; the average shift across a heterogeneous test panel was +1.13 points, with maximum +9 for a Texas property in an active hail corridor and zero change for Colorado Front Range properties without recent qualifying events.
7. Validation roadmap
Calibration against a single retrospective panel is necessary but not sufficient. HailScore is committed to publishing prospective validation results on a quarterly cadence beginning in 2026 Q3.
The validation methodology will leverage the lead_outcomes schema, which captures inspection results, claim filing status, claim approval, and replacement cost data for properties scored by HailScore. Each row links a HailScore prediction at time T to a verified outcome at time T+N, where N is the time to inspection or claim disposition.
Initial validation targets include:
- Claim-approval rate stratified by HailScore tier at lookup time
- Median time from score lookup to insurance claim filing
- Comparison of HailScore predictions against contractor inspector findings
- False-positive and false-negative rates against ground-truth Storm Events records
Validation results will be published as appendices to this document. Cohort sizes, methodology, and confidence intervals will be reported in full. We invite independent replication and welcome corrections at myhailscore@gmail.com.
8. Known limitations
- MESH saturation above 3.0″. Radar-derived hail size estimates lose discriminating power above approximately 3.0 inches. HailScore caps the size-score contribution accordingly; however, very large hail events (4.0″+) are scored identically to events near 3.0″. Storm Events ground truth is preferred for these cases when available.
- Geocoding precision. Address geocoding via Mapbox occasionally returns parcel-centroid rather than street-front coordinates. Within dense urban grids this is typically < 30 meters and does not affect score; in rural areas the error may exceed 200 meters.
- Property-level damage variation. Two adjacent properties may experience materially different damage outcomes from the same storm due to tree cover, building orientation, roof slope, and shingle age. HailScore quantifies exposure, not damage. The AI-assisted photo inspection in HailScore Pro is an experimental complement; it is not a substitute for licensed contractor inspection.
- Roof inputs are user-provided. Roof age and material on the free homeowner tier are self-reported. Scores are computed as if the inputs are accurate; users who under- or over-report roof age receive proportionally biased scores.
- Coverage gaps. NEXRAD coverage is excellent over CONUS but degrades in mountainous terrain and along coastal fringes. CoCoRaHS density varies by state. HailScore reports a confidence indicator that reflects coverage density at the lookup location.
- This is not a regulatory or insurance underwriting decision. HailScore is informational. It does not constitute an insurance binding decision, an actuarial determination, or a structural engineering opinion. Use in underwriting requires separate validation appropriate to the jurisdiction and carrier.
9. Governance & versioning
The scoring algorithm is versioned. Each version is recorded in the scores table at the time of computation. Algorithm changes require explicit review, a validation run against a holdout panel, and a documented changelog entry. Silent algorithm changes are explicitly prohibited by internal engineering policy.
| Version | Date | Notable changes |
|---|---|---|
| v3 | Q1 2026 | Distance/recency reweighting; CO corridor boost added |
| v4 | 2026-02-24 | Hail-size curve relaxed; calibration against 4,109 confirmed-damage panel |
| v5 | 2026-05-14 | MRMS live data incorporated into recency component |
| v6 | 2026-05-15 | Material multipliers refined: 3-tab (1.30) and Class 4 IR (0.65) added; flat corrected from 1.10 → 0.85. Zero retroactive impact on existing scores (no flat-roof records in the calibration panel). |
HailScore is published by Hailscore LLC, a Colorado limited liability company. Data is hosted in Neon PostgreSQL (US East 1) with at-rest encryption. Application infrastructure runs on Vercel with TLS 1.2+ in transit. Subprocessors include Neon, Vercel, Resend, Mapbox, and Anthropic. SOC 2 readiness is in progress; current security posture is documented at /security.
10. Glossary & references
Glossary
- MESH
- : Maximum Estimated Size of Hail. NOAA NEXRAD radar-derived hail-diameter estimate, in millimeters or inches.
- MRMS
- : Multi-Radar Multi-Sensor. NOAA NCEP product fusing all NEXRAD radars into a continuous CONUS grid.
- NEXRAD
- : Next Generation Weather Radar. 160-station network of WSR-88D Doppler radars operated by NWS, FAA, and DoD.
- SWDI
- : Severe Weather Data Inventory. NOAA NCEI service publishing finalized radar and storm-report data.
- LSR
- : Local Storm Report. SPC publication of preliminary observer reports.
- CoCoRaHS
- : Community Collaborative Rain, Hail and Snow Network. Volunteer precipitation observation network.
- NCEP / NCEI / NWS / SPC
- : NOAA centers (National Centers for Environmental Prediction / Environmental Information; National Weather Service; Storm Prediction Center).
References
- Witt, A., et al. (1998). An Enhanced Hail Detection Algorithm for the WSR-88D. Weather and Forecasting, 13(2), 286–303.
- NOAA MRMS documentation: https://www.nssl.noaa.gov/projects/mrms/
- NOAA Storm Events Database: https://www.ncdc.noaa.gov/stormevents/
- NCEI SWDI API: https://www.ncei.noaa.gov/pub/data/swdi/
- NWS API documentation: https://www.weather.gov/documentation/services-web-api
- CoCoRaHS: https://www.cocorahs.org/
Authors & acknowledgments
Alex Chicilo · Founder, Hailscore LLC. 25+ years in residential roofing and storm restoration. Author of the scoring algorithm and platform engineering.
Tina Ryan · Industry advisor. Recognized leader in roofing technology, storm-restoration operations, and contractor education. Strategic and methodological input throughout v3, v4, and v5 calibration cycles.
The HailScore methodology is sharpened by ongoing input from the insurance and roofing communities. We invite formal collaboration with carriers, adjusters, public adjusters, and academic researchers. Replication, critique, and proposed improvements are explicitly welcomed.
Citation suggestion: Chicilo, A. & Ryan, T. (2026). HailScore™ Methodology, version v6. Hailscore LLC. https://www.myhailscore.com/methodology
This document is published under the assumption that public methodology produces better outcomes for homeowners, contractors, adjusters, and carriers alike. Errors, suggested clarifications, and replication results are welcomed at myhailscore@gmail.com.