<?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>Freshping alternative for agencies — where does your client portfolio go when it shuts down?</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Mon, 10 Aug 2026 18:16:46 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/freshping-alternative-for-agencies-where-does-your-client-portfolio-go-when-it-shuts-down-3lk7</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/freshping-alternative-for-agencies-where-does-your-client-portfolio-go-when-it-shuts-down-3lk7</guid>
      <description>&lt;p&gt;Freshworks is sunsetting Freshping on &lt;strong&gt;March 6, 2026&lt;/strong&gt;. For a lot of freelancers and small agencies, Freshping was the quiet default: free uptime checks and a free status page, good enough that nobody thought about it again after setup. That's exactly why the shutdown is going to catch people off guard — the tools you never think about are the ones you forget to replace until they're gone. This isn't a takedown of Freshping. It's a straight answer to the question its former users now have: where does a client portfolio go next, and what should you actually check before you commit it somewhere new?&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually happening
&lt;/h2&gt;

&lt;p&gt;Freshping was Freshworks' free uptime monitor: ping-based availability checks plus a public status page, aimed at people who wanted the basics without paying for enterprise observability. It did that job well enough to pick up a real following among developers, freelancers and small studios keeping half an eye on a handful of sites — their own, or a client's. Freshworks has announced it is retiring the product, with a shutdown date of &lt;strong&gt;March 6, 2026&lt;/strong&gt;. After that date, the monitors stop running and the status pages stop resolving.&lt;/p&gt;

&lt;p&gt;If that's the only monitoring a client site has, this is not a cosmetic problem. An outage that happens the week after Freshping goes dark is an outage nobody is watching for.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to check before you commit a portfolio somewhere new
&lt;/h2&gt;

&lt;p&gt;A shutdown is a forcing function, and forcing functions produce rushed decisions. Before you sign up for the first "Freshping alternative" article that shows up, run down this list — it's the difference between a monitor that works for a single site and one that works for an agency managing a portfolio of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Being honest about the free-tier shape
&lt;/h2&gt;

&lt;p&gt;Here's where we won't oversell the comparison. Freshping's free plan was generous in a specific way: a fairly large number of separately pinged URLs, each getting its own uptime check. If what you need is "tell me when any of these fifty endpoints stops responding," that shape is genuinely useful, and we're not going to pretend our free plan replicates it — it doesn't.&lt;/p&gt;

&lt;p&gt;Pingvera's free plan is organized differently: &lt;strong&gt;up to 5 sites&lt;/strong&gt;, each checked from multiple regions every &lt;strong&gt;1 minute&lt;/strong&gt;, with a status page included. It's not a bigger or smaller number of the same thing — it's a different unit. One "site" on our free plan isn't one ping; it's the availability check, TLS certificate, domain expiry, and (for WordPress/WooCommerce sites) internal health of that one property, bundled together.&lt;/p&gt;

&lt;p&gt;For an agency, that difference usually cuts in your favor. You don't manage fifty anonymous URLs — you manage a handful of client relationships, and each one needs to be watched properly, not thinly. Five client sites with full coverage is a more useful free tier for that job than fifty pings that only tell you the server answered. But if your actual use case is a long flat list of endpoints rather than a portfolio of client properties, say so to yourself honestly — that's a real difference in shape, not a detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond the ping: what an uptime check was never built to see
&lt;/h2&gt;

