A large share of missing WooCommerce emails were never sent, because the event that triggers them never happened.
That is worth establishing before touching any mail configuration, because the two failures look identical to a customer and completely different to fix. A message that was never generated cannot be a deliverability problem, and hours get spent on DNS records for an order stuck at the wrong status.
Work through this in order. Each step rules out the next.
Step 1 — Was the email supposed to fire?
WooCommerce order emails are triggered by status transitions, not by orders existing.
| Fires on | Goes to | |
|---|---|---|
| New order | Payment received | Admin recipients |
| Processing order | Pending → Processing | Customer |
| Completed order | → Completed | Customer |
| Order on hold | → On hold | Customer |
| Cancelled / Failed | → Cancelled or Failed | Admin |
| Refunded | Refund processed | Customer |
| Invoice / order details | Manual send only | Customer |
| Note to customer | Adding a customer note | Customer |
| Password reset, new account | Account actions | Customer |
The most common cause of a missing "processing" email is an order that never left pending payment. That happens when a payment gateway does not confirm back to the site — a webhook or IPN that failed, was misconfigured, or was blocked.
Check WooCommerce → Orders and look at the status column. An order sitting at pending payment while the customer's card was charged is a gateway callback problem, not an email problem. The email will fire correctly the moment the status changes.
Also check the per-email toggles. WooCommerce → Settings → Emails lists every notification with an enable checkbox and a recipient field. The "New order" email has its own recipient list, separate from the site admin address, and a blank or stale address there is a frequent cause of admins not being notified while customers are fine.
Step 2 — Did WordPress try to send it?
Install an email logging plugin, then place a test order.
Three outcomes, each pointing somewhere different:
- Nothing in the log. The email was never generated. Back to step 1, or a plugin conflict is suppressing it
- Logged, marked failed. A transport problem. Step 3
- Logged, marked sent. It left. The problem is delivery or filtering. Step 4
This single step is the difference between a ten-minute fix and an afternoon. It is also the thing most guides put last, after the DNS work.
If nothing is logged, temporarily switch to a default theme and deactivate non-essential plugins, then retest. A plugin hooking into WooCommerce email actions can prevent them firing, and marketing or CRM integrations that take over order notifications are the usual candidates.
Step 3 — Transport
If messages are logged as failed, WordPress could not hand them off.
On a site without an SMTP plugin, this is expected behaviour rather than a fault: WordPress is using PHP mail(), which frequently fails outright on modern hosting and reports nothing useful when it does. Why that is.
On a site with one, check credentials, port and encryption. A connection timeout on port 25 is your host blocking outbound SMTP; use 587 with STARTTLS or the service's API. Configuring it properly.
Step 4 — Delivery
Logged as sent and not arriving means it left your site and was rejected, filtered or discarded downstream.
The likeliest cause on a WooCommerce site is authentication, and the reason it bites stores particularly hard is volume plus content: a store sends more automated mail than a blog, and order confirmations contain the links, prices and urgency patterns filters weigh heavily.
Check three things:
1. Read the headers of a message that did arrive. Find Authentication-Results and confirm dkim=pass with header.d showing your domain. A pass on your host's domain does not align, and DMARC fails despite it.
2. Check your domain's blocklist status. Check it here. Total non-delivery to every provider at once points here rather than at configuration. If the store's site was compromised at any point, this is more likely than it sounds. Why a hack lands your domain on a blocklist
3. Check where mail lands per provider. Test to Gmail, Outlook and one other. Delivery to one and not another is a reputation pattern, not a configuration fault.
Step 5 — The From address problem
WooCommerce has its own From settings, and they override your SMTP plugin unless you force otherwise.
WooCommerce → Settings → Emails → Email sender options sets a "from" name and address used on all store mail.
Two failures here:
A From address on a domain you do not control. A store whose sender address is a Gmail or Yahoo address is sending mail from your server claiming to be from a provider's domain. That fails that provider's DMARC policy, and the outcome is not filtering but rejection. Use an address on your own store domain.
A disagreement between WooCommerce and your SMTP plugin. Both set a From address, and which wins depends on hook order. The result is some messages aligned and some not. Set the SMTP plugin to force the From address, and match WooCommerce's setting to it so there is nothing to disagree about.
Set Reply-To separately. Customers reply to order emails constantly. From should be your store address; Reply-To should be wherever a human reads.
Step 6 — Customer-side causes
Some non-arrivals are not your site at all.
- Typos at checkout. Check the order record.
gmial.comis a real and frequent cause - Corporate filtering, which is stricter than consumer providers and often discards silently
- Full mailboxes, which bounce
- Spam folders. Ask the customer to check before you rebuild anything
A bounce log tells you which of these it was, which is one more reason to send through a service that reports bounces rather than through PHP mail, which reports nothing. What bounces mean.
What matters more on a store than elsewhere
Two things, and both are about consequence rather than cause.
Transactional mail is the last thing you want filtered. An unread newsletter costs an open. An undelivered password reset costs a customer who cannot log in, and an undelivered order confirmation generates a support ticket and, often, a chargeback dispute where the customer says they received no confirmation.
Marketing sending on the same domain puts that at risk. A campaign that generates complaints degrades the domain reputation your order confirmations depend on. A store that sends both should separate the streams — a subdomain for campaigns, the main domain for transactional — so a bad campaign cannot take checkout email down with it. How reputation works across streams.
Frequently asked questions
Why are WooCommerce order emails not sending?
Most often the status transition that triggers them never happened — an order stuck at pending payment never fires the processing email. Check order status first, then the per-email enable toggles, then whether WordPress attempted to send at all using an email log. Only after that is it a delivery problem.
Why do I get customer emails but not admin ones?
The "New order" notification uses its own recipient field in WooCommerce → Settings → Emails, separate from the site admin address. A blank, stale or mistyped address there stops admin notifications while customer mail continues normally.
Do I need an SMTP plugin for WooCommerce?
Yes for any store that depends on order emails arriving. Without one WordPress sends through PHP mail() from your web server, which is unauthenticated for your domain and reports success whether or not the message was delivered.
Why do my order emails go to spam?
Usually failed authentication, and stores are hit harder because they send more automated mail containing links and prices. Confirm DKIM passes on your own domain in the message headers, check your domain's blocklist status, and make sure the From address is on a domain you control.
Can I use my Gmail address as the WooCommerce sender?
Not safely. Your server would be sending mail claiming to be from Gmail's domain, which fails Gmail's DMARC policy and gets rejected rather than filtered. Use an address on your store's own domain and set Reply-To to wherever you actually read mail.
Why does the customer say they never got the confirmation?
Check the order record for a typo in the email address, then your email log for whether it was sent and what the response was, then ask them to check spam. A bounce log distinguishes a full mailbox from a rejection, which is why sending through a service that reports bounces matters on a store.
The short version
- Check the order statusCheck the order status in WooCommerce u2192 Orders u2014 an order at pending payment never fires the processing email.
- Check the per-email toggles and recipient fieldsCheck the per-email toggles and recipient fields in WooCommerce u2192 Settings u2192 Emails.
- Install an email logging pluginInstall an email logging plugin and place a test order.
- If nothing is loggedIf nothing is logged , deactivate non-essential plugins and switch to a default theme, then retest.
- If logged as failedIf logged as failed , check SMTP credentials, port and encryption, or install an SMTP plugin.
- If logged as sentIf logged as sent , read the `Authentication-Results` header on a delivered message and confirm DKIM passes on your own domain.
- Check the store domain's blocklist statusCheck the store domain's blocklist status
- Set the WooCommerce From addressSet the WooCommerce From address to a mailbox on your own domain and force the same address in the SMTP plugin.
- Set Reply-ToSet Reply-To to a monitored inbox.
- Test delivery to Gmail, Outlook and one other providerTest delivery to Gmail, Outlook and one other provider
- Move marketing sending to a separate subdomainMove marketing sending to a separate subdomain
The WordPress Email Delivery Checklist
Stop your WordPress emails from failing silently. Get the complete setup guide.

Muhammad Basim has worked in digital marketing since 2013, focused on email deliverability and AI-assisted content production. He is the author of The Email Deliverability Playbook and The Email Copywriting Playbook.
Related Articles

Choosing a WordPress SEO Plugin
This page names no winner, and the reason is that the choice matters far less than the category's marketing implies. The major WordPress SEO plugins do the same six things. They have converged, they will continue to converge, and the difference between them is interface preference and a small number of features most sites never […]

Two-Factor and Login Hardening for WordPress
Login attacks against WordPress are constant, automated and indiscriminate. Every public WordPress site receives them, regardless of size or traffic, because the cost of trying is near zero. They are also the least successful route into a WordPress site. Vulnerable plugins account for more compromises than password guessing, which is worth holding onto — login […]

WordPress Email: Why Your Site’s Emails Never Arrive
WordPress sends email in a way that fails modern authentication by default, and it reports success while doing it. That combination is why this problem is so persistent. The site is not broken. Nothing is logged. wp_mail() returns true, the order is placed, the form says thank you — and the message never reaches an […]

