Skip to content
StaticBackend

HTML form submissions on a static site, with no server

Point the form's action at a hosted endpoint and the page needs no server. Web3Forms takes 250 submissions a month for $0, Forminit 100 and Formspree 50, and none of them care where the HTML is hosted.

<form action="https://api.web3forms.com/submit" method="POST">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY">

  <label>Name <input type="text" name="name" required></label>
  <label>Email <input type="email" name="email" required></label>
  <label>Message <textarea name="message" required></textarea></label>

  <button type="submit">Send</button>
</form>

That is the whole integration. You create the access key on Web3Forms with the address that should receive the messages, and every submission lands in that inbox. Formspree, Forminit and Basin work the same way: each gives you an endpoint URL per form and the browser posts straight to it, so the page can sit on ship.page, Cloudflare Pages, GitHub Pages or any other static host without changes.

Free form backends compared on submissions, files and price

Service Free plan File uploads on free Cheapest plan with more
Web3Forms 250 submissions a month None Pro: $149 a year (about $12 a month), 10,000 a month, file uploads
Formspree 50 submissions a month, 30-day archive None Personal: $15 a month, 200 a month
Forminit 100 submissions a month, 1 form 100 MB stored Pro: $16 a month ($190 a year), 5,000 a month
Basin 50 submissions a month, 1 form 100 MB stored Starter: $12.50 a month, billed yearly

Prices and limits come from each vendor's own pricing page. Use the free tier numbers as the hard cap: once a month's quota is gone, extra submissions are either held back or dropped, depending on the service.

Web3Forms: 250 free submissions and one hidden field

Web3Forms gives 250 submissions a month at $0 and needs only the hidden access_key field from the example above. File attachments are a Pro feature: Pro costs $149 a year, about $12 a month, and raises the quota to 10,000 submissions a month. A cheaper Starter plan at $49 a year skips file uploads. Use Web3Forms when a contact form just needs to reach an inbox.

Forminit (formerly Getform): attachments on the free plan

Forminit, the renamed Getform, allows 100 submissions a month, 1 form and 100 MB of stored files for $0. Pro is $16 a month ($190 a year) for 5,000 submissions and 1 GB of storage; Business is $50 a month. Pick Forminit when the form takes CVs, screenshots or other files and you want them kept next to the submission.

Formspree: the best-known name, the smallest free tier

Formspree covers 50 submissions a month on the free plan, keeps a 30-day archive and stores no files. Personal is $15 a month for 200 submissions, Professional $30 a month and Business $90 a month. Formspree fits a team that will outgrow a free tier anyway and wants a familiar vendor on the invoice.

Basin: one free form with 100 MB of files

Basin gives 1 form, 50 submissions a month and 100 MB of file uploads for $0. Starter is $12.50 a month billed yearly and Growth $24.17 a month. Basin suits a single landing page form that may need attachments.

Netlify Forms works only on Netlify hosting

Netlify Forms needs no third-party endpoint. Add data-netlify="true" to the form tag, turn on automatic form detection for the site, and Netlify picks the form up at deploy time (setup docs). The catch is hosting: Netlify only processes forms on sites deployed to Netlify, whose Free plan is $0 with 300 credits a month (pricing). A page on ship.page, Cloudflare Pages or GitHub Pages needs one of the services above instead.

File uploads from a static HTML form

Web3Forms and Formspree take no files on their free plans, while Forminit and Basin store up to 100 MB. For larger files, or when the files should live in your own bucket, have a small Worker hand the browser a presigned upload URL for Cloudflare R2, which includes 10 GB-month of storage for $0 (R2 pricing). The storage guide has the full setup.

Spam and abuse on a public form endpoint

Everything in a static page is public, the access key and endpoint URL included. That is by design: the key only decides which inbox gets the message. It also means anyone can script thousands of posts at it. A few rules keep that cheap:

A burst of fake submissions also burns your monthly quota. With 50 free submissions on Formspree or Basin, a single bot run can use up the month, so pick the 250-submission Web3Forms tier for any page that gets real traffic.

Where to host the page that holds the form

The browser posts straight to the form service, so the host does not matter. For a page you need online in seconds, ship.page publishes HTML with no account (10 MB per HTML file, link lasts 7 days, $4 a month on Pro to keep it). For a permanent free site, Cloudflare Pages and GitHub Pages cost $0 and take a custom domain. The free HTML hosting benchmark and the Netlify Drop alternatives test have the full numbers.

Frequently asked questions about static HTML forms

Can a form on GitHub Pages send me an email?

Yes. GitHub Pages serves static files only, so point the form's action at Web3Forms (250 free submissions a month), Forminit (100) or Formspree (50). The service receives the POST and emails you each entry. Netlify Forms will not work there, because Netlify only processes forms on sites it hosts.

Is it safe to put the Web3Forms access key in my HTML?

Yes, it is built to be public. The key only routes submissions to the inbox you registered, so the worst case is spam in that inbox and a used-up quota. Keep every other credential out of the page: SMTP passwords, database keys and API secrets are readable by anyone who opens view-source.

Why do my Netlify form submissions not show up?

Netlify only collects submissions for forms it detected at deploy time. Check that the form tag carries data-netlify="true", that form detection is enabled for the site, and that you deployed again after both were set. A copy of the form on another host never reaches Netlify at all.