Pre-Deploy Performance Checklist
A practical checklist to run before every production deploy to catch performance regressions before your users do.
Performance regressions are far easier to catch before deploy than after. A 5-minute pre-deploy check can prevent a 2-hour incident response when someone notices the site slowed down.
Here’s the checklist we recommend running before pushing to production.
Quick Pre-Deploy Checks (5 minutes)
Run a speed test on staging
Test your staging URL against debugutils.dev before deploying. Compare the results to your last production test. Look for:
- Performance score drop > 5 points
- LCP increase > 0.5s
- New render-blocking resources
- Significant increase in total page weight
- New third-party script domains in the waterfall
Verify image optimization
Open the waterfall and filter to images. Check:
- Hero/LCP image is WebP or AVIF
- Images have explicit
widthandheightattributes - Only above-fold images are eagerly loaded; others use
loading="lazy" - No images over 200KB in the initial load — see our image optimization guide
- LCP image has
fetchpriority="high"
Check for render-blocking resources
Look at the critical rendering path in the waterfall. Check:
- No synchronous JavaScript in
<head>(must havedeferorasync) - Critical CSS is inlined or preloaded
- No new stylesheets added to the critical path
Verify caching headers
Check the response headers for static assets:
- CSS and JS files have long-lived cache headers (e.g.,
max-age=31536000) - Assets use content-hashed filenames for cache busting
- Fonts have cache headers set
- Main HTML has appropriate short-TTL headers
Lighthouse Score Thresholds
Use performance budgets to formalize these numbers. Before every production deploy, verify:
| Metric | Minimum |
|---|---|
| Performance (mobile) | ≥ 70 |
| LCP | < 2.5s |
| CLS | < 0.1 |
| TBT | < 300ms |
| Accessibility | ≥ 80 |
If any threshold fails, investigate before deploying.
New Feature Checklist
When deploying a new feature:
Images and media
- All new images specify
widthandheight - New images use WebP/AVIF format
- New images are sized appropriately for their display context
- New video uses
preload="none"unless critical
JavaScript
- New JS dependencies checked with Bundlephobia for size impact
- New third-party scripts added with
asyncordefer - No synchronous API calls blocking the main thread
- Code splitting applied for new large components
CSS
- No new layout-affecting animations (use
transforminstead) - No new CSS that sets fixed heights on dynamic content
- No new external fonts without preload hints
Third-party integrations
- New tracking scripts, chat widgets, or embeds approved
- Added with
async/defer— never in<head>without a plan - Estimated TBT impact reviewed
After Deploying
- Run debugutils.dev on production immediately after deploy
- Compare to pre-deploy staging test
- Check CrUX data in PageSpeed Insights 4 weeks later (field data lags)
- Update your baseline test results for next comparison
Automating This
Integrate Lighthouse into CI/CD to fail builds that miss thresholds:
# Example: GitHub Actions with lighthouse-ci
- name: Run Lighthouse CI
run: |
npm install -g @lhci/cli
lhci autorun
env:
LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }}
Configure .lighthouserc.js with your thresholds. See lighthouse-cicd pipeline guide for a complete setup.
Manual testing on debugutils.dev gives you richer diagnostic data (waterfall, CrUX, video) than Lighthouse CI alone — use both.