Waitloop
Features How It Works Pricing Docs Documentation Sample Code AI Prompt Instructions Masterclass 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 four 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

Allow your domain

In Settings → Allowed Domains, add the domain your form will live on. Include localhost or your staging URL if you test there first. Submissions are only accepted from these domains, so a missing entry is the usual reason a brand-new form returns 404.

4

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. For complete forms you can paste straight in — contact forms, multi-step signup, file uploads — with the CSS included in plain CSS, Tailwind or Bootstrap, see Form Samples.

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. Script Tag and Auto-Generate methods only — see the note below.
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
utmTerm UTM term and content parameters are captured too

Note: pageUrl and the UTM columns are read from the page address, which only the widget script can see. A plain form post with no JavaScript still captures referrer, origin, user agent, and timestamp — but not pageUrl or UTMs. If you need campaign attribution, use Method 2 or Method 3.

Method 2: Script Tag (AJAX)

Add our script (~14KB gzipped, no dependencies) 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-locale Language code (en, es, fr, de, pt, it, ja, ko, zh, ar)
data-show-position Set to "false" to hide the queue position after signup
data-show-referral Set to "false" to hide the referral share block
data-ref Referral code to credit, when you're not using ?ref= in the URL
data-ga4 Google Analytics 4 measurement ID to send signup events to

Colors, fonts, and field layout are set in the dashboard's Widget Builder rather than by attribute — see Styling Options. Text strings can also be overridden per form; see Per-Form Text Overrides.

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 may contain letters, digits, underscores, and hyphens, and must start with a letter or underscore. Max 50 characters.
  • Up to 20 fields per submission
  • Field values max 1,000 characters each; email addresses max 254
  • Total payload limit: 50KB for text-only submissions (forms that send files are covered in File Uploads)
  • Names beginning with an underscore are reserved for Waitloop's own use — avoid them for your own fields
  • All fields appear as columns in your dashboard and CSV exports

File Uploads

Your form can collect images alongside the usual text fields — product photos, headshots, screenshots, portfolio pieces, contest entries. Files arrive attached to the signup and are viewable and downloadable from your dashboard.

File uploads are off by default on every list. Switching them on takes three steps.

1

Turn on file uploads for your list

Open your list from the dashboard, go to the Settings tab, and find the File Uploads card. Flip Allow file uploads on, then set the limits that apply to the whole list:

  • Max size per file (MB) — the largest single file you'll accept. Leave at 0 to use your plan's default.
  • Max files per submission — the total number of files one signup can send, counted across every file field on the form. 0 uses your plan's default.
  • Allowed file types — tap the format chips to restrict what you accept. Select none to allow every supported image type.

Click Save Settings. This toggle is the master switch: while it's off, any file sent to your form is rejected — including from a hand-written HTML form posting straight to the API.

2

Add a File Upload field to your form

In the Form Creator, drag File Upload from the field palette onto your form. Select the field to open its properties panel on the right:

  • Field name — the name this column gets in your dashboard and CSV exports. If you're writing your own HTML, this must match the name attribute on your file input.
  • Label and Required — what the visitor sees, and whether they can submit without attaching anything.
  • Max files, Max size per file, Allowed file types — per-field limits for this one field.

Field limits can only tighten what you set in step 1, never loosen it. A field set to 50 MB on a list capped at 10 MB still accepts 10 MB. Leave the field values at 0 / no chips selected to simply inherit the list settings.

The Live Preview pane shows the resulting drop zone, with a hint line summarising the accepted types, size, and count. Save your form when it looks right.

3

Put the field on your site

What you do here depends on which integration method you use. All three are covered below.

Using the widget (Script Tag or Auto-Generate)

Nothing to do. Once the field is saved, the widget renders the file picker for you, uploads each file as the visitor chooses it, shows the selected filenames, and blocks submission until the uploads finish. Your existing embed snippet doesn't change.

Using your own HTML form

Add enctype="multipart/form-data" to your <form> tag — without it the browser sends only the filename, not the file — then add a file input whose name matches your field name from step 2.

index.html
<form action="https://api.waitloop.io/f/YOUR_KEY" method="POST"
      enctype="multipart/form-data">
  <input name="email" type="email" required />
  <input name="photo" type="file" accept="image/*" />
  <button type="submit">Join Waitlist</button>
</form>

To let someone attach several files to one field, add the multiple attribute and raise Max files on the field to match.

Using your own JavaScript

Post a FormData object. Let the browser set the request headers — if you set Content-Type yourself the upload boundary is lost and the request fails.

app.js
const data = new FormData();
data.append('email', 'ada@example.com');
data.append('photo', fileInput.files[0]);

const res = await fetch('https://api.waitloop.io/f/YOUR_KEY', {
  method: 'POST',
  body: data
});

Supported file types

Waitloop accepts images only. Every upload is checked to confirm its actual content matches its extension, so a document renamed to .png is rejected.

PNG JPG JPEG GIF WEBP HEIC HEIF AVIF BMP TIF TIFF

PDFs, documents, archives, and video aren't accepted. SVG is excluded too, because SVG files can carry executable script. If you need a document from a signup, collect a link to it in a URL field instead.

Limits by plan

Your plan sets the ceiling. List and field settings can go lower, never higher.

