{"id":394,"date":"2026-09-10T12:34:33","date_gmt":"2026-09-10T18:04:33","guid":{"rendered":"https:\/\/photonconsole.com\/blog\/?p=394"},"modified":"2026-09-14T07:24:34","modified_gmt":"2026-09-14T12:54:34","slug":"woocommerce-order-emails-not-sending-diagnosis-and-fix","status":"publish","type":"post","link":"https:\/\/photonconsole.com\/blog\/woocommerce-order-emails-not-sending-diagnosis-and-fix\/","title":{"rendered":"WooCommerce Order Emails Not Sending: Diagnosis and Fix"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A customer places an order. Payment goes through. The order appears in your dashboard. And no confirmation email arrives \u2014 not for the customer, and sometimes not for you either.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Support tickets follow within hours. Customers assume the order failed and place it again, or request a refund. For a store, this is not a minor annoyance: order confirmations are the receipt customers rely on, and missing them costs real revenue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The frustrating part is that WooCommerce almost never tells you anything is wrong. This guide works through the diagnosis in the order that finds the cause fastest, then covers the fixes for each.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quick Answer: Why Are WooCommerce Emails Not Sending?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are four independent reasons, and they fail in sequence. An order email only arrives if all four pass:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>The email type is enabled<\/strong> in WooCommerce, then Settings, then Emails<\/li>\n\n\n\n<li><strong>The order status changed<\/strong> to one that triggers that email<\/li>\n\n\n\n<li><strong>WordPress can send mail at all<\/strong> \u2014 <code>wp_mail()<\/code> is working<\/li>\n\n\n\n<li><strong>The receiving server accepted it<\/strong> \u2014 your domain passes authentication<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Most store owners start at step three and never check steps one and two, which is where the problem usually is. Work through them in order. If step three turns out to be the failure, routing mail through an authenticated relay such as <a href=\"https:\/\/www.photonconsole.com\/\">PhotonConsole<\/a> resolves it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Which Emails WooCommerce Sends, and What Triggers Them<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_50_32-PM-1024x576.png\" alt=\"\tMap of WooCommerce order statuses and which customer and admin emails each status triggers\" class=\"wp-image-405\" style=\"aspect-ratio:1.7777777777777777;width:1200px;height:auto\" srcset=\"https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_50_32-PM-1024x576.png 1024w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_50_32-PM-300x169.png 300w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_50_32-PM-768x432.png 768w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_50_32-PM-1536x864.png 1536w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_50_32-PM.png 1672w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Each notification is tied to a specific order status. Pending payment triggers no customer email.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">WooCommerce does not send one &#8220;order email&#8221;. It sends a set of separate notifications, each tied to a specific order status. If the status never reaches the trigger, the email is never queued.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Email<\/th><th>Sent to<\/th><th>Triggered when the order becomes<\/th><\/tr><\/thead><tbody><tr><td>New order<\/td><td>Admin<\/td><td>Processing, Completed or On-hold<\/td><\/tr><tr><td>Processing order<\/td><td>Customer<\/td><td>Processing<\/td><\/tr><tr><td>Completed order<\/td><td>Customer<\/td><td>Completed<\/td><\/tr><tr><td>Order on-hold<\/td><td>Customer<\/td><td>On-hold<\/td><\/tr><tr><td>Cancelled order<\/td><td>Admin<\/td><td>Cancelled<\/td><\/tr><tr><td>Failed order<\/td><td>Admin<\/td><td>Failed<\/td><\/tr><tr><td>Refunded order<\/td><td>Customer<\/td><td>Refunded<\/td><\/tr><tr><td>Invoice \/ order details<\/td><td>Customer<\/td><td>Sent manually from the order screen<\/td><\/tr><tr><td>New account<\/td><td>Customer<\/td><td>Account created at checkout<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Notice what is absent: there is no customer email for <strong>Pending payment<\/strong>. An order stuck at that status is the single most common reason a customer receives nothing, and the order still appears in your dashboard, which is why it looks like an email fault rather than a payment one.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Match the Symptom to the Cause<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The pattern of what fails usually points straight at the cause.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Symptom<\/th><th>Most likely cause<\/th><th>Check first<\/th><\/tr><\/thead><tbody><tr><td>No emails at all, site-wide<\/td><td>WordPress cannot send mail<\/td><td>SMTP plugin test email<\/td><\/tr><tr><td>Admin emails arrive, customer ones do not<\/td><td>Order status never triggered it<\/td><td>Order status on a test order<\/td><\/tr><tr><td>Manual resend works, automatic does not<\/td><td>Trigger condition, not delivery<\/td><td>Email enabled setting and status<\/td><\/tr><tr><td>Emails arrive hours late<\/td><td>WP-Cron not running<\/td><td>Replace with a server cron job<\/td><\/tr><tr><td>Works normally, fails during sales<\/td><td>Hosting hourly send limit<\/td><td>Host mail limit in the control panel<\/td><\/tr><tr><td>Emails send but land in spam<\/td><td>Missing SPF or DKIM<\/td><td>Deliverability checker on your domain<\/td><\/tr><tr><td>Stopped after an update<\/td><td>Template override or plugin conflict<\/td><td>WooCommerce, Status for overrides<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step-by-Step Diagnosis<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"512\" src=\"https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_52_05-PM-1024x512.png\" alt=\"\tFour checkpoints a WooCommerce order email must pass: notification enabled, order status changed, WordPress able to send, and receiving server accepts\" class=\"wp-image-406\" style=\"aspect-ratio:1.7777777777777777;width:1200px;height:auto\" srcset=\"https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_52_05-PM-1024x512.png 1024w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_52_05-PM-300x150.png 300w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_52_05-PM-768x384.png 768w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_52_05-PM-1536x768.png 1536w, https:\/\/photonconsole.com\/blog\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-Sep-14-2026-12_52_05-PM.png 1774w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Four checkpoints an order email must pass before it reaches the customer.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Work through these in order. Each step rules out a whole category of cause, so skipping ahead usually wastes time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Check Whether the Email Type Is Enabled<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Go to WooCommerce, then Settings, then Emails. Each notification has its own enabled toggle, its own recipient, and its own subject line. Confirm the specific email you expect is switched on.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pay attention to the <strong>recipient field on admin emails<\/strong>. It defaults to the site admin address, which on many installs is an address nobody monitors, or one that no longer exists.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Check the Order Status<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Open the order and look at its status. If it reads <strong>Pending payment<\/strong>, no customer email was triggered and nothing is broken in your mail configuration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Orders sit at pending payment when the payment gateway never confirmed the transaction. Common causes are a failed gateway callback, a webhook that could not reach your site, or a customer abandoning the payment page after the order was created.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common Mistake<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Debugging SMTP settings for hours when the real problem is that orders never leave Pending payment. Before touching any mail configuration, place a test order and watch whether the status moves to Processing. If it does not, the issue is the payment gateway callback, not email. Fixing SMTP will change nothing.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Test Whether WordPress Can Send Any Mail<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Install an SMTP plugin and send its built-in test email, or trigger a password reset for a test account. If neither arrives, the problem is WordPress-wide rather than WooCommerce-specific.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By default WordPress uses the PHP <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_mail\/\" target=\"_blank\" rel=\"noopener\"><code>wp_mail()<\/code><\/a> function, which sends unauthenticated mail directly from your web server. Most hosts block it and most mailbox providers filter it. Our guide to <a href=\"https:\/\/photonconsole.com\/blog\/smtp-not-working\/\">SMTP not working<\/a> covers the full set of failure modes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Resend the Email Manually<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Open the order, find the <strong>Order actions<\/strong> box in the sidebar, choose an email from the dropdown, and click the arrow to send.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is a useful diagnostic. If the manual resend arrives but the automatic one never did, the mail connection is fine and the problem is the trigger \u2014 meaning step two is where to look. If the manual resend also fails, the problem is delivery.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5: Check the WooCommerce Logs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Go to WooCommerce, then Status, then Logs. Fatal errors during checkout can stop execution before the email hook runs, which produces an order that saved correctly with no notification sent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also check WooCommerce, then Status, and look at the system report for a flagged template override, covered in step seven.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6: Test for a Plugin Conflict<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Other plugins hook into the same email actions. A booking plugin, an invoice generator or a marketing tool can unhook WooCommerce&#8217;s own notifications, replace them, or throw an error that halts them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Deactivate plugins in batches on a staging site, testing an order after each batch. Do not do this on a live store during trading hours.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 7: Check for Outdated Template Overrides<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If your theme contains a <code>woocommerce\/emails\/<\/code> folder, those files override WooCommerce&#8217;s own templates. When WooCommerce updates its template structure, an outdated override can break rendering or stop the email entirely.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">WooCommerce, then Status shows any overrides that are out of date. The fix is to update the override to match the new template version, or remove it if the customisation is no longer needed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quick Fix<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No Order Emails At All<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Confirm the email type is enabled under WooCommerce, Settings, Emails<\/li>\n\n\n\n<li>Place a test order and confirm the status moves past Pending payment<\/li>\n\n\n\n<li>Send a manual resend from the Order actions box to isolate trigger from delivery<\/li>\n\n\n\n<li>Send an SMTP plugin test email to check WordPress can send anything<\/li>\n\n\n\n<li>Check WooCommerce, Status, Logs for fatal errors during checkout<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Delayed Emails and WP-Cron<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Some WooCommerce notifications are dispatched through the scheduler rather than immediately. WordPress runs its scheduler, <a href=\"https:\/\/developer.wordpress.org\/plugins\/cron\/\" target=\"_blank\" rel=\"noopener\">WP-Cron<\/a>, only when someone visits the site.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On a low-traffic store that means scheduled tasks can sit unrun for hours. Orders placed overnight produce emails that arrive the next morning, or not at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The fix is to disable WP-Cron and replace it with a real server cron job:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ wp-config.php\ndefine( 'DISABLE_WP_CRON', true );<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Server crontab \u2014 run every five minutes\n*\/5 * * * * curl -s https:\/\/yourstore.com\/wp-cron.php?doing_wp_cron &gt;\/dev\/null 2&gt;&amp;1<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Logging Every Email Attempt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Without a log there is no way to know whether WordPress attempted a send at all, which is the first thing you need to establish. A mail logging plugin does this, or you can add a small mu-plugin:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/**\n * wp-content\/mu-plugins\/mail-logger.php\n * Records every wp_mail() attempt and every failure.\n *\/\n\nadd_filter( 'wp_mail', function ( $args ) {\n    error_log( sprintf(\n        'MAIL ATTEMPT: to=%s subject=%s',\n        is_array( $args&#91;'to'] ) ? implode( ',', $args&#91;'to'] ) : $args&#91;'to'],\n        $args&#91;'subject']\n    ) );\n    return $args;\n} );\n\nadd_action( 'wp_mail_failed', function ( $error ) {\n    error_log( 'MAIL FAILED: ' . $error-&gt;get_error_message() );\n} );<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This tells you immediately which of the two situations you are in: no attempt logged means the trigger never fired, while an attempt followed by a failure means the problem is the mail connection.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Triggering an Order Email in Code<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Useful for testing, and for re-sending after fixing a broken order:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Trigger the customer processing-order email for a specific order\n$order_id = 12345;\n\n$mailer = WC()-&gt;mailer();\n$emails = $mailer-&gt;get_emails();\n\nif ( isset( $emails&#91;'WC_Email_Customer_Processing_Order'] ) ) {\n    $emails&#91;'WC_Email_Customer_Processing_Order']-&gt;trigger( $order_id );\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Run this from WP-CLI or a temporary admin-only snippet. If it sends successfully, your mail configuration is working and the fault is in the trigger conditions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Store Emails Get Filtered Even When They Send<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A message accepted by the receiving server can still land in spam. Order confirmations are especially vulnerable because they contain prices, links and order numbers \u2014 patterns that spam filters weigh heavily when the sending domain is not authenticated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Publish SPF and DKIM records so receiving servers can verify your store is authorised to send. Our guide to <a href=\"https:\/\/photonconsole.com\/blog\/spf-dkim-dmarc-explained-simply\/\">SPF, DKIM and DMARC<\/a> explains the records, and the free <a href=\"https:\/\/www.photonconsole.com\/email-deliverability-checker.php\">email deliverability checker<\/a> shows what your domain currently publishes. Both matter more for stores than for ordinary sites, because <a href=\"https:\/\/support.google.com\/mail\/answer\/81126\" target=\"_blank\" rel=\"noopener\">Google&#8217;s sender guidelines<\/a> apply the same authentication expectations to transactional mail as to bulk sending.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quick Fix<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Order Emails Land in Spam<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Publish SPF and DKIM records for your sending domain<\/li>\n\n\n\n<li>Send from an address on your own domain, never a Gmail or Yahoo address<\/li>\n\n\n\n<li>Make sure the from address is a real mailbox that can receive bounces<\/li>\n\n\n\n<li>Check you do not publish two separate SPF records, which breaks authentication<\/li>\n\n\n\n<li>Score a real order email with a deliverability testing tool before peak trading<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Hosting Limits During Sales Periods<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Shared hosting commonly caps outbound mail at between 50 and 500 messages per hour. A store sending order, processing, completed and invoice emails generates three or four messages per purchase, plus admin copies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">During a sale or a campaign launch that ceiling is reached quickly, and every remaining message for the hour is discarded with no error. The symptom is distinctive: emails work normally most of the time and fail in batches exactly when the store is busiest.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sending through an external relay removes the cap entirely, because mail no longer leaves through your host&#8217;s mail server. For stores sending at volume, our <a href=\"https:\/\/www.photonconsole.com\/ecommerce-retail.php\">ecommerce email infrastructure page<\/a> covers the requirements in more depth.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuring WooCommerce With PhotonConsole<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These settings work with any SMTP plugin, or with the code method described in our guide to <a href=\"https:\/\/photonconsole.com\/blog\/wordpress-not-sending-email-fix\/\">fixing WordPress email<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SMTP Host:      smtp.photonrelay.com\nSMTP Port:      587          (465 for SSL, 2525 if 587 is blocked)\nEncryption:     TLS\nAuthentication: On\nUsername:       your_project_api_user\nPassword:       your_secret_api_key\nFrom Address:   orders@yourstore.com\nFrom Name:      Your Store Name<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">DNS Records<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>TXT    @                    v=spf1 include:relay.photonconsole.com ~all\nCNAME  photon._domainkey    dkim.photonconsole.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Note<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DNS changes are not instant. SPF and DKIM records can take from a few minutes to 24-48 hours to propagate depending on your registrar and TTL settings. Make this change outside a sale period, and verify with a lookup tool before assuming a record is wrong.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Port 2525 exists for hosts that block the standard SMTP ports. Every PhotonConsole account includes 5,000 free emails per month, which covers a small store indefinitely and lets a larger one validate the full setup before committing. Details are on the <a href=\"https:\/\/www.photonconsole.com\/relay.php\">PhotonRelay page<\/a>, and <a href=\"https:\/\/www.photonconsole.com\/pricing.php\">pricing<\/a> has no monthly minimum.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pro Tips for Store Owners<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Send from your store domain, not a free mailbox.<\/strong> An order confirmation from a Gmail address fails authentication and looks untrustworthy to customers.<\/li>\n\n\n\n<li><strong>Monitor the admin recipient address.<\/strong> Many stores discover months later that new-order notifications were going to an address nobody reads.<\/li>\n\n\n\n<li><strong>Test after every WooCommerce or theme update.<\/strong> Template overrides break silently, and orders keep completing while notifications stop.<\/li>\n\n\n\n<li><strong>Keep marketing mail on a separate connection.<\/strong> A newsletter that triggers complaints should never be able to affect order confirmation delivery.<\/li>\n\n\n\n<li><strong>Verify DNS after any registrar change.<\/strong> Moving DNS providers frequently drops TXT records, and SPF disappears unnoticed until delivery drops.<\/li>\n\n\n\n<li><strong>Check delivery before peak trading.<\/strong> <a href=\"https:\/\/www.mail-tester.com\/\" target=\"_blank\" rel=\"noopener\">Mail Tester<\/a> scores a real send, and <a href=\"https:\/\/mxtoolbox.com\/\" target=\"_blank\" rel=\"noopener\">MXToolbox<\/a> confirms your records resolve correctly.<\/li>\n\n\n\n<li><strong>Keep a mail log permanently enabled.<\/strong> When a customer disputes receiving a confirmation, the log settles it.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Related Issues You May Hit Next<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/photonconsole.com\/blog\/wordpress-not-sending-email-fix\/\">WordPress not sending email<\/a> when the problem affects the whole site<\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/smtp-authentication-error\/\">SMTP authentication errors<\/a> when credentials are rejected<\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/why-emails-go-to-spam-in-gmail\/\">Emails landing in Gmail spam<\/a> despite sending successfully<\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/emails-sent-but-not-delivered\/\">Emails sent but not delivered<\/a> when the server reports success<\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/emails-delayed\/\">Emails arriving late<\/a> when delivery is slow rather than failing<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently Asked Questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Why do I get admin order emails but customers do not?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Admin and customer notifications are separate emails with separate triggers. The New order admin email fires on several statuses, while customer emails are tied to one status each. Admin mail arriving proves your mail connection works, so the fault is the customer email&#8217;s trigger or its enabled setting.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why did order emails stop after a plugin update?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Either a plugin conflict where another plugin now hooks the same action, or a template override in your theme that no longer matches WooCommerce&#8217;s current template version. Check WooCommerce, Status for flagged overrides first.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does WooCommerce send emails for pending orders?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No customer email is sent for Pending payment. That is by design \u2014 the order is not confirmed until payment completes. If customers report no confirmation, check whether their orders are reaching Processing.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I resend a WooCommerce order email?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Open the order, use the Order actions dropdown in the sidebar, select the email, and click the send arrow. This is also the fastest way to separate a trigger problem from a delivery problem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How many emails does one order generate?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Typically three or four: the admin new-order notice, the customer processing email, the customer completed email, and often an invoice. A store processing 100 orders a day can send over 300 messages, which exceeds many shared hosting hourly limits.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why do order emails arrive hours late?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Usually WP-Cron. On low-traffic stores the scheduler only runs when someone visits the site, so scheduled tasks wait for the next visitor. Replacing WP-Cron with a server cron job fixes it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Should transactional and marketing email use the same setup?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No. Keep them separate. If marketing mail attracts spam complaints, shared sending reputation can push order confirmations into the spam folder too, which is a far more costly failure.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WooCommerce email problems look mysterious because four independent systems have to work in sequence and none of them reports a failure clearly. The order must reach a triggering status, the notification must be enabled, WordPress must be able to send, and the receiving server must accept the message.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diagnose in that order and the cause usually surfaces within minutes. Most of the time it is one of two things: orders sitting at Pending payment because the gateway never confirmed, or WordPress unable to send authenticated mail at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The second is worth fixing permanently rather than repeatedly. Routing store mail through a dedicated <a href=\"https:\/\/www.photonconsole.com\/relay.php\">transactional email solution<\/a> removes hosting send limits, adds authentication, and gives you delivery logs \u2014 so the next time a customer says a confirmation never arrived, you can check rather than guess.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Read More<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.photonconsole.com\/email-deliverability-checker.php\">Free Email Deliverability Checker<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/wordpress-not-sending-email-fix\/\">Fixing WordPress Not Sending Email<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/spf-dkim-dmarc-explained-simply\/\">SPF, DKIM and DMARC Explained Simply<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/improve-email-deliverability\/\">How to Improve Email Deliverability<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/photonconsole.com\/blog\/smtp-configuration\/\">SMTP Configuration: Complete Setup Reference<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.photonconsole.com\/relay.php\">PhotonRelay: SMTP Relay Service<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.photonconsole.com\/pricing.php\">PhotonConsole Pricing<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A customer places an order. Payment goes through. The order appears in your dashboard. And no confirmation email arrives \u2014 not for the customer, and sometimes not for you either. Support tickets follow within hours. Customers assume the order failed and place it again, or request a refund. For a store, this is not a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":403,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[312],"tags":[529,526,517,528,527],"class_list":["post-394","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-email-engineering-guide","tag-woocommerce-customer-email-not-received","tag-woocommerce-email-settings","tag-woocommerce-emails-not-sending","tag-woocommerce-not-sending-confirmation-email","tag-woocommerce-order-email-not-sending"],"_links":{"self":[{"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/posts\/394","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/comments?post=394"}],"version-history":[{"count":2,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/posts\/394\/revisions"}],"predecessor-version":[{"id":407,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/posts\/394\/revisions\/407"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/media\/403"}],"wp:attachment":[{"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/media?parent=394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/categories?post=394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/photonconsole.com\/blog\/wp-json\/wp\/v2\/tags?post=394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}