Waitloop
Features How It Works Pricing Use Cases 🚀 SaaS Early Access 🐾 Puppy Breeder 🍽️ Restaurant Opening 💪 Fitness Studio Launch 🎓 Online Course Launch Docs Contact Log in

Waitloop Documentation

Everything you need to start collecting waitlist signups. Point your form, get a dashboard, grow your audience.

Quickstart

Get your first waitlist collecting signups in three steps.

1

Create an account

Sign up at app.waitloop.io. Verify your email address. No credit card required for the Sandbox plan.

2

Create a waitlist

From your dashboard, click "Create List". Give it a name and you'll get a unique form key like wz_r8kT4mNpQ2xY7vBn3jLs9wA1.

3

Add your form

Point your HTML form's action attribute to your Waitloop endpoint. That's it.

index.html
<form action="https://api.waitloop.io/f/YOUR_KEY" method="POST">
  <input name="email" type="email" required />
  <button type="submit">Join Waitlist</button>
</form>

Tip: Works with any website builder including Cursor, Bolt, v0, Webflow, Carrd, WordPress, and plain HTML.

Your Form Key

Every waitlist you create gets a unique form key. This key identifies your list and routes submissions to the right place.

  • Format: wz_ followed by 24 characters
  • Found in your dashboard under each list's detail page
  • Copy-to-clipboard buttons are available for all embed code snippets
  • You can regenerate a key at any time (old key stops working immediately)

Note: Regenerating a form key invalidates the old key immediately. Update your form's action URL everywhere before regenerating.

Method 1: Form Action URL

The simplest integration. No JavaScript required. Just change your form's action attribute.

index.html
<!-- Just change the action URL. That's it. -->
<form action="https://api.waitloop.io/f/YOUR_KEY"
      method="POST">
  <input name="email" type="email" required />
  <input name="name" type="text" />
  <button type="submit">Join</button>
</form>

