WooCommerce order emails not sending: fix it in 20 minutes

You rarely get a warning when order emails stop. You find out from a customer asking where their confirmation went, or from your own new-order notifications going quiet for a day before you notice. The good news is that this is one of the most fixable problems in WooCommerce, and nine times out of ten the cause is the same. Here is how to confirm what is broken, fix it properly, and make sure you catch it the moment it happens again.

First, figure out what is actually broken

Before you change anything, find out how wide the problem is. The fix is different depending on whether every email is failing or only some of them are.

Go to WooCommerce → Settings → Emails. This screen lists every email Woo can send: new order, processing, completed, and the rest. Check that the ones you rely on are enabled, and that the recipient address on the admin notifications is correct. It is common to find that a single email got switched off during some past change, or that the admin address still points at an old inbox nobody reads.

If your version of WooCommerce shows an email testing tool on that screen, send yourself a test. If the test arrives but real order emails do not, the trouble is likely in one specific email or a plugin that hooks into it. If the test does not arrive either, your whole sending setup is the problem, which is the common case and the one most of this guide is about.

You can also check a single order. Open a recent one and read the order notes down the side. When Woo sends an email it usually leaves a note saying so. If the note is there but the customer never received anything, Woo did its part and the message was lost after it left WordPress. If there is no note at all, the email was never triggered in the first place, which points at settings or a plugin rather than delivery.

The cause 90 percent of the time

If nothing is arriving, the reason is almost always the same, and it is not really a WooCommerce bug. By default, WordPress sends mail with PHP's built-in mail() function. That hands the message straight to the server with no login and no proof of who sent it. For years that was good enough. It is not anymore.

Mailbox providers now check that an email truly came from the domain it claims to, using three records called SPF, DKIM, and DMARC. SPF lists which servers are allowed to send for your domain and DKIM adds a signature that proves the message was not forged, while DMARC tells providers what to do when those checks fail. Mail sent by plain mail() usually carries none of that, so Gmail, Yahoo, Outlook and the rest either drop it silently or file it in spam. Gmail and Yahoo tightened these rules sharply in 2024, which is why plenty of stores that had been fine for years suddenly went quiet.

The message never bounces and never errors. Woo believes it sent the email, the order note even says so, and the customer simply never sees it. That is the trap: from inside WordPress, nothing looks broken.

The fix: an SMTP plugin pointed at a real sender

The fix is to stop using PHP mail() and send through an authenticated service instead. You do that with an SMTP plugin, which reroutes every email WordPress sends through a proper login on a sender that is set up to pass those checks.

The common free plugins here are honest, capable, and roughly interchangeable for this job: WP Mail SMTP, FluentSMTP, and Post SMTP. Any of the three will do it. Pick one and install it.

Then point it at a real transactional sender rather than generic web host mail. Options with usable free tiers include your host's own SMTP if it offers authenticated sending, Google Workspace if you already pay for it, or a dedicated service like Brevo or Mailgun. A dedicated service is usually the most reliable, because delivering mail is the only thing it does and it walks you through the setup.

The generic setup is the same whichever you choose:

When the test lands in a normal inbox rather than spam, your order emails travel the same path and start arriving again.

When it is something else

Most stores are fixed by the step above. A few have a different story, and the triage you did at the start tells you which one you are looking at.

Emails stopped right after a host migration

A new host means a new server IP with no sending reputation, and many hosts now block PHP mail() outright. This is the same root cause wearing a different hat, and the same SMTP fix applies. Moving to an authenticated sender takes your delivery out of the new server's hands entirely.

Emails stopped right after you enabled a security plugin

Some security and firewall plugins filter outgoing mail, or disable the PHP functions Woo depends on. Check the plugin's logs and its email or connection settings, and add an exception for your SMTP sender if it keeps an allow list.

Emails arrive but look broken or clipped

If a message shows up cut off with a view entire message link, or trips spam filters on its own, the content is the issue rather than the delivery. Run your store's address through mail-tester.com: it sends you a score and a plain list of what to fix, covering both authentication and content.

Order emails go out but land in the customer's spam

This is almost always missing or wrong DNS records. Your SPF, DKIM, and DMARC records live wherever your domain's DNS is managed, which is usually your domain registrar or your host, not WordPress. Your sending service publishes the exact records to add, so follow its documentation and your host's DNS docs to enter them, then retest.

How to notice fast next time

The worst part of this problem is how quietly it happens. You can go days before a customer mentions it. Three small habits close that gap.

Watch the order notes. Now that you know a sent email leaves a note, a missing note on a recent order is an early sign that something upstream broke.

Install an email log plugin. Most SMTP plugins include a log, or you can add a standalone one. A log records every email WordPress tried to send and whether it went out, so instead of guessing you can open the log and see the gap the moment it appears.

Keep a monitoring habit. Send yourself a test order every so often, or use an outside watcher that tells you when confirmations stop. The goal is simple: find out from a tool, not from an unhappy customer.

Two quiet tools, if you want them

Want to know your checkout is loading right now? Run the free checkout checker, no signup. And if you'd like failed payments and stopped orders to reach you within minutes without any setup on your side, Store Guardian is free while it's in beta.

More guides

WooCommerce orders suddenly stopped? Work through these 7 checks

WooCommerce checkout not working: find the cause in 15 minutes

How to get alerted the minute a WooCommerce payment fails

Stop failed WooCommerce orders from cluttering your dashboard

WooCommerce card testing attack: stop it and clean up