<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: devautomation</title>
    <description>The latest articles on DEV Community by devautomation (@devautomation).</description>
    <link>https://dev.to/devautomation</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3942708%2Ff292345c-d337-441b-8678-5b9d3955c0ba.png</url>
      <title>DEV Community: devautomation</title>
      <link>https://dev.to/devautomation</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devautomation"/>
    <language>en</language>
    <item>
      <title>WordPress security: the 10-minute monthly checklist that catches real problems</title>
      <dc:creator>devautomation</dc:creator>
      <pubDate>Wed, 20 May 2026 17:53:06 +0000</pubDate>
      <link>https://dev.to/devautomation/wordpress-security-the-10-minute-monthly-checklist-that-catches-real-problems-1n4n</link>
      <guid>https://dev.to/devautomation/wordpress-security-the-10-minute-monthly-checklist-that-catches-real-problems-1n4n</guid>
      <description>&lt;p&gt;Most WordPress security advice is useless.&lt;/p&gt;

&lt;p&gt;"Use a strong password." "Keep plugins updated." "Install a security plugin."&lt;/p&gt;

&lt;p&gt;These are fine, but they don't tell you what to actually check each month on client sites. Here's what I check -- based on the actual vulnerabilities and incidents I've seen managing sites for paying clients.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why 10 minutes and not an hour
&lt;/h2&gt;

&lt;p&gt;A 10-minute monthly check that actually happens is infinitely better than a comprehensive quarterly audit that gets skipped.&lt;/p&gt;

&lt;p&gt;The goal isn't perfect security -- it's catching the 80% of problems that show up most often before they become incidents.&lt;/p&gt;




&lt;h2&gt;
  
  
  The monthly checklist
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Verify WordPress core and plugins are current (2 min)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp &lt;span class="nt"&gt;--allow-root&lt;/span&gt; core check-update
wp &lt;span class="nt"&gt;--allow-root&lt;/span&gt; plugin list &lt;span class="nt"&gt;--update&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;available &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plugins with known CVEs get exploited within days of disclosure. Being current matters more than any security plugin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to watch for:&lt;/strong&gt; Plugins not receiving updates for 6+ months. These become unpatched vulnerabilities. Deactivate and replace them.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Check for default admin username (30 sec)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp &lt;span class="nt"&gt;--allow-root&lt;/span&gt; user get admin &lt;span class="nt"&gt;--field&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;login 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"WARNING: user admin exists"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Still the most common brute-force target. If a client's site has a user named "admin" with editor or admin role, rename it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp &lt;span class="nt"&gt;--allow-root&lt;/span&gt; user update admin &lt;span class="nt"&gt;--user_login&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;something_else
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Verify wp-config.php permissions (30 sec)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;stat&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"%a"&lt;/span&gt; /path/to/wp-config.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Should be 600 or 640. If it's 644 or 777, fix it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;600 /path/to/wp-config.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;644 means any process on the shared server can read your database credentials.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Check for exposed debug.log (30 sec)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /path/to/wp-content/debug.log &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"WARNING: debug.log exists"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"clean"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Debug logs often contain: database credentials, API keys, internal paths, email addresses, and error messages that reveal vulnerability details. If it exists, read it before deleting it -- then delete it.&lt;/p&gt;

&lt;p&gt;Also check that WP_DEBUG_LOG is disabled in wp-config.php on production sites.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Audit admin users (2 min)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp &lt;span class="nt"&gt;--allow-root&lt;/span&gt; user list &lt;span class="nt"&gt;--role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;administrator &lt;span class="nt"&gt;--fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ID,user_login,user_email,user_registered
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare against who should have admin access. Former employees and contractors frequently retain admin accounts. Anyone not recognized: disable immediately.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp &lt;span class="nt"&gt;--allow-root&lt;/span&gt; user delete USER_ID &lt;span class="nt"&gt;--reassign&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  6. Check for world-writable PHP files (1 min)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find /path/to/wordpress &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.php"&lt;/span&gt; &lt;span class="nt"&gt;-perm&lt;/span&gt; /o+w 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any output is a problem. World-writable PHP files can be modified by other users on shared hosting or by malware. Fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find /path/to/wordpress &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.php"&lt;/span&gt; &lt;span class="nt"&gt;-perm&lt;/span&gt; /o+w &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;chmod &lt;/span&gt;o-w &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  7. Review recent logins for anomalies (1 min)
&lt;/h3&gt;

&lt;p&gt;Install the WP Last Login plugin (free) or use Wordfence logs. Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logins from unexpected countries&lt;/li&gt;
&lt;li&gt;Multiple failed login attempts followed by success&lt;/li&gt;
&lt;li&gt;Logins at unusual hours for that client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If something looks wrong: force password reset on that account immediately.&lt;/p&gt;




&lt;h3&gt;
  
  
  8. Check SSL certificate expiry (30 sec)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; example.com:443 2&amp;gt;/dev/null | openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-enddate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An expired SSL breaks contact forms, ecommerce checkouts, and admin logins. Set a calendar alert for 30 days before expiry. Better: automate renewal with Let's Encrypt + certbot.&lt;/p&gt;




&lt;h3&gt;
  
  
  9. Verify backups ran (1 min)
&lt;/h3&gt;

&lt;p&gt;Check your backup plugin's last successful run date. If it's more than 2 days ago for a WooCommerce site, or more than 7 days for a static site, something is wrong.&lt;/p&gt;

&lt;p&gt;Also check that the backup destination is off-server. Backups on the same hosting account as the site don't protect against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hosting account compromise&lt;/li&gt;
&lt;li&gt;Host-side data loss&lt;/li&gt;
&lt;li&gt;Account suspension&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  10. Run a quick malware scan (2 min)
&lt;/h3&gt;

&lt;p&gt;Wordfence (free tier) does a file integrity check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp &lt;span class="nt"&gt;--allow-root&lt;/span&gt; wordfence scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or check core file integrity manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp &lt;span class="nt"&gt;--allow-root&lt;/span&gt; core verify-checksums
wp &lt;span class="nt"&gt;--allow-root&lt;/span&gt; plugin verify-checksums &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modified core or plugin files that don't match the official checksums indicate tampering. Investigate before dismissing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The red flags that need immediate action
&lt;/h2&gt;

&lt;p&gt;These aren't monthly checks -- they're things to act on the moment you see them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unknown admin users&lt;/strong&gt; -- potential backdoor account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core or plugin files modified without a recent update&lt;/strong&gt; -- likely compromise&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sudden traffic spike with no marketing campaign&lt;/strong&gt; -- bot activity or exploit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Site redirecting visitors to another domain&lt;/strong&gt; -- active malware&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contact form sending spam&lt;/strong&gt; -- either compromised or open relay&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you see any of these: put the site in maintenance mode first, investigate second.&lt;/p&gt;




&lt;h2&gt;
  
  
  Automating this
&lt;/h2&gt;

&lt;p&gt;Running these checks manually across 10 client sites takes about an hour per month. The WP-CLI commands above work well in a script that loops over your client list and emails you a report.&lt;/p&gt;

&lt;p&gt;The approach: each check writes a pass/fail to a log, then the script generates an HTML summary. If anything critical is flagged, it sends an alert email immediately.&lt;/p&gt;

&lt;p&gt;Free checklist + the automation bundle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://devautomation.gumroad.com/l/vaiawy" rel="noopener noreferrer"&gt;WordPress Monthly Maintenance Checklist&lt;/a&gt; -- free download, covers security + everything else&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://devautomation.gumroad.com/l/yicgwp" rel="noopener noreferrer"&gt;WordPress Agency Automation Bundle&lt;/a&gt; -- the scripts that automate these checks across all your sites&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;What security issues do you encounter most often on client WordPress sites? Brute force, compromised plugins, or something else?&lt;/p&gt;




