Opens in a new tab
  1. Home
  2. Guides
  3. System
System guide

WordPress maintenance mode best practices

Learn how to use WordPress maintenance mode correctly with 503 Service Unavailable, Retry-After headers, cache controls, staff bypass rules and search-friendly temporary downtime.

  • Updated August 31, 2026
  • 20 min read
  • WordPress guide

WordPress maintenance mode best practices are not simply about replacing a website with a page that says “We’ll be back soon.”

A proper maintenance mode needs to communicate two things at the same time:

To visitors:
The website is temporarily unavailable.

To browsers, search engines and automated clients:
The service interruption is temporary.

That second part is where many WordPress maintenance implementations go wrong.

A beautifully designed maintenance page that returns:

200 OK

can look like normal successful content to automated systems.

A maintenance page returning:

404 Not Found

suggests that the site’s resources have disappeared.

A:

403 Forbidden

communicates an access restriction rather than temporary service interruption.

For short planned downtime, the correct HTTP model is normally:

503 Service Unavailable

often accompanied by:

Retry-After

to indicate when clients should try again.

This guide explains how WordPress maintenance mode should work, when to use it, how Core handles maintenance during updates, why 503 matters, how Retry-After works, which URLs should bypass maintenance mode, how caching can break recovery, what search engines see and how maintenance mode differs from password protection and coming-soon pages.

What is WordPress maintenance mode?

Maintenance mode is a temporary state in which normal public access to some or all of a WordPress site is replaced by a controlled response while work is being performed.

For example:

Normal site
↓
maintenance begins
↓
visitor requests page
↓
maintenance response
↓
work completes
↓
normal site returns

Maintenance mode is temporary by definition

Typical reasons include:

  • deploying a major update;
  • performing a database migration;
  • switching infrastructure;
  • changing a theme or application layer;
  • performing emergency repairs;
  • updating ecommerce systems;
  • briefly preventing writes during a migration.

Maintenance mode should not become a permanent website state

If visitors see:

We'll be back shortly

for six weeks, the problem is no longer maintenance.

The website is simply unavailable with optimistic copywriting.

WordPress Core already has a maintenance mechanism

During certain Core, plugin or theme updates, WordPress can temporarily create a file named:

.maintenance

in the WordPress root directory.

The official wp_is_maintenance_mode() function checks whether that file exists and whether its timestamp still represents an active maintenance period.

WordPress Core treats the maintenance file as temporary

The current Core implementation considers maintenance inactive once the stored upgrade timestamp becomes at least:

10 minutes old

during the normal Core check.

Core then uses wp_maintenance()

The internal wp_maintenance() function handles the default maintenance response.

Current Core sends:

Retry-After: 600

and terminates the request using a:

503 Service Unavailable

response.

This is the correct conceptual model

The URL still exists.

The website still exists.

The server is temporarily
unable to serve the normal resource.

→ 503 Service Unavailable

503 Service Unavailable is the key maintenance status

The HTTP specification defines 503 Service Unavailable for temporary server unavailability such as overload or maintenance.

For the broader status-code model, see HTTP status codes for WordPress sites, explained.

Why not return 200 OK?

Consider:

GET /services/

HTTP/1.1 200 OK

<h1>Maintenance</h1>
<p>We'll be back soon.</p>

From the visitor’s perspective, this looks fine.

From the protocol’s perspective:

/services/

successfully returned
its normal representation.

But that is not actually what happened.

Search engines can encounter the maintenance page too

If every URL temporarily returns the same maintenance content with 200 OK, automated systems can have difficulty distinguishing:

real page content

from

temporary interruption content.

503 explicitly communicates temporary unavailability

A better response is:

HTTP/1.1 503 Service Unavailable

<h1>Scheduled maintenance</h1>
<p>We'll be back shortly.</p>

The page design and HTTP status solve different problems

HTML
→ helps humans understand the interruption

503
→ helps machines understand the interruption

Retry-After adds useful timing information

A 503 response can include:

Retry-After

to indicate when the client should try again.

Retry-After can contain seconds

For example:

Retry-After: 1800

means:

Try again in approximately
1,800 seconds.

It can also use an HTTP date

Conceptually:

Retry-After:
Mon, 31 Aug 2026 15:00:00 GMT

Choose a realistic value

If maintenance should take roughly:

30 minutes

a value around:

1800

is more useful than:

Retry-After: 10

followed by an hour of downtime.

But Retry-After is advisory

It does not force browsers, search engines or other clients to return at exactly that moment.

It communicates the server’s expectation.

Google recommends 503 for short site shutdowns

