<?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: Artem Meleshkin</title>
    <description>The latest articles on DEV Community by Artem Meleshkin (@artem_meleshkin_0c4e0a675).</description>
    <link>https://dev.to/artem_meleshkin_0c4e0a675</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3150953%2F31042caa-63e7-45f4-89f9-742aba21fd64.jpg</url>
      <title>DEV Community: Artem Meleshkin</title>
      <link>https://dev.to/artem_meleshkin_0c4e0a675</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/artem_meleshkin_0c4e0a675"/>
    <language>en</language>
    <item>
      <title>The monitoring agent that cannot be told what to do</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Sun, 12 Jul 2026 21:17:15 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/the-monitoring-agent-that-cannot-be-told-what-to-do-33kd</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/the-monitoring-agent-that-cannot-be-told-what-to-do-33kd</guid>
      <description>&lt;p&gt;Here is a design decision we made early, wrote into the architecture as an invariant, and have refused to revisit since: &lt;strong&gt;our agent accepts no commands.&lt;/strong&gt; Not "we don't currently use that feature" — the hub has no way to tell an installed agent to do anything at all. No remote execution, no self-update, no "collect this for us right now". It sends data outward, and that is the entire surface.&lt;/p&gt;

&lt;p&gt;This is not a limitation we are working around. It is the product. And it costs us features that customers ask for, which is exactly why it is worth explaining.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable arithmetic of remote control
&lt;/h2&gt;

&lt;p&gt;Any tool that can update a plugin across fifty client sites is, by construction, a tool that can execute code on fifty client sites. Any dashboard that can restart a service on your server holds, somewhere, a credential that lets it in. This is not a flaw in those products — it is what they are for. You cannot automate a repair without the power to perform it.&lt;/p&gt;

&lt;p&gt;But that power has an owner, and the owner has a login, and the login has a support team, and somewhere in that chain there is a version of the software with a bug in it. When the tool is compromised, the blast radius is not the tool. It is every machine the tool could reach.&lt;/p&gt;

&lt;p&gt;The industry has already run this experiment at scale. In July 2021, attackers exploited a vulnerability in a widely used remote monitoring and management platform. They did not break into a single company — they broke into the thing that had access to the companies. Roughly sixty managed service providers were hit, and through them, an estimated &lt;strong&gt;800 to 1,500 downstream businesses&lt;/strong&gt; were encrypted in a single weekend, with a $70 million ransom demand attached.&lt;/p&gt;

&lt;p&gt;Read that shape again, because it is the whole argument: &lt;em&gt;the victims did nothing wrong.&lt;/em&gt; They had bought a well-known product from a serious vendor and installed it exactly as instructed. Their compromise arrived through the door they had deliberately, sensibly, contractually left open — the one that let their provider help them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A tool with remote control over a thousand servers is not a convenience with a security caveat. It is a single door to a thousand servers, and everything else about it is a detail.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What we decided instead
&lt;/h2&gt;

&lt;p&gt;We asked a narrower question than most monitoring vendors do. Not "what could we do for the customer if we had access?" — the answer to that is always "more" — but &lt;strong&gt;"what is the least access that still lets us tell the truth about whether their sites work?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer turned out to be: none at all, in the inbound direction.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The host agent is one-way.&lt;/strong&gt; It opens an outbound connection, streams metrics, and hangs up. There is no command channel. The message types for remote instructions exist in our protocol as dead code from an early draft — frozen, never sent, ignored by the agent — and we left them in only because removing them would break protocol compatibility for no gain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The WordPress plugin has no inbound endpoints.&lt;/strong&gt; It registers no REST routes and no AJAX handlers. It gathers diagnostics — core version, plugin state, whether the order pipeline is alive, whether mail is actually leaving — and posts them out. There is no URL on your site that our servers can call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updating the agent is your action, not ours.&lt;/strong&gt; No self-update, no silent replacement. If a new version ships, we can tell you your agent is old — a log line, a badge in the dashboard — and that is where our involvement ends. You reinstall it, verifying the checksum, on your schedule.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The security property that falls out of this is simple enough to state in one sentence, which is the point: &lt;strong&gt;if our servers are compromised tomorrow, an attacker still cannot reach your machine through us.&lt;/strong&gt; There is no path. Not a locked one, not a well-audited one — no path.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this costs — and we will not pretend otherwise
&lt;/h2&gt;

&lt;p&gt;A monitor that cannot act is a monitor that cannot save you at 3 a.m. We do not do any of this, and we will not:&lt;/p&gt;

&lt;p&gt;These are genuinely useful. If you need them, use a maintenance platform that provides them — and be clear-eyed that you are trading a real amount of exposure for a real amount of convenience. That trade is legitimate. It is simply not the trade we make on your behalf without telling you.&lt;/p&gt;

&lt;p&gt;What we do instead is the half that does not require the door: watch the site from outside from several regions at once, watch the business paths from inside the CMS — does the checkout still accept an order, does the contact form still deliver mail to the inbox, is the certificate about to expire, is the domain quietly running out — and tell you the moment any of it stops being true. &lt;a href="https://pingvera.com/blog/woocommerce-checkout-monitoring.html" rel="noopener noreferrer"&gt;The failures that matter most are silent ones&lt;/a&gt;, and none of them require us to hold a key to your server.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that is really about trust
&lt;/h2&gt;

&lt;p&gt;Agencies are the ones who feel this most sharply, because they are not making the decision for themselves. When you install a tool on a client's server, you have quietly extended that client's trust to a third party they have never heard of and cannot audit. If it goes wrong, "the vendor had a vulnerability" is not a sentence that survives contact with the client.&lt;/p&gt;

&lt;p&gt;So the honest version of our pitch is not that we are more secure than the alternatives. It is that &lt;strong&gt;we removed the category of risk instead of managing it.&lt;/strong&gt; There is nothing to audit in our access model, because there is no access. That is a smaller promise than "we will keep your servers safe" — and it is one we can actually keep, on our worst day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions people actually ask
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can Pingvera fix a problem it finds?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, and it never will. We tell you; you fix it. That is the whole contract, and it is what makes the security property above possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Isn't a plugin inside WordPress the same kind of access?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only if it listens. Ours does not: no REST routes, no AJAX endpoints, no inbound path from us to your site. It collects and posts outward. A compromise of our side cannot become a compromise of yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if I want the automation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then take it — from a maintenance platform built for it — and let an independent monitor verify the result afterwards. One tool changes the system; the other checks that the change did not quietly break the checkout. Those are two different jobs, and there is a good argument for not handing both to the same vendor.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/monitoring-without-server-access.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/monitoring-without-server-access.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How much to charge for website maintenance — and what to actually put in the plan</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:27:28 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/how-much-to-charge-for-website-maintenance-and-what-to-actually-put-in-the-plan-4jh0</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/how-much-to-charge-for-website-maintenance-and-what-to-actually-put-in-the-plan-4jh0</guid>
      <description>&lt;p&gt;Every article about maintenance pricing gives you a range and leaves. The range is the easy part — you can find one in ten seconds, and it will be wide enough to be useless. The hard part is the conversation in month four, when nothing has broken, and the client asks what exactly they are paying for. Get the structure right and that conversation never happens. Get it wrong and no price is defensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Price the risk, not the hours
&lt;/h2&gt;

&lt;p&gt;The most common mistake is pricing a care plan as a bucket of support hours. It feels fair and it quietly destroys the relationship, because it teaches the client to think in the wrong unit.&lt;/p&gt;

&lt;p&gt;Sell hours, and every invoice invites an audit: &lt;em&gt;did we really use two hours?&lt;/em&gt; A quiet month looks like a refund waiting to happen. You have made your own reliability into an argument against your fee.&lt;/p&gt;

&lt;p&gt;Price the &lt;strong&gt;risk you absorb&lt;/strong&gt;, and the unit changes. The client is not buying your time; they are buying the guarantee that their site keeps working and that someone competent is watching. In a quiet month you delivered exactly what they bought. That is a very different negotiation.&lt;/p&gt;

&lt;p&gt;Which means the price should follow what breaking actually costs &lt;em&gt;them&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;Two clients with identical WordPress installs can legitimately pay very different amounts, and you can explain why in one sentence: &lt;em&gt;"one of you loses a Tuesday, the other loses ten thousand dollars."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually belongs in the plan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The table stakes (everybody has these)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backups&lt;/strong&gt; — with restores you have actually tested. An untested backup is a rumour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updates&lt;/strong&gt; — core, plugins, themes, with a check that the site still works afterwards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; — vulnerability watch, malware scanning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uptime monitoring&lt;/strong&gt; — the box everyone ticks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You cannot charge a premium for these. Every competitor lists them, most hosts throw in half of them, and the client assumes them. They are the cost of entry.&lt;/p&gt;

&lt;h3&gt;
  
  
  The differentiators (almost nobody has these)
&lt;/h3&gt;

&lt;p&gt;Here is where a plan stops being a commodity, and it comes down to one shift: from watching the &lt;em&gt;website&lt;/em&gt; to watching the &lt;em&gt;business the website is doing&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lead delivery, verified end to end.&lt;/strong&gt; Not "the contact page loads" — an actual test submission that is then found in the mailbox. Because &lt;a href="https://pingvera.com/blog/contact-form-7-not-sending-email.html" rel="noopener noreferrer"&gt;the form will show a green success message long after it stopped delivering anything&lt;/a&gt;, and neither WordPress nor any SMTP log will tell you otherwise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Order acceptance, for stores.&lt;/strong&gt; Order flow, &lt;a href="https://pingvera.com/blog/woocommerce-failed-orders.html" rel="noopener noreferrer"&gt;failed-order spikes&lt;/a&gt;, gateways left in test mode. A store can return 200 OK for a week while taking exactly zero money.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expiry watch.&lt;/strong&gt; Domain and SSL. The two outages that agencies inflict on themselves, and the two that are unforgivable because they were on a calendar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrity.&lt;/strong&gt; Modified core files, injected redirects, an accidental &lt;code&gt;noindex&lt;/code&gt; after a release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A report the client reads.&lt;/strong&gt; See below — this is the part that decides whether the retainer survives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice what these have in common: &lt;strong&gt;they all fail silently.&lt;/strong&gt; Which is exactly why they belong in a paid plan — nobody notices them missing until it is expensive, and nobody thanks you for them until you can show them.&lt;/p&gt;

&lt;h2&gt;
  
  
  A structure that holds up
&lt;/h2&gt;

&lt;p&gt;Three tiers, each defined by &lt;em&gt;what you take responsibility for&lt;/em&gt;, not by hours:&lt;/p&gt;

&lt;p&gt;Two deliberate choices in that table. &lt;strong&gt;Small edits are included in every tier&lt;/strong&gt; — they cost you little, they are the thing clients feel, and metering them poisons the relationship over twenty-dollar arguments. And &lt;strong&gt;the response window is a tier feature&lt;/strong&gt;: it is the honest way to charge more, because it is the thing you are genuinely selling — how fast a human turns up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The month-four problem
&lt;/h2&gt;

