Skip to main content

Overview

A confirmed opt-in (also called double opt-in) requires new email subscribers to verify their email address by clicking a confirmation link in a follow-up email. This extra step ensures your email subscribers genuinely want to hear from you.
This guide walks you through how to set up a confirmed opt-in workflow using a minimum of 1 Tag, Segment, and Journey. See our Pricing page for details on plan limits.If you want to set up a confirmed opt-in flow via API directly, see Example verification magic link OTP.

Single vs double opt-in

  • Single opt-in: A user enters their email (e.g., signup form) and is immediately added to your mailing list.
  • Double opt-in (confirmed opt-in): After entering their email, the user must click a confirmation link in a verification email before they’re added.

Benefits of double opt-in

  • Improves engagement and list quality
  • Verifies compliance with GDPR, CAN-SPAM, and other regulations
  • Filters out fake, spam-trap, or mistyped addresses
  • Reduces bounce and complaint rates
  • Protects against abuse and list bombing
Most professional senders use double opt-in to protect their domain reputation and maximize deliverability.

How to create a confirmed opt-in journey

This setup will use a tag called confirmed_opt_in with a value of true or false to identify confirmed subscribers. If you already have a list of email subscribers that are confirmed, you can use the CSV Importer to add the tag to these users. Prerequisites: Before getting started, set your email addresses as test Subscriptions in OneSignal. See Test Subscriptions for more details.

1. Create a segment of users that did not confirm opt-in

Within the OneSignal dashboard, go to Audience > Segments and click New Segment. Build a segment called Did not confirm email opt-in that uses the following filters with AND logic:
  • User Tag with confirmed_opt_in “is not” true
  • Device Type is Email
  • Test Users is true (will remove before setting live in Production)
This segment will contain all test users with an email Subscription and tag confirmed_opt_in set to false or is not set.
Did not confirm email opt-in segment

Did not confirm email opt-in segment

2. Create a confirmed opt-in email template

Navigate to Messages > Templates > New Email Template and select HTML Editor or Drag & Drop Editor. Design a simple confirmation email:
  • Clear subject line (e.g., “Confirm your subscription”)
  • A single, prominent confirmation CTA (“Confirm Subscription”)
  • Do not include any other links like social media buttons or other CTAs that may distract the user from the confirmation process.
Here’s a starter template you can copy and paste into the HTML editor:
HTML
<!DOCTYPE html>
<html>
  <body style="font-family: Arial, sans-serif; background-color: #f7f7f7; padding: 20px;">
    <table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="max-width: 600px; margin: auto; background: #ffffff; border-radius: 8px; overflow: hidden;">
      <tr>
        <td style="padding: 30px; text-align: center;">
          <h2 style="color: #333;">Please confirm your subscription</h2>
          <p style="color: #555;">We just need to verify your email address before adding you to our list.</p>
          <a href="https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExOHgxZjNrcTRvM2FoZTNzNDVhN2c1ZmN3ajdwYjFlcjR6ZmU0MDVuNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fxI1G5PNC5esyNlIUs/giphy.gif" 
             style="display: inline-block; padding: 12px 20px; margin-top: 20px; background-color: #007bff; color: #ffffff; text-decoration: none; border-radius: 4px; font-weight: bold;">
             Confirm Subscription
          </a>
          <p style="font-size: 12px; color: #999; margin-top: 30px;">
            If you did not request this, you can safely ignore this email.
          </p>
        </td>
      </tr>
    </table>
  </body>
</html>
Opt-in Template

Opt-in Email Template

Notice the “Confirm Subscription” button links to a page https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExOHgxZjNrcTRvM2FoZTNzNDVhN2c1ZmN3ajdwYjFlcjR6ZmU0MDVuNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fxI1G5PNC5esyNlIUs/giphy.gifIt is recommended to change this to your website page that thanks the user for confirming their subscription.

3. Build a confirmed opt-in Journey

Navigate to Journeys > New Journey and select Start from scratch.

Journey settings

  1. Name the Journey: Confirm Email Opt-in or anything you like to recognize what this Journey does.
  2. Entry Rules: Include Segment Did not confirm email opt-in segment.
  3. Exit Rules: Check They moved through the entire Journey.
  4. Re-entry Rules: Select No, they can receive this only once.
  5. Schedule: Select Start immediately or schedule it for a later time and Never stops.