The official Google Search documentation for temporarily disabling a site recommends using 503 Service Unavailable for a short outage and using Retry-After where possible.

Do not leave 503 responses indefinitely

Temporary errors are treated as temporary only for a limited period.

Google’s current crawl documentation explains that persistent 503 or 429 responses cause crawling to slow and can ultimately cause URLs to leave the index if the unavailable state continues.

This means maintenance mode needs an operational deadline

Before activating it, know:

  • why maintenance is required;
  • when it starts;
  • how long it should last;
  • what must be completed;
  • when rollback occurs if the work fails.

Do not use maintenance mode simply because development is happening

If the production site can continue functioning safely while developers work on staging, keep production online.

A staging environment exists precisely so every CSS adjustment does not become a public infrastructure event.

See WordPress staging site best practices.

Maintenance mode is most useful when production itself must change

For example:

Database structure migration
↓
old application and new database
cannot safely coexist
↓
brief maintenance window

Another example: write freeze

Suppose an ecommerce migration copies production data to a new system.

If users continue creating:

  • orders;
  • accounts;
  • form submissions;
  • comments;

during the final copy, those writes may never reach the new production environment.

A brief maintenance window can protect data consistency

Enable maintenance
↓
stop public writes
↓
final database synchronization
↓
deploy
↓
validate
↓
disable maintenance

Do not activate maintenance mode earlier than necessary

Poor:

09:00
activate maintenance

09:05
begin downloading backup

10:00
start migration

11:00
discover missing credentials

Prepare everything first

A better workflow is:

Prepare backup
Prepare deployment
Prepare credentials
Prepare rollback
Prepare tests
↓
activate maintenance
↓
perform only the work
that requires downtime

This minimizes the actual outage

The maintenance window should represent:

time that genuinely requires
public interruption

not:

time during which developers
remember what they intended to do.

Maintenance mode and coming soon are different

A coming-soon site exists before the real public site is launched.

Maintenance mode temporarily interrupts an already existing service.

Coming soon may legitimately return 200

Suppose a new business owns:

example.com

and publishes a real placeholder homepage:

Company Name
Opening September
Contact us

If that page is intentionally the current public homepage, then:

200 OK

may be perfectly correct.

That is not maintenance

The resource currently being served is genuinely the intended public resource.

Maintenance mode and password protection are different too

Password protection answers:

Who is allowed to access this site?

Maintenance mode answers:

Is the normal service temporarily available?

A staging site may use password protection for weeks

That does not mean it should return:

503 Service Unavailable

for weeks.

The site is not experiencing temporary failure.

It is deliberately restricted.

Use real access restriction for staging

TheOneWP Site Password Protection can gate a pre-launch or private WordPress site with a shared password.

Do not use robots.txt as password protection

This:

User-agent: *
Disallow: /

does not prevent a person from opening the site.

See Robots.txt vs. real access control.

Do not combine every pre-launch control into one vague “maintenance” concept

STAGING PASSWORD

Access control


COMING SOON

Current intentional public content


MAINTENANCE MODE

Temporary service interruption

TheOneWP Maintenance Mode implements the temporary-interruption model

TheOneWP Maintenance Mode can temporarily replace normal public output while letting authorized staff continue working.

The verified module supports:

  • a custom HTML maintenance page;
  • redirecting visitors to a selected WordPress page;
  • redirecting visitors to a configured URL;
  • automatic bypass for authorized staff;
  • loop protection for redirect destinations;
  • 503 Service Unavailable maintenance responses;
  • Retry-After behavior.

Staff should usually be able to bypass maintenance mode

Developers and administrators need to verify the live application before reopening it publicly.

A useful model is:

Anonymous visitor
→ maintenance page

Authorized administrator
→ normal site

This enables a production smoke test before reopening

For example:

Maintenance active
↓
Administrator logs in
↓
tests production homepage
tests checkout
tests forms
tests API
↓
everything passes
↓
disable maintenance

Do not bypass maintenance for everyone with a predictable query parameter

A pattern such as:

?maintenance_bypass=1

is not meaningful access control if anybody who discovers it can use it.

Use authenticated state or another deliberate mechanism

The bypass should be limited to users or requests that actually require access during the window.

wp-login.php usually needs special consideration

If maintenance mode blocks:

/wp-login.php

before administrators can authenticate, you can create an elegant lockout in which the people fixing the site cannot reach the interface required to fix it.

Allow required administrative entry points

Depending on implementation, exceptions may include:

wp-login.php
wp-admin

for authorized users.

But do not expose every admin route blindly

The rule should reflect actual WordPress authentication behavior and security requirements.