&lt;p&gt;Here is the conversation that kills retainers. Four months in, nothing has broken. The client looks at the invoice and thinks: &lt;em&gt;we're paying for nothing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They are not wrong to think it. From where they sit, they have observed four months of a website working — the same website that, in their mental model, would probably have worked anyway. The value you delivered is entirely invisible. It is &lt;em&gt;defined&lt;/em&gt; by absence.&lt;/p&gt;

&lt;p&gt;There is exactly one instrument that fixes this, and it is not a better sales conversation. It is the &lt;a href="https://pingvera.com/blog/monthly-website-maintenance-report.html" rel="noopener noreferrer"&gt;monthly report&lt;/a&gt; — and specifically, a report that talks about &lt;strong&gt;prevention rather than activity&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bad: "Uptime 99.98%. 12 plugins updated." (Numbers. So what?)&lt;/li&gt;
&lt;li&gt;Good: "Your SSL certificate was due to expire on the 12th — renewed on the 3rd. Two plugins had published vulnerabilities; updated the same week. Your contact form was tested 720 times this month and delivered every time."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second version reports the same month. It just makes the invisible visible: here is what would have gone wrong, here is why it didn't. A quiet month stops being an absence of work and becomes evidence of it.&lt;/p&gt;

&lt;p&gt;And the report needs to be boringly reliable, because it &lt;em&gt;is&lt;/em&gt; the product the client actually holds. If it arrives late, arrives empty, or arrives with numbers that changed since last time, you have undermined the one artefact that justifies the fee. (This is not theoretical — &lt;a href="https://pingvera.com/blog/managewp-alternative.html" rel="noopener noreferrer"&gt;agencies publicly complain that their reporting tool "randomly" works&lt;/a&gt;.) Ours freezes the data into an immutable snapshot when the report is created, so the numbers a client sees in August are the numbers you sent in July.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three pricing rules that survive contact with clients
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Never sell "hours of maintenance".&lt;/strong&gt; Sell responsibility for outcomes. Hours make you a contractor to be audited; outcomes make you a partner to be kept.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Charge more for the sites that would hurt more.&lt;/strong&gt; And say so out loud — clients understand risk-based pricing instinctively. It's how they buy insurance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report prevention every single month, without being asked.&lt;/strong&gt; The retainer is renewed by the report, not by the work. The work merely makes the report true.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Get those three right and the exact number matters far less than you think. Get them wrong and you will be haggled down to a commodity price for work that, when it finally fails, will be blamed on you anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How much should I charge for website maintenance?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Price the risk you absorb, not the hours you expect to spend. A brochure site and an e-commerce store are different products even on identical software. Build tiers around what you take responsibility for — availability, leads, orders, security — because hours invite the client to audit your time instead of valuing the outcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should be included in a care plan?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Table stakes: backups with tested restores, updates, security, uptime. What makes it defensible: business-path monitoring — forms still delivering leads, stores still taking orders — plus a monthly report the client can actually read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I justify the retainer in a month when nothing broke?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Report prevention, not activity. A quiet month is a result — but only if you can show what you were holding up: the certificate renewed before it expired, the vulnerable plugins patched, the form verified as still delivering. Without that record, a quiet month looks like a month of nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should hosting and maintenance be bundled?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They can be, and it raises perceived value — but keep the responsibilities distinct. Hosting is infrastructure you resell; maintenance is a promise you keep. When the host has an outage, the client calls you anyway — which argues for monitoring you control rather than the host's own status page.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/how-much-to-charge-website-maintenance.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/how-much-to-charge-website-maintenance.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>webdev</category>
      <category>business</category>
    </item>
    <item>
      <title>ManageWP alternative — what to use when the dashboard says "connected" and it isn't</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:26:35 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/managewp-alternative-what-to-use-when-the-dashboard-says-connected-and-it-isnt-1dd4</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/managewp-alternative-what-to-use-when-the-dashboard-says-connected-and-it-isnt-1dd4</guid>
      <description>&lt;p&gt;Most "alternative" pages are written by people who never used the product they are attacking. So let's do this differently: no adjectives, just what agencies are publicly saying, why those specific failures happen, and an honest account of what we do and do not replace. Spoiler for the impatient: &lt;strong&gt;we are not a drop-in replacement for ManageWP&lt;/strong&gt;, and if a competitor tells you they are, ask them where their backups live.&lt;/p&gt;

&lt;h2&gt;
  
  
  What people actually complain about
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Sites disconnect, and the dashboard keeps showing green
&lt;/h3&gt;

&lt;p&gt;This is the complaint, not one of several. It appears again and again in public reviews:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Sites are always disconnected. Can't rely on it. Be carefull. You think everything is all right but in fact your sites are disconnected so not responding."WordPress.org review, 1★&lt;/p&gt;

&lt;p&gt;"I am having a recurring issue where some of my sites keep getting disconnected, and when I check the managewp plugin is disabled… it is not a user disabling the plugin, I am 100% sure."WordPress.org support forum&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An agency with over a hundred sites reports the same thing, and the thread has been alive for years — long enough that people are writing cron jobs to reactivate the plugin behind the platform's back.&lt;/p&gt;

&lt;p&gt;Notice what the first quote actually describes. The problem is not that a site disconnected. The problem is that &lt;strong&gt;you believed you were covered and you were not&lt;/strong&gt;. A monitoring tool that fails silently is worse than no monitoring, because it also sells you confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Client reports work "randomly"
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Support tickets takes 3-4 days before getting answers… Generating pdf reports to customers is randomly working."WordPress.org review, 1★ — agency with 100+ sites, 6-year customer&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read that phrase again: &lt;em&gt;randomly working&lt;/em&gt;. Client reporting is the thing agencies buy these platforms for — it is the artefact that justifies the retainer. If it works four months out of five, you cannot build a service promise on it.&lt;/p&gt;

&lt;p&gt;This is worth stating clearly because it corrected our own assumptions. We used to think the industry complaint about reports was "too long, clients don't read them". It isn't. The complaint is that &lt;strong&gt;reports break&lt;/strong&gt;: PDFs that arrive damaged, reports with empty data, reports that stop sending. Length is a design preference. A report that doesn't arrive is a broken promise to your client.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Support that answers in days — or never
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"I had 1 site that wouldn't connect and i waited over 18 months for support to reply, then had to give up… I have several tickets in this state, waiting on a reply for over 1 year."WordPress.org support forum&lt;/p&gt;

&lt;p&gt;"Support has been ghosting me for over a month. I've been a ManageWP customer for years. We have a lot of clients on their paid services."WordPress.org review, 1★&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We are a small team, so we are not going to make grand claims about support SLAs we haven't proven. But we will say the obvious: when a platform's own users are writing workarounds because the vendor said the bug affects "only a small number of people", the product has stopped being maintained in any meaningful sense.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Updates that break the site you were protecting
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"The update was apparently successful but when I tried accessing my site directly after that, I encountered a code 500 error… it appears it corrupted all my installed plugins, so hereon, I don't trust it."WordPress.org review, 2★&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This one deserves a design comment rather than a jab. A tool that can push changes into a client's site can also break it. That risk is inherent to remote management, and it is exactly why our architecture refuses to take it: &lt;strong&gt;we never execute anything on a client's server.&lt;/strong&gt; The plugin collects diagnostics and sends them out; we have no channel to run code, update plugins or touch files. It is not a missing feature — it is a boundary we designed in, so that the worst thing our tool can do to your client's site is nothing at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an alternative actually has to get right
&lt;/h2&gt;

&lt;p&gt;Strip away the feature lists and the complaints reduce to three requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoring that doesn't depend on a plugin staying alive
&lt;/h3&gt;

&lt;p&gt;If your monitoring lives inside a plugin on the client's site, then a deactivated plugin, a broken update or a dead host takes your monitoring with it — precisely when you need it. External probing has no such failure mode: the prober sits outside, and a site that stops answering &lt;em&gt;is&lt;/em&gt; the signal.&lt;/p&gt;

&lt;p&gt;Our WordPress plugin exists too, but it does the opposite job: it sees what external checks cannot — &lt;a href="https://pingvera.com/blog/wordpress-health-monitoring-inside.html" rel="noopener noreferrer"&gt;a stalled WP-Cron, modified core files, vulnerable plugins&lt;/a&gt;. If it goes silent, the external layer is still watching. Two layers, and the failure of one does not blind the other.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alerts you can believe
&lt;/h3&gt;

&lt;p&gt;An alert nobody trusts is not a cheaper product, it is a broken one. We confirm from several regions before opening an incident — &lt;a href="https://pingvera.com/blog/uptime-monitor-false-alerts-debounce-paywall.html" rel="noopener noreferrer"&gt;one probe having a bad ten seconds is not an outage&lt;/a&gt; — and noise suppression is on for every plan, including the free one, rather than sold as an upgrade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reports that always send, and always have data
&lt;/h3&gt;

&lt;p&gt;We took the "randomly working" complaint literally when we rebuilt reporting. When you create a client report, the data is &lt;strong&gt;frozen into an immutable snapshot&lt;/strong&gt; at that moment. The link the client opens next month renders from that snapshot, not from a live recalculation — so the numbers cannot drift, and a report cannot arrive empty because something upstream hiccupped. Delivery has retries and a visible history: you can see whether it sent, failed, or is still queued, instead of finding out from the client that nothing arrived.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part: what we do not replace
&lt;/h2&gt;

&lt;p&gt;ManageWP is a management platform. We are not.&lt;/p&gt;

&lt;p&gt;So the honest recommendation is not "switch". It is: &lt;strong&gt;keep a maintenance platform for backups and updates, and move monitoring and client reporting to a stack that is not the same tool.&lt;/strong&gt; One tool changes the system; the other verifies the result from outside. When they are the same tool, nobody is checking the checker — which is exactly how you end up with a dashboard confidently showing green over a site that has been disconnected for a week.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're evaluating right now
&lt;/h2&gt;

&lt;p&gt;Three questions worth asking any candidate, ManageWP included:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;If the plugin on my client's site dies, does your monitoring die with it?&lt;/strong&gt; If yes, your monitoring is only as reliable as the least reliable site you manage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How many locations confirm an outage before you alert me?&lt;/strong&gt; If the answer is one, budget for false alarms — and for the day your team stops reading them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What does a client report do when the data pipeline fails?&lt;/strong&gt; Arrives empty, doesn't arrive, or refuses to be created? Only the third answer is safe.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is Pingvera a drop-in replacement for ManageWP?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. ManageWP does backups, bulk updates and site management; we do not — we monitor. If you rely on it for backups and one-click updates, you need those from somewhere. What we replace is the part that keeps failing: trustworthy monitoring and client reports that actually arrive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do ManageWP sites keep disconnecting?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Users report the worker plugin deactivating itself or losing connection while the dashboard keeps showing the site as fine. The forum thread has been running for years, with agencies writing cron workarounds. The dangerous part is not the disconnection — it is the dashboard showing green while blind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should an agency look for in an alternative?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Monitoring that survives independently of a plugin on the client's site; multi-region confirmation so a single blip doesn't page you; and client reports that always send with data in them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I run both?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's what we'd recommend. Keep the management platform for backups and updates; put monitoring and reporting on a separate stack. One tool changes the system, the other verifies it from outside.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/managewp-alternative.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/managewp-alternative.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>agency</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Elementor form not sending email — what the docs admit, and what nobody checks</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:25:51 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/elementor-form-not-sending-email-what-the-docs-admit-and-what-nobody-checks-3h2k</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/elementor-form-not-sending-email-what-the-docs-admit-and-what-nobody-checks-3h2k</guid>
      <description>&lt;p&gt;Elementor's own help pages are unusually honest about this, and the honesty is the whole answer. Two sentences from their troubleshooting docs explain most missing-email cases before you touch a single setting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Straight from the documentation
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Elementor uses WordPress' &lt;code&gt;wp_mail&lt;/code&gt; function to send emails. Your web host takes the sent email, processes it, and sends it."&lt;/p&gt;

