{"id":297024,"date":"2026-04-23T04:02:49","date_gmt":"2026-04-23T04:02:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/site-maintenance-manager\/"},"modified":"2026-05-11T12:20:19","modified_gmt":"2026-05-11T12:20:19","slug":"greenskeeper","status":"publish","type":"plugin","link":"https:\/\/nl.wordpress.org\/plugins\/greenskeeper\/","author":11939,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"2.1.6","stable_tag":"2.1.6","tested":"6.9.4","requires":"5.8","requires_php":"8.0","requires_plugins":null,"header_name":"Greenskeeper","header_author":"Tony Zeoli","header_description":"Manage WordPress updates, filter comment spam, send branded email reports, and configure SMTP delivery \u2014 all from one dashboard. Supports single-site and Multisite.","assets_banners_color":"","last_updated":"2026-05-11 12:20:19","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/digitalstrategyworks.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":418,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.0.4":{"tag":"2.0.4","author":"tonyzeoli","date":"2026-04-23 04:32:55"},"2.0.5":{"tag":"2.0.5","author":"tonyzeoli","date":"2026-04-25 11:48:51"},"2.0.6":{"tag":"2.0.6","author":"tonyzeoli","date":"2026-04-25 12:34:05"},"2.0.7":{"tag":"2.0.7","author":"tonyzeoli","date":"2026-04-26 04:10:41"},"2.0.8":{"tag":"2.0.8","author":"tonyzeoli","date":"2026-04-27 01:46:01"},"2.0.9":{"tag":"2.0.9","author":"tonyzeoli","date":"2026-04-27 03:31:30"},"2.1.0":{"tag":"2.1.0","author":"tonyzeoli","date":"2026-04-27 16:39:27"},"2.1.1":{"tag":"2.1.1","author":"tonyzeoli","date":"2026-04-29 16:14:11"},"2.1.2":{"tag":"2.1.2","author":"tonyzeoli","date":"2026-04-29 16:21:23"},"2.1.3":{"tag":"2.1.3","author":"tonyzeoli","date":"2026-04-29 19:57:43"},"2.1.4":{"tag":"2.1.4","author":"tonyzeoli","date":"2026-05-07 17:02:21"},"2.1.5":{"tag":"2.1.5","author":"tonyzeoli","date":"2026-05-10 13:24:51"},"2.1.6":{"tag":"2.1.6","author":"tonyzeoli","date":"2026-05-11 12:20:19"}},"upgrade_notice":{"1.9.1.2":"<p>Fixes email report footer overlapping body content. Update tables, external updates, spam activity, and admin notes now render fully above the footer. Recommended update for all users.<\/p>","1.9.1":"<p>Fixes themes missing from email reports, merges Update Notes into the Send card, adds spam activity section to emails, and shows administrator full name. No database changes.<\/p>","1.9.0":"<p>Plugin renamed to Greenskeeper. All database tables and internal prefixes unchanged \u2014 no data migration required. Adds multisite network scope selector for Updates, Spam Log, and Spam Filter settings.<\/p>","1.8.0":"<p>Adds Manage Plugin Access \u2014 control which administrators can see the plugin. On first upgrade, all current administrators retain access. Uncheck client accounts in Settings \u2192 Manage Plugin Access to hide the plugin from them.<\/p>","1.7.0":"<p>Adds Spam Log page with full blocked-attempt history, stats, and IP blocklist management. Creates a new wpmm_spam_log database table on upgrade.<\/p>","1.6.0":"<p>Adds layered comment spam filtering with optional Akismet integration, and a Disable Comments toggle. No database changes.<\/p>","1.5.9.1":"<p>Changelog-only update. No functional changes.<\/p>","1.5.0":"<p>WordPress.org Plugin Check compliance fixes. No database or functional changes.<\/p>","1.4.9":"<p>Plugin renamed to Greenskeeper for WordPress.org compliance. No database or functional changes.<\/p>","1.4.8":"<p>Adds Avada theme detection and update order guidance. Fixes SMTP From Name using site name instead of configured value.<\/p>","1.4.5":"<p>Adds Gmail and Microsoft SMTP support. No database changes.<\/p>","1.4.4":"<p>Adds built-in SMTP configuration. No database changes. If you use a separate SMTP plugin, leave Greenskeeper&#039;s SMTP setting on WordPress Default.<\/p>","1.4.3":"<p>Email header redesigned. Update Log gains per-page selector and Prev\/Next pagination. No database changes.<\/p>","1.4.2":"<p>Fixes emails showing &quot;No update entries found&quot; and preview modal missing plugin lists.<\/p>","1.4.1":"<p>Fixes plugins\/themes missing from email body. Upgrade recommended.<\/p>","1.4.0":"<p>Critical database fix. After upgrading, open Update Log and click Force DB Upgrade Now in the Database Diagnostic panel. Verify all columns are highlighted green before running new updates.<\/p>","1.3.9":"<p>Critical fix: Update Log now displays all sessions. Upgrade required for anyone on 1.3.8.<\/p>","1.3.5":"<p>Critical fix: Settings page save buttons now work. Upgrade required for 1.3.0\u20131.3.4.<\/p>","1.3.1":"<p>Critical fix: Email reports now include update content. Affects all installs, especially Multisite.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3513335,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3513336,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.0.4","2.0.5","2.0.6","2.0.7","2.0.8","2.0.9","2.1.0","2.1.1","2.1.2","2.1.3","2.1.4","2.1.5","2.1.6"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"<strong>Dashboard<\/strong> \u2014 Status summary cards showing last update date, client email, default administrator, and agency branding. Quick-navigation tiles link to all pages.","2":"<strong>Updates<\/strong> \u2014 Three sections (WordPress Core, Plugins, Themes) with checkboxes, version numbers, and performing administrator dropdown. Real-time progress bar with per-item status during batch updates.","3":"<strong>Update Log<\/strong> \u2014 Collapsible session accordion with search autocomplete, date filtering, per-page selector, and Previous\/Next pagination.","4":"<strong>Email Reports<\/strong> \u2014 Send form with subject line builder, Report Week-Ending Date picker, Update Notes textarea, Additional Manual Updates repeater, and Sent Email History table with preview modal and resend.","5":"<strong>Settings \u2014 Company, Client &amp; Administrators<\/strong> (Greenskeeper) \u2014 Logo upload, company name, client email, and Site Administrators table with Gravatar and radio selection.","6":"<strong>Settings \u2014 Spam Filter &amp; Comments<\/strong> \u2014 Master spam toggle, Disable Comments toggle, local filtering configuration (min time, max links, keyword blocklist, IP blocklist), and Akismet API key field with verify\/revoke.","7":"<strong>Spam Log<\/strong> \u2014 All-time stats by rule, paginated blocked-attempt table with filter, Block IP and Delete per row, bulk delete, and Clear All.","8":"<strong>Settings \u2014 SMTP &amp; Email Delivery<\/strong> \u2014 Provider tile grid with context-sensitive setup instructions and Send Test Email feature.","9":"<strong>Email Preview Modal<\/strong> \u2014 Full rendered HTML email preview inside the WordPress admin.","10":"<strong>Database Diagnostic<\/strong> \u2014 Expandable panel showing table columns, row counts, and Force DB Upgrade button."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[267,732,441,6696,2550],"plugin_category":[41,51,52],"plugin_contributors":[173093],"plugin_business_model":[],"class_list":["post-297024","plugin","type-plugin","status-publish","hentry","plugin_tags-email","plugin_tags-maintenance","plugin_tags-multisite","plugin_tags-smtp","plugin_tags-updates","plugin_category-communication","plugin_category-multisite","plugin_category-performance","plugin_contributors-tonyzeoli","plugin_committers-tonyzeoli"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/greenskeeper\/assets\/icon-128x128.png?rev=3513335","icon_2x":"https:\/\/ps.w.org\/greenskeeper\/assets\/icon-256x256.png?rev=3513336","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Greenskeeper is a professional WordPress maintenance plugin for developers and agencies. It centralises update management for WordPress Core, plugins, and themes, pairs it with a polished email reporting workflow, and adds layered comment spam protection \u2014 all from a single purpose-built admin dashboard.<\/p>\n\n<p><strong>Updates &amp; Reporting:<\/strong><\/p>\n\n<ul>\n<li>Scans for available WordPress Core, plugin, and theme updates in separate sections<\/li>\n<li>Updates items individually or in batch with a real-time progress bar and plain-English error explanations<\/li>\n<li>Logs every update action automatically \u2014 searchable by item name or date range, grouped into sessions<\/li>\n<li>Builds a branded HTML maintenance report email from each update session and sends it to your client<\/li>\n<li>Report emails support Update Notes (admin note to recipient) and Additional Manual Updates (for licensed plugins updated outside the plugin)<\/li>\n<li>Configures reliable SMTP email delivery via nine supported providers \u2014 no separate SMTP plugin required<\/li>\n<li>Manages agency branding: company logo, company name, and default administrator shown on reports<\/li>\n<li>Works on single-site WordPress installs and Multisite networks<\/li>\n<li>Multisite: Site Scope Selector on Updates, Spam Log, and Settings \u2014 view and manage any single site or the full network from Network Admin<\/li>\n<\/ul>\n\n<p><strong>Spam Filter &amp; Comments:<\/strong><\/p>\n\n<ul>\n<li>Layer 1 \u2014 Local filtering (always active): honeypot hidden field, submission time check, link count limit, keyword blocklist, IP blocklist, duplicate comment detection<\/li>\n<li>Layer 2 \u2014 Akismet cloud filtering (optional): enter your Akismet API key to enable AI-powered spam detection. Automatically skipped when the standalone Akismet plugin is active<\/li>\n<li>Spam Log page: review every blocked comment attempt \u2014 filter by rule or IP, add offending IPs to the blocklist with one click, and bulk-delete entries<\/li>\n<li>Disable Comments: remove comment support from all post types and hide the Comments admin menu site-wide<\/li>\n<\/ul>\n\n<p><strong>Important \u2014 Akismet licensing:<\/strong> Akismet is free for personal, non-commercial sites only. Any commercial or client site requires a paid Akismet plan available at <a href=\"https:\/\/akismet.com\/plans\/\">akismet.com\/plans<\/a>. Greenskeeper provides the integration; you are responsible for having a valid Akismet licence appropriate for your site's use.<\/p>\n\n<p><strong>Supported SMTP Providers:<\/strong><\/p>\n\n<p>SendGrid, Mailgun, Brevo, SendLayer, SMTP.com, Gmail \/ Google Workspace, Microsoft \/ Outlook \/ Office 365, manual SMTP, or WordPress default.<\/p>\n\n<p><strong>Who it is for:<\/strong><\/p>\n\n<p>Web developers, digital agencies, and WordPress administrators who manage client sites and need a reliable, repeatable maintenance and security workflow with professional client-facing reporting. Named after the greenskeeper who maintains the golf course \u2014 meticulous, professional, invisible.<\/p>\n\n<h3>Using the Plugin<\/h3>\n\n<h4>Running Updates<\/h4>\n\n<ol>\n<li>Go to <strong>Site Maintenance \u2192 Updates<\/strong>.<\/li>\n<li>The page loads and automatically scans for available updates.<\/li>\n<li>The <strong>Performing Administrator<\/strong> dropdown at the top defaults to your saved default admin (set in Settings). Override it here for this session only.<\/li>\n<li>Check the items you want to update \u2014 or use <strong>Select All<\/strong> per section.<\/li>\n<li>Click <strong>Update Selected<\/strong>. Each item updates sequentially with inline feedback.<\/li>\n<li>When all items are done, the global success banner appears with a link to <strong>Send Report Email<\/strong>.<\/li>\n<\/ol>\n\n<h4>Sending a Report Email<\/h4>\n\n<ol>\n<li>After running updates, go to <strong>Site Maintenance \u2192 Email Reports<\/strong>.<\/li>\n<li>The plugin automatically selects the session you just ran \u2014 you will see \"Updates from session on [date]\" in the Email Template section.<\/li>\n<li>Confirm the recipient email (pre-filled from Settings) and edit the subject line if needed.<\/li>\n<li>Click <strong>Send Report Email<\/strong>.<\/li>\n<li>The sent email appears in the <strong>Sent Email History<\/strong> table below.<\/li>\n<\/ol>\n\n<h4>Using the Spam Log<\/h4>\n\n<ol>\n<li>Go to <strong>Site Maintenance \u2192 Spam Log<\/strong>.<\/li>\n<li>The stats card at the top shows how many attempts each rule has blocked since activation.<\/li>\n<li>The table lists every blocked attempt with date, rule, IP address, author details, and a content preview.<\/li>\n<li>Click <strong>Block IP<\/strong> next to any row to add that IP to the blocklist in Settings immediately.<\/li>\n<li>Use the <strong>Rule<\/strong> and <strong>IP<\/strong> filters to narrow the list. Click <strong>Apply<\/strong> to filter; <strong>\u00d7&nbsp;Clear<\/strong> to reset.<\/li>\n<li>Check individual rows and click <strong>Delete Selected<\/strong> to remove entries, or <strong>Clear All<\/strong> to wipe the entire log.<\/li>\n<\/ol>\n\n<h4>Previewing a Sent Email<\/h4>\n\n<p>Click the eye icon in the Sent Email History table. The email renders in a full modal preview using the current template. Even old emails show current branding because the preview always rebuilds the body from the original log entries.<\/p>\n\n<h4>Resending an Email<\/h4>\n\n<p>Click <strong>Resend<\/strong> in the Sent Email History table. The email is rebuilt from the original session entries and sent again to the same recipient.<\/p>\n\n\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to one external service: the Akismet API. All other\nfunctionality runs entirely on your own server with no external connections.<\/p>\n\n<h4>Akismet Spam Filtering (optional)<\/h4>\n\n<p><strong>What it is:<\/strong> Akismet is a cloud-based spam detection service operated by\nAutomattic, Inc. Greenskeeper includes an optional integration that allows you\nto submit comment data to Akismet's API for spam classification.<\/p>\n\n<p><strong>This feature is entirely opt-in.<\/strong> Akismet is only activated if you enter an\nAkismet API key in Greenskeeper \u2192 Settings \u2192 Spam Filter &amp; Comments. If no key\nis entered, no data is ever sent to Akismet.<\/p>\n\n<p><strong>What data is sent and when:<\/strong> When Akismet is enabled and a comment is\nsubmitted on your site, Greenskeeper sends the following data to Akismet's API:<\/p>\n\n<ul>\n<li>Your site URL<\/li>\n<li>The commenter's IP address<\/li>\n<li>The commenter's browser user agent string<\/li>\n<li>The HTTP referrer header from the comment request<\/li>\n<li>The URL of the page the comment was submitted on<\/li>\n<li>The comment type, author name, author email, author URL, and comment content<\/li>\n<\/ul>\n\n<p>This data is sent each time a new comment is submitted and passes Greenskeeper's\nlocal filters. If Akismet is unreachable, Greenskeeper fails open (allows the\ncomment through) rather than blocking it.<\/p>\n\n<p>Additionally, when you click \"Verify &amp; Save Key\" in Settings, your Akismet API\nkey and your site URL are sent to Akismet's verification endpoint to confirm the\nkey is valid.<\/p>\n\n<p><strong>Akismet's terms of service and privacy policy:<\/strong><\/p>\n\n<ul>\n<li>Terms of service: https:\/\/akismet.com\/tos\/<\/li>\n<li>Privacy policy: https:\/\/automattic.com\/privacy\/<\/li>\n<\/ul>\n\n<p><strong>Important licensing note:<\/strong> Akismet's free plan is for personal,\nnon-commercial sites only. Any commercial or client site requires a paid\nAkismet plan. See https:\/\/akismet.com\/plans\/ for details. Greenskeeper provides\nthe integration; you are responsible for holding a valid Akismet licence\nappropriate for your site's use.<\/p>\n\n<h3>SMTP Setup Guides<\/h3>\n\n<p>Greenskeeper includes a built-in SMTP configuration panel that reconfigures WordPress's email delivery without requiring a separate plugin. The following guides walk through setting up each supported provider.<\/p>\n\n<p>Go to <strong>Settings \u2192 SMTP &amp; Email Delivery<\/strong>, click your provider's tile, and enter the credentials described below.<\/p>\n\n\n\n<h4>WordPress Default<\/h4>\n\n<p>No configuration needed. WordPress sends email via PHP's built-in <code>mail()<\/code> function. This is unreliable on most shared hosting \u2014 emails are frequently blocked by spam filters or rejected by recipients' mail servers. Recommended only as a fallback.<\/p>\n\n\n\n<h4>SMTP (Manual)<\/h4>\n\n<p>Use this option with any SMTP server not listed as a named provider \u2014 for example your hosting provider's mail server or a self-hosted mail server.<\/p>\n\n<p><strong>Fields:<\/strong>\n* <strong>SMTP Host<\/strong> \u2014 the address of your mail server (e.g. <code>mail.yourdomain.com<\/code>)\n* <strong>Port &amp; Encryption<\/strong> \u2014 port <code>587<\/code> with TLS is recommended for most servers; port <code>465<\/code> with SSL is also common; port <code>25<\/code> with no encryption should only be used on internal networks\n* <strong>Username<\/strong> \u2014 your SMTP account login (usually your email address)\n* <strong>Password<\/strong> \u2014 your SMTP account password\n* <strong>From Name<\/strong> \u2014 the display name on outgoing emails\n* <strong>From Email<\/strong> \u2014 must be authorised to send from your SMTP server<\/p>\n\n\n\n<h4>SendGrid<\/h4>\n\n<p><strong>Free plan:<\/strong> 100 emails per day. No credit card required.<\/p>\n\n<p><strong>Setup steps:<\/strong>\n1. Create a free account at <a href=\"https:\/\/sendgrid.com\">sendgrid.com<\/a>.\n2. Complete the Sender Identity verification (domain authentication or single sender).\n3. Go to <strong>Settings \u2192 API Keys \u2192 Create API Key<\/strong>.\n4. Choose <strong>Restricted Access<\/strong> and enable <strong>Mail Send \u2192 Full Access<\/strong>.\n5. Copy the API key (it is only shown once).\n6. In Greenskeeper Settings: select <strong>SendGrid<\/strong>, enter <code>apikey<\/code> (literally, that exact text) as the <strong>Username<\/strong>, and paste the API key as the <strong>Password<\/strong>.\n7. Set your verified sender address as the <strong>From Email<\/strong>.<\/p>\n\n<p><strong>Server details (pre-configured):<\/strong> <code>smtp.sendgrid.net<\/code> \u2014 port <code>587<\/code> \u2014 TLS<\/p>\n\n\n\n<h4>Mailgun<\/h4>\n\n<p><strong>Free tier:<\/strong> 5,000 emails per month for the first 3 months, then pay-as-you-go.<\/p>\n\n<p><strong>Setup steps:<\/strong>\n1. Create an account at <a href=\"https:\/\/mailgun.com\">mailgun.com<\/a>.\n2. Add and verify your sending domain under <strong>Sending \u2192 Domains<\/strong>.\n3. Go to <strong>Sending \u2192 Domain Settings \u2192 SMTP credentials<\/strong>.\n4. Note your SMTP login (usually <code>postmaster@yourdomain.com<\/code>) and generate or copy the password.\n5. In Greenskeeper Settings: select <strong>Mailgun<\/strong>, enter your SMTP login as the <strong>Username<\/strong>, and the SMTP password as the <strong>Password<\/strong>.\n6. Set a verified sender address as the <strong>From Email<\/strong>.<\/p>\n\n<p><strong>Server details (pre-configured):<\/strong> <code>smtp.mailgun.org<\/code> \u2014 port <code>587<\/code> \u2014 TLS<\/p>\n\n<p><em>Note: Mailgun's free tier restricts sending to verified recipient addresses only. Add recipients under Sending \u2192 Overview \u2192 Authorised Recipients if you are on the free plan.<\/em><\/p>\n\n\n\n<h4>Brevo (formerly Sendinblue)<\/h4>\n\n<p><strong>Free plan:<\/strong> 300 emails per day, unlimited contacts.<\/p>\n\n<p><strong>Setup steps:<\/strong>\n1. Create a free account at <a href=\"https:\/\/brevo.com\">brevo.com<\/a>.\n2. Go to your account profile (top-right) \u2192 <strong>SMTP &amp; API<\/strong>.\n3. Under the <strong>SMTP<\/strong> tab, note your <strong>Login<\/strong> (your Brevo account email) and click <strong>Generate a new SMTP Key<\/strong> to create a password.\n4. In Greenskeeper Settings: select <strong>Brevo<\/strong>, enter your Brevo login email as the <strong>Username<\/strong>, and the SMTP key as the <strong>Password<\/strong>.\n5. Set a sender address you have verified in Brevo as the <strong>From Email<\/strong>.<\/p>\n\n<p><strong>Server details (pre-configured):<\/strong> <code>smtp-relay.brevo.com<\/code> \u2014 port <code>587<\/code> \u2014 TLS<\/p>\n\n\n\n<h4>SendLayer<\/h4>\n\n<p><strong>Pricing:<\/strong> Paid plans starting at low volume tiers; free trial available.<\/p>\n\n<p><strong>Setup steps:<\/strong>\n1. Sign up at <a href=\"https:\/\/sendlayer.com\">sendlayer.com<\/a> and add your sending domain.\n2. From the SendLayer dashboard, copy your <strong>SMTP Username<\/strong> and <strong>SMTP Password<\/strong>.\n3. In Greenskeeper Settings: select <strong>SendLayer<\/strong>, enter those credentials, and set a verified address as the <strong>From Email<\/strong>.<\/p>\n\n<p><strong>Server details (pre-configured):<\/strong> <code>smtp.sendlayer.net<\/code> \u2014 port <code>587<\/code> \u2014 TLS<\/p>\n\n\n\n<h4>SMTP.com<\/h4>\n\n<p><strong>Free trial:<\/strong> 50,000 emails.<\/p>\n\n<p><strong>Setup steps:<\/strong>\n1. Create an account at <a href=\"https:\/\/smtp.com\">smtp.com<\/a>.\n2. Go to <strong>Sender \u2192 SMTP credentials<\/strong>.\n3. Copy your <strong>Sender Name<\/strong> (this is the Username) and your <strong>API Key<\/strong> (this is the Password).\n4. In Greenskeeper Settings: select <strong>SMTP.com<\/strong>, enter the Sender Name as <strong>Username<\/strong> and the API Key as <strong>Password<\/strong>.\n5. Set your verified sender address as the <strong>From Email<\/strong>.<\/p>\n\n<p><strong>Server details (pre-configured):<\/strong> <code>send.smtp.com<\/code> \u2014 port <code>587<\/code> \u2014 TLS<\/p>\n\n\n\n<h4>Gmail \/ Google Workspace<\/h4>\n\n<p><strong>Important:<\/strong> Google disabled plain password (basic auth) for SMTP in May 2022. You must use an App Password. OAuth 2.0 is not supported by this plugin.<\/p>\n\n<p><strong>Personal Gmail \u2014 setup steps:<\/strong>\n1. Sign in to your Google Account at <a href=\"https:\/\/myaccount.google.com\">myaccount.google.com<\/a>.\n2. Go to <strong>Security<\/strong> and confirm that <strong>2-Step Verification<\/strong> is turned on. (App Passwords are not available without it.)\n3. In the Security search bar, search for <strong>App Passwords<\/strong>.\n4. Click <strong>Create<\/strong>, choose <strong>Other (custom name)<\/strong>, and type <code>WordPress<\/code> or <code>Greenskeeper<\/code>.\n5. Google displays a 16-character code. Copy it immediately \u2014 it will not be shown again.\n6. In Greenskeeper Settings: select <strong>Gmail \/ Google<\/strong>, enter your full Gmail address (<code>you@gmail.com<\/code>) as the <strong>Username<\/strong>, and paste the 16-character App Password as the <strong>Password<\/strong>.\n7. Set your Gmail address as the <strong>From Email<\/strong>.<\/p>\n\n<p><strong>Google Workspace (paid) \u2014 setup steps:<\/strong>\nThe App Password method above works identically for Workspace accounts. Alternatively, your Workspace admin can configure a <strong>SMTP relay<\/strong> in the Google Admin console (Apps \u2192 Google Workspace \u2192 Gmail \u2192 SMTP relay service), which allows sending from any user in your domain without per-account App Passwords and supports higher sending volumes.<\/p>\n\n<p><strong>Server details (pre-configured):<\/strong> <code>smtp.gmail.com<\/code> \u2014 port <code>587<\/code> \u2014 TLS\/STARTTLS<\/p>\n\n<p><em>Gmail sending limits: personal accounts are limited to approximately 500 emails per day; Google Workspace accounts to 2,000 per day.<\/em><\/p>\n\n\n\n<h4>Microsoft \/ Outlook<\/h4>\n\n<p><strong>Important:<\/strong> Microsoft deprecated basic authentication for Exchange Online in October 2022 but preserved it specifically for SMTP AUTH submissions. App Passwords are required for personal accounts; organisation accounts need SMTP AUTH enabled by an admin.<\/p>\n\n<p><strong>Personal Outlook.com accounts \u2014 setup steps:<\/strong>\n1. Go to <a href=\"https:\/\/account.microsoft.com\/security\">account.microsoft.com\/security<\/a>.\n2. Under <strong>Advanced security options<\/strong>, confirm <strong>Two-step verification<\/strong> is on.\n3. Click <strong>Create a new app password<\/strong>.\n4. Copy the generated password.\n5. In Greenskeeper Settings: select <strong>Microsoft \/ Outlook<\/strong>, enter your full Outlook address (<code>you@outlook.com<\/code> or <code>you@hotmail.com<\/code>) as the <strong>Username<\/strong>, and the app password as the <strong>Password<\/strong>.<\/p>\n\n<p><strong>Microsoft 365 \/ Office 365 organisations \u2014 setup steps:<\/strong>\n1. A Microsoft 365 admin must enable SMTP AUTH for the sending mailbox. In the <strong>Microsoft 365 Admin Centre<\/strong> go to: <strong>Users \u2192 Active Users \u2192 select the user \u2192 Mail tab \u2192 Manage email apps \u2192 check Authenticated SMTP<\/strong>.\n2. Once enabled, use the regular Microsoft 365 email address and password as the Username and Password.\n3. If your organisation enforces Multi-Factor Authentication (MFA), generate an App Password from <a href=\"https:\/\/mysignins.microsoft.com\">mysignins.microsoft.com<\/a> \u2192 <strong>Security info \u2192 Add method \u2192 App password<\/strong>.<\/p>\n\n<p><strong>Server details (pre-configured):<\/strong> <code>smtp.office365.com<\/code> \u2014 port <code>587<\/code> \u2014 TLS\/STARTTLS<\/p>\n\n<p><em>Note: For older personal Outlook.com accounts that do not connect on smtp.office365.com, try using the manual SMTP option with host <code>smtp-mail.outlook.com<\/code> on port <code>587<\/code>.<\/em><\/p>\n\n\n\n<h3>Copyright<\/h3>\n\n<p>Greenskeeper is copyright 2026 Digital Strategy Works LLC.<\/p>\n\n<p><strong>Plugin code<\/strong> is licensed under the GNU General Public License v2.0 or later\n(GPL-2.0+). You are free to use, modify, and redistribute the plugin code under\nthe terms of that licence. A copy of the GPL is included in the plugin package\nand is available at https:\/\/www.gnu.org\/licenses\/gpl-2.0.html.<\/p>\n\n<p><strong>Documentation and written content<\/strong> \u2014 including but not limited to the plugin\ndescription, installation and usage guides, SMTP setup guides, FAQs, and all\nother original prose contained in readme.txt, README.md, and within the plugin's\nadmin interface \u2014 is the intellectual property of Digital Strategy Works LLC and\nis protected by copyright. Reproduction or redistribution of the documentation\noutside the terms of the GPL as it applies to software is prohibited without\nprior written permission from Digital Strategy Works LLC.<\/p>\n\n<p>Greenskeeper, the Greenskeeper logo, and the golf-flag mark are trademarks of\nDigital Strategy Works LLC. Unauthorised use of the Greenskeeper name or visual\nidentity in a manner that implies endorsement or affiliation is prohibited.<\/p>\n\n<p>For licensing enquiries contact: tony@digitalstrategyworks.com<\/p>\n\n<!--section=installation-->\n<h4>Single-Site Install<\/h4>\n\n<ol>\n<li>In your WordPress admin go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Upload <code>greenskeeper.zip<\/code> and click <strong>Install Now<\/strong>.<\/li>\n<li>Click <strong>Activate Plugin<\/strong>.<\/li>\n<li>Navigate to <strong>Site Maintenance<\/strong> in the left-hand admin menu.<\/li>\n<li>Open <strong>Settings<\/strong> and configure your company branding, client email, default administrator, SMTP delivery, and spam filtering.<\/li>\n<\/ol>\n\n<h4>Multisite \/ Network Install<\/h4>\n\n<ol>\n<li>Log in as a Super Admin and go to <strong>Network Admin \u2192 Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Upload <code>greenskeeper.zip<\/code> and click <strong>Install Now<\/strong>.<\/li>\n<li>Click <strong>Network Activate<\/strong> to activate across all sites simultaneously, <strong>or<\/strong> activate per-site from each site's own Plugins screen.<\/li>\n<li>Navigate to <strong>Site Maintenance<\/strong> in the Network Admin menu or any site's admin menu.<\/li>\n<li>Each site has its own independent Settings, Update Log, and Email Log.<\/li>\n<\/ol>\n\n<h4>Manual Install<\/h4>\n\n<ol>\n<li>Unzip the archive and upload the <code>greenskeeper<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate from the WordPress Plugins screen.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20greenskeeper%20report%20updates%20made%20outside%20the%20plugin%3F\"><h3>Does Greenskeeper report updates made outside the plugin?<\/h3><\/dt>\n<dd><p>Yes, from version 1.9.1. Greenskeeper hooks into WordPress's\nupgrader_process_complete action, which fires for any update that runs\nthrough WordPress's standard Plugin_Upgrader or Theme_Upgrader \u2014 including\nupdates made from the WordPress Updates screen, the Avada plugins dashboard\n(for Avada Core and Avada Builder), or any other standard WordPress update\nmechanism.<\/p>\n\n<p>These external updates are logged automatically with a session labelled\n\"External\" in the Update Log, and are included as a separate \"Updates Made\nOutside Greenskeeper\" section in the next maintenance report email.<\/p><\/dd>\n<dt id=\"how%20does%20greenskeeper%20handle%20avada%20theme%20updates%3F\"><h3>How does Greenskeeper handle Avada theme updates?<\/h3><\/dt>\n<dd><p>Greenskeeper handles Avada-related updates in two ways depending on the\nupdate type:<\/p>\n\n<p><strong>Avada theme, Avada Core, and Avada Builder updates<\/strong> \u2014 once your Avada\nlicense is registered, these appear in the standard WordPress updates list\nand can be updated from either the WordPress Updates screen or the Avada\nplugins dashboard. Both routes fire WordPress's standard upgrade hooks.\nGreenskeeper detects and logs these automatically and includes them in the\nmaintenance report email.<\/p>\n\n<p><strong>Avada Patches<\/strong> \u2014 patches applied through Avada's own Maintenance \u2192\nPlugins &amp; Add-Ons dashboard use Avada's proprietary update mechanism and\ndo not fire WordPress's standard hooks. Greenskeeper cannot detect these\nautomatically. They should be documented manually using the Additional\nManual Updates field on the Email Reports page before sending the report.<\/p>\n\n<p>The Updates page also shows a contextual notice when the Avada theme is\ninstalled, explaining the required update order: Avada theme first, then\nAvada Core, then Avada Builder.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20an%20external%20update%20and%20a%20manual%20update%3F\"><h3>What is the difference between an external update and a manual update?<\/h3><\/dt>\n<dd><p>An <strong>external update<\/strong> is one that Greenskeeper detected automatically\nbecause it went through WordPress's standard update mechanism (Plugin_Upgrader\nor Theme_Upgrader). These are logged and included in the email without\nany action from you.<\/p>\n\n<p>A <strong>manual update<\/strong> is one that Greenskeeper cannot detect \u2014 for example\nan Avada Patch, a plugin updated through a vendor's own proprietary\ndashboard, or an FTP file replacement. These must be documented using the\nAdditional Manual Updates field on the Email Reports page.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20support%20avada%20theme%20updates%3F\"><h3>Does the plugin support Avada theme updates?<\/h3><\/dt>\n<dd><p>Yes, with important notes. Avada Core and Avada Builder appear in the standard\nWordPress plugin update list once your Avada license is registered, and the plugin\ncan update them normally. The Updates page shows a contextual notice when Avada is\ninstalled, explaining the required update order: Avada theme first, then Avada Core,\nthen Avada Builder. A confirmation prompt appears if you select the Avada theme for\nupdate, reminding you to follow up with the companion plugins.<\/p>\n\n<p>Avada Patches are managed separately through Avada's own dashboard (Avada \u2192\nMaintenance \u2192 Plugins &amp; Add-Ons) and do not appear in the standard WordPress update\nAPI, so they cannot be detected or applied from this plugin. The Updates page\nincludes a direct link to that dashboard so you can check after completing your\nregular updates.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20support%20wordpress%20multisite%3F\"><h3>Does this plugin support WordPress Multisite?<\/h3><\/dt>\n<dd><p>Yes. It can be network-activated by a Super Admin to cover all sites simultaneously, or activated per-site by individual Administrators. Each site maintains its own isolated database tables, update log, and email log. The plugin handles cross-site AJAX correctly on Multisite so email sending always reads from the correct sub-site's log table.<\/p><\/dd>\n<dt id=\"why%20are%20my%20updates%20not%20showing%20in%20the%20update%20log%3F\"><h3>Why are my updates not showing in the Update Log?<\/h3><\/dt>\n<dd><p>If you upgraded the plugin by uploading new files without deactivating first, the database schema may not have been upgraded. Open <strong>Update Log<\/strong>, expand the <strong>Database Diagnostic<\/strong> panel at the bottom, and click <strong>Force DB Upgrade Now<\/strong>. The panel shows both database tables with their column lists highlighted in green (present) or red (missing). After the upgrade click Refresh \u2014 all sessions should appear.<\/p><\/dd>\n<dt id=\"emails%20are%20not%20being%20delivered.%20what%20should%20i%20do%3F\"><h3>Emails are not being delivered. What should I do?<\/h3><\/dt>\n<dd><p>By default WordPress sends email via PHP's <code>mail()<\/code> function, which many hosting providers block or which major inboxes mark as spam. Go to <strong>Settings \u2192 SMTP &amp; Email Delivery<\/strong> and configure a dedicated SMTP provider. Use <strong>Send Test Email<\/strong> to verify your connection before sending a real report. See the SMTP Setup Guides section below for step-by-step instructions for each supported provider.<\/p><\/dd>\n<dt id=\"why%20did%20a%20plugin%20or%20theme%20update%20fail%3F\"><h3>Why did a plugin or theme update fail?<\/h3><\/dt>\n<dd><p>Premium and licensed plugins that require a valid license key for automatic updates will fail with a mapped error message. The Update Log and email reports both include a plain-English explanation and an action recommendation. These items must be updated manually through the vendor's dashboard or by providing a valid license key.<\/p><\/dd>\n<dt id=\"can%20i%20send%20the%20report%20email%20from%20a%20specific%20email%20address%3F\"><h3>Can I send the report email from a specific email address?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>Settings \u2192 SMTP &amp; Email Delivery<\/strong> and fill in the <strong>From Name<\/strong> and <strong>From Email<\/strong> fields. The From Email must be authorised to send from your SMTP provider or domain \u2014 using an unverified address is the most common cause of delivery failures.<\/p><\/dd>\n<dt id=\"can%20i%20update%20wordpress%20core%20separately%20from%20plugins%20and%20themes%3F\"><h3>Can I update WordPress Core separately from plugins and themes?<\/h3><\/dt>\n<dd><p>Yes. The Updates page has three separate sections \u2014 WordPress Core, Plugins, and Themes \u2014 each with its own Select All checkbox. You can update Core alone, plugins alone, themes alone, or any combination.<\/p><\/dd>\n<dt id=\"is%20my%20smtp%20password%20stored%20securely%3F\"><h3>Is my SMTP password stored securely?<\/h3><\/dt>\n<dd><p>Yes. Passwords and API keys are encrypted with AES-256-CBC before being saved to the database. The encryption key is derived from your WordPress installation's AUTH_KEY and SECURE_AUTH_KEY constants, which are unique per site and defined in wp-config.php. The raw password is never output into the browser \u2014 only a masked placeholder is shown when a value is already saved.<\/p><\/dd>\n<dt id=\"where%20is%20the%20plugin%20data%20stored%3F\"><h3>Where is the plugin data stored?<\/h3><\/dt>\n<dd><p>Three custom database tables per site:\n* <code>{prefix}_wpmm_update_log<\/code> \u2014 one row per update action (session_id, item_name, item_type, item_slug, old_version, new_version, status, error_code, message, updated_at)\n* <code>{prefix}_wpmm_email_log<\/code> \u2014 one row per email send (session_id, to_email, subject, body, status, sent_at)\n* <code>{prefix}_wpmm_spam_log<\/code> \u2014 one row per blocked comment attempt (rule, author_ip, author_name, author_email, author_url, comment_content, post_id, blocked_at)<\/p>\n\n<p>Plugin settings (branding, SMTP, spam filter configuration, client email, default admin, API key) are stored in the <code>wpmm_settings<\/code> WordPress option.<\/p><\/dd>\n<dt id=\"can%20i%20review%20blocked%20spam%20comments%3F\"><h3>Can I review blocked spam comments?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>Site Maintenance \u2192 Spam Log<\/strong>. Every comment attempt blocked by\nany local filter rule (honeypot, time check, keyword, IP, link count, duplicate)\nis logged there with the author's IP, name, email, and a content preview. Akismet-\nblocked comments are logged here too and also appear in WordPress's native\nComments \u2192 Spam queue.<\/p>\n\n<p>From the Spam Log you can: filter by rule or IP, add an IP to the blocklist\nwith one click, delete individual entries, or clear the entire log.<\/p><\/dd>\n<dt id=\"why%20were%20themes%20not%20showing%20in%20my%20email%20reports%3F\"><h3>Why were themes not showing in my email reports?<\/h3><\/dt>\n<dd><p>This was a bug in versions prior to 1.9.1. Theme update log entries stored\nwith item_type as 'themes' (plural) were incorrectly bucketed into the\nPlugins section. Version 1.9.1 normalises both spellings. No data was lost\n\u2014 resending any previous email from the Sent Email History table will now\nshow themes in the correct Themes section.<\/p><\/dd>\n<dt id=\"does%20the%20email%20report%20include%20spam%20filter%20activity%3F\"><h3>Does the email report include spam filter activity?<\/h3><\/dt>\n<dd><p>Yes, from version 1.9.1. Every maintenance report email includes a Spam\nActivity section listing comment attempts blocked since the last report was\nsent. Each entry shows when it was blocked, which rule caught it, the\nsubmitter's IP, and a content preview. If no spam was blocked since the\nlast report the section is omitted entirely.<\/p><\/dd>\n<dt id=\"how%20does%20the%20administrator%20name%20appear%20in%20email%20reports%3F\"><h3>How does the administrator name appear in email reports?<\/h3><\/dt>\n<dd><p>From version 1.9.1 the email uses the administrator's First Name and Last\nName from their WordPress user profile. Go to Users &rarr; Your Profile and\nfill in the First Name and Last Name fields, then click Update Profile. If\nno first or last name is saved, the Display Name is used as a fallback.<\/p><\/dd>\n<dt id=\"who%20can%20access%20greenskeeper%3F\"><h3>Who can access Greenskeeper?<\/h3><\/dt>\n<dd><p>By default, any WordPress Administrator can access the plugin. Once you save the\nManage Plugin Access settings (Settings \u2192 Manage Plugin Access), only the\nadministrators you have explicitly checked can see or use any part of the plugin.\nUnchecked administrators see no menu item and cannot reach any plugin page.<\/p>\n\n<p>Your own account is always locked in \u2014 you cannot accidentally remove your own\naccess from within the plugin.<\/p><\/dd>\n<dt id=\"can%20a%20client%20with%20administrator%20access%20see%20the%20plugin%3F\"><h3>Can a client with Administrator access see the plugin?<\/h3><\/dt>\n<dd><p>Not after you configure the Manage Plugin Access card. Go to\n<strong>Site Maintenance \u2192 Settings<\/strong>, scroll to <strong>Manage Plugin Access<\/strong>, uncheck the\nclient's administrator account, and click <strong>Save Access Settings<\/strong>. That account\nwill no longer see the Site Maintenance menu or any plugin page.<\/p><\/dd>\n<dt id=\"what%20if%20i%20get%20locked%20out%20of%20the%20plugin%3F\"><h3>What if I get locked out of the plugin?<\/h3><\/dt>\n<dd><p>Lockout cannot happen from within the plugin UI \u2014 your own account is always\nkept in the access list automatically. If you are locked out through a direct\ndatabase change, connect to the database and either delete the <code>wpmm_settings<\/code>\noption (which resets to the manage_options fallback) or add your user ID back\nto the <code>access_user_ids<\/code> array in that option.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20support%20two-factor%20authentication%3F\"><h3>Does the plugin support two-factor authentication?<\/h3><\/dt>\n<dd><p>The plugin does not implement 2FA itself. Instead, it detects whether a 2FA plugin\nis active and shows a notice on every plugin page if none is found, with direct\nlinks to install WP 2FA or Two Factor. We recommend protecting the administrator\naccounts that have wpmm_access with 2FA via one of these dedicated plugins:\nWP 2FA (by Melapress), Two Factor (official WordPress.org plugin),\nWordfence Security, or iThemes Security Pro.<\/p><\/dd>\n<dt id=\"how%20do%20spam%20filter%20settings%20work%20on%20a%20multisite%20network%3F\"><h3>How do spam filter settings work on a Multisite network?<\/h3><\/dt>\n<dd><p>Each sub-site has its own independent spam filter settings stored in that\nsite's wpmm_settings option. From Network Admin, go to\nSettings \u2192 Spam Filter &amp; Comments. The All Sites view shows a summary table\nof every site with its spam status, Akismet connection, and comments status.\nSelect a specific site from the Site Scope Bar to edit its settings. Changes\nonly affect that site and are saved immediately.<\/p><\/dd>\n<dt id=\"can%20i%20run%20updates%20for%20all%20sites%20at%20once%2C%20or%20only%20one%20site%20at%20a%20time%3F\"><h3>Can I run updates for all sites at once, or only one site at a time?<\/h3><\/dt>\n<dd><p>Both. In Network Admin, the Site Scope Bar on the Updates page defaults to\nAll Sites, which shows all available updates for all installed plugins and\nthemes. Selecting a specific site filters the list to only the plugins and\nthemes activated on that site, and runs updates in that site's context.<\/p><\/dd>\n<dt id=\"does%20the%20network%20email%20report%20cover%20all%20sites%3F\"><h3>Does the network email report cover all sites?<\/h3><\/dt>\n<dd><p>Yes. When the Email Reports page is in All Sites scope (Network Admin,\nno site selected), sending the report builds a consolidated email with a\nsection per site. Each section contains that site's own Core, Plugins, and\nThemes update tables. When a single site is selected, the report covers\nonly that site in the standard single-site format.<\/p><\/dd>\n<dt id=\"does%20the%20spam%20filter%20work%20without%20an%20akismet%20api%20key%3F\"><h3>Does the spam filter work without an Akismet API key?<\/h3><\/dt>\n<dd><p>Yes. The local filtering layer (honeypot field, submission time check, link count\nlimit, keyword blocklist, IP blocklist, and duplicate detection) runs entirely on\nyour server with no external API calls. Local filtering alone catches the majority\nof automated bot spam. Adding an Akismet API key activates a second layer of\nAI-powered cloud filtering for more comprehensive coverage.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20paid%20akismet%20account%3F\"><h3>Do I need a paid Akismet account?<\/h3><\/dt>\n<dd><p>Akismet's free plan is for personal, non-commercial sites only. Any commercial\nwebsite \u2014 including client sites managed by an agency \u2014 requires a paid Akismet\nplan. Visit <a href=\"https:\/\/akismet.com\/plans\/\">akismet.com\/plans<\/a> to choose the right\nplan. Greenskeeper provides the Akismet integration; licensing is your\nresponsibility.<\/p><\/dd>\n<dt id=\"will%20the%20spam%20filter%20conflict%20with%20the%20standalone%20akismet%20plugin%3F\"><h3>Will the spam filter conflict with the standalone Akismet plugin?<\/h3><\/dt>\n<dd><p>No. Greenskeeper detects when the standalone Akismet plugin is already\nactive and skips its own Akismet API call automatically. Only the local filtering\nlayer runs in that case, so you never get double-filtering. The Settings page shows\na notice when the standalone plugin is detected.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20akismet%20is%20unreachable%20when%20a%20comment%20is%20submitted%3F\"><h3>What happens if Akismet is unreachable when a comment is submitted?<\/h3><\/dt>\n<dd><p>The plugin fails open \u2014 the comment is allowed through rather than being blocked.\nThis prevents legitimate comments from being lost due to a temporary API outage or\nnetwork issue. Local filters still run normally regardless of Akismet availability.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20comments%20completely%20across%20the%20entire%20site%3F\"><h3>Can I disable comments completely across the entire site?<\/h3><\/dt>\n<dd><p>Yes. The Disable Comments toggle in Settings \u2192 Spam Filter &amp; Comments removes\ncomment support from every post type, closes all existing comments via WordPress\nfilter hooks, hides the Comments admin menu item, redirects direct access to the\ncomments admin page, and removes discussion meta boxes from the post and page\neditors. This is a site-wide setting \u2014 it applies to all post types including\ncustom ones.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20an%20ip%20address%20to%20the%20blocklist%20after%20catching%20a%20spammer%3F\"><h3>How do I add an IP address to the blocklist after catching a spammer?<\/h3><\/dt>\n<dd><p>Two ways to add an IP. From the <strong>Spam Log<\/strong> page, click the <strong>Block IP<\/strong> button on any row \u2014 the IP is added to the blocklist instantly without leaving the page. Alternatively go to <strong>Settings \u2192 Spam Filter &amp; Comments<\/strong>, add the address to the Blocked IP Addresses textarea (one per line), and click <strong>Save Spam Settings<\/strong>.<\/p><\/dd>\n<dt id=\"how%20does%20greenskeeper%20handle%20multisite%20networks%3F\"><h3>How does Greenskeeper handle Multisite networks?<\/h3><\/dt>\n<dd><p>In Network Admin, a Site Scope Bar appears at the top of the Updates, Spam Log,\nand Settings pages. You can select \"All Sites\" to operate across the entire\nnetwork, or choose a specific site to scope the view to that site only.<\/p><\/dd>\n<dt id=\"what%20does%20%22all%20sites%22%20mode%20do%20on%20the%20updates%20page%3F\"><h3>What does \"All Sites\" mode do on the Updates page?<\/h3><\/dt>\n<dd><p>In All Sites mode the Updates page shows every available update for every plugin\nand theme installed on the network, regardless of which site has it activated.\nRunning updates applies them network-wide and logs results to the network admin\nsite's update log. The email report lists each site as a separate section with\nits own Core, Plugins, and Themes tables.<\/p><\/dd>\n<dt id=\"what%20does%20single-site%20scope%20do%20on%20the%20updates%20page%3F\"><h3>What does single-site scope do on the Updates page?<\/h3><\/dt>\n<dd><p>When you select a specific site, the Updates page filters the plugin and theme\nlist to only show items activated on that site (including network-activated\nplugins). Updates run in that site's context and log to that site's own\nwpmm_update_log table. The email report uses the single-site format.<\/p><\/dd>\n<dt id=\"are%20spam%20filter%20settings%20shared%20across%20all%20sites%20in%20a%20network%3F\"><h3>Are spam filter settings shared across all sites in a network?<\/h3><\/dt>\n<dd><p>No. Each site has its own independent spam filter settings. In Network Admin,\nselect a site from the scope bar on the Settings page to view and edit that\nsite's spam configuration. Selecting \"All Sites\" shows a summary table of all\nsites with their spam filter status, Akismet connection status, and comments\ntoggle state.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20plugin%20alongside%20wp%20mail%20smtp%20or%20other%20smtp%20plugins%3F\"><h3>Can I use this plugin alongside WP Mail SMTP or other SMTP plugins?<\/h3><\/dt>\n<dd><p>It is recommended to use either Greenskeeper's built-in SMTP configuration <strong>or<\/strong> a separate SMTP plugin \u2014 not both. Both plugins hook into <code>phpmailer_init<\/code> and will conflict. If you already have WP Mail SMTP, FluentSMTP, or Post SMTP installed and configured, leave Greenskeeper's SMTP setting on <strong>WordPress Default<\/strong> and let the other plugin handle delivery.<\/p>\n\n<\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.6<\/h4>\n\n<ul>\n<li>Feature: Administrator notes are now stored permanently with each sent\nemail. Previously the note was only included in the rendered email body\nat send time \u2014 if the template changed, historical previews lost the\nnote. A new 'note' column is added to wpmm_email_log (existing installs\nare upgraded automatically on first load). The raw note text is stored\nseparately from the HTML body so previews always show the exact note the\nadministrator typed, regardless of how the email template has evolved.\nThe preview modal displays the note in a prominently styled amber block\nabove the email iframe. Emails sent before v2.1.6 show no note block\n(null note value) \u2014 only emails sent from this version onward will have\nthe note stored.<\/li>\n<\/ul>\n\n<h4>2.1.5<\/h4>\n\n<ul>\n<li>Fix: Update Notes field content was being added below the spam section\nwhere it was easy to miss. Note now appears prominently at the top of the\nemail body immediately below the report heading, ensuring clients always\nsee administrator notes before the update tables.<\/li>\n<li>Fix: Failed update rows in the email template now use amber styling\n(\"Needs Attention\" with amber background) instead of large red text\n(\"Update Failed\" in red). License-gated plugins show a friendly\nclient-facing message instead of a technical error code. DEBUG diagnostic\nstrings are stripped from messages before they reach the client email.<\/li>\n<li>Fix: iThemes Security Pro, Google Site Kit, and ShortPixel Image\nOptimizer were being deactivated after updates and not restored.\nThese plugins intentionally self-deactivate during their update\nprocess via their own upgrader_process_complete hooks, then expect\nthe updater to re-activate them afterward. The previous snapshot\/\nrestore approach ran before these self-deactivation hooks fired and\ntherefore could not catch them.\nAdded a new wpmm_post_update_reactivate() hook on\nupgrader_process_complete at priority 99 \u2014 deliberately very late\nso it runs after all plugin-specific hooks. It has two jobs:\n(1) Re-activate the plugin that Greenskeeper just updated if it\nended up inactive after its own hooks ran; (2) Restore any other\nplugin that was active before the update but is now inactive as\ncollateral damage. Uses is_plugin_active_for_network() on multisite\nto correctly handle network-activated vs site-activated plugins,\nand activate_plugin($slug, '', $is_network) accordingly.<\/li>\n<\/ul>\n\n<h4>2.1.4<\/h4>\n\n<ul>\n<li>Fix: PHP Warning \"Undefined variable $api_key\" on the Settings page.\nThe variable was renamed to $api_key_set in v2.0.5 but one reference\nin the REST API endpoints section was not updated.<\/li>\n<li>Fix: Email reports only showing the most recent session when multiple\nunsent sessions exist. The pending sessions list is now always cleared\nafter any successful send, regardless of whether it was triggered from\nthe Updates page or the Email Reports page.<\/li>\n<li>Fix: WooCommerce and other hook-sensitive plugins (WP Rocket, Wordfence,\nReally Simple SSL) not fully restored after collateral deactivation.\nThese plugins register activation hooks that are bypassed by direct\noption writes. After the option write, activate_plugin() is now called\nfor any hook-sensitive plugin in the restore list to ensure their\nactivation hooks fire and they are fully re-initialized.<\/li>\n<li>Fix: Sent Email History row not appearing after send when the email\nlog database insert returns ID 0 (can occur on multisite when the\nemail_log table is in a different blog context). A timestamp-based\nfallback row ID is now used when email_id is 0, ensuring the row\nalways appears immediately in the history table.<\/li>\n<\/ul>\n\n<h4>2.1.3<\/h4>\n\n<ul>\n<li>Fix: HTTP 500 errors on some multisite networks caused by the per-site\nsnapshot loop introduced in v2.1.1. Both the snapshot and restore loops\nare now wrapped in try\/catch blocks for graceful fallback.<\/li>\n<li>Fix: HTTP 500 caused by premium plugins with custom updater libraries\n(e.g. WP Offload Media Pro \/ Delicious Brains updater) throwing ValueError\nor other exceptions during Plugin_Upgrader::upgrade(). All four upgrader\ncalls (plugin normal path, plugin injected-entry path, theme normal path,\ntheme injected-entry path) are now wrapped in try\/catch Throwable blocks.\nWhen a plugin's own updater throws an exception, Greenskeeper catches it\nand returns a descriptive error message rather than an HTTP 500, directing\nthe user to update via Dashboard \u2192 Updates as a fallback.<\/li>\n<\/ul>\n\n<h4>2.1.1<\/h4>\n\n<ul>\n<li>Fix: Plugins activated only on a specific sub-site (not network-activated)\ncould still be deactivated by collateral damage during updates. Previous\nversions only snapshotted the primary site's active_plugins and the network\nactive_sitewide_plugins \u2014 missing plugins like Custom Post Type UI that are\nactivated per-site on individual sub-sites. The snapshot now reads\nactive_plugins from every site in the network. The restore checks each\nsub-site's current active_plugins against its snapshot and re-activates\nany plugin that was deactivated as collateral damage. The updated snapshot\nis persisted back to the network transient so retries also have access to\nthe corrected per-site state.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Critical fix: network-activated plugins (AIOSEO, Co-Authors Plus,\nGravity Forms, Sucuri) were still being deactivated on subdirectory\nmultisite networks despite the v2.0.8 fix. Three root causes identified\nand resolved: (1) the snapshot was being taken AFTER switch_to_blog(),\nmeaning it captured the sub-site plugin list rather than the main site\nnetwork state; (2) per-blog transients (get_transient\/set_transient)\nwere used for the snapshot, which are stored in the current blog's\noptions table and lost when blog context switches mid-request \u2014 replaced\nwith network-level site transients (get_site_transient\/set_site_transient);\n(3) restore_current_blog() was called after reading the post-update plugin\nstate, meaning the comparison was in the wrong blog context \u2014 blog context\nis now restored before reading post-update state so both snapshot and\npost-update reads happen in the same (main site) context.<\/li>\n<\/ul>\n\n<h4>2.0.9<\/h4>\n\n<ul>\n<li>Critical fix: HTTP 500 errors on managed hosting (Kinsta, WP Engine)\nduring plugin and theme updates. Root cause: wp_update_plugins() and\nwp_update_themes() make loopback HTTP requests back to the WordPress.org\nAPI. When called from within an AJAX request, these loopback requests\nare blocked or time out on managed hosting, causing the outer AJAX\nrequest to return HTTP 500. All blocking wp_update_plugins\/themes()\ncalls during AJAX update requests have been replaced with a non-blocking\nwp-cron background event (wpmm_refresh_update_transient) that fires\nafter the request completes. The upgrader proceeds with the existing\ntransient URL and the next retry benefits from the refreshed URL.<\/li>\n<\/ul>\n\n<h4>2.0.8<\/h4>\n\n<p>Critical fix: network-activated plugins (Site Kit, Sucuri, Clarity) restored after collateral deactivation.\nEmail: multiple sessions grouped by date with clear headers.\nEmail history: live AJAX update after send. Unit tests added.<\/p>\n\n<h4>2.0.7<\/h4>\n\n<p>Backup warning modal before any update. Collateral deactivation restore improved with session-keyed transient.<\/p>\n\n<h4>2.0.6<\/h4>\n\n<p>Fix: collateral plugin deactivation \u2014 active plugins snapshotted before each update and restored after.<\/p>\n\n<h4>2.0.5<\/h4>\n\n<p>Security: cross-site AJAX cap bypass (#1), Akismet site scoping (#7), spam log actions (#8), REST API key hashed (#9).\nFix: All-Sites network email order (#2), dashboard date (#6), log pagination in SQL (#10), false success banner (#11).<\/p>\n\n<h4>2.0.4<\/h4>\n\n<p>Feature: email reports accumulate all unsent sessions \u2014 separate plugin\/theme updates combined into one email.<\/p>\n\n<h4>2.0.3<\/h4>\n\n<p>Fix: AIOSEO Pro incorrectly flagged as manual update \u2014 scan now refreshes before deciding.<\/p>\n\n<h4>2.0.2<\/h4>\n\n<p>Fix: Divi and premium themes now update correctly \u2014 freshness check, skin error surfacing, auto-retry.<\/p>\n\n<h4>2.0.1<\/h4>\n\n<p>Fix: Jetpack copy error now reported correctly. Gravity Forms add-ons show manual update warning.<\/p>\n\n<h4>2.0.0<\/h4>\n\n<p>Premium plugin updates confirmed working. Auto-retry with fresh signed URL. AIOSEO Pro verified.<\/p>\n\n<h4>1.9.9<\/h4>\n\n<p>Diagnostic build for AIOSEO Pro null result issue.<\/p>\n\n<h4>1.9.8<\/h4>\n\n<p>Fix: AIOSEO Pro reporting \"version unchanged\" \u2014 auto-retry with fresh signed URL.<\/p>\n\n<h4>1.9.7<\/h4>\n\n<p>Premium plugin updates: forces fresh wp_update_plugins() when package URL is stale.<\/p>\n\n<h4>1.9.6<\/h4>\n\n<p>Critical fix: prevent premium plugin deactivation on failed updates.<\/p>\n\n<h4>1.9.5<\/h4>\n\n<p>Feature: Sent Email History updates instantly via AJAX after send.<\/p>\n\n<h4>1.9.4<\/h4>\n\n<p>Fix: batch update timeouts on shared hosting.<\/p>\n\n<h4>1.9.3<\/h4>\n\n<p>Plugin Check compliance: gmdate(), esc_sql(), prepared queries, short description length.<\/p>\n\n<h4>1.9.2<\/h4>\n\n<p>WordPress.org compliance: sanitize $_SERVER variables, External Services disclosure, inline comments.<\/p>","raw_excerpt":"Manage WordPress updates, filter comment spam, send branded email reports, and configure SMTP delivery \u2014 for single sites and Multisite networks.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/297024","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=297024"}],"author":[{"embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tonyzeoli"}],"wp:attachment":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=297024"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=297024"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=297024"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=297024"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=297024"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=297024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}