WooCommerce email log: what Woo records, and what it misses
Published Updated View as Markdown
Where the WooCommerce email log lives since 10.9, what each entry holds, what it leaves out, and how to log the rest of your site's email with the message kept.
A customer says the order confirmation never came. Until recently WooCommerce had nothing to say about that: the email went through wp_mail() and vanished. Since WooCommerce 10.9 there is a WooCommerce email log built into the plugin, and for the emails WooCommerce itself sends, it answers the first question: did the site try, and did the send succeed?
This guide covers where that log is, what an entry holds, what it leaves out, and how to keep a fuller record of every email the site sends, order emails included.
Where the WooCommerce email log lives
Open WooCommerce → Status → Logs and pick the source transactional-emails. Every time WooCommerce sends one of its own emails, such as a new order, a completed order or a customer invoice, a line is written there. The log lives wherever your other WooCommerce logs do: as files under wp-content/uploads/wc-logs/ by default, or in the database if you have switched log storage over.
The same information appears on the order itself. Each order gets a note when one of its emails is sent or fails, so the order screen shows that order’s email trail without a trip to the logs page. An email WooCommerce decided not to send leaves no note.
WooCommerce announced the feature for 10.9 in June 2026. If your Woo is older than that, the source is not there, and updating WooCommerce is the first step.
What each entry records
A log line carries a handful of fields:
- email_type: which WooCommerce email it was, such as
customer_processing_orderornew_order. - status: one of
sent,failed,disabledorskipped. - recipient: not the email address. WooCommerce looks the address up and writes the matching username, or
guestwhen no account has that address. Addresses are not written to the log. - reason, when the email was skipped, and the order, product or user it belonged to.
The four statuses are worth reading closely. Sent means wp_mail() returned success, which is to say the mail server accepted the message. It is not proof the email reached the inbox. Failed means the send returned an error, and the error text is kept. Disabled means that email type is switched off under WooCommerce → Settings → Emails, so nothing was tried. Skipped means WooCommerce chose not to send it for some other reason, and the reason field says why.
One caveat WooCommerce itself notes: the failure reason comes from the site-wide wp_mail_failed hook, so if another plugin’s email fails between WooCommerce starting a send and its own failure hook running, the error can be attached to the wrong email.
What it leaves out
The WooCommerce email log is good at what it sets out to do: for each Woo email, it says whether a send was attempted and what came back. It is not a copy of your outgoing mail, and it is not a log of your site’s email. Two gaps matter when chasing a missing message.
It only covers WooCommerce’s own emails. The password reset from the login page, the contact form notification, the membership renewal reminder, the comment notification, the message from your newsletter plugin: none of these go through WooCommerce, so none of them appear. Everything else on the site still sends through wp_mail() and leaves no record.
It does not keep the message. An entry names the email type and the username of the recipient. There is no subject, no body, no headers and no attachment list. When a customer says the confirmation arrived but showed the wrong shipping address, or asks what the email actually said, the WooCommerce log cannot show you. You know the send happened, and that is all.
And because addresses are mapped to usernames, you cannot look an entry up by email address. For a guest order you get guest, which is every guest.
If you want the log gone, one line turns it off:
add_filter( 'woocommerce_email_log_enabled', '__return_false' );
How long entries are kept follows the same retention setting as the rest of WooCommerce’s logs, under WooCommerce → Status → Logs → Settings.
Log every email, including WooCommerce’s
To answer “what did the site send, to whom, and what did it say?”, you need a log that sits on wp_mail() itself rather than inside one plugin. That is what Adminkeep’s Email Log does. Adminkeep is a free plugin made of small features that each have one switch, and its Email Log works as a standalone free email log plugin alongside WooCommerce’s own log. Neither one changes how email is sent, so they run side by side.
For each email the site sends, whoever sent it, the log holds the recipient, the sender, the subject, the Cc, Bcc and Reply-To headers, attachment names, and the content. Each row is marked Sent, Failed or Unconfirmed, and a failed row keeps the error that came back. Open any row and the email is shown the way it went out, HTML rendered as a mail client would draw it, with a plain-text tab when the email carried both versions, as order emails usually do. The guide to checking whether WordPress sent an email walks through what each status means and how to find a failed send fast.
For a WooCommerce site that means:
- A new order email shows up in both logs. WooCommerce’s says
sent; Adminkeep’s shows the email itself, with the order lines, the totals and the address the customer saw. - A password reset, a form message or a membership email shows up only in Adminkeep’s log, because WooCommerce did not handle it.
- Search works by email address. Set the status to Failed, type the customer’s address, and the rows are there.
Setting it up takes a minute: go to Settings → Adminkeep, switch on Email Log in the Email group, and save. From then on Email Log, its own item in the admin menu, lists every email the site sends. Installation covers the rest.
One honest limit applies to both logs: a log only records emails sent after it is switched on. Neither WooCommerce’s nor Adminkeep’s can tell you about the order email that went missing last week. They can tell you about the next one.
Two logs, two jobs
Keep WooCommerce’s log. It costs nothing, it puts a note on the order, and its disabled and skipped statuses explain the case where nothing was sent because of an email setting rather than a mail problem, which a wp_mail() log cannot see. Use Adminkeep’s log for everything else: the emails WooCommerce does not send, the content of the ones it does, and searching by address.
Two things to know about keeping a copy of every email. Adminkeep replaces password-reset, sign-in and account-activation links with [link removed] before an email is stored. And entries expire: the default is 30 days, and the log is trimmed to its newest 10,000 rows, which a busy shop can reach sooner than you might think. Pick the shortest period that still covers the questions you actually get.
When both logs show a Woo email as sent and the customer still has nothing, the problem is past your site, and that usually means how your domain is authenticated. The SMTP settings guide covers that part.
Questions people ask
Where is the WooCommerce email log?
Under WooCommerce → Status → Logs, in the source called transactional-emails. It arrived in WooCommerce 10.9 and is on by default. Each order also gets a note when one of its emails is sent or fails.
Does the WooCommerce email log store the email itself?
No. An entry records the email type, its status and the recipient's username, not the subject, body or headers. To see what an order email said, you need a log that keeps the message.
Does the WooCommerce email log record password resets or contact form emails?
No. It only covers the emails WooCommerce sends. Password resets, form notifications and anything else sent through wp_mail() are not in it.
How do I turn the WooCommerce email log off?
Add add_filter( 'woocommerce_email_log_enabled', '__return_false' ) to a small plugin or your theme's functions file. Retention for what is already logged follows the settings under WooCommerce → Status → Logs.