Regression Detection
Every scan Site Health runs is automatically compared to the previous completed scan for that site. If anything meaningful got worse, you get an email — unprompted, no configuration required.
When it runs
After a scan finishes, the worker calls detectRegressions() before any other post-scan step. It fetches the most recent previously-completed scan for the same site and diffs the two.
No previous scan? No comparison, no email — this is always the case for the very first scan on a site.
What counts as a regression
A scan is flagged as regressed if any of the following are true:
| Condition | Threshold |
|---|---|
| Performance score drop | More than 5 points |
| SEO score drop | More than 5 points |
| Accessibility score drop | More than 5 points |
| Best Practices score drop | More than 5 points |
| LCP crossed "poor" | Previous ≤ 2500ms, current > 2500ms |
| CLS crossed "poor" | Previous ≤ 0.1, current > 0.1 |
| INP crossed "poor" | Previous ≤ 200ms, current > 200ms |
The 5-point threshold is deliberate — PSI scores jitter 2-4 points run-to-run even on unchanged code. 5+ is real signal.
The alert email
If regressions are detected, sendRegressionAlert() fires an email to your account address. It includes:
- Top-line site scores before vs. after with delta.
- Page-level delta table — every page where at least one metric moved materially, so you can pinpoint the change to specific URLs.
- A link straight to the scan detail page for follow-up.
Subject line:
[Site Health] Regressions detected on {siteName}
Why deltas matter more than thresholds
Alert rules catch absolute state: "Performance must stay above 80." Regression detection catches change: "Performance dropped 8 points since yesterday." Both have their place.
A site can be at 92 Performance and regressing — the alert rule is silent, but you shipped something that made things worse. That's what regression detection catches.
Enable scheduled scans so regression detection has fresh baselines to compare against. Better yet, register the Webflow publish webhook so every publish gets compared to the pre-publish state.
What it doesn't do (yet)
- No per-metric sensitivity (you can't say "only alert me if Performance drops > 10 but SEO drops > 3").
- No Slack/Discord output — email only.
- No escalation/repeat suppression — you'll get one email per scan that regresses, even if the root cause is the same as yesterday.
Want any of these? Drop a note via Feedback.