Skip to content

Template: Scheduled Maintenance

Pre-announce template for planned downtime or planned degradation. Used at four moments: T-7d, T-24h, T-0 (start), maintenance complete.

Approval gate: T-7d notice requires customer-comms-owner draft + leadership sign-off. T-24h, T-0, complete can use the templated send. See README.md §"Approval workflow".

Don't use this template for emergency change windows. If the work is urgent enough that you can't wait 7 days, treat it as an incident and use incident-acknowledgement.md (severity per the change's customer impact).


T-7d — initial customer notification

Send 7 calendar days before the maintenance window opens. Email to all SLA-bound customers; status-page scheduled-maintenance entry; internal Slack reminder.

Public — customer email

Subject: [Scheduled maintenance] {MAINTENANCE_TITLE} — {MAINT_DATE_HUMAN}

Hello,

We are scheduling planned maintenance on {CUSTOMER_NAME} that will affect {IMPACTED_SERVICES}.

Window
- Start: {MAINT_START_UTC} ({MAINT_START_LOCAL_HINT})
- End:   {MAINT_END_UTC}
- Duration: up to {MAX_DURATION}

Expected impact
{EXPECTED_IMPACT}

Workaround / alternative path during the window
{WORKAROUND_OR_NONE}

Why
{ONE_SENTENCE_REASON}

This window is a planned event under our maintenance terms. No SLA credit applies, and the start time will be re-confirmed 24 hours before the window opens.

If you have questions, reply to this email or contact {SUPPORT_EMAIL}.

Regards,
{CUSTOMER_NAME} Operations

Public — status page (scheduled entry)

Title: Scheduled maintenance — {MAINTENANCE_TITLE}

Window: {MAINT_START_UTC} → {MAINT_END_UTC} ({MAX_DURATION})
Impact: {EXPECTED_IMPACT_ONELINER}
Workaround: {WORKAROUND_OR_NONE_ONELINER}

We will post additional updates 24 hours before the window opens, at start, and at completion.

Internal — Slack reminder

:calendar: Scheduled maintenance set: {MAINTENANCE_TITLE}
- window: {MAINT_START_UTC} → {MAINT_END_UTC}
- runbook: {RUNBOOK_LINK}
- exec by: {ENGINEER}
- t-7d notice: sent {TIMESTAMP_UTC}
- next reminder: t-24h

T-24h — final reminder

Sent 24 hours before the window. Same audiences. Subject reuses the T-7d ID so threads stay connected.

Public — customer email

Subject: [Reminder — scheduled maintenance] {MAINTENANCE_TITLE} — starts {MAINT_START_UTC}

Hello,

This is a 24-hour reminder of the scheduled maintenance previously communicated for {IMPACTED_SERVICES}.

Window
- Start: {MAINT_START_UTC}
- End:   {MAINT_END_UTC}
- Duration: up to {MAX_DURATION}

No changes have been made to the original window. The expected impact and workaround communicated at T-7d remain in effect.

Live updates will be posted to {STATUS_PAGE_URL} at maintenance start and completion.

Regards,
{CUSTOMER_NAME} Operations

If the window has changed (later start, longer duration, expanded scope), don't use this template — send a fresh T-7d-style notification with the changes called out and the previous window superseded.

Internal — Slack reminder

:bell: t-24h reminder: {MAINTENANCE_TITLE}
- window opens in 24h: {MAINT_START_UTC}
- exec by: {ENGINEER} (confirmed availability)
- runbook: {RUNBOOK_LINK}
- rollback plan documented: yes/no

T-0 — maintenance start

Posted at the moment the window opens. Status-page only — no email at this stage.

Public — status page

Title: Maintenance in progress — {MAINTENANCE_TITLE}

Status: in progress
Started: {TIMESTAMP_UTC}
Expected end: {MAINT_END_UTC}
Impact: {EXPECTED_IMPACT}

We will post the next update at maintenance complete.

Internal — Slack thread

:hammer_and_wrench: maintenance start: {MAINTENANCE_TITLE}
- started: {TIMESTAMP_UTC}
- exec: {ENGINEER}
- bridge: {VIDEO_BRIDGE_URL_OR_NONE}
- runbook step 1 in progress

Maintenance complete

Posted within 15 minutes of the engineer confirming the work is verified and traffic is back to baseline.

Public — status page

Title: Maintenance complete — {MAINTENANCE_TITLE}

Status: completed
Started: {TIMESTAMP_START}
Completed: {TIMESTAMP_END}
Duration: {ACTUAL_DURATION}
Impact during window: {ACTUAL_IMPACT}

All affected services have returned to normal operation. If you experience any issues that started during or shortly after the window, please contact {SUPPORT_EMAIL}.

If the window overran the planned end time, name it explicitly: "The window ran {OVERRUN_MINUTES} minutes longer than planned." Don't bury it.

Public — customer email (post-maintenance)

Send only if the window overran, the impact was greater than communicated at T-7d, or an SLA-bound customer requested a maintenance-completion notification.

Subject: [Maintenance complete] {MAINTENANCE_TITLE}

Hello,

The scheduled maintenance for {IMPACTED_SERVICES} has been completed.

- Started:  {TIMESTAMP_START}
- Completed: {TIMESTAMP_END}
- Duration: {ACTUAL_DURATION}

{IF_OVERRUN_OR_OVER_IMPACT_NOTE}

If you experience any unexpected behavior, please contact {SUPPORT_EMAIL}.

Regards,
{CUSTOMER_NAME} Operations

Internal — Slack thread

:white_check_mark: maintenance complete: {MAINTENANCE_TITLE}
- duration: {ACTUAL_DURATION} (planned: up to {MAX_DURATION})
- runbook executed clean: yes/no
- rollback used: yes/no
- followups: {FOLLOWUP_TICKETS_OR_NONE}

Variables to fill

Variable Notes
{MAINTENANCE_TITLE} Short, customer-language. "Database upgrade", "WebSocket gateway scale-out", "Certificate rotation".
{MAINT_START_UTC} / {MAINT_END_UTC} ISO 8601 UTC. Always include UTC in the email; you may include a local-time hint.
{MAINT_START_LOCAL_HINT} Customer-friendly local-time hint. Optional; use only if the customer is single-region.
{MAX_DURATION} Worst-case duration; keep generous. "Up to 30 minutes."
{ACTUAL_DURATION} Filled in at completion.
{EXPECTED_IMPACT} What customers will notice. "Sign-in unavailable for up to 5 minutes." "Live game broadcasts may briefly disconnect; existing sessions are preserved."
{WORKAROUND_OR_NONE} "No workaround required" or a specific alternative. Don't make one up — confirm with engineering.
{ONE_SENTENCE_REASON} "To upgrade our database to a newer version that improves reliability." Customer language.
{ENGINEER} Person executing the work; named in internal Slack only, never in public messages.
{RUNBOOK_LINK} Link to the engineering runbook for the work. Internal only.
{IF_OVERRUN_OR_OVER_IMPACT_NOTE} If applicable: "The window ran {OVERRUN_MINUTES} minutes longer than initially communicated due to {ONE_SENTENCE_REASON}."

Cross-references

  • README.md — decision tree, approval workflow (note: maintenance has its own approval flow at T-7d)
  • ../oncall-runbook.md — what to do if maintenance becomes an incident mid-window
  • service-degradation.md — for unplanned partial degradation (the inverse of planned maintenance)