Maintenance Pages: Best Practices During Planned Downtime

Planned downtime is still downtime. Make it not feel like an outage.

A good maintenance page preserves trust during planned downtime. Learn what to include, what to avoid, and how to serve it when your app is down.

Why maintenance pages matter

A maintenance page is what users see when you deliberately take your site down for updates, migrations, or infrastructure work. It's the difference between "this site is broken" (an outage) and "this site is temporarily down for maintenance, back at 3:00 AM" (a planned event). The content and tone of the page determine whether users shrug and come back later or lose trust and go to a competitor.

The key insight: a maintenance page should be served independently of your application. If your maintenance page is part of your Next.js app, it goes down when the app goes down — which defeats the purpose. Serve it from your CDN, your reverse proxy (Nginx), or a static hosting provider that stays up when your app doesn't.

What a good maintenance page includes

A clear message: "We're performing scheduled maintenance and will be back shortly." Not "Error 503" or a stack trace. A time estimate: "We expect to be back by 3:00 AM UTC." Even a rough estimate is better than no estimate — users decide whether to wait or come back later. A status page link: if you have a status page (SurePing includes them on custom domains), link to it so users can subscribe for updates.

A contact method: for business-critical services, provide an email or phone number for urgent issues. A brand-consistent design: the maintenance page should look like your site, not a generic Nginx default. Include your logo, brand colors, and a friendly tone. A maintenance page that looks like a 1990s error page undermines the professionalism of your entire product.

How to serve a maintenance page that survives your outage

The most reliable method: configure your CDN (Cloudflare, Fastly, CloudFront) to serve a static maintenance page when your origin returns 503. This works even when your origin server is completely down, because the CDN serves the page from its edge cache. Most CDNs support this as a "custom error page" or "origin error page" feature.

If you're not using a CDN, configure Nginx to serve a static HTML file when the upstream is down: `error_page 503 /maintenance.html;` with a `location /maintenance.html` block serving the static file. This works as long as Nginx itself is running, which is usually the case even when the app behind it is down. During the maintenance window, use monitoring to verify the maintenance page is serving correctly — set up an HTTP check that expects the maintenance page content (a keyword check for "scheduled maintenance") so you know the page is live before users hit it.

Related