&lt;p&gt;"The &lt;code&gt;wp_mail&lt;/code&gt; function uses the PHP send_mail function by default. But &lt;strong&gt;if it is disabled on that server, then email won't send&lt;/strong&gt;."elementor.com — Server errors&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And, on why hosts disable it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Web hosting servers can deactivate the PHP function responsible for email transmission… a precautionary measure meant to prevent the misuse of the server for spamming purposes."elementor.com&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So: the form hands the email to WordPress, WordPress hands it to the host, and the host may have quietly closed that door on purpose. Nothing in the front end will tell you. The visitor sees the success message; the widget has done everything it can do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Elementor-specific causes, in order of frequency
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. There is no Email action
&lt;/h3&gt;

&lt;p&gt;The most embarrassing and the most common. Elementor forms only send mail if you added the &lt;strong&gt;Email&lt;/strong&gt; action under &lt;em&gt;Actions After Submit&lt;/em&gt;. Forget it, or lose it while duplicating a template, and the form works perfectly — collects the submission, shows a success message — and emails nobody. Everything looks right except the part you cannot see.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The From address is not your domain
&lt;/h3&gt;

&lt;p&gt;Elementor's docs are direct about this: set the form's From address to the same domain as your website, and put the visitor's address in &lt;strong&gt;Reply-To&lt;/strong&gt;. If your site is example.com and your From is the visitor's gmail.com address, you are asking a mail server to accept a message claiming to be from a domain you do not own, sent from an IP you do not own. Modern receivers call that spoofing and treat it accordingly.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. It went to spam
&lt;/h3&gt;

&lt;p&gt;Elementor's own documentation flags this, including the reason:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"These emails may end up in the spam folder, especially now that providers like Gmail are increasingly strict about email reputation and authentication."elementor.com&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unauthenticated mail from a shared hosting IP is a worse and worse bet every year. Every log will say the mail was sent. It was. It is in Junk.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The email arrives — and it's empty
&lt;/h3&gt;

&lt;p&gt;A peculiar one, and worth knowing: if a form field has no &lt;strong&gt;ID&lt;/strong&gt;, its value will not appear in the email when the &lt;code&gt;[all-fields]&lt;/code&gt; shortcode is used. So you receive a notification with the fields you actually needed missing. The form works, the email works, the lead is unusable.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. A plugin or theme conflict after an update
&lt;/h3&gt;

&lt;p&gt;Elementor's troubleshooting suggests exactly what you would expect — disable everything except Elementor and Elementor Pro, switch to a default theme — which tells you how often an update to something unrelated takes the form's submit handler down with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one thing Elementor does better than its rivals
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Submissions are stored by default.&lt;/strong&gt; The Collect Submissions action is on out of the box, entries go into the database, and you can view them under Elementor → Submissions and export to CSV.&lt;/p&gt;

&lt;p&gt;That is a genuinely better default than Contact Form 7 (which stores nothing, and whose docs warn you may "lose important messages forever") or WPForms Lite (which does not store entries without a paid license). If mail breaks on an Elementor site, the lead is still recorded.&lt;/p&gt;

&lt;p&gt;But notice what it does and does not solve. The lead is &lt;em&gt;preserved&lt;/em&gt;. Nobody is &lt;em&gt;notified&lt;/em&gt;. Your client is still not calling that customer back, because nothing told them there was a customer to call. A lead sitting unread in a dashboard for three weeks is, commercially, a lost lead with better bookkeeping.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Send through a real mail service&lt;/strong&gt; — an SMTP plugin or Elementor's own sending product — with SPF, DKIM and DMARC aligned to your domain. This is the fix for most cases, because it stops the message being anonymous mail from a shared IP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From = your domain. Visitor = Reply-To.&lt;/strong&gt; Non-negotiable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm the Email action exists&lt;/strong&gt; in Actions After Submit — and that the recipient address is right.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give every field an ID&lt;/strong&gt;, so &lt;code&gt;[all-fields]&lt;/code&gt; renders the whole lead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check Submissions&lt;/strong&gt; to separate the two questions: if entries are landing there, the form is fine and only the mail is broken. That is a genuinely useful diagnostic.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  And then, next month, it breaks again
&lt;/h2&gt;

&lt;p&gt;Every fix on that list is a point-in-time repair. The chain has many links — plugin, WordPress, SMTP credentials, DNS records, the host's outbound policy, the recipient's spam filter — and each of them can change without anyone touching your site. An SMTP plugin update. A rotated API key. A stricter policy at the client's mail provider. A DNS change that breaks DKIM alignment.&lt;/p&gt;

&lt;p&gt;When it breaks, the form will keep showing the success message. Submissions will keep filling up. And the first person to notice will be your client, weeks later, asking why nobody replied to their enquiry — the worst possible way for this to surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually verifies delivery
&lt;/h2&gt;

&lt;p&gt;Not a log entry. A "delivered" status from a sending service only means that service handed the message to the recipient's mail server; it says nothing about inbox versus junk. The only proof that a lead reaches a human is to &lt;strong&gt;send one and then find it in the mailbox&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is what our form check does: on a schedule it submits a synthetic lead through the real form, with a unique marker in the body, then looks for that marker in a monitored inbox over IMAP. Arrives → the whole chain works, plugin to spam filter. Doesn't arrive → you get an alert, while the client is still blissfully unaware there was anything to know.&lt;/p&gt;

&lt;p&gt;It is the least clever monitoring we do. It is also the only kind that could have caught any of the failures in this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why is my Elementor form not sending email?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Elementor's docs state it uses WordPress's &lt;code&gt;wp_mail&lt;/code&gt; function, which uses PHP's mail function by default — and if the host disabled it, email will not send. Other causes: no Email action added under Actions After Submit, a From address outside your domain, or the message being filtered into spam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does the email arrive empty?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usually a form field without an ID. Elementor's docs warn that without a valid ID, the field value will not appear in the email when &lt;code&gt;[all-fields]&lt;/code&gt; is used — so the notification arrives with the important fields missing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Elementor store submissions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes — Collect Submissions is enabled by default, entries go to the database and can be exported to CSV. That means a failed email doesn't lose the lead. It does mean nobody gets notified about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does a "delivered" status prove the client got the lead?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. It means the sending service handed the message to the recipient's mail server. It says nothing about inbox versus junk. The only certainty is submitting a test lead and verifying it appears in the real mailbox.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/elementor-form-not-sending-email.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/elementor-form-not-sending-email.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>php</category>
    </item>
    <item>
      <title>WPForms not sending email notifications — three ways leads vanish quietly</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:24:58 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/wpforms-not-sending-email-notifications-three-ways-leads-vanish-quietly-4dhh</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/wpforms-not-sending-email-notifications-three-ways-leads-vanish-quietly-4dhh</guid>
      <description>&lt;p&gt;WPForms is a good plugin, and most "not sending email" advice for it is the same generic SMTP checklist you have already read. So let's skip that and start with the three failures that are specific to WPForms, all of which share one property: &lt;strong&gt;the visitor sees a success message, and you receive nothing.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure 1: the entry was marked as spam — so no email is sent
&lt;/h2&gt;

&lt;p&gt;This is the one that surprises people, and it is documented behaviour. From WPForms' own documentation on spam entries:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"After enabling this option, the form will allow all submissions (including spam entries) instead of blocking them. However, &lt;strong&gt;form notification emails won't be delivered if an entry is identified as spam&lt;/strong&gt;."wpforms.com — Viewing and Managing Spam Entries&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read the consequence carefully. A real customer fills in your client's form. Akismet or the built-in anti-spam decides, on some heuristic, that they are a bot. The customer sees &lt;em&gt;"Thanks for contacting us!"&lt;/em&gt; and goes about their day, satisfied. The entry lands in a Spam folder inside WordPress. &lt;strong&gt;No notification is sent to anyone.&lt;/strong&gt; Nobody knows this happened unless someone thinks to open the spam tab.&lt;/p&gt;

&lt;p&gt;Marking the entry "Not Spam" afterwards does send the notification — retroactively, once you have found it. Which requires knowing to look.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure 2: background sending, and a queue that stopped
&lt;/h2&gt;

&lt;p&gt;WPForms has an option called &lt;strong&gt;Optimize Email Sending&lt;/strong&gt;. Instead of sending during the submission request, it queues the notification through Action Scheduler and sends it in the background. Faster form, better user experience — with a dependency most people never think about: &lt;strong&gt;WP-Cron&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;WordPress's scheduler is not a real cron. It fires when someone visits the site. On a low-traffic client site — exactly the kind of site whose owner is anxious about enquiries — the queue can sit for a long time. If Action Scheduler is unhealthy or WP-Cron is disabled without a real cron replacement, queued notifications may never go out at all.&lt;/p&gt;

&lt;p&gt;The form still says "success", because from the form's point of view it did its job: it put the email in a queue. WPForms' own troubleshooting docs suggest turning this option off while diagnosing missing notifications — which tells you how often it is the culprit. And it is a good reminder that &lt;a href="https://pingvera.com/blog/wordpress-health-monitoring-inside.html" rel="noopener noreferrer"&gt;a stalled WP-Cron breaks far more than plugin updates&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure 3: on Lite, the lead does not exist anywhere else
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"WPForms does not store entries without a paid license, but you can back them up remotely using Lite Connect… Since WPForms Lite doesn't save entries to your WordPress database, Lite Connect gives you a place to store them safely off your site."wpforms.com — Lite Connect&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On Lite, the email &lt;em&gt;is&lt;/em&gt; the delivery mechanism. There is no database copy to fall back on. If the notification fails for any of the reasons above, the enquiry is gone — no entry, no record, no way to know it ever happened. (Lite Connect keeps an off-site backup, but restoring it into your dashboard requires upgrading.)&lt;/p&gt;

&lt;p&gt;This matters for agencies: a client on Lite who says "we've had no enquiries for a month" may have had thirty, all of which evaporated.&lt;/p&gt;

&lt;h2&gt;
  
  
  The usual suspects, briefly
&lt;/h2&gt;

&lt;p&gt;These apply to every WordPress form plugin, WPForms included, and they are well covered elsewhere — so, briefly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No SMTP.&lt;/strong&gt; WPForms sends via &lt;code&gt;wp_mail()&lt;/code&gt;, which by default hands off to PHP &lt;code&gt;mail()&lt;/code&gt; on your host. Unauthenticated, unaligned with SPF or DKIM, from a shared IP. Modern mail providers filter or drop that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From address outside your domain.&lt;/strong&gt; WPForms' docs ask for a domain-specific From address. The visitor's address goes in Reply-To, never From.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host blocks or throttles &lt;code&gt;mail()&lt;/code&gt;.&lt;/strong&gt; Common, and deliberate — hosts do it to stop compromised sites spamming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notification switched off or gated by conditional logic.&lt;/strong&gt; Check the notification is Active and the conditions actually match.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It arrived in the spam folder&lt;/strong&gt; of the recipient. Every log says "sent". The client says "nothing".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why "the SMTP log says Sent" is not an answer
&lt;/h2&gt;