How it works

  • The endpoint accepts both application/x-www-form-urlencoded and application/json
  • All named fields are auto-detected and stored
  • Browser form submissions get a 302 redirect (to your thank-you page or Waitloop's default)
  • JSON submissions get a JSON response back

Auto-captured metadata

Every submission automatically captures this data with no extra code:

Field Description
referrer HTTP Referer header (where user came from)
pageUrl Full page URL including query strings
origin Domain of the submitting site
timestamp Server UTC time of submission
userAgent Browser and device info
utmSource UTM source parameter
utmMedium UTM medium parameter
utmCampaign UTM campaign parameter

Method 2: Script Tag (AJAX)

Add our tiny script (~3KB) to get AJAX form submission with no page reload. Inline success and error messages appear right in the form.

index.html
<!-- Your existing form -->
<form data-waitloop="YOUR_KEY">
  <input name="email" type="email" required />
  <button type="submit">Join Waitlist</button>
</form>

<!-- Add right before </body> -->
<script src="https://forms.waitloop.io/w.js"></script>

What the script does

  • Finds all forms with the data-waitloop attribute
  • Intercepts form submissions and sends them via fetch()
  • Shows inline success or error messages (no page redirect)
  • Sends the current page URL as context automatically
  • Detects referral codes from ?ref= query parameters
  • Includes a hidden honeypot field for spam protection

Method 3: Auto-Generate Form

Drop an empty div and Waitloop renders a complete form for you. Configure the fields, colors, and text from your dashboard.

index.html
<!-- Just drop this where you want the form -->
<div data-waitloop="YOUR_KEY"></div>
<script src="https://forms.waitloop.io/w.js"></script>

How it works

  • When the div has no form inside it, the widget auto-generates one
  • Form fields are configured per-list from your dashboard's Widget Builder
  • Uses Shadow DOM encapsulation so it never conflicts with your site's CSS
  • "Powered by Waitloop" branding is removable on Pro plans and above

Data attributes

Attribute Description
data-waitloop Your form key (required)
data-button-text Custom button text (default: "Join Waitlist")
data-button-color Button color hex code (e.g. "#4f46e5")
data-locale Language code (en, es, fr, de, pt, it, ja, ko, zh, ar)

Custom Fields

Waitloop captures any named field in your form. Email, name, company, phone, role - whatever your form has, we store it.

index.html
<form action="https://api.waitloop.io/f/YOUR_KEY" method="POST">
  <input name="email" type="email" required />
  <input name="name" type="text" />
  <input name="company" type="text" />
  <select name="role">
    <option value="developer">Developer</option>
    <option value="designer">Designer</option>
    <option value="founder">Founder</option>
  </select>
  <button type="submit">Join</button>
</form>

Field rules

  • Field names must be alphanumeric, underscore, or hyphen (max 50 characters)
  • Field values max 5,000 characters each
  • Total payload limit: 50KB
  • HTML tags are automatically stripped from submitted values
  • All fields appear as columns in your dashboard and CSV exports

Redirects & Success Messages

Control what happens after someone submits your form.

Custom redirect (Form Action URL method)

Add a hidden field named _next with your thank-you page URL:

index.html
<form action="https://api.waitloop.io/f/YOUR_KEY" method="POST">
  <input type="hidden" name="_next" value="https://yoursite.com/thanks" />
  <input name="email" type="email" required />
  <button type="submit">Join</button>
</form>

Custom success message (Script Tag / Auto-Generate methods)

When using the widget script, the success message is configured from your dashboard settings. The message appears inline within the form area after a successful submission.

Managing Lists

Each waitlist is a separate list with its own form key, submission data, and settings. One account can have multiple lists.

Actions

  • Create - Click "Create List" from the dashboard. A form key is generated automatically.
  • Rename - Edit the list name any time from the list detail page.
  • Pause - Temporarily stop accepting new submissions. Existing data is preserved.
  • Archive - Move the list to archived state. Submissions are rejected.
  • Delete - Permanently remove the list and all its data (requires confirmation).
  • Regenerate Key - Get a new form key. The old key stops working immediately.

List statuses

Status Accepts submissions Visible in dashboard
Active Yes Yes
Paused No Yes
Archived No Yes (filtered)

Viewing Submissions

All captured form data is available in a sortable, searchable table.

  • Dynamic columns - Columns auto-populate based on the fields your form submits
  • Sort - Click any column header. Newest first by default.
  • Search & filter - Search by any field value. Filter by spam status (all / clean / suspicious / spam).
  • Pagination - Choose 25, 50, or 100 per page.
  • Delete - Remove individual submissions or use bulk selection to delete multiple at once.
  • Mark spam - Flag or unflag submissions as spam individually or in bulk.

CSV Export

Download your entire waitlist data as a CSV file, ready for any spreadsheet or CRM tool.

  • One-click export from any list's detail page
  • Includes all dynamic form fields as columns
  • Metadata columns: referrer, page URL, UTMs, timestamp
  • Optional PII masking toggle to anonymize personal data before download
  • Every export is logged in the audit trail (who, when, which list, row count)
  • Rate limited to 5 exports per minute to prevent abuse

Settings

Configure your account from the Settings page in the dashboard.

Allowed Domains

Add the domains where your forms are hosted. Only submissions from these origins are accepted.

Default Thank-You URL

Set a global redirect URL for form-action submissions that don't include a _next field.

Duplicate Detection

Toggle on to silently ignore duplicate email addresses on the same list. Always returns a 200 response.

CAPTCHA

Enable hCaptcha verification on form submissions. Available on Pro plans and above.

Disposable Email Blocking

Reject signups from disposable/temporary email providers (e.g. mailinator, guerrillamail).

Data Retention

Auto-delete submissions older than 30, 60, or 90 days. Set to "never" to keep data indefinitely.

Email Notifications

Choose between off, instant, or daily digest notifications for new signups.

Widget Builder

A visual tool in your dashboard to customize the look and feel of the embeddable widget. No code needed.

Customization options

  • Button text - Change the submit button label
  • Button color - Pick any color with the color picker
  • Form fields - Add, remove, and reorder fields
  • Labels & placeholders - Customize field labels and placeholder text
  • Success message - Set the message shown after a successful signup

Styling Options

Override widget defaults with data attributes or dashboard settings.

index.html
<!-- Override button color and text via attributes -->
<div data-waitloop="YOUR_KEY"
     data-button-text="Get Early Access"
     data-button-color="#10b981"></div>
<script src="https://forms.waitloop.io/w.js"></script>

Tip: The widget uses Shadow DOM, so your site's CSS won't interfere with the form, and the form's styles won't leak into your page.

Live Preview

See changes in real-time as you adjust settings in the Widget Builder.

  • Toggle between desktop and mobile preview modes (320px mobile width)
  • Updates instantly as you change button text, colors, or fields
  • Shows exactly what your users will see on their website

Analytics Overview

Built-in analytics give you insights into your signups without any external tracking tools.

Signups over time

  • Bar chart showing daily signups for single list or all lists
  • Date range picker: 7 days, 30 days, 90 days, or custom range
  • Period-over-period comparison (compare current range to previous)

Top pages

See which pages on your site drive the most signups, based on the pageUrl metadata.

Usage stats

  • See submissions this month vs your plan limit
  • Visual progress bar with percentage
  • Upgrade prompt at 80% usage

Traffic Sources

Understand where your signups come from.

  • Referral sources bar chart - Top referring domains ranked by signup count
  • Full referrer table - Complete referrer URLs with individual counts
  • All data captured automatically from HTTP headers - no tracking code needed

UTM Tracking

Waitloop automatically captures UTM parameters from the page URL or referrer query strings. No configuration required.

Supported parameters

  • utm_source - Where the traffic came from (e.g. twitter, newsletter)
  • utm_medium - Marketing medium (e.g. social, email, cpc)
  • utm_campaign - Campaign name (e.g. launch-2026, black-friday)

Campaign breakdown

View a table of all campaigns with source, medium, and signup counts. Filter by date range to compare campaign performance.

Referral & Viral Loop

Turn signups into growth with built-in viral referral tracking.

Available on Pro plans and above.

How it works

  1. Someone signs up for your waitlist
  2. They receive a unique referral code and shareable link
  3. When their friends sign up using that link, the referrer gets credit
  4. Successful referrals boost the referrer's position in the queue

Referral link format

URL
https://yoursite.com?ref=REFERRAL_CODE

Position tracking

  • Each signup gets a position number in the list
  • The widget can display position after signup
  • Referrals move the referrer up in the queue

Leaderboard

View a referral leaderboard in your analytics dashboard showing top referrers and their referral counts.

Webhooks

Get notified instantly when someone signs up. Send data to Zapier, Make, Slack, or your own server.

Available on Pro plans and above.

Setup

  1. Go to your list's detail page in the dashboard
  2. Enter your webhook URL
  3. Enable the webhook toggle
  4. Click "Test" to send a sample payload

Payload

Each new submission triggers a POST request to your URL with a JSON payload containing all form fields and metadata.

Security

  • Every webhook is signed with X-Waitloop-Signature header (HMAC-SHA256)
  • A unique webhook secret is auto-generated per list
  • Verify the signature on your server to ensure authenticity

Retry behavior

Failed deliveries are retried 3 times with exponential backoff (2s, 8s, 32s). View delivery logs in your dashboard.

Email Notifications

Stay informed about your waitlist activity without checking the dashboard.

Signup notifications

  • Off - No email notifications
  • Instant - Get notified for each new signup (grouped hourly)
  • Daily digest - One summary email at 8AM UTC

Milestone alerts

Automatic email when your list hits: 100, 500, 1K, 5K, 10K, 50K, or 100K signups. Each milestone only triggers once.

Security alerts

  • Password changes
  • Login from a new device or IP address
  • Account lockout events
  • Plan usage at 80% and 100% of limit

Custom Email Templates

Customize the emails Waitloop sends on your behalf.

Template types

Template When it's sent
Confirmation After a new signup
Welcome After email verification
Position Update When position changes due to referrals
Referral Reward When a referral is successful
Launched When your product launches (manual trigger)
Reminder Re-engagement for inactive signups

Editor features

  • Variable interpolation (name, email, position, referral count, etc.)
  • Live preview with sample data
  • Reset to default template at any time

A/B Testing

Test different form variants to optimize conversion rates.

Available on Business plans and above.

How it works

  • Create multiple form variants per list from the list detail page
  • Set traffic weight for each variant (e.g. 50/50, 70/30)
  • Visitors are randomly assigned to a variant
  • Variant assignment is tracked in submission metadata
  • Compare conversion rates across variants in the dashboard

Team Members

Invite your team to collaborate on your waitlists.

Available on Business plans and above.

Roles

Role Permissions
Viewer See lists and submissions, export CSV
Editor Viewer + manage lists, delete submissions
Admin Editor + manage settings, invite/remove members

Inviting members

  1. Go to the Team page in your dashboard
  2. Enter the team member's email address
  3. Select their role (Viewer, Editor, or Admin)
  4. They'll receive an email invitation to set up their password and join

Internationalization (i18n)

The widget supports 10 built-in languages with RTL support.

Supported languages

English (en) Spanish (es) French (fr) German (de) Portuguese (pt) Italian (it) Japanese (ja) Korean (ko) Chinese (zh) Arabic (ar)

Usage

index.html
<!-- Set widget language with data-locale -->
<div data-waitloop="YOUR_KEY"
     data-locale="es"></div>
<script src="https://forms.waitloop.io/w.js"></script>

Tip: RTL layout is automatically applied for Arabic, Hebrew, Persian, and Urdu.

Per-Form Text Overrides

Override any default text string on a per-form basis using data-* attributes. This is useful when you're using the widget for contact forms, demo requests, or anything that isn't a traditional waitlist.

Available attributes

Attribute Default (English) Purpose
data-title Join the Waitlist Form heading
data-description Be the first to know… Subtitle text
data-button-text Join Waitlist Submit button label
data-email-placeholder Enter your email Email input placeholder
data-success-message You're on the list! Shown after successful submit
data-position-text You are #{position} on… Position indicator text
data-share-label Share to move up Referral section heading
data-copy-button Copy Copy button text
data-copied-button Copied! Copy button after click
data-invalid-email Please enter a valid email… Validation error message
data-error-message Something went wrong… Generic error fallback

Contact form example

Use text overrides to remove all waitlist language and turn the widget into a generic contact form:

index.html
<div data-waitloop="YOUR_KEY"
     data-title="Contact Us"
     data-description="Send us a message and we'll get back to you."
     data-button-text="Send Message"
     data-email-placeholder="Your email address"
     data-success-message="Thanks! We'll be in touch shortly."
     data-show-position="false"
     data-show-referral="false"
     data-invalid-email="Please provide a valid email."
     data-error-message="Could not send. Please try again."></div>
<script src="https://forms.waitloop.io/w.js"></script>

Tip: Attributes override the locale translation. Any attribute you don't set falls back to the current locale's default string. Multiple forms on the same page are independent—each reads its own element's attributes.

Custom Success Template

For complete control over what appears after a successful submission, place a <template> element inside the widget container. When present, it replaces the entire default success screen.

Basic usage

index.html
<div data-waitloop="YOUR_KEY"
     data-title="Request a Demo"
     data-button-text="Request Demo"
     data-show-position="false"
     data-show-referral="false">
  <template data-waitloop-success>
    <div style="text-align:center;padding:20px 0;">
      <h3 style="color:#f8fafc;">Demo Request Received!</h3>
      <p style="color:#94a3b8;">We'll email you to schedule.</p>
    </div>
  </template>
</div>
<script src="https://forms.waitloop.io/w.js"></script>

Available placeholders

Use these placeholders inside your template HTML. They are replaced with real values after submission:

Placeholder Value
{position} Waitlist position number
{referralCode} Unique referral code for this submission
{referralLink} Full referral URL (current page + ref param)
{message} Server response message

Tip: The <template> element is invisible on the page (browsers don't render template content). It's only used by the widget after a successful submission. This also works with intercept mode on existing forms.

Spam Protection

Multiple layers of protection keep your waitlist clean.

Honeypot Field

The widget includes a hidden field that's invisible to real users. Bots that fill it out are automatically rejected.

Rate Limiting

5 submissions per minute per IP address. Plan-based limits per form key.

Origin Validation

Submissions are only accepted from your configured allowed domains.

Duplicate Detection

Same email on the same list is silently ignored (always returns 200).

Disposable Email Blocking

Block signups from disposable email providers. Toggle on/off in settings.

Quality Scoring

Each submission is scored: clean, suspicious, or spam. Filter in the dashboard.

hCaptcha (Pro+)

Enable CAPTCHA verification for an additional layer of protection. Available on Pro and above.

Domain Verification

Verify ownership of your domains with a DNS TXT record for stronger security.

Steps

  1. Go to Settings in your dashboard
  2. Add your domain
  3. Copy the DNS TXT record value provided
  4. Add the TXT record to your domain's DNS settings
  5. Click "Verify" - verification status updates to confirmed

Verified domains are automatically added to your allowed origins list.

Data Privacy & GDPR

We take data privacy seriously. Here's how Waitloop helps you stay compliant.

Data retention

Configure auto-delete for submissions older than 30, 60, or 90 days. A background job runs daily to clean up expired data. Set to "never" to keep data indefinitely.

Right to erasure (GDPR)

Use the GDPR erasure endpoint to delete all submissions containing a specific email address across all your lists. Returns the count of deleted records and is logged in the audit trail.

PII masking on export

Toggle PII masking when exporting CSV files to anonymize personal data before downloading.

Privacy-safe IP handling

IP addresses are stored as SHA256 hashes - never in plain text. Used only for rate limiting and duplicate detection.

Widget Integrity (SRI)

Ensure the widget script hasn't been tampered with using Subresource Integrity hashes.

How to use SRI

Your dashboard shows the embed snippet with the SRI hash pre-filled:

index.html
<script src="https://forms.waitloop.io/w.js"
        integrity="sha384-..."
        crossorigin="anonymous"></script>

The SRI hash is automatically generated during the widget build process and displayed in your dashboard's embed snippets.

Ready to get started?

Start on Sandbox at no cost. Set up your waitlist in under 60 seconds.

Create Your Account