VexiloGuides

Claude Code Guide

Email verification deploy diary

Resend + Supabase Auth + Namecheap DNS — five reproducible steps.

Email verification deploy diary

The complete trip from "sign-ups don't get an email" to "users receive a localized verification email." Resend + Supabase Auth + Namecheap DNS — reproducible in five minutes.

Resend Namecheap DNS Supabase Auth Vercel
① Sign up for Resend
Add the domain, grab an API key
⏱ ~ 5 min
② Add 3 DNS records
MX / SPF / DKIM at Namecheap
⏱ 5 min + 30 min propagation
③ Supabase SMTP
Fill 7 fields, point at Resend
⏱ ~ 2 min
④ Localize templates
Rewrite 4 email templates in your voice
⏱ ~ 3 min

Why you need this step

The symptom: users sign up but the "confirm email" message never arrives — Supabase's built-in mailer has tight rate limits (a few per hour) and gets dropped on the floor in production.
The fix: plug in Resend (free tier: 3,000 emails/month, 100/day — plenty for an early-stage project), send from your own domain, and point Supabase Auth's SMTP at Resend.

Platforms involved

Resend · sending
Free 3,000·mo · 100·day
Sign up → add the domain yoursite.com → copy the 3 DNS records → grab the re_xxxxxxxx API key.
Namecheap · DNS
The registrar where you bought the domain
Domain List → Manage → Advanced DNS → add 3 DNS records (MX + SPF + DKIM) → wait 5–30 minutes for propagation.
Supabase · auth
Authentication → Emails → SMTP
SMTP Settings → fill in Resend credentials → Email Templates → rewrite 4 templates (Confirm / Magic Link / Change Email / Reset).
Vercel · hosting
Env vars and code hosting
This step doesn't require any code changes — every change happens in the three platforms above. Vercel only shows up at the end, when you visit your live site to test.

Step 1 — Sign up for Resend and add your domain ⏱ ~ 5 min

1

Create a Resend account

Open resend.com and sign up with GitHub or email (free).

2

Add your domain

Go to DomainsAdd Domain and enter yoursite.com (use your own domain).

3

Take note of the 3 DNS records Resend generates

Resend gives you 3 DNS records right away — keep this page open; you'll copy them into Namecheap next:

MXPriority 10
send.yoursite.com
feedback-smtp.us-east-1.amazonses.com
TXTSPF
send.yoursite.com
v=spf1 include:amazonses.com ~all
TXTDKIM
resend._domainkey.yoursite.com
→ Resend hands you a long p=MIGf... public key
4

Generate an API key

Go to API KeysCreate API Key, pick Sending access or Full access, and copy the re_xxxxxxxx value.

⚠ Shown only once — drop it into your password manager immediately.

Step 2 — Add the DNS records at Namecheap ⏱ 5 min + 30 min propagation

1

Open Advanced DNS

Sign into Namecheap → Domain List → click Manage next to yoursite.com → Advanced DNS.

2

Add the records, one at a time

Click Add New Record and re-enter each row from Resend. The Host field takes only the subdomain prefix (see the warning below):

MX Record
Host: send
Value: feedback-smtp.us-east-1.amazonses.com
Priority: 10
TXT (SPF)
Host: send
Value: v=spf1 include:amazonses.com ~all
TXT (DKIM)
Host: resend._domainkey
Value: paste that long DKIM public key
3

Wait for propagation, then Verify

After saving, wait 5–30 minutes for DNS to propagate, then go back to Resend's Domains page and click Verify DNS Records. Three green checks means you're good.

Want to double-check yourself? Run dig TXT resend._domainkey.yoursite.com and see if the record is live.
The biggest gotcha: Namecheap's Host field

Namecheap's Host field only takes the subdomain prefix — it appends .yoursite.com automatically. If you paste the full domain, verification will never succeed.

Wrong
send.yoursite.com
→ ends up as send.yoursite.com.yoursite.com
Right
send
→ Namecheap auto-completes to send.yoursite.com

Step 3 — Configure SMTP in Supabase ⏱ ~ 2 min