&lt;p&gt;People reach for an email log and feel safe. Here is what a log actually certifies, in WP Mail SMTP's own words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sent&lt;/strong&gt; — "The email was sent successfully. &lt;strong&gt;This status does not tell you whether the email was delivered.&lt;/strong&gt;"wpmailsmtp.com — How to View Email Logs&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is a &lt;strong&gt;Confirmed&lt;/strong&gt; status, but it only exists for mailers with delivery webhooks, and even then it means the provider handed the message to the recipient's mail server. It does not mean the message is in the inbox rather than the junk folder, and it certainly does not mean a human saw it.&lt;/p&gt;

&lt;p&gt;So the honest hierarchy of what each tool proves:&lt;/p&gt;

&lt;h2&gt;
  
  
  The only check that closes the loop
&lt;/h2&gt;

&lt;p&gt;There is exactly one way to know that a lead reaches a human: &lt;strong&gt;send one, and then look in the mailbox for it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is what our form monitoring does. On a schedule it submits a synthetic lead through the real form, with a unique marker in the body, and then searches a monitored mailbox over IMAP for that marker. If it turns up, the entire chain is proven end to end — the plugin, the anti-spam rules, &lt;code&gt;wp_mail()&lt;/code&gt;, SMTP authentication, the recipient's filters. If it doesn't turn up in the expected window, you get an alert.&lt;/p&gt;

&lt;p&gt;It is not a clever check. It is the check a careful person would run by hand, if a careful person were willing to do it every hour and never forget. The reason it matters is that &lt;strong&gt;none of the other signals in this article can catch a spam-flagged entry, a stalled queue, or a message quietly filed into Junk&lt;/strong&gt; — and those are exactly the failures that cost your client a month of enquiries before anyone notices.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why does WPForms show success but send no notification?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three WPForms-specific reasons: the entry was flagged as spam (documentation states notification emails are not delivered for spam entries, while the visitor still sees success); background sending queued the email and the queue stalled; or the mail was sent unauthenticated and dropped by the receiving server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does WPForms Lite store entries?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No — entries are not stored without a paid license. Lite Connect backs them up remotely, but restoring into the dashboard requires upgrading. On Lite, a failed email means the lead is gone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Optimize Email Sending?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It queues notifications through Action Scheduler instead of sending during the request. If WP-Cron or Action Scheduler is unhealthy — common on low-traffic sites — queued emails can be badly delayed or never sent, while the form reports success.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does an SMTP log prove the lead arrived?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. WP Mail SMTP's docs state the Sent status "does not tell you whether the email was delivered". Confirmed exists only for mailers with webhooks, and means handoff to the recipient's server — not inbox versus junk.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/wpforms-not-sending-email.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/wpforms-not-sending-email.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>php</category>
    </item>
    <item>
      <title>WooCommerce failed orders — what a spike, a stall and a silence each mean</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:24:05 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/woocommerce-failed-orders-what-a-spike-a-stall-and-a-silence-each-mean-49cg</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/woocommerce-failed-orders-what-a-spike-a-stall-and-a-silence-each-mean-49cg</guid>
      <description>&lt;p&gt;A client emails: "we've got hundreds of failed orders, is the payment gateway broken?" The gateway is almost certainly fine. What is happening is worse, it is documented by WooCommerce itself, and the damage will outlast the attack by months. Let's read the three patterns properly — because each one means something completely different, and two of them are invisible in the reports your client actually looks at.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, what "failed" actually means
&lt;/h2&gt;

&lt;p&gt;WooCommerce is precise about this, and the distinction matters for everything below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pending payment&lt;/strong&gt; — "The order has been received, but no payment has been made." The customer hasn't paid yet; often they are mid-flow, or wandered off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failed&lt;/strong&gt; — "The customer's payment failed or was declined, and no payment has been successfully made." A payment was &lt;em&gt;attempted&lt;/em&gt; and rejected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So a failed order requires someone to have reached the payment step and been turned down. That single fact is what lets you diagnose all three patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 1: a spike of failed orders — you're being used to test stolen cards
&lt;/h2&gt;

&lt;p&gt;WooCommerce has an entire document about this, which tells you how common it is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Card testing is a type of fraud where the someone obtains a large amount of stolen credit card data, and then attempts to determine which of those cards are valid… multiple low-value purchases, each with a different card, to avoid detection."&lt;/p&gt;

&lt;p&gt;The sign to watch for: "&lt;strong&gt;a large increase in the number of orders being assigned the Failed status&lt;/strong&gt;" — hundreds or thousands within a short timeframe.woocommerce.com — preventing and responding to card testing attacks&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your client's checkout is being used as a validation service for a batch of stolen cards. The bots don't want the product. They want to know which numbers still work, so they can be sold or spent elsewhere. WooCommerce's own developer blog notes the attacks now hit the Store API checkout endpoint directly, rotating through IPs — "100 checkouts/minute, all from different IPs".&lt;/p&gt;

&lt;h3&gt;
  
  
  "But nothing was actually charged, so what's the harm?"
&lt;/h3&gt;

&lt;p&gt;This is where store owners — and, honestly, a lot of agencies — get it wrong. The failed payments are not the damage. They are the exhaust.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your decline rate is now poisoned — permanently.&lt;/strong&gt; Stripe's documentation states that an elevated decline rate &lt;em&gt;persists after the attack ends&lt;/em&gt;: card issuers have learned to distrust this merchant. Meaning your client's real customers start getting declined, weeks later, for no reason they will ever understand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some cards work.&lt;/strong&gt; Those become real charges to real victims, who file chargebacks. Disputes cost fees and count against you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fees may not come back.&lt;/strong&gt; WooCommerce's own guidance notes the payment provider "still may not refund the transactions fees for those transactions" even after you refund the fraudulent payments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PayPal can simply switch you off.&lt;/strong&gt; Their Payflow carding-prevention module monitors for high declines and, when thresholds are hit, &lt;strong&gt;blocks the account and declines all transactions&lt;/strong&gt; until it is manually unblocked. And PayPal states plainly that merchants "are responsible for any transactional fees imposed by PayPal or their bank that result from carding attacks".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Card-network monitoring programs.&lt;/strong&gt; Sustained dispute and fraud ratios pull merchants into Visa and Mastercard monitoring programs, where fines run into five and six figures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your domain's email reputation takes friendly fire.&lt;/strong&gt; WooCommerce sends a failed-order notification to the "customer" too. Those are stolen identities and junk addresses — so your client's mail server sprays hundreds of undeliverable notifications, and the bounce rate does what bounce rates do to sender reputation. The same domain that also sends order confirmations to real buyers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the answer to "nothing was charged, what's the harm" is: your client's ability to accept money in the future has just been degraded, and they will feel it long after the failed orders stop appearing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The part that makes this genuinely dangerous
&lt;/h3&gt;

&lt;p&gt;Here is the fact that turns an incident into a catastrophe. From WooCommerce's Analytics documentation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Pending payment, Cancelled and Failed order statuses are &lt;strong&gt;excluded&lt;/strong&gt; [from Analytics] while Processing, On hold, and Completed order statuses are included."woocommerce.com — WooCommerce Analytics&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read that again with the attack in mind. Hundreds of failed orders are pouring in — &lt;strong&gt;and the store's revenue reports show nothing at all&lt;/strong&gt;. The one screen the owner checks is, by design, blind to exactly this event. The only native signal is a flood of individual "failed order" emails, one per attempt, which is precisely the kind of noise a busy person mutes or filters into a folder.&lt;/p&gt;

&lt;p&gt;And the built-in defence is off. WooCommerce's Store API rate limiting is &lt;strong&gt;disabled by default&lt;/strong&gt;; a strict limit on the place-order endpoint only arrived in version 9.6 and must be turned on by hand. Their own blog admits IP-based limiting isn't enough against rotating IPs anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 2: a rise in &lt;em&gt;pending&lt;/em&gt; — the gateway can't talk back
&lt;/h2&gt;

&lt;p&gt;A different shape entirely: orders pile up in &lt;strong&gt;pending payment&lt;/strong&gt; rather than failed. That is not a decline problem, because declines produce failures. It means the loop between the payment provider and the site is broken — most commonly an undelivered webhook. The customer paid; the provider took the money; the site never heard back.&lt;/p&gt;

&lt;p&gt;This one has teeth because of a default nobody remembers: &lt;strong&gt;Hold stock&lt;/strong&gt;, 60 minutes out of the box. A pending order that isn't confirmed within that window is automatically &lt;strong&gt;cancelled&lt;/strong&gt; and its stock released. So the sequence is: customer pays → webhook never lands → order sits pending → an hour later WooCommerce quietly cancels it. The money is at the payment provider. The order is gone from the store. Nobody is looking for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 3: silence — the pattern everyone misreads
&lt;/h2&gt;

&lt;p&gt;Zero failed orders. Zero orders. A calm, clean order list.&lt;/p&gt;

&lt;p&gt;Owners read this as "quiet week". It is often the most expensive state of the three, and here is the logic that proves it: &lt;strong&gt;an order cannot become failed if the customer never reaches the payment step.&lt;/strong&gt; No orders and no failures means nobody is even getting as far as paying. The likely causes are the ones WooCommerce lists in its own troubleshooting: a plugin or theme update that broke the checkout, expired API keys, a payment method that got switched off, a gateway left in test mode.&lt;/p&gt;

&lt;p&gt;And the cruel part: because there are no orders, there are no order emails either. The absence of bad news looks exactly like a peaceful day. There is &lt;strong&gt;no native mechanism in WooCommerce that tells you "no orders for three days, and you usually get twelve"&lt;/strong&gt; — the system only reports things that happen. A thing that stops happening is not an event.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the patterns
&lt;/h2&gt;

&lt;p&gt;Notice the column on the right. Every failure mode in this table is invisible in the report your client trusts. Only the last row shows up — the one where nothing is wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What monitoring this actually looks like
&lt;/h2&gt;

&lt;p&gt;You do not need machine learning. You need two numbers, compared against the store's own history — and this is exactly what our WooCommerce checks do from inside the store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Failed-order share against the store's own baseline.&lt;/strong&gt; Not an absolute threshold — a store with cash-on-delivery or aggressive fraud rules lives with a steady failure rate, and alerting on that would be noise. We compare the last 24 hours against the same store's seven-day norm, with a floor of three failures so that statistics mean something. Three times the usual rate → critical. That fires on a card-testing attack within the hour, long before anyone opens the order list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Order drought against the store's own baseline.&lt;/strong&gt; Zero orders in 24 hours is only a signal if this store normally sells: we require an average of at least three orders a day over the previous fortnight before we say a word. A store doing two orders a week never gets woken up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus the checks that catch the cause rather than the symptom: is a live payment gateway sitting in test mode, does the checkout page still render, and a &lt;a href="https://pingvera.com/blog/woocommerce-checkout-monitoring.html" rel="noopener noreferrer"&gt;daily smoke run of the order pipeline&lt;/a&gt; that proves an order can still be created at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable summary
&lt;/h2&gt;

