A/B Testing
Test different headlines, subheadlines, and hero images to optimize your waitlist conversion.
A/B testing lets you create variants of your waitlist’s headline, subheadline, and hero image. Variants are shown randomly to visitors based on configurable weights, so you can measure which messaging converts best.
How It Works
- Create one or more variants with different headlines, subheadlines, or hero images
- When a visitor loads the signup form, the public config endpoint randomly selects a variant based on weights
- The selected variant’s content replaces the default waitlist headline/subheadline/hero image
- Each variant tracks its own view count and signup count for conversion rate analysis
Create a Variant
API: POST /waitlists/{waitlist_id}/variants
{
"headline": "Be the First to Try It",
"subheadline": "Join 500+ founders already on the list.",
"hero_image_url": "https://example.com/hero-b.jpg",
"weight": 50
}
| Field | Type | Required | Description |
|---|---|---|---|
headline |
string (max 100 chars) | Yes | Alternate headline text |
subheadline |
string (max 200 chars) | No | Alternate subheadline text |
hero_image_url |
string (HTTPS URL) | No | Alternate hero image URL |
weight |
integer (0-100) | No | Relative weight for random selection (default: 50) |
Response (201):
{
"variant_id": "v1a2b3c4-d5e6-7890-abcd-ef1234567890",
"headline": "Be the First to Try It",
"subheadline": "Join 500+ founders already on the list.",
"hero_image_url": "https://example.com/hero-b.jpg",
"weight": 50,
"views": 0,
"signups": 0,
"created_at": "2025-03-15T10:30:00.000Z"
}
headline. The other fields will fall back to the waitlist's default values.
List Variants
API: GET /waitlists/{waitlist_id}/variants
{
"variants": [
{
"variant_id": "v1a2b3c4-d5e6-7890-abcd-ef1234567890",
"headline": "Be the First to Try It",
"subheadline": "Join 500+ founders already on the list.",
"hero_image_url": null,
"weight": 50,
"views": 230,
"signups": 45,
"conversion_rate": "19.57%",
"created_at": "2025-03-15T10:30:00.000Z"
},
{
"variant_id": "v5d6e7f8-a901-2345-bcde-f12345678901",
"headline": "Don't Miss Out",
"subheadline": "Early access is filling up fast.",
"hero_image_url": null,
"weight": 50,
"views": 215,
"signups": 52,
"conversion_rate": "24.19%",
"created_at": "2025-03-15T11:00:00.000Z"
}
]
}
The conversion_rate is calculated as (signups / views * 100) and returned as a formatted percentage string.
Update a Variant
API: PATCH /waitlists/{waitlist_id}/variants/{variant_id}
{
"headline": "Updated Headline",
"weight": 30
}
Only the fields you include are updated. Omitted fields keep their current values.
Response (200):
{
"variant_id": "v1a2b3c4-d5e6-7890-abcd-ef1234567890",
"updated": true
}
Delete a Variant
API: DELETE /waitlists/{waitlist_id}/variants/{variant_id}
Returns 204 No Content. Existing signups that saw this variant retain the variant_id in their records.
How Weights Work
Weights are proportional, not percentages. The probability of a variant being selected is:
probability = variant_weight / sum_of_all_weights
Example: If you have two variants with weights 50 and 50, each is shown 50% of the time. If you add a third variant with weight 100, the probabilities become:
| Variant | Weight | Probability |
|---|---|---|
| A | 50 | 25% |
| B | 50 | 25% |
| C | 100 | 50% |
When no variants exist, the waitlist’s default headline, subheadline, and hero image are always shown.
Tracking Results
Each variant tracks views and signups automatically:
- Views are incremented each time the public config endpoint (
GET /public/waitlists/{id}/config) selects and returns a variant - Signups are incremented when a signup is created with that variant’s
variant_id
The variant_id is stored with the signup record and is included in:
- The List Signups API response
- CSV exports
- The List Variants response (as aggregate
views,signups, andconversion_rate)
Related
- Creating Waitlists — configure default headline, subheadline, and hero image
- Analytics — track signup trends and traffic sources (Pro)
- Managing Signups — view variant data per signup in list and export views