# How to add a waitlist to a Carrd site

> Collect waitlist signups on a Carrd page: a Send to URL form on Pro Plus with UTM tracking, or an embedded HTML form with a honeypot on Pro Standard.

Published 2026-10-25 · https://ikiform.com/guides/waitlist/carrd

On Carrd Pro Plus, add a Custom form that sends to your Ikiform endpoint with the AJAX method, turn on UTM collection and define those fields in Ikiform. On Pro Standard, paste a small HTML form into an Embed element instead; it posts the plain way, keeps a honeypot and sends people back to a thank-you section on the same page.

Carrd is the quickest way to put a one-page pitch online, which makes it a natural home for a waitlist. Which form you can use depends on your Carrd plan more than on anything you build, so start there.

## What's different on Carrd

- **The plan decides the form.** Pro Plus has Custom forms that send to any URL. Pro Standard has contact and signup forms that go to Carrd's own destinations, plus the Embed element. Pro Lite has no forms or embeds.
- **Send to URL can't hide a honeypot.** Carrd's Hidden field always holds the value you preset, so it can't catch bots. Spam scoring still runs on every post.
- **AJAX posts can't run the human check.** Carrd reads any `2xx` as success and anything else as failure, and it can't show Ikiform's check page. Leave the spam check off for this route.
- **One page means one place to say thanks.** There's no second page to redirect to unless you build one. Carrd's On Success message, or a section on the same page, does that job.

Diagram: Which Carrd waitlist setup your plan allows

1. On Pro Plus, a Custom form sends each signup to Ikiform with Carrd's AJAX method.
2. Ikiform stores it and answers 201, and Carrd shows your On Success message without leaving the page.
3. On Pro Standard, an Embed element holds a plain HTML form that posts to Ikiform.
4. Ikiform stores it and redirects the browser to the _redirect URL, a thank-you section on your Carrd page.

Pro Lite and sites without Pro have no forms or embeds, so neither route is available.

|   | Custom form, Send to URL | Embed element | Carrd's signup form |
| --- | --- | --- | --- |
| Plan | Pro Plus or higher | Pro Standard or higher | Pro Standard or higher |
| Where signups go | Ikiform | Ikiform | Carrd's supported email services |
| Honeypot | No | Yes | Carrd's own handling |
| UTM tracking | Built in | Add your own hidden inputs | Depends on the service |
| Stays on the page | Yes | Returns to a section | Yes |

If all you want is the address in your email tool, Carrd's built-in signup form may be enough. Ikiform earns its place when you want a stored copy of every signup, spam filtering, an email per signup and signed webhooks you can route anywhere.

## Pro Plus: a Custom form

1. Click **Add Element** › **Form**. Set **Type** to **Custom**, then **Send to URL**.
2. Set the URL to `https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx`, **Method** to **AJAX** and **Format** to **Default**. Don't pick XML: Ikiform refuses it with `415`.
3. Add one **Email** field and set its **Submitted ID** to `email`. Carrd generates IDs from labels, so leaving it empty sends `email_address` or similar.
4. Tick **Collect UTM parameters**. Carrd adds `utm_source`, `utm_medium`, `utm_campaign`, `utm_term` and `utm_content` when they're in the link.
5. Set **On Success** to a message such as `You're on the list. We'll email you at launch.` and **On Failure** to a general line. Carrd shows your own text there unless you turn on **Export variables** and **Return endpoint responses**.

Then add the field definition on Ikiform's **Fields** tab, UTM fields included:

`Fields`:

```json
{
  "version": 1,
  "title": "Waitlist",
  "fields": [
    { "id": "email", "type": "email", "label": "Email", "required": true },
    { "id": "utm_source", "type": "text", "label": "UTM source", "validation": { "max_length": 100 } },
    { "id": "utm_medium", "type": "text", "label": "UTM medium", "validation": { "max_length": 100 } },
    { "id": "utm_campaign", "type": "text", "label": "UTM campaign", "validation": { "max_length": 100 } },
    { "id": "utm_term", "type": "text", "label": "UTM term", "validation": { "max_length": 100 } },
    { "id": "utm_content", "type": "text", "label": "UTM content", "validation": { "max_length": 100 } }
  ]
}
```

- Without the five UTM fields, any signup that arrives from a tagged link is refused with an Unknown field error, and Carrd shows On Failure. They're only sent when the link has them, so they're optional here.
- Don't add a **File** field. Ikiform refuses files with `422 files_not_supported`.
- Carrd's **Events** settings can run your own script on success, such as an analytics call. They're separate from the message.

> Leave the spam check off and keep Standard rate limits. The post comes from the visitor's browser, so allowed domains and per-visitor limits work as usual.

## Pro Standard: an embedded form

Click **Add Element** › **Embed**, set **Type** to **Code** and **Style** to **Inline**, and paste the form. Embeds don't render in the builder, so publish to see it.

`Embed`:

