Outgrow builder forms7 min read
Carrd forms: send submissions to a form backend
Carrd's contact form only emails you and custom forms need Pro Plus, so use Send to URL on Plus or an HTML embed on Standard to store every submission.
Carrd's forms need a Pro plan: Pro Standard gets contact and signup forms, and Pro Plus adds custom forms that can send to any URL. On Pro Plus, set a custom form to Send to URL with your Ikiform endpoint and Carrd keeps its own success message. On Pro Standard, paste an HTML form into an Embed element, which gets you custom fields without upgrading.
What's different on Carrd
Carrd doesn't cap submissions. It gates form features by plan, and each plan is a yearly price for a set number of sites. As of October 2026, Carrd's pricing and docs put the lines here:
| Plan | Forms you get | What it means |
|---|---|---|
| Free and Pro Lite | None | No form element and no embeds. Link to a form elsewhere, or upgrade |
| Pro Standard, from $19 a year | Contact forms that email up to five recipients, Signup forms that add people to an email tool, and Embed elements | Contact forms have fixed fields. Embeds take any HTML, including your own form |
| Pro Plus, from $49 a year | Everything above, plus Custom forms: send email, or send to Airtable, Make, n8n, Zapier, a URL, or your own code | Any fields, and Send to URL posts them wherever you like |
A Carrd contact form delivers each message by email from @mail.carrd.site, so your inbox is the record and a message filed as junk is easy to miss. That is the usual reason to move: you want a stored, searchable list, an export, and alerts for the whole team, not one mailbox.
If all you need is new subscribers in Mailchimp, Kit or another email tool, Carrd's Signup form already does that on Pro Standard and is the better choice. Ikiform has no one-click email tool integrations.
- On the free plan or Pro Lite there's no form element and no embed, so there's nothing to connect. Upgrade, or link to a form hosted elsewhere.
- On Pro Standard, paste an HTML form into an Embed element. The visitor's browser posts it to Ikiform.
- On Pro Plus, build a Custom form in Carrd's editor and set it to Send to URL with the AJAX method. Carrd's form posts to Ikiform and shows its own success message.
Pro Plus: Send to URL
This keeps Carrd's form editor and styling, with no code. The fields below are for a photographer's booking enquiry; use your own.
- Click Add Element > Form, set Type to Custom, then Send to URL.
- Paste your endpoint as the URL.
- Set Method to AJAX and Format to Default. Carrd reads any
2xxanswer as success, and Ikiform answers201when it stores the post. - Add the fields: Text
name, Emailemail, Selectservice, Datepreferred_date, Text Areadetails. Set each field's ID; Carrd generates one from the label otherwise. - Under On Success, pick a message or a section to show. Under On Failure, keep the text general. Carrd doesn't show Ikiform's error message.
- Publish. Forms only post from the published site.
https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx| Carrd setting | Use | Avoid |
|---|---|---|
| Method | AJAX: visitors stay on the page | POST: the browser leaves for Ikiform's thank-you page, and On Success never runs |
| Format | Default, or JSON | XML: Ikiform refuses it with 415 unsupported_media_type |
| Collect UTM parameters | Fine, but add the five utm_ fields to any field definition | Turning it on after you defined fields: every post from a link with UTM tags fails with an Unknown field |
| File field | Not at all | File uploads aren't supported yet. A post with a file gets 422 files_not_supported. |
| Spam Protection | None on this form | A captcha provider: Carrd's docs don't say it verifies the token for a Send to URL form, and Ikiform checks a Turnstile token only with your own keys saved in Ikiform |
A Hidden field always sends its preset value, so it can't work as a honeypot here. Ikiform's spam scoring, rate limits and allowed domains still run on every post. Leave Ikiform's Spam check off for this form: an AJAX post can't show the check, and would fail with 403 challenge_required.
Pro Standard: an Embed element
On Pro Standard you can't build a custom form in Carrd, but you can paste one. Click Add Element > Embed, set Type to Code and Style to Inline, and paste this. It carries its own styles because Carrd's form styles don't reach embedded code.
<form id="booking" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post" target="_top">
<input name="name" placeholder="Name" autocomplete="name" required>
<input name="email" type="email" placeholder="Email" autocomplete="email" required>
<select name="service" required>
<option value="" disabled selected>What do you need?</option>
<option value="portrait">Portrait session</option>
<option value="event">Event coverage</option>
<option value="product">Product photos</option>
</select>
<input name="preferred_date" type="date" aria-label="Preferred date">
<textarea name="details" rows="4" placeholder="Anything else?" maxlength="2000"></textarea>
<input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden>
<button type="submit">Request a booking</button>
<p id="booking-note" role="status"></p>
</form>
<style>
#booking { display: grid; gap: 0.75rem; font: inherit; }
#booking input, #booking select, #booking textarea { font: inherit; padding: 0.75rem; border: 1px solid #ccc; border-radius: 0.5rem; }
#booking button { font: inherit; padding: 0.75rem; border: 0; border-radius: 0.5rem; background: #111; color: #fff; }
</style>
<script>
const booking = document.getElementById("booking");
booking.addEventListener("submit", async (event) => {
event.preventDefault();
const note = document.getElementById("booking-note");
note.textContent = "Sending";
try {
const response = await fetch(booking.action, {
method: "POST",
headers: { Accept: "application/json" },
body: new FormData(booking),
});
const result = await response.json();
if (result.ok) {
booking.replaceChildren("Thanks. I'll reply with availability.");
return;
}
const fields = result.error.fields ?? {};
note.textContent = fields.preferred_date?.[0] ?? fields.email?.[0] ?? result.error.message;
} catch {
note.textContent = "Couldn't send. Try again, or email me directly.";
}
});
</script>- The script posts with
fetchand replaces the form with the thank-you line, so the page doesn't change. - The hidden
_gotchainput is a real honeypot here, unlike a Carrd Hidden field. - If the script fails to load, the form still posts normally.
target="_top"stops the result opening inside a frame. - Embeds don't run in Carrd's editor. Publish to see the form.
Both versions send the same fields. Define them in Ikiform once a test has arrived:
Preview
Runs Ikiform's validator in your browser. Nothing is sent.
preferred_date is a date field, so Ikiform accepts YYYY-MM-DD, which is what Carrd's Date field and a browser date input both send.Allowed domains on Carrd
Add your-site.carrd.co, or your-site.crd.co on Pro, and your custom domain. Don't add carrd.co on its own; every Carrd site would be allowed to post. The Carrd docs guide lists every setting with its reason.
Check it works on Carrd
- Under the form's Allowed domains, add your site's domain, plus
localhostwhile you develop. Leave it empty to accept posts from anywhere. - Publish, then submit the form on the published site.
- Confirm Carrd shows On Success, or the embed shows its thank-you line.
- Open Submissions in the dashboard. The new submission is there with every field you sent.
- Check the names are your IDs,
preferred_datereads like2026-11-14, and noutm_fields arrived unless you expected them. - Check the inbox of each notification recipient. Each gets an email with the fields, and Reply goes to the submitter when the form has an
emailfield.
Gotchas
| Problem | What to do |
|---|---|
| Carrd shows On Failure every time | XML format (415), a File field (422), an Unknown field from UTM collection, or Ikiform's Spam check turned on (403). Fix whichever applies. |
| Field names look like labels | ID and Submitted ID were empty. Set them and publish again. |
| The embed is blank in the editor | Carrd doesn't run embed code in the editor. Publish and check the live site. |
403 origin_not_allowed, or every post lands in spam | The page's domain isn't in the form's Allowed domains. Add it, plus localhost for local tests. Subdomains of a listed domain are allowed. |
403 challenge_required | The form's spam check is set to Ikiform and a fetch post had no token. Get one with challenge(formId) from @ikiform/sdk before each submit, or turn the check off. |
Questions
Pro Plus. Custom forms, including Send to URL, are an Advanced Forms feature. On Pro Standard you can paste your own HTML form into an Embed element instead.
AJAX. It keeps visitors on your Carrd page and runs your On Success and On Failure settings. POST sends the browser to Ikiform's thank-you page or your redirect instead.
No. A Hidden field always submits its preset value, so it can't tell bots from people. Ikiform's spam scoring, rate limits and allowed domains still check every post, and the embed version can carry a real honeypot.
Yes, and you probably should. It adds people straight to your email tool. Use Ikiform for the forms where you want a stored record, such as enquiries and bookings.
No, there is no free plan. Testing is free: you can send 50 test submissions a month from localhost before you pay. To go live, Pro starts at $6/mo for 500 submissions, or you can pay once for 10,000 submissions for $49 or 50,000 submissions for $149, with credits that never expire.
Stuck on a step, or want a guide for your situation? Email hello@ikiform.com.