TechCorner HQ · Technical Troubleshooting Guide

WooCommerce Not Sending Emails: Causes and How to Fix It

By TechCorner HQ Editorial Desk Last reviewed Review standards

Quick Answer

When a store experiences WooCommerce emails not sending, the issue rarely stems from WooCommerce failing to build the message payload. By default, WooCommerce uses the core WordPress wp_mail() function to hand off messages to the web server's native PHP mail handler. Most web hosting environments lack trusted email delivery infrastructure, and major mailbox providers frequently reject unauthenticated PHP mail.

Abstract technical illustration showing digital mail vectors connecting server modules and mail icons.

To fix this, first confirm that the relevant order is not stuck in Pending payment and that the email notification is enabled in settings. Then install a dedicated Simple Mail Transfer Protocol (SMTP) or transactional email plugin and authenticate your domain using SPF, DKIM, and DMARC DNS records.

How WooCommerce Processes and Sends Mail

WooCommerce does not transmit emails directly across internet mail servers. Instead, outgoing messages pass through several distinct layers:

  1. Event Trigger: An event happens in your store, such as a customer placing an order or an administrator updating an order status.
  2. Template Assembly: WooCommerce compiles the HTML or plain-text email using its built-in templates.
  3. Core WordPress Handoff: WooCommerce passes the compiled headers and message body to the WordPress wp_mail() function.
  4. Server Transmission: By default, wp_mail() relies on the hosting web server's underlying PHP mail() setup or sendmail utility unless an SMTP plugin intercepts it.
  5. Receiver Verification: The recipient's mail provider (such as Google or Yahoo) validates the sender identity, checking authentication records (SPF, DKIM, DMARC) before deciding to deliver, quarantine, or drop the message.

Primary Reasons WooCommerce Emails Fail to Deliver

1. Unauthenticated Default Host Mail

Standard web hosting mail handlers do not sign outbound emails with recognized domain keys. Because spammers frequently exploit default PHP mail scripts, shared hosting IP addresses often suffer poor reputation scores, causing downstream providers to block or silently discard incoming traffic.

2. Missing SPF, DKIM, or DMARC Records

Major email providers require strict authentication for senders. If your store sends notifications from your domain without matching DNS records, recipient servers reject the messages to protect users from spoofing and phishing.

3. Order Status Pauses (Pending Payment)

Order receipt notifications to customers only trigger when payment completes and the status moves to Processing or Completed. If a customer abandons an off-site payment gateway or a card is declined, the order remains in Pending payment, and WooCommerce intentionally withholds the confirmation email. If customers are unable to complete checkout at all, see WooCommerce Checkout Stuck Loading to resolve gateway and JavaScript bottlenecks.

4. Disabled Notifications or Mismatched Sender Addresses

Individual email notifications can be deactivated within WooCommerce settings. Furthermore, setting a generic public domain (such as an @gmail.com address) in your store sender options while sending from a custom domain server creates a sender mismatch that mailbox filters flag as spam.

Diagnostic Steps: Finding Where the Delivery Breaks

Perform these non-destructive checks to pinpoint the exact failure point before making DNS or server modifications.

Step 1: Check Order Statuses

  1. In the WordPress admin dashboard, navigate to WooCommerce > Orders.
  2. Locate the orders where emails did not arrive.
  3. Check the order status column. If the order is marked Pending payment, WooCommerce will not fire customer receipts until the transaction settles successfully.

Step 2: Verify WooCommerce Email Settings

  1. Navigate to WooCommerce > Settings > Emails.
  2. Look through the list of email templates (such as New order, Processing order, or Completed order).
  3. Click Manage next to the affected template and verify that the Enable this email notification box is checked.
  4. Scroll to the Email sender options section at the bottom of the main Emails tab and verify that the "From" address uses an email address matching your actual domain name.

Step 3: Review WooCommerce Logs

  1. Go to WooCommerce > Status > Logs.
  2. Select recent fatal-error or mail-related logs from the dropdown to check if a third-party plugin or theme conflict caused a PHP execution halt during checkout.

How to Fix WooCommerce Emails Not Sending

Step 1: Install a Dedicated SMTP or Transactional Email Plugin

The standard solution recommended by official WooCommerce documentation is routing outbound emails through an authenticated SMTP or transactional email provider instead of the host's PHP mail server.

  1. Choose a supported transactional email provider (such as MailPoet, Brevo, Mailjet, Postmark, or Amazon SES).
  2. In WordPress, navigate to Plugins > Add New.
  3. Install and activate your chosen mail provider's official plugin or an SMTP plugin (such as WP Mail SMTP).
  4. Follow the plugin setup wizard to connect your account using an API key or secure SMTP credentials provided by your email host.

Step 2: Configure DNS Authentication Records

Open your domain name's DNS management panel (such as Cloudflare, Route 53, or your domain registrar) and add the required authentication records:

  • SPF (Sender Policy Framework): Create a TXT record on your root domain designating the IP addresses or services allowed to send mail on behalf of your domain (for example, v=spf1 include:mailprovider.com ~all).
  • DKIM (DomainKeys Identified Mail): Add the CNAME or TXT records generated by your SMTP provider to apply a digital cryptographic signature to outbound messages.
  • DMARC (Domain-based Message Authentication, Reporting, and Conformance): Add a TXT record at host _dmarc.yourdomain.com (starting with v=DMARC1; p=none;) to specify how receiving servers should treat unauthenticated mail.

Technical Precautions

  • Single SPF Record Rule: A domain must have only one SPF TXT record. Do not create multiple SPF records; instead, combine authorized sending sources into a single v=spf1 string to prevent validation errors.
  • DNS Propagation: DNS updates take time to propagate across global nameservers. Allow records to update fully before running repeated production tests.
  • Transport Security: When manually entering SMTP server configurations, always use encrypted connections over port 587 (TLS/STARTTLS) or port 465 (SSL). Avoid unencrypted connections on port 25.
  • Staging First: When testing mail routing plugins or changes on active stores, test thoroughly to prevent unexpected duplicates or unsent customer notices during active checkout sessions.

Verification Steps

  1. Send an SMTP Test Email: Use the built-in test utility in your SMTP or transactional email plugin to send a test message to an external address (such as a personal Gmail or Outlook inbox).
  2. Inspect Email Headers: In the receiving inbox, view the full raw email headers and confirm that SPF, DKIM, and DMARC checks all display a status of PASS.
  3. Perform a Live Order Test: Place a test purchase on your WooCommerce store using an external customer email address. Verify that the store administrator receives the New order notification and the customer receives the Processing order email.

Frequently Asked Questions

Can I use a personal Gmail account for my store's SMTP?

While plugins allow connecting personal Gmail accounts, Google imposes strict limits, including disabling accounts that send to more than 500 unique recipients within 24 hours (combining web interface activity and website mail). Dedicated transactional email services are designed specifically for store volume and deliverability.

Why does wp_mail() succeed even if the customer receives nothing?

The core WordPress wp_mail() function only reports whether the message was handed over to the local web server or SMTP relay. It cannot confirm whether the recipient's external mail server accepted the message or filtered it into spam.

Sources & References