Customising WooCommerce Emails So They Arrive and Get Read
Template overrides, per-status content, transactional deliverability with SPF and DKIM, and why store emails land in spam.

In this article
Order emails are some of the most-read messages a store sends. Customers open the confirmation to check what they bought, the shipping email to find out when it arrives and the refund email to see their money is on its way. When those emails are plain, confusing or missing, customers contact support, and some never order again.
Most WooCommerce email guides start with design. This one starts with delivery, because a beautiful email in the spam folder is worth nothing. It then covers how to change the content safely, using settings, hooks and template overrides in that order of preference.
The email list WooCommerce sends, and who triggers each
WooCommerce lists its emails under WooCommerce, Settings, Emails. Some go to the store, such as new order, cancelled order and failed order. Others go to the customer: order on hold, processing order, completed order, refunded order, customer invoice or order details, customer note, reset password and new account. Each is triggered by an order status change or a specific action, and each can be enabled, disabled and given its own subject, heading and additional content.
Map these to your actual workflow before changing anything. A store that ships the same day may not need both processing and completed emails to say much; a store with long lead times may need the processing email to set expectations clearly. Payment methods matter too: bank transfer and cash on delivery orders usually start on hold or processing, which changes which email the customer sees first.
Why PHP mail fails and what to send through instead
By default WordPress sends email with wp_mail, which uses the server's PHP mail function unless a plugin changes it. On shared hosting, that mail often leaves from a server that is not authorised to send for your domain, uses a generic From address and has no DKIM signature. Mailbox providers see an unauthenticated message claiming to be from your store and treat it with suspicion.
The reliable fix is to send through an authenticated transactional email service or your business mail provider's SMTP relay, using an SMTP or API plugin that hooks into wp_mail. Use a From address on your own domain, such as orders@yourdomain.com, rather than a free mailbox. Keep marketing email on a separate service or subdomain, so a promotional campaign's complaint rate does not affect order confirmations.
SPF, DKIM and DMARC for a store domain
Three DNS records tell mailbox providers that your store's email is genuine. SPF lists the servers allowed to send for the domain. DKIM adds a cryptographic signature that proves a message was sent by an authorised service and was not changed in transit. DMARC tells receivers what to do when a message fails those checks, and asks them to send you reports.
Your email service provides the SPF include and the DKIM records to add. Make sure there is only one SPF record for the domain, combining all senders, because two separate SPF records make the check fail. Start DMARC with a monitoring policy, read the reports for a few weeks to confirm every legitimate sender passes, then tighten it. Google and Yahoo now require authentication for mail sent to their users, with stricter rules for bulk senders, and the same setup helps small stores reach every inbox.
- One SPF record that includes every service sending for the domain
- DKIM enabled and published for the transactional email service
- A DMARC record, starting with p=none and moving to quarantine once reports are clean
- A From address on your own domain that matches the authenticated domain
Hooks for adding content without touching a template
The safest way to change what an email says is through settings and hooks, because they survive WooCommerce updates. The additional content field on each email covers simple messages such as delivery times or return instructions. For conditional content, WooCommerce fires actions inside its templates, including woocommerce_email_before_order_table, woocommerce_email_after_order_table and woocommerce_email_customer_details, which receive the order, whether the email is for the admin and whether it is plain text.
A small function attached to one of those hooks can add a delivery estimate for a particular shipping method, care instructions for a product category or a note for orders paid by bank transfer. Check the email object or order status inside the function so the content appears only where it belongs, and output plain text when the email is in plain-text mode. Keep the code in a small plugin or a child theme's functions file, not in the parent theme.
Overriding templates in a child theme, safely across updates
When the layout itself must change, WooCommerce lets a theme override its templates. Copy the file from the plugin's templates/emails folder into a woocommerce/emails folder in your child theme, keeping the same name, and edit the copy. The email styles live in email-styles.php, and the header and footer in their own files, so a branded look often needs only those three.
Overrides have a maintenance cost. Each template carries a version number, and when WooCommerce updates a template, the System Status report lists your copy as outdated. An outdated override can miss new fields or fixes. Override as few files as possible, note why each exists, and review them after major WooCommerce updates. The child theme guide explains how to set one up correctly.
Testing: seed inboxes, spam scores and a real render check
Create real test orders for each payment method and move them through every status, so every email is actually sent. Use addresses at the main mailbox providers your customers use, and check whether each email arrives, lands in the inbox and shows the right content. Message headers will show whether SPF, DKIM and DMARC passed.
Check the rendering on a phone and in at least one desktop client, including dark mode, because email clients still handle HTML very differently. Keep the content simple: clear order details, the next step, a contact route and links back to the store. After any WooCommerce update, template change or email service change, repeat a short version of the test. The WooCommerce development guide and the checkout optimisation guide cover the rest of the order journey, and the WooCommerce development service explains how I can help.
Frequently asked questions
How do I customise WooCommerce order emails?
Start with WooCommerce, Settings, Emails, where each email has its own subject, heading and additional content. Use action hooks for conditional content, and override templates in a child theme only when you need to change the layout.
Why do WooCommerce emails go to spam?
Usually because they are sent from the web server without authentication, from an address that does not match an authorised sender for the domain. Sending through a transactional email service with SPF, DKIM and DMARC set up fixes most cases.
Can I add order details to a custom email?
Yes. WooCommerce passes the order object to its email hooks, so a small function can add order-specific content such as delivery estimates or instructions for a product category, without editing templates.
Should I use SMTP instead of the default PHP mail?
Yes for almost every store. An authenticated SMTP relay or email API gives better delivery, logs you can check and a sender address on your own domain. Default PHP mail on shared hosting is the most common reason order emails go missing.
Topics
- WooCommerce email customization
- WooCommerce email template override
- WooCommerce emails going to spam
- WooCommerce transactional email SMTP