No matching questions found.
Try a different keyword.
Safety & Update Concerns
Can running maintenance cause my site to go down?
The app automatically creates a DB backup before updates and checks the HTTP status after each individual plugin update. If any of the following are detected, the offending plugin is immediately rolled back to its previous version (pinpoint rollback) and the site is re-checked to confirm recovery:
β€’ HTTP 5xx server errors (PHP fatal, database errors, etc.)
β€’ HTTP 4xx regressions (a page that was 200 before becomes 404, 403, 401, etc.)
β€’ Site unreachable (connection failure, timeout, DNS issues)
Sites with "Aggressive Auto-Fix Mode" enabled will additionally restore the DB and files together to their pre-update state if the site remains broken after maintenance completes. The risk of a site staying broken is low, but not zero. Please only use this app if you are able to perform manual recovery if needed.
What types of failures does automatic recovery handle?
The app's per-plugin HTTP check detects HTTP 5xx server errors, HTTP 4xx regressions (e.g., 200 β†’ 404), or site unreachable conditions. When any of these is detected, it automatically rolls back the offending plugin to its previous version (pinpoint rollback) and verifies recovery. The same mechanism applies to WordPress core updates. The rollback WP-CLI command is dynamically given a targeted skip directive (--skip-plugins=<offending plugin name>) that excludes only the broken plugin from loading, so even if it is throwing a fatal error, the rollback itself is guaranteed to execute. Sites with "Aggressive Auto-Fix Mode" enabled will additionally restore the DB and files together to the pre-update state as a last resort if the site is still broken. Note that themes are updated in bulk and are therefore not subject to per-theme rollback. Severe database corruption and browser-only (no-SSH) mode may also fall outside the scope of automatic recovery.
If a WordPress core update is rolled back due to an issue, what happens to the remaining plugin updates?

When a post-core HTTP check detects an issue, the app first rolls back the core to its previous version. What happens next depends on the rollback outcome β€” there are two paths:

  • Rollback succeeded + recovery verified (the most common case) β†’ The remaining plugin updates proceed normally with per-plugin HTTP checks. The core is back to its previous version, and subsequent plugins are updated with their own pinpoint-rollback safety net.
  • Rollback failed, or rollback succeeded but the site still does not return a healthy status β†’ The remaining plugin/theme/language updates are halted and the situation is reported via email. Continuing to update plugins on an already-broken site risks falsely rolling back unrelated plugins, so the app errs on the side of safety and stops.

In the latter case, please verify and repair the core (via the WordPress dashboard or manual SSH as needed) before re-running maintenance. The execution log will explicitly state "Subsequent updates halted after core rollback", and this is reflected in the report and email notification.

What is "Aggressive Auto-Fix Mode" and should I enable it?

For most use cases, leaving this OFF (default) handles the majority of issues. Turning it ON adds a last-resort comprehensive recovery layer that activates only if the site is still broken after the main maintenance run completes.

Feature OFF
(default)
ON
πŸ“¦ At maintenance start
DB backup before updatesβœ…βœ…
πŸ”§ During each update (one plugin at a time + core)
Pinpoint rollback
Post-update HTTP check β†’ 5xx / 4xx regression / unreachable detected β†’ roll back to previous version β†’ verify recovery
βœ…βœ…
WP-CLI safe mode (per-operation skip strategy)
Full skip for core/DB/translation; full load for plugin/theme detect/update; targeted skip for rollback
βœ…βœ…
πŸ” Post-maintenance verification
Home-page HTTP check & screenshot comparisonβœ…βœ…
Identify responsible plugin from fatal logs and deactivate
β€» Requires SSH to be configured
βœ…βœ…
Email notification (success / attention / error)βœ…βœ…
⚑ Last-resort recovery (if the site is still broken after the steps above)
Full DB rollback (restore from backup)β€”βœ…
Bulk file rollback for all updated plugins / core
β€» Premium plugins not on WordPress.org are excluded from file restoration (deactivated only)
β€”βœ…
Force cache flush (wp cache flush + cache directory clear)β€”βœ…
Automatic theme switch (to Twenty series temporarily)
β€» If no Twenty series theme is installed, the switch is skipped and a warning is sent
β€”βœ…
Additional plugin deactivation (if log analysis finds another cause)β€”βœ…
wp doctor health diagnosticβ€”βœ…

When to enable it

  • You manage multiple client sites as an agency and want reliable unattended recovery during off-hours
  • You want the app to resolve HTTP 500 errors as automatically as possible without waiting for human judgment
  • SSH is configured for the site (this mode has no effect on browser-only sites)

Important notes

  • Automatic theme switching may change the visual appearance: if a theme is identified as the cause, the site is switched to a Twenty series theme. Your client may notice the visual change before you do β€” review the report email and restore as needed.
  • Aggressive by name and by behavior: this mode operates under the assumption that the site is already broken. There is a non-zero risk of unintended restoration when conditions are misjudged.
  • Not foolproof: complex errors may not be resolved automatically. Always review the report email after each maintenance run.
  • SSH required: this mode does not apply to sites configured without SSH.

A good approach: start with it OFF β€” the rows under πŸ“¦ / πŸ”§ / πŸ” already cover most failures. Turn it ON only when you encounter complex incidents that those layers couldn't resolve.

Will all plugins and themes be updated?
Premium plugins and themes that require activation may not be updated automatically. Any plugins that could not be updated will be listed in the report email.
Are themes also rolled back individually?

No. Themes are not subject to per-theme rollback. Theme updates run as a single bulk operation (wp theme update --all), so if the site breaks afterwards, there is no way to identify which specific theme caused the failure.

Plugin and WordPress core updates are run one-by-one with an HTTP check between each, which is why pinpoint rollback works for them. Themes can't be handled the same way by design.

What happens when a theme update breaks the site:

  • The end-of-maintenance home-page HTTP check detects 500 / 4xx and reports it via email (the cause cannot be attributed specifically to the theme update β€” the site is flagged as "requires attention")
  • For sites with "Aggressive Auto-Fix Mode" enabled, if a fatal log identifies a theme as the cause, the app will attempt to switch to a default WordPress theme (Twenty series)
  • Theme files themselves are NOT rolled back automatically β€” manual intervention is required

Note: theme-related failures are statistically less than 1/10 the frequency of plugin-related failures in production, which is why this is a deliberate priority trade-off.

Can rollback still execute when the rolled-back plugin itself is throwing a fatal error?

Yes β€” reliably. The app dynamically attaches a targeted skip directive (--skip-plugins=<target plugin name>) to the WP-CLI rollback command, which causes WordPress to skip loading only that specific broken plugin while keeping everything else loaded.

As a result, even if the just-updated plugin is throwing a fatal error, the WP-CLI process performing the rollback is unaffected by it and can complete the file replacement (restoring the previous version) reliably. Other healthy plugins and paid plugins remain loaded so their custom update filters keep firing normally.

The actual sequence:

  • 1. Plugin X is updated (files replaced)
  • 2. HTTP request to the site β†’ fatal β†’ HTTP 500
  • 3. The app runs wp plugin install X --version=OLD --force --skip-plugins=X
  • 4. WP-CLI bootstraps without loading the broken plugin X β†’ file replacement succeeds
  • 5. HTTP request again β†’ site loads with the old plugin version β†’ 200 (recovery verified)

