Blog

Scheduled maintenance notification template: announce, start, extend and complete, plus lead times and alert pausing

Six copy-ready maintenance notices from announcement to completion, with lead times by impact, the right channels and a safe way to pause alerts during the window.

A scheduled maintenance notification template is a pre-written message with placeholders for the affected service, the exact window in UTC, the expected impact and what users need to do. You need one version per stage: announcement, reminder, started, extended, completed and cancelled. Send the first notice 3 to 14 days ahead depending on impact, publish it on your status page and to email subscribers, and pause only the alerts for the components you are actually touching.

This guide gives you all six templates ready to copy, lead times matched to impact, a channel plan and a checklist for silencing monitors without going blind.

What every maintenance notice must contain

Users read maintenance notices quickly, usually to answer one question: will this break something I depend on? A good notice answers that in the first two lines. Every template below is built from the same six fields:

  • What: the work in plain language, for example "upgrade the primary database", not an internal ticket title.
  • When: an absolute start and end time in UTC, optionally followed by a local time zone for your main audience. Never "tonight" or "early morning".
  • Impact: which component becomes unavailable, read-only or slower, and for how long at most. Name what keeps working.
  • Action: what the user should do, even if the answer is "nothing".
  • Updates: where to follow progress, usually the status page.
  • Contact: where to go if something still looks wrong afterwards.

The most common failure is a vague impact line. "Brief interruptions may occur" produces support tickets. "API write requests return 503 for up to 20 minutes; reads keep working" does not.

How far ahead to announce scheduled maintenance

Lead time should scale with impact, not with how big the work feels internally. These are practical rules of thumb, adjust them to your contracts and customer base:

  • No visible impact (rolling deploys, redundant node replacement): status page entry 24 to 48 hours ahead, no email.
  • Degraded service (read-only mode, higher latency, delayed background jobs): 3 to 5 days ahead, email to subscribers, reminder 1 hour before.
  • Full downtime of a core service: 7 to 14 days ahead, email plus in-app banner, reminders 24 hours and 1 hour before.
  • Customer action required (new IP ranges to allowlist, endpoint changes, certificate pinning updates): 30 days or more, direct email to account owners in addition to the status page.

If your SLA or customer contracts define a notice period for planned maintenance, that period is the minimum, not the target. Check whether maintenance windows count against your uptime commitment before you schedule anything long.

Pick the window from your own traffic data. The quietest hour for a European B2B product is often not the quietest hour for a product with customers in the Americas and Asia.

Which channels to use

Use the channel that matches the impact, and always keep one source of truth that every other message links to.

  • Status page: the canonical record. Every other message links here. A hosted page with email subscribers, custom domain and incident history keeps working even when your own infrastructure is in maintenance.
  • Email to subscribers: for anything with visible impact.
  • In-app banner: for full downtime, shown from the announcement until the window ends.
  • Direct email to account owners: when customers must change something on their side.
  • Internal chat channel: support and sales need the same text before customers ask them.

Avoid announcing only in a changelog or on social media. Neither reaches the person whose integration is about to fail.

Scheduled maintenance notification templates for every stage

Replace everything in curly braces. Keep the subject lines consistent so subscribers can see at a glance which stage a message belongs to.

1. Announcement

Subject: Scheduled maintenance: {service} on {date}, {start_utc}-{end_utc} UTC

What: We will {plain description, e.g. upgrade our primary database}.
When: {date}, {start_utc} to {end_utc} UTC
      ({start_local} to {end_local} {local_tz}).
Impact: {component} will be {unavailable | read-only | slower than usual}
        for up to {duration}. {unaffected components} keep working normally.
What you need to do: {Nothing | Pause scheduled exports | Retry failed
        webhook deliveries after the window}.
Updates: {status_page_url}. Subscribe there to be notified when
        the work starts and ends.

2. Reminder (24 hours and 1 hour before)

Subject: Reminder: maintenance on {service} starts in {24 hours | 1 hour}

As announced, {component} will be {impact} from {start_utc} to
{end_utc} UTC on {date}. {unaffected components} are not affected.
{Action, if any}. Follow progress at {status_page_url}.

3. Started

Subject: Maintenance in progress: {service}

We have started the scheduled maintenance on {component}.
As announced, {impact} until {end_utc} UTC at the latest.
Next update: when the work is complete, or by {next_update_utc} UTC.

Post this the moment work begins, not when someone remembers. Users who see errors at 02:03 check the status page at 02:04.

4. Extended

Subject: Maintenance extended: {service}, new end {new_end_utc} UTC

The maintenance is taking longer than planned because {reason in one
sentence}. {component} remains {impact}. Your data is {safe and not
affected | being verified before we reopen writes}.
New expected end: {new_end_utc} UTC.
Next update by {next_update_utc} UTC.

Publish the extension before the original end time, ideally 15 minutes earlier. A window that silently overruns looks exactly like an outage, and that is how it will be reported.

5. Completed

Subject: Maintenance completed: {service}

The scheduled maintenance finished at {actual_end_utc} UTC.
{component} is fully available again.
{Required follow-up, e.g. Please retry exports that failed during
the window.}
If you still see {symptom}, {reconnect your client | clear cached
DNS | contact {support_contact}}.

