Why aren't donors getting their donation receipt emails?

A diagnosis order for the person who looks after a small nonprofit's WordPress site, from "was the gift recorded?" to "how do I get them a receipt today?"

Short answerUsually one of three things: the gift was never marked completed on your site, so no receipt was sent; your web server's built-in mail is being blocked or limited; or your domain isn't set up to prove the mail is really from you (SPF, DKIM and DMARC), so Gmail, Yahoo or Outlook files it as spam. Check them in that order. The usual fix is an SMTP plugin connected to a real email service, the DNS records that service gives you, and a From address on your organization's own domain.

When a donor writes "I never got a receipt," work through the five checks below in order. Each one rules out a cause, and the early ones take a minute or two. The mailbox providers' rules quoted here are from their own pages, read in November 2026. They change them, so check the linked page before you act.

Was the gift actually recorded as completed?

Check this first, because no email setting matters if the site never sent a receipt. Donor Merchant sends the donation receipt at the moment the payment is confirmed and the gift becomes Completed, and not before. Open Donor Merchant → Donations and find the gift. The donor's email address is shown under their name.

What you seeWhat it means
CompletedThe site sent the receipt to the address shown, unless the gift was imported, added by hand without "Email a receipt to the donor" ticked, or set to Completed with the Mark completed row action. Go to the next check. If the address has a typo, that's your answer.
Pending, or no gift at all, while Stripe or PayPal shows it paidThe payment was never confirmed back to your site, which is a webhook problem, not an email problem. Follow Stripe says the donation succeeded but WordPress never recorded it.
ProcessingA bank (ACH) payment that is still clearing. The receipt goes when it clears, usually a few business days later.
Awaiting paymentA check or bank transfer the donor promised. The receipt goes when you click Mark received with "Email the donor a receipt" ticked.

Two things to know. If a stuck gift is later completed by Stripe's or PayPal's notification to your site (for example after you fix the webhook and resend the event), the receipt goes out then. Try that first: once a gift is already Completed, a resent notification sends nothing. If you fix the record yourself with the Mark completed row action, nothing is emailed. Status corrections never email donors. Also look at Settings → Email: the list shows whether Donation receipt is enabled.

Can your site send any email at all?

Find out with a test email. Open Donor Merchant → Settings → Email, type an address you can check, and click Send a test email. It uses sample donor details and your unsaved changes, and the subject starts with "[Test]". Send one to a Gmail address and one to an Outlook or Yahoo address if you have them, because each provider filters differently.

Read the result carefully. "The test email could not be sent. Check your site's email setup." means your server refused to send it. "Test email sent to..." only means the site handed the message over. WordPress's own code says "A true return value does not automatically mean that the user received the email successfully." If the test never arrives, or lands in spam, keep going.

Here is why this fails so often. WordPress sends mail through a function called wp_mail(), and out of the box that uses PHP's mail() on your web server. The server sends it directly, with no email account behind it. Hosts can restrict this. WP Engine, for example, says "we impose a hard limit on the amount of emails that can be sent in an hour," says its infrastructure providers "do not allow mail to be sent over port 25," and "recommends using 3rd party email hosts." Your host's help pages will say what applies to you.

The fix is to send through a real email service instead. An SMTP plugin does that: it routes everything WordPress sends through an account you control. Free options on WordPress.org include WP Mail SMTP, FluentSMTP and Post SMTP. You connect it to either your organization's email provider (the one that hosts your staff mailboxes) or a transactional email service, which is a company that sends automated mail like receipts for you. Any of them is fine. Pick the one your host or email provider documents.

Where Donor Merchant fitsDonor Merchant sends every email through wp_mail(), so once an SMTP plugin is working, receipts use it with no extra setup. The plugin doesn't include a mail service of its own. Some SMTP plugins keep a log of sent mail (Post SMTP's listing names email logs as a feature), which helps you prove whether a receipt left the site.

Is your domain set up to prove the mail is yours?

If mail arrives but goes to spam, this is the usual cause. Three settings in your domain's DNS (the records your domain registrar or DNS host keeps) tell mailbox providers your mail is genuine:

  • SPF is a list of the servers allowed to send mail for your domain. The standard describes it as letting a domain's owners "explicitly authorize the hosts that are allowed to use their domain names."
  • DKIM is a digital signature on each message, checked against a key published in your DNS. It shows your domain takes responsibility for the message.
  • DMARC ties the two to the address donors see in "From" and tells providers what to do with mail that fails: none (just watch), quarantine (treat as suspicious) or reject. It is defined in RFC 9989 (May 2026).

