Double Opt-In
Verify subscriber intent with confirmation emails.
What is double opt-in?
Double opt-in (DOI) is a two-step subscription process. When a contact is added to a list that has double opt-in enabled, they are not immediately treated as a confirmed member. Instead, SendBeam sends them an automated confirmation email. Only after they click the confirmation link do campaigns sent to that list reach them.
This is in contrast to single opt-in, where a contact is a full member of the list the moment their address is collected — for example, when they submit a sign-up form.
Why it matters
Enabling double opt-in delivers measurable improvements across three key areas:
- List quality — only people who genuinely want your emails make it through. Typos, fake addresses, and disinterested sign-ups are filtered out before they reach your confirmed audience.
- Deliverability — engaged subscribers who confirmed their intent are far less likely to mark your emails as spam. A lower complaint rate protects your sender reputation and keeps your emails landing in the inbox rather than junk folders.
- Compliance — in regions covered by GDPR, CASL, and similar regulations, double opt-in provides a clear record of consent: the confirmation happens from the subscriber's own inbox.
- Engagement rates — open and click rates are consistently higher on double opt-in lists because every subscriber on the list actively chose to be there.
How the confirmation flow works
Here is the complete journey a subscriber takes when double opt-in is enabled:
- The contact is added to the list — through a SendBeam sign-up form, from the list's page in the dashboard, or via the API.
- Unconfirmed membership — SendBeam creates the contact record (if it does not already exist) and adds them to the list as unconfirmed. Campaigns sent to the list skip them while they are in this state.
- Confirmation email sent — SendBeam immediately sends a confirmation email from your workspace's sender address with the subject "Please confirm your subscription to list name" and a single confirmation button. At most one confirmation goes to an address every 10 minutes, and each one counts towards the account's monthly email allowance.
- Contact clicks the link — SendBeam verifies the token and marks their membership of the list as confirmed. From then on, campaigns sent to the list include them, and any automation with the List Joined trigger for this list starts for them now — not when they were first added.
- Confirmation page shown — the subscriber sees a SendBeam-hosted "Subscription confirmed" page. A link that has already been used shows an "expired or invalid" page instead.
If the contact never clicks the confirmation link, they remain unconfirmed on that list and campaigns sent to it will not reach them. Their contact status stays Subscribed, so on paid plans campaigns sent to All Contacts or to a segment can still include them — keep form-fed lists as the audience for those contacts if you want the confirmation to gate every send. On the Free plan the confirmation gates every send: unconfirmed contacts, including any imported from CSV or created through the API, are not mailed by any campaign.
"membership": "pending_confirmation", and posting the same contact again while they are unconfirmed re-sends the link. Contacts brought in by CSV import are not added to any list.Enabling double opt-in on a list
- Go to Lists in the sidebar and open the list (or tick Require double opt-in in the Create New List form for a new one).
- Expand List details at the top of the list page.
- Tick or untick double opt-in and save.
The change applies to people who join from then on. Existing members are not asked to re-confirm and keep whatever confirmation state they had. Unconfirmed members are counted at the top of the list page ("N awaiting confirmation") and badged in the members table.
Sending confirmations to pending members
A bulk add from the Contacts page and a CSV import with a list chosen put people on a double opt-in list as unconfirmed and send nothing — importing a thousand rows must not fire a thousand emails by accident. When you do want those people asked, click Send confirmation emails next to "N awaiting confirmation" at the top of the list page. It mails only members who have not confirmed (someone who clicks the link between your selection and the send is never mailed again), skips anyone who was sent any transactional email in the last 24 hours, and sends at most 500 per run — run it again later for the rest. Each email counts against your monthly allowance, and five provider refusals in a row (plan quota, a paused workspace, a sending-domain problem) stop the run. The result says how many were sent, skipped and still pending.
From a script: POST /api/v1/lists/{id}/confirmations (key with
lists:write), optionally with contact_ids to limit the run to some
members. A single opt-in list answers 422. No other platform ships this: most cannot
re-send a confirmation at all.
Stuck, or found a gap? Ask in the community — questions, tips and every release note, with this page as the source of truth.