Vercel deploy finished but the site didn’t update? Use this checklist

Vercel shows a green check, but the browser still serves stale pages. That usually means a cache, DNS, or operational gap—not a mysterious bug. Below is a practical, high-repro checklist arranged from viewer-side to delivery to build/app so you can isolate the culprit without endless redeploys.
Start here (highest priority)
1) Verify you’re on the Production URL
- Make sure you aren’t viewing a Preview Deployment link.
- In the Vercel dashboard, confirm the latest deployment is tied to Production.
- If you use Promote flows, check that the intended preview was promoted.
2) Kill browser cache first
- Open a private/incognito window and hard-reload.
- If possible, test from another network or device.
3) Rule out external CDN/DNS
- If Cloudflare or another CDN fronts Vercel, purge/disable its cache temporarily.
- Confirm the domain’s DNS points to the latest Production Deployment (no stale CNAME/IP).
- Try hitting from another region to see if only some edges are stale.
When the cache is stuck on Vercel’s side
Edge Network cache (global CDN)
- Vercel’s own edge may serve older assets regionally right after deploy.
- Double caching is common when an external CDN sits in front of Vercel. Fix: Temporarily bypass the external CDN and compare regions.
Data cache / Next.js data cache
- Common symptom: HTML updates, but data shown is old.
- Causes:
fetchcache, ISR settings, orrevalidateintervals. - If revalidation fails, stale data keeps serving;
revalidateTag/Pathis not magic. Fix: Trigger revalidation, check logs, and consider shorterrevalidateor on-demand revalidation.
Operational oversights to check
Not promoted
- A successful build isn’t production until promoted (when using Promote flows).
Build cache hiding changes
- Re-deploying the same commit can reuse the build cache and hide asset changes.
- Disable build cache for the redeploy, or use
VERCEL --force/VERCEL_FORCE_NO_BUILD_CACHE=1.
Git integration gaps
- The commit might not be in the Production branch, or deploys might be blocked by team/permission rules.
- Confirm the deployment for the commit exists and is marked Production in the Vercel dashboard.
Next.js (ISR/App Router) specifics
ISR regeneration failing
- If regeneration throws, the old page keeps serving. Check function and build logs for the route.
Cache-layer mismatch
- Determine whether the stale part is the rendered HTML or the fetched data. Fix the exact layer instead of redeploying blindly.
Quick isolation flow
- Confirm Production URL → browser cache → external CDN/DNS.
- Then check Vercel edge/data cache behavior.
- Finally validate Promote/build cache/Git and ISR design.
Most “not reflected” cases are cache-layer drift or an operational miss. Follow the order above and you can resolve calmly without repetitive deployments.