-
Notifications
You must be signed in to change notification settings - Fork 0
Email Deliverability
If clients aren't receiving booking confirmations or reminder emails, the issue is almost never the plugin's templates — it's how the message gets sent and whether the receiving server trusts your sending domain. This page walks you through the standard fixes, in order of impact.
-
Send through a real SMTP provider (not your web host's PHP
mail()). - Add SPF, DKIM, and DMARC DNS records for your domain.
-
Use a "From" address on your own domain (not
@gmail.com).
The plugin includes diagnostics for all three. Run them at Settings → Caswell Booking → Tools & Diagnostics → Email Delivery Test.
WordPress's wp_mail() defaults to PHP's built-in mail() function, which goes out through your hosting server (Bluehost, GoDaddy, etc.). Shared hosting servers have a poor sender reputation; large inbox providers (Gmail, Outlook, iCloud) silently drop or spam-fold those messages.
Install WP Mail SMTP (free) and route through one of:
| Provider | Free tier | Notes |
|---|---|---|
| Gmail / Google Workspace SMTP | Free with Workspace | Easiest if you already have a Workspace mailbox. Sends "as" your real address. |
| SendGrid | 100/day | Strong deliverability, simple setup. |
| Mailgun | 100/day (3-month trial) then pay-as-you-go | Good for transactional. |
| Postmark | Pay-as-you-go (~$1.25 per 10k) | Best transactional reputation. |
| Amazon SES | $0.10 per 1k | Cheapest at scale; setup is fiddly. |
Any of these will do more than every other tip combined.
After connecting a provider, run Tools → Email Delivery Test. The plugin reports whether wp_mail() accepted the message — a "yes" means the provider received it, then check your inbox (and spam folder).
Even with a great provider, mail to Gmail and Outlook gets spam-filtered without these DNS records. They prove the sending server is allowed to send mail "from" your domain.
| Record | Purpose |
|---|---|
| SPF (TXT) | Lists IPs / providers allowed to send from your domain. |
| DKIM (TXT or CNAME) | Cryptographic signature on each message. |
| DMARC (TXT) | Tells receivers what to do if SPF/DKIM fail (reject / quarantine / monitor). |
- Sign up at sendgrid.com and verify your account.
- Settings → Sender Authentication → Authenticate Your Domain.
- Pick your DNS host (GoDaddy, Cloudflare, Namecheap, etc.) and enter your domain (e.g.
castherapylmt.com). - SendGrid generates 3 CNAME records. Add them at your DNS host:
em1234.castherapylmt.com. CNAME u123.wl.sendgrid.net. s1._domainkey.castherapylmt.com CNAME s1.domainkey.u123.wl.sendgrid.net. s2._domainkey.castherapylmt.com CNAME s2.domainkey.u123.wl.sendgrid.net. - Wait 5–60 min for DNS propagation, click Verify in SendGrid.
- Generate an API key at SendGrid → Settings → API Keys → "Restricted Access" → enable Mail Send → Save the key.
- Back in WordPress: install WP Mail SMTP, choose SendGrid, paste the API key, set the From address to
bookings@castherapylmt.com(or whatever). - Run the plugin's Email Delivery Test.
After SPF + DKIM pass, add a DMARC record (also a TXT record) at your DNS host:
_dmarc.castherapylmt.com TXT "v=DMARC1; p=none; rua=mailto:postmaster@castherapylmt.com; pct=100"
p=none means "report-only" — start there to see what's failing without rejecting anything. After a couple of weeks of clean reports, tighten to p=quarantine or p=reject.
If you already have a Google Workspace account for castherapylmt.com:
- WP Mail SMTP → Settings → choose Other SMTP or Gmail / Google Workspace.
- Either:
- Use App Password: easiest. Workspace Admin → Security → 2-Step Verification → App passwords → generate one for "Mail" → paste in WP Mail SMTP.
- Or OAuth: more work but doesn't break if password rotates.
- Workspace handles SPF + DKIM automatically for emails sent through their SMTP. You still need a DMARC TXT record (above).
The plugin's Settings → Caswell Booking → Email has a From Address field. Always set this to an address on the domain you own (e.g. bookings@castherapylmt.com).
If the From address is on a free provider (@gmail.com, @yahoo.com, @outlook.com), most receivers reject the message outright due to DMARC enforcement. The plugin's Email Delivery Test now flags this with a yellow warning.
Two cheap options:
-
Domain registrar email forwarding — Namecheap and Cloudflare offer free email forwarding. Create
bookings@castherapylmt.comand forward to your real Gmail. You can't send from it, but the plugin doesn't need to receive — only send through SendGrid/Mailgun/Postmark, which doesn't care that your domain has no inbox. - Google Workspace — $6/mo, full mailbox. Recommended once volume picks up.
When you upgrade to v1.4.7 or later, the plugin attaches these headers to every outgoing email — automatically:
-
From— uses your configured From address -
Reply-To— matches the From address so client replies route correctly -
Message-ID— uniquely identifies each message; some hosts drop emails without one -
Date— explicit RFC 2822 date (some hosts mis-format wp_mail's auto-date) -
List-Unsubscribe: <mailto:From-address?subject=Unsubscribe>— Gmail and Outlook give cleaner inbox placement to messages that expose a one-click unsubscribe path. The mailto pattern routes any "unsubscribe" click straight to the practitioner.
Reminder emails also get a small visible footer link inviting clients to reply with "stop reminders" — Gmail's spam filters reward emails with clear opt-outs.
After completing the steps above, send yourself a test booking and check the email's headers. In Gmail, click the message → ⋮ → "Show original". Look for:
-
SPF: PASS✓ -
DKIM: PASS✓ -
DMARC: PASS✓ -
Authentication-Results:header showing all three
If any are missing or fail, that's the next thing to fix. SendGrid, Mailgun, and Postmark all have great support for diagnosing this.
-
Different domain in From and SMTP — sending via
gmail.comSMTP but withFrom: name@castherapylmt.comwill fail DMARC. Either send via Workspace (which signs forcastherapylmt.com), or set From to the Gmail address. - DNS not propagated — TTL can be 24 hours on some registrars. Be patient.
- Subject line too "promotional" — confirmations are transactional and rarely flagged, but reminders sometimes are. Avoid all-caps, "Free!", excessive punctuation.
- No plain-text alternative — HTML-only emails score worse on some filters. The plugin currently sends HTML only; planned for a future release.
- Sending too many at once — if you suddenly send 1000 cold-list reminders, expect a deliverability hit. The plugin's per-booking trigger keeps you well below that threshold organically.
💡 If you're stuck after working through this page, the debug log (Tools → Debug Logging → enable, then trigger a send) shows the exact headers and the wp_mail response. Paste those into your provider's support chat — SendGrid/Mailgun/Postmark all have good first-line support for deliverability questions.
Getting started
How it works
- Architecture
- Database Schema
- Scheduling
- Google Calendar
- Notifications
- Email Deliverability
- Authentication
- AJAX Endpoints
Payments
Other