&lt;p&gt;WooCommerce will happily email your client three hundred times while bots grind stolen cards through their checkout, and show a perfectly clean revenue dashboard the whole time. It will let a paid order be silently cancelled because a webhook didn't land. And it will never, ever tell anyone that the orders stopped.&lt;/p&gt;

&lt;p&gt;None of that is a bug — the platform reports events, and these are non-events, absences, and statuses it deliberately excludes from reports. But if you are the agency whose client's decline rate is now permanently worse, "it wasn't technically a bug" is not a conversation you want to be having.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why does my store suddenly have hundreds of failed orders?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Almost always card testing. WooCommerce documents it: attackers with stolen card data use a store's checkout to find which cards still work, making many low-value attempts. Their stated tell is "a large increase in the number of orders being assigned the Failed status" — hundreds or thousands in a short timeframe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it harmful if all the payments failed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, and the damage outlives the attack. Stripe states the elevated decline rate persists afterwards — your real customers start getting declined. Some cards work and become chargebacks. Fees on fraudulent payments may not be refunded. PayPal's Payflow carding module can block the account entirely. And card-network monitoring programs carry fines into six figures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does WooCommerce Analytics show failed orders?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No — Pending payment, Cancelled and Failed are excluded by default. A card-testing attack producing hundreds of failed orders is invisible in the revenue reports the owner actually reads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does it mean when orders drop to zero?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usually a dead checkout. An order can't be marked failed if nobody reaches payment — so no orders and no failures means something broke earlier. And with no orders, there are no emails either: silence looks exactly like a quiet week.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/woocommerce-failed-orders.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/woocommerce-failed-orders.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>woocommerce</category>
      <category>ecommerce</category>
      <category>wordpress</category>
      <category>security</category>
    </item>
    <item>
      <title>WP Umbrella alternative — when what you needed was monitoring, not maintenance</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:22:23 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/wp-umbrella-alternative-when-what-you-needed-was-monitoring-not-maintenance-2i1i</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/wp-umbrella-alternative-when-what-you-needed-was-monitoring-not-maintenance-2i1i</guid>
      <description>&lt;p&gt;Let's start where most competitor pages won't: &lt;strong&gt;WP Umbrella is a good product, and its users mostly like it.&lt;/strong&gt; We went looking for a pile of angry reviews to quote and didn't find one — the ratings are high, people praise the interface and the support. So this page is not going to pretend otherwise. What we will do is answer the question people are actually typing into Google: &lt;em&gt;if I'm looking for an alternative, what am I missing?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The one complaint its users really do make
&lt;/h2&gt;

&lt;p&gt;There is a recurring theme in the negative reviews, and it isn't about quality:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Today I check my site and notice the plugin's main screen showing a banner that says Your trial is over. Go Premium. Basically the free version is useless… The plugin description mentions all these great features little you know that those are all paid features."WordPress.org review, 3★&lt;/p&gt;

&lt;p&gt;"It's only a 14-day trial, and after that, you pay high monthly fees… And it's only a demo, it's not free at all."WordPress.org review, 1★&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is no free tier. You get 14 days, then the features stop. For a freelancer with three client sites, or an agency wanting to try monitoring on a couple of projects before committing the whole portfolio, that is a real wall.&lt;/p&gt;

&lt;p&gt;Our answer is boring and specific: &lt;strong&gt;free for up to 5 sites&lt;/strong&gt;, permanently, with one-minute checks — not a trial, not a demo, not a countdown banner. We would rather you run five sites on us for a year and never pay than have you discover on day 15 that the thing you built a workflow around has switched itself off.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deeper difference: what each tool is for
&lt;/h2&gt;

&lt;p&gt;WP Umbrella is a &lt;strong&gt;WordPress maintenance platform&lt;/strong&gt;. Its centre of gravity is: keep the CMS updated, backed up, patched, and produce a report about that work.&lt;/p&gt;

&lt;p&gt;We are a &lt;strong&gt;monitoring service&lt;/strong&gt;. Our centre of gravity is: does the site still work — not as a CMS, but as a business — and will you know before the client does?&lt;/p&gt;

&lt;p&gt;That distinction sounds abstract until you look at what breaks in the real world. Here is a review of a similar management tool, from an agency owner:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"one of my site's clients was wondering why he was getting no response to a recent sale he announced on his site — and when he went to go check, he realized &lt;strong&gt;his store was gone completely!&lt;/strong&gt; That's because the WooCommerce plugin had been deactivated somehow."WordPress.org review of a WordPress management tool, 2★&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The site was up the entire time. Every uptime check would have passed. The maintenance platform had done its job — plugins updated, backups taken — and the store was silently dead. &lt;strong&gt;This is the gap.&lt;/strong&gt; It is not a bug in anyone's product; it is a category boundary. Maintenance tools watch the platform. Nobody was watching the money.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we monitor that a maintenance platform doesn't
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Form delivery, end to end.&lt;/strong&gt; Not "did the form page load", but: we submit a test lead with a unique marker and then &lt;a href="https://pingvera.com/blog/website-forms-not-working.html" rel="noopener noreferrer"&gt;find it in the mailbox&lt;/a&gt;. A form that silently stopped delivering is the most expensive failure a brochure site has, and it returns 200 the whole time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WooCommerce orders, from inside.&lt;/strong&gt; &lt;a href="https://pingvera.com/blog/woocommerce-checkout-monitoring.html" rel="noopener noreferrer"&gt;Order flow against the store's own baseline, failed-order spikes, a live gateway left in sandbox mode, a daily smoke run of the order pipeline.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Availability from several regions, with quorum.&lt;/strong&gt; One probe having a bad ten seconds is not an outage — &lt;a href="https://pingvera.com/blog/uptime-monitor-false-alerts-debounce-paywall.html" rel="noopener noreferrer"&gt;and a monitor that pages you for it will be muted within a month&lt;/a&gt;. Confirmation and noise suppression are on for every plan, free included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WordPress health from inside.&lt;/strong&gt; &lt;a href="https://pingvera.com/blog/wordpress-health-monitoring-inside.html" rel="noopener noreferrer"&gt;Stalled WP-Cron, modified core files, mail going out through PHP-mail, autoload bloat, fresh PHP fatals.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain and SSL expiry, broken links, accidental noindex, suspicious redirects.&lt;/strong&gt; The self-inflicted outages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we don't do — and won't
&lt;/h2&gt;

&lt;p&gt;If you switch to us expecting a maintenance platform, you will be disappointed, so let's be blunt about the shape of the hole:&lt;/p&gt;

&lt;p&gt;The "by design" on updates deserves a sentence. We never execute anything on a client's server — no remote updates, no remote exec, no self-updating agent. The agent sends data out and that is the only direction traffic flows. It costs us a feature list; it buys the client a guarantee that the worst our tool can do to their site is nothing at all. After reading enough reviews that begin "the update was apparently successful but then the site returned a 500", we think that is the right trade.&lt;/p&gt;

&lt;h2&gt;
  
  
  So: alternative, or addition?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Replace WP Umbrella with us&lt;/strong&gt; if your portfolio isn't WordPress-only; if what you actually need is monitoring and client reporting rather than update automation; if you want to start free rather than start a countdown; or if your clients' revenue depends on forms and checkouts that nobody is currently watching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run both&lt;/strong&gt; if you're a WordPress agency that genuinely needs backups and safe updates. WP Umbrella performs the maintenance; we verify from outside that the site, its forms and its checkout still work &lt;em&gt;after&lt;/em&gt; that maintenance. That is not redundancy. One tool changes the system, the other checks the result — and the day an update quietly deactivates WooCommerce, the second one is what saves the client relationship.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does WP Umbrella have a free plan?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No — a 14-day trial, after which the plugin's features stop working. It's the single most common complaint in its negative reviews: users install from the WordPress directory expecting a free tier and find a trial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Pingvera a replacement for WP Umbrella?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not a full one. WP Umbrella does backups, safe updates and vulnerability management; we do none of those and never will — our agent never executes anything on a client's server. We replace the monitoring and client-reporting half, and go deeper there: multi-region availability, form delivery, WooCommerce orders, WordPress health from inside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does WP Umbrella not monitor?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The business-critical paths: whether a form still delivers leads, whether a store still accepts orders, whether a payment gateway is stuck in test mode. It watches WordPress the platform, not the site as a business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use both?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, and for a WordPress-only agency that's the strongest setup: WP Umbrella maintains, an independent monitoring layer verifies from outside that everything still works after the maintenance.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/wp-umbrella-alternative.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/wp-umbrella-alternative.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>monitoring</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Contact Form 7 not sending email — the green checkmark that means nothing</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:21:29 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/contact-form-7-not-sending-email-the-green-checkmark-that-means-nothing-4k5</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/contact-form-7-not-sending-email-the-green-checkmark-that-means-nothing-4k5</guid>
      <description>&lt;p&gt;The form submits. The green message appears. The email never arrives. Before you start disabling plugins, understand what that green message actually certifies — because the answer explains the entire problem, and it comes from CF7's own documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the green border actually means
&lt;/h2&gt;

&lt;p&gt;Contact Form 7 sends mail through WordPress's &lt;code&gt;wp_mail()&lt;/code&gt; function. The green success message means exactly one thing: that function returned &lt;code&gt;true&lt;/code&gt;. WordPress core is unusually candid about what that is worth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A true return value does not automatically mean that the user received the email successfully. It just only means that the method used was able to process the request without any errors."WordPress developer reference, &lt;code&gt;wp_mail()&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And CF7's own FAQ, answering "I see a green border response but I never receive a mail", is even more direct:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Showing the green border message means that the PHP function for sending the mail has certainly completed successfully. So if you can't receive the mail, it's highly possible that &lt;strong&gt;the mail has been kidnapped or killed after that&lt;/strong&gt;… Spam filter often causes this kind of problem."contactform7.com FAQ&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kidnapped or killed. That is the plugin author telling you, in writing, that the success message covers only the first link of a chain with at least four links in it. Everything after the handoff is invisible to CF7 — and therefore to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the chain actually breaks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. No SMTP — the mail is unauthenticated
&lt;/h3&gt;

&lt;p&gt;By default &lt;code&gt;wp_mail()&lt;/code&gt; ends up calling PHP's &lt;code&gt;mail()&lt;/code&gt;, which hands the message to the mail transport on your web host. That message carries no SPF alignment, no DKIM signature, and comes from a shared hosting IP with an unknown reputation. Gmail and Outlook increasingly treat that as spam — or drop it outright, without a bounce. From the site's perspective, everything succeeded.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The From address doesn't belong to your domain
&lt;/h3&gt;