&lt;h2&gt;
  
  
  More in this series: WordPress Agency Toolkit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/i-got-tired-of-manual-wordpress-maintenance-across-8-client-sites-so-i-automated-all-of-it-16b4"&gt;I automated WordPress maintenance across 8 sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/how-i-land-wordpress-maintenance-clients-with-cold-email-real-sequences-real-results-5495"&gt;How I land WordPress maintenance clients with cold email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-site-running-slow-heres-the-exact-checklist-i-use-to-diagnose-any-site-in-30-minutes-1mo2"&gt;WordPress site running slow? 30-minute diagnosis checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/the-wordpress-maintenance-business-real-numbers-pricing-math-and-what-most-freelancers-get-wrong-2n43"&gt;The WordPress maintenance business: real numbers and pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/woocommerce-maintenance-8-checks-that-keep-payment-processing-alive-with-sql-queries-177o"&gt;WooCommerce maintenance: 8 checks that keep payments alive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/mainwp-vs-managewp-vs-custom-scripts-how-i-manage-15-wordpress-sites-in-2025-4n67"&gt;MainWP vs ManageWP vs custom scripts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-security-the-10-minute-monthly-checklist-that-catches-real-problems-1n4n"&gt;WordPress security: 10-minute monthly checklist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;All tools and templates: &lt;a href="https://devautomation.gumroad.com" rel="noopener noreferrer"&gt;devautomation.gumroad.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>security</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>MainWP vs ManageWP vs custom scripts: how I manage 15+ WordPress sites in 2025</title>
      <dc:creator>devautomation</dc:creator>
      <pubDate>Wed, 20 May 2026 17:46:39 +0000</pubDate>
      <link>https://dev.to/devautomation/mainwp-vs-managewp-vs-custom-scripts-how-i-manage-15-wordpress-sites-in-2025-4n67</link>
      <guid>https://dev.to/devautomation/mainwp-vs-managewp-vs-custom-scripts-how-i-manage-15-wordpress-sites-in-2025-4n67</guid>
      <description>&lt;p&gt;Managing multiple WordPress sites for clients is a solved problem -- but the solution depends on how many sites you manage and what your actual bottleneck is.&lt;/p&gt;

&lt;p&gt;I've used all three approaches. Here's when each one makes sense.&lt;/p&gt;




&lt;h2&gt;
  
  
  The three real options
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ManageWP&lt;/strong&gt; -- cloud-hosted dashboard, monthly subscription (~$2/site or $100+/month flat), handles updates, backups, uptime, performance checks. Polished UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MainWP&lt;/strong&gt; -- self-hosted on your own WordPress install, free core, paid extensions for advanced features. You own the data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom scripts&lt;/strong&gt; -- WP-CLI + SSH + your own automation. Free forever, runs exactly how you want, no third-party dependencies.&lt;/p&gt;




&lt;h2&gt;
  
  
  ManageWP: best for non-technical agency owners
&lt;/h2&gt;

&lt;p&gt;ManageWP is the easiest to set up and the easiest to explain to clients. The dashboard looks like a proper SaaS product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud-hosted (no maintenance of the dashboard itself)&lt;/li&gt;
&lt;li&gt;White-label client reports that look professional&lt;/li&gt;
&lt;li&gt;Good uptime monitoring&lt;/li&gt;
&lt;li&gt;One-click safe updates (tests after updating)&lt;/li&gt;
&lt;li&gt;Works with WooCommerce&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gets expensive at scale. 20 sites at $2/site = $40/month. 50 sites = $100+/month.&lt;/li&gt;
&lt;li&gt;You're dependent on their infrastructure. If ManageWP has downtime, so does your monitoring.&lt;/li&gt;
&lt;li&gt;Less customizable -- you get what they give you&lt;/li&gt;
&lt;li&gt;Premium features (performance checks, SEO audits, etc.) add cost quickly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; agencies managing 5-20 sites who want a polished tool and don't mind paying for it.&lt;/p&gt;




&lt;h2&gt;
  
  
  MainWP: best for large volumes and data ownership
&lt;/h2&gt;

&lt;p&gt;MainWP installs on a WordPress site you control. Your data stays yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free core with no per-site fees&lt;/li&gt;
&lt;li&gt;Good extension ecosystem&lt;/li&gt;
&lt;li&gt;Works well at 50+ sites&lt;/li&gt;
&lt;li&gt;You control the data and the dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're now managing another WordPress site (the MainWP dashboard)&lt;/li&gt;
&lt;li&gt;Extensions add up: advanced reports, client portal, vulnerability scanning are paid&lt;/li&gt;
&lt;li&gt;Requires more setup than ManageWP&lt;/li&gt;
&lt;li&gt;The child plugin must be installed on every site you manage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; agencies with 20+ sites who want to own their data and avoid per-site pricing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Custom scripts: best for technical freelancers who want full control
&lt;/h2&gt;

&lt;p&gt;If you're comfortable with the command line, WP-CLI + SSH + bash/PowerShell gives you more flexibility than either dashboard solution.&lt;/p&gt;

&lt;p&gt;The basic flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Run on one client, or loop over clients.json for all&lt;/span&gt;
&lt;span class="nv"&gt;WP_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/www/html/client"&lt;/span&gt;

&lt;span class="c"&gt;# Backup first&lt;/span&gt;
wp &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WP_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--allow-root&lt;/span&gt; db &lt;span class="nb"&gt;export &lt;/span&gt;backup_&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d&lt;span class="si"&gt;)&lt;/span&gt;.sql

&lt;span class="c"&gt;# Update everything&lt;/span&gt;
wp &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WP_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--allow-root&lt;/span&gt; core update
wp &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WP_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--allow-root&lt;/span&gt; plugin update &lt;span class="nt"&gt;--all&lt;/span&gt;
wp &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WP_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--allow-root&lt;/span&gt; theme update &lt;span class="nt"&gt;--all&lt;/span&gt;

&lt;span class="c"&gt;# Check for issues&lt;/span&gt;
wp &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WP_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--allow-root&lt;/span&gt; doctor check &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero monthly cost&lt;/li&gt;
&lt;li&gt;Runs on your schedule, not a third party's&lt;/li&gt;
&lt;li&gt;Fully customizable (add any check you want)&lt;/li&gt;
&lt;li&gt;Generates reports exactly how you want them&lt;/li&gt;
&lt;li&gt;No dependency on external services staying online&lt;/li&gt;
&lt;li&gt;Handles edge cases that dashboards don't&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Takes time to build (10-15 hours upfront)&lt;/li&gt;
&lt;li&gt;Requires SSH access to servers (not always available on shared hosting)&lt;/li&gt;
&lt;li&gt;No visual dashboard (unless you build one)&lt;/li&gt;
&lt;li&gt;Debugging when something goes wrong requires CLI knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; technical freelancers managing 8+ sites who want the lowest possible ongoing cost and maximum control.&lt;/p&gt;




&lt;h2&gt;
  
  
  The math: what each approach actually costs
&lt;/h2&gt;

&lt;p&gt;Assuming 15 sites, 2 hours/month manual time per site without automation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ManageWP ($2/site):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monthly cost: $30&lt;/li&gt;
&lt;li&gt;Time: ~3 hours/month reviewing dashboards + handling flagged issues&lt;/li&gt;
&lt;li&gt;Annual: $360 + ~36 hours of your time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MainWP (free core + $100/year extensions):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monthly cost: ~$8&lt;/li&gt;
&lt;li&gt;Time: ~3 hours/month + occasional dashboard maintenance&lt;/li&gt;
&lt;li&gt;Annual: ~$100 + ~36 hours of your time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Custom scripts (built once):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monthly cost: $0&lt;/li&gt;
&lt;li&gt;Build time: 12-15 hours (one time)&lt;/li&gt;
&lt;li&gt;Monthly time: ~45 minutes reviewing automated reports&lt;/li&gt;
&lt;li&gt;Annual: $0 + ~9 hours of your time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At $80/hour, the time saved by custom scripts vs ManageWP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ManageWP: 36 hours x $80 = $2,880 in time + $360 in fees = $3,240/year&lt;/li&gt;
&lt;li&gt;Custom scripts: 12 hours build + 9 hours/year = 21 hours x $80 = $1,680 year one, $720 year two onward&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Custom scripts break even in year one and cost 80% less by year two.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually use
&lt;/h2&gt;

&lt;p&gt;I use all three, depending on the client:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ManageWP&lt;/strong&gt;: clients who want a client portal and professional white-label reports. I bill the ManageWP cost to the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom scripts&lt;/strong&gt;: my standard setup for most clients. Free, runs exactly as I need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MainWP&lt;/strong&gt;: inherited from a previous agency setup. I'm gradually moving those sites to scripts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the sites on custom scripts, I run a maintenance script that handles updates, backups, security checks, and HTML report generation -- one command per site, or one command for all sites via a JSON config file.&lt;/p&gt;




&lt;h2&gt;
  
  
  Which should you choose?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose ManageWP if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're less technical and want a polished dashboard&lt;/li&gt;
