Ship it · 2 min
Custom domain
The five DNS records, in the order that stops you waiting on the wrong one.
Two things need your domain and they are independent: the site, and email.
The site
Add the domain in the Vercel project, then at your registrar:
| Type | Host | Value |
|---|---|---|
| A | @ | the address Vercel shows |
| CNAME | www | the target Vercel shows |
Pick one as canonical and redirect the other. Vercel does that for you; just choose deliberately rather than serving both, because two URLs for one page splits your ranking.
Then set NEXT_PUBLIC_SITE_URL to the canonical one and redeploy. Metadata,
the sitemap and Stripe's redirect URLs all read it, and they will keep pointing
at vercel.app until you do.
Add the same domain in Resend and set the three records it gives you:
| Type | Host | Purpose |
|---|---|---|
| TXT | resend._domainkey | DKIM |
| MX | send | Bounce handling |
| TXT | send | SPF |
Order of operations
Set the DNS records
All five at once. They propagate independently, so there is no reason to wait between them.
Verify in Vercel
Usually a minute or two. Until it verifies, the domain serves your registrar's parking page and it looks like the deploy failed.
Verify in Resend
Slower, sometimes an hour. Nothing else is blocked on it, and until it lands mail only reaches the account owner.
Update the Stripe webhook
Point the endpoint at the real domain and put the new signing secret in the environment. An endpoint on the old URL keeps firing at a deployment that is no longer the one people buy from.
Something wrong or missing on this page? Tell us.