AJAX requests need consideration

WordPress admin and frontend functionality can depend on:

admin-ajax.php

Blocking all AJAX requests can break administrator workflows

For example, staff testing production while maintenance mode is active may need AJAX-based:

  • settings;
  • search;
  • page-builder operations;
  • media requests;
  • plugin controls.

REST API requests need even more deliberate handling

Modern WordPress uses the REST API for many workflows.

Possible consumers include:

  • Block Editor;
  • headless frontends;
  • mobile applications;
  • external integrations;
  • webhooks;
  • custom JavaScript.

Should the REST API be blocked during maintenance?

The answer depends on the reason for maintenance.

If database writes must stop

Then public REST endpoints that create or modify data may need to be unavailable too.

If only frontend presentation is changing

Blocking unrelated authenticated API operations may be unnecessary.

Define maintenance scope explicitly

Public frontend only?

All anonymous requests?

All writes?

Entire application?

Specific service?

Maintenance mode should match the actual unavailable service

Do not shut down:

checkout
REST API
admin
webhooks
cron

because somebody is replacing three CSS files if those systems can safely remain available.

Webhooks are particularly important

An ecommerce site may receive external callbacks from:

  • payment processors;
  • shipping providers;
  • CRM systems;
  • subscription services.

If maintenance mode intercepts those callbacks

The external service may receive:

503 Service Unavailable

instead of the endpoint response it expects.

Sometimes this is correct

If the application cannot safely process the webhook during migration, temporary failure may be preferable to corrupting data.

Sometimes it is disastrous

If the webhook endpoint remains perfectly functional, blocking it can interrupt:

  • payment confirmation;
  • order state changes;
  • external synchronization.

Create request exclusions deliberately

Possible exclusions might include:

/payment-webhook/
/health-check/
/monitoring-endpoint/

where those services genuinely need to remain online.

Never exclude endpoints merely because they look technical

Understand what each endpoint does first.

Health checks need special treatment

A load balancer or monitoring system may request:

/health/

to determine whether the application instance itself is operational.

If maintenance mode returns 503 to the health check

The infrastructure may conclude:

server is unhealthy

and remove the instance from rotation.

That may or may not be what you want

Separate:

APPLICATION HEALTH

from

PUBLIC AVAILABILITY

where the infrastructure requires that distinction.

robots.txt should remain accessible

Google’s current maintenance guidance explicitly recommends continuing to serve:

/robots.txt

normally rather than returning a site-wide 503 for it.

Why?

robots.txt controls crawler access behavior and receives special handling from search engines.

It is not ordinary page content.

Do not put robots.txt into maintenance simply because everything else is

A maintenance interception layer should normally exclude that route.

Do not use robots.txt to announce maintenance

Changing it to:

User-agent: *
Disallow: /

is not equivalent to:

503 Service Unavailable

These signals mean different things

robots.txt Disallow

Please do not crawl these URLs.


503

The service is temporarily unavailable.

Google advises against blocking the entire site in robots.txt during a temporary outage

Use the status code designed for service availability rather than rewriting crawler policy because the database is being upgraded.

Avoid noindex during short maintenance

This is another common mistake.

Some maintenance plugins add:

<meta name="robots"
      content="noindex">

to every response.

That communicates a different instruction

503

Temporarily unavailable.


noindex

Do not keep this URL
in search results.

For a short maintenance window, 503 is generally the correct signal

Google explicitly warns against using noindex as the mechanism for temporarily disabling an entire website.

Do not rewrite canonical URLs during maintenance

A maintenance page served at:

/services/

should not suddenly make every site URL canonical to:

/maintenance/

The original URLs have not permanently become one maintenance page

They are temporarily unavailable.

The HTTP status should express that temporary state

This avoids distorting the site’s normal URL architecture.

Maintenance redirects deserve special caution

Instead of directly rendering a maintenance page, some systems redirect every request to:

/maintenance/

This can be useful for user experience

But the resulting HTTP semantics need to remain intentional.

A normal 302 alone does not necessarily communicate service unavailability

Conceptually:

/services/
↓
302
/maintenance/
↓
200

communicates a temporary redirect to a successful resource.

A direct 503 response is usually clearer for whole-site maintenance

If redirects are used, understand exactly which status the original and destination requests return.

TheOneWP Maintenance Mode protects redirect flows from loops

Maintenance Mode supports redirecting visitors to a selected page or URL while handling destination exclusions so the maintenance system does not endlessly redirect its own target.

Redirect loops are easy to create

Bad logic:

Every frontend URL
→ /maintenance/

