Carrd is the fastest no-code landing page builder for indie founders. You can ship a one-pager in an afternoon with no coding required. But adding a waitlist to Carrd requires knowing one platform quirk: each custom HTML block renders inside its own iframe, which changes how you embed external scripts.

Get this right and you have a working waitlist with referral tracking in under five minutes.

Paste both the OperatorStack script tag and the widget div into the same Carrd HTML element. They must share the same iframe context. Carrd Pro Standard ($19/year) is required to use HTML embeds.

What You Need Before You Start

  • Carrd Pro Standard ($19/year). The free plan does not allow custom HTML embeds. Pro Standard is the minimum plan that unlocks the HTML/CSS/JS element type in the editor.
  • An OperatorStack account. Free to start. You need your project key (the pk_ value from your embed snippet).

Step-by-Step Setup

1

Create an OperatorStack project. Go to your OperatorStack dashboard and create a new project. Name it after your product and enter your Carrd site URL so CORS is configured correctly for your domain.

2

Copy your embed snippet. From the project settings page, copy your script tag. It looks like this:

<script src="https://operatorstack.dev/os.js" data-project="pk_abc123"></script>

Keep this handy. You will paste it in the next step.

3

Open your Carrd site in the editor. Log in to Carrd and click Edit on your site to open the visual editor.

4

Add an HTML element. Click the + button to add a new element. From the element type menu, select HTML/CSS/JS. Carrd opens a code input panel.

5

Paste both the script tag and the widget div. In the HTML input, enter this code -- replacing pk_abc123 with your actual project key:

<script src="https://operatorstack.dev/os.js" data-project="pk_abc123"></script>
<div data-os-widget="waitlist"></div>

Both lines go in the same element. This is the key Carrd-specific requirement.

Do not put the script tag and the widget div in separate Carrd HTML elements. Carrd sandboxes each HTML block inside its own iframe. A script in one iframe cannot find a div in a different iframe. Both must be in the same element.

6

Adjust the element height. In Carrd's editor, drag the bottom edge of your HTML element to set its height. The OperatorStack waitlist form fits comfortably at around 280-320px tall. If the form appears clipped, increase the height.

7

Save and publish. Click Save, then Publish in the Carrd editor. Your site goes live with the waitlist form. Visit your URL, submit a test email, and confirm the signup appears in your OperatorStack dashboard under Contacts.

When the Form Renders but the Dashboard Stays Empty

This is the failure the iframe produces, and it does not throw an error. The form paints, the submit button works, and Contacts stays at zero. Two commands tell you which half broke.

os.js resolves both of its inputs against document. The project key comes from document.querySelector("script[data-project]") and the widget containers come from document.querySelectorAll("[data-os-widget]"). Inside a Carrd HTML element, document is the iframe's document, not the page's. Same element means same document, so both queries hit. Split across two elements means the script's document holds no widget div and the div's document holds no script tag, and neither half reports a problem.

First, turn on logging by adding data-dev="true" to the script tag:

<script src="https://operatorstack.dev/os.js" data-project="pk_abc123" data-dev="true"></script>
<div data-os-widget="waitlist"></div>

Every [OperatorStack] line now prints to the console, and the 5-minute config cache is bypassed so dashboard changes show up on reload instead of five minutes later. If you mistyped the attribute name, you get this warning even without data-dev, because it is a console.warn rather than a debug log:

[OperatorStack] No data-project attribute found on script tag

Second, point the console at the right frame. In Chrome DevTools the console has a context dropdown next to the filter box, and it reads top by default. top is the Carrd page, not your embed. Switch it to the iframe entry, then run:

await window.OperatorStack.ready;
window.OperatorStack.projectKey; // "pk_abc123"
window.OperatorStack.isSignedUp(); // true after a test signup

window.OperatorStack being undefined on top while defined in the iframe is the expected result for the Step 5 approach, not a bug. If it is undefined in both, the script tag never loaded. If projectKey is null, the script loaded but the key did not come through, which almost always means the script tag and the div ended up in different Carrd elements.

Take data-dev="true" off before you publish. It is only a logging flag, but leaving it on keeps the 5-minute config cache disabled, so every visitor's browser refetches your project config instead of reusing it.

What Your Visitors See

After someone submits the waitlist form, OperatorStack shows a confirmation message and displays their unique referral link. Share buttons for Twitter, LinkedIn, WhatsApp, and email appear automatically. When a referred visitor signs up through that link, the attribution is recorded and visible on your referral leaderboard.

The embed also collects cookie-free analytics in the background: total page views, referral sources (which sites send you traffic), and estimated unique visitors. No extra configuration, no cookie banner required.

When sharing your Carrd site on social media, add UTM parameters to your URL: https://yoursite.carrd.co?utm_source=twitter&utm_medium=social. OperatorStack tracks these automatically so you can see which channels drive the most signups in your analytics dashboard.

Alternative: Header Code Injection

If you are on Carrd Pro Plus, you can also add the script tag via Site Settings > Code Injection > Header instead of embedding it in an HTML element. This loads the script in the main page context rather than inside an iframe.

With this approach, add a separate HTML element to your page containing only:

<div data-os-widget="waitlist"></div>

A header-injected script runs in the page's main document, so it renders only the widget divs that live in that same document. If Carrd puts your div inside an iframe, the header script will not see it. Run the frame check above before you rely on this route. The single-element approach from Step 5 keeps the script and the div in the same document by construction and works on all paid Carrd plans, so use that unless you have a specific reason to separate them.

Frequently Asked Questions

What Carrd plan do I need to add a waitlist?

Carrd Pro Standard ($19/year). The free plan does not allow HTML embeds. Pro Standard is the cheapest plan that unlocks the HTML/CSS/JS element type.

Why do I need both the script and div in the same Carrd element?

Carrd renders each custom HTML element inside its own iframe for sandboxing. The script and widget div need to share the same iframe context. If you split them into separate Carrd elements, the script cannot find the div.

Will the waitlist widget show referral links after signup?

Yes. After someone submits the form, OperatorStack displays their unique referral link with share buttons for Twitter, LinkedIn, WhatsApp, and email. Everything renders inside the same embed block.

Can I track page views on Carrd with OperatorStack too?

Yes. The same script that powers the waitlist widget also collects cookie-free analytics: page views, referral sources, and unique visitor counts. No consent banner needed.