Your email service gives you the exact records to add. One trap: a domain may have only one SPF record (RFC 7208, section 3.2). If you already have one for your staff mail, add the new service to it instead of creating a second.

What do Gmail, Yahoo and Outlook actually require?

The strict rules are for high-volume senders, but every sender has a baseline, and a small nonprofit benefits from meeting the strict ones anyway.

ProviderEvery senderHigh-volume senders
GmailSPF or DKIM; spam complaints below 0.3%; "Don't impersonate Gmail From: headers"About 5,000 or more messages a day to personal Gmail: SPF and DKIM, DMARC (p=none is fine), From domain aligned
Yahoo"SPF or DKIM at a minimum"; spam rate below 0.3%Bulk senders (Yahoo publishes no number): SPF and DKIM, DMARC at least p=none that passes, From domain aligned
Outlook.comNo separate list; Microsoft says "all senders benefit from these best practices"More than 5,000 a day: SPF and DKIM pass, DMARC at least p=none. Failing mail went to Junk from May 2025; Microsoft's support page now describes it being rejected with error 550 5.7.515

Your receipts alone are unlikely to reach 5,000 a day. But Google says "Messages sent from the same primary domain count toward the 5,000 limit," so a newsletter sent from the same domain counts too, and anyone who crosses it once is "permanently considered" a bulk sender. Yahoo says it "strongly urges all senders to publish a DMARC policy." Setting up all three costs nothing.

To check a received message, open it in the Gmail app and tap "View details", then "View security details". "Mailed by" and "Signed by" show the domains that passed SPF and DKIM. Google says a question mark next to the sender's name means the message isn't authenticated.

Is the From address on your organization's own domain?

It needs to be. DMARC checks that the domain in the From address matches a domain that passed SPF or DKIM. RFC 9989 calls this alignment, and by default it allows a subdomain of the same domain to count. Your web server is not authorized to send mail for gmail.com or yahoo.com, so a receipt "from" [email protected] fails that check however well the rest is set up.

For some providers it's worse than spam. Yahoo and AOL publish a DMARC policy of p=reject for their own domains (DNS records read 6 November 2026), which asks receiving servers to refuse mail claiming to come from them that they didn't send. gmail.com currently publishes p=none, but Google's rule above still applies.

In Donor Merchant, open Settings → Email → Sender. Set the "From" name (your organization's name), and a "From" address on your domain, such as [email protected]. If you leave the address blank, the plugin uses the email address from Settings → General, and if that's blank too, the WordPress admin email. If replies should reach a personal inbox, put that in "Reply-to". DMARC only checks the From address, so the reply-to can be any address. If your SMTP plugin has its own From setting, make it match.

Where did the donor's copy go?

If your tests arrive in the inbox and the donor's gift shows Completed, the receipt most likely reached them and was filed away. Ask them to search their whole mailbox for your organization's name, including Spam. In Gmail, Spam is under More → Spam, and the "Not spam" button moves a message back. Gmail may also sort receipts into the Promotions or Updates tab. Google says dragging a message to the right tab "helps Gmail learn your preferences."

For one-time Stripe gifts there is often a second copy. Donor Merchant gives Stripe the donor's email, and Stripe says it then "sends a receipt to that address when the payment succeeds in live mode." That one comes from Stripe, so ask the donor to search for it too.

How do you get the donor their receipt now?

Donor Merchant has no "resend receipt" button. The receipt email goes once, when the gift completes. These are the routes that exist:

  1. The donor portal. If you have a portal page (Settings → General can create it for you), the donor enters their email, clicks Email me a link, and sees their completed gifts, each with a View / print link to its printable receipt, plus annual statements. The sign-in link is sent by your site too, so fix sending first. See the donor portal.
  2. Offline gifts not yet marked received. Use Mark received and leave "Email the donor a receipt" ticked.
  3. Stripe's own receipt. In the Stripe Dashboard, open Transactions → Payments, click the payment, then under Receipt history choose the ⋯ menu and Send receipt. This is Stripe's payment receipt, not your donation receipt, so it won't carry your receipt wording or statement text.
  4. Write to the donor yourself. From your organization's mailbox, send the amount, date and transaction ID shown in the Donations list, plus whatever your normal receipt says, and tell them about the portal for next time.

If you'd rather someone walk through these checks with you on your own site, that is what our support plans are for. The plugin and every feature stay free either way.

Sources

Get Donor Merchant

Free from WordPress.org, with recurring giving included.

Download Donor Merchant free Or try the demo first.