Quick answer: AI-generated landing pages ship with dead forms. One action URL—or one line in the prompt—makes them collect submissions into a real inbox.

A new kind of homeless form is multiplying: not the one you hand-wrote and forgot to wire, but the one Claude, Cursor, Bolt, v0, or Lovable generated for you. The page lands perfect—hero, sections, a beautiful intake form, deploy to GitHub Pages in one click. And then the first visitor hits submit, and the leads evaporate.

Language models are fluent in markup and terrible at infrastructure: they write a <form> with no destination because there is nothing in the training data that says where your data should go. The fix is to supply the destination—three ways, from smallest touch to full delegation.

Option A: one line in the prompt

If you are generating the page right now, give the model the destination before it starts. Append this to your prompt (or your project rules file in Cursor/Claude Code):

# paste after your design instructions
Wire every form on this page to POST to
https://formlm.me/api/v3/share/YOUR_TOKEN/form
— plain HTML form action, one field per input, descriptive
field names. Show an inline success message on submit.

The model emits a working form on the first pass. Field naming is the only craft: name attributes become stored columns, so ask for the keys you will want to read later—company_size, not q3.

Option B: keep the design, change one attribute

The page already exists and the form is decorative? Do not regenerate—patch. Native POST works with zero JavaScript:

<!-- the AI's markup stays byte-for-byte; only the action changes -->
<form action="https://formlm.me/api/v3/share/YOUR_TOKEN/form" method="POST">
  <!-- ...every input the model designed, untouched... -->
  <input name="page_source" type="hidden" value="pricing-cta">
</form>

Hidden inputs are your friend for context the model could not know: which button sent the lead, which campaign, which version of the page. Prefer fetch over native submit? The same endpoint accepts JSON, and CORS is open—hand the agent the fetch variant and it will rewire the handler in place.

Option C: let the agent own the whole pipeline

The deepest fix is to stop handing agents a URL and start handing them the ability to make one. formlm-cli installs as an MCP server in Claude Desktop, Cursor, Codex, and friends: the agent creates the form, publishes it, receives the endpoint URL, and embeds it into the page it is building. Storage stops being an integration you forgot to prompt for and becomes one more tool the agent reaches for—like a designer who plugs in the mailbox before painting the door. The full walkthrough lives in Build a Complete Assessment in Claude Desktop, and per-platform configs are in the Data API for AI Agents docs.

What comes back out

Once the pipe is live, the read side is the same toolbox any static-site form has—an inbox in your dashboard, /query for paging through records, /summary for aggregates, one-click CSV (the loop patterns are in Programmable Form Data). The AI-era bonus is ?help: append it to the endpoint and it returns the current field schema as Markdown—so you can paste the endpoint itself into tomorrow's agent conversation and let it analyze last week's leads without you re-explaining anything. Because unknown keys auto-create columns, even the fields a model invented mid-generation are captured, not dropped.

"Generation made design free; the plumbing was the last paid good left. One URL makes the plumbing free too—and the agents that wrote your page are exactly the ones who can wire it."

🛠️ Point your AI-built page at a real inbox

Everything this article wires together is free to start:

  • One endpoint — accepts native HTML POST and JSON from any origin, deployed or local
  • Auto-schema — whatever fields the model invents become columns, no migration step
  • ?help self-docs — the live field list, Markdown, readable by you and by your agent
  • formlm-cli + MCP — let the agent publish the form instead of you patching the page
Create your endpoint, then go prompt →

✅ Key Takeaways

  • AI page builders generate forms as props—fluent markup, no destination, silent data loss
  • Prompt the destination in (Option A) or patch one action attribute after (Option B); both take under a minute
  • Hidden inputs add the context the model could not know: campaign, button, page version
  • With the MCP server installed, the agent publishes the endpoint itself—wiring becomes part of generation
  • Unknown keys auto-create columns, so improvised AI fields are stored, not dropped
  • The same endpoint answers with its own schema (?help)—hand that to an agent for analysis next

Using the AI-generated page as a client deliverable rather than a pet project? The Consultant and Workshop Design tracks cover intake and registration pages that earn their keep as reports.

Frequently Asked Questions

My landing page was generated by an AI tool—how do I collect the leads?

Keep the page exactly as the model designed it and change one attribute: point the form's action at a hosted endpoint such as https://formlm.me/api/v3/share/YOUR_TOKEN/form. Submissions store server-side; you browse them in an inbox, export CSV, or query them over HTTP.

The model invented field names I never planned. Is that a problem?

No. Unknown keys auto-create their own columns, so any field the AI dreams up simply becomes data. Read defensively (treat missing keys as null) and append ?help to the endpoint to see the current field list at any time.

Can the agent wire the whole pipeline by itself?

Yes—with formlm-cli installed as an MCP server, the agent can create the form, publish it, get back the endpoint URL, and embed it in the page it is generating. The wiring becomes part of the generation, not a manual step afterward.

Does this work for pages I open locally, before deploying?

It does. The endpoint is plain HTTPS, so a file:// page or a local prototype posts to it the same as a deployed site—useful while you are still iterating on an AI-generated draft. CORS is open, so fetch-based wiring works from local origins too.

← Previous: Static Hosting Form Guide Next in docs: The MCP Walkthrough →