The short version
89%
On test nights the engine put at 80% or higher, school closed on 147 of 166.
99.98%
On test days the engine put at 0%, school was open on 9,987 of 9,989.
60%
of the 324 snow days had a chance of 50% or higher the night before. At 30% or higher, it was 235 (73%).
It doesn't get there by calling a snow day every time it snows. On the 11,855 test days that had school, the engine gave 50% or more only 56 times.
Why we don't give one accuracy percentage
Snow days are rare. School was open on 97.3% of these test days, so a site that always said "no snow day" would be 97.3% accurate and would never warn you about anything. The useful questions are whether our chances come true as often as they say, how many snow days we saw coming, and how many false alarms we raised. The rest of this page answers them.
When we say 30%, does it mean 30%?
A chance only means something over many nights. Take every night the engine gives about 30%: if that number is honest, about 3 in 10 of those nights should end in a snow day. The chart puts each range of chances against what actually happened in our tests. Dots on the dashed line came true exactly as often as they said.
The numbers behind the chart
| Chance range | Nights | Average chance | School closed |
|---|---|---|---|
| Current engine, 0-5% | 11,382 | 0% | 0% |
| Current engine, 5-15% | 314 | 9% | 12% |
| Current engine, 15-30% | 152 | 21% | 22% |
| Current engine, 30-50% | 82 | 40% | 51% |
| Current engine, 50-70% | 54 | 59% | 46% |
| Current engine, 70-100% | 195 | 91% | 86% |
| Previous engine, 0-5% | 8,655 | 0% | 0% |
| Previous engine, 5-15% | 1,864 | 9% | 1% |
| Previous engine, 15-30% | 566 | 21% | 2% |
| Previous engine, 30-50% | 286 | 40% | 5% |
| Previous engine, 50-70% | 393 | 61% | 16% |
| Previous engine, 70-100% | 415 | 86% | 46% |
The previous engine, the hollow dots, sat well below the line: on nights it put at 70-100%, school closed 46% of the time. The current engine stays close to the line. At the very top it runs a little high: nights where it averaged 91% closed 86% of the time.
By the message you see on the site
| Chance shown | Message | School days | School closed |
|---|---|---|---|
| 0% | No snow day in sight | 9,989 | 0% |
| 1-19% | Snow day is unlikely | 1,762 | 4% |
| 20-39% | Probably heading to school | 134 | 28% |
| 40-59% | It's a toss-up | 74 | 51% |
| 60-79% | Looking promising | 54 | 61% |
| 80-100% | Bundle up! High chance | 166 | 89% |
At 9 PM the night before. Ranges with fewer days, like 60-79%, move more from winter to winter.
Night before or morning of?
| 9 PM the night before | 5 AM the morning of | |
|---|---|---|
| Snow days seen coming (50% or higher) | 193 of 324 | 186 of 324 |
| False alarms (50% or higher, school open) | 56 | 52 |
| Snow days expected (there were 324) | 331 | 320 |
| Brier skill score | +0.58 | +0.56 |
Checking at 5 AM is about as accurate as checking at 9 PM. Most of what decides a closure is already in the evening forecast, and plenty of districts make the call the night before. The morning number is still worth a look when a storm arrives overnight.
A few days ahead
| Night before | Two days ahead | Three days ahead | |
|---|---|---|---|
| Snow days seen coming (50% or higher) | 193 | 172 | 136 |
| False alarms | 56 | 64 | 63 |
| Brier skill score | +0.58 | +0.47 | +0.40 |
The further out, the less certain, because the weather forecast itself is less certain.
Old engine, new engine
In October 2026 we replaced the engine behind every prediction. Here are both on the same 12,179 school days, scored at 9 PM the night before.
| Previous engine | Current engine | |
|---|---|---|
| Snow days expected (there were 324) | 988 | 331 |
| Nights shown at 50% or higher | 808 | 249 |
| Of those, school closed | 252 (31%) | 193 (78%) |
| False alarms | 556 | 56 |
| Brier skill score | -0.37 | +0.58 |
The old engine caught 59 more snow days at the 50% line only because it called one 3.2 times as often. Counting every night the new engine gave 15% or more, it saw 268 snow days coming with 215 false alarms. The old engine needed 556 false alarms to catch 252. A negative skill score means the old numbers were less useful than always showing the average closure rate.
How we tested it
- This is a test on past winters, not a log of what the site showed at the time: we ran today's engine on each evening as it looked then.
- Every school day from November through March in the winters of 2023-24, 2024-25 and 2025-26. Some districts have fewer winters, because we scored only the ones with a complete record.
- 54 school districts and boards, 42 in the US and 12 in Canada, listed at the bottom of this page.
- For each day, the chance the site would have shown at 9 PM the night before and at 5 AM, using only forecasts and weather alerts that had been published by then.
- Each district was scored by a version of the engine built without it, and leaving out whole winters instead gives nearly the same results. We also used these tests to choose between versions, so the scores may run slightly high.
- Closure dates come from public announcements.
- Holidays, breaks and other scheduled days off don't count. Delayed starts are scored on their own: in the 9 districts whose records list them, we expected 45 and there were 45.
- In Ontario a snow day usually means buses are canceled while schools stay open, so there either one counts.
Where it's weaker
- Closures for extreme cold. On the 33 days districts closed for cold alone, our average chance the night before was 30%. Districts set very different cold limits.
- Ice storms. On 44 ice closures we averaged 53%. A degree either way decides whether rain freezes on the roads.
- Closures that drag on after a storm. When roads stay icy for days, districts decide one morning at a time, and the forecast alone can't say when they'll reopen.
- Districts we haven't tested. The record on this page covers 54 districts. Everywhere else gets the same engine, but we can't show you a local track record yet.
- Canada. 12 of the 54 districts are Canadian boards, so these numbers lean on US winters. The Canadian tests also used a slightly different forecast than the site reads there, so treat them as a close estimate.
The full numbers
| Brier score | Brier skill | Log loss | ROC AUC | Expected / actual | |
|---|---|---|---|---|---|
| 9 PM, night before | 0.0109 (0.0087 to 0.0132) | +0.577 (0.509 to 0.641) | 0.0380 (0.0307 to 0.0456) | 0.988 (0.984 to 0.992) | 331 / 324 |
| 5 AM, morning of | 0.0114 (0.0091 to 0.0138) | +0.562 (0.491 to 0.630) | 0.0396 (0.0319 to 0.0477) | 0.986 (0.981 to 0.991) | 320 / 324 |
| 2 days ahead | 0.0136 | +0.475 | 0.0492 | 0.978 | 310 / 324 |
| 3 days ahead | 0.0156 | +0.400 | 0.0554 | 0.972 | 315 / 324 |
| Previous engine, 9 PM | 0.0355 | -0.372 | 0.1325 | 0.918 | 988 / 324 |
- Brier score:
- the average squared gap between the chance shown and what happened (1 for a snow day, 0 for school). 0 is perfect.
- Brier skill:
- the share of the Brier score removed compared with always showing the overall closure rate, 2.7% here. 0 is no better than that, 1 is perfect.
- Log loss:
- the average of -ln(the chance given to what actually happened), with chances held between 0.01% and 99.99% so one miss can't count as infinite. Confident misses cost the most. Lower is better.
- ROC AUC:
- pick one snow day and one school day at random; this is how often the snow day had the higher chance, with ties counting half. Pooling very different places makes it easier to score high.
- Expected:
- the sum of every chance shown. When the chances are honest, it lands close to the real count.
Each row scores each school day once: 12,179 days and 324 closures, with a few days missing from the three-days-ahead row where no forecast was on file. Ranges in parentheses are 95% intervals from resampling whole districts, where we have them.
Districts in our tests
Scored at 9 PM the night before, each by a version of the engine built without that district. "Seen coming" counts snow days the engine put at 50% or higher.
| District | State or province | School days | Snow days | Expected | Seen coming | False alarms |
|---|---|---|---|---|---|---|
| Little Rock School District | AR | 179 | 10 | 10.4 | 9 | 2 |
| Denver Public Schools | CO | 274 | 4 | 4.9 | 4 | 0 |
| District of Columbia Public Schools | DC | 257 | 7 | 14.1 | 6 | 7 |
| Atlanta Public Schools | GA | 261 | 5 | 6.9 | 3 | 3 |
| Chicago Public Schools | IL | 265 | 2 | 7.7 | 1 | 3 |
| Jefferson County Public Schools | KY | 179 | 10 | 10.7 | 7 | 3 |
| Jefferson Parish Schools | LA | 255 | 6 | 5.3 | 4 | 0 |
| Boston Public Schools | MA | 262 | 5 | 5.3 | 4 | 0 |
| Cambridge Public Schools | MA | 262 | 5 | 6.0 | 4 | 1 |
| Newton Public Schools | MA | 173 | 4 | 5.4 | 4 | 1 |
| Worcester Public Schools | MA | 175 | 6 | 2.6 | 1 | 0 |
| Baltimore City Public Schools | MD | 272 | 11 | 5.8 | 4 | 0 |
| Montgomery County Public Schools (Maryland) | MD | 256 | 13 | 10.2 | 7 | 0 |
| Portland Public Schools (Maine) | ME | 259 | 7 | 8.0 | 2 | 3 |
| Detroit Public Schools Community District | MI | 257 | 9 | 3.8 | 0 | 1 |
| Minneapolis Public Schools | MN | 264 | 4 | 7.2 | 2 | 3 |
| Rochester Public Schools (Minnesota) | MN | 266 | 6 | 5.3 | 3 | 0 |
| Kansas City Public Schools | MO | 82 | 5 | 5.7 | 5 | 1 |
| Buncombe County Schools | NC | 170 | 13 | 4.7 | 3 | 0 |
| Charlotte-Mecklenburg Schools | NC | 264 | 9 | 7.8 | 5 | 1 |
| Lincoln Public Schools | NE | 265 | 10 | 10.0 | 5 | 3 |
| Manchester School District (New Hampshire) | NH | 162 | 6 | 5.7 | 4 | 2 |
| Newark Public Schools | NJ | 84 | 3 | 2.6 | 2 | 0 |
| Buffalo Public Schools | NY | 262 | 14 | 15.2 | 9 | 3 |
| New York City Public Schools | NY | 255 | 3 | 4.7 | 3 | 0 |
| Rochester City School District | NY | 257 | 5 | 6.7 | 3 | 1 |
| Syracuse City School District | NY | 87 | 4 | 4.3 | 1 | 2 |
| Tulsa Public Schools | OK | 274 | 14 | 12.5 | 11 | 1 |
| Portland Public Schools | OR | 240 | 6 | 6.7 | 6 | 0 |
| School District of Philadelphia | PA | 259 | 8 | 11.5 | 6 | 3 |
| Memphis-Shelby County Schools | TN | 170 | 15 | 11.2 | 10 | 0 |
| Metro Nashville Public Schools | TN | 262 | 13 | 14.2 | 11 | 1 |
| Austin Independent School District | TX | 236 | 3 | 4.7 | 3 | 1 |
| Dallas Independent School District | TX | 268 | 7 | 9.1 | 7 | 2 |
| El Paso Independent School District | TX | 266 | 1 | 1.7 | 1 | 0 |
| Houston Independent School District | TX | 160 | 2 | 0.8 | 0 | 0 |
| Northside Independent School District | TX | 244 | 2 | 3.4 | 2 | 0 |
| Salt Lake City School District | UT | 181 | 0 | 0.9 | 0 | 0 |
| Fairfax County Public Schools | VA | 240 | 10 | 8.1 | 6 | 0 |
| Virginia Beach City Public Schools | VA | 88 | 0 | 0.2 | 0 | 0 |
| Bellevue School District | WA | 170 | 2 | 0.7 | 0 | 0 |
| Milwaukee Public Schools | WI | 182 | 5 | 5.1 | 2 | 1 |
| Calgary Board of Education | AB | 242 | 0 | 1.2 | 0 | 0 |
| Edmonton Public Schools | AB | 248 | 0 | 3.7 | 0 | 2 |
| Vancouver School Board | BC | 249 | 2 | 1.2 | 0 | 1 |
| Winnipeg School Division | MB | 264 | 1 | 2.6 | 0 | 1 |
| Anglophone South School District | NB | 165 | 5 | 3.6 | 2 | 0 |
| Halifax Regional Centre for Education | NS | 250 | 9 | 6.2 | 4 | 0 |
| Hamilton-Wentworth District School Board | ON | 276 | 5 | 5.1 | 2 | 0 |
| Ottawa (OCDSB and OCSB, OSTA buses) | ON | 277 | 8 | 8.2 | 3 | 2 |
| Peel District School Board | ON | 180 | 4 | 6.3 | 4 | 0 |
| Toronto District School Board | ON | 275 | 4 | 5.1 | 4 | 0 |
| Waterloo Region District School Board | ON | 264 | 9 | 5.7 | 2 | 0 |
| Centre de services scolaire de Montreal | QC | 245 | 3 | 4.3 | 2 | 1 |
Past winters don't guarantee the next one: every season brings storms that behave differently. Always confirm a closure with your school or district.