Netlify Forms alternative: Ikiform vs Netlify Forms
Ikiform vs Netlify Forms: what changes when your form backend is no longer tied to your host, with a migration guide for data-netlify forms.
Netlify Forms is part of Netlify's hosting. You add data-netlify="true" to a form, Netlify finds it in your HTML at deploy time and starts collecting posts to your own site. There is no separate account or endpoint, and on Netlify's credit-based plans form submissions are free and unlimited.
Ikiform is a separate service with its own endpoint. That is more setup than an attribute, but the form works the same on any host, in any framework, and from server code. The real question is whether you want the form backend to move with your site or stay with your host.
At a glance
| Feature | Ikiform | Netlify Forms |
|---|---|---|
| Free plan | None. Every plan is paid | Free and unlimited submissions on Netlify's credit-based plans. Legacy plans meter submissions per site |
| 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 | Part of Netlify hosting: Free, Personal $9/mo, Pro $20/mo, Enterprise custom |
| Where it works | Any host, any framework, server code | Sites deployed on Netlify, with forms present in the deployed HTML |
| Body formats | Urlencoded, multipart and JSON | Urlencoded and multipart. JSON isn't supported |
| File uploads | Not supported yet. A post with a file gets 422 files_not_supported | Yes, one file per field, 8 MB per request, 30-second timeout |
| Webhooks | 3 endpoints per workspace, signed with HMAC-SHA256, 9 attempts over about 3 d 6 h, with delivery logs | Email and outgoing HTTP POST notifications, optionally signed with a JWS token |
| Spam protection | Honeypot (_gotcha), content scoring, per-form rate limits, allowed domains and an optional Cloudflare Turnstile check, with no keys needed | Akismet on every submission, plus an optional netlify-honeypot field and reCAPTCHA 2 |
| JavaScript-rendered forms | Work as they are | Need a hidden static copy of the form or a form-name input so the build can detect them |
| Data location | Cloudflare, with the database in Asia-Pacific. EU Standard Contractual Clauses in the DPA | Not stated in the Forms documentation |
Where Netlify Forms is the better choice
- Your site already deploys on Netlify and you don't want another account. Adding one attribute is hard to beat.
- You want it free. On Netlify's credit-based plans form submissions don't cost anything.
- Your form takes file uploads. Netlify accepts files up to 8 MB per request; Ikiform doesn't take files yet.
- You want spam checked by Akismet, which Netlify runs on every submission.
Where Ikiform is the better choice
- You might move hosts, or you already run on Vercel, Cloudflare Pages, GitHub Pages or your own server. The Ikiform endpoint doesn't care where the page lives.
- Your forms are rendered by React, Vue or Svelte. They post to Ikiform as they are, with no hidden duplicate form for a build step to find.
- You post JSON. Netlify Forms only takes urlencoded and multipart; Ikiform takes JSON too, and answers with JSON when your code asks for it.
- You want HMAC-signed webhooks, retried for about 3 days with a delivery log, and up to 3 endpoints per workspace.
- You want the server to check fields against typed rules and reject bad data with field errors.
Who should pick which
Stay on Netlify Forms if your site lives on Netlify and the form is a simple contact form. It is free, it takes files, and there is nothing else to set up.
Move to Ikiform when the form has to outlive the host, when your forms are rendered client-side, or when submissions feed another system that needs signed, retried webhooks.
Migrating from Netlify Forms
Netlify posts the form to your own site and uses attributes the build strips out. With Ikiform the form posts to a real endpoint, so the Netlify attributes go away and the action changes meaning.
Field mapping
| Netlify Forms | Ikiform | Notes |
|---|---|---|
data-netlify="true" or netlify | action="https://ikiform.com/f/frm_..." | Remove the attribute. The endpoint replaces build-time detection. |
name="contact" on the form | One Ikiform form per form | Each Netlify form name becomes its own Ikiform form with its own endpoint. |
Hidden form-name input | Remove it | Ikiform identifies the form by the URL. Left in, form-name is stored as an ordinary field. |
action="/thanks" | _redirect or the dashboard redirect | The action is now the endpoint. Put the thank-you URL in a _redirect field as a full https: URL, or set Redirect after submit. |
netlify-honeypot="bot-field" | Honeypot field setting | Set the form's Honeypot field to bot-field and keep your input, or rename the input to _gotcha. |
data-netlify-recaptcha | Spam check: Ikiform | Remove the reCAPTCHA div. Turn on the Ikiform human check in the form settings; HTML forms need no other change. |
| File inputs | None | Not supported yet. Upload files elsewhere and submit the link. |
fetch("/", ...) with urlencoded body | fetch(endpoint, ...) | Post to the Ikiform endpoint instead of /. JSON bodies work too. |
Before and after
<form name="contact" method="POST" action="/thanks" data-netlify="true" netlify-honeypot="bot-field">
<p hidden>
<label>Don't fill this out: <input name="bot-field" /></label>
</p>
<label>
Email
<input type="email" name="email" required />
</label>
<label>
Message
<textarea name="message"></textarea>
</label>
<div data-netlify-recaptcha="true"></div>
<button type="submit">Send</button>
</form>Steps
- Create one Ikiform form for each Netlify form name and copy the endpoints.
- Add your domain and your Netlify preview domain under Allowed domains.
- Set Honeypot field to
bot-fieldif you want to keep the existing hidden input. - Remove
data-netlify,netlify-honeypot,data-netlify-recaptchaand any hiddenform-nameinput, then set theactionto the endpoint. - Move the old
actionpath into a_redirectfield as a full URL, or set it in the dashboard. - Replace Netlify's outgoing notification with an Ikiform webhook, and verify the
webhook-signatureheader instead of the JWS token. - Deploy, send a test, then turn off form detection in Netlify once nothing posts there.
What doesn't carry over
- Past submissions stay in Netlify. Download them from the Forms section before you turn detection off.
- File uploads and Akismet filtering have no direct Ikiform equivalent.
FAQ
Can I use Ikiform while my site stays on Netlify?
Yes. Ikiform doesn't care where the page is hosted. Point the form at the Ikiform endpoint and leave Netlify Forms off for that form.
Why does my React form need a hidden copy on Netlify but not on Ikiform?
Netlify finds forms by reading your deployed HTML at build time, so forms that only exist after JavaScript runs are invisible to it. Ikiform takes posts at a URL, so it doesn't need to see the form at all.
Do I need to change my honeypot field?
No. Set the form's honeypot field name to whatever you used with netlify-honeypot, for example bot-field, and the input works unchanged.
How do I verify webhooks after moving?
Netlify signs notifications with a JWS token in X-Webhook-Signature. Ikiform signs each delivery with HMAC-SHA256 using the Standard Webhooks headers; the webhooks docs have a verifier and code for Node and Python.
Related docs
- HTML forms
- React guide
- Changing the honeypot name
- Verify webhook signatures
- Allowed domains for preview sites
Sources
Checked on October 24, 2026.
- Netlify Forms setup
- Netlify Forms spam filters
- Netlify Forms usage and billing
- Netlify billing FAQ for credit-based plans
- Netlify pricing
Trademarks and accuracy
Netlify Forms 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 Netlify Forms 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 and we'll correct it.