# Tally alternative for developers: Ikiform vs Tally

> Tally is a generous hosted form builder; Ikiform is a backend for forms in your own code. Who should use which, and how to move a Tally embed into your own markup.

Checked 2026-10-24 · https://ikiform.com/alternatives/tally

Tally is a hosted form builder with a document-like editor and a free plan that includes most of what other builders charge for: unlimited forms and submissions within fair use, logic, file uploads up to 10 MB, and webhooks. It is based in Belgium and stores form data in Europe.

Ikiform is not a builder and doesn't try to be one. It is a backend for forms you write yourself. If you're choosing between them, you're really choosing between a form that lives on Tally and is embedded in your site, and a form that is part of your site's own code.

> Checked on October 24, 2026 against Tally's public pricing pages and docs. Ikiform makes this comparison; every Ikiform fact comes from our own docs. Prices and limits change, so the sources are listed at the end.

## At a glance

| Feature | Ikiform | Tally |
| --- | --- | --- |
| What it is | A backend for forms you build | A hosted form builder with its own pages and embeds |
| Free plan | None. Every plan is paid | Unlimited forms and submissions within a fair use policy, with Tally branding |
| Paid plans | Pro from $6/mo for 500 submissions, up to $399/mo for 1,000,000. Every feature on every tier. Yearly is 10 months' price for 12 | Pro $24/mo and Business $74/mo, two months off yearly. Removes branding, adds custom domains |
| Who builds the form | A developer, in HTML or a framework | Anyone, in Tally's editor |
| Design | Your own markup and CSS, no iframe | Tally's layout in an iframe embed, with some styling options |
| File uploads | Not supported yet. A post with a file gets `422 files_not_supported` | 10 MB per file on Free, no per-file limit on Pro |
| Webhooks | 3 endpoints per workspace, signed with HMAC-SHA256, 9 attempts over about 3 d 6 h, with delivery logs | Free and unlimited, optional `Tally-Signature` HMAC-SHA256, retried 5 times over about a day and a half |
| Spam protection | Honeypot (`_gotcha`), content scoring, per-form rate limits, allowed domains and an optional Cloudflare Turnstile check, with no keys needed | reCAPTCHA v2 block, free for all users |
| Data location | Cloudflare, with the database in Asia-Pacific. EU Standard Contractual Clauses in the DPA | Stored in Europe. Retention controls on Business |

## Where Tally is the better choice

- You want a free tool that covers almost everything. Tally's free plan includes webhooks, logic and file uploads; Ikiform has no free plan.
- Non-developers build the forms. Tally's editor is quick to learn and changes go live without a deploy.
- You need submissions stored in Europe.
- You want a shareable form link or a form on its own page with no website at all.
- You want file uploads.

## Where Ikiform is the better choice

- The form has to match your product exactly and load without an iframe or a third-party script.
- Your forms are part of a React, Vue, Svelte or Astro codebase, and you want them reviewed, tested and versioned like the rest of it.
- You want invisible spam protection (scoring, rate limits, Turnstile) rather than a reCAPTCHA checkbox.
- You submit from your own server or scripts. Ikiform's endpoint takes JSON with a secret key; a builder expects people to fill in its form.
- You want webhook retries that run for about 3 days and let you retry any delivery by hand from its log, rather than five retries over about a day and a half.

## Who should pick which

Pick Tally if you want a free, capable hosted form that anyone on the team can build, especially for surveys, sign-ups and internal forms.

Pick Ikiform if the form is part of your product's UI and code, and you'd rather pay a small monthly fee than embed someone else's page.

## Moving a Tally form into your own code

There is no export of a Tally form into code, so moving means writing the form yourself. The example below replaces a Tally embed with a plain form that runs Ikiform's human check in place of Tally's reCAPTCHA, submits in the background with `@ikiform/sdk` and swaps in a thank-you message, much like an embed would. Errors, including a failed human check, show under the button. The script imports the SDK, so it needs a bundler such as Vite.

### Field mapping

| Tally | Ikiform | Notes |
| --- | --- | --- |
| Tally embed iframe and `embed.js` | A `<form>` in your page | Remove both. Your form posts to the Ikiform endpoint. |
| Email, short answer, long answer | `email`, `text`, `textarea` fields | Name the email input `email` and notifications reply to it. |
| Checkboxes | Inputs named `use_cases[]`, field type `multi_select` | The `[]` keeps a single choice stored as an array. |
| Multiple choice, dropdown | `radio` or `select` fields |  |
| Linear scale, rating | `rating` field | Whole numbers from 1 to a maximum you set. |
| Link | `url` field | `https://` is added when missing. |
| Hidden fields | `<input type="hidden">` | Stored with the answers unless the name starts with `_`. |
| reCAPTCHA block | Spam check: Ikiform | Turnstile, run by Ikiform. The SDK's `challenge` function handles it for `fetch` posts. |
| Conditional logic, pages | None | Build it in your own UI. |
| File upload, payment, signature blocks | None | Not supported. |
| `Tally-Signature` webhook check | `webhook-signature` check | Ikiform uses Standard Webhooks signing. The SDK's `verifyWebhook` does it in one call. |