Note: PHP-CLI (command line) and PHP-FPM (web) run as separate processes. Even if the web side is completely down due to a fatal, the SSH-side rollback runs independently.

Can updates be run at night or outside business hours?
There is no built-in scheduler. Please trigger maintenance manually when you want it to run.
How does the screenshot comparison feature work?
When this feature is enabled, screenshots of the homepage are automatically taken before and after updates, and the visual difference is detected. If the difference exceeds 8%, it is flagged and reported as an anomaly.
β€» Sites with carousels or animated content are likely to produce false positives, so this feature is not recommended for such sites.
Where are screenshots saved? Can I share them with clients?
Screenshots are saved in the γ€Œscreenshots」folder on the PC running the app. They are not stored on the server. After maintenance, you can download files from the "πŸ“Έ Screenshots" section in the log detail view (click on any site's log entry).
β€» Post-maintenance screenshots are automatically saved for all sites. Sites with "Screenshot Comparison" enabled will have two images saved (before and after), with automatic diff detection. Images are retained for 90 days by default.
Where are database backups stored?
Backups are saved in two locations: on the server (inside a wpmm_backups/ folder within the WordPress installation directory) and locally on the PC running the app. During maintenance, a backup_YYYYMMDD_HHMMSS.sql file is automatically created and downloaded to your local machine via SSH/SFTP. Only the latest 3 generations are kept both on the server and locally β€” older files are automatically removed so the disk does not fill up over time.

Note: the retention count (3 generations) is fixed by design and is not user-configurable.
Are the database backup files on the server safe from unauthorized external access?
Yes β€” the wpmm_backups/ folder on the server is protected by two layers of defense, applied automatically.

β‘  .htaccess blocks all requests: On Apache-based hosts (Xserver, Sakura, Heteml, ConoHa WING, and most major shared hosting), the folder includes an .htaccess file that returns 403 Forbidden for everything inside. Even if someone guesses the URL of a SQL file, the server refuses to serve it. The rules are written to work on both Apache 2.2 and 2.4.

β‘‘ index.php as an Nginx fallback: For Nginx-based hosts that ignore .htaccess, the folder also contains an index.php that returns 403 Forbidden directly via PHP β€” providing the same protection through a different mechanism.

Both files are generated and maintained by the app automatically. If either is accidentally removed, it will be re-created on the next maintenance run, so the protection cannot silently degrade over time.
Can I use this alongside WordPress's built-in plugin auto-update feature?
There is no technical conflict, but for safety we recommend disabling WordPress's built-in auto-updates and managing all updates through WP Maintenance Manager.

β–  Note: plugins not using the standard update mechanism are a separate matter
The WordPress "Enable auto-updates" toggle only affects plugins that use WordPress's standard update mechanism. Theme-bundled plugins and some paid plugins that manage updates entirely through their own custom APIs do not use the standard mechanism. These are not updated by WP-Cron regardless of the auto-update toggle, and they are also not picked up by WP Maintenance Manager. They must be updated manually from the individual plugin's update screen in the WordPress admin. Check each plugin's documentation or its behavior in the admin to see which category it falls into.

β–  Why no conflict
WP Maintenance Manager only processes plugins that currently have updates available. If WP-Cron already auto-updated a plugin, the app simply skips it. No errors, no race condition.

β–  Why we recommend disabling WP auto-updates
WordPress's built-in auto-update has none of the safety nets that WP Maintenance Manager provides:
・Database backup before every run
・Post-update HTTP check after each plugin
・Pinpoint rollback to the previous version
・Pre / post screenshot comparison

An auto-update triggered by WP-Cron at 3 AM can break the site silently. By the time someone notices in the morning, the previous version is no longer recorded, and automatic recovery is no longer possible.

β–  Important note about excluded plugins
The "Excluded Plugins" setting in WP Maintenance Manager does not control WordPress's built-in auto-updates. To freeze a specific plugin at a particular version, you need to set both:
β‘  Add the plugin to the Excluded Plugins list in WP Maintenance Manager
β‘‘ Open the WordPress Plugins page and click "Disable auto-updates" for that plugin individually

If you only do one, WP-Cron will eventually override the freeze.

β–  Recommended setup
・Default (recommended): Disable auto-updates for all plugins on the WordPress side, and let WP Maintenance Manager handle every update
・Emergency security only: Leave auto-update on for select plugins, with awareness of the risks above
My server has sites running on different PHP versions. How should I configure the WP-CLI path?
From v1.6.1, you can keep the SSH profile's WP-CLI path as the "server-wide default" and override it on a per-site basis for exceptions.

β–  Recommended workflow
β‘  Set the SSH profile's WP-CLI path to the PHP version most commonly used on the server (e.g. /opt/php-8.2/bin/php /usr/bin/wp). This works for the majority of sites.
β‘‘ For exceptional sites (e.g. one site that needs PHP 8.3) use the "WP-CLI Path (optional override)" field on the SSH tab of the site edit screen (e.g. /opt/php-8.3/bin/php /usr/bin/wp). Leave blank to use the profile value.

Sites with an active per-site override show a "βš™ override" badge in the site list. Hover to see the actual WP-CLI path being used.

β–  No more profile duplication
Before v1.6.1, you needed to duplicate SSH profiles per PHP version as a workaround. From v1.6.1, this per-site override consolidates everything into one profile. SSH key updates only need to be done once.
On Xserver I get "PHP Parse error: syntax error, unexpected '?'…compat-utf8.php on line 47"
This is a typical Xserver-specific error. The cause is that the PHP version specified in the server control panel (Web side) and the PHP version used when running wp over SSH (CLI side) are managed separately. The CLI side defaults to an old PHP (7.0 series), which then fails to parse modern WP-CLI compatibility code.

β–  Solution
In the SSH profile edit screen, change the "WP-CLI Path" field to the PHP-absolute-path format:
/opt/php-<version>/bin/php /usr/bin/wp

Match the version part to your site's PHP version:
・PHP 7.4 β†’ /opt/php-7.4/bin/php /usr/bin/wp
・PHP 8.1 β†’ /opt/php-8.1/bin/php /usr/bin/wp
・PHP 8.3 β†’ /opt/php-8.3/bin/php /usr/bin/wp

From v1.6.0, the "πŸ” Detailed Diagnostic" button (next to the Connection Test button on the SSH profile edit screen) observes your server environment in read-only mode and suggests a recommended WP-CLI path (use as a reference target).

From v1.6.1, when sites on the same server use different PHP versions, you can also override the WP-CLI path per site via the "WP-CLI Path (optional override)" field on the SSH tab of the site edit screen, in addition to the server-wide default above.
I heard that some plugin updates can be missed. How does the app handle this?
v1.6.2 brings further improvements.

β–  Improvements in v1.6.1
β‘  Force-refresh the update notification cache: WordPress's internal update notification cache (valid up to 12 hours) was sometimes stale, causing freshly-released plugin versions to be temporarily missed. The app now force-refreshes three caches (plugins / themes / core) at the start of each maintenance run (right after the database backup completes).
β‘‘ Browser residual update: A complementary mechanism to update plugins via the admin screen when SSH (WP-CLI) cannot retrieve them. Toggle on/off via the "🌐 Browser Residual Update" switch on the General tab of the site edit screen (default ON).

β–  Additional improvement in v1.6.2
For plugin/theme detection and updates over SSH (WP-CLI), the app now runs these commands with plugins and themes loaded so that custom update filters (used by many paid plugins/themes) fire correctly. As a result, plugins and themes that appear in the WordPress admin's update list are now more reliably handled over SSH (with pinpoint rollback support).

β–  Note: plugins updated via browser residual update are NOT eligible for pinpoint rollback
The browser residual update is a bulk update, so per-plugin HTTP checks and automatic rollback to the previous version do not fire. Execution logs and report emails clearly indicate "step rollback disabled". If a site breaks during a residual update, you will need to use the pre-run database backup to restore the whole site.

β–  Plugins that still won't be updated
Plugins that don't appear in the WordPress admin's update list β€” theme-bundled plugins, or plugins that only show their own custom "update available" link rather than the standard notice β€” are out of scope. These must be updated manually from the WordPress admin.
Are paid plugins updated?
The reliable test is "does the plugin appear in your WordPress admin's update list?"

Many paid plugins surface their "update available" notification through WordPress's standard update list once the license is activated. In that case, they fall within this app's auto-update scope. Plugins that only show a custom "update available" link of their own and never appear in the standard update list cannot be detected by this app.

β–  Update path (when listed in the standard update list)
・If retrievable via SSH (WP-CLI) β†’ updated one-by-one over SSH (pinpoint rollback supported)
・If not retrievable via SSH but visible as "update available" in the admin β†’ handled in bulk by the browser residual update (no pinpoint rollback)

β–  When the license is not activated, or when the plugin uses a fully custom updater
The plugin does not appear in WordPress's standard update list, so this app cannot detect it. Activating the license often makes the plugin eligible β€” check your site's admin update list first.
What happens if I press the "Stop" button during maintenance?
Pressing Stop sends a stop signal to the process. The app will finish processing the current site before stopping, so updates are never interrupted mid-way. Sites that have already been processed remain updated; remaining sites are skipped.
β€» After sending the stop signal, it may take a few seconds to tens of seconds before the app actually halts.
What is "Selected Plugin Update"? How is it different from a regular maintenance run?

New in v1.6.2. Open the dashboard via the "Plugin Updates" button in the toolbar, tick the (site Γ— plugin) pairs you want, then click "Update Selected Plugins" in the footer. Only the plugins you selected will be updated.

The only difference from a regular maintenance run is the scope:

  • βœ… DB backup, per-plugin HTTP check, automatic pinpoint rollback on failure, post-update visual verification, summary email β€” all run exactly as in a normal maintenance
  • ❌ Only WordPress core, themes, and translations are skipped

This is fundamentally different from other tools' "Update All" buttons. Those run without a safety net and can't recover from failures at the plugin level. With Selected Plugin Update, you keep the full safety policy while narrowing the scope.

The log history shows a "Selected Update" tag along with the target plugin names. PDF/HTML reports also include a clear notice that "core, themes, and translations were intentionally not updated in this run," so you can use the same artifact for client reporting.

Technical Setup
What are the system requirements?

The app runs on the following environments:

Item Windows Mac
OS Windows 10 / 11 (64-bit) macOS 13.5 Ventura or later
CPU 64-bit processor Intel / Apple Silicon
RAM 4 GB or more recommended
Required Internet connection, WordPress 5.0 or later
How do I get an SSH private key?

SSH uses a key pair instead of a password. The private key is a file stored on your computer; the public key is registered on the server. Both are required to connect.

How to generate a key on major hosts:

  • SiteGround: Site Tools β†’ Devs β†’ SSH Keys Manager β†’ Create β†’ Actions β†’ Private Key β†’ copy & save as a file. Use port 18765.
  • Bluehost: Websites β†’ Manage β†’ Files & Access β†’ Shell Access ON β†’ Manage SSH Keys β†’ generate or register a key.
  • AWS (Lightsail / EC2): Use the .pem key pair downloaded when you created the instance. No extra steps needed.

For full step-by-step instructions, see the "Before You Start" section in the User Guide.

What should I enter in the "Private Key Path" field?

Enter the file path to where you saved the private key on your computer.

  • Mac / Linux: ~/.ssh/your-key.pem
  • Windows: C:\Users\YourName\.ssh\your-key.pem

We recommend moving the downloaded key file into your .ssh folder (create it if it doesn't exist), then entering that path.

What should I enter in the "WP-CLI Path" field?

In most cases, leave it blank. SiteGround, AWS Bitnami images, and most major hosts include WP-CLI by default β€” leaving this field empty will work automatically.

Only fill this in if you have installed WP-CLI at a custom path, or if the connection test reports "WP-CLI not found." If that happens, see the next FAQ item for a GUI-only fix.

The connection test says "WP-CLI not found" on my shared host. How do I fix it?

Try the new "πŸ” Diagnose" button (v1.5.9 or later), located next to the "Test Connection" button in the SSH profile editor. The diagnostic observes your server in read-only mode and proposes a suggested WP-CLI Path as a best-effort reference. It has been empirically tested across 4 host types. The suggestion is not guaranteed to be correct β€” please verify with the connection test before saving.

If the diagnose suggestion doesn't help, install WP-CLI manually with this single SSH command:

mkdir -p ~/bin && cd ~/bin && \
curl -sO https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \
mv wp-cli.phar wp && chmod 755 wp && ~/bin/wp --info

If ~/bin/wp --info prints WP-CLI's version banner, you're done. Most hosts have ~/bin in $PATH, so leaving "wp" in the WP-CLI Path field will work; otherwise enter the absolute path /home/<username>/bin/wp.

⚠️ Avoid uploading wp-cli.phar via web file manager or FTP. Web-based file managers and some FTP clients can corrupt the PHAR signature in transit, leading to a runtime "broken signature" error. We've reproduced this on multiple hosts. Downloading directly on the server via SSH+curl is the most reliable approach.

Detailed step-by-step instructions are in the User Guide under "What is SSH & WP-CLI?" β†’ "If the connection test reports 'WP-CLI not found'."

SSH suddenly stopped working on Xserver. I see "Connection refused" or "Connection closed by ..."

Your source IP address is most likely being temporarily blocked by the hosting provider. Many shared hosting providers, including Xserver, have a protection mechanism that refuses connections from a source IP after a short burst of SSH authentication failures. Xserver support officially confirmed to us that they use fail2ban to temporarily block source IPs that exceed the authentication retry limit (the specific thresholds and ban duration are kept private for security reasons).

This often happens when you manage multiple SSH keys in ~/.ssh/ or in an SSH agent. A single connection can end up offering several keys before reaching the intended one β€” and if the keys the server doesn't accept are tried first, the failure count can hit the provider's threshold.

As of v1.6.5, the app is hardened to use only the single key you specified in the site settings, so this situation should no longer arise from the app's behavior. If you are on v1.6.4 or earlier, please consider updating to the latest version.

If you're currently being blocked:

  • Stop all SSH connection attempts from that PC for roughly half a day to a day (including any background auto-retry). Retrying while still blocked can extend the ban, so resist the temptation to "just try once and see." In our own measurements, the block clears itself within half a day to a day of complete silence
  • To verify whether the block has lifted, run this command once only from the terminal (it uses only the single specified key, minimizing additional failure counts even if you're still blocked):
    ssh -i ~/.ssh/your_key -o IdentitiesOnly=yes -o IdentityAgent=none -p 10022 username@hostname 'echo ok'
  • If you need to confirm what's going on, try connecting from a different network (smartphone tethering, etc.). If the same key + same username works immediately from a different IP, that confirms your previous IP was the one being blocked
  • If the block persists, contact Xserver support. Include your contract server ID, source IP, the time you noticed it, the destination host name, and (if possible) the verbose SSH log output

The error message has two severity levels: mild = Connection closed by [server IP] port 10022 (TCP completes but the server closes the connection immediately), severe = Connection refused (rejected at the TCP layer). Both are symptoms of the same fail2ban mechanism, and continued retries while blocked tend to escalate from mild to severe.

Note: this protection mechanism applies to any SSH client (Tera Term, the macOS Terminal, your IDE, etc.), not just this app. If you manage many sites from the same machine, we recommend assigning a dedicated key per server and making sure each connection (in this app's site settings, or in your ~/.ssh/config) explicitly points to that one key.

The "private key file permissions are too open" warning no longer appears. Is this OK?

Yes β€” the warning was intentionally removed in v1.6.5.

The app uses the paramiko Python SSH library internally. Unlike the OpenSSH command-line client (ssh / scp), paramiko does not enforce the StrictModes check on private key files, so a key file with 644 permissions can usually still be used to connect successfully.

v1.6.3 and v1.6.4 displayed the warning as a precaution, but the "fix and continue" auto-retry path it triggered was contributing to repeated connection attempts in some environments, which in turn could cause the hosting provider's protection mechanism to temporarily block the source IP. We removed the warning in v1.6.5 for that reason.

The general recommendation for private key permissions hasn't changed. On Mac / Linux, chmod 600 ~/.ssh/your_key is still the OpenSSH-recommended setting; on Windows, granting "full control to the current user only, with inheritance disabled" via icacls is the equivalent. It's not strictly required for this app to function, but if you also use the OpenSSH command-line client, or if your PC is in a shared environment, we recommend tightening the permissions manually.

I get "php: command not found" or "/usr/bin/env: php" when starting WP-CLI.

Some shared hosts (Heteml in Japan, certain CloudLinux/cPanel configurations, etc.) only expose versioned PHP commands like php8.3 and don't put a plain php on the shell PATH. The WP-CLI shebang #!/usr/bin/env php then fails because env can't locate php.

The fix is to set the WP-CLI Path to the absolute PHP binary plus the WP-CLI file, for example:

/usr/local/bin/php8.3 /home/users/0/<username>/bin/wp

The "πŸ” Diagnose" button (v1.5.9 or later) detects this situation automatically and proposes the absolute-path form of the command. Click "↑ Insert this value into the WP-CLI Path field" to apply, then re-run the connection test to verify.

The proposed value is a best-effort suggestion only. Always verify with the connection test, since host-specific quirks may make the suggestion inaccurate.

Is there a way to install WP-CLI automatically? (v1.6.0)

Yes. As of v1.6.0, the "πŸ” Diagnose" result in the SSH profile editor includes a "πŸ“¦ Install WP-CLI automatically" section when applicable (only shown when WP-CLI is missing AND the home directory is writable AND GitHub is reachable). This installs the WP-CLI PHAR onto your server over SSH, in one click.

A two-stage workflow prevents accidental damage:

  1. "πŸ§ͺ Test in an isolated path first" installs to ~/wpmm_install_test_<timestamp>/wp. Your existing ~/bin/wp is completely untouched, so you can try the install safely.
  2. Once the isolated install verifies, "πŸ“¦ Install to ~/bin/wp" performs the real install (after a confirmation dialog). If a wp file already exists, it is preserved as wp.broken_backup_<timestamp> (the latest 3 backups are kept automatically).

No broken state is left behind on failure. The pipeline downloads to a tmp file, validates the size, runs --info for behaviour verification, and only then atomically renames the file into its final location. If any step fails, the tmp is deleted and any prior wp backup is automatically restored.

Every SSH command, stdout, stderr, and exit code is saved to logs/install_wpcli_<timestamp>.json for later inspection.

Supported hosts: any server with a writable home directory, either curl or wget, and outbound HTTPS access to GitHub (most shared hosts qualify). Restricted environments that block outbound HTTPS (some managed hosting setups) will receive an explicit error message.

What does the "πŸ” Diagnose" button do, and how accurate is it?

Added in v1.5.9, the Diagnose button is next to "Test Connection" in the SSH profile editor. It connects to your server over SSH and runs read-only commands to observe:

  • OS and shell type
  • HOME directory location and writability
  • Where php lives (PATH or absolute candidates)
  • Whether WP-CLI exists system-wide or in ~/bin and whether it actually runs
  • GitHub reachability (to determine if auto-install would work)

From these observations it proposes the most likely WP-CLI Path as a best-effort reference. No files are written to your server (it briefly creates and immediately deletes a single ~/.wpmm_diag_test_$$ file solely to test write permission).

⚠️ The suggestion is not a guarantee. Host-specific quirks (custom PHP selectors, chroot environments, proxy constraints, etc.) may not be fully covered, so the proposed value can be inaccurate. Always verify with the "Test Connection" button after applying the suggestion.

Empirically tested on Xserver, Sakura Internet, ConoHa WING, and Heteml. The same patterns are likely to work on most major hosts (SiteGround, Bluehost, DreamHost, Hostinger, etc.) but this hasn't been formally validated.

Can I organize the site list by client or project?

Yes β€” two complementary systems are available: categories and tags.

  • Categories β€” A single exclusive label per site. Best for organizing by client or project, with a custom color so you can spot each group at a glance in the list.
  • Tags β€” Multiple cross-cutting labels per site (e.g. EC, needs report, contracted year). Useful for attributes that span across categories.

Manage them under βš™ Settings β†’ "Categories & Tags". Assign them in the site add/edit dialog, and filter the list with the dropdowns above the registered-site table.

The tag filter has both OR (any of the selected) and AND (all selected) modes, and works in combination with the text search.

Can I view the maintenance log history for just one site?

Yes. Click the "πŸ•’ Logs β€Ί" link in the "Last Run" column of any row in the registered-site list. The log dialog opens scoped to just that site.

Renaming a site keeps its log history intact. Each site has a stable internal identifier, so logs from before and after a rename appear under the same scope.

Click "Show all logs" at the top of the dialog to leave the scoped view. Older logs (recorded before v1.5.8) don't have the internal identifier, so they fall back to site-name matching.

Can I delete logs partially (per site / by period / by selection)?

Yes β€” three flexible options are available:

  • Per site: Open the per-site log view via the "Logs β€Ί" link in the registered-site list, then click "Delete this site's logs". Logs for other sites are kept intact.
  • Filtered results: Filter by status (Success / Error / etc.) or by period (last 7 / 30 / 90 days), then click "Delete filtered results". Only entries matching the filter are deleted.
  • By selection: Tick the checkboxes for individual rows and click "πŸ—‘οΈ Delete Selected". Useful for cleaning up specific entries one-by-one.

In every case, a confirmation dialog shows the **exact number of entries** that will be deleted. "Delete all" only appears when there is no filter at all β€” kept as the explicit last resort.

What happens to my sites if I delete a category or tag?

A confirmation dialog appears before deletion so your site data stays safe.

  • Deleting a category: Choose whether to reset affected sites to "Unassigned" or move them to another category in bulk (the impact count is shown up front).
  • Deleting a tag: The tag is automatically removed from every site that uses it. Other tags and any other site setting are untouched.

Site data itself (SSH info, WordPress paths, history, etc.) is never affected by category/tag operations.

Can I use it without deep WordPress or server knowledge?
Basic operations can be completed just by following the on-screen prompts. However, SSH configuration is required, which involves enabling SSH in your hosting control panel and making WP-CLI available. Major hosting providers like Xserver and Sakura Internet provide detailed setup guides on their side.

For a step-by-step walkthrough from SSH profile setup to your first maintenance run, see the User Guide.
Can maintenance run without SSH access?
Yes. Without SSH, you can still run maintenance using browser automation (Playwright) mode, which operates through the WordPress admin dashboard. Note that features such as DB backup will not be available in this mode.
Do I need to install any plugins on WordPress?
No. No plugin installation is required whatsoever. The app operates externally without modifying your WordPress installation.
Does it work on both Mac and Windows?
Yes. Installers are available for both Mac and Windows.
What hosting providers are supported?
Any server with SSH enabled is supported, regardless of hosting provider. Confirmed working on Xserver, Sakura Internet, ConoHa WING, Heteml, AWS, Vultr, and more. For servers without SSH, browser automation (Playwright) mode is available. (DB backup and some features are not available in this mode.)
Which browser opens when I launch the app? Can I choose a specific browser?
The app opens your OS's default browser automatically. There is no in-app browser selection setting.

  • 🍎 Mac: Change your default browser in System Settings β†’ Desktop & Dock β†’ Default web browser.
  • πŸͺŸ Windows: Change your default browser in Settings β†’ Apps β†’ Default apps β†’ Web browser.

Once the app is running, copy the URL shown in the address bar of the browser that opened automatically and paste it into any other browser to access the same screen.
Can I manage sites protected by HTTP Basic authentication (staging environments, etc.)?

Yes β€” fully supported since v1.6.2. The WordPress tab of the site edit screen now includes a collapsible "πŸ” Basic auth (optional Β· only if the site is HTTP basic-auth protected)" section where you can enter a username and password. The password is stored encrypted.

Basic auth credentials are used by these processes:

  • Pre/post-update visual checks (Playwright HTTP check of the home page)
  • Thumbnail capture for the site list
  • Browser residual update (the v1.6.1 feature that handles paid plugins like ACF Pro / Yoast SEO Premium via the admin panel)

SSH / WP-CLI updates themselves are not affected by basic auth, so if you don't use the three features above, the credentials are optional. The same section contains a "πŸ”— Test connection + capture thumbnail" button that verifies connectivity and captures the site list thumbnail in a single click.

Recommended for: staging environments, dev environments, internal sites, and any other WordPress site protected by HTTP basic authentication.

The plugin list shows a "PHP Deprecated" error and won't load

Sometimes a flood of "PHP Deprecated: ... is deprecated" warnings appears and fetching the plugin list or detecting available updates fails. These warnings are emitted by the server when an older version of WP-CLI is combined with a newer PHP (8.2 or later). Neither the app nor your site is broken.

This is addressed in v1.6.8. The app now suppresses these warnings and reliably extracts the result even when it is buried in warning output, so the plugin list and update detection succeed. Please update to v1.6.8 or later and try again.

If you are able to update the server-side WP-CLI to a newer version (2.8 or later), the warnings stop appearing altogether. If you're not sure how, please ask your hosting provider's support.

Pricing & Billing
Can I start for free?
Yes. The Free plan requires no registration and allows up to 1 site, 3 runs per month β€” completely free. Try it out before deciding on a paid plan.
Is billing monthly or annual?
Both monthly and annual billing are available. Annual billing saves approximately 20% compared to monthly. You can switch between them at any time.
When does the license validity period start?
The license period starts from the moment you enter the license key in the app. Validity is calculated to the end of the month.
Example: Monthly license key entered on March 15 β†’ valid through April 30
β€» The period starts from when the key is entered, not when it was purchased.
Can I cancel anytime? Is the process complicated?
You can cancel immediately at any time. Cancellation is self-service through the customer portal (the email address used at signup is required). You may also contact us to handle it, but there may be a 1–2 day delay. After cancellation, you can continue using the service until the end of your current billing period.
What payment methods are accepted?
Payments are processed via Stripe. Credit cards (Visa, Mastercard, JCB, Amex, etc.), Apple Pay, Google Pay, and many other methods are supported through Stripe's global payment infrastructure.
Operations & Data
How many sites can I manage?
It depends on your plan: Free (1 site), MINI (3 sites), LITE (15 sites), STANDARD (100 sites), BUSINESS (200 sites). For more than 200 sites, please contact us.
Where are DB backups saved?
Backups are saved to your local PC. You can choose any folder and download them with one click.

Backup files also remain on the server inside a wpmm_backups/ folder within the WordPress installation directory (the folder specified as "WordPress Path" in the site settings), named backup_YYYYMMDD_HHMMSS.sql. You can retrieve them manually via FTP or your hosting control panel's file manager.

Only the latest 3 generations are kept both on the server and locally β€” older files are automatically removed. The retention count (3 generations) is fixed by design and is not user-configurable. The wpmm_backups/ folder is protected by .htaccess and index.php files to block external access.
Can I share maintenance reports with clients?
Yes. Select sites from the maintenance log screen, preview the report, and download it as a PDF or HTML file (Standard plan and above). Send it to your client as an email attachment. Direct URL sharing is not currently supported.
What are the status badge types in the site list?
There are four status types:
  • Success All updates and checks completed normally.
  • Warning Work completed, but something requires attention β€” e.g. a pending plugin update, an admin dialog requiring action, or an HTTP check timeout.
  • Attention Not an error, but worth noting β€” e.g. HTTP status returned 4xx (such as 404), or a visual diff was detected. A manual check of the site is recommended.
  • Error SSH connection failure, update process error, or HTTP 500+ detected. Prompt investigation is recommended.
How long is the status badge displayed?
The status badge is displayed for 7 days after the last maintenance run. After 7 days, only the date and time are shown and the badge is hidden. Running maintenance again will re-display the badge.

Maintenance log history in the Logs tab is retained for 365 days, after which older records are automatically removed.
Hovering over a status badge shows no details.
Hovering over a status badge should show a quick summary popup, but if no updates were performed or no detail information was recorded, nothing will appear. For full execution details, check the Maintenance Logs tab at the top of the screen.
After restoring a settings backup on a different PC, SSH connections no longer work.
The settings backup contains only the file path to your SSH private key β€” the key file itself is not included in the backup. When restoring on a different PC, you will need to:

β‘  Copy your SSH private key file (e.g. ~/.ssh/id_rsa) from the old PC to the new one
β‘‘ Open the SSH Profile settings in the app and update the "Private Key Path" to the correct path on the new PC (sites reference profiles, so updating the profile applies to all linked sites automatically)

When migrating to a new PC, always copy your SSH private key files manually alongside the settings backup. Sites using password authentication only are not affected.
How do I use the cross-site plugin updates dashboard? When should I use it instead of regular maintenance?

New in v1.6.2. Open it via the "Plugin Updates" button in the toolbar. It's a manager-style dashboard that shows every "plugin update available" across all your sites in a single view.

Entries are grouped by plugin name, so for example you'll see "Elementor: 3 sites need updating (4.0.0 β†’ 4.0.8)" β€” making it obvious which plugin is outdated where. Expanding a row reveals which sites are affected and their before/after versions.

When to use which:

  • Regular maintenance run (toolbar "Run Maintenance" button): Updates core, plugins, themes, and translations. Best for monthly scheduled maintenance
  • Plugin Updates Dashboard: When you need to push a specific plugin update across many sites quickly β€” e.g. "A security plugin just released an emergency patch and I need it applied to 30 sites right now"

In the dashboard, tick the checkboxes and click "Update Selected Plugins" to update only the chosen (site Γ— plugin) pairs. The full safety net (DB backup, HTTP checks, pinpoint rollback, visual verification, summary email) runs exactly as in a regular maintenance.

For large site collections, the initial scan can take 30–60 seconds (parallel SSH). Results are cached in the browser for 24 hours and shown instantly on the next launch (cache is automatically invalidated after running maintenance, so you always see fresh data when it matters).

White-Label Reports
Which plan includes the report feature?
Preview and sample viewing are free on all plans. Downloading as PDF or HTML requires the Standard plan or above. Use the "View Sample Report" button in the Report Settings modal to see what a finished report looks like before upgrading.
Can clients tell this report was generated by WP Maintenance Manager?
No. The report uses your agency's logo, company name, colors, and contact information. There is no mention of WP Maintenance Manager in the output. It appears as your own branded maintenance report.
How do I add my agency logo and branding to the report?
Open Report Settings from the main screen. You can set your agency name, address, email, website, logo image, and accent color. These settings are applied to every report you generate.
What information is included in the report?
Each report includes: execution date/time, site name, update details (WordPress core / plugin / theme version changes), status (Success / Warning / Error), HTTP health check result, and optional before/after screenshots. You can also add a custom greeting and per-site notes directly in the preview screen.
I manage 20+ clients. Can I generate a separate report per client?
Yes. From the maintenance log screen, select only the sites belonging to a specific client and generate a report for that group. You can generate per-client reports as many times as needed. There is no limit on the number of reports.
Can I customize the greeting text or add notes for each site?
Yes. In the preview screen, click Edit Text to customize the greeting message and add a per-site note for any site in the report. Changes are reflected immediately in the preview before you download.
PDF or HTML β€” which format should I use?
Use PDF for formal client delivery β€” it's professional, consistent, and easy to attach to an email. Use HTML if you want to host, embed, or further customize the report internally. Both formats share the same visual design.
Can I include before/after screenshots in the report?
Yes. If screenshot comparison is enabled for a site, before and after images are embedded in the report. You can toggle screenshot inclusion on or off in the preview screen header.
Can I filter the report by date range (e.g. this month only)?
Yes. The preview screen lets you switch between This Month, Last Month, and All Time. You can also manually select specific log entries from the log list to include exactly what you need.
Troubleshooting
Maintenance showed "HTTP 500 detected β€” rolled back". What should I do?
The responsible plugin has been automatically deactivated. If "Aggressive Auto-Fix Mode" is enabled, the DB and files have also been restored to their pre-update state, so your site should be displaying normally. If the mode is OFF, only the plugin was deactivated β€” please verify the site visually. The plugin that caused the issue is listed in the report email. Check the vendor's release notes or wait for the next version before trying to update it again.
Reported as "Warning". Is there a problem with the site?
Not necessarily. Common Warning scenarios include: "a plugin update is still pending", "an action dialog appeared in the admin dashboard", or "a visual diff was detected in the screenshot comparison". Check the details section of the report email and manually review the flagged items.
"Login to WordPress admin failed" is shown.
This occurs when using browser automation (Playwright) mode. Common causes: the admin URL has been changed by a security plugin, two-factor authentication is enabled, or the login URL differs from /wp-login.php. Check that the "WordPress Admin URL" in the site settings matches the current login URL.
Can I use this with SiteGuard WP Plugin or similar security plugins?
Yes, but some plugin settings may affect operation.

The update process itself (WP-CLI over SSH) is not affected, so Core, plugin, and theme updates run as usual. However, the post-update "admin login verification" and the "browser automation (Playwright) update mode" will fail when any of the following settings are enabled (a warning like "Admin login not possible" will appear in the log, but SSH update results are unaffected):

β‘  Image CAPTCHA (e.g. Hiragana CAPTCHA) / Fail Once β€” Automated browser login cannot pass these. If you want the admin-side verification to run as well, please disable these features.
β‘‘ Login page rename β€” When registering a site, enter the renamed URL in the "WordPress Admin URL" field. As long as the correct URL is provided, both updates and verification work normally.
β‘’ Login Lock β€” If your execution IP gets locked out, consider adding it to an IP allowlist on the server side.

* If you operate only with SSH updates (no browser verification), none of the above settings need to be changed.
SSH connection error β€” updates not starting.
Please check the following:
β‘  SSH is enabled in your hosting control panel
β‘‘ The hostname, port number, and username in the site settings have no typos or extra spaces
β‘’ If using SSH key authentication, the key file path is entered correctly

SSH port numbers for major Japanese hosts: Xserver / Xserver for WORDPRESS = 10022 (note: not the standard 22), SAKURA Internet (Standard plan or higher) = 22, ConoHa WING = 8022. Other hosts (e.g. Heteml) usually use 22 by default, but the port may be customized per server, so always confirm in the SSH settings screen of your hosting control panel.

Automatic fix since v1.6.3: if you see errors like "UNPROTECTED PRIVATE KEY", "Permissions are too open", "too open", or "bad permissions", the private key's file permissions are too open. The check is enforced by your computer's OpenSSH client (Mac/Windows), not by the hosting provider. The connection test screen now offers a "πŸ”§ Fix and continue" button (or "πŸ”§ Fix key permissions and retry" if the test failed) that runs chmod 600 on Mac/Linux or icacls (current user only, full control, inheritance disabled) on Windows with a single click. Only file attributes on your computer are changed β€” the key contents and the server are not modified.

For a full breakdown of each SSH field, see User Guide STEP 1.
My Sakura Internet private key fails with "not a valid OPENSSH private key file".
Resolved in v1.6.3. The keys currently issued by Sakura Internet's "generate and register key pair" feature use the newer PKCS#8 format (ECDSA-521), which earlier app versions could not load β€” connection tests failed at that point.

v1.6.3 adds automatic compatibility for the major key formats, including PKCS#8 (both encrypted and plain) and PuTTY format (.ppk v2 / v3). Just point the "Private key path" in the site settings at the file Sakura issued β€” no openssl conversion required.

If you are still on v1.6.2 or earlier, a workaround is to convert the key using:
openssl ec -in sakura_key.pem -out converted_key.pem
(Make sure the converted file has restrictive permissions: chmod 600 converted_key.pem. Or just upgrade to v1.6.3 or later, which handles this automatically.)
Can I use a PuTTY-format private key (.ppk file)?
Yes, since v1.6.3. PuTTY-format files (v2 and v3, with or without passphrase, supporting RSA / ECDSA / Ed25519 key types) can be used directly β€” just specify the .ppk file as the "Private key path" in the site settings.

If you are still on v1.6.2 or earlier, convert it using PuTTYgen (bundled with PuTTY):
β‘  Open PuTTYgen and click "Load" to open your .ppk
β‘‘ Enter the passphrase if applicable
β‘’ From the menu bar: "Conversions" β†’ "Export OpenSSH key (force new file format)"
β‘£ Save it (no extension or .pem), then point the app at the saved file

Upgrading to v1.6.3 or later removes this manual step entirely.
The SSH profile test connection succeeds, but maintenance fails with an SSH error.
Each site references an SSH profile, so updating a profile automatically applies to all linked sites. If you still encounter errors, check the following:

β‘  Open the edit screen for the affected site and verify the correct SSH profile is selected
β‘‘ Confirm the WordPress installation path is correct
β‘’ Re-run the "Test Connection" in the SSH Profile manager

After restoring a backup on a new machine, update the private key path in the SSH profile. The change will automatically apply to all linked sites.
Backup shows "local save failed β€” on server only".
The DB backup on the server succeeded, but the transfer to your local PC failed. Common causes are insufficient disk space on your PC or an SSH connection drop mid-transfer.

The backup file remains on the server inside the wpmm_backups/ folder within the WordPress installation directory (the folder set as "WordPress Path" in your site settings), named backup_YYYYMMDD_HHMMSS.sql. Retrieve it manually via FTP or your hosting file manager.
My paid plugin is not being updated.
The decisive check is "does a new-version notification show up in your WordPress admin's update list" (under "Dashboard β†’ Updates" or on the Plugins page).

・If it does β†’ Since v1.6.2 this app can detect and update such plugins over SSH. For plugins that SSH can't update, enabling the "🌐 Browser Residual Update" toggle on the General tab of the site edit screen will let the app perform the update via the admin screen.
・If it doesn't (you only see a custom "update available" link inside the plugin's own screen, or it's a theme-bundled plugin) β†’ The app cannot detect it. Update such plugins manually from their dedicated update screens.

Many paid plugins start appearing in the standard update list once the license is activated. If a plugin is not being updated, first verify license activation and check whether it shows in the admin update list.
Email notifications are not arriving.
First, check your spam folder. If it's not there, verify that the SMTP host, port, and email address in the app's settings are correct.

If you're using Gmail, you need to set up an "App Password". Regular Gmail passwords will fail authentication. Generate an App Password from your Google Account's security settings and enter it in the password field.

For a full breakdown of the notification settings fields, see User Guide STEP 2.
My antivirus software flagged the app after installing on Windows.
This is a false positive. Some antivirus software may flag apps built with PyInstaller as unknown programs. Please refer to the Install Guide for step-by-step instructions on excluding the app.
The app launched but no browser opens / automation doesn't start.
On first launch, Playwright (the browser automation engine) needs to be downloaded. Please wait a few minutes with an active internet connection. If it still doesn't start, close the app and relaunch it.
It takes a while for the browser to open after launching the app.
This is normal behavior. On Mac in particular, the app performs initialization on startup, so it may take around 15 seconds before the browser opens. Please wait β€” once the browser appears, you can use the app immediately. Subsequent launches will be faster.
On Mac, clicking the app icon after closing the browser tab does nothing.
Closing the browser tab alone does not stop the app's internal server process. Due to macOS behavior, clicking the app icon while the server is still running will not launch a new instance β€” it simply activates the existing process, which can appear as if nothing happened.

Always use the "Quit App" button in the app UI to properly shut down the server before closing. This ensures the next launch works smoothly.

If you already closed the tab without using the Quit button, wait approximately 90 seconds β€” the server will shut down automatically after detecting no activity. You can then relaunch the app normally.
How do I update the app? Do I need to uninstall the current version first?
No uninstall is needed. Simply install the new version on top of the existing one. All your data β€” site settings, logs, and backups β€” will be preserved.

We recommend closing the app before running the update.

Windows: Download and run the new .exe installer. It will overwrite the existing installation automatically.
Mac: Open the new .dmg and drag the .app to the Applications folder. When prompted with "Replace existing item?", click Replace.
Some sites don't show the Core / PHP version badges in the site list. Why?

The version badges added in v1.6.2 appear on each site card as Core 6.9 / PHP 8.3. These values are captured and refreshed on every maintenance run.

Common reasons a badge is missing:

  • The site has never been run yet β†’ Run maintenance once and the badge will appear automatically
  • No SSH is configured (browser-only update mode) β†’ Versions can only be read via SSH, so browser-only sites can't show them
  • SSH connection failed β†’ Check that the green SSH status badge is showing; if not, revisit your SSH profile settings
  • WP-CLI isn't working β†’ Use the "β‘‘ WP-CLI Test" button on the SSH profile edit screen to verify

The Core / PHP toolbar filters only work for sites whose version is already captured. The "Unknown (not yet run)" filter option makes it easy to find "sites that haven't been run yet."

Badges show a short form (major.minor only); hover over them to see the full version (e.g. 6.9.4) in a tooltip.

SSH test and WP-CLI path test both pass, but plugin list fetch fails with "PHP Deprecated: Creation of dynamic property ..." errors. What's wrong?

This happens on servers running PHP 8.2 or later when the server-bundled WP-CLI is a slightly older version (often seen on Xserver and similar shared hosts).

PHP 8.2 changed "creation of dynamic properties" to be deprecated. Older WP-CLI versions emit a large volume of these deprecation warnings internally. The app's SSH test and WP-CLI path test use simple command invocations that pass even with the warning noise, but commands like wp plugin list --format=json that return structured data fail to parse because the warnings get mixed into the output.

As of v1.6.6, the app absorbs this warning noise automatically, so this issue resolves itself once you update. If you are on v1.6.5 or earlier, please consider updating to the latest version.

Note that SSH-based maintenance execution itself is unaffected β€” only plugin list fetching and the cross-site dashboard are impacted.

SSH test and WP-CLI path test both pass, but plugin list fetch fails with "PHP Parse error: syntax error, unexpected '?'" errors. What's wrong?

This is caused by an old PHP version being invoked when you SSH in (PHP 7.0 or earlier). Modern WordPress core code includes nullable type hints like ?string (introduced in PHP 7.1), so old PHP fails with a syntax error when it tries to parse it.

The PHP that serves the website is often a newer version, so the site itself loads fine, but commands executed via SSH end up invoking the older PHP. This is a common gap on Xserver and other shared hosts that maintain separate PHP versions for web and CLI.

In the site edit dialog β†’ "πŸ–₯ SSH" tab β†’ "WP-CLI path (optional override)", specify a WP-CLI command that runs through a newer PHP. For Xserver:

/opt/php-8.0/bin/php /usr/bin/wp

Any PHP version available on Xserver ("PHP Ver. switch" in the server panel) will work (PHP 7.4 / 8.0 / 8.1 / 8.2). PHP 8.0 or later is recommended.

Save and retry the plugin fetch. The WP-CLI path override is per-site, so other sites' settings are unaffected.

Sites in the site list are framed in different colors (pulsing blue / dashed light-blue / green / red). What do they mean? (v1.6.6+)

As of v1.6.6, the site list shows maintenance progress via frame colors. Each color means:

  • Pulsing blue solid frame + blue background: The site currently being processed. Only one site is highlighted at a time
  • Dashed light-blue frame: A site queued for the current maintenance run that hasn't started yet
  • Green solid frame + green background: A site that recently completed maintenance successfully. The green disappears automatically after 24 hours
  • Red solid frame + light red background: A site whose most recent maintenance ended in an error (v1.6.8+). It stands out more than the green "completed" state so errors are harder to miss. Like the green state it clears automatically after 24 hours, and turns green once you successfully re-run that site

The green and red states persist for 24 hours, so you can look back later and see "which sites were run today, and which ones errored." When you start a new maintenance run, the green/red frames of sites that aren't included in the new run are preserved.

Also, as of v1.6.8, when maintenance finishes the selection checkboxes for the sites you just ran are cleared automatically. You can still tell which sites were maintained from the green/red frames described above (shown for 24 hours).

If your OS has "reduce motion" accessibility settings enabled (supported on macOS / Windows / Linux), the pulsing animation is replaced with a static border.

There's a red number badge on the top-right of the πŸ”Œ Plugins button. What is it? (v1.6.6+)

As of v1.6.6, the site list shows a "pending updates" count badge on the top-right of each site's πŸ”Œ Plugins button. The red number is the count of plugins waiting for an update on that site.

The badge is shown when:

  • You ran the cross-site "Plugin updates" dashboard from the toolbar and the result is cached
  • Or you opened the πŸ”Œ Plugins modal for that site individually

The badge is retained for 30 days, and hovering over it shows a tooltip with "last fetched: N days ago" so you can judge the data freshness. When you run maintenance on a site, that site's badge updates (or disappears) automatically β€” other sites' badges are unaffected.

Counts of 100+ are displayed as "99+" to keep the badge compact. Sites with 0 pending updates show no badge.

Next to the last maintenance date there's a colored "N days ago" badge. What do the colors mean? (v1.6.6+)

As of v1.6.6, the site list shows a "days since last maintenance" badge next to the last maintenance date. The color depends on the elapsed days, so sites that haven't been maintained recently stand out at a glance.

Elapsed days Color Meaning
0–14 daysGreenRecent β€” all good
15–29 daysGrayStandard β€” acceptable
30–59 daysAmberCaution
60+ daysRedAction needed

The elapsed days are recalculated against the current clock, so the badge updates from "16 days ago" β†’ "31 days ago" automatically as time passes.

Site list selections (checkboxes) no longer disappear when I switch views or change pages. Is this a spec change? (v1.6.6+)

Yes, this is a spec change in v1.6.6. Site list selections (maintenance queue checkboxes) are now preserved across these operations:

  • List ⇄ grid view switching
  • Page changes (next / previous page)
  • Filter changes (category, tags, Core / PHP version, etc.)
  • Browser refresh (within the same session)

If you select sites across multiple pages, the "N selected Β· Clear all" chip in the toolbar shows the total count, and clicking "Clear all" wipes the entire selection at once.

Note: selections are automatically cleared when the app restarts. This prevents the case where stale checkboxes from a previous session cause unintended sites to be maintained.

Selections are tracked by each site's internal ID, so adding, removing, or reordering sites doesn't break the selection.

License & Account
Entered the license key but "Cannot authenticate" is shown.
Please check the following:
β‘  No extra spaces were included when copying and pasting the key
β‘‘ Your internet connection is active
β‘’ If the key is already in use on another PC, only one PC is allowed per key (per-plan limits apply)

If the issue persists, please contact us via the contact form.
I want to move to a new PC. How do I deregister the old one?
You can deregister using the γ€ŒDeregister This PC」button in the License tab of the app's settings. If the old PC is no longer accessible, please contact us via the contact form and we will handle the deregistration.
How many PCs can I use with the Business plan?
The Business plan supports simultaneous registration on up to 2 PCs. For example, you can use it on both your main Mac and a laptop at the same time.

Note that no duplicate site check is performed between the two registered PCs. Feel free to use the plan flexibly across team members or multiple work locations.

If you need to use a third PC, simply deregister one of the current PCs first, then register the new one.
What happens to my data when the license expires?
All site information, settings, and backup files on your PC remain intact. Nothing is deleted. However, after expiry, maintenance execution reverts to the Free plan limits (1 site, 3 runs per month).
Comparison with Other Tools
Do you have comparison pages with other WordPress maintenance tools (ManageWP, MainWP, etc.)?
Yes β€” we publish detailed comparison pages against the four most-used tools: ManageWP, MainWP, WP Umbrella, and InfiniteWP. The hub page includes an at-a-glance table across 7 dimensions, a 30-second summary of each tool, and a quick decision guide based on what matters most to you.

πŸ‘‰ See the 4-tool comparison hub
How does WP Maintenance Manager compare to ManageWP?
Three main differences:
β‘  No plugin required on client sites (SSH + WP-CLI connection). ManageWP requires the ManageWP Worker plugin on every managed site.
β‘‘ Per-plugin pinpoint rollback built in. ManageWP's "Safe Updates" reverts the entire site if anything breaks.
β‘’ $28/mo for full features at 100 sites (Standard plan). ManageWP's All-in-One Bundle is $150/mo for the same site count.

That said, ManageWP has its own strengths: continuous uptime monitoring, team collaboration features, and a longer brand track record.

πŸ‘‰ See the full vs ManageWP comparison
How does it compare to MainWP, WP Umbrella, and InfiniteWP?
All three differ from WP Maintenance Manager in two key ways: they require a dedicated plugin on each client site, and they don't offer per-plugin automatic rollback. Here's a quick summary of each, with links to the full comparisons:

・MainWP: open source, self-hosted on a WordPress site you provision. Pro $29/mo or $599 lifetime. See vs MainWP β†’

・WP Umbrella: EU-based SaaS, €1.99/site/mo. Strong on continuous uptime monitoring and GDPR-aligned data residency. See vs WP Umbrella β†’

・InfiniteWP: self-hosted, annual add-on licensing (from $147/yr). Hosted version $597/yr for 100 sites. See vs InfiniteWP β†’
Can I migrate from another tool, or run both side by side?
We don't offer automatic site import from other tools. However, adding a single site takes about 30 seconds β€” just enter SSH credentials and the WordPress install path.

Parallel use is fully supported. WP Maintenance Manager connects via SSH and never touches the existing tool's plugin (ManageWP Worker, MainWP Child, WP Umbrella plugin, or InfiniteWP Client) β€” they don't conflict. We recommend starting with our free plan (1 site), then migrating gradually as you build confidence.

For a step-by-step parallel evaluation flow, see the "Try alongside [tool]" section on each comparison page.