Double opt-in keeps people off your marketing list until they prove they own the inbox. The signup is the first opt-in. The confirmation click is the second.

Enable it before you collect subscribers in a market that expects consent evidence (France, the EEA, and most public capture pages). Lumail's native flow is the supported one — do not invent a custom confirmation state machine with the transactional API.

## What it does

With **Enable Double Opt-In** on:

1. A new subscriber is created as `PENDING_CONFIRMATION`.
2. Lumail sends your confirmation email from the organization's default sender.
3. The subscriber clicks `{{confirmUrl}}`.
4. Their status becomes `SUBSCRIBED`. Lumail stores `confirmedAt` and `confirmationIp`, writes a subscribed timeline event, and starts tag-triggered workflows.

Until that click, they do not receive campaigns or workflow marketing emails. Filter **Subscribers → Pending Confirmation** to see who is waiting.

## How the confirmation works

```
Signup (form, API, capture page, integration)
        ↓
PENDING_CONFIRMATION  +  confirmation email (24h token)
        ↓
Click {{confirmUrl}}  →  /confirm?token=…
        ↓
SUBSCRIBED  +  confirmedAt / confirmationIp  +  workflows
```

The confirmation link is a single-use token URL. A second subscribe POST for the same pending address does not send a second email or rotate the token. If they never click, they stay pending — turning the setting off later does not subscribe them for you.

Existing `SUBSCRIBED` contacts are left alone when you enable the setting. Only **new** subscribers go pending.

## Enable it

1. Open **Settings → Configuration**. The URL is `/orgs/[your-org]/settings/configuration`.
2. Find the **Double Opt-In** card.
3. Turn **Enable Double Opt-In** on.
4. Click **Save**.

![Double Opt-In card on Settings → Configuration](/docs/tutorials/double-opt-in-settings.png)

_The first card on Configuration. The switch is organization-wide._

| Control | What it does |
| --- | --- |
| **Enable Double Opt-In** | New subscribers are `PENDING_CONFIRMATION` and get a confirmation email |
| **Change email template** | Opens the confirmation email editor (only after the switch is on) |
| **Save** | Persists the switch. The email template is saved separately inside the editor |

The card below it — **Add transactional recipients to the marketing list** — is a different path. Turning that on creates receipt/OTP recipients as `SUBSCRIBED`. Double opt-in does not apply there.

## Customize the confirmation email

With the switch on, click **Change email template**.

![Confirmation email editor with subject, preview, and {{confirmUrl}} button](/docs/tutorials/confirmation-email-editor.png)

_Subject, preview, and body. The blue button must point at `{{confirmUrl}}`._

| Data point | Detail |
| --- | --- |
| **Subject / Preview** | Inbox subject and preview text. Defaults are `Confirm your email address` |
| **`{{confirmUrl}}`** | Required. Type `@` and pick **Confirmation URL**, or `/confirm` to insert the confirmation button |
| **`{{name}}` / fields** | Same subscriber variables as campaigns. `@` opens the menu |
| **Snippets** | Type `/` to insert an organization snippet |
| **Default sender** | Confirmation emails always send from the organization's default sender |
| **Save email** | Writes the template. Missing `{{confirmUrl}}` falls back to the default template |

The recipient confirmation page (`You're all set`) follows **Settings → Language**, not the email body language. Translate the email yourself.

## After they confirm

The subscriber timeline shows that they **confirmed their email via the double opt-in link and subscribed to the list**. The confirmation-link click is labeled as such, not as a generic URL click.

Workflows that start on **subscriber created** or **tag added** wait until confirmation. Tags attached at signup are replayed after the click so tag-triggered workflows enroll a real `SUBSCRIBED` contact.

Campaigns only target `SUBSCRIBED`. Pending contacts never enter a send.

## What uses double opt-in

| Source | New subscriber | Confirmation email |
| --- | --- | --- |
| Capture page | `PENDING_CONFIRMATION` | Sent |
| Subscribers API / SDK (`POST /api/v1/subscribers`) | `PENDING_CONFIRMATION` | Sent (unless `triggerWorkflows: false`) |
| ClickFunnels / Systeme.io | `PENDING_CONFIRMATION` | Sent |
| Dashboard **Add Subscriber** | `PENDING_CONFIRMATION` | Sent only if **Trigger workflows** is on |
| CSV import | `SUBSCRIBED` by default | Not sent — import writes status directly |
| Transactional API / SMTP | `TRANSACTIONAL` or `SUBSCRIBED` | Ignored. Not a custom double-opt-in mechanism |
| Resubscribe of `UNSUBSCRIBED` / `TRANSACTIONAL` | `SUBSCRIBED` | Skipped |

`triggerWorkflows: false` still creates the pending subscriber and a confirmation token. It skips the email. Use that for silent imports; do not use it on a public form.

For the legal and evidence limits of `confirmedAt` / `confirmationIp`, see [GDPR in Lumail](/docs/legal/gdpr-in-lumail#native-and-custom-double-opt-in).

## Related documentation

- [GDPR in Lumail](/docs/legal/gdpr-in-lumail) — when to enable native confirmation
- [Create Subscriber API](/docs/api-reference/api-subscribers-post) — signup payload and `triggerWorkflows`
- [Language](/docs/features/language) — confirmation page locale
- [Subscriber Events](/docs/features/subscriber-events) — `SUBSCRIBED` timeline events
- [Workflows](/docs/workflows) — enrollments start after confirmation
- [Account Verification](/docs/features/account-verification) — DOI also helps sender health
