Skip to content
← All migration guides

Migrate · Tally

Migrate from Tally to Formward

Tally is a form builder: the form, its logic and its responses live in Tally, and your site shows it in an embed. Formward works the other way round: the form is plain HTML on your own page, or a Formward hosted page, and every submission goes to your endpoint.

So moving from Tally means rebuilding the form, not swapping one URL. The importer reads Tally's list of questions, so you do not have to type the fields again.

Last checked 27 October 2026. What this guide says about Tally comes from Tally's own documentation, listed under Sources. Check their current docs if something looks different in your account. The Formward side is the reference in the migration docs.

The change

Replace the Tally embed with an HTML form that posts to your Formward endpoint, or link to a Formward hosted page instead.

Before: Tally, standard embed

<iframe data-tally-src="https://tally.so/embed/YOUR_FORM_ID"
        width="100%" height="400" frameborder="0" title="Contact"></iframe>
<script async src="https://tally.so/widgets/embed.js"></script>

After: Formward, HTML

<form action="https://forms.formward.eu/f/<formId>" method="POST">
  <input type="email" name="email" required>
  <textarea name="message" required></textarea>
  <input type="text" name="_gotcha" style="display:none" tabindex="-1" autocomplete="off">
  <button type="submit">Send</button>
</form>

Field and feature mapping

TallyFormwardNotes
Tally embed (iframe)<form action="https://forms.formward.eu/f/<formId>">The form becomes part of your page and takes your own CSS.
Tally questionsImported fieldsImport reads the questions from Tally's API and creates an inactive draft with matching fields.
Hidden fields (URL parameters)Hidden inputsAdd a hidden input per value. Formward also records the visit's UTM source with each submission.
Redirect on completion_redirect or the form's redirectFormward redirects to the URL as written.
Webhooks, Google Sheets, Slack and other integrationsWebhooks, Google Sheets, SlackFrom Professional.
Conditional logicConditional fields on hosted formsA hosted form can show a field only when another field has a given answer. In your own HTML, add that logic with a few lines of script.
File upload questionfile input, multipartProfessional and up (5 files of up to 10 MiB each on Professional)

What changes, what stays

Changes

  • Where the form lives: on your page or a Formward hosted page, instead of a Tally embed.
  • Where responses go: to Formward, by email and in the dashboard.

Stays the same

  • Your questions and field names, when you keep the imported ones.
  • An EU storage location: Tally says it stores form data in Europe, and Formward stores submissions in Sweden.

Differences to test before you switch

Specific to Tally

  • Tally is a full builder with pages, logic jumps and blocks that only exist inside Tally. Formward is a form backend with hosted pages. Check each Tally block against the field types Formward supports before you switch.
  • Long surveys with many branches are easier to build in Tally. Contact, booking, quote and application forms move over without loss.

How Formward behaves

  • JSON responses. Send Accept: application/json and a success is a 200 with { ok: true, id }. An error is { ok: false, error } with a status code. Without that header, a successful post redirects or shows Formward's thanks page. Code that only checks res.ok keeps working.
  • Status codes. 402 when the plan's monthly submission limit is reached (the body has upgrade: true), 422 when a field fails a validation rule set on the form or required consent is missing, 429 when one address posts too often (with a Retry-After header), and 403 when the origin is not allowed, the Turnstile check fails or files are sent on a plan without uploads.
  • File uploads. Uploads need enctype="multipart/form-data" and a plan that includes them: Professional and up (5 files of up to 10 MiB each on Professional). On Free and Personal a post that carries files is refused with 403, so test an upload before you switch a form that takes attachments.
  • Redirects. A hidden _redirect is followed only if it is a relative path or a URL on one of the form's allowed origins; otherwise it is ignored and the redirect set on the form applies, then Formward's thanks page. JSON (AJAX) requests are never redirected.
  • Spam. If the _gotcha honeypot is filled in, the sender gets a normal success response, but the submission is stored as spam, sends no notification and does not count toward your quota. Rate limits apply on every plan; Cloudflare Turnstile and disposable-email blocking are optional per form.
  • Allowed origins. With the list empty, any site can post to the endpoint. Once you add an origin, requests whose Origin header does not match are refused with 403, including server-side requests that send no Origin header.
  • Reply-To. The Reply-To of the notification email is taken from _replyto, then _reply_to, then a field named email. So a plain email field sets Reply-To with no rename, and _replyto only overrides it, for example when the email field has another name or the form has several. An invalid address is dropped, and the email then has no Reply-To.