6. Cancelled or rescheduled

Subject: Maintenance rescheduled: {service}

The maintenance planned for {old_date}, {old_start_utc}-{old_end_utc} UTC
will not take place. New window: {new_date}, {new_start_utc}-{new_end_utc}
UTC. Reason: {one sentence}. Impact and required actions are unchanged:
{short impact line}.

If the maintenance turns into an unplanned outage, stop using these templates and switch to incident communication. The structure in how to write an incident status update covers that handover, including the investigating, identified and monitoring stages.

How to pause alerts during the maintenance window

Leaving monitors active wakes the on-call person for work they already know about. Pausing everything means a real failure in an unrelated system goes unnoticed. Pause only the checks for the components you are touching, set an automatic end time, and verify that alerting is back before you post the completion notice.

  1. Map monitors to components. Before the window, list every HTTP, TCP, DNS and heartbeat check that depends on the system under maintenance. Include indirect ones: an API health endpoint that queries the database will fail during a database upgrade.
  2. Silence with an expiry. Set the pause from 10 to 15 minutes before the start to 30 minutes after the planned end. A pause without an end time is how monitors stay off for weeks.
  3. Keep everything else live. Monitors for unaffected components keep alerting normally. If the marketing site goes down during your database work, you still want to know.
  4. Handle scheduled jobs. Backups and cron jobs that cannot run during the window will miss their pings. Pause those heartbeat checks or widen their grace period, as described in heartbeat monitoring for cron jobs, and confirm the first run after the window succeeds.
  5. Return a clear 503. Serve a maintenance page with status 503 and a Retry-After header, so clients, crawlers and anyone reading monitor results can tell planned unavailability from a crash.
  6. Verify before you close. Wait for the affected checks to report healthy from all regions, then confirm the pause has ended, then send the completion notice.

A minimal nginx setup for the maintenance response, toggled by a flag file:

server {
    # ...
    if (-f /etc/nginx/maintenance.flag) {
        return 503;
    }

    error_page 503 @maintenance;
    location @maintenance {
        root /var/www/maintenance;
        add_header Retry-After 1800 always;
        rewrite ^ /index.html break;
    }
}

Enable it with touch /etc/nginx/maintenance.flag and disable it with rm /etc/nginx/maintenance.flag. No reload is needed because the check runs per request. Exclude your health endpoint from this block if you want internal checks to keep reaching the application while external traffic sees the maintenance page.

Mistakes that turn planned work into support tickets

  • Ambiguous time zones. "02:00 CET" is wrong for half the year. Lead with UTC.
  • No maximum duration. Users plan around the worst case. Give it to them.
  • Status page hosted on the infrastructure under maintenance. The one page users check is then the one that is down.
  • Missing completion notice. Without it, subscribers assume the work is still running and hold off on their own tasks.
  • Different wording in different channels. Write the text once and link to the status page entry from everywhere else.

Running maintenance notices with m0nitor

If you use m0nitor, incident management includes scheduled maintenance windows that are announced on your status page, plus reusable incident templates with placeholders, so the six messages above can be stored once and filled in per window. Status pages support email subscribers and multiple languages, which covers the announcement and completion emails. Alert workflows can notify a channel or call a webhook on monitor events, for example to post into the internal channel your support team watches. Any status page tool with templates and subscriber notifications can follow the same process.

FAQ

How far in advance should you announce scheduled maintenance?

Scale it to impact: 24 to 48 hours for work without visible effect, 3 to 5 days for degraded service, 7 to 14 days for full downtime of a core service, and 30 days or more when customers have to change something on their side. Send reminders 24 hours and 1 hour before anything with visible impact.

Should you announce maintenance that has no user impact?

Post it on the status page, but skip the email. If something unexpected happens during the work, users will find a matching entry instead of an unexplained error, and you keep subscriber emails meaningful for work that actually affects them.

What time zone should a maintenance notification use?

Use UTC as the primary time, written as an absolute date and time range, and add one local time zone in parentheses if most of your customers are in one region. Avoid relative terms like "tonight" and abbreviations that change with daylight saving time.

What should you do if maintenance runs over the planned window?

Post an extension notice before the original end time with the reason, the new expected end and the time of the next update. If the overrun is caused by an unexpected failure rather than slow progress, switch from maintenance to an incident and communicate it as such.

Product

  • Pricing
  • Features
  • Integrations
  • Security
  • Free network check

Features

  • Uptime monitoring
  • Status pages
  • Alert workflows
  • Incident management
  • Dependencies
  • AI assistant
  • Global infrastructure
  • On-call schedules
  • Enterprise SSO

Use cases

  • Websites for free
  • Cron jobs
  • SSL certificates
  • Databases
  • IP blacklists
  • GDPR compliance

Resources

  • What is a status page?
  • Documentation
  • API
  • MCP server
  • Monitoring glossary
  • Free tools
  • SLA calculator
  • SSL checker
  • DNS lookup
  • Blog
  • Changelog
  • About
  • Contact

Compare

  • Free uptime monitoring
  • UptimeRobot
  • Better Stack
  • Pingdom
  • StatusCake
  • Uptime Kuma
  • Hyperping
  • Atlassian Statuspage
  • Instatus
  • Cachet
  • Freshping