Formspree for Static HTML Forms

Static sites are fast, cheap, and easy to host — but HTML alone cannot process form submissions. You need an endpoint that accepts POST requests and delivers messages to your inbox or CRM. Formspree is the most approachable option for indie hackers: create a form in their dashboard, paste the endpoint URL into your action attribute, and submissions start arriving by email. No Lambda functions, no Express server, no database.

How Formspree fits the static stack

A typical pre-launch stack pairs Cloudflare Pages for hosting with Formspree for lead capture. The browser loads your page from the CDN; when a visitor submits the waitlist form, the browser sends data directly to Formspree's servers. Your static host never sees POST traffic. This separation keeps hosting simple while still giving you structured submissions you can forward to Slack, Zapier, or Airtable on paid plans.

Free tier and when to upgrade

Formspree's free plan includes a limited number of submissions per month — enough for early waitlists and contact forms while you validate an idea. Monitor volume in the dashboard; if you approach the cap, upgrade or add honeypot fields to reduce spam waste. Paid tiers add file uploads, custom redirect URLs after submit, and team inboxes. None of that is required on day one.

Minimal waitlist form markup

Every Formspree form needs a unique action URL and explicit method="post". Name attributes become column headers in export files — use clear names like email instead of field1.

<form action="https://formspree.io/f/YOUR_FORM_ID" method="post">
  <label for="email">Email</label>
  <input type="email" id="email" name="email" required>
  <button type="submit">Join waitlist</button>
</form>

Replace YOUR_FORM_ID with the ID from your Formspree project settings. Deploy to Cloudflare Pages and test with a real address. First submission triggers a confirmation email from Formspree — click the link to activate delivery.

Spam protection without backend code

Public forms attract bots. Formspree supports reCAPTCHA and hCaptcha integrations you enable in the dashboard. For lighter protection, add a honeypot field hidden with CSS that humans never see but bots fill in. Formspree silently drops honeypot submissions. LaunchStatic waitlist templates leave a commented honeypot slot you can uncomment before launch.

Honeypot field pattern

<p class="hp" aria-hidden="true" style="display:none">
  <label>Leave blank<input type="text" name="_gotcha" tabindex="-1" autocomplete="off"></label>
</p>

Custom fields and hidden metadata

Add optional inputs for name, company size, or use case — Formspree records every named field. Hidden inputs track campaign source: <input type="hidden" name="utm_source" value="producthunt">. Append UTM parameters to your landing URL and copy them into hidden fields with a few lines of JavaScript if you want cleaner attribution without Google Analytics.

Success states and UX polish

By default, Formspree redirects to a generic thank-you page. For on-brand UX, use AJAX submission with fetch and show an inline success message. Formspree supports JSON responses when you set Accept: application/json and handle errors for validation failures. Keep a mailto fallback link for visitors if JavaScript is disabled — accessibility still matters on marketing pages.

Privacy and compliance notes

When you use Formspree, visitor emails pass through their servers. Update your privacy policy to name Formspree as a processor and link to their DPA if you target EU users. Do not collect sensitive health or financial data through a simple marketing form. For GDPR, mention lawful basis (consent) and provide a contact address for deletion requests — standard for waitlist pages.

Alternatives worth knowing

  • Netlify Forms — convenient if you already host on Netlify; attribute-based setup.
  • Getform / Basin — similar POST-to-inbox models with different pricing curves.
  • Cloudflare Workers — roll your own endpoint when you need custom validation logic.
  • mailto: links — zero setup but poor UX and no structured exports.

Formspree wins on documentation quality and time-to-first-submission. You can always migrate endpoints later without changing hosting — swap the action URL and redeploy.

Related: Cloudflare Pages guide Waitlist template Waitlist conversion tips

Does Formspree work on Cloudflare Pages?

Yes. The form POST goes from the visitor's browser to Formspree, not to Cloudflare. Any static host works identically.

Can I receive submissions in Slack?

Paid plans and Zapier integrations support Slack notifications. Free tier is email-first; forward rules in Gmail are a zero-cost workaround early on.

What happens if I exceed the free submission limit?

Additional submissions may be blocked until the next billing cycle or until you upgrade. Watch the dashboard during launch week.

Is AJAX required?

No. Standard HTML form POST with redirect is fine for MVPs. AJAX improves UX but adds JavaScript you must maintain.

Ship a waitlist this week

Our Waitlist template includes form markup ready for Formspree. Customize headline copy, paste your endpoint, deploy.

Get waitlist template Set up hosting