### Before and after

**Tally embed** (`beta.html`)

```html
<iframe
  data-tally-src="https://tally.so/embed/wABC12?alignLeft=1&hideTitle=1&transparentBackground=1"
  width="100%"
  height="420"
  frameborder="0"
  title="Join the beta"
></iframe>
<script src="https://tally.so/widgets/embed.js" async></script>
```

**Ikiform** (`beta.html`)

```html
<form id="beta" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <label>
    Email
    <input name="email" type="email" autocomplete="email" required />
  </label>
  <label>
    Company website
    <input name="website" type="url" placeholder="https://" />
  </label>
  <fieldset>
    <legend>What will you use it for?</legend>
    <label><input type="checkbox" name="use_cases[]" value="contact" /> Contact forms</label>
    <label><input type="checkbox" name="use_cases[]" value="waitlist" /> Waitlists</label>
    <label><input type="checkbox" name="use_cases[]" value="feedback" /> Feedback</label>
  </fieldset>
  <input type="text" name="_gotcha" tabindex="-1" autocomplete="off" hidden />
  <button>Join the beta</button>
  <p role="status" data-status></p>
</form>

<script type="module">
  import { challenge, submit } from "@ikiform/sdk";

  const form = document.getElementById("beta");
  const status = form.querySelector("[data-status]");

  form.addEventListener("submit", async (event) => {
    event.preventDefault();
    status.textContent = "Sending";
    try {
      const turnstileToken = await challenge("frm_xxxxxxxxxxxxxxxx");
      const result = await submit("frm_xxxxxxxxxxxxxxxx", new FormData(form), { turnstileToken });
      if (result.ok) form.replaceWith("Thanks, you're on the list.");
      else status.textContent = result.error.message;
    } catch (error) {
      status.textContent = error.message;
    }
  });
</script>
```

### Steps

1. Create an Ikiform form and define fields that match your Tally questions.
2. Write the form in your page with the same field ids as `name` values.
3. Add your domains under **Allowed domains** and, if you want a human check, turn it on and use the SDK's `challenge` before `fetch` posts.
4. Move your webhook consumer to Ikiform's payload and signature.
5. Export your Tally responses as CSV, then unpublish the Tally form.

### What doesn't carry over

- Conditional logic, pages, file uploads and hosted share links don't carry over.
- There is no free plan on Ikiform.

## FAQ

### Tally is free. Why would I pay for Ikiform?

Only if you want the form in your own code instead of an embed. If a hosted form is fine, Tally's free plan is excellent and we'd use it too.

### Can I keep Tally's thank-you message behaviour?

Yes. Submit with the SDK's `submit`, then replace the form with your own message when the result is `ok`, as in the example above. Without JavaScript, the browser follows your redirect or Ikiform's thank-you page.

### Does Ikiform store data in Europe like Tally?

No. Ikiform runs on Cloudflare with its database in Asia-Pacific, and covers EU transfers with Standard Contractual Clauses in its DPA. If EU storage is required, stay on Tally.

### Do Tally webhooks and Ikiform webhooks look the same?

No. Both send JSON and both sign with HMAC-SHA256, but the payload shape and headers differ, so your handler needs a small update.

## Related docs

- [Plain JavaScript form](https://ikiform.com/docs/guides/javascript.md)
- [Field types and validation](https://ikiform.com/docs/fields.md)
- [Human check](https://ikiform.com/docs/spam.md#human-check)
- [SDK reference](https://ikiform.com/docs/sdk.md)
- [Webhooks](https://ikiform.com/docs/webhooks.md)

## Sources

Checked on October 24, 2026.

- [Tally pricing](https://tally.so/pricing)
- [Tally fair use policy](https://tally.so/help/fair-use-policy)
- [Tally webhooks](https://tally.so/help/webhooks)
- [Tally reCAPTCHA](https://tally.so/help/recaptcha)

## Trademarks and accuracy

Tally and the other product names on this page are trademarks of their owners. Ikiform isn't affiliated with, endorsed by or sponsored by any of them. What this page says about Tally comes from its public pricing pages and docs as of October 24, 2026, linked under Sources. If anything here is wrong or out of date, email [hello@ikiform.com](mailto:hello@ikiform.com) and we'll correct it.
