Quick answer: Give any static site on GitHub Pages, Netlify, or Vercel a working contact form—one action URL, no server, no database, free.

You built the page in an afternoon, pushed it to GitHub Pages or Netlify, and it looks great—until someone hits Send on your contact form and nothing happens. The page is a file; a static host serves files. A form POST needs somewhere to land, and "somewhere" is exactly what a static host does not give you.

Here is the platform-neutral fix: keep every byte of your site static, and point the form's action at a hosted endpoint that stores submissions for you. One line of HTML, the same on every host.

The one thing static hosts can't do for you

Each popular host handles this gap differently, and the differences are traps in disguise:

Three of the four options bolt your data to one platform or ask you to write server code. The fourth is a URL that works everywhere.

The two-minute setup

Publish any form (or blank intake) on FormLM and you get an endpoint: https://formlm.me/api/v3/share/<token>/form. Point your existing HTML form at it:

<!-- the same snippet on GitHub Pages, Netlify, Vercel, or a bare nginx box -->
<form action="https://formlm.me/api/v3/share/YOUR_TOKEN/form" method="POST">
  <input name="name" placeholder="Your name" required>
  <input name="email" type="email" placeholder="Email" required>
  <textarea name="message" placeholder="How can we help?" required></textarea>
  <!-- honeypot: hidden by CSS—bots fill it, humans never see it -->
  <input name="company" tabindex="-1" autocomplete="off"
         style="position:absolute;left:-9999px">
  <button type="submit">Send</button>
</form>

That is the entire integration. No build step, no keys in your repo, no function to deploy. The name attributes become the stored fields—add an input today and tomorrow's submissions carry the column. Prefer to keep visitors on the page? Swap the native submit for a fetch POST against the JSON side of the same endpoint and show an inline confirmation; the storage behaves identically.

Verify it before you push

Because the endpoint is just HTTP, you can test the whole pipeline from a terminal—no browser, no deployed page:

# submit like the browser would, then read it back
curl -X POST "https://formlm.me/api/v3/share/YOUR_TOKEN/form" \
  -d "name=Smoke Test&email=me@example.com&message=hello"
curl "https://formlm.me/api/v3/share/YOUR_TOKEN/query?page=1&size=10"

Records come back as JSON; the data UI in your dashboard shows the same submissions in a human inbox, with CSV export one click away. The long tail—paging loops, aggregates, scheduled exports—is covered in Your Form Data, Programmable.

Why not the other options

"'Static site' describes how your pages are served, not how little your data has to be. A form is nine characters of action away from a real inbox—keep the host you like and let the URL be the backend."

🛠️ Ship the contact form tonight

One free endpoint covers the whole job—no server anywhere in this picture:

  • Accepts plain HTML POST — works on GitHub Pages, Netlify, Vercel, Cloudflare Pages, or any host
  • Free plan — publishing and collecting submissions, no per-call charge
  • Inbox + query + summary + CSV — the read side ships with the write side
  • Abuse guards — per-endpoint rate limiting, plus a honeypot pattern that makes spam unmistakable at read time
Create your form endpoint →

✅ Key Takeaways

  • Static hosts serve files; a form POST needs a destination, and only Netlify offers one—and it is host-locked
  • A hosted form endpoint turns "collect submissions" into one action URL that works on every host
  • Field names come from your name attributes—add inputs freely, no schema migration
  • Test with curl before you deploy; read with the data UI, query API, or CSV after
  • Hide a honeypot input—stored records with a value in it are bot traffic, easy to spot and filter at read time
  • Your site stays static—only the data stops being homeless

Building the page to capture leads rather than just answer email? The Trust Lead Generation and B2B Marketing tracks turn the same form into a funnel with a report at the end of it.

Frequently Asked Questions

Can GitHub Pages handle form submissions?

No. GitHub Pages serves static files only—a POST from a form there has nowhere to go. The fix is one line: point the form's action at a hosted endpoint such as the FormLM Data API. Your page stays pure static; the submissions land in a server-side store you can browse, query, or export.

I use Netlify Forms—why would I want an alternative?

data-netlify="true" only works while the site is built and served by Netlify. Move to GitHub Pages, Vercel, or your own server and the captured submissions vanish with it. A platform-neutral action URL keeps the same inbox alive wherever the page is hosted.

Do I need JavaScript to make the form work?

No. The endpoint accepts a plain HTML form POST, so the form works even with scripts disabled. If you would rather keep visitors on the page and show an inline success message, a few lines of fetch do it—the same endpoint, same token.

What stops bots from flooding my form?

Rate limiting on every endpoint throttles flooding, and a honeypot field hidden with CSS flags the bots that get through: spam submissions carry a value in a field humans never see, so they stand out at a glance in the inbox and in query results—and are trivial to filter at read time.

← Previous: Programmable Form Data Next: Form Backend for AI-Generated Sites →