Your signup page converts. The user fills in email and password, hits submit, gets a "Check your inbox" screen. Your analytics records a new account. Your dashboard shows another successful signup. And then nothing happens, because the verification email never appeared in front of the user.
The industry calls this "activation drop-off" and usually blames bad onboarding or weak value proposition. In practice, a large chunk of that drop-off is mechanical: the email went to the spam folder, the promotions tab, or a greylist that bounced it to a placeholder that nobody checks.
The math nobody runs
Take a typical funnel and work backwards from the verification step:
- 100 users submit the signup form. Your frontend celebrates.
- 99 get an email delivered to the MX. Your ESP dashboard shows 99% delivered and calls it a day.
- Maybe 80 land in the primary inbox. The other 19 sit in spam or Promotions.
- Of the 19, about 3-4 dig through spam and click anyway. Power users, mostly.
- 15-16 never verify. They count as "unactivated" in your retention dashboard.
That is a 15-20% hit on the top of your funnel, invisible because it is split across two systems that never talk to each other: your product analytics and your ESP. Neither one can see the gap alone.
Pull the last 30 days of signups. Compute: verified / signed_up. If that ratio is below 85% and your app requires email verification to proceed, deliverability is very likely costing you real conversions. Most teams never look.
Why verification mail gets filtered
Registration emails hit three filter patterns simultaneously, which is why they get classified as spam more often than marketing mail from the same domain:
- New recipient, no prior engagement. Gmail and Outlook build per-sender reputation at the recipient level. A brand new address has no history with your domain and starts with neutral or slightly negative score.
- Urgency language. "Confirm your email", "Verify now", "Click to activate" — all textual fingerprints of phishing. Bayesian filters weight them accordingly.
- Single-link body. A short email with one prominent CTA button that points to a long tokenised URL looks structurally identical to credential-harvesting mail.
The domain trap
Most signup flows send from noreply@yourdomain.com. If that subdomain was never warmed up and has no dedicated SPF/DKIM alignment, new-account mail is sent from an unknown identity that looks suspicious to every major provider. Transactional vendors (Postmark, SendGrid, SES) will deliver the SMTP successfully — that does not mean the receiver inboxed it.
Measuring the actual placement
Send a real verification email to a set of seed addresses at Gmail, Outlook, Yahoo, iCloud, Mail.ru and Yandex. Look at folder placement across providers. The test has to use the exact template and sending IP your production flow uses, otherwise the result is meaningless.
# Trigger the real signup flow to a seed address:
curl -X POST https://yourapp.com/api/signup \
-H 'Content-Type: application/json' \
-d '{"email":"seed-gmail-01@check.live-direct-marketing.online","password":"..."}'
# Then run placement check (example with Inbox Check API):
curl https://check.live-direct-marketing.online/api/check/status/<test-id>
# Response: { gmail: "inbox", outlook: "spam", yahoo: "inbox", ... }Fixes that actually move the needle
In order of impact for verification flows specifically:
- Fix DMARC alignment first. SPF pass with no DMARC alignment lets your From-domain be rewritten and scored against a neutral reputation. Add a published DMARC policy and confirm the d= in DKIM signature matches your From.
- Use a dedicated sending subdomain.
mail.yourdomain.comortx.yourdomain.com. Do not mix transactional and marketing on the same identity — a promotional campaign that gets flagged will drag your verification mail down with it. - Kill urgency in the subject line. Replace "Verify your email now" with "Your Acme account is ready" or "Welcome, confirm to get started". Phishing-style subjects score badly.
- Keep the body readable. Include a one-line explanation, the CTA button, a plain-text URL fallback, and a signature with a physical address and support contact. Bare one-link emails look like phishing to every filter.
Run a placement test on the verification template you ship today. Screenshot the result. Ship one fix at a time, re-run, and compare. Otherwise you are shipping "deliverability improvements" into the void with no way to know if anything changed.
Wiring it into your product metrics
The only metric that matters long-term is signup_to_verified. Instrument it, alert on it, and cross it with placement results from your seed tests so you can attribute drops to deliverability versus product changes.
-- Daily activation by domain (run this in your warehouse):
SELECT
date_trunc('day', created_at) AS day,
split_part(email, '@', 2) AS email_domain,
count(*) AS signups,
count(verified_at) AS verified,
round(100.0 * count(verified_at) / count(*), 1) AS pct_verified
FROM users
WHERE created_at > now() - interval '30 days'
GROUP BY 1, 2
ORDER BY 1 DESC, signups DESC;If pct_verified at gmail.com is 20 points below outlook.com, you have a Gmail placement problem, not a product problem. If both are low and yahoo.com is fine, likely authentication issue. The cross-section by domain tells you what to fix.