&lt;p&gt;This is the part that has nothing to do with Freshping specifically — it's true of ping-based monitoring as a category, Freshping included. A monitor that watches whether a URL responds is watching the server, not the business running on top of it. That gap is where client relationships actually get lost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The contact form stopped delivering leads.&lt;/strong&gt; The page loads, the form submits, the "thanks" message appears — and &lt;a href="https://pingvera.com/blog/contact-form-7-not-sending-email.html" rel="noopener noreferrer"&gt;the email never makes it out of wp_mail()&lt;/a&gt;. A ping confirms the server is up. It says nothing about whether the lead arrived.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The store stopped taking orders.&lt;/strong&gt; A payment gateway left in test mode, a checkout broken by a plugin update, &lt;a href="https://pingvera.com/blog/woocommerce-failed-orders.html" rel="noopener noreferrer"&gt;bots grinding stolen cards through checkout&lt;/a&gt; — while uptime stays green the entire time, because the storefront is loading fine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WordPress is quietly compromised.&lt;/strong&gt; &lt;a href="https://pingvera.com/blog/website-returns-200-but-hacked.html" rel="noopener noreferrer"&gt;A website can return 200 OK and still be hacked&lt;/a&gt; — a backdoor, modified core files, a site dropped from search results. None of it fails a ping.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pingvera checks the parts a ping can't: form and lead delivery confirmed in real time, WooCommerce orders watched against a baseline so a checkout that goes quiet gets flagged even while every technical check is green, a &lt;a href="https://pingvera.com/blog/unified-timeline-client-site-monitoring.html" rel="noopener noreferrer"&gt;unified timeline&lt;/a&gt; that lines up business events, deploys and incidents on one clock, plus domain expiry, SSL, and signs of compromise or de-indexing. It goes past "is the site up" to "is the site working as a business" — which is usually the question the client is actually asking, even when they phrase it as "why is the site down."&lt;/p&gt;

&lt;h2&gt;
  
  
  Ordinary uptime pinging vs. business observability
&lt;/h2&gt;

&lt;h2&gt;
  
  
  White-label status pages and client reports
&lt;/h2&gt;

&lt;p&gt;One thing Freshping got right for its audience: a status page cost nothing extra. That's worth preserving in whatever you migrate to. Pingvera's status pages are included on every plan — including free — and can sit on your own domain via a CNAME record with automatic TLS, so a client sees &lt;code&gt;status.youragency.com&lt;/code&gt;, not a third-party subdomain. Reports work the same way: white-label, in plain business language, built for a client to actually read rather than a graph of response times they'll skim past.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alerts that don't cry wolf
&lt;/h2&gt;

&lt;p&gt;A single failed check from one location is not the same thing as an outage — it might be a network blip near the probe, not the site. Confirming from multiple regions before an alert fires is what separates "my monitor pages me for real problems" from "my monitor pages me and I've learned to ignore it." Alerts route to &lt;strong&gt;Telegram, email, Max, VK or a webhook&lt;/strong&gt;, and the agent that runs on a client's server (optional, for deeper host-level checks) is strictly one-way: it sends data out and never accepts a command back in. Nothing runs on a client's machine because Pingvera decided to run it — the service observes and explains, it doesn't act.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrating before March 6, 2026
&lt;/h2&gt;

&lt;p&gt;There's no automated import from Freshping — setting up a new site takes a few minutes, roughly the same amount of time it took to add a URL there in the first place. The only real deadline is the shutdown date itself. Practically, that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign up free and add your client sites — up to 5 with no card required.&lt;/li&gt;
&lt;li&gt;Point a status-page subdomain at your own domain with a CNAME, before clients need to look for it.&lt;/li&gt;
&lt;li&gt;Set up alert channels (Telegram is the fastest to wire up) so the first alert isn't the first test of whether alerts work.&lt;/li&gt;
&lt;li&gt;Do this before March 6, 2026, so your new monitoring already has a running history — and a quorum of confirmed checks behind it — by the time Freshping goes dark, instead of starting from zero on the same day the old monitor disappears.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When is Freshping shutting down?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Freshworks is sunsetting Freshping on March 6, 2026. After that date the free uptime monitoring and status pages many freelancers and agencies used for client sites will no longer run, so anyone still on it needs a new home before then.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there a free Freshping alternative?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes — Pingvera's free plan covers up to 5 sites at a 1-minute interval with a status page included, no card and no trial clock. It's organized around a client site rather than a count of pinged URLs, which is usually the more useful shape for an agency watching a portfolio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should agencies look for when migrating off Freshping?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The check interval on the free plan, whether status pages are included or sold separately, whether reports can be white-labeled, whether checks go past uptime into business-level signals like form delivery or WooCommerce orders, and whether alerts are confirmed from multiple regions before they fire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Pingvera import Freshping monitors automatically?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No — there's no automated import. Adding a site takes a few minutes, about what adding a URL took on Freshping. Doing it before March 6, 2026 means the new monitoring already has history in place instead of a gap.&lt;/p&gt;




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

