Double opt-in is widely considered a best practice for email deliverability and US anti-spam compliance (CAN-SPAM, CCPA-aligned consent records). It proves the subscriber actually owns the address they gave you and protects your sending reputation from typos, bots, and spam traps.
What double opt-in is
Double opt-in means a customer does not start receiving your campaigns until they explicitly confirm their subscription by clicking the link in the opt-in email you send them. Until they click that link, their subscription stays in the Requires confirmation status. Once they click, the status flips to Subscribed and regular campaigns start flowing. Two concepts are related but distinct in Maestra:- Subscription confirmation (DOI) — the customer’s consent to receive campaigns in a given channel. It’s tied to the channel (and optionally topic).
- Contact confirmation — proof that a specific email address or phone number belongs to a specific customer. It’s tied to the contact itself, not to a channel.
Turn on double opt-in
Create the opt-in campaign
Create the campaign that the workflow will send.In the campaign settings, the Subscription confirmation profile must be selected. Then, in the template, mark the relevant link as the confirmation link for the channel or topic.
Build the flow
Create a flow with the trigger Subscription status changed to “Requires confirmation” in the email channel.Specify a topic only if you want confirmation for a specific topic. For channel-level confirmation, leave the topic empty.In the Steps block, choose Send email and pick the opt-in campaign you built in the previous step.
How email subscriptions change once DOI is on
With DOI active, a customer’s email subscription can be in one of four statuses: Subscribed, Unsubscribed, Requires confirmation, or No data. How an incoming change is interpreted depends on which channel of data delivery it came through.API operations
Register — creates a new customer. You can’t pass an unsubscribe here, only brand, channel, and topic.- Any status → Requires confirmation
- Any status → Requires confirmation
/customer/subscriptions/subscription/isSubscribed:
true→ Subscribedfalse→ Unsubscribed- No subscription block → No data
true→ Subscribedfalse→ Unsubscribed
- Any status → Requires confirmation
File import
Customer import — if the customer is new, you can add a subscription in any status, or skip subscription entirely (status will be No data). If the customer already exists, you can move them from any status to Subscribed (true), Unsubscribed (false), or Requires confirmation (WaitingForConfirmation). You can’t move a customer back to No data.
Data edit import — you can move any customer from any status to Subscribed, Unsubscribed, or Requires confirmation. You can’t move back to No data. For bulk subscribe/unsubscribe, follow the mass subscription guide.
Flows
When a flow edits a customer, the system automatically logs an action “Customer edit in flow block ‘Flow name’ — ‘Step description’”. Subscribing to the email channel is not available inside flows. You can only unsubscribe a customer or move them to Requires confirmation.| Flow type | Before → After |
|---|---|
| Flow requiring confirmation | Any status → Requires confirmation |
| Flow with unsubscribe | Any status → Unsubscribed |
Polls
Poll with subscription:| Before | After |
|---|---|
| Subscribed | Subscribed |
| Unsubscribed | Requires confirmation |
| Requires confirmation | Requires confirmation |
| No data | Requires confirmation |
- Any status → Unsubscribed
Branded unsubscribe page
When the customer ticks a topic checkbox and saves:- Any status → Subscribed
- Any status → Unsubscribed
Manual change in the customer card
You can move a customer from any status to Subscribed, Unsubscribed, or Requires confirmation. You can’t move back to No data.Welcome flow with subscription confirmation
A typical DOI welcome program has two trigger events — a new customer landing in your database, and a customer confirming their subscription. Build a separate flow for each. Before you start, prepare your campaigns:- An automated opt-in campaign for the confirmation request and the reminder (both must use the opt-in profile).
- An automated welcome campaign that goes out after confirmation (standard profile).
- Configure the confirmation link setting on the relevant links so a click confirms the subscription.
Flow 1 — request subscription confirmation
Set the trigger
Trigger on a subscription change — specifically, when the customer enters the Requires confirmation status in the email channel.What counts as entering this status:
- Status became “Requires confirmation,” including implicitly.
- Status went straight to “Requires confirmation.”
- Customer appeared already in this status.
- Status returned to “Requires confirmation.”
- An implicit “Requires confirmation” became explicit.
- After a merge, the primary customer ended up in this status.
Check the contact
Verify that the contact exists and is valid. You don’t need to check the subscription status here — the trigger event already guarantees it. If you use a different trigger, add a filter for Subscription — Requires confirmation in the Email channel.
Flow 2 — welcome email after confirmation
When the customer clicks the confirmation link, the system automatically issues an action “Customer subscription to channel” (or “Customer subscription to topic” if the link is topic-scoped). Trigger this flow on that action.Check the click and the contact
Verify there was a click in the campaign and that the customer is subscribed with a valid contact.If you only have one confirmation flow, you can skip the extra checks. But if you run multiple confirmation campaigns — for example, separate flows for different topics — these checks matter, because the same action template is issued in every case.
Send the welcome email
A few ideas for the welcome email:
- Recommend popular products, or browsed products if you have them.
- Offer a promo code or loyalty points as a thank-you for subscribing.
- Recommendations —
Recipient.Recommendations.{algorithm name}. - Promo code —
Recipient.LastReceivedPromoCode.WithType{pool name}.Value. - Point expiration date — use
AddDaysto add the relevant number of days toMessage.SendingDateTime.
Turn off double opt-in
If you need to disable subscription confirmation, do this in order:Remove opt-in campaigns
DOI can’t be turned off while opt-in campaigns are still active. Find and remove or reconfigure them.Use the event log filter to find campaigns with the opt-in profile. Switch the profile to anything that does not include Send only to customers awaiting subscription confirmation — for example, the Standard profile. If a campaign can’t be edited, delete it.
For multi-brand projects: only remove opt-in campaigns in the brand where you’re turning DOI off.
Disable confirmation
Go to Settings → Campaigns → Email settings and uncheck Subscription confirmation.