including:
/maintenance/

therefore:
/maintenance/
→ /maintenance/
→ /maintenance/
...

Always exclude the maintenance destination

This applies whether the destination is:

  • a WordPress page;
  • a custom endpoint;
  • an external status page.

External maintenance pages can be useful

Suppose the WordPress server itself is being restarted or migrated.

A maintenance page hosted on the same WordPress application may disappear along with it.

An external status page can survive origin downtime

For high-availability systems, maintenance information may live on:

  • another server;
  • CDN edge infrastructure;
  • a dedicated status platform.

But understand the redirect semantics

If the website redirects visitors externally, search engines still need correct signals for the original URLs.

Keep maintenance pages lightweight

Google recommends minimizing server and client load for temporary error pages.

This means avoiding unnecessary dependencies

A maintenance page should not require:

14 JavaScript bundles
7 web fonts
3 analytics libraries
a page-builder API
an external animation service

while the site is supposedly unavailable because infrastructure is under stress.

Prefer simple HTML and CSS

A maintenance page often only needs:

  • brand identity;
  • short message;
  • expected return time;
  • contact information;
  • optional status link.

Do not make the maintenance page depend on the broken system

If the reason for maintenance is:

database unavailable

then generating the maintenance message by performing twelve database queries is a questionable architectural choice.

Static responses are resilient

Where possible, a maintenance response should require fewer moving pieces than the application it is temporarily replacing.

A maintenance page should be useful to visitors

Bad:

MAINTENANCE

ERROR 503

Better

We're performing scheduled maintenance.

The website should be available again
around 15:30 UTC.

For urgent enquiries:
support@example.com

Give concrete information where possible

Useful content may include:

  • what is happening;
  • whether data is safe;
  • expected restoration time;
  • contact information;
  • status-page link.

Do not promise a return time you cannot support

If you genuinely do not know, say:

We're working to restore service.

rather than repeatedly moving:

Back at 14:00

to:

Back at 15:00

to:

Back sometime before civilization collapses.

Do not expose internal technical details

Visitors do not need:

MySQL replication failed
on db-prod-03.internal

PHP-FPM socket unavailable

Migration script line 482 crashed

unless there is a specific operational reason to disclose that detail.

Give useful information without publishing your infrastructure diagram

A simple:

We're performing maintenance.

is usually sufficient.

Do not cache the maintenance response aggressively

This is a major practical risk.

Imagine:

14:00
maintenance enabled

14:10
CDN caches 503 page

14:20
maintenance disabled

14:30
visitors still receive
cached maintenance page

The application may be healthy while the cache says otherwise

WordPress’s current Developer Blog guidance for custom maintenance templates recommends using:

nocache_headers()

alongside the 503 response specifically to reduce the risk of maintenance output remaining cached after the site comes back online.

Understand every cache layer

A WordPress site may have:

Browser
↓
CDN
↓
Reverse proxy
↓
Server page cache
↓
WordPress cache
↓
Application

Maintenance mode may need cache bypass rules

If a CDN continues serving the previously cached normal site, visitors may not see maintenance at all.

If it caches the maintenance page too aggressively, visitors may continue seeing maintenance after recovery.

Both directions matter

Entering maintenance:
ensure maintenance response is visible

Leaving maintenance:
ensure normal content becomes visible

Plan cache purges before maintenance starts

Know:

  • which layer caches HTML;
  • how to bypass it;
  • how to purge it;
  • whether 503 responses are cached;
  • whether cache rules vary by authentication.

Logged-in bypass and page caches can conflict

A cache must not accidentally store the administrator’s normal page and serve it to anonymous visitors while maintenance is active.

Vary the cache correctly

Authentication-aware caching rules need to ensure:

authorized bypass response

and

anonymous maintenance response

do not contaminate one another.

Test maintenance as a logged-out visitor

Do not activate maintenance, remain logged in as Administrator, browse the site successfully and conclude:

Maintenance works.

Your account may be bypassing it

Use:

  • private browsing;
  • another browser;
  • curl;
  • an external monitoring request.

Test the actual status code

For example:

curl -I https://example.com/

During maintenance should show something conceptually like:

HTTP/2 503
retry-after: 1800

Do not stop at the homepage

Test:

/
 /services/
 /blog/example/
 /nonexistent-page/
 /robots.txt
 /wp-login.php

plus any excluded API or webhook routes.

Why test a nonexistent page?

If the entire public application is temporarily unavailable, you need to understand whether a normally nonexistent URL returns:

503

during maintenance or bypasses maintenance and returns:

404

Either behavior can be defensible depending on architecture