</description>
    </item>
    <item>
      <title>Uptime green, orders zero — catching a WooCommerce store that stopped selling</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Mon, 10 Aug 2026 18:15:30 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/uptime-green-orders-zero-catching-a-woocommerce-store-that-stopped-selling-50fa</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/uptime-green-orders-zero-catching-a-woocommerce-store-that-stopped-selling-50fa</guid>
      <description>&lt;p&gt;The uptime monitor has been green all day. The status page shows 100%. Checkout loads, the cart adds up, the "Place order" button is right there. And the store has not sold anything in an hour, when it usually sells eight or nine orders in that window. Nothing in the classic monitoring stack will tell you that — because nothing in the classic monitoring stack is looking at orders. It's looking at pages loading. This is the gap, and it's exactly the gap real-time order events and an hourly baseline are built to close.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question uptime monitoring actually answers
&lt;/h2&gt;

&lt;p&gt;An uptime check does one thing, and it does it well: it requests a URL on a schedule and records whether the response came back and how fast. That answers "is the server reachable and responding correctly." It is a genuinely necessary check — a store that returns 500 or times out is obviously broken, and you want to know in seconds.&lt;/p&gt;

&lt;p&gt;But "the server responded" and "the business is working" are different claims, and the gap between them is where a store quietly stops selling while every dashboard stays green. A handful of concrete ways a checkout keeps returning 200 while it stops converting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The payment gateway is left in test mode.&lt;/strong&gt; The checkout page renders identically. Card fields accept input. The order attempt fails or silently routes to a sandbox — nothing about that changes what an uptime probe sees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A plugin or theme update breaks the checkout template.&lt;/strong&gt; The page still loads with a 200. The "place order" button might be misplaced, disabled by a JS error, or simply not wired to the form submit anymore.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A webhook that confirms payment stops firing.&lt;/strong&gt; The HTTP response for the checkout page itself never touches this at all — it's a background call between the payment processor and the store that an outside HTTP probe was never watching in the first place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The order-creation pipeline breaks on the server.&lt;/strong&gt; A conflicting plugin, a database error, a misconfigured order-status hook — the storefront renders fine because it's a completely separate code path from the one that actually writes the order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orders simply stop&lt;/strong&gt; — no error anywhere, just nobody completing a purchase, which can be the checkout, the payment method, or something upstream like a broken ad campaign or an expired discount code loop. Whatever the cause, "nothing is happening" produces no error for anything to catch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every single one of these leaves the HTTP status code at 200. That is the blind spot, and it is not a small one: it is every failure that happens after the page has already loaded correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why polling can't see a business that stopped, even if you poll the right thing
&lt;/h2&gt;

&lt;p&gt;You could imagine solving this by polling something order-related — hitting a "how many orders today" endpoint every five minutes. It would still be the wrong shape of tool, for two reasons.&lt;/p&gt;

&lt;p&gt;First, polling has no memory of what's normal. A number by itself — "orders today: 14" — means nothing without knowing whether 14 by 3pm is a catastrophe or a great day for this particular store. Second, and more fundamentally, absence is not an event. An uptime check fails loudly: a timeout, a 500, a TLS handshake error — something happens that the monitor can catch. A store that stops selling produces no such moment. Nothing errors. Nothing times out. The silence just accumulates, one non-event at a time, and a system built to catch events has nothing to catch.&lt;/p&gt;

&lt;p&gt;That's why Pingvera's WordPress/WooCommerce connector doesn't poll for orders — it reports them. The plugin sends an &lt;code&gt;order.created&lt;/code&gt; event to the dashboard at the moment a checkout completes, with the order id, amount and currency (no customer personal data), plus &lt;code&gt;order.failed&lt;/code&gt; when a payment attempt is declined. That turns "did anything happen" from a question you have to keep asking into a stream you can watch stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watching a stream stop: the hourly baseline
&lt;/h2&gt;

&lt;p&gt;A stream that stops is still not useful on its own — you need to know whether stopping is normal. A boutique selling three items a week has hours with zero orders as a matter of course; alerting on that would just be noise nobody trusts, and noisy alerts get muted, which defeats the entire point.&lt;/p&gt;

