Documentation

LaunchQ Docs

Everything you need to build, embed, and grow a viral waitlist — from your first signup to launch day.

Quick Start

Get a live waitlist in under 5 minutes. No engineering required.

1. Create your account

Go to launchq.co/auth/signup and create a free account with your email.

2. Create a waitlist

From the dashboard, click New Waitlist. Give it a name — this sets your public URL slug (e.g. launchq.co/w/your-app).

3. Embed or share

Copy your hosted page link and share it directly, or grab the embed snippet and drop it on your website. Your waitlist is live immediately.

Note: Your waitlist is set to Live by default. You can pause or close it anytime from Settings.

React Component

The recommended way to add a LaunchQ waitlist to any React app. Ships as launchq-react — zero runtime dependencies, ~9KB, supports React 17+.

Install

npm install launchq-react

Basic usage

import { LaunchQWaitlist } from 'launchq-react'

export default function Waitlist() {
  return (
    <LaunchQWaitlist
      slug="your-slug"
      onSuccess={(data) => console.log('Joined!', data)}
    />
  )
}

The component fetches your waitlist config, renders the signup form, handles submissions, and shows a success state with position, referral link, and social sharing — all out of the box.

Props

slug
Your waitlist slug (required)
baseUrl
API base URL — defaults to launchq.co
referralCode
Pre-filled ref code, or reads ?ref= from URL
accentColor
Override accent color from dashboard
theme
'dark' | 'light' — defaults to 'dark'
unstyled
Strip all default styles for custom CSS
onSuccess
Callback after successful join
onError
Callback on error
buttonText
Override CTA button text
placeholder
Override input placeholder
className
Additional CSS class on root element
children
Render prop for total UI control

With custom theme

<LaunchQWaitlist
  slug="your-slug"
  theme="light"
  accentColor="#6366f1"
  buttonText="Get Early Access"
  placeholder="Enter your email"
/>

Render prop (full control)

Pass a function as children for complete rendering control while still getting all the logic handled for you:

<LaunchQWaitlist slug="your-slug">
  {({ email, setEmail, submit, submitting, result }) => (
    result ? (
      <p>You're #{result.position}!</p>
    ) : (
      <form onSubmit={(e) => { e.preventDefault(); submit() }}>
        <input value={email} onChange={(e) => setEmail(e.target.value)} />
        <button disabled={submitting}>
          {submitting ? 'Joining...' : 'Join'}
        </button>
      </form>
    )
  )}
</LaunchQWaitlist>

Works with

Next.js, Vite, Remix, Gatsby, Create React App, and any React 17+ project.

Note: The component automatically reads ?ref= from the URL to track referrals. No extra setup needed.

Headless Hook

For when you want full UI control but don't want to wire up API calls yourself. The useWaitlist hook handles config fetching, email state, form submission, error handling, and referral tracking.

Install

npm install launchq-react

Usage

import { useWaitlist } from 'launchq-react'

export default function CustomWaitlist() {
  const {
    config, loading,
    email, setEmail,
    submit, submitting,
    error, result,
  } = useWaitlist({ slug: 'your-slug' })

  if (loading) return <p>Loading...</p>

  if (result) {
    return (
      <div>
        <h2>You're #{result.position}!</h2>
        <p>Share your link: {result.referralLink}</p>
      </div>
    )
  }

  return (
    <form onSubmit={(e) => { e.preventDefault(); submit() }}>
      <input
        value={email}
        onChange={(e) => setEmail(e.target.value)}
        placeholder="you@email.com"
      />
      <button disabled={submitting}>
        {submitting ? 'Joining...' : 'Join waitlist'}
      </button>
      {error && <p style={{ color: 'red' }}>{error}</p>}
    </form>
  )
}

Hook options

slug
Your waitlist slug (required)
baseUrl
API base URL — defaults to launchq.co
referralCode
Pre-filled ref code, or reads ?ref= from URL
onSuccess
Callback with WaitlistResult after join
onError
Callback with Error on failure

Return values

config
WaitlistConfig | null — fetched settings
loading
boolean — true while config is loading
email
string — controlled email input value
setEmail
(email: string) => void
submit
() => Promise — trigger join
submitting
boolean — true during submission
error
string | null — error message if any
result
WaitlistResult | null — join result with position & referral link
Note: The hook is the same one powering the <LaunchQWaitlist> component. Use it when you need a fully custom design.

Script Embed

For non-React sites — WordPress, Webflow, Squarespace, Framer, Shopify, or any HTML page. Drop two lines and you're live.

Usage

<!-- Place where you want the form -->
<div data-launchq="your-slug"></div>

<!-- Before </body> -->
<script src="https://cdn.launchq.co/w/embed.js"></script>

The data-launchq attribute value is your waitlist slug. The script auto-sizes the form — no fixed dimensions needed.

Custom height

Override the default height with data-height:

<div data-launchq="your-slug" data-height="560"></div>

Works on

Framer, Webflow, WordPress, Squarespace, Shopify, Ghost, Notion embeds, and any platform that allows custom HTML or script injection.

Hosted Page

Every waitlist gets a public URL at launchq.co/w/your-slug. Share it directly on Twitter, in your bio, or via email — no website or coding required.