But it should be deliberate.

Why test robots.txt?

Because it should normally remain reachable during maintenance rather than being swallowed by a blanket 503 interception.

Test headers as well as content

Verify:

  • HTTP status;
  • Retry-After;
  • cache headers;
  • redirect location where used;
  • content type.

Test from outside your own network

Local hosts files, VPNs, CDN bypasses and administrator cookies can create a different result from what real visitors receive.

Maintenance and WordPress updates

WordPress already briefly enters maintenance mode while performing certain updates.

That built-in maintenance state is normally very short

Visitors may see:

Briefly unavailable for scheduled maintenance.
Check back in a minute.

If WordPress gets stuck in maintenance mode

The:

.maintenance

file may remain after an interrupted update.

The official WordPress common errors documentation describes removing the stale .maintenance file when an upgrade leaves the site stuck in this state.

Do not immediately delete .maintenance during an active update

First verify that the update process genuinely stopped.

Removing the maintenance flag while files are still being modified could expose a partially updated installation to visitors.

Understand why the update failed

Possible causes include:

  • timeout;
  • filesystem permissions;
  • process interruption;
  • lost connection;
  • server failure.

Check site integrity after a failed update

Do not merely delete:

.maintenance

and walk away triumphantly.

Verify the:

  • plugin;
  • theme;
  • WordPress Core;
  • frontend;
  • admin;

are in a consistent state.

Manual maintenance mode should not reuse Core internals blindly

Functions such as:

wp_maintenance()

are marked as private Core implementation.

They document how WordPress behaves internally, but plugin and theme developers should build against appropriate public APIs rather than depending on private Core functions as application contracts.

Use status_header() for custom HTTP status output

WordPress provides:

status_header( 503 );

for setting the HTTP status line.

Then set Retry-After where appropriate

For example:

status_header( 503 );
header( 'Retry-After: 1800' );

Then prevent inappropriate caching

Conceptually:

nocache_headers();

And finally serve the maintenance representation

The response lifecycle should be explicit.

A custom maintenance implementation might conceptually look like

if maintenance active
AND visitor not exempt:

    send 503
    send Retry-After
    send no-cache headers
    render maintenance page
    stop normal request

Do not send headers after output has started

If PHP already sent response content, attempts to change HTTP headers can fail.

Maintenance interception therefore needs to happen early enough

The exact hook depends on implementation, but HTTP response decisions should occur before normal output has been flushed.

Be careful with WordPress conditional tags too early

Some routing information is not available until WordPress has parsed the request.

Choose an implementation point where:

  • the required request context exists;
  • headers can still be sent;
  • normal rendering can still be intercepted safely.

The current WordPress Developer Blog demonstrates template_include

The official 2026 WordPress Developer Blog example for block themes shows an implementation using:

template_include

together with:

nocache_headers()
status_header( 503 )
Retry-After

before serving a maintenance template.

This can work well for frontend template maintenance

But plugins that need broader request coverage may require a different interception strategy.

Do not assume theme templates cover every request

Requests such as:

  • REST API;
  • AJAX;
  • feeds;
  • XML-RPC;
  • webhooks;
  • direct PHP endpoints;

may follow different execution paths.

Define whether feeds should remain available

If the public website is temporarily offline, continuing to serve:

/feed/

may or may not be appropriate.

Again, scope matters

A whole-site database migration and a frontend redesign are different maintenance events.

Do not intercept static files unnecessarily

Files such as:

/wp-content/uploads/image.jpg
/wp-content/themes/theme/style.css

may be served directly by the web server without reaching WordPress.

A WordPress plugin cannot automatically control every direct file request

This is the same reason application-level media visibility is different from true file access control.

See Hiding vs. restricting access to WordPress media.

If static assets must become unavailable too

You may need:

  • web-server rules;
  • CDN configuration;
  • reverse-proxy rules;
  • storage access policies.

Application maintenance and infrastructure maintenance are different layers

WordPress maintenance plugin
→ controls WordPress requests

Web-server maintenance
→ can control all origin requests

CDN maintenance
→ may respond before origin

Choose the correct layer

If WordPress itself cannot boot, a WordPress maintenance plugin cannot save you.

That would require the broken application to execute successfully so it can explain that the application is broken, which has a certain bureaucratic elegance but limited operational value.

For risky infrastructure work, put maintenance upstream

A CDN or reverse proxy can sometimes serve maintenance HTML even while:

  • PHP is stopped;
  • database is offline;
  • WordPress files are being replaced.

This can create a more reliable maintenance boundary

The right implementation depends on the architecture and severity of the maintenance operation.

