WooCommerce order emails not sending or landing in spam? Here’s the fix

Customers not getting order confirmations? Why WooCommerce emails fail or land in spam, and how SMTP, SPF, DKIM and DMARC fix it for good.

A customer pays, waits for the confirmation email and gets nothing. Some write to ask whether the order went through. Some pay twice. A few open a dispute with their bank. And if the “New order” email to you is missing too, you only find out about the sale when you happen to open the dashboard.

The good news: missing WooCommerce emails almost always come down to the same few causes, and you can check most of them yourself in under an hour. This guide walks through them in the order we check them on client stores.

First, which problem do you have?

“Emails not working” is really two different problems, and the fix depends on which one you have:

  • The email is never sent. Nothing arrives anywhere, not even in spam. The problem is inside WordPress or on your server.
  • The email is sent but lands in spam, or is rejected. WordPress did its job, but Gmail, Outlook or Yahoo do not trust the message. The problem is your domain’s email setup.

The quickest test: place a test order using a Gmail address you own, then check the inbox, the spam folder and the Promotions tab. If it is in spam, skip to step 3. If it is nowhere, start at step 1. Short on time? We find the cause and fix it for you in one day.

Step 1: Make sure WooCommerce is actually sending it

Go to WooCommerce → Settings → Emails and open each email you care about: New order, Processing order, Completed order. Check three things:

  • The email is enabled. A plugin or a past change can switch one off.
  • For the New order email, the recipient is an address you actually read.
  • At the bottom of the Emails page, the “From” address is on your own domain, for example orders@yourshop.com, not a Gmail or Hotmail address.

Then look at the order itself. WooCommerce sends the customer email when the order changes status. An order stuck in “Pending payment” or “Failed” sends no confirmation to the customer, because from WooCommerce’s point of view nothing was paid. If your orders stay pending after a successful payment, the real problem is the payment gateway, not email.

To see whether WordPress tries to send at all, install a free mail logging plugin such as WP Mail Logging and place another test order. If the log shows the email with an error, WordPress tried and your server refused. If the log is empty, something in WordPress stopped it before it was sent.

Step 2: Stop relying on your web server to send mail

Out of the box, WordPress hands every email to the web server that hosts your site. That server was built to serve pages, not to deliver mail. It usually sends from an address and an IP that your domain has never vouched for, many hosts limit or block outgoing mail, and on shared hosting you share that reputation with every other site on the machine.

The fix is to send through a real email service using SMTP:

  1. Pick the service. If you already use Google Workspace, Microsoft 365 or your host’s email for your domain, start there. For stores with many orders, a transactional email service (Brevo, Postmark, Amazon SES and similar) is built for exactly this.
  2. Install an SMTP plugin such as WP Mail SMTP or FluentSMTP and connect it to that service.
  3. Use the same “From” address in the plugin and in WooCommerce, on your own domain.
  4. Send the plugin’s test email and confirm it arrives.

For many stores, this step alone brings the emails back. But if they now arrive in spam, or arrive at Gmail but not at Outlook, your domain is missing its authentication records.

Step 3: Add SPF, DKIM and DMARC to your domain

Gmail, Yahoo and Outlook now check every message for proof that it really comes from your domain. Mail without that proof is far more likely to go to spam, and some of it is rejected outright. The proof comes from three DNS records, which you add wherever your domain’s DNS is managed (your registrar, your host or Cloudflare):

  • SPF lists the servers allowed to send mail for your domain.
  • DKIM adds a signature to each message that the receiving server can check against a public key in your DNS.
  • DMARC tells receiving servers what to do when a message fails those checks, and can send you reports about it.

SPF. A domain must have exactly one SPF record, a TXT record on the domain itself. If you send through Google Workspace and a transactional service, both go into the same record. A typical one looks like this (the include values come from your providers):

v=spf1 include:_spf.google.com include:spf.your-provider.com ~all

Two SPF records on one domain is one of the most common mistakes we see, and it makes SPF fail for everything. Merge them into one.

DKIM. Your email service generates the key for you. In Google Workspace it is under Apps → Google Workspace → Gmail → Authenticate email; transactional services show it during domain setup. You add it as a TXT or CNAME record at a name like google._domainkey, then switch signing on in the service.

DMARC. Add a TXT record at _dmarc.yourshop.com. Start in monitoring mode, so nothing legitimate is blocked while you check the reports:

v=DMARC1; p=none; rua=mailto:dmarc@yourshop.com

Once the reports show that your real mail passes, you can tighten p=none to p=quarantine. DNS changes can take from a few minutes to a few hours to apply. For a deeper walkthrough of each record, see our plain-English guide to SPF, DKIM and DMARC.

Step 4: Test it properly

Place another test order to a Gmail address. Open the email, click the three dots and choose Show original. You want to see PASS next to SPF, DKIM and DMARC. If one says FAIL or NEUTRAL, that record still needs work: go back to step 3, or let us set the records up and test them for you. Repeat with an Outlook or Hotmail address, since Microsoft is often stricter than Google.

Other things that push store emails into spam

  • A “From” address that does not match the sending service. Sending as orders@yourshop.com through an account set up for another domain fails the checks above.
  • A no-reply address nobody reads. Customers reply to order emails. Use a real address, or at least set a reply-to you check.
  • Heavy templates. Big images, many links and very little text look like marketing mail. Keep order emails simple.
  • A domain or server on a blocklist. If your site was ever hacked and used to send spam, check your domain and server IP on a blocklist checker.

Quick checklist

  • Order emails enabled, with the right recipient and a “From” address on your domain
  • Orders move to Processing after payment
  • WordPress sends through SMTP, not the web server
  • One SPF record that includes every service you send from
  • DKIM signing switched on
  • A DMARC record, starting with p=none
  • Test orders show PASS for SPF, DKIM and DMARC in Gmail and Outlook

Every order email that reaches the inbox is one less “did my order go through?” message, and one less customer wondering whether to trust your shop.