Reading progress
SMTP, spam filters, order-status triggers, and WP-Cron—fix the stack in order.
When WooCommerce emails are not sending, fix the stack in this order: (1) confirm the email is enabled for that order status under WooCommerce → Settings → Emails, (2) stop relying on PHP mail()—use authenticated SMTP or a transactional provider, (3) check spam/blocklists and “From” domain alignment (SPF/DKIM/DMARC), (4) verify WP-Cron or a real system cron is running, (5) test with a new order and a mail-logging plugin. Guest access after purchase: guest order links.

Symptoms vs root causes
| What you see | Likely cause |
|---|---|
| No email for any order | SMTP / hosting mail blocked, or WP-Cron stuck |
| Only some statuses missing | Email type disabled or custom status without a template |
| Customer says “nothing arrived” | Spam folder, wrong address, or provider deferral |
| Admin gets mail, customer does not | Customer template off; admin “New order” still on |
Step 1: Confirm WooCommerce email settings
- Go to WooCommerce → Settings → Emails.
- Open Processing order, Completed order, New order (admin), and any custom templates you use.
- Ensure each needed email is Enabled, recipient fields are correct, and “From” name/address look legitimate.
- Place a test order (or use an order-actions “Resend” if available) after each change.
Custom order statuses often need their own email wiring. Check the notification’s trigger and enabled state after every custom-status change.
Step 2: Replace PHP mail with SMTP
Shared hosts frequently throttle or silently drop mail(). Use an authenticated SMTP plugin or transactional provider.
- Match the From domain to a domain you control.
- Publish SPF, DKIM, and preferably DMARC for that domain.
- Send a test email to Gmail and a corporate inbox; check spam.
Step 3: Logging and conflict checks
Follow the evidence
WooCommerce generates transactional messages through WordPress wp_mail(). Where your installed version provides transactional email logs, check WooCommerce → Status → Logs → transactional-emails. Otherwise, inspect the SMTP provider or a mail logging plugin. A sent entry means the message was handed to the mail system; use provider delivery, bounce and deferral events to investigate whether it reached the recipient.
Reproduce conflicts on a staging copy before disabling a live store’s plugins or changing its theme. See the official WooCommerce email troubleshooting guide.
- Inspect email generation logs and provider delivery, bounce and deferral events. A sent log confirms hand-off, not inbox placement.
- On a staging copy, temporarily disable security or email-verification plugins that intercept checkout.
- On staging, switch to a default theme if a custom checkout template breaks hooks.
- Confirm the customer email on the order is valid.
Step 4: WP-Cron and queues
If emails queue but never leave, WP-Cron may be disabled (DISABLE_WP_CRON) without a system cron replacement, or a heavy site may starve cron. Set a real server cron to hit wp-cron.php, or use an Action Scheduler-aware host setup.
Do not “fix” deliverability with spoofed From addresses
Sending as @gmail.com from your server will fail SPF checks. Use your domain or the provider’s verified sender only.
Related store fixes
After mail works: fix shipping surprises that trigger support mail storms (wrong shipping cost), and keep guest buyers able to view orders (guest order access).
FAQ: WooCommerce emails not sending
Why did WooCommerce emails suddenly stop?
Common triggers include expired SMTP credentials, a security-plugin update, or WP-Cron stopping after a migration.
Is WooCommerce broken if PHP mail works in a test plugin?
Not necessarily—check whether the specific order-status email is enabled and whether a custom status fires that template.
Do I need a paid email API?
Not always. Authenticated SMTP can work at low volume. Transactional APIs scale better and usually improve inbox placement.
Customers only miss Completed emails
Open the Completed order template and confirm it is enabled. Some stores stay on Processing and never flip to Completed—so the template never fires.
Sources and related guides
- WooCommerce email troubleshooting — Notification settings, generation logs and delivery checks.
- Guest order access — Help customers access order information.
Next step
Need WooCommerce help beyond this fix?
Custom checkout, shipping, catalog rules, and store architecture—scoped delivery, not endless hourly tickets.

Send a note
Have a correction, suggestion or a different interpretation? Send me a note.
SEND A NOTE