&lt;li&gt;You have fewer than 20 sites&lt;/li&gt;
&lt;li&gt;You can bill the cost to clients&lt;/li&gt;
&lt;li&gt;You want one-click safe updates with rollback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Choose MainWP if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have 20+ sites&lt;/li&gt;
&lt;li&gt;Data ownership matters to you&lt;/li&gt;
&lt;li&gt;You're comfortable running another WordPress installation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Choose custom scripts if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're comfortable with the command line&lt;/li&gt;
&lt;li&gt;You want zero ongoing cost&lt;/li&gt;
&lt;li&gt;You have SSH access to client servers&lt;/li&gt;
&lt;li&gt;You want maximum flexibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't choose scripts if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're not comfortable debugging shell scripts&lt;/li&gt;
&lt;li&gt;Your clients are on shared hosting without SSH&lt;/li&gt;
&lt;li&gt;You want a visual dashboard without building one&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The custom script option, ready-made
&lt;/h2&gt;

&lt;p&gt;If the scripts approach sounds right but you don't want to spend 12 hours building them from scratch, I put the full toolkit together: bulk update script (Bash for Linux, PowerShell for Windows), security audit, uptime monitor, HTML report generator, and clients.json template.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devautomation.gumroad.com/l/yicgwp" rel="noopener noreferrer"&gt;WordPress Agency Automation Bundle&lt;/a&gt; -- 19 PLN, use &lt;strong&gt;DEVTO&lt;/strong&gt; for 20% off.&lt;/p&gt;




&lt;p&gt;What do you use for managing multiple WordPress sites? Curious whether the community has moved more toward cloud dashboards or self-hosted in recent years.&lt;/p&gt;




&lt;h2&gt;
  
  
  More in this series: WordPress Agency Toolkit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/i-got-tired-of-manual-wordpress-maintenance-across-8-client-sites-so-i-automated-all-of-it-16b4"&gt;I automated WordPress maintenance across 8 sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/how-i-land-wordpress-maintenance-clients-with-cold-email-real-sequences-real-results-5495"&gt;How I land WordPress maintenance clients with cold email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-site-running-slow-heres-the-exact-checklist-i-use-to-diagnose-any-site-in-30-minutes-1mo2"&gt;WordPress site running slow? 30-minute diagnosis checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/the-wordpress-maintenance-business-real-numbers-pricing-math-and-what-most-freelancers-get-wrong-2n43"&gt;The WordPress maintenance business: real numbers and pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/woocommerce-maintenance-8-checks-that-keep-payment-processing-alive-with-sql-queries-177o"&gt;WooCommerce maintenance: 8 checks that keep payments alive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/mainwp-vs-managewp-vs-custom-scripts-how-i-manage-15-wordpress-sites-in-2025-4n67"&gt;MainWP vs ManageWP vs custom scripts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-security-the-10-minute-monthly-checklist-that-catches-real-problems-1n4n"&gt;WordPress security: 10-minute monthly checklist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;All tools and templates: &lt;a href="https://devautomation.gumroad.com" rel="noopener noreferrer"&gt;devautomation.gumroad.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>devops</category>
      <category>freelance</category>
    </item>
    <item>
      <title>WooCommerce maintenance: 8 checks that keep payment processing alive (with SQL queries)</title>
      <dc:creator>devautomation</dc:creator>
      <pubDate>Wed, 20 May 2026 17:29:04 +0000</pubDate>
      <link>https://dev.to/devautomation/woocommerce-maintenance-8-checks-that-keep-payment-processing-alive-with-sql-queries-177o</link>
      <guid>https://dev.to/devautomation/woocommerce-maintenance-8-checks-that-keep-payment-processing-alive-with-sql-queries-177o</guid>
      <description>&lt;p&gt;A WooCommerce store going down at 11pm on a Friday is a different emergency than a brochure site going down.&lt;/p&gt;

&lt;p&gt;Missed orders are lost revenue. Failed payments are angry customers. A hacked checkout is a PCI incident.&lt;/p&gt;

&lt;p&gt;After managing WooCommerce stores for multiple clients, I've narrowed the monthly maintenance down to 8 checks that prevent the most expensive problems. Each one has a real failure story behind it.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Test a real payment (every month, no exceptions)
&lt;/h2&gt;

&lt;p&gt;The most common thing WooCommerce maintainers skip is actually testing checkout. They update plugins, check the dashboard, and assume everything works.&lt;/p&gt;

&lt;p&gt;Checkout breaks in ways that look fine from the admin panel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payment gateway webhook URL changed (after migration or domain change)&lt;/li&gt;
&lt;li&gt;SSL certificate expired on a subdomain used for payment callbacks&lt;/li&gt;
&lt;li&gt;Plugin conflict that only surfaces at the payment step&lt;/li&gt;
&lt;li&gt;Stripe API key rotated but not updated in WooCommerce settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Monthly protocol:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go through checkout as a real customer&lt;/li&gt;
&lt;li&gt;Use the gateway's test mode (Stripe: use card 4242 4242 4242 4242)&lt;/li&gt;
&lt;li&gt;Verify the order appears in WooCommerce -&amp;gt; Orders&lt;/li&gt;
&lt;li&gt;Verify the customer receives a confirmation email&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If any of these fail: you found a problem before your client did.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Hunt stuck pending orders
&lt;/h2&gt;

&lt;p&gt;Pending orders that never complete are a silent revenue drain. A customer's bank approves the charge, something breaks in the callback, WooCommerce never marks it complete.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_modified&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_posts&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;post_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'shop_order'&lt;/span&gt; 
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;post_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'wc-pending'&lt;/span&gt; 
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;post_date&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;DATE_SUB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="n"&gt;HOUR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;post_date&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More than a handful of these? Something is wrong with your payment gateway webhook. Check WooCommerce -&amp;gt; Status -&amp;gt; Logs for payment errors from the past 30 days.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Clean WooCommerce sessions before they eat your database
&lt;/h2&gt;

&lt;p&gt;Active WooCommerce stores accumulate tens of thousands of abandoned sessions in &lt;code&gt;wp_woocommerce_sessions&lt;/code&gt;. Each one is a database row. After a year, this table can be hundreds of megabytes.&lt;/p&gt;

&lt;p&gt;This single query reclaims most of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_woocommerce_sessions&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;session_expiry&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;UNIX_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it monthly. On a busy store, you'll see meaningful query performance improvement within a few days as the database cache stops fighting session bloat.&lt;/p&gt;

&lt;p&gt;Follow with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_options&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;option_name&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'_transient_wc_%'&lt;/span&gt; 
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;option_name&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'_transient_timeout_wc_%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Audit shop manager accounts
&lt;/h2&gt;

&lt;p&gt;This one gets skipped because it feels administrative. It's not.&lt;/p&gt;

&lt;p&gt;Go to Users -&amp;gt; filter by "Shop Manager" role. Review every account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this still an active employee/contractor?&lt;/li&gt;
&lt;li&gt;When did they last log in?&lt;/li&gt;
&lt;li&gt;Do they need shop manager access or could editor work?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I found a former contractor with shop manager access 8 months after they stopped working with a client. They had full order visibility and could issue refunds.&lt;/p&gt;

&lt;p&gt;Also check WooCommerce -&amp;gt; Settings -&amp;gt; Advanced -&amp;gt; REST API. Remove any API keys that aren't actively used.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Verify product stock integrity
&lt;/h2&gt;

