Troubleshooting
Fix common DNS, TLS, cache, and WAF issues on Easel.
Use this page when a deploy is up but the site, cache, or firewall does not behave as expected. For framework and build limits, see Frameworks and limits.
Custom domain does not go live
- Confirm the DNS records match what Project settings → Custom Domains shows (CNAME for subdomains, A for apex).
- Wait for DNS propagation. Some providers finish in a few minutes; others take longer.
- Check domain status in the dashboard. It must leave pending DNS before TLS can finish.
- Open the hostname over
https://after status shows live.
See Custom domains for the full setup flow.
First HTTPS request fails after pointing DNS
The first request after DNS points at Easel can fail until the certificate is ready. Wait a short time and retry. Later requests use the provisioned certificate. Details: Encryption.
Preview URL works but custom domain does not
Custom domains serve production only. Confirm you pushed to the production branch and that production is healthy on the generated production URL first. See Environments.
Unexpected cache MISS or BYPASS
Check the X-Easel-Cache response header. Time to live (TTL) is how long a response may stay cached:
| Value | What to check |
|---|---|
MISS | First request after deploy or after TTL expiry is normal. Confirm your cache headers allow edge caching. |
BYPASS | Response or request is not cacheable (for example Set-Cookie, Authorization, private, or missing TTL). |
HIT | Served from the CDN cache. |
Easel does not invent a default edge TTL when Cache-Control is missing. Dynamic pages stay uncached until you set eligible headers. See Caching.
Content stays stale after you invalidate
- Confirm you expired the same tag string you wrote (
Cache-Tag, Runtime Cachetags, or NextcacheTag/revalidateTag). - For CDN-only objects, confirm the response included
Cache-Tag(orx-next-cache-tags/surrogate-key) when it was stored. - For Runtime Cache, call
expireTag(or delete the key) and verifyRUNTIME_CACHE_*env is present on the deployment. - For Next.js ISR, use
revalidatePath/revalidateTagand fetch the page again; the first request after expiry may regenerate.
See Invalidate and revalidate cached content and Runtime Cache.
Visitors see 403 or a challenge page
- Open Project settings → Custom WAF rules and look for Deny or Challenge rules that match the path, IP, or headers in use.
- Check whether Attack challenge mode is on for the project.
- Use a Log action first when testing new rules so you can observe matches without blocking users.
- Confirm
X-Easel-Firewall-ActionandX-Easel-Firewall-Rule-Idon the response when present.
See Custom Web Application Firewall (WAF) rules and WAF and attack challenge.
Site returns 503 with x-easel-serve-denied
- Read the
x-easel-serve-deniedheader (or response body). - If the code is
PROJECT_PAUSED, an Owner or Admin can turn off Pause production in Project settings. Preview URLs should still work. See Pause and resume a project. - If the code is
WORKSPACE_SUSPENDED, the whole workspace is blocked until the platform clears suspension. See Workspace is suspended. - Wait up to
30safter resume or unsuspend for the edge manifest cache to expire, then retry.
Environment variable missing at runtime
- Confirm the variable targets the right environment (production vs preview).
- Remember changes apply to new deployments only. Redeploy after edits.
- For a single preview branch, check whether a branch override is set.
Still stuck
Include the deployment URL, approximate time, and X-Easel-Id response header when you contact support. That id correlates the request in edge logs. See System headers.