Do not use maintenance mode to hide errors permanently

Suppose production throws:

500 Internal Server Error

after every request.

Replacing it indefinitely with:

503 Maintenance

makes the visitor experience nicer but does not fix production.

Maintenance mode buys repair time

It is not a substitute for repairing the underlying system.

Monitoring should continue during maintenance

Do not silence every monitor just because downtime is planned.

Separate expected and unexpected failures

For example:

Public homepage:
503 expected

Database health:
must remain healthy

Migration process:
must complete

Admin smoke test:
must pass

Use maintenance-aware monitoring where possible

A monitoring system can distinguish:

planned maintenance
from
unexpected outage

rather than sending 400 alerts for the exact downtime somebody scheduled.

But keep monitoring the underlying service

The maintenance page itself returning 503 tells you nothing about whether:

database migration is progressing

or:

server has completely crashed.

Create a rollback threshold before maintenance begins

For example:

Expected maintenance:
20 minutes

Maximum acceptable:
40 minutes

If deployment is not validated
after 40 minutes:
rollback

Do not invent the rollback decision while the site is offline

Operational stress is an excellent environment for generating opinions and a poor environment for designing procedures.

Take a backup before maintenance that can alter data

If the maintenance operation includes:

  • database migration;
  • plugin upgrade;
  • theme replacement;
  • mass URL replacement;
  • content migration;

create a recoverable backup first.

TheOneWP Backup Manager can provide complete, database-only and files-only backups and restoration workflows.

Do not activate maintenance before discovering there is no backup

The correct sequence is:

Prepare backup
↓
verify backup
↓
prepare rollback
↓
activate maintenance
↓
perform risky operation

Maintenance belongs inside the broader launch process

For production launches, see Preparing a WordPress site for launch.

A deployment may not require maintenance at all

Modern deployment techniques can sometimes support:

  • atomic releases;
  • blue-green deployments;
  • rolling deployments;
  • read-compatible schema migrations.

The best maintenance page is sometimes no maintenance page

If infrastructure allows a safe zero-downtime deployment, forcing every visitor through a maintenance screen adds interruption without benefit.

Do not enable maintenance because it feels professional

Professional deployment is about reducing risk and downtime, not ceremonially displaying a wrench icon before every plugin update.

Maintenance mode for ecommerce requires extra care

An online store has stateful operations.

A user may be halfway through checkout

If maintenance activates at that exact moment:

Cart
↓
checkout
↓
payment request
↓
maintenance begins
↓
callback interrupted

you may create ambiguous transaction state.

Coordinate maintenance with transaction boundaries

Before an ecommerce maintenance window:

  • reduce new traffic where appropriate;
  • allow active transactions to complete where possible;
  • understand payment callbacks;
  • check order queues;
  • verify webhook retries.

Payment providers may retry failed webhooks

But never assume retry behavior without checking the provider.

Maintenance mode for membership sites has similar concerns

Potential writes include:

  • new registrations;
  • subscriptions;
  • profile updates;
  • messages;
  • uploads.

Decide whether existing sessions should remain active

Sometimes anonymous users should see maintenance while authenticated customers continue accessing parts of the service.

Sometimes the database operation requires everyone to stop writing.

Maintenance can be partial

For example:

Shop browsing:
available

Checkout:
temporarily unavailable

A 503 can apply to a specific service, not necessarily the entire domain

If only:

/checkout/

is temporarily unavailable, there is no HTTP requirement that:

/blog/

also become unavailable.

Prefer the smallest maintenance scope possible

This preserves:

  • user access;
  • search crawling;
  • business continuity;
  • monitoring clarity.

Maintenance mode and SEO

Short maintenance windows are normally manageable when the server communicates them correctly.

Use 503 rather than replacing content with 200

This tells search engines:

Do not treat this temporary page
as the new normal representation.

Do not deliberately return 404 or 410 during maintenance

Those statuses say the resource is unavailable because it cannot be found or has been removed.

The pages still exist.

Do not redirect every page permanently to a maintenance URL

A:

301 Moved Permanently

would communicate that:

/services/

has permanently become:

/maintenance/

which is precisely the opposite of a temporary outage.

If a redirect is used, keep it temporary

But still consider whether direct 503 responses would be semantically cleaner.

Do not change the XML sitemap during a brief maintenance window

The site’s URL architecture has not changed merely because the service is temporarily unavailable.

Do not remove all sitemap URLs

There is no need to teach search engines that your entire website vanished for twenty minutes.

The XML sitemap can remain unchanged

For sitemap fundamentals, see What is an XML sitemap and why does it matter?.

