The short answer
The best contact form backend for a static site depends on one decision: where the submissions should live. If you want a full-featured hosted platform with integrations and support, Formspree and Formspark are the established choices. If you want the absolute minimum setup, FormSubmit forwards submissions to your inbox with no account. If you're staying on one host, Netlify Forms is built in and needs almost no code. If you want the data in a spreadsheet you own with no vendor in the middle, RG Forms provisions a Google Sheet and an Apps Script endpoint inside your own Google account for free. And if the form drives real business logic, writing your own serverless function is still the right answer.
Decide these four things first
Who should own the submissions? A vendor’s database, your host’s dashboard, or storage in your own account. This is the decision that’s expensive to reverse.
Does it need to work without JavaScript? If yes, you need a service that accepts a plain HTML form post with a redirect, which rules several options out immediately.
Will the site move hosts? Host-native forms are excellent until the migration, at which point they’re the thing that quietly breaks.
What does it cost at 10× volume? Most pricing is per submission per month. Model the year it works, not the week you launch.
The options
| Option | Best for | Data lives |
|---|---|---|
| Formspree | A mature platform with integrations, file uploads and support behind it | Their platform |
| Formspark | Developers who want a clean, no-nonsense paid endpoint | Their platform |
| FormSubmit | The fastest possible setup — no account, straight to your inbox | Your inbox only |
| Netlify Forms | Sites staying on Netlify that want near-zero code | Your Netlify dashboard |
| RG Forms | Free, and submissions in a Google Sheet you own with no vendor in the path | Your Google Drive |
| Your own function | Forms that trigger real logic — payments, CRM writes, complex rules | Wherever you send it |
Every one of these is a reasonable choice. Features and pricing move around — check each provider’s site before you commit.
How to pick, in one paragraph each
Pick a hosted platform (Formspree, Formspark) if you want someone else accountable for uptime, spam filtering and support, and you’re happy for submissions to live in their system. This is the default answer for most commercial projects and there’s nothing wrong with it.
Pick FormSubmit if the site is small, personal, and an email in your inbox is genuinely all you need. It’s the least ceremony of anything here.
Pick your host’s built-in forms if you’re confident you’re staying put. Netlify Forms in particular is a very good feature and needs almost no code.
Pick RG Forms if data ownership matters — a client’s leads in the client’s own Drive — or if you want a permanent record in a spreadsheet at zero cost, with an endpoint that doesn’t depend on any vendor continuing to exist.
Write your own function if the form does something beyond “tell me about it”. If there’s a charge to take, an account to create, or inventory to check, own the code.
Whatever you pick, do these
Send a real submission from the deployed site — not localhost, not a preview. The number of live contact forms that go nowhere is genuinely alarming.
Add a honeypot field — it costs nothing and removes most low-effort bot traffic before anything else has to think about it.
Show a real error state with a fallback email — a failed submission should never be a dead end for the visitor.
Check where the notification actually lands — and whether it survives a spam filter. Test with a non-Gmail address too.
Write down what happens if you stop paying — and where the archive would come from. Future you will want to know.
The RG Forms version, for reference
<form id="contact-form">
<label>Name <input name="name" required /></label>
<label>Email <input type="email" name="email" required /></label>
<label>Message <textarea name="message" required></textarea></label>
<!-- Honeypot: humans never see it, bots fill it in -->
<input type="text" name="_hp" tabindex="-1" autocomplete="off"
style="position:absolute;left:-9999px" aria-hidden="true" />
<button type="submit">Send</button>
<p id="form-status" role="status"></p>
</form>
<script>
const ENDPOINT = "https://script.google.com/macros/s/AKfycb.../exec";
const form = document.getElementById("contact-form");
const status = document.getElementById("form-status");
form.addEventListener("submit", async (event) => {
event.preventDefault();
status.textContent = "Sending…";
const res = await fetch(ENDPOINT, {
method: "POST",
// text/plain avoids the CORS preflight Apps Script can't answer
headers: { "Content-Type": "text/plain" },
body: JSON.stringify({
tab: "contact",
fields: Object.fromEntries(new FormData(form)),
}),
});
const data = await res.json();
status.textContent =
data.result === "success" ? "Thanks — we'll be in touch." : "Something went wrong.";
if (data.result === "success") form.reset();
});
</script>Common questions
What’s the difference between a form backend and a form builder?
A builder gives you the form — a hosted page or embed you configure. A backend takes the form you wrote in your own HTML and handles what happens after Submit. If you care how the form looks on your site, you want a backend.
Is a free option good enough for a client site?
It depends on the failure you’re insuring against. Free with the data in the client’s own Google account is a defensible choice. Free with no record anywhere is not.
How much spam should I expect?
A public endpoint on a public site will get bot traffic — it’s a matter of when. A honeypot removes most of it; a server-side captcha check removes nearly all of the rest.
Can I switch later?
Yes, easily. All of these are “point your form at a URL” tools, so migration is an endpoint swap plus moving whatever history you have. Export your data first — that’s the part people forget.
More answers in the full FAQ.