&lt;p&gt;WooCommerce can oversell if inventory management is misconfigured or if there's a plugin conflict. Negative stock happens more than you'd think.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meta_value&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_posts&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;wp_postmeta&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meta_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'_stock'&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="k"&gt;CAST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;meta_value&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="nb"&gt;SIGNED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'product'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also check for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sale prices with expired end dates still active (WooCommerce sometimes doesn't clear these cleanly)&lt;/li&gt;
&lt;li&gt;Products marked in-stock with stock management enabled but quantity set to 0&lt;/li&gt;
&lt;li&gt;Variable product variations showing incorrect availability&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Send a test email through every WooCommerce notification
&lt;/h2&gt;

&lt;p&gt;Email delivery is the most common WooCommerce complaint clients bring up. "Customers say they're not getting order confirmations."&lt;/p&gt;

&lt;p&gt;Default WordPress mail (wp_mail with no SMTP) fails silently on most hosting environments. Spam filters eat it. If you haven't set up SMTP, do it now -- it's a 15-minute fix that prevents weeks of support tickets.&lt;/p&gt;

&lt;p&gt;Monthly check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;WooCommerce -&amp;gt; Settings -&amp;gt; Emails -- click "Send test email" on: New Order, Order Processing, Order Complete&lt;/li&gt;
&lt;li&gt;Check spam folder for each&lt;/li&gt;
&lt;li&gt;Verify the from address is your client's domain, not wordpress.com or the hosting platform&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Test with mail-tester.com once a quarter -- it scores your deliverability and tells you exactly what to fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Check WooCommerce autoloaded data
&lt;/h2&gt;

&lt;p&gt;Slow admin and slow frontend can both trace back to autoloaded options table bloat. WooCommerce adds to this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;option_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;LENGTH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;option_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_options&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;autoload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'yes'&lt;/span&gt; 
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;option_name&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'wc_%'&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt; 
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything over 100KB in a single option is worth investigating. Some plugins create massive autoloaded entries that load on every page request.&lt;/p&gt;

&lt;p&gt;Total autoloaded data over 1MB will noticeably slow your site. Over 3MB, it's severe.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Review the fraud signals
&lt;/h2&gt;

&lt;p&gt;Card testing fraud (bots testing stolen credit cards with small purchases) shows up as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unusual spike in failed transactions&lt;/li&gt;
&lt;li&gt;Multiple orders from new accounts with different emails but similar patterns&lt;/li&gt;
&lt;li&gt;Small value orders (under $5) that all fail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check WooCommerce -&amp;gt; Status -&amp;gt; Logs for payment errors. A pattern of &lt;code&gt;card_declined&lt;/code&gt; errors from different IPs in a short window is a card testing attack.&lt;/p&gt;

&lt;p&gt;Countermeasures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable Google reCAPTCHA on checkout (free, WooCommerce built-in)&lt;/li&gt;
&lt;li&gt;Set minimum order amount if your products allow it&lt;/li&gt;
&lt;li&gt;Your payment gateway (Stripe, PayU) has fraud rules -- check they're enabled&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The checklist version
&lt;/h2&gt;

&lt;p&gt;I turned these 8 checks plus about 50 more into a complete monthly WooCommerce maintenance checklist -- free download.&lt;/p&gt;

&lt;p&gt;It covers updates, orders, payments, inventory, performance, security, email, compliance (GDPR), and backups, with the SQL queries and WP-CLI commands built in so you can move through it fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free:&lt;/strong&gt; &lt;a href="https://devautomation.gumroad.com/l/bymbi" rel="noopener noreferrer"&gt;WooCommerce Monthly Maintenance Checklist -&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you manage multiple WooCommerce stores, the automation side -- running these checks across all sites automatically -- is covered in the &lt;a href="https://devautomation.gumroad.com/l/yicgwp" rel="noopener noreferrer"&gt;WordPress Agency Automation Bundle -&amp;gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;What's the WooCommerce issue you've spent the most time debugging? Payments, performance, or something else?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Managing WooCommerce stores commercially? The &lt;a href="https://devautomation.gumroad.com/l/wrmjsy" rel="noopener noreferrer"&gt;Agency Starter Kit&lt;/a&gt; has service agreement templates, proposal formats, and pricing calculators built for maintenance contracts.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  More in this series: WordPress Agency Toolkit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/i-got-tired-of-manual-wordpress-maintenance-across-8-client-sites-so-i-automated-all-of-it-16b4"&gt;I automated WordPress maintenance across 8 sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/how-i-land-wordpress-maintenance-clients-with-cold-email-real-sequences-real-results-5495"&gt;How I land WordPress maintenance clients with cold email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-site-running-slow-heres-the-exact-checklist-i-use-to-diagnose-any-site-in-30-minutes-1mo2"&gt;WordPress site running slow? 30-minute diagnosis checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/the-wordpress-maintenance-business-real-numbers-pricing-math-and-what-most-freelancers-get-wrong-2n43"&gt;The WordPress maintenance business: real numbers and pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/woocommerce-maintenance-8-checks-that-keep-payment-processing-alive-with-sql-queries-177o"&gt;WooCommerce maintenance: 8 checks that keep payments alive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/mainwp-vs-managewp-vs-custom-scripts-how-i-manage-15-wordpress-sites-in-2025-4n67"&gt;MainWP vs ManageWP vs custom scripts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-security-the-10-minute-monthly-checklist-that-catches-real-problems-1n4n"&gt;WordPress security: 10-minute monthly checklist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;All tools and templates: &lt;a href="https://devautomation.gumroad.com" rel="noopener noreferrer"&gt;devautomation.gumroad.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>woocommerce</category>
      <category>wordpress</category>
      <category>webdev</category>
      <category>freelance</category>
    </item>
    <item>
      <title>The WordPress maintenance business: real numbers, pricing math, and what most freelancers get wrong</title>
      <dc:creator>devautomation</dc:creator>
      <pubDate>Wed, 20 May 2026 17:23:39 +0000</pubDate>
      <link>https://dev.to/devautomation/the-wordpress-maintenance-business-real-numbers-pricing-math-and-what-most-freelancers-get-wrong-2n43</link>
      <guid>https://dev.to/devautomation/the-wordpress-maintenance-business-real-numbers-pricing-math-and-what-most-freelancers-get-wrong-2n43</guid>
      <description>&lt;p&gt;WordPress maintenance is one of the most reliably profitable niches in freelancing. It's also one of the most consistently underpriced.&lt;/p&gt;

&lt;p&gt;After running maintenance contracts for years, here are the numbers and the mistakes I see most often.&lt;/p&gt;




&lt;h2&gt;
  
  
  The math that makes this business work
&lt;/h2&gt;

&lt;p&gt;A typical WordPress maintenance client requires about &lt;strong&gt;1.5-2.5 hours of actual work per month&lt;/strong&gt; once you're set up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updates: 20-40 minutes (with proper tooling, much less)&lt;/li&gt;
&lt;li&gt;Security review: 15-20 minutes&lt;/li&gt;
&lt;li&gt;Backup verification: 10 minutes&lt;/li&gt;
&lt;li&gt;Report writing: 15-20 minutes&lt;/li&gt;
&lt;li&gt;Unexpected issues (averaged across all clients): 15-30 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At a standard freelance rate of $50-80/hour, that's $75-200 of work.&lt;/p&gt;

&lt;p&gt;Most freelancers charge $50-80/month.&lt;/p&gt;

&lt;p&gt;The margin is uncomfortable. But that's before you account for automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  What automation actually changes
&lt;/h2&gt;

&lt;p&gt;I spent about 12 hours over one month building scripts that automate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updates across all client sites (SSH -&amp;gt; backup -&amp;gt; update -&amp;gt; test)&lt;/li&gt;
&lt;li&gt;Security scanning&lt;/li&gt;
&lt;li&gt;Monthly HTML report generation&lt;/li&gt;
&lt;li&gt;Uptime monitoring with email alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result: what was 1.5-2.5 hours per client is now &lt;strong&gt;10-15 minutes of reviewing output&lt;/strong&gt; that ran automatically.&lt;/p&gt;

&lt;p&gt;On 10 clients: 15-25 hours/month -&amp;gt; 1.5-2.5 hours/month.&lt;/p&gt;

&lt;p&gt;The hourly math at $75/month per client:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before automation:&lt;/strong&gt; $75 / 2 hours = $37.50/hour&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After automation:&lt;/strong&gt; $75 / 0.2 hours = $375/hour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same work. Same client. Same invoice. Different leverage.&lt;/p&gt;




&lt;h2&gt;
  
  
  What most freelancers get wrong about pricing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mistake 1: Pricing by what feels fair instead of what it costs
&lt;/h3&gt;

&lt;p&gt;Calculate your actual floor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Monthly overhead (software, tools, insurance, admin):    $200
Target monthly income:                                   $6,000
Billable hours available (realistic, not optimistic):    100

Minimum hourly rate = ($6,000 + $200) / 100 = $62/hour
Add 30% for taxes: $62 x 1.3 = $80/hour
Add 15% margin:    $80 x 1.15 = $92/hour
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most WordPress freelancers have never done this math. They price by feel, which means they price below their actual floor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 2: Charging per site instead of per value
&lt;/h3&gt;

&lt;p&gt;A WooCommerce store doing EUR50,000/month revenue and a portfolio site for a local photographer are both "one WordPress site." The maintenance work is roughly similar. The value to the client is not.&lt;/p&gt;

&lt;p&gt;Tiered pricing by business type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Portfolio / brochure site: $80-120/month&lt;/li&gt;
&lt;li&gt;Small business with leads/bookings: $120-200/month&lt;/li&gt;
&lt;li&gt;E-commerce / WooCommerce: $200-400/month&lt;/li&gt;
&lt;li&gt;High-traffic or high-revenue sites: $400+/month&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mistake 3: Month-to-month only
&lt;/h3&gt;

&lt;p&gt;Annual prepay discounts serve you more than the client. Offering 10-13% off for annual upfront:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removes churn risk for 12 months&lt;/li&gt;
&lt;li&gt;Gives you cash flow&lt;/li&gt;
&lt;li&gt;Clients who prepay never cancel mid-year&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On 10 clients at $150/month: $18,000 annual value. Offer 10% off: client saves $1,800, you get $16,200 upfront.&lt;/p&gt;




&lt;h2&gt;
  
  
  The churn problem no one talks about
&lt;/h2&gt;

&lt;p&gt;The biggest threat to a maintenance business isn't finding clients -- it's keeping them.&lt;/p&gt;

&lt;p&gt;Average monthly churn rate in subscription businesses: 3-8%.&lt;/p&gt;

&lt;p&gt;At 5% churn: You lose half your client base in a year without adding anyone new.&lt;/p&gt;

&lt;p&gt;What actually reduces churn:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Monthly reports&lt;/strong&gt; -- clients who receive reports cancel less. They see the value. Clients who get no communication wonder if they're paying for anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proactive communication&lt;/strong&gt; -- tell them about the SSL expiry you caught before it expired, the plugin vulnerability you patched before anyone exploited it. These moments justify the retainer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reasonable response times&lt;/strong&gt; -- most clients don't need 1-hour response. They need to know they won't be ignored.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  How long to build a $3,000/month maintenance business
&lt;/h2&gt;

&lt;p&gt;Working backwards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$3,000/month / $150/average client = 20 clients&lt;/li&gt;
&lt;li&gt;At 5% monthly churn: need ~1 new client/month just to maintain&lt;/li&gt;
&lt;li&gt;Realistic acquisition rate (with consistent outreach): 1-2 new clients/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Timeline: 12-18 months to reach 20 clients while managing churn.&lt;/p&gt;

&lt;p&gt;Faster if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You already have web design clients you can convert to maintenance&lt;/li&gt;
&lt;li&gt;You run the systematic outreach (about 20 cold emails/month needed for 1 new client)&lt;/li&gt;
&lt;li&gt;You raise prices as your client list fills (waitlist = clear signal to raise rates)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The stack that makes it work
&lt;/h2&gt;

&lt;p&gt;Free or near-free tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WP-CLI&lt;/strong&gt; -- command-line WordPress management (free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UptimeRobot&lt;/strong&gt; -- uptime monitoring, email alerts (free tier: 50 monitors)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Search Console&lt;/strong&gt; -- SEO monitoring for clients (free)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UpdraftPlus&lt;/strong&gt; -- backups (free tier sufficient for most sites)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wordfence&lt;/strong&gt; -- security scanning (free tier)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Paid but worth it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ManageWP or MainWP&lt;/strong&gt; -- centralized dashboard for all sites ($100-200/year for small agency)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WP Rocket&lt;/strong&gt; -- caching/performance ($60/year/site -- pass through to client)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ShortPixel&lt;/strong&gt; -- image optimization ($10-20/month for unlimited sites)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monthly tool cost for 10 sites: roughly $50-80. On $1,500/month retainer income, that's a 5% overhead ratio.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I've packaged up
&lt;/h2&gt;

&lt;p&gt;The automation scripts I use (Bash for Linux servers, PowerShell for Windows management): &lt;a href="https://devautomation.gumroad.com/l/yicgwp" rel="noopener noreferrer"&gt;WordPress Agency Automation Bundle -&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The business side -- service agreement, proposal templates, pricing calculator, 15 client email templates, 5-day onboarding checklist: &lt;a href="https://devautomation.gumroad.com/l/wrmjsy" rel="noopener noreferrer"&gt;WordPress Agency Starter Kit -&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Getting clients in the first place -- cold email sequences, LinkedIn scripts, discovery call guide: &lt;a href="https://devautomation.gumroad.com/l/yyebuo" rel="noopener noreferrer"&gt;WordPress Client Acquisition Kit -&amp;gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;What's the biggest challenge in your WordPress maintenance business right now -- finding clients, pricing, or keeping up with the work?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;These numbers are from my own experience managing sites across various client types. Your market will differ -- adjust accordingly.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  More in this series: WordPress Agency Toolkit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/i-got-tired-of-manual-wordpress-maintenance-across-8-client-sites-so-i-automated-all-of-it-16b4"&gt;I automated WordPress maintenance across 8 sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/how-i-land-wordpress-maintenance-clients-with-cold-email-real-sequences-real-results-5495"&gt;How I land WordPress maintenance clients with cold email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-site-running-slow-heres-the-exact-checklist-i-use-to-diagnose-any-site-in-30-minutes-1mo2"&gt;WordPress site running slow? 30-minute diagnosis checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/the-wordpress-maintenance-business-real-numbers-pricing-math-and-what-most-freelancers-get-wrong-2n43"&gt;The WordPress maintenance business: real numbers and pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/woocommerce-maintenance-8-checks-that-keep-payment-processing-alive-with-sql-queries-177o"&gt;WooCommerce maintenance: 8 checks that keep payments alive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/mainwp-vs-managewp-vs-custom-scripts-how-i-manage-15-wordpress-sites-in-2025-4n67"&gt;MainWP vs ManageWP vs custom scripts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-security-the-10-minute-monthly-checklist-that-catches-real-problems-1n4n"&gt;WordPress security: 10-minute monthly checklist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;All tools and templates: &lt;a href="https://devautomation.gumroad.com" rel="noopener noreferrer"&gt;devautomation.gumroad.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>wordpress</category>
      <category>business</category>
      <category>webdev</category>
    </item>
    <item>
      <title>WordPress site running slow? Here's the exact checklist I use to diagnose any site in 30 minutes</title>
      <dc:creator>devautomation</dc:creator>
      <pubDate>Wed, 20 May 2026 17:02:05 +0000</pubDate>
      <link>https://dev.to/devautomation/wordpress-site-running-slow-heres-the-exact-checklist-i-use-to-diagnose-any-site-in-30-minutes-1mo2</link>
      <guid>https://dev.to/devautomation/wordpress-site-running-slow-heres-the-exact-checklist-i-use-to-diagnose-any-site-in-30-minutes-1mo2</guid>
      <description>&lt;p&gt;Client calls. Their site is "just slow." No other details.&lt;/p&gt;

&lt;p&gt;Here's the process I've refined over years of WordPress maintenance for diagnosing performance issues fast - from first look to prioritized action list in about 30 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Baseline measurements (5 minutes)
&lt;/h2&gt;

&lt;p&gt;Before touching anything, document where you're starting.&lt;/p&gt;

&lt;p&gt;Run every test 3 times and average:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Google PageSpeed Insights (mobile + desktop): pagespeed.web.dev
- GTmetrix: note TTFB, total page size, total requests
- Google Search Console: Core Web Vitals report (if you have access)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The numbers that matter most:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;What it affects&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LCP&lt;/td&gt;
&lt;td&gt;&amp;lt; 2.5s&lt;/td&gt;
&lt;td&gt;Largest Contentful Paint - Google ranking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTFB&lt;/td&gt;
&lt;td&gt;&amp;lt; 800ms&lt;/td&gt;
&lt;td&gt;Server response - often hosting problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page size&lt;/td&gt;
&lt;td&gt;&amp;lt; 3MB&lt;/td&gt;
&lt;td&gt;Bandwidth - especially mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile score&lt;/td&gt;
&lt;td&gt;&amp;gt; 70&lt;/td&gt;
&lt;td&gt;Google uses mobile-first indexing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Write these down. You can't prove improvement without a baseline.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Server response time tells you 80% of the story
&lt;/h2&gt;

&lt;p&gt;TTFB (Time to First Byte) is the most revealing single metric.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick TTFB check from command line&lt;/span&gt;
curl &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"TTFB: %{time_starttransfer}s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Under 200ms:&lt;/strong&gt; Server is fast, look elsewhere&lt;br&gt;&lt;br&gt;
&lt;strong&gt;200ms-800ms:&lt;/strong&gt; Acceptable, worth improving&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Over 800ms:&lt;/strong&gt; Server or caching problem - fix this first before anything else&lt;/p&gt;

&lt;p&gt;If TTFB is high, check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;PHP version&lt;/strong&gt; - PHP 8.1+ is 2-3x faster than 7.4 for WordPress. Check in WP Admin ? Tools ? Site Health&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Page cache&lt;/strong&gt; - Is there any caching at all? Check response headers: &lt;code&gt;curl -I https://example.com | grep -i cache&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting tier&lt;/strong&gt; - Shared hosting with too many neighbors causes slow TTFB regardless of optimization&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Step 3: Images are almost always the main culprit
&lt;/h2&gt;

&lt;p&gt;Open GTmetrix ? Waterfall tab ? filter by "Image" ? sort by size.&lt;/p&gt;

&lt;p&gt;Nine times out of ten, I find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hero images at 2-4MB (should be 100-300KB)&lt;/li&gt;
&lt;li&gt;Images served at 3000px width but displayed at 800px&lt;/li&gt;
&lt;li&gt;JPEG format instead of WebP (30-50% larger)&lt;/li&gt;
&lt;li&gt;No lazy loading on below-fold images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quick diagnosis:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Run in browser console to find oversized images&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;img&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rendered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBoundingClientRect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;natural&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;w&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;naturalWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;naturalHeight&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;waste&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;natural&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;natural&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rendered&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rendered&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;waste&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Oversized: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;waste&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;x larger than needed`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix priority:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compress existing images (ShortPixel, free tier = 100 images/month)&lt;/li&gt;
&lt;li&gt;Enable WebP conversion going forward&lt;/li&gt;
&lt;li&gt;Set explicit width/height on images (prevents layout shift)&lt;/li&gt;
&lt;li&gt;Don't lazy-load above-fold images (hurts LCP)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 4: Caching check
&lt;/h2&gt;

&lt;p&gt;Page caching is the single highest-impact fix for most WordPress sites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test if caching is active:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; https://example.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"x-cache&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;cf-cache&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;cache-control"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see &lt;code&gt;X-Cache: HIT&lt;/code&gt; or &lt;code&gt;CF-Cache-Status: HIT&lt;/code&gt; - caching is working.&lt;br&gt;&lt;br&gt;
If you see nothing or &lt;code&gt;Cache-Control: no-cache&lt;/code&gt; - no page cache.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without caching:&lt;/strong&gt; Every visitor triggers PHP + database. 500ms-3s server time.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;With caching:&lt;/strong&gt; Pre-built HTML served directly. 50-200ms.&lt;/p&gt;

&lt;p&gt;Best free options by hosting type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared hosting (Apache):&lt;/strong&gt; W3 Total Cache or WP Super Cache&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiteSpeed servers:&lt;/strong&gt; LiteSpeed Cache (dramatically better than W3TC)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WP Engine / Kinsta / SiteGround:&lt;/strong&gt; Built-in server cache - just make sure it's not disabled&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Step 5: JavaScript bloat
&lt;/h2&gt;

&lt;p&gt;Open Chrome DevTools ? Network ? filter JS ? reload ? sort by size.&lt;/p&gt;

&lt;p&gt;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Files over 100KB (especially ones you don't recognize)&lt;/li&gt;
&lt;li&gt;Scripts loading on pages where they're not needed (contact form plugin loading on every page)&lt;/li&gt;
&lt;li&gt;Multiple jQuery versions (yes, this happens)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Find render-blocking scripts:&lt;/strong&gt;&lt;br&gt;
PageSpeed Insights ? "Eliminate render-blocking resources" ? shows you exactly which files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix options:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Defer non-critical scripts: &lt;code&gt;&amp;lt;script src="..." defer&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use Asset CleanUp plugin to disable specific scripts on specific page types&lt;/li&gt;
&lt;li&gt;Remove plugins you're not using (every plugin = more JS)&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Step 6: Database audit
&lt;/h2&gt;

&lt;p&gt;Runs slow even with caching? Look at the database.&lt;/p&gt;

&lt;p&gt;Install Query Monitor plugin temporarily and load a few pages. Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Queries tab: anything over 50ms is suspicious
- Number of queries: over 100 per page is high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also check directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Autoloaded data (should be under 1MB)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;LENGTH&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;option_value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;mb&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_options&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;autoload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'yes'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Post revisions (often thousands on active sites)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;wp_posts&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;post_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'revision'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Quick wins:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Add to wp-config.php - limit revisions going forward&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WP_POST_REVISIONS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then use WP-Optimize to clean up existing bloat.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: The things people forget
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Google Fonts:&lt;/strong&gt; Every Google Fonts family = external DNS lookup + connection. For a site with 3 font families loaded from fonts.googleapis.com, that's 3 extra connections before the page can render.&lt;/p&gt;

&lt;p&gt;Fix: Host fonts locally with the OMGF plugin. Free, 10-minute setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Font display:&lt;/strong&gt; Text invisible while font loads? Add &lt;code&gt;font-display: swap&lt;/code&gt; to @font-face declarations. Prevents invisible text from hurting LCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third-party scripts:&lt;/strong&gt; Chat widgets, analytics tags, social share buttons - each one adds DNS lookup + connection time. Audit them. Do you actually need all of them?&lt;/p&gt;




&lt;h2&gt;
  
  
  My 30-minute flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0-5min:   Baseline measurements (PageSpeed + GTmetrix)
5-10min:  TTFB check ? hosting/caching decision
10-15min: Image audit via Waterfall
15-20min: Cache headers check + caching plugin status
20-25min: JS bloat + render-blocking resources
25-30min: Database quick check + fonts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: Prioritized list of fixes with estimated impact for each.&lt;/p&gt;




&lt;h2&gt;
  
  
  The report I send clients
&lt;/h2&gt;

&lt;p&gt;After the audit, I send a one-page report: current scores, issues by priority (critical / important / nice-to-have), what I fixed, what I recommend, and projected improvement.&lt;/p&gt;

&lt;p&gt;I've put together the full checklist, implementation guides, and the client report template in a kit:&lt;br&gt;&lt;br&gt;
&lt;a href="https://devautomation.gumroad.com/l/oikwcr" rel="noopener noreferrer"&gt;WordPress Speed &amp;amp; Performance Audit Kit ?&lt;/a&gt; - use &lt;strong&gt;SPEED&lt;/strong&gt; for 26% off.&lt;/p&gt;

&lt;p&gt;Or just use the checklist above on your next slow site.&lt;/p&gt;




&lt;p&gt;What's the most common performance issue you find on client WordPress sites? Drop it in the comments.&lt;/p&gt;




&lt;h2&gt;
  
  
  More in this series: WordPress Agency Toolkit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/i-got-tired-of-manual-wordpress-maintenance-across-8-client-sites-so-i-automated-all-of-it-16b4"&gt;I automated WordPress maintenance across 8 sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/how-i-land-wordpress-maintenance-clients-with-cold-email-real-sequences-real-results-5495"&gt;How I land WordPress maintenance clients with cold email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-site-running-slow-heres-the-exact-checklist-i-use-to-diagnose-any-site-in-30-minutes-1mo2"&gt;WordPress site running slow? 30-minute diagnosis checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/the-wordpress-maintenance-business-real-numbers-pricing-math-and-what-most-freelancers-get-wrong-2n43"&gt;The WordPress maintenance business: real numbers and pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/woocommerce-maintenance-8-checks-that-keep-payment-processing-alive-with-sql-queries-177o"&gt;WooCommerce maintenance: 8 checks that keep payments alive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/mainwp-vs-managewp-vs-custom-scripts-how-i-manage-15-wordpress-sites-in-2025-4n67"&gt;MainWP vs ManageWP vs custom scripts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-security-the-10-minute-monthly-checklist-that-catches-real-problems-1n4n"&gt;WordPress security: 10-minute monthly checklist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;All tools and templates: &lt;a href="https://devautomation.gumroad.com" rel="noopener noreferrer"&gt;devautomation.gumroad.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>performance</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I land WordPress maintenance clients with cold email (real sequences, real results)</title>
      <dc:creator>devautomation</dc:creator>
      <pubDate>Wed, 20 May 2026 16:55:02 +0000</pubDate>
      <link>https://dev.to/devautomation/how-i-land-wordpress-maintenance-clients-with-cold-email-real-sequences-real-results-5495</link>
      <guid>https://dev.to/devautomation/how-i-land-wordpress-maintenance-clients-with-cold-email-real-sequences-real-results-5495</guid>
      <description>&lt;p&gt;Finding good maintenance clients is harder than doing the actual work.&lt;/p&gt;

&lt;p&gt;I've been doing WordPress maintenance for several years. The technical side - updates, backups, security monitoring - I figured out quickly. But for the first two years I relied entirely on word of mouth, which meant my client list grew randomly and slowly.&lt;/p&gt;

&lt;p&gt;Then I started treating client acquisition like a system. Here's exactly what I do.&lt;/p&gt;




&lt;h2&gt;
  
  
  The core insight
&lt;/h2&gt;

&lt;p&gt;Most WordPress freelancers send generic "I do web maintenance" pitches. They get ignored.&lt;/p&gt;

&lt;p&gt;The emails that get replies are specific. They reference the actual site, the actual problem, and demonstrate that you actually looked.&lt;/p&gt;

&lt;p&gt;This takes 3-5 minutes per prospect. It's worth it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Find prospects with real problems
&lt;/h2&gt;

&lt;p&gt;I don't cold email random businesses. I find ones with specific, verifiable issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to find them:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check WordPress version from page source&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://example.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'ver='&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;

&lt;span class="c"&gt;# Check SSL expiry&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; example.com:443 2&amp;gt;/dev/null &lt;span class="se"&gt;\&lt;/span&gt;
  | openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-enddate&lt;/span&gt;

&lt;span class="c"&gt;# Quick uptime check&lt;/span&gt;
curl &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For visual browsing, the Wappalyzer browser extension shows WordPress version and plugins on any site you visit. I use it while doing normal browsing - if I see a local business with an outdated stack, I note it down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where to look:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Maps search for local business types, then check their sites&lt;/li&gt;
&lt;li&gt;Local business Facebook groups (look for people complaining about their site)&lt;/li&gt;
&lt;li&gt;LinkedIn connections who run businesses&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2: The "I found something" email
&lt;/h2&gt;

&lt;p&gt;The single best opener I've found is mentioning something specific I found on their site. Not "I do WordPress maintenance," but "your site is running WordPress 5.8 which has a known RCE vulnerability."&lt;/p&gt;

&lt;p&gt;Here's the sequence I use:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email 1 (Day 1):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Subject: [Business name] website - quick heads up&lt;/p&gt;

&lt;p&gt;Hi [Name],&lt;/p&gt;

&lt;p&gt;I was browsing local [business type] websites and noticed your site is running WordPress [VERSION] - a version with a known security vulnerability that's been actively exploited since [DATE].&lt;/p&gt;

&lt;p&gt;I thought you'd want to know before it becomes a problem.&lt;/p&gt;

&lt;p&gt;I do WordPress maintenance for local businesses. Happy to fix this and check for other issues at no charge as an introduction.&lt;/p&gt;

&lt;p&gt;Interested?&lt;/p&gt;

&lt;p&gt;[My name]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's it. 4 sentences. No pitch, no service list, no "I have 10 years of experience."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email 2 (Day 5, no reply):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Follow up once with more context about the risk. Still no pitch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email 3 (Day 12, no reply):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Final email. Acknowledge you're going to stop following up. Sometimes this one gets the reply when the others didn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: The "free audit" variation
&lt;/h2&gt;

&lt;p&gt;For prospects where the issue isn't obvious from the outside, I offer a free mini-audit.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Subject: Free WordPress health check for [Business]&lt;/p&gt;

&lt;p&gt;Hi [Name],&lt;/p&gt;

&lt;p&gt;I ran a quick check on your website and found a few things worth your attention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSL certificate expires in 23 days&lt;/li&gt;
&lt;li&gt;WordPress is 14 months out of date
&lt;/li&gt;
&lt;li&gt;Site loads in 7.2 seconds on mobile (Google recommends under 3)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've put together a short report - no cost, no obligation. Want me to send it over?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The response rate to this is roughly double the cold issue email, but it takes more time upfront. For high-value targets it's worth it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Discovery call
&lt;/h2&gt;

&lt;p&gt;When they reply, I do a 15-minute call. My goal isn't to pitch - it's to understand their situation and find out if I can genuinely help.&lt;/p&gt;

&lt;p&gt;Questions that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When was the site last updated?&lt;/li&gt;
&lt;li&gt;Who handles it now? (Internal? Agency? Nobody?)&lt;/li&gt;
&lt;li&gt;Has anything ever gone wrong?&lt;/li&gt;
&lt;li&gt;How much time does the team spend dealing with site issues?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last question usually ends the conversation. Nobody expects their answer to be "actually, we spend several hours a year on this." But they almost always do.&lt;/p&gt;




&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;From a typical month of outreach:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prospects researched&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold emails sent&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replies&lt;/td&gt;
&lt;td&gt;3-5&lt;/td&gt;
&lt;td&gt;15-25% reply rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery calls&lt;/td&gt;
&lt;td&gt;1-2&lt;/td&gt;
&lt;td&gt;~50% of replies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New clients&lt;/td&gt;
&lt;td&gt;0.5-1&lt;/td&gt;
&lt;td&gt;~50% of calls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At $150/month per client (conservative), consistent monthly outreach adds $75-150/month recurring indefinitely. Over a year, 8-12 new clients = $1,200-1,800/month added to your retainer income.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned from getting it wrong
&lt;/h2&gt;

&lt;p&gt;For the first two years, my emails were terrible. Paragraphs about my background. Lists of services. "I specialize in..." language.&lt;/p&gt;

&lt;p&gt;Nobody replied.&lt;/p&gt;

&lt;p&gt;The shift was understanding that nobody hires a WordPress maintainer because they want WordPress maintenance. They hire one because their site broke, their site is slow, or they're worried it will break.&lt;/p&gt;

&lt;p&gt;Lead with their problem, not your solution.&lt;/p&gt;




&lt;h2&gt;
  
  
  The toolkit I use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wappalyzer&lt;/strong&gt; - browser extension for instant tech stack detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GTmetrix&lt;/strong&gt; - free site speed analysis (generates shareable reports for prospects)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;crt.sh&lt;/strong&gt; - check SSL certificate expiry publicly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UptimeRobot free tier&lt;/strong&gt; - monitor a few prospects to catch when they go down (great conversation starter)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calendly free&lt;/strong&gt; - scheduling link for discovery calls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total cost: $0.&lt;/p&gt;




&lt;h2&gt;
  
  
  The templates
&lt;/h2&gt;

&lt;p&gt;I've written out 5 complete email sequences (18 emails total) including the cold outreach variants, a referral request sequence, win-back campaigns, and a LinkedIn outreach system.&lt;/p&gt;

&lt;p&gt;If you want to skip the writing: &lt;a href="https://devautomation.gumroad.com/l/yyebuo" rel="noopener noreferrer"&gt;WordPress Client Acquisition Kit on Gumroad ?&lt;/a&gt; - use code &lt;strong&gt;DEVTO&lt;/strong&gt; for 24% off.&lt;/p&gt;




&lt;p&gt;What's your experience with cold outreach for freelance work? I'm curious whether the "specific problem" approach works in other niches the same way it does in WordPress.&lt;/p&gt;







&lt;h2&gt;
  
  
  More in this series: WordPress Agency Toolkit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/i-got-tired-of-manual-wordpress-maintenance-across-8-client-sites-so-i-automated-all-of-it-16b4"&gt;I automated WordPress maintenance across 8 sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/how-i-land-wordpress-maintenance-clients-with-cold-email-real-sequences-real-results-5495"&gt;How I land WordPress maintenance clients with cold email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-site-running-slow-heres-the-exact-checklist-i-use-to-diagnose-any-site-in-30-minutes-1mo2"&gt;WordPress site running slow? 30-minute diagnosis checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/the-wordpress-maintenance-business-real-numbers-pricing-math-and-what-most-freelancers-get-wrong-2n43"&gt;The WordPress maintenance business: real numbers and pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/woocommerce-maintenance-8-checks-that-keep-payment-processing-alive-with-sql-queries-177o"&gt;WooCommerce maintenance: 8 checks that keep payments alive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/mainwp-vs-managewp-vs-custom-scripts-how-i-manage-15-wordpress-sites-in-2025-4n67"&gt;MainWP vs ManageWP vs custom scripts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-security-the-10-minute-monthly-checklist-that-catches-real-problems-1n4n"&gt;WordPress security: 10-minute monthly checklist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;All tools and templates: &lt;a href="https://devautomation.gumroad.com" rel="noopener noreferrer"&gt;devautomation.gumroad.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>freelance</category>
      <category>webdev</category>
      <category>career</category>
    </item>
    <item>
      <title>I got tired of manual WordPress maintenance across 8 client sites - so I automated all of it</title>
      <dc:creator>devautomation</dc:creator>
      <pubDate>Wed, 20 May 2026 16:53:50 +0000</pubDate>
      <link>https://dev.to/devautomation/i-got-tired-of-manual-wordpress-maintenance-across-8-client-sites-so-i-automated-all-of-it-16b4</link>
      <guid>https://dev.to/devautomation/i-got-tired-of-manual-wordpress-maintenance-across-8-client-sites-so-i-automated-all-of-it-16b4</guid>
      <description>&lt;p&gt;If you manage WordPress sites for clients, you know the drill.&lt;/p&gt;

&lt;p&gt;Every month, you log into each site, click "Update All Plugins," wait, check if anything broke, run a backup, scan for issues, repeat. For one site it's fine. For eight sites it's 6 hours of your life gone - every single month.&lt;/p&gt;

&lt;p&gt;I finally got annoyed enough to fix this properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What manual WordPress maintenance actually costs
&lt;/h2&gt;

&lt;p&gt;Here's the math I was doing before I automated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8 client sites&lt;/li&gt;
&lt;li&gt;~45 minutes per site (login, updates, backup verification, security check, client email)&lt;/li&gt;
&lt;li&gt;= &lt;strong&gt;6 hours/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;At $65/hour = &lt;strong&gt;$390/month of non-billable time&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's $4,680/year. For clicking update buttons.&lt;/p&gt;

&lt;h2&gt;
  
  
  The automation stack
&lt;/h2&gt;

&lt;p&gt;I settled on two tools: &lt;strong&gt;WP-CLI&lt;/strong&gt; (runs WordPress commands from the terminal) and &lt;strong&gt;SSH&lt;/strong&gt; (connects to client servers remotely). Both are free, both are standard.&lt;/p&gt;

&lt;p&gt;The workflow per site:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SSH into client server&lt;/li&gt;
&lt;li&gt;Database backup (before touching anything)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wp core update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wp plugin update --all&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wp theme update --all&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Security audit&lt;/li&gt;
&lt;li&gt;Generate HTML report&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's a simplified version of the core script:&lt;/p&gt;

&lt;p&gt;`ash&lt;/p&gt;

&lt;h1&gt;
  
  
  !/bin/bash
&lt;/h1&gt;

&lt;p&gt;WP_PATH="/var/www/html/client-site"&lt;br&gt;
BACKUP_DIR="/backups"&lt;br&gt;
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M")&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Backup first
&lt;/h1&gt;

&lt;p&gt;mkdir -p ""&lt;br&gt;
wp --path="" --allow-root db export \&lt;br&gt;
  "/db_backup_.sql"&lt;/p&gt;

&lt;h1&gt;
  
  
  2. Update everything
&lt;/h1&gt;

&lt;p&gt;wp --path="" --allow-root core update&lt;br&gt;
wp --path="" --allow-root plugin update --all&lt;br&gt;
wp --path="" --allow-root theme update --all&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Flush cache
&lt;/h1&gt;

&lt;p&gt;wp --path="" --allow-root cache flush&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;Simple. But the real value is running this across &lt;em&gt;all&lt;/em&gt; client sites from a single config file.&lt;/p&gt;

&lt;h2&gt;
  
  
  The config approach
&lt;/h2&gt;

&lt;p&gt;I keep a &lt;code&gt;clients.json&lt;/code&gt; file:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;json&lt;br&gt;
{&lt;br&gt;
  "clients": [&lt;br&gt;
    {&lt;br&gt;
      "name": "Client A Ltd",&lt;br&gt;
      "slug": "client_a",&lt;br&gt;
      "ssh_host": "server.clienta.com",&lt;br&gt;
      "ssh_user": "root",&lt;br&gt;
      "ssh_key": "~/.ssh/id_rsa_clienta",&lt;br&gt;
      "wp_path": "/var/www/html/clienta",&lt;br&gt;
      "active": true&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;One command runs maintenance across every active client. Add a new client - edit one JSON file.&lt;/p&gt;

&lt;h2&gt;
  
  
  The security audit
&lt;/h2&gt;

&lt;p&gt;After updates, the script checks:&lt;/p&gt;

&lt;p&gt;`ash&lt;/p&gt;

&lt;h1&gt;
  
  
  Check for exposed debug.log
&lt;/h1&gt;

&lt;p&gt;if [ -f "/wp-content/debug.log" ]; then&lt;br&gt;
  echo "WARNING: debug.log exists - may contain sensitive data"&lt;br&gt;
fi&lt;/p&gt;

&lt;h1&gt;
  
  
  Check wp-config.php permissions
&lt;/h1&gt;

&lt;p&gt;CONFIG_PERMS=$(stat -c "%a" "/wp-config.php")&lt;br&gt;
if [[ ! "" =~ ^(400|440|600|640)$ ]]; then&lt;br&gt;
  echo "WARNING: wp-config.php permissions:  (should be 600)"&lt;br&gt;
fi&lt;/p&gt;

&lt;h1&gt;
  
  
  World-writable PHP files
&lt;/h1&gt;

&lt;p&gt;WRITABLE=$(find "" -name "*.php" -perm /o+w 2&amp;gt;/dev/null | wc -l)&lt;br&gt;
if [ "" -gt 0 ]; then&lt;br&gt;
  echo "WARNING:  world-writable PHP files found"&lt;br&gt;
fi&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;Each client gets flagged items in their report.&lt;/p&gt;

&lt;h2&gt;
  
  
  The HTML report
&lt;/h2&gt;

&lt;p&gt;The script generates a per-client HTML report:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
? WordPress 6.5.3 - up to date&lt;br&gt;
? 12 plugins updated&lt;br&gt;
? Database backup: 45 MB&lt;br&gt;
? Security scan: clean&lt;br&gt;
? wp-config.php permissions: 644 (should be 600)&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I email this to clients monthly. It shows them the value of what I'm doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uptime monitor
&lt;/h2&gt;

&lt;p&gt;Separate script, runs every 10 minutes via cron:&lt;/p&gt;

&lt;p&gt;`ash&lt;/p&gt;

&lt;h1&gt;
  
  
  !/bin/bash
&lt;/h1&gt;

&lt;p&gt;SITES=("&lt;a href="https://client1.com" rel="noopener noreferrer"&gt;https://client1.com&lt;/a&gt;" "&lt;a href="https://client2.com%22" rel="noopener noreferrer"&gt;https://client2.com"&lt;/a&gt;)&lt;br&gt;
ALERT_EMAIL="&lt;a href="mailto:you@yourcompany.com"&gt;you@yourcompany.com&lt;/a&gt;"&lt;/p&gt;

&lt;p&gt;for SITE in "${SITES[@]}"; do&lt;br&gt;
  STATUS=$(curl -s -o /dev/null -w "%{http_code}" --max-time 15 "")&lt;br&gt;
  if [ "" != "200" ]; then&lt;br&gt;
    echo "DOWN:  (HTTP )" | mail -s "SITE DOWN: " ""&lt;br&gt;
  fi&lt;br&gt;
done&lt;br&gt;
`&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;After running this for 6 months:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monthly maintenance time: 6 hours ? ~20 minutes&lt;/li&gt;
&lt;li&gt;Zero missed updates&lt;/li&gt;
&lt;li&gt;Caught 2 sites with world-writable PHP files&lt;/li&gt;
&lt;li&gt;One client site went down at 3am - got the alert, fixed it before they noticed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The full toolkit
&lt;/h2&gt;

&lt;p&gt;I packaged everything - the bulk update script (Bash + PowerShell), security audit, uptime monitor, clients.json template, HTML report template, and maintenance checklist.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devautomation.gumroad.com/l/yicgwp" rel="noopener noreferrer"&gt;WordPress Agency Automation Bundle&lt;/a&gt; - use code &lt;strong&gt;DEVTO&lt;/strong&gt; for 20% off.&lt;/p&gt;

&lt;p&gt;Or use the snippets above as a starting point. Either way, stop clicking "Update All" manually eight times a month.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions about the implementation? Drop them in the comments.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  More in this series: WordPress Agency Toolkit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/i-got-tired-of-manual-wordpress-maintenance-across-8-client-sites-so-i-automated-all-of-it-16b4"&gt;I automated WordPress maintenance across 8 sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/how-i-land-wordpress-maintenance-clients-with-cold-email-real-sequences-real-results-5495"&gt;How I land WordPress maintenance clients with cold email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-site-running-slow-heres-the-exact-checklist-i-use-to-diagnose-any-site-in-30-minutes-1mo2"&gt;WordPress site running slow? 30-minute diagnosis checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/the-wordpress-maintenance-business-real-numbers-pricing-math-and-what-most-freelancers-get-wrong-2n43"&gt;The WordPress maintenance business: real numbers and pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/woocommerce-maintenance-8-checks-that-keep-payment-processing-alive-with-sql-queries-177o"&gt;WooCommerce maintenance: 8 checks that keep payments alive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/mainwp-vs-managewp-vs-custom-scripts-how-i-manage-15-wordpress-sites-in-2025-4n67"&gt;MainWP vs ManageWP vs custom scripts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devautomation/wordpress-security-the-10-minute-monthly-checklist-that-catches-real-problems-1n4n"&gt;WordPress security: 10-minute monthly checklist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;All tools and templates: &lt;a href="https://devautomation.gumroad.com" rel="noopener noreferrer"&gt;devautomation.gumroad.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>automation</category>
      <category>bash</category>
      <category>freelance</category>
    </item>
  </channel>
</rss>
