Resend error
"You can only send testing emails to your own email address"
"You can only send testing emails to your own email address" is a 403 validation_error from the Resend API. It means the request used the shared test sender, such as onboarding@resend.dev, and the recipient is not the email of your Resend account. That sender is for testing only, so a sign-up email to a real user is refused while a test to yourself works. Add your domain on the Resend Domains page, add the DNS records Resend shows, wait until the domain is verified, then change the from address in your code to an address on that domain. The Resend SDK does not throw for this: it returns it in the error field, so check that field.
Why does it work for me and fail for my users?
Resend's own guide gives the cause: you are sending from the default resend.dev domain to a recipient other than the email of your Resend account, and that domain is meant only for testing. A send to your own address goes through, so the first real sign-up is the first failure. The Next.js example in the Resend docs uses a from address of Acme <onboarding@resend.dev>, and AI-built apps often keep it.
The message in the Resend guide reads like this, and the API lists it under status 403:
403 validation_error
You can only send testing emails to your own email address (your-email-address@domain.com).
To send emails to other recipients, please verify a domain at resend.com/domainsWhy does my app show success when the email was refused?
The Resend Node SDK does not throw on an API error. In resend-node, a response that is not OK comes back as { data: null, error, headers } with the parsed API error in error. The Resend Next.js example destructures both and returns a 500 when error is set. A route that reads only data, or ignores the result, looks fine and sends nothing.
const { data, error } = await resend.emails.send({ from, to, subject, html });
if (error) {
return Response.json({ error }, { status: 500 });
}How do I verify a domain in Resend, and which from address do I use?
In the Resend dashboard, open Domains and click Add Domain. Resend recommends a subdomain for sending, and each subdomain is added on its own. Copy the records from the Records tab into your DNS host, wait for verification, then use an address on that exact domain. If you verified a subdomain, the from address has to use that subdomain: Resend's domain mismatch guide says a verified sending.domain.com does not cover domain.com.
If the domain stays pending, see why a Resend domain does not verify. If Supabase Auth sends through Resend SMTP and sign-up returns "Error sending confirmation email", read the Resend SMTP fix for Supabase.
Checklist
How to fix it, then check the fix
- 01Find every sender address in the code and in any environment variable that holds one:
grep -rnE "resend\.dev|from:" --exclude-dir=node_modules --exclude-dir=.next . - 02In Resend, open Domains, click Add Domain and enter a subdomain you control, such as updates.yourdomain.com.
- 03Add the DNS records from the Records tab at your DNS host and wait until the domain shows as verified.
- 04Change the from address to an address on that exact domain, for example Acme <hello@updates.yourdomain.com>. If the sender comes from an environment variable on Vercel, set it for Production and Preview.
- 05Redeploy: Vercel applies changed variables only to new deployments.
- 06Send to an address that is not your Resend account email. The call should return data with an id and error set to null.
Related
Related guides
Sources
Official docs behind this checklist
Browse all launch guides · Read resources · How to make and check your next change
FAQ
FAQ for builders before launch
Can I keep onboarding@resend.dev in production?
Not for real users. Resend's guide says the resend.dev domain is meant only for testing and can reach only the email of your own Resend account. To send to other recipients you verify a domain and send from it.
I verified the domain and still get a 403. What now?
Check that the from address does not still use resend.dev and that it matches the verified domain exactly, subdomain included. Resend's domain mismatch guide gives the example of a verified sending.domain.com failing for a from address on domain.com.
Where do I see which address the request used?
The Resend logs show the request, and the domain mismatch guide points you to them to compare the from field with the domain on your Domains page.