Plan Max file size Files per field Storage included
Sandbox 5 MB 1 100 MB
Starter 10 MB 5 1 GB
Pro 25 MB 20 10 GB
Business 25 MB 50 50 GB
Enterprise 25 MB 100 Unlimited

Finding your files

  • Open any signup from the Submissions tab. An Attachments panel lists every file with its size, plus a thumbnail gallery you can click through.
  • Download next to any file saves the original. Download links are short-lived and generated on demand, so files are never publicly browsable.
  • In CSV exports and webhook payloads, the file field's value is the filename (or a comma-separated list). Download the files themselves from the dashboard.
  • Uploads count toward your plan's storage. Deleting a submission — individually, in bulk, or through a GDPR erasure request — deletes its files too and frees the space. Your list's data-retention setting removes them on schedule.

If an upload is rejected

Visitors see the reason inline. Here's what each message points to:

Message Fix
File uploads are disabled for this list Turn on Allow file uploads in the list's Settings tab (step 1).
This form does not accept files Add a File Upload field in the Form Creator, or check that your input's name matches the field name.
This image format is not supported The file isn't one of the supported image types listed above.
This file type is not allowed for this field The format is supported but not selected in your Allowed file types chips.
File content does not match its extension The file was renamed rather than converted. Re-save it in a real image format.
File exceeds the maximum allowed size Raise Max size per file, or upgrade if you're already at your plan ceiling.
Too many files Raise Max files on the field or Max files per submission on the list.
Storage quota exceeded for this account Delete old submissions to reclaim space, or move to a larger plan.

Set the tightest limits that still fit your use case. A headshot field capped at 2 MB and one PNG/JPG keeps your storage predictable and gives visitors a clear error the moment they pick something wrong, instead of after a long upload.

Redirects & Success Messages

Control what happens after someone submits your form.

Custom redirect (Form Action URL method)

Redirects are set in the dashboard, not in your HTML. After a plain form post, Waitloop sends the browser to the first of these that's set:

  1. The Thank-You URL on the list — list Settings tab. Use this when one list needs its own destination.
  2. The Default Thank-You URL on your account — Settings page. Applies to every list that doesn't set its own.
  3. If neither is set, the visitor returns to the page they submitted from with ?waitloop=success appended, so you can show your own confirmation.
Your page, after a submit with no thank-you URL set
https://yoursite.com/landing?waitloop=success

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.

Responses & Errors

Only needed if you're posting to Waitloop from your own code. The widget handles all of this for you.

Which response you get

  • Post application/json and you always get JSON back.
  • Post a plain HTML form and you get a 302 redirect, as described in Redirects.
  • Posting files is ambiguous — a script wants JSON, a real form wants a redirect. Send Accept: application/json to get JSON; otherwise you get the redirect.

Successful signup

200 OK
{
  "success": true,
  "message": "You're on the list!",
  "position": 42,
  "referralCode": "wz_8kT4mNpQ2xY7"
}

Errors

Every failure uses the same envelope. Show error.message to your visitor — it's already written for them.

400 Bad Request
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid email address."
  }
}
Status What it means
400 The submission was rejected — bad email, a field that broke the rules, a failed CAPTCHA, or a file that didn't pass the upload checks.
404 Unknown form key, a list that isn't active, or a submission from a domain you haven't added to Allowed Domains. Check that first — it's the most common cause.
429 Too many requests, or the list has hit your plan's monthly signup limit.

Tip: A 404 on a key you know is correct almost always means the page's domain isn't in Allowed Domains. Add it, including any staging or preview domains you test from.

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. Any list with its own Thank-You URL overrides this.

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, 90, 180, or 365 days. Choose "Forever" to keep data indefinitely. Deleting a submission also removes any files attached to it.

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

Appearance is set once in the dashboard and applies everywhere you've embedded that form — no CSS to write and no styles to keep in sync across pages. Open your list, go to the Form Creator, and use the Theme panel:

  • Colors — button and button text, form background and text, labels, and input background, border, and text
  • Shape & type — corner radius, font family, and the width at which the form switches to its narrow layout
  • Layout — stacked, inline, or two-column, with field labels shown or hidden
  • Content — form title, description, button text, success message, and the "Powered by Waitloop" credit

Only text strings can be overridden per embed, using data-* attributes — useful when the same form appears on several pages with different wording. See Per-Form Text Overrides.

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 address of the page the form was submitted from. No configuration required — but it does require the widget script, since a plain form post doesn't send the page address. Use Method 2 or Method 3 for campaign tracking.

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)
  • utm_term and utm_content - Captured and stored with each submission

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

What's in an instant notification

The instant email carries the whole submission, so you can act on it without opening the dashboard:

  • A summary line — list, project, submitter email, queue position, time, and form key
  • Every field the visitor filled in, labelled the way your form labels it and in the same order
  • A thumbnail of each uploaded image, with a link to download the original at full size

Image links in email are valid for 7 days and work without signing in, so treat the email as you would the files themselves — forwarding it shares the images. The copies in your dashboard never expire. Very long answers are trimmed in the email; the full value is always in the dashboard and CSV export.

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.

Seats included: Sandbox and Starter 1, Pro 3, Business 10, Enterprise unlimited.

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