preloader

WooCommerce Emails Not Sending: A Complete Diagnosis and Fix Guide

When WooCommerce emails stop sending, the business impact is immediate: customers do not know their order was received, you do not know about new orders, and refund or shipping notifications go silent. The problem is almost always in one of three places – WordPress’s email sending mechanism, WooCommerce’s email configuration, or something intercepting the emails after they leave your server. This guide covers all three layers systematically.

Understanding How WooCommerce Sends Emails

WooCommerce generates email content and hands it to WordPress’s wp_mail() function. WordPress then passes it to PHP’s mail() function, which uses the server’s sendmail configuration to dispatch it. This chain has three failure points: WooCommerce may not trigger the email at all, wp_mail() may silently fail, or the email may send successfully but be rejected or filtered by the recipient’s mail server.

The distinction matters because the fix is completely different for each failure point. Knowing which layer is broken saves hours of debugging.

Step 1: Verify Whether wp_mail() Is Working at All

Install the WP Mail SMTP plugin and go to its Check Email tab. Send a test email to an address you control. If the test email does not arrive, the problem is at the WordPress mail level, not WooCommerce-specific. Fix this layer before investigating WooCommerce configuration.

If wp_mail() is working (test email arrives) but WooCommerce emails are not, the problem is in WooCommerce’s email triggers or configuration.

Step 2: Check Whether WooCommerce Is Trying to Send the Email

Add this temporary debug snippet to functions.php to log every wp_mail() call:

add_action('wp_mail', function($args) {
    error_log('wp_mail called: to=' . $args['to'] . ' subject=' . $args['subject']);
}, 1);

add_action('wp_mail_failed', function($error) {
    error_log('wp_mail FAILED: ' . $error->get_error_message());
});

Enable WordPress debug logging (define(‘WP_DEBUG_LOG’, true) in wp-config.php), place a test order, and check wp-content/debug.log. If you see the wp_mail log entry, WooCommerce is triggering the email and wp_mail() is being called – the problem is delivery. If you see nothing, WooCommerce is not triggering the email – the problem is in WooCommerce’s event hooks.

Still stuck after trying these steps? Describe the exact issue and get a free estimate from a developer who has seen this before.

Step 3: Fix wp_mail() Delivery (The Most Common Root Cause)

PHP’s native mail() function is unreliable on most shared hosting and blocked entirely on some servers. Major email providers (Gmail, Outlook, Yahoo) reject emails from PHP mail() because they lack proper authentication (SPF, DKIM). This is why order confirmation emails arrive in spam, or do not arrive at all.

The fix is SMTP: configure WordPress to send email through an authenticated email server rather than PHP mail(). Use WP Mail SMTP and connect to one of these:

  • Postmark – $15/month, excellent deliverability, specifically designed for transactional email. Best choice for WooCommerce stores with significant order volume.
  • SendGrid – free up to 100 emails/day, $15/month for higher volume. Widely used and reliable.
  • Your hosting SMTP – most hosts provide an SMTP server. Check your hosting control panel for credentials. Free but deliverability depends on your host’s IP reputation.
  • Gmail SMTP – works but has daily sending limits (500/day for regular Gmail, 2000/day for Google Workspace). Not suitable for high-volume stores.

After configuring SMTP in WP Mail SMTP, send the test email again. When that works, place a test order and verify the confirmation email arrives.

Step 4: Verify WooCommerce Email Settings

If wp_mail() is working but WooCommerce emails are not triggering, check WooCommerce -> Settings -> Emails. Verify that each email type (New Order, Processing Order, Completed Order, Customer Invoice) is enabled and has a recipient address configured. The “From” address must be set – an empty From field causes wp_mail() to fail silently on some servers.

Also verify the email recipient for admin notifications: the New Order email sends to the store admin email address set in WooCommerce -> Settings -> General -> Store Email Address. If this address is wrong or empty, no admin notification arrives even when customer emails work correctly.

Step 5: Order Status Mismatch

WooCommerce emails fire on specific order status changes. The Processing email fires when an order moves to “Processing” status. The Completed email fires when it moves to “Completed”. If your payment gateway is moving orders to a non-standard status, or if an automation is skipping status changes, the corresponding email never fires.

Check the order notes on a recent order: they log every status change with a timestamp. If the order moved from Pending directly to Completed without going through Processing, the Processing email was never triggered. This can happen with some payment gateways or when manually editing order status.

Step 6: Emails Sending But Landing in Spam

If test emails arrive but customer emails do not, spam filtering is the likely cause. Check your sending domain’s DNS records for SPF, DKIM, and DMARC configuration. These records tell recipient servers that your sending IP is authorised to send email for your domain. Without them, emails from your domain are treated as suspicious.

Configure these in your domain’s DNS settings. Your SMTP provider (Postmark, SendGrid) provides the exact DNS record values to add. Most have a verification tool to confirm the records are set correctly before you rely on them for production email.

Keep Reading

Previous Post WPML and Custom Post Types: Why Translations Are Not Working and How to Fix Them Next Post Gravity Forms Stripe Payments Not Completing: Webhook Failures and Entry Creation Issues

Need Help With Your WordPress Site?

If you need help with WordPress fixes, plugin issues, theme customization, or development work, feel free to get in touch.

Get a Free Estimate