> ## Documentation Index
> Fetch the complete documentation index at: https://docs.instantcampaign.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Double opt-in

> Require people who sign up through your forms to confirm their email address before they can receive campaigns.

With **double opt-in**, a new signup from one of your public forms isn't mailable straight away. InstantCampaign emails a confirmation link to the address the person entered. The contact becomes active only after they click it.

Double opt-in proves that the person owns the address and asked to hear from you. It keeps typos and fake addresses off your lists and protects your sender reputation.

## What it applies to

Double opt-in applies to **public signup form submissions** only. Imported contacts and contacts added through the API are treated as already consented and don't get a confirmation email. Contacts synced from integrations keep the consent state they have in the other system. For example, a Mailchimp contact who is pending there arrives as **Pending**, and a Shopify customer who hasn't consented to email marketing arrives as **Unsubscribed**. They don't get a confirmation email either.

Contacts you already have aren't affected when you turn it on.

## Turn it on for the workspace

<Steps>
  <Step title="Open the setting">
    Go to **Settings → Double opt-in**.
  </Step>

  <Step title="Enable it">
    Click **Enable**. The status changes to **Enabled** with the note *New form signups are held as Pending until confirmed.*
  </Step>
</Steps>

Only workspace owners and admins can change this setting.

<Warning>
  If you haven't set up a sending address, confirmation emails are sent from InstantCampaign's platform address and the settings page warns you. Add a default sender profile (see **Settings → Sender Information**) so confirmations come from your own domain.
</Warning>

## Override it for a list

Each list can follow the workspace setting or override it. Go to **Contacts → Lists**. On the list's card, set **Double opt-in** to:

* **Team setting**: follow the workspace setting (the default)
* **On**: always require confirmation for signups to this list
* **Off**: never require confirmation for this list

## Use your own confirmation email

Unless double opt-in is **Off** for the list, the list's card also has a **Confirmation template** picker. Choose one of your templates, or keep **Built-in confirmation mail**.

Your template must contain the `{{confirm_url}}` merge tag where the confirmation link should go:

```html theme={null}
<a href="{{confirm_url}}">Confirm my subscription</a>
```

The usual contact merge tags also work. If the template doesn't contain `{{confirm_url}}`, the built-in confirmation mail is sent instead, so signups are never stranded.

## What the subscriber sees

1. They submit your form.
2. They receive an email asking them to confirm their subscription. The link is valid for **7 days**.
3. They click the link and see **Subscription confirmed**. If they click it again, they see **Already confirmed**.

Until they confirm, the contact and their list subscription show as **Pending**, and they don't enter any journey. When they confirm, they enter the journeys triggered by the form they submitted.

Each confirmation email confirms only the list it was sent for. If someone signs up to two double opt-in lists through two different forms, they get two emails, and each link confirms its own list. Clicking the first link doesn't subscribe them to the second list. A resent confirmation covers every list that is still waiting when you send it. The contact page shows *Awaiting double opt-in confirmation — this contact is excluded from all sends until they confirm.*

## Resend a confirmation

If someone didn't get the email, or their link expired, open the contact and click **Resend Confirmation**. The button is also in the contact's **⋮** menu on the **Contacts** page.

It is offered when:

* the contact is **Pending**, or
* the contact is **Active** but still has a **Pending** subscription to a double opt-in list, for example an existing subscriber who signed up to another list through a form. Their contact page says which lists are waiting.

A confirmation is never sent to a contact who is **Unsubscribed**, **Bounced**, **Complained** or erased. To protect the recipient, one address can be sent at most 3 confirmation emails an hour, and each team member can send at most 20 an hour.

You need permission to edit contacts to resend a confirmation.

<Tip>
  Confirmations can trigger other systems. The **List subscription confirmed (double opt-in)** webhook event fires once for each list a click confirms, including when a contact who was already subscribed elsewhere confirms a new list. The **Contact confirmed (double opt-in)** event fires only when a pending contact confirms for the first time. See [Webhooks](/guides/developers/webhooks#double-opt-in-confirmations).
</Tip>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Pending contacts aren't in my campaign audience">
    That's expected. Pending contacts are left out of every send until they confirm.
  </Accordion>

  <Accordion title="A contact confirmed but one of their lists is still Pending">
    Each confirmation link confirms only the list it was sent for, so a list joined through another form waits for its own link. Use **Resend Confirmation** on the contact to send one link that covers every list still waiting.
  </Accordion>

  <Accordion title="The link says it is invalid or has expired">
    The link is more than 7 days old, or it was changed when it was copied. Send a new one with **Resend Confirmation**.
  </Accordion>

  <Accordion title="My custom confirmation email isn't being used">
    Check that the template contains `{{confirm_url}}` exactly, and that the list's **Double opt-in** isn't set to **Off**.
  </Accordion>
</AccordionGroup>
