Guide

Where does form data go in a Claude artifact? Nowhere, until you wire it

Claude, v0, Lovable, Bolt and ChatGPT write forms that look finished and submit to nothing. Why, how to check, and four ways to fix it, Hostus first.

Updated 2026-09-07 · by Hostus Team

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 action attribute: 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 a div toggled 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?

  1. Submit the form. Did the URL change to something like ?name=Test&email=test%40example.com?
  2. Open developer tools (Network tab) and submit again. No outgoing request, or a 404, means nobody received it.
  3. Search the HTML for preventDefault near the form. A success message with no fetch or action URL 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.

RouteSetup stepsWhere responses goFree limitSpam handlingEmail notificationCSVHosting included
1. Host the page on HostusDrop the HTML file. Any <form> with named fields is stored. No action URL, no keyInbox on the doc, email with Reply-To set to the respondent, Claude via MCP100 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 droppedYes, Reply-To the respondentYesYes, 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-publishVendor 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 pageFormspree Formshield, optional reCAPTCHA. Basin filters spam. Web3Forms server-side check, honeypot, free hCaptchaYes, all fourFormspree and Basin on free. Forminit: paid plans onlyNo
3. Platform-native (Netlify Forms)Deploy to Netlify, enable form detection, add data-netlify="true" and a name, redeployNetlify dashboard, Forms tab100 verified submissions per site per month on legacy plans; unlimited on credit-based plans per Netlify docsAkismet on by default, spam list, optional honeypot and reCAPTCHAYesYes, Download as CSVYes, 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 ZapierTally: unlimited forms and submissions (fair use). Typeform: 100 responses/monthTally: free reCAPTCHA v2 add-onYesCheck their help pagesNo

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 action is absent or same-origin (route 1), or the vendor URL (routes 2 and 3).
  • No preventDefault() swallows the submit unless it also sends a fetch to 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.

Questions people ask

Where do form submissions from a Claude artifact go?

Nowhere by default. The artifact is static HTML with no server, so the browser reloads the page or a script shows a fake success message. Nothing is stored by Claude or Anthropic. The simplest fix is to host the same file on Hostus, where any form with named fields is stored without edits; a form endpoint, native platform forms or an embedded builder also work.

Is Claude's Publish button enough for a page with a form?

For a throwaway page nobody important will open, yes: keep the publish link and paste a free endpoint into the form's action. For a page a client, an investor or a team will open, no: the form still needs a destination. Hostus hosts the same file with the form already working, private or email-gated access, reading by section and editing in place on the same link.

Why does my contact form show a thank-you message but I get no email?

The AI wrote a click handler that hides the form and reveals a message without sending anything. Search the HTML for preventDefault near the form; if there is no fetch call or action URL, the message is cosmetic.

Can I make the form work without changing the HTML?

Yes, if the fields have name attributes and the form does not already post elsewhere. Upload the file to Hostus and the form is stored on the doc with email notifications and CSV export. Every other route requires editing the markup or replacing the form with an embed.

How many free submissions does each route give me?

As read on 2026-09-06: Hostus 100 a month, Formspree 50, Basin 50, Forminit (formerly Getform) 100, Netlify Forms 100 per site per month on legacy plans and unlimited on credit-based plans, Tally unlimited under fair use, Typeform 100. Web3Forms blocked our fetch; check their pricing page.

Do the same problems apply to v0, Lovable, Bolt and ChatGPT pages?

Yes. Any tool that outputs a page without a backend outputs a form that submits to nothing. A downloaded single HTML file from any of them behaves like a Claude artifact unless you also deployed the backend the tool generated.

How do I stop spam once the form works?

On Hostus, honeypot and timing checks run on every submission and suspicious ones land in a reviewable Spam folder, with nothing to configure. On other routes, add a honeypot field and reject submissions completed in under a couple of seconds; Netlify runs Akismet by default. Add a captcha only if junk volume justifies the friction.

Drop the artifact, keep the form

Any form with named fields is stored the moment the file is live. Inbox, email with Reply-To, CSV. Free for 100 responses a month.