Maintenance Page Generator: A Clear Message and the Right Status Code

Choose a message for planned work, an unexpected outage or an upgrade, add your site name, when you expect to be back and how to reach you. You get a single HTML file to show visitors, plus the 503 status and Retry-After header that tell search engines the downtime is temporary.

What visitors and crawlers need during maintenance
PiecePurposeWhere it is set
Maintenance pageTells people what is happening and when you returnThe HTML file from this tool
503 status codeMarks the outage as temporaryServer, host or app code
Retry-After headerSays when to check again, as seconds or a dateServer, host or app code
robots.txtShould keep working normally, not return 503Leave it out of the maintenance rule

Updated

A friendly page is only half the job. If the server sends that page with a normal 200 status, crawlers may treat your maintenance notice as the new content of every URL. This generator writes the page and shows how to send it with the status that keeps your listings intact.

Build your maintenance page

Message preset: Planned work, Unexpected outage, Upgrade

Site or business name: Corner Street Bakery

Heading: We are doing some planned maintenance

Message: Our site is offline for scheduled work so it runs better for you.

Expected back (shown to visitors): Today at 3 PM

Contact email: [email protected]

maintenance.html

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Corner Street Bakery: We are doing some planned maintenance</title>
  <style>
    body { margin: 0; min-height: 100vh; display: grid; place-items: center; font: 17px/1.6 system-ui, sans-serif; background: #f6f5f2; color: #1f1f1f; }
    main { max-width: 520px; margin: 24px; padding: 32px; background: #fff; border-radius: 16px; box-shadow: 0 2px 12px rgba(0,0,0,.08); }
    h1 { font-size: 1.6rem; line-height: 1.25; margin: 0 0 12px; }
    .site { font-weight: 700; color: #555; margin: 0 0 16px; }
    a { color: #1d4ed8; }
  </style>
</head>
<body>
  <main>
    <p class="site">Corner Street Bakery</p>
    <h1>We are doing some planned maintenance</h1>
    <p>Our site is offline for scheduled work so it runs better for you.</p>
    <p><strong>Expected back:</strong> Today at 3 PM</p>
    <p>Need us now? Email <a href="mailto:[email protected]">[email protected]</a></p>
  </main>
</body>
</html>

Sending the page with a 503

Pick the example that matches how your site runs. Each one sends the 503 status, a Retry-After value and a no-store cache rule, then the page itself.

What the response should look like

Retry-After here is one hour in seconds. A date also works.

HTTP/1.1 503 Service Unavailable
Retry-After: 3600
Cache-Control: no-store
Content-Type: text/html; charset=utf-8

<!doctype html> ...your maintenance page...

PHP

Status and headers must be sent before any output, so this goes at the very top of the entry file.

<?php
http_response_code(503);
header("Retry-After: 3600");
header("Cache-Control: no-store");
readfile(__DIR__ . "/maintenance.html");
exit;

Node.js (built-in http module)

A tiny server that answers every request with the page, except robots.txt, which keeps returning a normal file.

import { createServer } from "node:http";
import { readFileSync } from "node:fs";

const page = readFileSync("maintenance.html");
const robots = "User-agent: *\nAllow: /\n";

createServer((req, res) => {
  if (req.url === "/robots.txt") {
    res.writeHead(200, { "Content-Type": "text/plain" });
    return res.end(robots);
  }
  res.writeHead(503, {
    "Retry-After": "3600",
    "Cache-Control": "no-store",
    "Content-Type": "text/html; charset=utf-8",
  });
  res.end(page);
}).listen(8080);

Choosing the right message

Planned work: say what is being improved and when it ends. An unexpected outage: apologise briefly, say you are on it, and give a contact. An upgrade: tell people what will be better afterwards, which turns a delay into something to look forward to.

Whatever the preset, include a way to reach you. A store owner can still take an order by email or phone while the checkout is offline.

If you use a site builder or managed host

Many hosted platforms have their own maintenance or password mode, and you cannot always set headers yourself. Check what status code that mode sends before relying on it for a long window.

How it works

  1. Pick a message preset, then edit the wording if you like.
  2. Enter the site name, the time you expect to be back and a contact email.
  3. Check the live preview, then copy or download the HTML file.
  4. Ask your host or developer to serve it with a 503 status and a Retry-After header, using one of the examples below.
  5. Remove the rule as soon as the work is done and check that pages return to normal.

Tips

Frequently asked questions

Why 503 and not 200?

Google's guide to pausing an online business recommends an informational error page with a 503 status instead of all content. A 503 says the server is temporarily unable to handle the request, so your real pages are not replaced in search.

What does Retry-After look like?

Either a number of seconds, such as Retry-After: 3600, or an HTTP date, such as Retry-After: Thu, 15 Oct 2026 15:00:00 GMT. Google asks for a best effort date or duration.

Can the HTML file set the 503 itself?

No. A status code is sent by the server before any HTML, so a plain file cannot change it. Your host's settings, server configuration or application code must send it.

How long can a site stay in maintenance?

Google does not give a fixed number of days. Its crawling documentation says 5xx errors slow crawling down and that indexed URLs are preserved but eventually dropped, so keep the window short.

Is this the same as a coming soon page?

No. A coming soon page is for a site that has not launched yet. This page is for a live site that is briefly unavailable.

Related: How to make a coming soon page, Website maintenance checklist, Google Search Console guide, Website maintenance packages.

Start for free or see all free tools. We.Inc is free to start, with no card needed. AI building is on paid plans from $20 a month.

More in Free Tools

We.Inc is an AI-powered website builder you can resell under your own brand. Launch a branded client dashboard, bill on Stripe Connect, and deliver AI-generated websites in minutes. White-label plans start at $99 a month for 25 client sites, with a 7-day free trial and no per-site fees.

Product

Who It's For

Features

Resources

Company

View Sitemap