Features

  • Fully branded with your app name, logo, colors, and copy
  • Signup form with referral tracking built in
  • Success screen with position number, referral link, and social sharing
  • Responsive — works on mobile, tablet, and desktop
  • Live status shown — Live, Paused, or Closed
Note: You can enable or disable the hosted page from your dashboard under Integrate & Share. When disabled, visitors see a "This waitlist is not available" message.

Referral System

The referral system is what makes LaunchQ waitlists grow on autopilot. Every subscriber gets a unique referral link. When someone signs up through it, both the referrer and the new subscriber benefit.

How position bumps work

Each successful referral moves the referrer up by a configurable number of positions. You set this in the waitlist settings under Positions per referral (default: 5).

Referral links

Every subscriber's referral link looks like this:

https://launchq.co/w/your-slug?ref=ABC123

The ref parameter is the subscriber's unique 6-character referral code. It's shown to them on the success screen and in their confirmation email.

Viewing referrals

In your dashboard, go to Referrals to see a leaderboard of your top referrers, total referral count, and which subscribers brought the most value.

Note: Referrals are tracked per waitlist. A single email address can have referral codes across multiple waitlists.

Milestone Rewards

Milestones are the gamification layer. When a subscriber hits a referral count threshold, they unlock a custom reward — and get notified automatically.

Creating a milestone

Go to Rewards in the sidebar. Click Add milestone. Set:

  • Referrals required (e.g. 3, 10, 25)
  • Reward label (e.g. "Lifetime deal", "Early access")
  • Icon / emoji to display

What happens when a milestone is hit

The subscriber is shown a celebration message in their referral dashboard. A notification email is queued if email flows are configured.

Note: You can stack multiple milestones. Subscribers will unlock each one progressively as they hit higher referral counts.

Email Automation

LaunchQ sends automated emails via AWS SES. Three flows fire out of the box — no configuration required for basic sending.

Flow 1 — Confirmation (immediate)

Fires the moment someone joins. Contains their position number, a congratulations message, and their personal referral link to start sharing immediately.

Flow 2 — Day-2 referral nudge

Fires automatically 47–49 hours after signup. Reminds the subscriber that they can climb higher by sharing their referral link. Includes the link again.

Flow 3 — Launch blast

Manually triggered from the dashboard. Sends a custom message to your entire active subscriber list. Use it when you actually go live.

Default sending address

By default, all emails are sent from noreply@launchq.co. To send from your own domain, see .

Bounce and complaint handling

Hard bounces, repeated soft bounces (3+), and spam complaints are automatically suppressed. Subscribers can unsubscribe via a one-click link in every email (RFC 8058 compliant).

Custom Domain

Send emails from your own domain (e.g. hello@yourapp.com) instead of noreply@launchq.co. This improves deliverability and brand trust.

Setup steps

  • 1. Go to Settings → Custom sending domain
  • 2. Enter your domain (e.g. yourapp.com) and a from-address
  • 3. LaunchQ generates 5 DNS records to add to your domain
  • 4. Add the CNAME and TXT records in your DNS provider
  • 5. Click Verify — LaunchQ polls AWS SES until DKIM is confirmed

DNS records added

LaunchQ provisions:

  • 3 DKIM CNAME records (for AWS SES email signing)
  • 1 SPF TXT record (authorize SES to send for your domain)
  • 1 DMARC TXT record (protect from spoofing)
Note: DNS propagation typically takes 5–30 minutes. LaunchQ polls every 10 seconds and updates the status automatically once verified.

Subscriber Management

Every subscriber is stored with rich metadata captured at signup time. View, filter, and export from the Subscribers tab.

Captured automatically

Email
Signup email address
Position
Current queue position
Referral code
Unique 6-char code
Referred by
Who referred them
Country / City
From IP geolocation
Device type
Mobile, desktop, tablet
Joined at
Exact timestamp
Status
Active, unsubscribed, bounced

CSV export

Click Export CSV from the Subscribers view. The download includes all columns: email, position, referral count, location, device, and join date.

Subscriber statuses

  • Active — on the list and receiving emails
  • Unsubscribed — opted out via email link, no further emails
  • Bounced — hard bounced, suppressed from future sends

Customization

Every visual aspect of your waitlist page and embed is configurable from the Widget Design tab in your dashboard.

Branding

  • App name — shown above the waitlist form
  • App logo URL — displayed alongside your app name
  • Accent color — drives the button, highlights, and pulse dot

Copy

  • Headline — the large serif title above the form
  • Subtext — supporting copy below the headline
  • Button text — the CTA on the submit button

Theme

Choose between Dark, Light, or Gradient background styles. The form inherits the theme whether embedded or on the hosted page.

Referral mechanics display

Toggle Show position to show or hide a subscriber's queue number on the success screen. Toggle Show referral link to control whether referral sharing is surfaced post-signup.

Settings

Waitlist status

Control whether your waitlist is accepting signups:

  • Live — accepting signups, all flows active
  • Paused — form shows a paused message, no new signups
  • Closed — waitlist ended, form hidden

Positions per referral

Configure how many positions a referrer moves up per successful referral. Higher values create more aggressive viral incentive.

Danger zone

The Settings page includes a Danger zone for irreversible actions: deleting the waitlist and all associated subscribers. This action cannot be undone.