&lt;p&gt;An old and very persistent tutorial habit: putting &lt;code&gt;[your-email]&lt;/code&gt; in the &lt;strong&gt;From&lt;/strong&gt; field on the Mail tab, so replies "come from the visitor". To a receiving mail server that is a domain you do not own, sending from an IP you do not own — textbook spoofing. Modern CF7 flags this itself as a configuration error ("Sender email address does not belong to the site domain"), and its documentation is explicit that the From address &lt;em&gt;should belong to the same domain as the web site&lt;/em&gt;. The visitor's address belongs in &lt;strong&gt;Reply-To&lt;/strong&gt;, not From.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The host disabled or throttled &lt;code&gt;mail()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Many hosts disable the PHP mail function entirely, or cap outbound mail, specifically to stop compromised sites from spamming. CF7 will show a red border if &lt;code&gt;wp_mail()&lt;/code&gt; returns false — but a throttled or silently discarded message can still return true.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Anti-spam ate the submission — and you can't tell
&lt;/h3&gt;

&lt;p&gt;This one is genuinely tricky. If Akismet, reCAPTCHA or the disallowed-words list rejects a submission, CF7 shows an orange border. But here is the design decision, stated openly in their FAQ: CF7 &lt;strong&gt;deliberately uses the same message for a mail failure and for a spam rejection&lt;/strong&gt;, on the reasoning that you should not tell a spammer they have been detected.&lt;/p&gt;

&lt;p&gt;Sensible for spam. Terrible for you: from the front end, "your mail configuration is broken" and "our anti-spam is silently eating real client leads" look identical. reCAPTCHA v3, in particular, scores submissions invisibly — a badly tuned threshold will quietly reject real humans forever.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. It arrived — in the spam folder
&lt;/h3&gt;

&lt;p&gt;The most common ending, and the hardest to prove. The email was delivered to the recipient's server, accepted, filtered, and dropped into Junk, where nobody looks. Every log in your stack says "sent". The client says "we get no enquiries".&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix, in order
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install an SMTP plugin and authenticate properly.&lt;/strong&gt; Send through a real mail service with SPF, DKIM and DMARC aligned to your domain. This single change fixes the majority of cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put your own domain in the From field.&lt;/strong&gt; &lt;code&gt;info@yourdomain.com&lt;/code&gt;, not the visitor's address. Visitor goes in Reply-To.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install Flamingo.&lt;/strong&gt; CF7 states plainly that it &lt;em&gt;"doesn't store submitted messages anywhere. Therefore, you may lose important messages forever"&lt;/em&gt;. Flamingo (same author) saves submissions to the database. It does not fix delivery — but it converts a permanently lost lead into a lead you can still find.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turn on spam logging&lt;/strong&gt; to find out whether anti-spam is the one rejecting your submissions, since the front-end message won't tell you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the recipient's spam folder&lt;/strong&gt; — and, if the recipient is on a corporate mail system, ask their admin to check the quarantine.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  And now the real problem
&lt;/h2&gt;

&lt;p&gt;Suppose you did all five. The form works today. You tested it, the email arrived, you closed the ticket.&lt;/p&gt;

&lt;p&gt;Six weeks from now, one of these will happen: the SMTP plugin gets an update that breaks authentication; the mail service rotates a key; the host tightens outbound limits; the client's IT department turns on a stricter spam policy; a plugin update changes the From header. The form will keep showing the green message. &lt;strong&gt;Nobody will notice for weeks&lt;/strong&gt; — until the client asks why enquiries have dried up, and you get to explain that you weren't watching.&lt;/p&gt;

&lt;p&gt;This is not hypothetical, it is the default outcome, because &lt;strong&gt;none of the standard tools verify delivery&lt;/strong&gt;:&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually verifies delivery
&lt;/h2&gt;

&lt;p&gt;Only one thing: &lt;strong&gt;submitting a real test lead and then finding it in a real mailbox.&lt;/strong&gt; Not a function return value, not an SMTP acknowledgement, not a provider's report — the message, in the inbox, with your own eyes (or a machine's).&lt;/p&gt;

&lt;p&gt;That is what our form check does. On a schedule, it submits a synthetic lead through the form with a unique marker in the body, and then looks for that marker in a monitored mailbox over IMAP. If the message arrives, the whole chain works — plugin, &lt;code&gt;wp_mail()&lt;/code&gt;, SMTP, authentication, the recipient's spam filter. If it doesn't arrive within the window, you get an alert while the client is still happily unaware.&lt;/p&gt;

&lt;p&gt;It is deliberately the least clever check we have: it does exactly what a careful human would do, except it does it every hour and never forgets. And it is the only check that can catch the failure mode CF7's own author describes — mail that was kidnapped and killed somewhere after the green checkmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why does CF7 show a green message but no email arrives?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The green border only means &lt;code&gt;wp_mail()&lt;/code&gt; returned true — the request processed without an error. WordPress core states that a true return does not mean the email was received. CF7's FAQ says the mail may have been "kidnapped or killed" after that, most often by a spam filter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Contact Form 7 store submissions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Its own docs warn you may "lose important messages forever" if mail breaks. Flamingo saves submissions to the database — turning a lost lead into a delayed one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does the orange border mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A spam module (Akismet, reCAPTCHA, disallowed list) blocked the submission. CF7 deliberately shows the same message for a mail failure and a spam rejection, so from the front end you cannot tell which one is eating your leads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I know the form still works without testing by hand?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Monitor delivery end to end: submit a test lead with a unique marker on a schedule, then verify it arrives in the mailbox. That is the only check covering the whole chain, including the receiving spam filter.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/contact-form-7-not-sending-email.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/contact-form-7-not-sending-email.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>php</category>
    </item>
    <item>
      <title>WordPress cron not running — the scheduler that only works when somebody visits</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:20:36 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/wordpress-cron-not-running-the-scheduler-that-only-works-when-somebody-visits-3p80</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/wordpress-cron-not-running-the-scheduler-that-only-works-when-somebody-visits-3p80</guid>
      <description>&lt;p&gt;WP-Cron is the most misunderstood component in WordPress, and the misunderstanding is baked into its name. It is not cron. It does not run on a schedule. It runs &lt;strong&gt;when someone loads a page&lt;/strong&gt; — and if nobody loads a page, nothing happens. On the quiet client sites that most depend on automation, that is a slow, silent, invisible failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  How WP-Cron actually works
&lt;/h2&gt;

&lt;p&gt;Real cron is a daemon: the operating system wakes it up at the appointed minute whether or not anyone is watching. WP-Cron is a checklist that WordPress glances at during a page request. Someone visits the site, WordPress asks "is anything overdue?", and if so it fires those tasks — &lt;em&gt;during that visitor's request&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Consequences fall out immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No traffic, no scheduler.&lt;/strong&gt; A B2B brochure site with forty visits a day runs its "hourly" jobs whenever someone happens to show up. Overnight, nothing runs at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Precision is a fiction.&lt;/strong&gt; A job scheduled for 03:00 runs at the first page load after 03:00 — which might be 09:12.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your visitor pays for it.&lt;/strong&gt; Heavy scheduled work executes inside a real person's page request. They wait; the job runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why the standard advice is to turn WP-Cron off and use a real cron. And it is also where the most common catastrophe happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistake that kills automation silently
&lt;/h2&gt;

&lt;p&gt;Someone reads that advice, opens &lt;code&gt;wp-config.php&lt;/code&gt;, and adds:&lt;/p&gt;

&lt;p&gt;define('DISABLE_WP_CRON', true);&lt;br&gt;
 Then they get distracted, or they hand the site to someone else, or they assume the host "does cron". The second half — actually scheduling the server to call &lt;code&gt;wp-cron.php&lt;/code&gt; — never happens.&lt;/p&gt;

&lt;p&gt;The result: &lt;strong&gt;the scheduler is now completely dead&lt;/strong&gt;, and WordPress will never mention it again. No warning banner, no email, no log entry. The site serves pages beautifully. Backups stop. Scheduled posts never publish. Update checks stop. And nobody finds out for months — typically when the client asks why the newsletter didn't go out, or when you go looking for a backup that does not exist.&lt;/p&gt;

&lt;p&gt;The correct pattern is both halves:&lt;/p&gt;

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

&lt;p&gt;define('DISABLE_WP_CRON', true);&lt;/p&gt;

&lt;h1&gt;
  
  
  server crontab — every 5 minutes
&lt;/h1&gt;

&lt;p&gt;*/5 * * * * curl -s &lt;a href="https://example.com/wp-cron.php?doing_wp_cron" rel="noopener noreferrer"&gt;https://example.com/wp-cron.php?doing_wp_cron&lt;/a&gt; &amp;gt; /dev/null&lt;/p&gt;

&lt;h1&gt;
  
  
  or, better, via WP-CLI
&lt;/h1&gt;

&lt;p&gt;*/5 * * * * cd /var/www/example.com &amp;amp;&amp;amp; wp cron event run --due-now&lt;/p&gt;

&lt;p&gt;What is actually riding on this&lt;br&gt;
 People treat WP-Cron as a background detail. Look at what depends on it:&lt;/p&gt;

&lt;p&gt;That last row is the one that catches agencies out. Some form plugins offer a "background sending" option that queues notification emails through Action Scheduler instead of sending them during the request. It makes forms feel faster — and it hands your lead notifications to the very scheduler that is broken. The visitor sees "thanks, we'll be in touch". The email sits in a queue that nothing ever drains. &lt;a href="https://pingvera.com/blog/wpforms-not-sending-email.html" rel="noopener noreferrer"&gt;We wrote about this failure in detail&lt;/a&gt;, because it is a genuinely nasty one: two independent silent failures stacked on top of each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why nobody notices for months
&lt;/h2&gt;

&lt;p&gt;Because a broken scheduler produces &lt;strong&gt;no events&lt;/strong&gt;. That is worth sitting with for a second.&lt;/p&gt;

&lt;p&gt;Every monitoring instinct you have is tuned to notice things that happen: an error, a 500, a slow response, an alert. A dead cron is the opposite — it is the absence of things happening. There is no error to catch, because nothing errored; there was simply nobody there to try.&lt;/p&gt;

&lt;p&gt;Uptime monitoring is completely blind to it. The site is up. The homepage loads in 200 ms from six continents. Every check you have is green, and has been green all the way through three months of no backups.&lt;/p&gt;

&lt;p&gt;This is the same structural blindness as &lt;a href="https://pingvera.com/blog/woocommerce-failed-orders.html" rel="noopener noreferrer"&gt;a store whose orders quietly stopped&lt;/a&gt;: systems report events, and the disappearance of an event is not an event. Somebody has to go looking for absence — or set up something that does.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to monitor that scheduled jobs actually ran
&lt;/h2&gt;

&lt;p&gt;Two approaches, and they catch different failures. Use both.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Heartbeat: let the job announce itself
&lt;/h3&gt;

&lt;p&gt;The most reliable check for "did it run" is to make the job say so. Schedule a task that pings a monitoring URL each time it executes; the monitor expects that ping within a window, and alerts you when it doesn't arrive.&lt;/p&gt;

&lt;p&gt;This is the beauty of the inverted check: &lt;strong&gt;silence is the alarm&lt;/strong&gt;. If the scheduler is dead, the ping stops, and you hear about it — no false positives, no guessing. It works for anything on a schedule, not just WP-Cron: nightly backups, database dumps, sync scripts. If it should have run and it didn't, you find out today, not in three months when you need the backup.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Inside check: is the scheduler even alive?
&lt;/h3&gt;

&lt;p&gt;A heartbeat tells you a specific job stopped. It cannot tell you the scheduler is running but drowning — tasks piling up, hours overdue, on a site whose traffic isn't enough to drain the queue.&lt;/p&gt;

