In a nutshell...
Formspree
A standalone form backend that works on any host and any framework, for forms that need to outlast your hosting choice.
Netlify Forms
A form handler built into Netlify hosting, for simple static forms on sites that will stay on Netlify.
Formspree and Netlify Forms, side by side
What you get, what you give up, and what you pay with each.
Formspree prices are billed monthly. Netlify details reflect its current credit-based plans, as of October 2026; legacy plans differ.
Both handle the basics, and that's where the similarities end.
Both are form backends that work well for static sites. You point an HTML form at them, they email you each submission, filter out spam, and save everything to a dashboard you can look back through.
Where they differ is what happens next. Netlify Forms notifies you by email, Slack, or webhook, and anything beyond that goes through Zapier or n8n. Formspree notifies you by email, Slack, Discord, Telegram, or WhatsApp, and sends submissions straight into Google Sheets, Airtable, Notion, HubSpot, Mailchimp, Trello, and more, so you don’t need a separate automation account.
On paid plans it can also send the person who filled in the form a confirmation email, and you can write your own email templates. Netlify Forms does neither.
Netlify Forms only work on Netlify.
The whole detection mechanism runs inside the Netlify build system. When you deploy, it scans your rendered HTML for a data-netlify attribute and provisions an endpoint for each form it finds. That machinery does not exist off-platform.
If you decide next year to move to Cloudflare Pages, Vercel, or a VPS of your own, your forms don't come with you. You'd re-wire every submission handler and rewrite the backend contract from scratch. The forms belong to the Netlify platform, and they stay there when you leave it.
Formspree is a standalone endpoint. The action attribute is a URL, and the URL doesn't care where the HTML that surrounds it is served from. Move hosts as often as you like, and the form keeps working.
JavaScript forms need a workaround on Netlify.
Netlify's detection only sees markup that's in your build output. Forms rendered at runtime by React, Vue, or Svelte are not in the HTML at deploy time, so the scraper never finds them and no endpoint gets provisioned.
The documented workaround is to duplicate a hidden static version of every form into your build so the scraper picks it up, then hydrate the real interactive form over the top. If your stack is pure SSR or SSG, that's a papercut. If it's an SPA, it's ongoing work every time a field changes.
Formspree doesn't scrape anything. The endpoint URL is the form API, and it doesn't care when or how your form markup came into existence, whether server-rendered, client-rendered, hydrated later, or injected by a third-party widget. Post to the URL and it works.
Spam filtering is ongoing work.
Netlify Forms runs every submission through Akismet, and you can add a honeypot field or reCAPTCHA on top. For a personal contact form, that’s often enough.
Public forms attract more spam, and smarter spam, over time. Keeping up is an arms race that needs a filter trained on real traffic and updated as new patterns appear.
Formspree runs Formshield, its machine-learning filter, trained on the five million+ submissions we process each month and updated continuously. It comes with built-in support for reCAPTCHA, hCaptcha, and Cloudflare Turnstile, a honeypot field, and domain restrictions, and from the Professional plan you can tune its sensitivity and block whole categories of spam. It’s on us to keep it working.
Switching is a one-line change.
Both services take submissions from HTML forms. To move from Netlify Forms to Formspree, you point your HTML form's action at a Formspree endpoint and drop the data-netlify attribute. Field names stay exactly as they are.
The change is a five-minute edit per form, with your framework, templates, and hydration setup left alone. Roll it back any time.
Just use Formspree.
Netlify Forms works well if your site stays on Netlify, your forms are plain HTML, and spam is light. If any one of those things changes, you’ll need to do some workarounds.
Formspree is built for the case where the form is yours and the backend is someone else's job. It's decoupled from your host, works with any framework, prices independently, and moves with you if your stack ever changes.
Questions you might still be asking
Do I have to leave Netlify hosting to use Formspree?
No. Formspree handles the form endpoint, and your site can stay on Netlify. Only the form’s action URL changes.
How hard is it to migrate an existing Netlify form to Formspree?
Usually one line. Change the form’s action to your Formspree endpoint and remove the data-netlify attribute. Field names stay exactly as they are, and nothing else about the page changes.
What’s the best form backend service for a static site?
The one that follows your form across hosts. Netlify Forms fits when your site will always be on Netlify and your forms are static HTML. Formspree fits when you might move hosts, ship JavaScript-rendered forms, or want your forms billed separately from your hosting.
Can I add spam protection to an HTML form without server-side code?
Yes. Both Netlify Forms and Formspree filter spam on the backend, so you don’t run any spam code yourself. Netlify runs every submission through Akismet, with an optional honeypot field and reCAPTCHA. Formspree runs Formshield, its machine-learning filter, with built-in support for reCAPTCHA, hCaptcha, Cloudflare Turnstile, and a honeypot field.
Do both services support file uploads?
Yes. Netlify Forms accepts file uploads up to 8 MB per submission. On Formspree, file uploads start on the Personal plan, with up to 25 MB per file and no build-time detection or framework-specific setup.
Will Formspree work with my React, Vue, or Svelte app?
Yes. The endpoint URL is the form API, so Formspree works from any client-side framework, any server-rendered page, or any lifecycle stage. It accepts your form as-is, whether the markup is server-rendered, client-rendered, or hydrated at runtime.
What about submissions I have already collected in Netlify Forms?
Netlify lets you export submissions as CSV. You can archive that export and start fresh in Formspree, or push it into your CRM before you switch over.
Is there a free plan?
Yes. Free includes unlimited forms, 50 submissions a month, spam filtering, and notifications by email, Slack, Discord, Telegram, or WhatsApp. Paid plans start at $15 a month, raise the limit to 200, 2,000, or 20,000 submissions, and add file uploads, app integrations, and your own thank-you page, all billed independently of your hosting plan.
Do I need to know how to code to set it up?
You need a form on your site, but you don’t have to write the backend. Many people building with AI coding tools hand the whole setup to their agent. Point it at formspree.io/ai and it designs the fields and connects everything.