&lt;p&gt;So the detector builds a baseline: for each store, it learns the normal order count by day of week and hour of day, from eight weeks of that store's own history. Tuesday at 2pm is compared against other Tuesdays at 2pm. A Saturday-heavy store is compared against its own Saturdays, not a flat average that would falsely flag its quiet Mondays every single week.&lt;/p&gt;

&lt;p&gt;The condition that raises an incident is deliberately narrow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the baseline for this store, this day of week, this hour, is &lt;strong&gt;at least 3 expected orders&lt;/strong&gt; — so a slow store that rarely sells in a given hour never triggers a false alarm;&lt;/li&gt;
&lt;li&gt;the actual order count in the last hour is &lt;strong&gt;zero&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;the silence has held for &lt;strong&gt;60 minutes&lt;/strong&gt; — long enough to rule out an ordinary lull, short enough that you find out the same afternoon, not three days later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And critically, this incident only makes sense — only means anything actionable — when it fires &lt;em&gt;alongside&lt;/em&gt; a green uptime check and a checkout that's returning 200. That combination is the signal: the site works, and the business isn't. If uptime were also red, you wouldn't need a baseline to tell you something's wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uptime monitoring vs business observability
&lt;/h2&gt;

&lt;p&gt;Neither column replaces the other. A store with only the left column can be losing every sale for a day and show a perfect uptime report. A store with only the right column has no idea if the server itself fell over. You want both watching, because each is structurally blind to what the other one exists to catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why silence is worse than an error, not just harder to catch
&lt;/h2&gt;

&lt;p&gt;It's tempting to think of "no orders" as a milder problem than "site down" because nothing is technically broken. In practice it's often worse, for a reason that has nothing to do with detection difficulty: &lt;strong&gt;WooCommerce's own notification system depends on orders existing.&lt;/strong&gt; Order-confirmation emails, admin new-order notifications, anything triggered on order status — all of it fires off the order object. No order means no notification, from any source, to anyone. There is no native "you usually get 8 orders an hour and you got 0" alert, because the platform only reports things that happened, and a thing that stops happening isn't an event to it.&lt;/p&gt;

&lt;p&gt;Compare that to an outright outage: the site is down, the client's phone starts ringing, the agency finds out from a friend, from Twitter, from an uptime alert. It's unpleasant but it's fast. A dead checkout that keeps returning 200 produces none of that pressure. It can run quietly for a day, a weekend, sometimes longer — the first anyone hears about it is the client asking why last month's revenue looks strange, at which point the money is already gone and there's no way to get those customers back.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like in practice
&lt;/h2&gt;

