Formspree HTML Forms vs JavaScript Forms vs Formbutton: Which Should You Use?
Updated
Choose HTML forms if you want the simplest possible setup: point a standard <form> at your Formspree endpoint and you're done, no server code required. Choose JavaScript forms if you're building with React and want the Formspree CLI, a React library, and CI/CD deployment for production. Choose Formbutton if you want a popup form you can drop onto any site with a copy/paste snippet. All three submit to the same Formspree backend, so the differences are about your frontend stack and how much control you need.
The three options side by side
| Dimension | HTML forms | JavaScript forms | Formbutton |
|---|---|---|---|
| Integration effort | Set the form's action to your endpoint |
Use the Formspree CLI and React library | Copy/paste a snippet |
| Frontend requirement | Plain HTML | JavaScript/React | Any site that can host the snippet |
| Form presentation | Inline on your page | Dynamic, built in your app | Popup overlay |
| Deployment | Static page, no build step | CI/CD for production forms | Paste and publish |
| Best for | Static sites, quick contact forms | React apps, dynamic forms | Lead capture without designing a form section |
HTML forms: the lowest-friction path
Formspree's HTML approach requires no server code. You write a normal form and set its action to your Formspree endpoint, using method="post":
<form action="https://formspree.io/f/{form_id}" method="post">
<label for="email">Your Email</label>
<input name="Email" id="email" type="email">
<button type="submit">Submit</button>
</form>
Replace {form_id} with the ID from your Formspree account. The expected result is that submissions arrive in your Formspree Inbox and trigger your configured notifications.
Use this when: you have a static site or a page where you can edit HTML directly, and you don't want a build pipeline. Watch for: the endpoint and field names must match your form configuration; a typo in the action URL means submissions go nowhere.
JavaScript forms: for React and CI/CD workflows
The JavaScript path is aimed at developers building dynamic forms. Formspree provides a CLI and a React library, and the site explicitly supports deploying production forms with CI/CD. This is the option to pick when your form lives inside a React application, needs to be generated or versioned as part of a build, or must ship through your existing deployment pipeline.
Use this when: your frontend is React-based or you want form configuration managed in code and deployed automatically. Watch for: this adds tooling and a build step, so it's overkill for a single static contact form.
Formbutton: popup forms with a snippet
Formbutton is a copy/paste snippet that overlays a popup form on your site. You don't design a form section or wire up an endpoint manually; you paste the snippet and get an attractive popup.
Use this when: you want to capture leads or feedback without restructuring a page, or you're adding a form to a site where inline form markup is inconvenient. Watch for: popups interrupt the browsing experience, so placement and trigger timing matter more than with an inline form.
What happens after submission (same for all three)
Whichever option you choose, the backend behavior is identical. According to Formspree, after a submission:
- Spam is blocked and data validated — server-side validation plus machine-learning spam filtering.
- Email notifications and auto-responses are sent — templates are customizable.
- Submissions are saved to the Formspree Inbox — with daily analytics and export to CSV or JSON.
- Third-party integrations fire — direct integrations include Google Sheets, Airtable, Slack, HubSpot, Mailchimp, Notion, Stripe, and webhooks, with no Zapier required.
Spam controls include the Formshield machine-learning filter, one-click reCAPTCHA, and custom rules.
How to decide
- Static HTML site, fastest setup → HTML forms.
- React app or CI/CD-managed forms → JavaScript forms.
- Popup capture on an existing page → Formbutton.
If you're unsure, start with HTML forms: it's the least setup and you can migrate to the JavaScript library later if your frontend grows into React. For current plan details and limits, check Formspree's Plans page, since feature availability can vary by plan.