AI builders ship beautiful forms with no idea where the submissions go. Three shapes that actually work — mailto, third-party embed, serverless route — and the prompts that make each one ship cleanly.
The AI tool generates the event microsite. The RSVP form looks great — name field, email field, attending dropdown, dietary preference, a submit button styled in your brand color. You preview it, fill in your own details, hit submit.
Nothing happens. Or the URL changes to ?name=test&email=test@example.com and the form clears. Or a console error appears about a 404 on /api/rsvp. The form has a UI; it has no path to actually receive the data.
The fix is to be specific in the prompt about which submission path the form should use, before the AI tool defaults to either a placeholder or an over-engineered solution.
AI builders are optimizing for two things at once: the visual design pattern of a form (which they know well) and the submission flow (which depends on the backend setup, which the AI doesn't have).
The defaults that show up:
<form> has no action attribute; clicking submit refreshes the page and clears the fields. Most generated forms ship this way.<form action="/api/submit">. Looks valid; the endpoint doesn't exist.Each of these is solvable in the prompt by naming the actual submission path the form should use.
mailto: form — simplest, lowest volumeThe form's action is a mailto: link with the visitor's email pre-filled. On submit, the visitor's email client opens with a draft email to the form owner, containing the form data in the body.
<form action="mailto:host@example.com" method="post" enctype="text/plain">
Cross-tool prompt:
Add an RSVP form to this page. The form submits via
mailto:—action="mailto:host@example.com",method="post",enctype="text/plain". No JavaScript needed; the visitor's email client handles the rest. Include a one-line note under the form: "Submitting opens your email client to send the RSVP."
Right fit: personal events, low-volume contact forms (a freelancer's "get in touch" page), proof-of-concept pages where formal submission flow doesn't matter yet.
Trade-offs: works in <50% of cases in practice (mobile email clients don't always handle this cleanly; visitors without a configured email client see nothing happen); not great UX for "real" form needs.
Form services (Formspree, Tally, Web3Forms, Getform, Basin) handle the submission backend; you point the form's action at their endpoint, the data flows to your email or their dashboard.
<form action="https://formspree.io/f/YOUR_FORM_ID" method="POST">
Cross-tool prompt:
Add an RSVP form that submits to a Formspree endpoint. Use
action="https://formspree.io/f/<form-id-placeholder>",method="POST". After submit, redirect to a thank-you confirmation either via Formspree's built-in next page or via a_nexthidden input. Include a placeholder comment in the HTML: "Replace <form-id-placeholder> with your actual Formspree form ID — set up free at formspree.io".
The same pattern works with Tally (<iframe> embed of a Tally form), Web3Forms (similar action attribute), and most other form services. Each ships a free tier sufficient for personal events and small landings (50-500 submissions per month typically).
Right fit: most cases. Event microsites, AI product landings, freelancer contact pages, beta signup waitlists. The form service is invisible to the visitor; the data lands in the form owner's inbox or dashboard.
Trade-offs: free tiers have submission caps; the form service is another dependency to manage; for high-volume cases, the paid tiers add up.
If the page is part of a Vercel / Netlify / Cloudflare Pages deploy, a serverless function on the same platform handles the submission. The form POSTs to /api/rsvp; the function receives the data, sends an email, optionally stores it in a database.
Cross-tool prompt:
Build this as a Next.js page with an API route at
/api/rsvpthat handles the form submission. The form POSTs name + email + attendance to the route; the route validates the input, sends an email via Resend / SendGrid / a simple SMTP setup, returns a JSON response. Front-end handles the submit withfetch()and shows a confirmation state on success.
Right fit: projects already on a deploy platform with auth / database / email-sending infrastructure already set up. Overkill for a single static HTML file.
Trade-offs: requires a full deploy setup, environment variables, email-provider account. Not portable as a single HTML file.
A quick decision tree:
Is this a personal event with under 30 expected RSVPs?
mailto: is fine (the visitors are probably people you know; the email-client thing isn't a dealbreaker).Is the page a single static HTML file (no deploy pipeline)?
Is the page on a deploy platform with backend infrastructure already in place?
For most one-off event microsites, AI product landings, and freelancer contact pages, the answer is option 2 — third-party form service embed.
Once the form is wired up to a working endpoint, drop the page at a private link to test the submission flow on a real device — the local dev environment hides issues like CORS or third-party cookie blocks that show up in production. Free, no card, 7-day self-destruct.
A form on a publicly findable page attracts spam. Two layers worth specifying in the prompt:
mailto: and serverless routes, add the field manually.For low-volume personal forms or pages distributed via private links (where the visitor list is bounded), the spam concern is minimal and the honeypot is enough.
Each AI builder handles the form differently:
For the portable-HTML output pattern, the third-party form service is the right shape because the page stays portable while the submission flow works.
Static HTML + third-party form embed isn't a CRM. The submissions land in email or a dashboard; integrating with HubSpot, Salesforce, or a custom database is its own work. For most personal events, landing pages, and one-off contact forms, the integration overhead is unnecessary.
For projects that genuinely need the CRM integration, the right shape is option 3 (serverless route) plus the CRM API. The form-service shape covers everything in between.
The right framing: name the submission path in the prompt. The AI tool builds the UI well; it can't guess where the data should go. Specifying upfront is what closes the loop between "the form exists" and "the form actually works."
Nothing happened when you asked Claude to publish. There are four separate things it could mean, they look identical from the chat window, and each has a different fix. Here's how to tell them apart in order.
AI builders default to heavy: full framework bundles, web fonts, icon libraries, generous markup. Prompts that ship lean from the start, plus the trim pass for what slipped through.
AI tools default to modular HTML — clean for development, fragile for one-file delivery. Cross-tool prompt templates that produce a single portable file from the first generation.
miinideck turns a single HTML file into an unguessable link with optional password and expiry. Default-private, never indexed.