Why AI-built forms fail silently, and how to fix them
A contact form built by an AI tool can look finished and still send nothing. There is no error, no bounce and no warning: you just never hear from anyone. Here is why that happens, how to check your own form in two minutes, and what actually fixes it.
Just want it fixed? The AI builders guide has a copy-paste prompt that wires your form up. This post explains what goes wrong underneath.
Why the failure is silent
A form has two halves. The front end collects the fields and shows a message. The back end receives the POST, stores it and turns it into an email. AI builders are very good at the first half, because it is visible: you can see the layout in the preview and ask for changes. The second half is invisible until a real visitor uses it, so it is easy to ship without it.
The visitor has no way to know their message went nowhere, and neither do you. That is what makes it worse than a broken page: a broken page gets reported.
The four ways it fails
1. The handler is a placeholder
The submit handler calls preventDefault(), logs the values or shows a toast, and stops. Nothing leaves the browser. This is the most common case, and it is not a bug in the tool: it built exactly the interface you asked for.
2. Success is shown without checking the response
The handler does send a request, but shows “Thanks!” as soon as it fires, whether the server said yes, no or nothing. A failing endpoint looks identical to a working one.
3. The endpoint doesn’t exist
Asked to “make the form send email”, an AI tool may write a call to /api/contact without the route behind it, or to a plausible-looking URL it made up. The request returns a 404 or is blocked by CORS, and failure mode 2 hides it.
4. The code never runs where you deployed it
Some fixes depend on the host or framework. A handler in a Next.js server component never fires. A host that detects forms in your built HTML can miss a form rendered by JavaScript. Code that worked in the preview can stop working after you deploy somewhere else.
How to check your form in two minutes
- Open your live site, not the preview, and open your browser’s developer tools on the Network tab.
- Fill in the form and press Send.
- Look for a new request when you click. No request at all means failure mode 1. A request with a 4xx or 5xx status, or a CORS error in the console, means mode 3.
- If the request failed but the page still said “sent”, you also have mode 2.
- If you got a 200 but no email, check where that endpoint is supposed to deliver, and your spam folder.
What fixes it
You need something real to receive the POST, and a front end that tells the truth about whether it worked. There are two ways to get the receiving half.
Build it. An API route or serverless function, an email provider with a verified sending domain, somewhere to store messages in case an email fails, and spam protection. It is a reasonable choice if your app already has a backend.
Use a hosted form backend. The form posts to a URL the service gives you, and it does the storing, emailing and spam filtering. This is what FormRill is. The front-end change is small:
<form method="POST"
action="https://api.formrill.com/YOUR_FORM_ID/submit">
<input type="checkbox" name="botcheck" hidden />
<input type="text" name="name" required />
<input type="email" name="email" required />
<textarea name="message" required></textarea>
<button type="submit">Send</button>
</form>For JavaScript forms, send the same fields with fetch and the header Accept: application/json, and show success only when the response JSON has ok: true. That one check removes failure mode 2 for good.
Fix guides for each builder
Each guide has the prompt to paste, where to paste it, and the gotcha specific to that tool.
- Lovable contact form not sending
The toast says “Message sent”, the form clears, and nothing ever reaches your inbox.
- v0 contact form not sending
The form looks finished in the preview, but clicking Send does nothing, or only logs the values to the console.
- Bolt.new contact form not sending
Submit clears the fields or shows a thank-you message, and no email ever arrives.
- Cursor contact form not sending
Cursor says the form is wired up, but the endpoint it used doesn’t exist, or the handler is still a TODO.
- All AI builders
The shared prompt that works in any of them.
Make sure no lead gets lost
FormRill saves every submission before it sends anything, so even if an email bounces, the message is waiting in your dashboard. Want a second alert? Add Telegram for free, or send leads to Google Sheets (a Pro feature, free during the beta).
Letting your AI agent read submissions over MCP is planned Coming soon. It is not available yet.
Make your AI-built form actually send
Free up to 500 submissions a month and unlimited forms. No server, no credit card.
Start freeRelated
- What is a form backend?
The receiving half, explained from the start.
- Troubleshooting
When submissions don’t arrive.
- Next.js contact form
A client component with loading and error states.