WooCommerce email error
WooCommerce order confirmation email not sending.
Treat this as a WooCommerce event-to-template failure until the exact order email, order status, and template enabled state are proven.
Failure stage
The order confirmation path is not one generic email. WooCommerce must create the order, move it into the status that triggers the customer email, load the matching template, resolve the customer recipient, then hand the message to wp_mail().
Checkout/order event: order exists and has a billing email.
Order status trigger: processing or completed email must match the actual status transition.
Email template: the exact customer email must be enabled.
Likely failure: wrong status, disabled template, missing billing email, or wp_mail transport failure.
Not proven yet: recipient spam filtering if WooCommerce never generated the email.
Evidence-to-cause matrix
| Evidence | Likely cause | First check |
|---|---|---|
Order is still pending payment | No customer processing/completed trigger fired | Confirm payment gateway changed order status. |
| Completed email expected, order is processing | Email type/status mismatch | Test the processing-order email instead. |
| No order note mentions email | WooCommerce did not generate the event | Check status transition and custom order hooks. |
| Template disabled | WooCommerce stops before wp_mail | Enable that exact customer email template. |
| Billing email missing or typo | Recipient resolution failure | Correct the billing email, then resend from order actions. |
wp_mail_failed appears | Transport failure after WooCommerce | Fix SMTP/PHP mail before retesting the order email. |
WooCommerce path
| Stage | What to verify |
|---|---|
| Order event | Order exists and has the status transition that should trigger this customer email. |
| Email template | The matching customer processing/completed template is enabled. |
| Recipient | Billing email is valid and belongs to the customer being tested. |
| wp_mail | WooCommerce generated the message and handed it to WordPress mail. |
| SMTP | Provider log shows accepted, rejected, or missing event for that timestamp. |
| Inbox | Only check spam/quarantine after provider acceptance is proven. |
Do this first / do not do this yet
Do this first
- Identify whether the missing email is processing order, completed order, invoice, or new order.
- Check the actual order status at the time the email should have sent.
- Open WooCommerce > Settings > Emails and verify that exact template is enabled.
- Resend the exact email from the order actions menu.
Do not do this yet
- Do not change SMTP credentials before proving WooCommerce generated the email.
- Do not edit every template; test the missing template only.
- Do not change MX records; MX does not trigger WooCommerce order emails.
- Do not assume payment success means the order reached the email-triggering status.
Bad input example
Email expected: customer completed order
Order status: processing
Template enabled: not checked
Recipient: customer@example.com
Log: customer says no confirmation email arrived
Corrected pattern
Email tested: customer processing order
Order status: processing
Template: enabled
Recipient: billing email verified
First resend: order actions -> resend processing order
Second check: SMTP provider log for customer@example.com
Pattern to verify in your environment.
Confirm this is the real stage
- Open the order notes timeline and find the status transition timestamp.
- Compare that timestamp to the SMTP provider log.
- If no provider log exists, inspect WooCommerce template/status settings.
- If a provider log exists, move to sender authentication and recipient filtering.