1

Open SMTP Settings

Supabase Dashboard → pick your project → left sidebar AuthenticationEmailsSMTP Settings, then flip on Enable Custom SMTP.

2

Fill in the credentials (every row is one-click copyable)

SMTP credentials 7 fields · all copyable
Sender email
noreply@yoursite.com
Sender name
YourSite
Host
smtp.resend.com
Port
465
Username
resend (literal — those six letters)
Password
The re_xxxxxxxx API key from Step 1
Paste manually
Minimum interval
60 seconds (anti-abuse)
3

Save and handshake

Click Save changes. Supabase tries the handshake immediately — if a credential is wrong, it shows a red error (see the troubleshooting card under SMTP auth failed).

Step 4 — Localize the email templates ⏱ ~ 3 min

1

Switch to Email Templates

Still in Authentication → Emails, switch to Email Templates. Open these 4 templates one by one:

Confirm signup
Email-verification message
Magic Link
Passwordless login link
Change Email Address
Email-change confirmation
Reset Password
Password-reset link
2

Rewrite the body in your own voice

Example (Confirm signup template):

<h2>Welcome to YourSite</h2>
<p>Click the link below to verify your email:</p>
<p><a href="{{ .ConfirmationURL }}">Verify email</a></p>
<p>If this wasn't you, just ignore this message.</p>
3

Update the subject line too

Rewrite the subject in the same voice — for example: [YourSite] Please verify your email. Save each template as you finish it.

Template variables — quick reference

{{ .ConfirmationURL }}
Verification / confirmation link
{{ .Email }}
User's email address
{{ .Token }}
6-digit verification code
{{ .SiteURL }}
Your site's homepage URL
Heads up: the curly braces need spaces around the variable name ({{ .ConfirmationURL }}) — without them, the variable doesn't get rendered.

Step 5 — End-to-end test ⏱ ~ 2 min

1

Sign up in an incognito window

Open an incognito window, visit https://yoursite.com/register, and sign up with a real email address.

2

Email arrives within 10 seconds

The sender shows up as YourSite <noreply@yoursite.com>, with the subject and body in the language and tone you chose.

3

Click the verify link

Click "Verify email" in the message. You should land back on the site, already signed in. That's success.

4

Check Resend Logs

Resend dashboard → Logs shows the delivery record (Delivered / Opened).

Troubleshooting

5 / 5 items
Email never arrives
Cause: it landed in spam.
Fix: add noreply@yoursite.com as a contact; once DKIM passes, the rate drops sharply.
Resend says "Domain not verified"
Cause: DNS hasn't propagated yet.
Fix: wait another 30 minutes, or run dig TXT resend._domainkey.yoursite.com to confirm.
Supabase reports SMTP auth failed
Cause: Username isn't the literal resend, or a character got dropped from the API key.
Fix: regenerate the API key; Username is just the six letters resend.
Email stops arriving after an hour
Cause: you hit Resend's free-tier 100/day cap.
Fix: upgrade the plan, or add a second SMTP provider.
Email comes through in the default English
Cause: the template didn't save.
Fix: open each template in Email Templates, save again, clear the browser cache, retry.

Pre-launch checklist

Sign-off: 6 items — all ✓ before you call this done
  • Resend → Domains page shows all three DNS records as green ✓ (Verified)
  • Supabase SMTP Save changes returns no red error — handshake worked
  • Incognito sign-up test produces an email within 10 seconds
  • Subject line and body render in the language you wrote, with the sender on your own domain
  • Test inboxes (Gmail / Outlook / a regional provider) don't route to spam
  • Resend Logs shows Delivered, then flips to Opened after you click the link
Matching commit · 5e35ddb feat(auth): enable email verification via Resend SMTP · in code, only env vars and docs changed; the actual sending capability comes from the platform configuration above — which is why this deploy diary matters more than the code diff.
Open the full interactive index →

Vexilo is the missing index for Claude Code — 31 agents, 125 commands, 123 skills and more, organized by scenario. Browse free; unlock search, filters and one-click CLAUDE.md export with a one-time $19 licence.