Skip to main content

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:

ConditionThreshold
Performance score dropMore than 5 points
SEO score dropMore than 5 points
Accessibility score dropMore than 5 points
Best Practices score dropMore 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.

Pair with automation

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.