Click Save.

Email message step

Add an Email message step and select the Confirm Email Opt-in template. Your Journey should so far look like this:
Email message step

Email message step & Journey Settings

Wait until step

Add a Wait Until step and set the Branch A condition to:
  • Previous Message
  • Confirm email subscription template name
  • Clicked
Check the Expiration Branch option and set to “Wait a maximum of 1 Day and Continue Journey”.
Wait until step

Wait until step

Tag users who confirm

Under the branch A (Message Clicked) add a Tag User action and set the tag to confirmed_opt_in and the value to true.
Tag User action

Tag User action

As users click the button to confirm their subscription, their confirmed_opt_in tag will change from false to true. This will allow you to track which users have confirmed their email subscription.

Follow up with non-confirmers

After 1 day, if the user did not click the button to confirm their subscription, they will go down the Expire (1 Day) branch. At this point you can create a new email template and repeat the process (Confirm email subscription 2 > Wait until clicked > Tag if clicked). It is recommended to repeat the process at least one more time to ensure the best opt-in rate.
Full Confirm Email Opt-in Journey Example

Full Confirm Email Opt-in Journey Example

4. Test

At this point the Journey should be ready to test. If you followed this tutorial, remember that we use the “Test Users” filter in the Segment, so this will only send to emails you marked as “testers” and fit the tag criteria. If you need to add more test emails, you can do so manually within the OneSignal dashboard following these instructions: When ready to test:
  1. Click Set Live in the Journey.
  2. Wait a few minutes and you should receive the first email template.
  3. Click the button in the email. Wait a few more minutes.
  4. Your user should exit the Journey and have the updated confirmed_opt_in=true tag.

Troubleshooting

Once you set the Journey live, if you did not get the confirmation email after a few minutes:
  1. Navigate back into the active Journey
  2. Click the first Email Step
  3. Select Audience Activity at the top left. See Journey Analytics for more details on Audience Activity.
  4. You should see your email in the “Delivered” column. If its not there, check if your email address is Subscribed and fits the Segment criteria.
If you received the email and clicked the button, but did not get the tag updated afer a few minutes:
  1. Navigate to Audience > Users
  2. Search for your email address
  3. Check the “Tags” column. You should see confirmed_opt_in=true if the Journey worked correctly.
Still need help?Email us at support@onesignal.com with the following information:
  • The email address that you are testing.
  • A link to the Journey. You can copy-paste the URL from the browser address bar.
  • Any additional information that you think may be helpful.
We’ll be happy to help!

5. Set live in production

When ready to send this to actual users, you will need to do the following:
  1. Navigate to the Journey and click More Options > Stop + Archive.
  2. Navigate to the Segment and click Options > Pause, then Options > Duplicate.
  3. Update the Segment to remove the “Test Users” filter.
  4. Navigate back to the Journeys page and click Options > Duplicate.
  5. Update the Journey to use the Segment without the “Test Users” filter and Save.
  6. Click Set Live when ready to go live to all users.
Subscribers who confirm now carry the confirmed_opt_in=true tag, which you can use for segmentation and to ensure you only message verified users.

Important Considerations & Gotchas

  • GDPR requires explicit consent, which double opt-in provides.
  • CAN-SPAM doesn’t require double opt-in, but it reduces complaints.
  • Always store proof of consent (timestamp + source).
  • Confirmation emails should be plain and short — avoid heavy images.
  • Don’t add marketing content to your confirmation email.
  • Set up proper email authentication (SPF, DKIM, DMARC) to avoid spam folders.
  • Show a thank-you page after signup that explains the confirmation step.
  • Use a clear subject line (e.g., “One last step: Confirm your subscription”).
  • Send reminders sparingly — 2–3 attempts max.
  • Links not tracking: Make sure your button uses a tracked link from the OneSignal template editor.
  • Users never confirm: Some emails may land in spam. Encourage users to check spam or promotions folders.
  • Duplicate opt-ins: Only allow confirmed_opt_in = true users in your primary send segments.

Next Steps

I