&lt;p&gt;The order-events feed doesn't stand alone — it lands on the same per-site timeline as uptime incidents and deploy/update events, so when the anomaly fires you're not staring at a bare "0 orders" line with no context. You can see, on one timeline: orders arriving normally, then a plugin update, then the silence, then the incident 60 minutes in. The correlation between "what changed" and "what broke" is right there without cross-referencing three different tools. (More on that pairing in &lt;a href="https://pingvera.com/blog/unified-timeline-client-site-monitoring.html" rel="noopener noreferrer"&gt;how a unified timeline puts the cause next to the effect&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;And this sits alongside the checks covered in &lt;a href="https://pingvera.com/blog/woocommerce-failed-orders.html" rel="noopener noreferrer"&gt;reading failed-order spikes, stalls and silence&lt;/a&gt; and the &lt;a href="https://pingvera.com/blog/woocommerce-checkout-monitoring.html" rel="noopener noreferrer"&gt;daily checkout smoke test&lt;/a&gt; — together they cover the gateway-in-test-mode case, the broken-template case, and the "orders simply stopped" case from three different angles, rather than relying on any one signal to catch everything.&lt;/p&gt;

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

&lt;p&gt;A green uptime dashboard tells you the server is fine. It has never told you, and structurally cannot tell you, whether anyone bought anything. The failure modes that leave a store selling nothing while returning 200 OK are common, not exotic — a test-mode gateway toggle, a template that shifted six pixels after an update, a webhook that stopped without an error. None of them show up as downtime. All of them show up as orders that should have happened and didn't.&lt;/p&gt;

&lt;p&gt;This is not a request for more dashboards to check. It's the case for watching a different signal — the one the business actually cares about — with a baseline that knows what normal looks like for this specific store, at this specific hour.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How can a store be broken if uptime monitoring shows 100%?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because uptime checks answer "did the server respond," not "did the business work." A gateway left in test mode, a checkout template broken by an update, or a webhook that silently stopped firing all leave the HTTP response untouched — the page keeps returning 200 while nothing behind it functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is an hourly baseline, and how many weeks of data does it need?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The store's own order volume, bucketed by day of week and hour, learned from eight weeks of its own history — so a Tuesday afternoon is judged against other Tuesday afternoons, not a flat average that would misfire on every quiet Monday.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does the detector wait 60 minutes before raising an incident?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To rule out ordinary variance. The alert only fires once the silence has held long enough to be a real signal against that store's own baseline — and only for hours where the baseline expects at least 3 orders, so slow stores don't get paged on a normal quiet hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this replace uptime monitoring?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Uptime, SSL, domain and checkout-page checks catch failures that change the HTTP response. Order-based anomaly detection catches the failures that don't. Each is blind to what the other is built to see, so you want both.&lt;/p&gt;




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

</description>
    </item>
    <item>
      <title>The unified timeline — the deploy that broke checkout, next to the orders that stopped</title>
      <dc:creator>Artem Meleshkin</dc:creator>
      <pubDate>Mon, 10 Aug 2026 11:13:37 +0000</pubDate>
      <link>https://dev.to/artem_meleshkin_0c4e0a675/the-unified-timeline-the-deploy-that-broke-checkout-next-to-the-orders-that-stopped-7og</link>
      <guid>https://dev.to/artem_meleshkin_0c4e0a675/the-unified-timeline-the-deploy-that-broke-checkout-next-to-the-orders-that-stopped-7og</guid>
      <description>&lt;p&gt;The client's message is always some version of the same sentence: "orders stopped coming in, any idea why?" And the honest first move, every single time, is not to open the error log — it's to ask "what changed?" Nine incidents out of ten trace back to something that changed shortly before. The problem is that "what changed" usually lives in three different places: a deploy log, a plugin changelog nobody's watching, and your own memory of what you pushed on Tuesday. A unified timeline exists to collapse those three places into one line, so the cause is sitting right next to the effect instead of scattered across tabs you have to remember to open.&lt;/p&gt;

&lt;h2&gt;
  
  
  The debugging tax nobody puts on the invoice
&lt;/h2&gt;

&lt;p&gt;Picture the ordinary version of this incident without a timeline. A client emails that orders have gone quiet. You open the uptime dashboard — green. You open WooCommerce — no obvious errors on the order list, because there's nothing to see, there just aren't any orders. You check the payment gateway settings — look fine at a glance. Then you remember, or a colleague remembers, or you go digging through a deploy log in a different tool: right, the WooCommerce plugin got updated Tuesday afternoon. That's forty-five minutes of cross-referencing to arrive at a fact that was true the entire time and simply wasn't visible from where you were looking.&lt;/p&gt;

&lt;p&gt;That forty-five minutes is the debugging tax. It's not caused by the incident being hard — updating a plugin and breaking checkout is a common, almost boring failure mode. It's caused by the evidence for "what changed" and the evidence for "what broke" living in systems that don't talk to each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "unified" actually means here
&lt;/h2&gt;

&lt;p&gt;Pingvera's per-site timeline puts three kinds of signal on one shared clock:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Business events&lt;/strong&gt; — &lt;code&gt;order.created&lt;/code&gt; and &lt;code&gt;order.failed&lt;/code&gt;, reported in real time by the WordPress/WooCommerce connector as checkouts complete, with the order id, amount, currency and status.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploys and updates&lt;/strong&gt; — plugin, theme and core updates the connector observes on the site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incidents&lt;/strong&gt; — uptime, SSL, domain, checkout monitoring and the &lt;a href="https://pingvera.com/blog/woocommerce-orders-stopped-anomaly-detection.html" rel="noopener noreferrer"&gt;order-drought anomaly detector&lt;/a&gt;, all reported by monitoring from outside the site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that requires you to do anything differently — the connector reports what happens on the site, the monitors report what they observe from outside, and both land in the same place with the same clock. The value isn't in any one of those three streams; it's that they sit next to each other in the order they actually occurred.&lt;/p&gt;

&lt;h2&gt;
  
  
  A concrete sequence, on the timeline
&lt;/h2&gt;

&lt;p&gt;Here's the shape of an actual afternoon, as it would appear on a site's timeline — not a hypothetical, this is the exact pattern that ends up in a client's inbox as "orders stopped, any idea why?":&lt;/p&gt;

&lt;p&gt;Reading that top to bottom takes ten seconds, not forty-five minutes. Orders were flowing normally. A plugin update landed at 14:08. The order stream went silent starting at exactly that point. The anomaly detector confirmed it as a real incident 60 minutes later — the debounce window described in &lt;a href="https://pingvera.com/blog/woocommerce-orders-stopped-anomaly-detection.html" rel="noopener noreferrer"&gt;how the hourly baseline and 60-minute silence threshold work&lt;/a&gt;. Nobody had to remember the deploy happened. Nobody had to open a second tab to check when it happened. It's the line right above the incident.&lt;/p&gt;

&lt;p&gt;To be precise about what this is and isn't: the timeline doesn't run a root-cause algorithm or declare "the 2.4.0 update caused this." It puts the two facts next to each other, in the order they happened, and lets the person reading it draw the obvious conclusion — which in this case takes about one glance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging with vs. without a shared timeline
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Why this matters more once you're past one site
&lt;/h2&gt;

&lt;p&gt;On a single site you manage yourself, "what changed" is mostly a memory exercise — you probably remember pushing an update on Tuesday. That falls apart fast once an agency is running a portfolio: thirty client sites, updates going out on different schedules, some of them handled by different team members, some plugins auto-updating on their own. Nobody holds "what changed on which site, and when" in their head across thirty sites. The timeline is where that gets held instead — automatically, per site, without anyone having to keep a change log by hand.&lt;/p&gt;

&lt;p&gt;It also changes the shape of the client conversation. "We think the update on Tuesday caused it, we're checking" is a much better message to send at minute five than "we're investigating" is at minute forty-five — and it's true because the timeline made it obvious, not because someone got lucky remembering the right thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;Worth being precise here, because it's easy to over-promise on anything that touches the word "incident." The timeline observes and lays out — it does not act. Pingvera's agent is strictly one-way: it reports what it sees on the client's site and never receives commands, never deploys anything, never modifies anything on the client's machine. Nothing about the timeline changes that. It's a record you read, not a system that takes action on your behalf — the same principle that governs &lt;a href="https://pingvera.com/blog/monitoring-without-server-access.html" rel="noopener noreferrer"&gt;why the monitoring agent can't be told what to do&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Most client incidents aren't mysterious once you know what changed. The actual cost is almost always the time spent finding that out — hopping between a deploy log, an order list and an uptime dashboard that don't share a clock. Putting business events, deploys and incidents on one per-site timeline doesn't make incidents rarer. It makes the obvious explanation obvious immediately, instead of forty-five minutes later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What events actually appear on the unified timeline?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Business events from the WordPress/WooCommerce connector (order.created, order.failed, with amount, currency and status), deploy/update events, and monitoring incidents (uptime, SSL, domain, checkout, order-anomaly). All on the same shared clock, in the order they happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this an APM tool or a deployment tracker?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. It doesn't instrument code or manage deploys — the connector reports updates and orders from inside the site, monitoring reports incidents from outside, and the timeline lays both on one shared clock for a person to read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the timeline try to prove what caused an incident?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. It lays out what happened, in order, and leaves the reading to the person looking at it. Pingvera observes and explains — it doesn't act on a client's site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does this matter more for agencies than for a single site owner?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because context is the first thing lost at scale. One person can usually remember what they changed on one site last week. Nobody remembers what changed on which of thirty client sites — the timeline holds that instead, automatically, per site.&lt;/p&gt;




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

</description>
    </item>
    <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>
  </channel>
</rss>
