v0 contact form not sending email: what to check
A v0 contact form usually sends mail through a server action that calls Resend. If no email arrives, the RESEND_API_KEY is missing from the Vercel Production environment, the from address is still onboarding@resend.dev (which only delivers to your own Resend account email), or the action fails and the form shows success anyway. Add the key for Production, verify your domain in Resend and send from it, and make the form show an error when the send fails.
What you'll see
Someone fills in the form on your live site, presses Send and sees a thank-you message. Nothing reaches your inbox. When you test it with your own address it may work, which hides the problem until a real customer writes in. Vercel function logs, if you look, may show a 403 from Resend.
Why it happens
1. The API key is not set for Production
Variables you add in v0 do not automatically exist in every Vercel environment. Without RESEND_API_KEY in Production, the server action calls Resend with no key and the request is rejected.
2. The from address is the Resend test domain
Resend lets you send from onboarding@resend.dev without verifying anything, but only to the email address on your Resend account. Any other recipient gets a 403 saying you can only send testing emails to your own address.
3. The form ignores the result of the send
Generated forms often show the success state as soon as the button is pressed, or catch every error and return nothing. The visitor is told it worked even when the server action threw.
How to fix it
- Submit the live form yourself, then open Vercel > your project > Logs and filter for the function or route that handles it. Note any error from Resend, especially a 401 or 403.
- In Vercel > Settings > Environment Variables, add RESEND_API_KEY with the Production environment ticked. Redeploy so the new build can read it.
- In the Resend dashboard open Domains, add your domain, and create the DNS records it shows at your DNS provider. Wait until the domain shows as verified; confirm the current record types in Resend’s docs because they can change.
- Change the from address in the server action to one on your verified domain, such as hello@yourdomain.com, and set reply_to to the visitor’s email so you can answer directly.
- Make the action return a clear result, for example ok true or ok false with an error message, and have the form show the success message only when ok is true.
- Send a test from the live site to an address that is not your Resend login, and check spam as well as the inbox.
Prompt to paste into v0
Make my contact form send email through a server action using Resend with process.env.RESEND_API_KEY, from 'Website <hello@mydomain.com>' to me@mydomain.com, with reply_to set to the visitor's email. Validate the fields on the server. Return { ok: true } on success and { ok: false, error } on failure, show the error in the form, and show the thank-you message only when ok is true.How to check it's fixed
- A message sent from the live site to a different mailbox arrives, with your domain as the sender and the visitor as reply-to.
- Temporarily remove the key in a preview deployment and confirm the form now shows an error instead of a false thank-you.
- Submitting the form empty shows a validation message on each required field.
What a QAlaunch scan shows for this
- Whether submitting the form empty shows any validation feedback, or the form stays silent.
- JavaScript console errors and failed requests on the page that holds the form.
- The scan does not fill in real data or check your inbox, so delivery itself must be confirmed with a manual test send.
See exactly what a full report contains in the sample report.
Frequently asked questions
It works when I send to myself. Why not for others?
That is the Resend test domain at work. onboarding@resend.dev only delivers to the email on your Resend account, so you see your own tests arrive while every other recipient is refused.
Do I need a paid Resend plan?
Resend has a free tier that covers a typical contact form. Check its pricing page for the current sending limits before you rely on it for anything high volume.
Can I use a Gmail address as the from address?
No. You can only send from domains you have verified in Resend, and you cannot verify gmail.com. Use an address on your own domain and put your Gmail in the to field.
Rather have a QA engineer test it by hand?
If this is a site you're launching or handing to a client, I'll go through it by hand, including the v0-specific issues a scan can't reach, like logged-in flows.
- Up to 10 key pages tested by hand, not a scan
- Every flow a customer uses: forms, sign-up, checkout, booking
- Real mobile and desktop browsers
- A written report in plain language, with screenshots
- A 15-minute call to walk you through it
- 10 years of professional QA experience
Tell me about your site and I'll reply personally, usually the same day.
No payment now. I'll confirm scope and price first.
Related fixes
- v0 "Application error: a client-side exception has occurred": the fix
- v0 preview doesn't match the deployed site: how to fix it
- How to change the "v0 App" title and "Created with v0" description
- Vercel site asks visitors to log in: why and how to make it public
- v0 images not showing after deploy: the causes and fixes
More for v0: all v0 fixes · v0 testing
Written by Waqas Ahmad, QA engineer with 10 years of professional testing experience. Last checked October 26, 2026.
Sources: Resend: 403 error when using the resend.dev domain · Vercel Academy: email the owner · Vercel Community: Resend email in v0 is not working