Migrating from Formspree to Formspring: a 5-minute guide

Florian Wartner2026-05-07 5 min read

Most teams who switch from Formspree to Formspring do it for one of three reasons: GDPR / EU data residency, signed webhooks (Stripe-pattern HMAC), or AI-assisted submission moderation. The migration itself is one of the simplest backend swaps you'll do this year - usually under 5 minutes for the form, plus a one-line update to webhook receivers.

What changes

Three things change:

  1. The form's action URL - from https://formspree.io/f/yourID to https://formspring.io/f/abc123.
  2. The webhook signature header (if you receive webhooks) - from Formspree's bespoke header to X-Formspring-Signature: t=…,v1=… (Stripe-pattern HMAC).
  3. Where data lives - from US (Formspree) to EU (Formspring/Hetzner).

Everything else stays the same. The body shape is nearly identical. Spam protection (honeypot, Akismet) runs by default. Email notifications work out of the box.

What doesn't change

  • Your form's HTML structure. Same <form> element, same fields, same button.
  • Your visitors' experience - they see the same form, submit the same way.
  • Your CRM/Slack/Notion integrations if they're via Zapier (recreate the trigger, the rest is identical).
  • Your dashboard ergonomics - both products show submissions in a list, both let you reply, both export CSV.

Step 1: create a Formspring account

Sign up free, no credit card. Verify your email. Create a new form (give it a name like "Contact" or "Newsletter").

Each form gets a unique endpoint URL like:

https://formspring.io/f/abc123XYZ

Copy it.

Step 2: swap the form action

Find your existing Formspree form:

<form action="https://formspree.io/f/yourID" method="POST">
  <input type="email" name="email" required>
  <textarea name="message" required></textarea>
  <button>Send</button>
</form>

Change one attribute:

<form action="https://formspring.io/f/abc123" method="POST">
  <input type="email" name="email" required>
  <textarea name="message" required></textarea>
  <button>Send</button>
</form>

That's the form migration. Push the change to production.

Step 3: test a real submission

Submit your form. Check the Formspring dashboard. Confirm the submission lands within 1-2 seconds. Check your email for the notification (default-on for paid plans).

If anything's off:

  • Submission doesn't appear: check CORS settings. Add your site's origin in Formspring → Form → CORS.
  • No email: verify your account email is confirmed.
  • Spam-classified: Formspring's default spam threshold is conservative. Check the spam tab.

Step 4: update webhook receivers (if you have them)

This is the only non-trivial step, and it's still small.

Formspree's webhook signature uses a custom header. Formspring uses the Stripe pattern:

X-Formspring-Signature: t=1715090123,v1=8e2c...sha256-hex

Verifying it in Node:

import { createHmac, timingSafeEqual } from 'crypto';

function verifyFormspringSignature(rawBody, headerValue, secret) {
  const parts = headerValue.split(',').map(s => s.split('='));
  const params = Object.fromEntries(parts);
  const signedPayload = `${params.t}.${rawBody}`;
  const expected = createHmac('sha256', secret).update(signedPayload).digest('hex');
  return timingSafeEqual(Buffer.from(expected), Buffer.from(params.v1));
}

Same in PHP:

function verifyFormspringSignature(string $rawBody, string $headerValue, string $secret): bool {
    $params = [];
    foreach (explode(',', $headerValue) as $part) {
        [$k, $v] = explode('=', $part, 2);
        $params[$k] = $v;
    }
    $signedPayload = "{$params['t']}.{$rawBody}";
    $expected = hash_hmac('sha256', $signedPayload, $secret);
    return hash_equals($expected, $params['v1']);
}

Same in Python (hmac.compare_digest), Ruby (OpenSSL::HMAC with constant-time comparison), Go (hmac.Equal).

Replace your Formspree verification function. Test with a real webhook delivery. Done.

Step 5: run both in parallel for a week (optional, recommended)

Don't disable Formspree the same day. Point one copy of your form at Formspring, keep the production copy on Formspree, and watch both dashboards for a week. Compare:

  • Submission counts (should match).
  • Spam detection rate.
  • Email notification timing.
  • Webhook delivery success rate.

If everything checks out after 7 days, swap the production form. If something's off, you have time to debug without losing leads.

Step 6: decommission Formspree

Cancel the Formspree subscription (if any) at the end of your billing period. Export your historical submissions to CSV from Formspree's dashboard for record-keeping.

Formspring won't auto-import old Formspree data - by design, for privacy. If you need historical continuity, use the Formspring API to push your CSV in.

Common questions

Will my Zapier connection still work?

Recreate it on Formspring's Zapier app. The triggers and shape are nearly identical, so it's a 10-minute job.

Can I use the same form ID?

No - each form backend assigns its own opaque IDs. Formspring's IDs are 8-16 character strings (like abc123XYZ). Update the URL in your HTML.

What about the Formspree-specific reCAPTCHA?

Formspring uses hCaptcha by default (free, accessible, GDPR-friendly). It's drop-in via a meta config; no additional code needed.

Will my form's _subject field still work?

Formspring doesn't use Formspree's underscore-prefixed magic fields. Configure email subject in the dashboard instead. All visible fields submit normally.

My form has _redirect for thank-you pages. Equivalent in Formspring?

Configure the redirect URL in Formspring → Form → Redirect after submission. The user-facing experience is identical; the configuration moved from form HTML to the dashboard.

Why teams do this migration

  • GDPR + EU residency: Formspree is US-hosted; that's the most common driver.
  • Signed webhooks: Stripe-pattern HMAC works with every existing receiver, off the shelf.
  • AI moderation: catches edge cases that signature-based spam detection misses.
  • Honest pricing: Pro is $19/mo flat with everything included; no enterprise upsell for the DPA.

Try Formspring free

50 submissions/month free, no credit card. Sign up and have your first form running in 5 minutes.

Florian Wartner

Founder of Formspring and Pixel & Process. Senior Laravel and Vue engineer based in Lübeck, Germany. Building developer-first SaaS with EU data residency and honest pricing.

Ship your form in two minutes.

No credit card. 50 free submissions a month, every month.