&lt;p&gt;For that you need to look from inside. Our WordPress plugin reports two things: whether &lt;code&gt;DISABLE_WP_CRON&lt;/code&gt; is set (with no server cron behind it), and how far behind the due tasks actually are. A growing backlog is the early warning that the site is quietly running on fumes — before the backup you needed turns out not to exist.&lt;/p&gt;

&lt;p&gt;It sits alongside the other checks that &lt;a href="https://pingvera.com/blog/wordpress-health-monitoring-inside.html" rel="noopener noreferrer"&gt;only make sense from inside WordPress&lt;/a&gt;: modified core files, plugins with published vulnerabilities, mail going out unauthenticated through PHP-mail, autoload bloat. All invisible from the outside. All quietly expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule this all points to
&lt;/h2&gt;

&lt;p&gt;Monitor the things that &lt;em&gt;should happen&lt;/em&gt;, not only the things that &lt;em&gt;can go wrong&lt;/em&gt;. Error monitoring catches events. Nobody catches absences unless they deliberately decide to — and absences are where the expensive failures live: the backup that never ran, the lead email that never sent, the order that never came, the certificate nobody renewed.&lt;/p&gt;

&lt;p&gt;WP-Cron is just the most common example. It is a scheduler that requires an audience, quietly installed on thousands of client sites that don't have one.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why is WordPress cron not running?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because WP-Cron isn't a real cron: it fires when someone loads a page. Low traffic means tasks run late or not at all. If &lt;code&gt;DISABLE_WP_CRON&lt;/code&gt; is set and no server cron replaced it, they never run — and nothing in WordPress will tell you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What breaks when WP-Cron stops?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything scheduled: backups, security scans, scheduled posts, update checks, subscription renewals, follow-up emails, CRM syncs — and, on plugins that queue email in the background, the lead notifications themselves. The site keeps serving pages perfectly throughout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I replace WP-Cron with a real cron?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Set &lt;code&gt;DISABLE_WP_CRON&lt;/code&gt; to true in wp-config.php, then have the server call wp-cron.php on a schedule (system cron every few minutes, or &lt;code&gt;wp cron event run --due-now&lt;/code&gt;). The fatal mistake is doing the first half without the second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you monitor that cron actually ran?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A heartbeat check — the job pings a monitor each run, and you're alerted when the ping stops — plus an inside check that reports whether WP-Cron is disabled and how far behind the queue is.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/wordpress-cron-not-running-monitoring.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/wordpress-cron-not-running-monitoring.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>php</category>
    </item>
    <item>
      <title>70 false alerts a day — why uptime monitors cry wolf — and what the fix costs</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:19:23 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/70-false-alerts-a-day-why-uptime-monitors-cry-wolf-and-what-the-fix-costs-nnl</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/70-false-alerts-a-day-why-uptime-monitors-cry-wolf-and-what-the-fix-costs-nnl</guid>
      <description>&lt;p&gt;There is a sentence in a sysadmin thread that should end the career of any monitoring product: &lt;em&gt;"anyone still on this service needs to verify, don't trust, any outage notifications."&lt;/em&gt; Read that again. People are paying for alerts, and then paying with their own time to check whether the alerts are real. At that point the product has inverted its own purpose. Let's look at why this happens — it is architecture, not incompetence — and at what an actual fix looks like.&lt;/p&gt;

&lt;h2&gt;
  
  
  What people are actually living with
&lt;/h2&gt;

&lt;p&gt;These are real users, in public, about mainstream monitoring tools:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'm still getting over 70 false positives per day."r/selfhosted&lt;/p&gt;

&lt;p&gt;"I've just deleted my account because they've sent me no less than 140 emails telling me things are up, down, back up again… But everything of mine is up and running."r/sysadmin&lt;/p&gt;

&lt;p&gt;"Got paged into work because [the monitor] is claiming some of our sites are flapping… not finding a single issue."r/sysadmin&lt;/p&gt;

&lt;p&gt;"We'd have times where the netops ring group would get 10+ false positives in a single night. They tried to blame everything on us, and then tried to blame our ISP (we are the ISP)."r/msp&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And an agency describing what a WordPress plugin's built-in monitor did to them: &lt;em&gt;"yesterday alone I received 69 emails, yet the site has never been down. The graph within the control panel shows the site as having 100% uptime."&lt;/em&gt; The tool contradicted itself in the same interface, and still sent the emails.&lt;/p&gt;

&lt;p&gt;This is not a bug report. This is a genre.&lt;/p&gt;

&lt;h2&gt;
  
  
  One probe, one opinion
&lt;/h2&gt;

&lt;p&gt;Most monitoring checks your site from a single location. That single probe cannot distinguish between two very different events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your site is down.&lt;/li&gt;
&lt;li&gt;The path &lt;em&gt;between that one probe and your site&lt;/em&gt; is having a bad ten seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the probe's vantage point, they are identical: a request went out, nothing came back. So it fires. Your visitors, coming from other networks, notice nothing at all.&lt;/p&gt;

&lt;p&gt;The internet is not a wire; it is a negotiation. Routing flaps, transient packet loss, an overloaded probe host, a DNS resolver having a moment — all of it produces the same silence as a genuinely dead server. If your architecture is "one prober, one verdict", you have signed up for a permanent stream of ghosts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workarounds people reach for — and why they're half-fixes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "Whitelist our IPs at your firewall"
&lt;/h3&gt;

&lt;p&gt;This is the most common vendor answer, and users are unimpressed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Their solution is to add all 100+ IPs to our firewalls allowed list. This is not feasible when you're managing SonicWALL firewalls."r/sysadmin&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the probe really is being rate-limited or blocked, and whitelisting genuinely helps. But it fixes one cause of false alerts, not the class. Routing hiccups do not care about your allowlist.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Just raise the timeout"
&lt;/h3&gt;

&lt;p&gt;Raising the timeout buys you a slower, quieter monitor — and a longer delay before you learn about a real outage. It trades one failure mode for another rather than solving anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Turning the monitor off
&lt;/h3&gt;

&lt;p&gt;It sounds absurd until you meet an MSP that has done exactly that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"each time we end up turning it off… as it creates false positive like crazy. We would get automated calls at night telling us servers are down etc. when there is nothing wrong."r/msp&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the real end state of a noisy monitor. Not "we tolerate some noise" but "we disabled it". A monitor everyone has muted is worse than no monitor, because it also gives you the illusion of coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix that works — and where it usually lives
&lt;/h2&gt;

&lt;p&gt;Two mechanisms kill the overwhelming majority of false alerts, and neither is exotic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Confirmation from multiple locations.&lt;/strong&gt; Before declaring a site down, ask several probes in different networks and geographies. If one says "unreachable" and three say "loads fine in 200 ms", the site is fine and one probe had a bad moment. Only a quorum opens an incident.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debouncing.&lt;/strong&gt; Require a few consecutive failures before alerting instead of firing on the first blip. Costs you seconds on a real outage; removes an entire category of noise.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is the uncomfortable part. On several popular services, &lt;strong&gt;these fixes are premium features&lt;/strong&gt;. A user, on the free tier, drowning:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"an easy fix would be to change settings so it only considers the service as down after 2 or 3 consecutive failed health checks, but again, this can only be done in the paid tier."r/selfhosted&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Think about what that pricing decision means. The free plan is not merely limited — it is engineered to be the noisiest one, and the way out is a subscription. The product is selling you relief from a problem it kept in place.&lt;/p&gt;

&lt;p&gt;We put both mechanisms on every plan, including the free one. Not out of generosity: an alert that people have learned to ignore is not a cheaper product, it is a broken one. If our free tier trained you to mute us, our paid tier would never get the chance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The other side of the coin: the 5-minute blind spot
&lt;/h2&gt;

&lt;p&gt;False alarms are the loud failure. There is a quiet one that costs more.&lt;/p&gt;

&lt;p&gt;Most free tiers check every five minutes. An outage that lasts two minutes — a PHP-FPM pool exhausting itself, a database deadlock, a deploy gone wrong and rolled back — can fall entirely between two checks. You get no alert. You get a clean uptime graph. Your client gets an error page.&lt;/p&gt;

&lt;p&gt;When a user reported exactly this, a vendor's support said the quiet part out loud: &lt;em&gt;"the downtime may have been intermittent where the 5-min intervals may not have caught."&lt;/em&gt; That is the trade being made on your behalf: a monitor that alerts on ghosts and sleeps through the real thing.&lt;/p&gt;

&lt;p&gt;Our checks run every minute — on every plan, free included. A one-minute interval does not eliminate the blind spot (nothing short of continuous observation does), but it shrinks it by a factor of five, and it does not require a credit card.&lt;/p&gt;

&lt;h2&gt;
  
  
  What good looks like
&lt;/h2&gt;

&lt;p&gt;That last row is the whole point. The value of an alert is not in its delivery — it is in whether anyone believes it. Every false positive spends a little of that credit, and the balance does not refill.&lt;/p&gt;

&lt;h2&gt;
  
  
  One more thing a quorum gives you for free
&lt;/h2&gt;

&lt;p&gt;Once several regions check independently, disagreement between them stops being noise and becomes &lt;strong&gt;information&lt;/strong&gt;. If Amsterdam and Buffalo load the site fine and two other regions time out, the server is healthy and something in the network — a route, a regional block, a CDN rule — is cutting off part of the audience. A single probe cannot tell you that. It can only be right or wrong.&lt;/p&gt;

&lt;p&gt;That is the difference between "your site is down" (often untrue) and "your site is unreachable from part of the world" (specific, actionable, and impossible to fake with one prober).&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why does my uptime monitor say the site is down when it isn't?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Almost always because a single probe checks from a single location. A routing blip, packet loss, a DNS hiccup or the probe host being briefly overloaded looks exactly like a real outage from that vantage point. Visitors elsewhere never notice, but the monitor pages you anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually fixes false downtime alerts?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Confirmation from multiple locations (only alert when a quorum agrees) and debouncing (require several consecutive failures). Whitelisting the monitor's IPs at your firewall fixes one cause, not the class.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a 5-minute check interval miss a real outage?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, and vendors admit it. An intermittent two-minute outage can fall entirely between two five-minute checks — no alert, clean graph, angry client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is multi-location confirmation a premium feature?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On many services, yes — both confirmation and debouncing sit behind the paid tier, which makes the free plan the noisiest by design. We put both on every plan, including free, because an alert people have learned to ignore is worse than no alert.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/uptime-monitor-false-alerts-debounce-paywall.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/uptime-monitor-false-alerts-debounce-paywall.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>devops</category>
      <category>sre</category>
      <category>webdev</category>
    </item>
    <item>
      <title>WooCommerce checkout monitoring — how to catch a dead checkout before the client calls</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:18:33 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/woocommerce-checkout-monitoring-how-to-catch-a-dead-checkout-before-the-client-calls-2b55</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/woocommerce-checkout-monitoring-how-to-catch-a-dead-checkout-before-the-client-calls-2b55</guid>
      <description>&lt;p&gt;Here is a review that should be printed and pinned above every agency's monitor. An agency owner, writing about a WordPress management tool: &lt;em&gt;"one of my site's clients was wondering why he was getting no response to a recent sale he announced on his site — and when he went to go check, he realized &lt;strong&gt;his store was gone completely!&lt;/strong&gt; That's because the WooCommerce plugin had been deactivated somehow."&lt;/em&gt; The site was up the whole time. Uptime monitoring had nothing to report. The client found out from his own silence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure mode uptime monitoring cannot see