Every status code and body is listed in responses and redirects.

History, integrations and settings

  • Get your past responses out of Tally as a CSV file, for example from a Google Sheet filled by Tally's Google Sheets integration. Formward's CSV importer (Dashboard, Import & migrate) takes any CSV with a header row, up to 5,000 rows and 10 MB per file. Imported rows send no email and do not count toward your quota. Each row keeps its original date when the file has a column named Submitted At, created_at or createdAt; otherwise it is dated at import time. Attached files are not imported, only cell values.
  • Forms on the Free plan keep submissions for 30 days, and the nightly retention sweep deletes imported rows older than a form's retention window. To keep a longer history, import into a form on a paid plan with a long enough window.
  • The form importer on the same page reads Tally's questions (paste the JSON from Tally's API: GET /forms/{formId}/questions, with an API key from your Tally account settings) and creates an inactive draft with the fields mapped. Notification addresses, webhooks, autoresponders and spam settings are listed for you to review and are never switched on by the import.
  • Webhooks, Google Sheets, Notion, Slack and other Tally integrations belong to your Tally account and do not move with the endpoint. Recreate the ones you need: Formward webhooks (including Slack, Discord, Teams and Mattermost), Google Sheets and Baserow sync start on Professional, the autoresponder on Professional, and extra notification recipients on Personal.

Pricing and data location

  • Tally's Free plan has unlimited forms and submissions within its fair-use guidelines; Pro is EUR 20 a month and Business EUR 65 a month, two months off when paid yearly.
  • Tally says it is based in Belgium and stores all form data in Europe.
  • Formward is priced in euros: Free with 50 submissions a month, then Personal at EUR 15, Professional at EUR 30 and Business at EUR 90 a month (EUR 10, 20 and 60 billed yearly).
  • Formward stores and processes submissions at Hostup AB in Sweden and sends notification email through Mailjet in the EU. The one optional non-EU sub-processor is Cloudflare Turnstile, on forms where you switch it on.

The full side-by-side, with sources, is in Formward vs Tally. Formward's prices are on the plans page, and where each part of Formward runs is on EU data residency.

Step-by-step checklist

  1. Create the form. In the Formward dashboard, create a form, set the notification email and copy the endpoint.
  2. Import the questions. In Formward open Import & migrate, choose Tally, paste the questions JSON and create the draft.
  3. Publish the form. Copy the form's HTML into your page in place of the Tally embed, or publish it as a hosted page and update your links.
  4. Rebuild the extras. Recreate hidden fields, the redirect, conditional fields and integrations on the Formward form.
  5. Test before you switch. Point a copy of the form at Formward and send a few entries: a normal one, one with the honeypot filled, and one with a file if the form takes uploads. Check the dashboard and the notification email.
  6. Bring the history. If you want past submissions, export them as CSV from your old provider and import them under Dashboard, Import & migrate.
  7. Retire the Tally form. Switch the live form, watch the first real submissions arrive, then disable the form at Tally so nothing is split between two inboxes.

Importing the form

You do not have to rebuild the form by hand. After signing up, open Import in the dashboard and paste your current form's HTML. Formward creates an inactive draft with the same field names and types, so you can check it before switching.

The importer reads the fields only. Past submissions, integrations, spam settings and email templates are not imported, and nothing is sent to Tally.

Rolling back

  • Keep your Tally form active until Formward has received real submissions for a few days. Do not delete it at the moment you switch.
  • To go back, put the previous action URL back in the form. Because the move changes only that one attribute, the rollback is one line too.
  • If you renamed fields during the move, rename them back as well, or integrations on the Tally side may not recognise them.
  • Submissions that reached Formward in the meantime stay in your Formward dashboard. From the Personal plan you can also export them as CSV.

Sources

Last checked 27 October 2026

Move one form first

The free plan takes 50 submissions a month with no card. Point a copy of one form at Formward, send a few test entries, and switch the live form once the path works end to end.