Migrate from Formspree

If you are currently using Formspree, migrating to Formward typically requires changing a single line in your HTML. Formward's special fields use the same names as Formspree's, so most forms work immediately without further changes.

Step 1: Create a form in the dashboard

Log in to Formward and click New form. Set the notification email. Copy the form ID from the settings page.

Step 2: Swap the action URL

Find the line in your HTML that looks like this:

<form action="https://formspree.io/f/<your-id>" method="POST">

Replace it with your Formward endpoint:

<form action="https://forms.formward.eu/f/<formId>" method="POST">

That is the only required change for most forms.

Compatible special fields

Formward recognises the same special field names that Formspree uses, so you do not need to rename any hidden fields:

FieldWorks in Formward?Notes
_redirectYesMust be a relative path or an absolute URL from an allowed origin. Arbitrary external URLs are rejected by an open-redirect guard.
_subjectYesSets the notification email subject
_replytoYesAlso accepted as _reply_to
_gotchaYesHoneypot - same behaviour

AJAX / fetch usage

If you are using fetch() with Accept: application/json, no changes are needed beyond the URL. Formward returns { ok: true, id } on success, the same shape as Formspree's { ok: true }. Your existing error handling will continue to work.

Bring your historical submissions

Swapping the endpoint only covers new submissions going forward. To bring your existing history along, use the CSV importer under Dashboard → Import & migrate. It reads exports from Formspree, Netlify, Getform, Basin, Typeform, or any generic CSV, and when it recognises a date column (Formspree/Typeform "Submitted At", Netlify/ Basin "created_at", Getform "createdAt") it preserves each row's original submission timestamp rather than dating every imported row at import time.

Only a dedicated submission-date column is used - a field of your own merely named "date" or "time" is kept as an answer and never treated as the submission time, since backdating to an appointment date would corrupt the ordering. Two more things worth knowing. Dates are read with ISO 8601 (2024-04-03T09:30:00Z) understood unambiguously; a slash-separated date like 03/04/2024 could mean 3 April or 4 March depending on who exported it, so rather than guess we fall back to the import time and tell you how many rows that affected. And if the form you import into has a retention window set, rows whose original date is already older than that window will be removed by the nightly retention sweep - the importer tells you how many, so you can raise the window first.

Why switch to Formward?

  • EU data residency: All submission data is stored in Sweden on infrastructure operated by Hostup AB. No data leaves the European Union.
  • GDPR-clean by design: IP addresses are stored as one-way hashes only. Raw IPs are never written to disk.
  • AI features on Pro: Automatic spam scoring, submission summaries, lead scoring, and plain-English routing, all running on EU infrastructure (Mistral, France).
  • Open infrastructure: Authentication runs on your own instance of better-auth. Credentials are not transmitted to third-party identity providers.

Checklist

  1. Create a form in the dashboard and note the form ID.
  2. Replace action="https://formspree.io/f/..." with action="https://forms.formward.eu/f/<formId>".
  3. Add your site's origin to the form's allowed origins list to prevent cross-origin spam.
  4. Submit a test form entry and confirm it appears in the dashboard.
  5. Remove the Formspree integration from your project once confirmed.
Migrate from Formspree to an EU form backend | Formward Docs