When Formspree stops sending email, the submission usually still reached Formspree: the email is what failed. Check five things in this order: your spam folder (and Outlook's quarantine), the plan's monthly limit, whether your email server bounced Formspree, whether the form still posts to an email address instead of a form ID, and whether the address it sends to is verified. Your Formspree dashboard tells you which: if the submission is there, the form works and only delivery broke.
Key takeaways
- Open your Formspree dashboard first. A submission that is there but not in your inbox means delivery failed, not the form.
- Past the monthly limit, Formspree keeps accepting submissions but stops emailing them, and holds them in an Over Limit folder until you upgrade.
- If your mail server once rejected a Formspree email, Formspree blocks that address until you unblock it at
formspree.io/unblock/followed by the address. - Forms that post to
formspree.io/your@email.comare legacy forms that Formspree is phasing out; move them to a/f/form ID. - A form field without a
nameattribute is never sent, so its email arrives blank.
Check these five things first
- Spam, and Outlook's quarantine. Search your mail for "formspree" rather than scrolling. Formspree's own guide to missing emails starts here, and adds that Outlook 365 can quarantine the formspree.io domain, which hides messages from the junk folder too. A Microsoft 365 admin can release them from quarantine.
- The monthly limit. The Free plan includes 50 submissions a month (Formspree plans, checked October 2026). Past the limit, Formspree keeps accepting submissions but sends no notification emails, emails you once to say so, and holds the rest in an Over Limit folder where you only see a preview of each. Upgrade, then reprocess them to get the emails.
- Your mail server bounced Formspree. If your server once answered a Formspree email with an error, Formspree blocks that address so it doesn't keep bouncing. Open
https://formspree.io/unblock/you@example.comwith your own address in place of the example. - The form posts to an email address. Look at your form's
action. If it ishttps://formspree.io/you@example.com, it is a legacy form, and Formspree is phasing those out. A legacy form only delivers once you click its activation email: Formspree holds the first submission for 24 hours and discards the ones after it until then. Create a form in the dashboard and use itshttps://formspree.io/f/address instead. - The address it sends to isn't verified. A form can only send to your verified email addresses. If you changed where the form sends, link and verify the new address in your account first.
Is it the form or the email?
Send the form once with your browser's developer tools open on the Network tab, and look for the request to formspree.io.
- No request appears: the form never sent. Check that the
actionis your Formspree address, themethodispost, and no script stops the submit without sending it. - A success, or a redirect to Formspree's thank-you page: Formspree has the submission. Find it in your dashboard and work through the email checks above.
- A 429: the form was sent more than 20 times in a minute, Formspree's rate limit for each form (Formspree system limits). Wait a minute and try once.
- Another 4xx: read the response. Formspree says what it refused.
To rule out your page completely, send a test from a terminal, with your form's ID:
curl -X POST https://formspree.io/f/YOUR_FORM_ID \
-H "Accept: application/json" \
-d "email=test@example.com" -d "message=Test from curl"
If that arrives and your form's doesn't, the problem is on your page.
The email arrives, but it's blank
Browsers only send fields that have a name attribute, so an input without one reaches Formspree empty. Formspree's note on blank emails has the fix: give every input, textarea and select a name. Forms written by coding agents often set only an id, which isn't enough.
It works on your computer but not on the live site
- A different form ID. Projects often keep one form for development and another for production. Check the
actionin the deployed HTML, not in your editor. - A script that expects JSON. A form sent with
fetchshould send the headerAccept: application/json; that is how Formspree tells a script from a page. Without it, Formspree answers the way it answers a browser form, with a redirect, which a script can mistake for a failure. - Your host isn't the cause. A form that posts to Formspree goes straight from the visitor's browser to formspree.io, so Vercel, Netlify or Cloudflare never see it. Only if your own server or a serverless function forwards the form does the host matter, and then its logs show the error.
Symptoms and fixes at a glance
| What you see | Most likely cause | Fix |
|---|---|---|
| In the dashboard, not in your inbox | Spam, quarantine or a bounce block | Search spam, release from quarantine, open the unblock page |
| Emails stopped mid-month | The monthly limit | Upgrade, then reprocess the Over Limit folder |
| Nothing in the dashboard either | The form never sent, or posts to an email address | Check the Network tab and the action |
| A 429 response | More than 20 posts in a minute | Wait a minute, then send once |
| Email arrives with empty fields | Fields without name | Add a name to every field |
| Works locally, not live | A different form ID, or a script without the JSON header | Check the deployed action and the request headers |
Keep the lead even when the email fails
Most of these failures share one thing: the lead exists, and nobody hears about it. Formspree handles the first half well. Submissions it accepts stay in your dashboard, so check it after any outage. The gaps are the ones above: leads past the limit stay hidden behind a preview until you pay, a legacy form discards everything after its first submission until it is activated, and nobody hears about a lead whose email bounced until they think to look.
Whatever you use, make the stored lead the source of truth and the email only the alert.
How OllieLeads handles the same failures
OllieLeads is a form backend built on that rule: every lead is stored before your visitor sees the thank-you page, and you hear about it by email, Slack or Discord within a minute. Here is how the failures above play out on each (plans checked October 2026 on Formspree's plans and OllieLeads pricing):
| When this happens | Formspree | OllieLeads |
|---|---|---|
| You use the free plan | 50 submissions a month | 500 leads in total, with no monthly reset |
| You pass the free limit | Kept in an Over Limit folder as previews, with no emails, until you upgrade | 7 days with nothing changed, then new leads are kept for 30 days, showing the form, time, source and first name, until you upgrade |
| You need more | Personal: $15 a month for 200 a month. Professional: $30 for 2,000 | Pro: $29 a month for 1,000 a month, then $10 for each extra 1,000, and capture never pauses |
| The alert email fails | The submission stays in your dashboard | The lead stays in the app, and the same alert can also go to Slack or Discord |
| A new form goes live | Legacy email forms wait for activation | No activation: a form takes leads as soon as its site is allowed |
| A visitor leaves halfway | Nothing is saved | Contact fields are saved with the OllieLeads script, after consent where the law asks for it |
On OllieLeads, only leads with an email address or phone number count toward a plan; spam and test leads never do.
Formspree does some things OllieLeads doesn't. It takes file uploads, it has a longer track record and a catalogue of plugins, and at 2,000 a month its Professional plan ($30) costs less than OllieLeads Pro with one extra block ($39). If those matter more to you than the failures above, stay, and fix the cause with the checklist.
Moving a Formspree form to OllieLeads
- Create the form in OllieLeads, or ask your coding agent: Claude Code and Cursor can connect it through OllieLeads' remote MCP server.
- Allow your site. OllieLeads refuses browser posts from sites that aren't on the brand's allowed list, so add your domain first.
- Change the
actiontohttps://ollieleads.com/f/YOUR_FORM_ID. Field names stay as they are, and a_nextfield keeps working as long as it points at a page on your own site. - Send a test lead. Posts from local development (
localhoston port 3000, 5173, 4321 or 8080) count as tests automatically, so they never use up your plan.
A side-by-side comparison with Formspree goes through the rest, and the guide to contact forms not sending email covers the same problem for any form service.
FAQ
Why does my Formspree form say it was sent, but no email arrives?
Because Formspree accepted it and the email is what failed. Open the form's submissions in your dashboard: if the submission is there, check spam and Outlook's quarantine, open Formspree's unblock page for your address, and check whether you passed the monthly limit, which stops the emails but not the submissions.
Where does Formspree keep submissions when the email fails?
In the form's submissions in your dashboard. Submissions past the monthly limit go to an Over Limit folder instead, where you see only a preview of each until you upgrade and reprocess them (Formspree).
How many submissions does the Formspree free plan include?
50 a month. Paid plans start with Personal at $15 a month, or $10 a month billed yearly, for 200 submissions a month (Formspree plans, checked October 2026).
Can I still post a form straight to my email address with Formspree?
Those are legacy forms, and Formspree is phasing them out: they expose your address to bots and rely on a header browsers now limit. Create a form in the dashboard and point your action at its /f/ address.
What should I use if Formspree's emails keep failing?
First fix the cause above: most are settings, not Formspree faults. If you want a service where the alert can fail without the lead being out of reach, compare form backends on what happens when email fails and when you pass a limit. OllieLeads stores every lead first and never stops capturing on a paid plan; Basin, Web3Forms and Netlify Forms are other options, each with its own free tier, so check their pricing pages before you switch.
Published with SuperDuperSEO