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:
- GitHub Pages — no form support whatsoever. The
actionattribute has to point off-platform, full stop. - Netlify —
data-netlify="true"captures forms at build time. It works, but only while you stay on Netlify: migrate away and your submission history and spam filters go with it. - Vercel — static files are free; capturing a POST means writing and deploying a serverless function.
- Cloudflare Pages — same story: without a Worker, a form has nowhere to go.
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:
<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:
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
mailto:— opens the visitor's mail client (if they have one) and hands your address to every scraper on the internet. It is a 1998 solution.- Embedded iframe forms — fast to drop in, but you inherit someone else's styling, a visible brand, and a layout that breaks on the page your designer just perfected.
- Rolling your own function — a serverless POST handler is easy; the mail pipeline, spam filter, dashboard, export, and uptime page you will write around it are not.
- A hosted endpoint — your markup stays yours, your site stays static, and storage, spam handling, and retrieval are somebody else's job. That is the trade this article is selling.
"'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
✅ 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
actionURL that works on every host - Field names come from your
nameattributes—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.
