Formspree, Basin, Getform: I ran the same form through all of them
March 30, 2026 · 9 min read
Yes, I know, this is the company blog. Yes, I'm going to tell you FormTo is good somewhere at the bottom. But I'm also going to tell you the honest parts, because if you've read ten "alternatives to X" pages this week you can already smell the marketing from three paragraphs away, and I'd rather just show you what I found.
Here's the setup. I spun up a boring landing page with a boring contact form. I pointed it at four different hosted form backends, one at a time, and pushed fifty real-looking submissions through each — half from humans (thanks to the three people I bribed with coffee), half from scripts. I wired each one to a Slack webhook and a Google Sheet. Then I tried to break them on purpose.
This is what happened.
The contenders
| Tool | Starting paid plan | Free tier submissions | Headquarters |
|---|---|---|---|
| Formspree | $10/mo | 50/mo | Pennsylvania, US |
| Basin | $12.50/mo | 100/mo lifetime | Australia |
| Getform | $15/mo | 50/mo | Delaware, US |
| FormTo | $9/mo | 25/mo | EU |
Prices change. This was accurate the week I ran the test. Do your own spot-check before you sign anything.
Round 1: how long does it take to ship?
The first test was stupid-simple: create account, create form, paste the URL into an HTML page, submit a test. Stopwatch on.
- Basin: 2 minutes 40 seconds. The onboarding is blessedly boring. You make a form, you copy a URL, you're done.
- FormTo: 3 minutes 10 seconds. Close second. Lost a few seconds because I clicked through the email template editor and got distracted customizing it.
- Formspree: 4 minutes 50 seconds. A small wall of upsells and a confirm-your-email step that Basin skipped.
- Getform: 6 minutes. The dashboard wants you to name things and pick categories before you can get the endpoint. Not painful. Just… extra.
Nobody failed this round. But if you're shipping a landing page on a Sunday night, those four minutes are four minutes you care about.
Round 2: the spam test
Here's where it got interesting. I wrote a dumb little script that fires 200 requests in 30 seconds from the same IP. Half had a blank honeypot field. Half had random junk in it. All had a user-agent of curl/8.4.0 because I wanted to see who even checks.
What got through to the notification channel:
| Tool | Honeypot blocked | Rate limit kicked in | UA-based filter |
|---|---|---|---|
| Formspree | Yes (configurable) | After ~40 | No |
| Basin | Yes (automatic) | After ~60 | Partial |
| Getform | Only if you enable it | Did not trigger | No |
| FormTo | Yes (automatic) | After ~25 | Yes |
Getform surprised me here — the defaults are too permissive. I had to dig through settings to turn on what the others give you out of the box. That's a footgun for anyone who doesn't read docs before launch.
Formspree and Basin both held up well. FormTo was the strictest by default, which is great if you run public marketing pages and annoying if you're load-testing your own form (guess how I know).
Round 3: the webhook delivery test
This is the round I care about most, because webhooks are where "it works in the demo" becomes "it works at 2 a.m. when Slack is having a bad day."
I pointed each tool at a webhook URL I controlled. Then I made that URL fail — 500 errors, then timeouts, then random slow responses between 200ms and 30 seconds. I wanted to see what survived.
- Formspree: fires once, then gives up. No visible retry on the $10 plan. You can see the failure in the dashboard but you have to refire manually.
- Basin: retries with backoff for about an hour. Clean logs. I liked this a lot.
- Getform: retries, but the log view is hard to parse. I couldn't tell from the UI which delivery was which attempt.
- FormTo: retries with backoff, logs every attempt with a correlation ID, and lets you replay a delivery from the dashboard. (I'm biased because I worked on it, but this is table stakes and Formspree really should catch up.)
If you're pushing submissions into a CRM or a queue that occasionally hiccups, retries are not a nice-to-have. They're the whole point.
Round 4: the dashboard
Honestly, this one is personal taste. I'll just tell you what I liked and didn't.
- Formspree: polished, familiar, leans into "marketer-first." Great for agencies handing a login to a client.
- Basin: minimalist. Feels like a developer tool. Very few clicks to do anything. I enjoyed it.
- Getform: the most visually busy. Lots of sections, lots of menus, lots of upsell banners. Functional but noisy.
- FormTo: somewhere between Basin and Formspree. You get charts for submission volume, a full-text search that actually works, and an email template editor that doesn't make you hate HTML.
Where each one wins
I genuinely don't think there's a single right answer here. Here's my honest read.
Use Formspree if you've been using it for years and it works. Don't switch just because a blog post told you to. The brand recognition is real and the product is mature.
Use Basin if you want the most developer-friendly experience and you're fine with fewer bells and whistles. It's the tool I'd pick for a side project I want to forget about.
Use Getform if you really need their specific integration list or you're already in their ecosystem. I didn't find a standout reason otherwise.
Use FormTo if you want:
- EU data residency without paying enterprise prices
- Webhook replay and correlation IDs without thinking about it
- Submission search that handles 10,000 entries without lag
- A cheaper entry plan ($9 vs $10–15) and an honest free tier for testing
The thing nobody talks about
Every one of these tools does the happy path well. Where they separate is at the edges: retries, spam surges, migration off, data export, the hour you spend debugging a webhook at midnight. Before you pick one, send a spam burst at it. Break its webhook on purpose. Export your data and see what comes back.
I did the work. I'd rather you read this than find out the hard way.
If FormTo sounds like your kind of tradeoff, the free plan gives you 25 submissions a month, no card required. Paste the endpoint, break things on purpose, see if you agree with me.
And if you end up somewhere else — that's fine too. Just don't build your own. Here's why.
More posts