A customer places an order, the payment goes through, and the "thank you" page loads fine — but neither of you ever gets an email. No order confirmation in the customer's inbox, no new-order alert in yours. WooCommerce thinks everything worked. Here's how to actually track down why the emails never left the building.
Symptom
This usually shows up as one of a few patterns:
- Orders complete normally, but customers never receive the "Order confirmation" or "Processing order" email
- You (the store admin) stop getting "New order" notifications, even though sales are still coming in
- Emails worked fine for months, then stopped after a plugin update, theme change, or migration
- Some emails send (like password resets from core WordPress) but WooCommerce-specific ones don't
- Clicking "Resend" on an order's email log does nothing visible
That last point matters: if any mail from the site works but WooCommerce's don't, the problem usually isn't your SMTP setup — it's something specific to WooCommerce's email system.
Cause
WooCommerce emails don't just call wp_mail() and hope for the best. They go through a chain: an order status changes → a hook fires → Action Scheduler queues the email → WooCommerce builds the template → it finally reaches wp_mail(). A break at any link in that chain looks identical from the outside: "nothing arrived."
| Cause | What's actually happening |
|---|---|
| Action Scheduler is stuck | WooCommerce queues emails as scheduled actions; if the queue is backed up or wp-cron isn't firing, they sit pending forever |
| Email disabled in settings | A plugin update or a manual settings change turned off "New order" or "Processing order" under WooCommerce → Settings → Emails without anyone noticing |
| Custom email template removed a hook | A theme or child-theme override of an email template file is missing a hook WooCommerce relies on to actually trigger sending |
| A plugin conflict swallows the email | PDF invoice plugins, custom email plugins, or membership plugins that hook into the same actions can return early and stop WooCommerce's own handler from running |
| Server-level mail failure | The mail server rejects or silently drops the message after WooCommerce hands it off — same as any other outgoing mail issue |
| Recipient-side filtering | The message actually sent, but landed in spam or was blocked by the receiving mail server |
Step 1: Check WooCommerce's Own Logs First
Before touching SMTP settings, WooCommerce already tells you what it thinks happened. Go to WooCommerce → Status → Logs and look for a log file matching wc-emails or the specific email class you're chasing (e.g. class-wc-email-customer-processing-order). Enable logging first if you don't see one:
- Go to WooCommerce → Settings → Emails
- Click into any individual email type (e.g. "Processing order")
- Turn on Enable email logging if the option is available for that email, save, then trigger a test order
If the log shows the email was built and handed to wp_mail() with no error, the problem is downstream (server or recipient). If nothing shows up in the log at all, the problem is upstream — the email never even tried to send.
Step 2: Confirm the Email Type Is Actually Enabled
This sounds obvious, but it's the single most common cause. Go to WooCommerce → Settings → Emails and check the "Enable/Disable" toggle for each relevant email — New order, Processing order, Completed order, Failed order. A plugin conflict, a bad import of settings, or someone cleaning up "email spam" during setup can quietly switch these off. While you're there, also double-check the Recipient(s) field for admin notifications like "New order" — a typo or leftover developer email address here means real orders notify nobody.
Step 3: Check Whether Action Scheduler Is Backed Up
Modern WooCommerce queues most transactional emails through Action Scheduler instead of sending them inline. Go to WooCommerce → Status → Scheduled Actions and filter by Pending. If you see a large backlog of pending actions with old timestamps, your queue is stuck — usually because wp-cron isn't firing reliably.
Confirm wp-cron is actually running:
curl -I https://example.com/wp-cron.php
If your site gets little traffic, wp-cron (which relies on visitor page loads to trigger) may barely run at all. The fix is to disable the default trigger and use a real server cron job instead. In wp-config.php:
define('DISABLE_WP_CRON', true);
Then add a cPanel cron job to hit it every few minutes:
*/5 * * * * php /home/username/public_html/wp-cron.php >/dev/null 2>&1
Step 4: Rule Out a Template Override Problem
If a theme or child theme has copied WooCommerce email templates into yourtheme/woocommerce/emails/, an outdated copy can be missing hooks that newer WooCommerce versions expect — particularly do_action('woocommerce_email_header', ...) and woocommerce_email_footer. Compare your theme's copies against the current versions shipped in wp-content/plugins/woocommerce/templates/emails/. If they're stale, either update them to match the current structure or temporarily rename the theme's override folder to confirm WooCommerce's own default templates fix the issue.
Step 5: Isolate a Plugin Conflict
PDF invoice generators, custom "email customizer" plugins, and some membership/subscription plugins hook into the same order-status actions WooCommerce uses to send emails. If one of them errors out or calls return early, it can prevent WooCommerce's own hook from firing.
- Temporarily deactivate any plugin that touches WooCommerce emails, PDFs, or invoices
- Place a test order and see if the email arrives
- If it does, reactivate plugins one at a time until you find the culprit, then check that plugin's own settings for an email override toggle
Step 6: Confirm the Server Can Actually Send Mail
If logs show the email was sent but nothing arrives, this is now a standard outgoing-mail problem, not a WooCommerce one. Test with a plugin like WP Mail SMTP or Check Email, and route WooCommerce (and all of WordPress) through an authenticated SMTP connection rather than PHP's built-in mail() function — it's far more likely to land in the inbox instead of spam, since it uses your domain's real SPF/DKIM setup instead of the server's default sending identity.
Prevention
- Keep WooCommerce email logging on for at least the "New order" and "Failed order" emails — it costs nothing and saves a debugging session later
- Set up a real server-side cron job for
wp-cron.phpon any store, low-traffic or not — relying on visitor-triggered cron is a common silent failure point - After any theme update, diff your email template overrides against the plugin's current versions
- Test emails after every major WooCommerce or PHP mail-related plugin update, not just after checking the site "looks fine"
- Route all outgoing mail through authenticated SMTP with correct SPF/DKIM instead of the server's default mail() function
Frequently Asked Questions
Why did WooCommerce emails stop working right after a plugin update?
Plugin updates sometimes reset settings to defaults, including email enable/disable toggles, or introduce a new conflict with a hook another plugin depends on. Check WooCommerce → Settings → Emails first, then test with recently-updated plugins deactivated one at a time.
The order shows "Completed" but no email log exists at all — what does that mean?
It usually means the hook that triggers the email never fired, which points to Action Scheduler being stuck, a plugin conflict intercepting the order-status change, or the specific email type being disabled in settings — not a mail-server issue, since the email never got that far.
Should I use WordPress's default mail() function or SMTP for WooCommerce?
Always use authenticated SMTP. PHP's mail() function often sends using a generic server identity that doesn't match your domain's SPF/DKIM records, so even successfully "sent" emails frequently land in spam or get rejected outright by Gmail and Outlook.
Can I manually resend a missed order email?
Yes — open the order in WooCommerce → Orders, and under Order Actions choose the specific email to resend (e.g. "Resend order details"). This is also a good way to test a fix without waiting for a new real order.
Does HPOS (High-Performance Order Storage) affect email sending?
Not directly, but if HPOS was enabled without a clean data sync, some order-status hooks can behave inconsistently, which indirectly affects the actions that trigger emails. If emails broke around the same time you switched HPOS on, check WooCommerce → Status → Tools for a sync option before assuming it's purely an email issue.