&lt;/h2&gt;

&lt;p&gt;Uptime monitoring answers exactly one question: &lt;em&gt;did the page load?&lt;/em&gt; That question has almost nothing to do with whether the store works.&lt;/p&gt;

&lt;p&gt;Five ways to break a WooCommerce store while it keeps returning a cheerful 200 OK:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The payment gateway is stuck in test mode.&lt;/strong&gt; Somebody flipped Stripe or PayPal into sandbox to debug something, verified it worked, and never flipped it back. Checkout completes. Money does not move.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An update broke the checkout page.&lt;/strong&gt; A plugin or theme update takes out the checkout template. The homepage — the page your monitor watches — is perfectly fine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failed orders are spiking.&lt;/strong&gt; Orders get created and then die at payment. Individually invisible; in aggregate, it means the gateway is broken.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The server-side order pipeline is broken.&lt;/strong&gt; A plugin conflict means orders never get created, or hang in a limbo status. The storefront looks great.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orders simply stopped.&lt;/strong&gt; The most insidious one: nothing is technically "broken", the flow just went quiet. Any of the four above will do it — as will an ad campaign that died.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice what all five have in common: &lt;strong&gt;the front page is fine&lt;/strong&gt;. This is the same class of failure as &lt;a href="https://pingvera.com/blog/website-forms-not-working.html" rel="noopener noreferrer"&gt;a contact form that silently stops delivering leads&lt;/a&gt; — the site works, the business does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three cheap signals from order statistics
&lt;/h2&gt;

&lt;p&gt;The naive approach is to alert when there are no orders. The naive result is an alert every night for a store that does two orders a week. So every threshold has to be normalised against &lt;strong&gt;that store's own baseline&lt;/strong&gt;, never against an absolute number.&lt;/p&gt;

&lt;h3&gt;
  
  
  Failed-order spike
&lt;/h3&gt;

&lt;p&gt;Compare the share of failed orders in the last 24 hours against the store's own seven-day norm:&lt;/p&gt;

&lt;p&gt;failed_24h &amp;gt;= 3&lt;br&gt;
AND (failed_24h / total_24h) &amp;gt; 3 × (failed_7d / total_7d)&lt;br&gt;
 → critical: the gateway is probably broken&lt;br&gt;
 Two safety catches. An absolute floor (three failures is the minimum before statistics mean anything) and a relative one (three times the store's own rate). A store that always has some failed orders — cash on delivery, aggressive fraud rules — lives with its own baseline and never catches fire.&lt;/p&gt;

&lt;h3&gt;
  
  
  Order drought
&lt;/h3&gt;

&lt;p&gt;Zero orders in 24 hours is a signal &lt;em&gt;only if this store normally takes orders&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;total_24h == 0&lt;br&gt;
AND average_daily_orders_over_14_days &amp;gt;= 3&lt;br&gt;
 → warning: this store usually sells, today it didn't&lt;br&gt;
 One engineering note that matters at scale: count orders with WooCommerce's paginated query and read the total, rather than pulling ID lists into memory. On a store with a hundred thousand orders, the difference between "fetch a number" and "fetch an array" is the difference between a cron job that runs and a cron job that dies on memory limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gateway stuck in test mode
&lt;/h3&gt;

&lt;p&gt;The only check where we had to descend into vendor specifics: WooCommerce has no universal "what mode is this gateway in" API. So walk the enabled gateways, and for a known allowlist of live providers, look at their standard sandbox settings keys.&lt;/p&gt;

&lt;p&gt;Use an &lt;strong&gt;allowlist of gateway IDs&lt;/strong&gt;, not a blind search across all plugin settings for anything named &lt;code&gt;sandbox&lt;/code&gt; — the first unrelated plugin with a similarly named option will hand you a false critical. And the settings values themselves never leave the site: only the verdict and the gateway ID go out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The smoke run: prove the pipeline still works
&lt;/h2&gt;

&lt;p&gt;Statistics catch failures after the fact — a few orders die, then you notice. An active check is better, provided it leaves no trace in a live store.&lt;/p&gt;

&lt;p&gt;Once a day, run a service order through the real WooCommerce API: create a hidden virtual product, create an order, add the product, calculate totals, walk it through statuses, then delete everything.&lt;/p&gt;

&lt;p&gt;$step = 'create_product';&lt;br&gt;
$product = new WC_Product_Simple();&lt;br&gt;
$product-&amp;gt;set_catalog_visibility('hidden'); // not in catalog or search&lt;br&gt;
$product-&amp;gt;set_virtual(true); // no shipping, no stock&lt;br&gt;
$product-&amp;gt;set_manage_stock(false);&lt;br&gt;
$product_id = $product-&amp;gt;save();&lt;/p&gt;

&lt;p&gt;$step = 'create_order';&lt;br&gt;
$order = wc_create_order();&lt;br&gt;
$order-&amp;gt;add_product($product, 1);&lt;br&gt;
$order-&amp;gt;calculate_totals();&lt;br&gt;
$order-&amp;gt;update_status('pending');&lt;br&gt;
$order-&amp;gt;update_status('cancelled');&lt;br&gt;
// ...then delete both, whatever happens&lt;br&gt;
 That &lt;code&gt;$step&lt;/code&gt; variable is not decoration. When the pipeline breaks, the valuable information is not &lt;em&gt;that&lt;/em&gt; it broke but &lt;strong&gt;where&lt;/strong&gt;: "product wouldn't save" and "totals won't calculate" send a developer to entirely different places.&lt;/p&gt;

&lt;p&gt;And a success produces no finding at all. &lt;strong&gt;Absence of a signal is the health signal.&lt;/strong&gt; Diagnostics that emit green records nobody reads are diagnostics nobody reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two traps we sat on so you don't have to
&lt;/h2&gt;

&lt;h3&gt;
  
  
  WooCommerce emails are not silenced the obvious way
&lt;/h3&gt;

&lt;p&gt;Your service order walks through statuses, and WooCommerce dutifully emails the store owner and the "customer". Run that daily on a live store and the owner gets a "New order" and an "Order cancelled" every single morning from a customer who does not exist.&lt;/p&gt;

&lt;p&gt;The obvious fix is the &lt;code&gt;woocommerce_email_classes&lt;/code&gt; filter: return an empty array, no emails. It does not work. &lt;code&gt;WC_Emails::init_transactional_emails()&lt;/code&gt; hooks each email class onto order events back on &lt;code&gt;init&lt;/code&gt; — by the time your cron job runs, &lt;strong&gt;the hooks are already attached&lt;/strong&gt;, and swapping the class list afterwards changes nothing.&lt;/p&gt;

&lt;p&gt;You have to hit the point WooCommerce checks immediately before sending — &lt;code&gt;WC_Email::is_enabled()&lt;/code&gt;, which consults the &lt;code&gt;woocommerce_email_enabled_{id}&lt;/code&gt; filter:&lt;/p&gt;

&lt;p&gt;foreach (WC()-&amp;gt;mailer()-&amp;gt;get_emails() as $id =&amp;gt; $email) {&lt;br&gt;
 add_filter('woocommerce_email_enabled_' . $id, '&lt;strong&gt;return_false', 9999);&lt;br&gt;
}&lt;br&gt;
add_filter('pre_wp_mail', '&lt;/strong&gt;return_true', 9999); // core-level safety net&lt;br&gt;
 The second filter is a WordPress-core backstop: if anything &lt;em&gt;other&lt;/em&gt; than WooCommerce tries to send during the run — a notification plugin, a CRM integration — it still will not go out. Both filters come off afterwards, so the run cannot swallow a real customer's email.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;finally&lt;/code&gt; does not save you from a fatal
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;try/finally&lt;/code&gt; guarantees cleanup on an exception. A PHP fatal — memory exhaustion, an error in somebody else's plugin hooked onto &lt;code&gt;woocommerce_order_status_changed&lt;/code&gt; — is not an exception, and &lt;code&gt;finally&lt;/code&gt; never runs. The result: a service product and an abandoned order left sitting in a client's store. Quietly corrupting a client's data is the worst thing a diagnostic tool can do.&lt;/p&gt;

&lt;p&gt;So on top of &lt;code&gt;finally&lt;/code&gt;, register a shutdown function that cleans up whatever was created. And write the IDs to state &lt;em&gt;immediately after each entity is created&lt;/em&gt;, not at the end of the step — a fatal between "created" and "recorded the ID" leaves an orphan you will never know about.&lt;/p&gt;

&lt;h2&gt;
  
  
  What sees what
&lt;/h2&gt;

&lt;p&gt;Note the last row. We are not claiming the inside layer sees everything: it does not see what happens only in the customer's browser — a crashed cart script, a payment iframe that never loads, a stale page served from a CDN. That is what a browser-driven synthetic run is for, and it costs an order of magnitude more: a real browser on every probe, fragile per-store scripts, test orders in someone's live database.&lt;/p&gt;

&lt;p&gt;And the inside layer has one honest blind spot of its own: &lt;strong&gt;if the site goes down, nobody is left inside to complain.&lt;/strong&gt; That is what external monitoring is for. Two layers, covering each other's gaps — that is the only honest way to answer "is the store working?".&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more than uptime
&lt;/h2&gt;

&lt;p&gt;An outage is loud. Everyone notices, everyone panics, someone fixes it, the client forgives you — outages happen. A broken checkout is silent. The store keeps taking visitors, the ad budget keeps burning, and the first person to notice is the owner looking at a revenue report a week later. Then the conversation is not about a plugin conflict. It is about a week of lost sales, and about why you were watching the homepage instead of the money.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why doesn't uptime monitoring catch a broken checkout?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because it asks one question: did the page load? A store with a dead payment gateway, a checkout page broken by an update, or a gateway left in test mode still serves pages perfectly. Status 200, valid certificate, fast response — and not a single order goes through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should you actually monitor in a WooCommerce store?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Four things beyond availability: the order flow itself, the share of failed orders against the store's own baseline, whether a live gateway is sitting in test mode, and whether the checkout page still renders. Plus a periodic smoke run of the server-side order pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you test the pipeline without leaving traces in a live store?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a hidden virtual product with stock management off, create an order through the WooCommerce API, calculate totals, walk it through statuses, then delete both. Suppress all WooCommerce emails for the duration of the run, and make cleanup happen even if a step fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need a headless browser to monitor checkout?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not for most failures. A browser run catches front-end breakage — a crashed cart script, a payment iframe that never loads — but it is expensive and fragile. The server-side pipeline, order statistics and gateway configuration cover the majority of real failures for the cost of one PHP process. The layers complement each other.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/woocommerce-checkout-monitoring.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pingvera.com/blog/woocommerce-checkout-monitoring.html" rel="noopener noreferrer"&gt;pingvera.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>woocommerce</category>
      <category>wordpress</category>
      <category>webdev</category>
      <category>monitoring</category>
    </item>
  </channel>
</rss>
