Tracking email delivery on your waitlist signups
What email_status, email_delivered_at, and email_opened_at tell you, and how to use the data before you send invites.
Sending a welcome email is not the same as the email arriving. Between your server and someone's inbox, there are bounces, spam filters, full mailboxes, and provider delays. Knowing which signups actually received your email is useful before you start inviting people.
The four delivery states
Each signup on Enlist tracks four email fields:
email_status: string | null;
email_delivered_at: string | null;
email_opened_at: string | null;
email_clicked_at: string | null;email_status is the current state of delivery. The full set is sent, delivered, delivery_delayed, opened, clicked, bounced, complained, failed, and config_error. null means no email has been sent yet (Free tier, or email not yet configured).
email_delivered_at is the timestamp the email provider confirmed delivery to the recipient's mail server. Delivered does not mean in the inbox, since some providers count delivery at the server level, but an undelivered email definitely never arrived.
email_opened_at is when the email was opened, tracked via a pixel. Not all email clients load pixels (Gmail sometimes does, Apple Mail sometimes proxies opens), so absence of an open doesn't mean the email wasn't read.
email_clicked_at is when a link in the email was clicked. More reliable than open tracking for measuring engagement, since it requires an active action.
Querying via the API
curl https://api.enlist.dev/v1/waitlists/WAITLIST_ID/signups \
-H "Authorization: Bearer $ENLIST_API_KEY"Each signup in the response includes all four fields. You can filter or aggregate on the client side to identify:
- Bounced signups before sending invites
- Opened-but-not-clicked signups for re-engagement
- Signups with no delivery event at all (provider issue or fake email)
Why this matters before an invite batch
If you're planning to invite signups in order of position, a bounce means you'll never reach that person. Sending an invite to a bounced address wastes the slot and looks bad if you're trying to give early access to real users.
The practical pre-invite checklist:
- Pull signups ordered by position
- Filter out
email_status = 'bounced'oremail_status = 'complained' - Invite the remaining signups in order
That's the difference between "we invited 100 users" and "we successfully invited 100 users."
Open and click rates as a proxy for list quality
Aggregate open and click data tells you something about how interested your list actually is. A list where 5% of signups opened the welcome email is different from one where 60% opened it. If you're trying to decide between opening access broadly vs. a small beta, list engagement is one signal worth looking at.
Aggregate delivery, open, and click rates are available via the stats endpoint:
curl https://api.enlist.dev/v1/waitlists/WAITLIST_ID/stats \
-H "Authorization: Bearer $ENLIST_API_KEY"The response includes an email_engagement object:
{
"email_engagement": {
"emails_sent": 1100,
"delivery_rate": 94,
"open_rate": 41,
"click_rate": 12
}
}Rates are integers (0–100) and null until at least one email has been sent. Individual delivery state is queryable per signup via listSignups.