```html
<form class="iki-waitlist" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post" target="_top">
  <input name="email" type="email" placeholder="you@company.com" aria-label="Email" autocomplete="email" required>
  <input type="hidden" name="_redirect" value="https://example.com/#joined">
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden>
  <button type="submit">Join the waitlist</button>
</form>

<style>
  .iki-waitlist { display: flex; flex-wrap: wrap; gap: 8px; max-width: 440px; margin: 0 auto; }
  .iki-waitlist input[type="email"] { flex: 1 1 220px; font: inherit; padding: 12px 14px; border: 1px solid #d4d4d4; border-radius: 8px; }
  .iki-waitlist button { font: inherit; padding: 12px 18px; border: 0; border-radius: 8px; background: #111; color: #fff; cursor: pointer; }
</style>
```

- Add a **Section Break** named `joined` and put a thank-you line after it. Carrd opens a section when its name is in the link after `#`, so `_redirect` lands people on it.
- Replace `https://example.com` with your Carrd address. `_redirect` only works for an `https:` URL on one of the form's **Allowed domains**, so add the domain there too.
- `target="_top"` makes the post leave any frame Carrd wraps the embed in, so the redirect loads in the window.
- This is a plain post, so the [human check](https://ikiform.com/docs/spam.md#human-check) works if you turn it on. No change to the HTML.

### Allowed domains

| Carrd address | Add |
| --- | --- |
| Default URL | `your-site.carrd.co` |
| Pro URL | `your-site.crd.co` |
| Custom domain | `example.com` |

Never add `carrd.co` or `crd.co` alone; every Carrd site would match. The [Carrd docs guide](https://ikiform.com/docs/guides/carrd.md) has the contact-form version, and the [main guide](https://ikiform.com/guides/waitlist.md#duplicates) explains repeat signups.

## Check it works

1. Publish the site. Forms and embeds only work on the published page.
2. Under the form's **Allowed domains**, add your site's domain, plus `localhost` while you develop. Leave it empty to accept posts from anywhere.
3. On Pro Plus, open the page with `?utm_source=test` and sign up. Carrd shows On Success, and the submission in Ikiform has `utm_source` set to `test`.
4. On Pro Standard, sign up through the embed. You land on the `#joined` section of your page.
5. 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 `email` field.
6. Nothing arrived? Switch the dashboard's status filter to **Spam**. Spam gets the same success answer as a real submission.

## Gotchas

| Problem | What to do |
| --- | --- |
| Carrd shows On Failure on every signup | Ikiform refused the post: an Unknown field from a missing UTM definition or an unset Submitted ID, `415` for XML, or `403 challenge_required` with the spam check on. |
| Signups arrive with a field named after the label | **Submitted ID** is empty. Set it to `email` and publish again. |
| The embed lands on Ikiform's thank-you page, not `#joined` | `_redirect` was ignored. Use `https:`, and add the Carrd domain under **Allowed domains**. |
| `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. |

## Questions

### Which Carrd plan do I need for a waitlist form?

Pro Plus to send a Custom form to any URL, such as Ikiform. Pro Standard can embed your own HTML form. Pro Lite and sites without Pro have no forms or embeds.

### Can I add a honeypot to a Carrd form?

Not to a Send to URL form, because Carrd's Hidden field always has its preset value. Use the Embed route if you want a honeypot; Ikiform's spam scoring runs on both.

### Why does Carrd show On Failure when the signup looks fine?

Carrd reads anything but a 2xx answer as failure. The usual cause is a field Ikiform doesn't know, such as utm_source from Collect UTM parameters. Add those fields to the definition.

### Is Ikiform free?

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.

## More guides

- [Waitlist for a new SaaS](https://ikiform.com/guides/waitlist.md): Build a pre-launch waitlist on your own landing page: the form, spam protection, duplicates, confirmation emails and a clean export on launch day.
- [Waitlist on Framer](https://ikiform.com/guides/waitlist/framer.md): Two ways to collect waitlist signups on Framer: Framer's form with a webhook to Ikiform, or a code component that keeps per-visitor limits and spam checks.
- [Waitlist on Webflow](https://ikiform.com/guides/waitlist/webflow.md): Point a Webflow Form Block at Ikiform, tag signups by source with a hidden field, and keep Webflow's success state with a short script for every form.
- [Plain HTML waitlist](https://ikiform.com/guides/waitlist/html.md): A complete no-build waitlist page in plain HTML that works with JavaScript off, shows an inline thank-you when it loads, and falls back when it must.
- [Product Hunt launch list](https://ikiform.com/guides/waitlist/product-hunt.md): Collect a launch list weeks before Product Hunt, tag each signup by channel, and send the launch-day email in two waves timed to the Pacific Time reset.
- [Beta signup with screening](https://ikiform.com/guides/waitlist/beta-signup.md): A beta application form with screening questions the server enforces, and a script that scores applicants and picks each cohort from the list.
