Double Opt-In Process

The Double Opt-In built-in functionality in ZMP allows for an explicit opt-in process. When this feature is enabled in ZMP, new users can be created in ZMP, and properties can be assigned to the profile, but their status will be set to ‘New’ by default. They will not receive any promotional email campaigns until they click on the opt-in link in a confirmation email and their status is switched to Active.
1. Set up experience using any event as the trigger (i.e., did sign up, or signed up at).
2. Request Zeta/Support/SA to enable the double opt-in feature flag.
3. Enable the experience immediately after.
4. Test the experience to make sure the process is working as expected.
Setting up the Opt-In Confirmation Email Experience
1. Navigate to the Experience Builder and create an event.

2. Configure the sign-up email and click on Edit Content.
3. Add {{optin_link}} in the liquid tag.
-20260414-060442.gif?inst-v=46b222eb-aabd-43c3-acec-ffebac0475a6)
Make sure you turn the Mark as Transactional toggle on to allow the double opt-in email to go out. ![]() |
Once the criteria are met for the experience (ex. ‘Did open'), the confirmation email will be sent to the user. Clicking the link in the email will direct the user to a ZMP-hosted page confirming success and letting them know they will be redirected automatically.
Once they have clicked on the link to confirm, their status will be changed from ‘New’ to ‘Active’, the ‘Double Opt-In’ property will be set to ‘True,’ and they will be able to receive promotional campaigns.
-20260414-061111.gif?inst-v=46b222eb-aabd-43c3-acec-ffebac0475a6)
Once the double opt-in feature is enabled, any new profiles created in ZMP through any means (including site events, API ingestion, and bulk file uploads) will require the double opt-in moving forward, unless you have a system to explicitly set their status to Active. It is possible to explicitly set the contact status to Active directly via API or JSONL.
Bulk Upload & Data Ingestion Considerations
When Double Opt-In (DOI) is enabled, all new profiles created via bulk file uploads (e.g., CSV/JSONL ingestion, CDM imports, or other file-based onboarding methods) will follow the same DOI rules as other ingestion sources.
Profiles ingested via file uploads will default to a ‘New’ status and will not receive promotional email campaigns until consent is confirmed.
Bulk uploads do not automatically trigger the DOI confirmation email unless they are paired with an experience or event-based trigger.
To bypass DOI for specific records, the contact status must be explicitly set to ‘Active’ at ingestion time via API or JSONL.
File-based ingestion alone cannot complete the DOI process. A confirmation event (e.g., signup trigger + email experience) is still required for compliance.
Limitations of Bulk File Uploads with Double Opt-In (DOI)
When Double Opt-In (DOI) is enabled, there are important limitations to be aware of when updating subscription status via bulk file uploads (such as CSV or JSONL):
Bulk uploads cannot complete the opt-in process
Uploading contacts via file does not fulfill DOI requirements. Contacts must still complete the confirmation step (e.g., clicking the opt-in link in an email) to become fully subscribed.Contacts will remain in “New” status until confirmed
Even after being uploaded, contacts will stay in a New status and will not be eligible to receive promotional campaigns until they confirm their opt-in.Subscription status cannot be force-updated to bypass DOI
In accounts where DOI is enforced, bulk uploads alone cannot reliably move contacts from New to Active if the confirmation step is required by configuration.Confirmation emails are not automatically triggered
File uploads do not send opt-in confirmation emails by default. A corresponding experience or event-based trigger must be configured to initiate the DOI email.Additional configuration is required for exceptions
If there is a need to set contacts as Active without confirmation, this must be handled explicitly through supported ingestion methods (such as API or properly configured JSONL), and only if allowed by account settings.
