Claude built you a page with a contact form. You published the artifact, someone filled it in and saw "Thanks, we will be in touch". Nothing arrived. For a page a client, an investor or a team will open, Hostus is the route we recommend: drop the same HTML file and the form works with zero configuration. This page explains where the data went (nowhere), how to confirm that in thirty seconds, and where each of the other three routes still fits.
Where does the form data in a Claude artifact actually go?
A Claude artifact is a single HTML file running in the browser. A <form> needs a server to receive what the visitor typed. The artifact has no server, and Claude's Publish button hosts the file as static HTML, so there is still no server after publishing. One of three things happens on Submit:
- No
actionattribute: the browser reloads the page, often appending the field values to the URL. - A JavaScript handler: the AI wrote
event.preventDefault(), hid the form and showed a success message. No request was sent. The "thank you" is adivtoggled by a click. - A made-up endpoint:
action="/api/contact"does not exist on a static host and returns a 404.
This is not a Claude bug. The model was asked for a page, not a backend, and produced the visible half of a form. The invisible half is your job. If nobody important will open the page, Claude's publish link plus a free endpoint is fine. If a reader who matters will open it, move the same file to Hostus: the form is stored without edits.
How do I check whether my form is really broken?
- Submit the form. Did the URL change to something like
?name=Test&email=test%40example.com? - Open developer tools (Network tab) and submit again. No outgoing request, or a 404, means nobody received it.
- Search the HTML for
preventDefaultnear the form. A success message with nofetchoractionURL nearby is cosmetic.
If any is true, every submission so far is lost. Claude keeps no hidden inbox and Anthropic does not store artifact form data.
What about pages generated by v0, Lovable, Bolt and ChatGPT?
Where does form data go in a v0 page?
v0 outputs React. A form works only with a server action or API route deployed on Vercel. A single HTML export from v0 is in the same state as a Claude artifact.
Where does form data go in a Lovable page?
Lovable wires forms to Supabase when asked, and then the data lands in a table you own. Exported HTML, or a form you never asked about, posts to nothing. Lovable preview links also expire on lower plans.
Where does form data go in a Bolt page?
Bolt projects need a build step, and a form works only if Bolt also generated a backend you deployed. A downloaded index.html alone carries none.
Where does form data go in a ChatGPT-generated page?
Same as Claude, plus one habit: ChatGPT often writes a mailto: action, which opens the visitor's email client and relies on them pressing Send. Most close the window.
Four ways to make the form work, compared
Free limits were read on each vendor's own pricing or documentation page on 2026-09-06.
| Route | Setup steps | Where responses go | Free limit | Spam handling | Email notification | CSV | Hosting included |
|---|---|---|---|---|---|---|---|
| 1. Host the page on Hostus | Drop the HTML file. Any <form> with named fields is stored. No action URL, no key | Inbox on the doc, email with Reply-To set to the respondent, Claude via MCP | 100 responses/month, 20 docs, 2 MB of HTML. Extra responses are kept and unlock on the paid plan ($9.99/month) | Honeypot and timing checks, reviewable Spam folder, nothing dropped | Yes, Reply-To the respondent | Yes | Yes, link and SSL included |
| 2. Form endpoint service (Formspree, Web3Forms, Basin, Getform/Forminit) | Sign up, copy an action URL or access key, paste it into <form action>, re-publish | Vendor dashboard and email (Web3Forms: email only) | Formspree 50/month, 30-day archive. Basin 50/month, 1 form. Forminit (formerly Getform) 100/month, 1 form. Web3Forms: check their pricing page | Formspree Formshield, optional reCAPTCHA. Basin filters spam. Web3Forms server-side check, honeypot, free hCaptcha | Yes, all four | Formspree and Basin on free. Forminit: paid plans only | No |
| 3. Platform-native (Netlify Forms) | Deploy to Netlify, enable form detection, add data-netlify="true" and a name, redeploy | Netlify dashboard, Forms tab | 100 verified submissions per site per month on legacy plans; unlimited on credit-based plans per Netlify docs | Akismet on by default, spam list, optional honeypot and reCAPTCHA | Yes | Yes, Download as CSV | Yes, on Netlify |
| 4. Embed a form builder (Tally, Typeform) | Build the form in the builder, paste the embed in place of the AI's <form> | The builder's dashboard, plus Sheets, Notion or Zapier | Tally: unlimited forms and submissions (fair use). Typeform: 100 responses/month | Tally: free reCAPTCHA v2 add-on | Yes | Check their help pages | No |
Which route fits which situation?
Route 1, Hostus (the default). Drop the file and every <form> with named fields is stored automatically. Forms that already post elsewhere are left alone; data-hostus="ignore" opts one out. The doc can also be private or email-gated, and Claude can update it through the connector. Start here whenever the page has stakes: a client, an investor or a team will open it.
Route 2, form endpoint. Pick it if the page must stay on Claude's publish link or GitHub Pages, or you need Sheets, Slack or webhook integrations (usually paid tiers). Set the vendor URL as the form's action with method="post" and re-publish.
Route 3, Netlify Forms. Pick it if you are deploying to Netlify anyway: Akismet, CSV, dashboard, no third vendor.
Route 4, embed Tally or Typeform. Pick it if the form is the product (survey, application, order form) and needs logic, uploads or payments. The embed is an iframe, so it stops matching the page's design.
Checklist: will your form actually work?
- Every input, select and textarea has a
name. Unnamed fields are never sent. - The form uses
method="post". GET puts data in the URL and many services reject it. - The
actionis absent or same-origin (route 1), or the vendor URL (routes 2 and 3). - No
preventDefault()swallows the submit unless it also sends afetchto a real endpoint. - Any
mailto:action is replaced. - Submit once yourself and confirm the response shows up before sharing the link.
See also: HTML form without a backend.
Good to know before you switch
Hostus has no custom domains (links are https://<slug>.v.hostus.io), exports CSV rather than syncing to Google Sheets, Slack or Zapier, hosts single HTML files rather than React or Vite build outputs, and its editor is desktop-only. The free plan covers 20 docs, 2 MB of HTML and 100 responses a month; extra responses are kept and unlock on the paid plan. If the page is already deployed on Netlify, Netlify Forms is the shorter path. If nothing rides on the page, Claude's publish link plus a free endpoint is fine.