Long-term closure is not maintenance mode

If a website will be unavailable for an extended period, repeatedly returning 503 for weeks or months is not an appropriate long-term publishing strategy.

Google explicitly distinguishes short downtime from long closure

For longer periods, its current guidance discusses maintaining an indexable placeholder homepage rather than keeping the entire site in persistent 503.

Plan a different architecture for prolonged downtime

Possible strategies include:

  • a reduced functioning site;
  • an indexable informational homepage;
  • partial feature shutdown;
  • a planned migration.

A maintenance page should respect accessibility

Temporary content is still content.

Use a proper heading structure

For example:

<h1>Scheduled maintenance</h1>

Use readable contrast

Visitors may already be frustrated because the site is unavailable.

There is little reason to add pale-gray text on slightly paler gray as a second service interruption.

Keep animations optional and restrained

If animation is used, respect:

prefers-reduced-motion

Provide useful contact information accessibly

Links and buttons should have understandable labels.

For example:

Contact support

rather than:

Click here

Do not require JavaScript to understand the maintenance message

The core information should be present in HTML.

JavaScript can fail for the same reason the application is under maintenance

Keep critical communication independent of unnecessary client-side dependencies.

Localization matters too

If a website normally serves several languages, consider whether the maintenance message should do the same.

At minimum, communicate clearly to the site’s main audience

A multilingual application returning a maintenance message in a language most customers cannot read is technically online enough to disappoint everyone equally.

Maintenance mode should not leak privileged content

Anonymous users should not receive normal page HTML hidden behind:

display: none

while a maintenance overlay appears above it.

Block normal rendering at the server/application layer

The maintenance state should prevent delivery of protected underlying page content where that is the intended behavior.

A CSS overlay is not maintenance mode

This:

body::before {
    content: "Maintenance";
}

does not:

  • stop requests;
  • stop forms;
  • stop API calls;
  • send 503;
  • protect data;
  • prevent underlying content delivery.

It is an overlay

Useful perhaps for dramatic theatre.

Less useful for server maintenance.

Common WordPress maintenance mode mistakes

Returning 200 OK

The maintenance content appears to be a normal successful representation.

Returning 404

The resource is temporarily unavailable, not missing.

Returning 403

Maintenance is not necessarily an authorization failure.

Using a permanent 301 redirect to a maintenance page

The site has not permanently moved to its outage notice.

Adding noindex across the entire site

A short temporary interruption does not require telling search engines to remove URLs from results.

Blocking everything in robots.txt

Robots policy and service availability solve different problems.

Returning 503 for robots.txt

Google specifically recommends keeping robots.txt reachable during temporary shutdowns.

Leaving maintenance enabled for days

Persistent unavailability can eventually affect crawling and indexing.

Caching the maintenance page

The site recovers but visitors continue receiving the outage page.

Forgetting CDN cache

Clearing only a WordPress cache plugin does not necessarily purge the edge.

Blocking administrator login

Excellent maintenance mode, because even the maintainers cannot get in.

Blocking required webhooks

External systems continue sending requests while WordPress rejects them.

Leaving all REST endpoints active during a database write freeze

The site looks closed while applications continue modifying the database.

Using maintenance mode instead of staging

Visitors should not need a 503 because somebody wants to adjust a button margin.

Starting maintenance before preparation is complete

Backups, deployment packages and credentials should be ready before downtime begins.

Having no rollback threshold

“Another ten minutes” can become a surprisingly durable operational philosophy.

Making the maintenance page heavier than the site

A temporary failure response does not need four megabytes of JavaScript.

Using WordPress-level maintenance when WordPress cannot boot

The maintenance layer must exist above the component being taken offline if that component cannot respond.

A practical maintenance mode checklist

  • Confirm maintenance mode is actually required.
  • Define exactly which services need to become unavailable.
  • Choose the smallest practical maintenance scope.
  • Prepare the deployment before enabling maintenance.
  • Create and verify a backup.
  • Define rollback criteria.
  • Choose a realistic expected duration.
  • Return 503 Service Unavailable for temporarily unavailable resources.
  • Add a realistic Retry-After value where appropriate.
  • Prevent inappropriate caching of maintenance responses.
  • Keep robots.txt accessible.
  • Do not use site-wide noindex for a short maintenance window.
  • Do not permanently redirect URLs to the maintenance page.
  • Allow authorized staff to bypass maintenance.
  • Keep required login routes accessible.
  • Decide how AJAX should behave.
  • Decide how REST API requests should behave.
  • Review payment webhooks and other callbacks.
  • Review monitoring and health-check routes.
  • Test anonymous visitors separately from administrators.
  • Test representative URLs with curl or browser DevTools.
  • Verify actual response headers.
  • Test CDN behavior.
  • Test cache purging before the maintenance window.
  • Use a lightweight maintenance page.
  • Provide useful visitor information.
  • Keep the maintenance page accessible.
  • Do not expose technical secrets.
  • Monitor the underlying migration or repair.
  • Run production smoke tests before reopening.
  • Disable maintenance promptly after validation.
  • Purge maintenance content from relevant caches.
  • Verify normal URLs return their normal statuses again.

