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."

CauseWhat's actually happening
Action Scheduler is stuckWooCommerce queues emails as scheduled actions; if the queue is backed up or wp-cron isn't firing, they sit pending forever
Email disabled in settingsA 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 hookA 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 emailPDF 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 failureThe mail server rejects or silently drops the message after WooCommerce hands it off — same as any other outgoing mail issue
Recipient-side filteringThe 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:

  1. Go to WooCommerce → Settings → Emails
  2. Click into any individual email type (e.g. "Processing order")
  3. 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.php on 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.