A maintenance-mode decision tree

Does production need
to become unavailable?
│
├── No
│   └── Use staging / normal deployment
│
└── Yes
    │
    └── Is the outage temporary?
        │
        ├── Yes
        │   └── Maintenance mode
        │       + 503
        │       + Retry-After
        │
        └── No
            └── Use a proper
                long-term publishing /
                migration strategy

A scope decision tree

What is actually unavailable?
│
├── Frontend presentation only
│   └── Consider frontend-only
│       maintenance
│
├── Public writes
│   └── Block relevant forms,
│       APIs and transactions
│
├── Entire WordPress application
│   └── Whole-app maintenance
│
└── WordPress cannot boot
    └── Serve maintenance
        upstream from WordPress

An SEO decision tree

Short maintenance window?
│
├── Yes
│   ├── 503 unavailable pages
│   ├── Retry-After
│   ├── robots.txt reachable
│   └── no site-wide noindex
│
└── Extended shutdown?
    └── Do not leave the
        whole site in 503
        indefinitely

A caching decision tree

Maintenance enabled
│
├── Does CDN/page cache
│   bypass WordPress?
│   │
│   ├── Yes
│   │   └── Configure maintenance
│   │       at/cache layer too
│   │
│   └── No
│       └── WordPress response
│           can reach visitor
│
└── Maintenance disabled
    │
    └── Purge cached maintenance
        response and verify 200

A practical maintenance workflow

1. Prepare deployment
2. Prepare backup
3. Verify rollback
4. Notify stakeholders
5. Configure monitoring
6. Enable maintenance
7. Verify public 503 response
8. Perform required work
9. Test as authenticated staff
10. Validate database/application
11. Purge caches
12. Disable maintenance
13. Verify normal 200/redirect/404 statuses
14. Test critical business flows
15. Continue monitoring

Example: simple theme deployment

If deployment is atomic and does not change incompatible data:

Upload release
↓
switch release
↓
clear cache

maintenance mode may not be necessary.

Example: database schema migration

Prepare release
↓
backup
↓
maintenance ON
↓
disable public writes
↓
run migration
↓
deploy compatible code
↓
test
↓
maintenance OFF

Example: ecommerce migration

Reduce active transactions
↓
verify payment queues
↓
backup
↓
maintenance ON
↓
final order/customer sync
↓
switch application
↓
verify payment callbacks
↓
test checkout
↓
maintenance OFF

Example: server maintenance

If:

PHP
database
and WordPress

will all be unavailable, serve maintenance from:

CDN
reverse proxy
or separate infrastructure

rather than depending on WordPress to generate it.

Related WordPress maintenance and launch guides

For the wider maintenance, staging, launch and HTTP cluster, continue with:

Final thoughts

Good WordPress maintenance mode is not primarily about the maintenance page.

It is about correctly representing temporary service availability.

The maintenance HTML tells a visitor:

The website is temporarily unavailable.

The HTTP response tells automated clients:

503 Service Unavailable

Retry-After can indicate when the service expects to recover.

Cache controls help ensure the maintenance response disappears when the site returns.

Request exclusions keep essential routes such as robots.txt, administrative access, health checks or required integrations functioning where appropriate.

And a defined maintenance window prevents a temporary outage from quietly becoming the site’s new lifestyle.

TheOneWP Maintenance Mode follows this model by providing maintenance-page and redirect options, staff bypass behavior, redirect-loop protection and temporary HTTP signaling rather than treating maintenance as a cosmetic frontend overlay.

The practical rule is:

If the site is temporarily unavailable,
make the protocol say temporarily unavailable.

Then keep the interruption as short as possible.

If the only reason visitors are staring at a 503 for four hours is that somebody began the deployment before finding the SSH password, HTTP semantics have already done everything they reasonably can for humanity.

Simplify your WordPress stack

A modular WordPress toolkit. 104 focused tools.

Ultimately, you can build cleaner workflows, maintain fewer plugins and enable only the features each website actually needs.