Whether you've just started building an SMS audience or you're looking for an easier way to manage new opt-ins, Iterable's SMS Smart Opt-In feature can automate the sign-up process and gather proof of compliance. With SMS Smart Opt-In, you can:
- Spend less effort obtaining phone numbers and proof of opt-in compliance.
- Gather quality data with accurate phone numbers.
- De-anonymize your app users once they provide their phone number.
- Provide an intuitive opt-in flow so your users can start receiving SMS campaigns in just two clicks!
To use SMS Smart Opt-In, first go to Iterable's template builder and create a Smart Opt-In link. Next, add this link to a template and send it with a campaign. When your users click on the link from their smartphone, they're redirected to their default messaging app with a prefilled message:
Once they click Send, Iterable takes care of the rest!
NOTES
- Only existing users in Iterable can subscribe to your SMS channel using SMS Smart Opt-In. This feature isn't intended for text-to-join use cases that sign up new users.
- SMS Smart Opt-In is available for email and in-app templates.
# In this article
# How it works
SMS Smart Opt-In begins with a link. You can create any number of links, and use them to track subscriptions by message type.
- Each link connects to an SMS message type that has an opt-in subscription policy. Links can use the same message type, or they can be different.
- In campaigns, the links are dynamic and personalized to associate existing users (anonymous or not) with their actions.
- User identifiers (
userId
,email
) are anonymized, so the link doesn't contain sensitive information.
When your user clicks on this link from a mobile device, they're taken to their text message app with a pre-filled message.
Once the user pushes the send button, the pre-filled message is sent to your SMS sender, which is tracked on your Iterable account as a SMS reply event.
When Iterable receives this message:
- A subscribe event is recorded in the user's history.
- The
phoneNumber
field is updated in the user's profile. - The user is opted in to the SMS message type associated with the link.
Next, you can start using your SMS channel to communicate with your users. You might want to create a list of your SMS subscribers and send them a confirmation message.
TIP
SMS Smart Opt-In is intended for mobile phone users.
If a user isn't on a supported device, you can redirect them to a landing page that accepts SMS opt-in requests with a web form. First, create a web form on your company's website that gathers phone numbers and consent. Then, you can use that page URL as the redirect link when you create the SMS Smart Opt-In link.
For more information about setting up a custom preference center, read Creating a Subscription Preference Center.
# How SMS Smart Opt-In selects a number for the user to reply to
For Smart Opt-In to work, Iterable needs a phone number for the user to reply to when they click on the link so that they can send you the message that opts them in to SMS campaigns.
In each SMS Smart Opt-In link, you select a SMS sender that the user's reply gets sent to. This sender is often a messaging service or profile that has a pool of phone numbers.
When a user clicks on the SMS Smart Opt-In link, Iterable assigns a reply-to
number from your sending pool based on the user's profile field, country
.
(This number is only used as the reply-to number for the pre-filled SMS Smart
Opt-In message and doesn't impact the sender for future SMS campaigns.)
# Country matching logic
Because the country
field accepts strings and can hold any value, Iterable
attempts to match countries by their ISO 3166-1 alpha-2 code
(such as "US" for the United States, "FR" for France), or by the country name
in the English language (such as "United States", "France").
If the country
field is set to a value that Iterable can't recognize, or if
the user doesn't have a country
field set in their profile, Iterable can't
match a country to a phone number in the sender pool.
# Country matching priority
When a phone number matching the user's country is in your SMS number pool, Iterable selects a random number matching that country, with the following priority order:
- Short code
- Toll-free number
- Long code for the user's country
Iterable prefers short codes and toll-free numbers over long codes because they have higher deliverability rates and are more recognizable to users. However, they are not available in all countries.
# No country match or no value for the country
field
Sometimes Iterable can't match a user's country to a phone number in the sender pool. This can happen when:
- The user does not have a
country
field set in their profile. - The user's
country
is a value that Iterable can't recognize. - There is no matching country phone number available in the sender pool.
When there is no match, Iterable selects a random number from the sending pool following this priority order:
- US long code
- Any long code
- Toll-free number
Short codes are never selected in this case because they are only supported in certain countries, and when a user's country is unknown, Iterable can't determine whether a short code is appropriate.
TIP
If you don't have a data source to set the country
field set in your user
profiles, Iterable can set this field for you whenever a user's ip
address is
updated. (Iterable can also update the ip
address field for you whenever a
user clicks an email.) To learn more, read Automatically Populating the country
Field.
# Staying compliant with SMS opt-in practices
There are several compliance requirements and best practices that you should follow for your opt-in process, including:
- Including specific legal disclaimers related to your SMS communication practices.
- Gaining and retaining proof of consent to receive SMS communication.
# Legal disclaimers
Alongside each opt-in link, you should provide a legal disclaimer with required information about your SMS campaigns. This includes:
- The frequency a user can expect to receive messages. For example, "3 messages per week".
- A statement that messaging rates may apply.
- A link to your privacy policy and/or terms of service.
- Opt-out instructions (such as texting the keyword "STOP").
- A help keyword (usually "HELP"), a number to text, a toll-free number, or an email address that the user can contact when they need help.
Iterable provides a recommended legal disclaimer that's customized based on your inputs. You can use this disclaimer as provided, modify it, or replace it with your company's own language.
# Proof of consent
Getting permission from your users to send SMS is required for a compliant SMS strategy. As an SMS marketer, it's your responsibility to gain explicit consent before sending SMS and MMS messages.
Iterable's SMS Smart Opt-In provides a workflow that obtains express written consent directly from the user.
When you use SMS Smart Opt-In, your users send a pre-written text message that serves as express written consent to receive SMS communications from your organization.
# Setting up your project for SMS Smart Opt-In
To get started, you need to have a few things set up in your Iterable project as well as some external resources.
Iterable setup prerequisites:
Two-way SMS numbers in your sending pool that can receive SMS replies. Each SMS sender in Iterable is associated with a SMS messaging service or profile that is often set up with a pool of phone numbers. Long codes, short codes, and toll-free numbers are eligible. Alphanumeric sender IDs can't receive SMS replies and therefore can't be used for SMS Smart Opt-In.
An SMS channel with at least one message type that has an opt-in or double opt-in subscription policy. To learn more about message channels and their subscription policies, read Message Channels and Message Types Overview
An email or in-app channel with at least one message type set up in the project.
Additional requirements:
A redirect link for users who are not on their phone. These users will be redirected to this link when they click on the SMS Smart Opt-In link, instead of being taken to their messaging app. For example, you can provide a web form that accepts SMS opt-ins. To learn more about setting up a custom preference center, read Creating a Subscription Preference Center.
A privacy policy and terms of service that you can link to in the legal disclaimer.
# Creating and using SMS Smart Opt-In links
NOTE
To view, create, and edit SMS Smart Opt-In links, use Iterable's template builder. This feature isn't available in the campaign builder.
# Step 1: Create a link
Go to Content > Templates and either create a new email or in-app template or edit an existing one.
When the template is open, click Edit Design.
Next, click SMS Opt-In in the bottom menu (available in any design mode).
Click Add SMS Opt-In Link.
-
Add the following link details:
- Name - A name for this link. For display in Iterable.
- Description (optional) - A description for this link. For display in Iterable.
- Brand Name - Name of the company the user is subscribing to. Iterable includes this name in the pre-filled opt-in text message and recommended legal disclaimer.
- SMS Message Type - The opt-in or double opt-in message type that this link subscribes users to. (If this drop-down is empty, make sure you have an SMS message type with an opt-in or double opt-in subscription policy.)
- Send Reply To - The SMS sender that the user's SMS message gets sent to. This is your messaging service or profile that often has a pool of phone numbers to select from. To learn how Iterable assigns a reply-to number for each specific user, read How SMS Smart Opt-In selects a number for the user to reply to.
- SMS Disclaimer Terms of Service Link (optional) - An HTTPS link that directs to your SMS Terms of Service. Iterable uses this in the recommended legal disclaimer.
- SMS Disclaimer Privacy Policy Link (optional) - An HTTPS link that directs to your SMS Privacy Policy. Iterable uses this in the recommended legal disclaimer.
- Redirect Link - A link that users are redirected to when they click on the link from a device that isn't a mobile phone (such as a laptop). A web form that accepts SMS opt-ins is a sensible use case for this link. To learn more about setting up a custom preference center, read Creating a Subscription Preference Center.
You can see a preview of the prefilled text and the response your user receives at the bottom of this screen.
Click Create Link to finish. Don't worry, you can always come back and edit the link later!
# Step 2: Add the link to your template
Starting from the template you're working on, click SMS Opt-In in the bottom menu. (Note: This option isn't available from the campaign builder.)
Find the link you want to use and click on its name to view details.
-
Click Copy for the Handlebars expression, then close the opt-in link menu.
-
Add the Smart Opt-In Handlebars expression to a button or link in your design.
If you're using the Drag and Drop editor:
- To add a Button, select Open web page for the link type and paste the link's Handlebars expression into the URL field.
- To use the Insert Link tool, select the URL link type and paste the link's Handlebars expression into the URL field.
# Step 3: Add a disclaimer
You can use Iterable's recommended SMS disclaimer, or you can add your own company's language.
To use Iterable's recommended SMS disclaimer:
- Starting from the template you're working on, click SMS Opt-In in the bottom menu.
- Find the link you just used, then find the disclaimer below it. Click Copy.
- Close the opt-in link menu and add the disclaimer text to your template design.
- Click Save Design.
# Next steps
Now that you've prepared your template to gather SMS subscribers using the SMS Smart Opt-In link, here are some additional things you can do to enhance your SMS marketing program.
# Find your SMS audience
To make a list of all users who have signed up using your SMS Smart Opt-In link, use segmentation to create a dynamic list of users who have the contact property Is Eligible to Receive Message Types equal to the message type associated with the SMS Smart Opt-In link.
# Confirm new SMS subscriptions
To let your users know when they've subscribed successfully, create a journey for new subscribers that sends them an SMS campaign with a confirmation message.
# Appendix: SMS Smart Opt-In reference
# Handlebars expression
Each link that you create has a unique Handlebars expression that creates a dynamic link for each user.
Here's an example of Iterable's SMS Smart Opt-In link as a Handlebars
expression: {{smartOptInUrl 4}}
NOTES
You don't need to use the
{{#urlEncode}}
Handlebars helperwhen you use the Handlebars expression for the SMS Smart Opt-In link. -
Iterable previously provided a version of this URL that was much longer. You can continue using this version of the URL, or you can update your templates to use the newer, simplified version.
Previous version:
https://links.iterable.com/smartOptIn/click?_p=some-string&_i=00&_r={{#urlEncode}}{{#base64}}{{itblUserId}}{{/base64}}{{/urlEncode}}&_t={{templateId}}
# Dynamic link format
When you send a campaign that includes the SMS Opt-In Handlebars expression, Iterable dynamically creates a personalized link for each user.
Typically, a user doesn't see this URL because they're redirected to their messaging app (if they're on a smartphone) or to the redirect URL you provided.
Here is an example of what that link looks like when it is personalized for a
user:
https://links.iterable.com/soi/ec/1ae5c581be8e433b85be321a00000vv/4/ 7HuLXzjm1zS000EJ8Bp9umWqSh2FxEK5UnM7k_Fy_10YNBOjx5gYObYcrQtc0oSShec5Htkh7i75ndu2 eqQJ8Xsl3lwutm8pyjM00000TdNLi3uNdAjPHMeiyuP12IZpKVB0YJBMylECLcUhTWvnHw==
You won't be able to see the link rendered in Preview mode, but you can see the full link when you send a proof.
# Pre-filled opt-in text
When the SMS Smart Opt-In link redirects a user to their messaging app, the app opens a new message. The message includes the phone number for your SMS sender, and a pre-filled, personalized opt-in message body.
Here is the pre-generated text for an example brand, Fake Flights:
Send in this text to opt in to receiving recurring automated personalized marketing alerts from Fake Flights (itbl: gY3-4)"
This text includes a dynamic code (itbl: gY3-4
) that identifies the existing
user in Iterable and the SMS message type that they're subscribing to.
To customize this text, enter your brand name in the SMS Smart Opt-In link details. Only the brand name is adjustable — the rest of the message can't be changed.
# Recommended disclaimer text
Here is an example of the pre-generated SMS disclaimer for Fake Flights:
By signing up via text, you agree to receive recurring automated promotional and personalized marketing text messages (e.g. Marketing message) from Fake Flights at the phone number used when signing up. Consent is not a condition of any purchase. Reply HELP for help and STOP to cancel. Msg frequency varies. Msg and data rates may apply. View Terms of Service or Privacy Policy.
The recommended disclaimer is provided in rich text. "Terms of Service" and "Privacy Policy" are links to URLs you provide when creating the opt-in link.
Iterable recommends including this disclaimer, or similar text, to make sure your opt-in process meets any legal requirements your organization may have to follow.
# Tracked events
When you use SMS Smart Opt-In, Iterable tracks the following system events in each user's history:
- Send
- Open
- SMS received
- Subscribe
Note: Iterable doesn't track click events for the SMS Smart Opt-In link.
Continue reading this section for details and example JSON fields for each event.
# Email send or in-app send
When you send a campaign to users with the SMS Smart Opt-In link and call-to-action to subscribe to SMS, Iterable tracks a send event.
Example email send event on the user profile:
{ "campaign": { "campaignAlertsEnabled": false, "campaignState": "Running", "createdAt": 1698365588959, "createdByUserId": "iterable-user@example.com", "dataScienceOptimizations": [], "id": 9999999, "ignoreFrequencyCap": false, "isArchived": false, "isDryRun": false, "labelIds": [], "messageMedium": "Email", "mobileAppIds": [], "name": "Email campaign with SMS Smart Opt-In Email link", "projectId": 99999, "teamId": 99999, "templateId": 99999999, "updatedAt": 1698768747195, "updatedByUserId": "iterable-user@example.com", "useCustomRateLimit": false, "wasEverRecurring": false }, "campaignId": 9999999, "catalogCollectionCount": 0, "catalogLookupCount": 0, "channelId": 99999, "contentId": 99999999, "createdAt": "2023-11-16T17:36:26.000Z", "email": "user@example.org", "esDocumentId": "6a60e7effe2000008f2edb7d5857aa5b", "espName": "SES", "eventType": "emailSend", "itblInternal": { "documentCreatedAt": "2023-11-16 17:36:26 +00:00", "documentUpdatedAt": "2023-11-16 17:36:26 +00:00" }, "itblUserId": "e54ac628-29d4-0000-877a-57d795e2h28de", "messageBusId": "0100018bd9349dae-0c73ebb8-0000-4a66-0000-ecc265622414-000000", "messageId": "6a60e7effe2e00000f2edb7d5875bb3a", "messageTypeId": 999999, "productRecommendationCount": 0, "templateId": 99999999, "transactionalData": "{}" }
# Email open or in-app open
When a user opens the campaign message, Iterable tracks an open event.
(Note: Iterable doesn't track a click event for clicks made on the SMS Smart Opt-In link.)
Example email open event on the user profile:
{ "campaign": { "campaignAlertsEnabled": false, "campaignState": "Running", "createdAt": 1698365588959, "createdByUserId": "iterable-user@example.com", "dataScienceOptimizations": [], "id": 9999999, "ignoreFrequencyCap": false, "isArchived": false, "isDryRun": false, "labelIds": [], "messageMedium": "Email", "mobileAppIds": [], "name": "Email campaign with SMS Smart Opt-In Email link", "projectId": 99999, "teamId": 99999, "templateId": 99999999, "updatedAt": 1698768747195, "updatedByUserId": "iterable-user@example.com", "useCustomRateLimit": false, "wasEverRecurring": false }, "campaignId": 999999, "contentId": 99999999, "createdAt": "2023-11-16T17:40:33.000Z", "email": "", "eventType": "emailOpen", "ip": "198.51.100.11", "itblInternal": { "documentCreatedAt": "2023-11-16 17:40:33 +00:00", "documentUpdatedAt": "2023-11-16 17:40:33 +00:00" }, "itblUserId": "e54ac628-0000-4a2b-0000-57d795e1d16e", "messageId": "6a60e7effe2e00000f2edb7d5875bb3a", "proxySource": "Gmail", "templateId": 99999999, "userAgent": "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)", "userAgentDevice": "Gmail" }
# SMS received
When the user sends the pre-filled SMS opt-in message to you, Iterable tracks a SMS received event.
Example SMS received event on the user profile:
{ "billingParty": "FirstParty", "createdAt": "2023-11-16T17:40:48.000Z", "email": "", "espName": "Telnyx", "eventType": "smsReceived", "fromPhoneNumber": "+14155550132", "itblInternal": { "documentCreatedAt": "2023-11-16 17:40:49 +00:00", "documentUpdatedAt": "2023-11-16 17:40:49 +00:00" }, "itblUserId": "e54ac628-0000-4a2b-0000-57d795e1d16e", "mmsReceiveCount": 0, "smsMessage": "send in this text to opt in to receiving recurring automated personalized marketing alerts from fake flights (itbl: gy3-4)", "smsReceiveCount": 1, "toPhoneNumber": "+14155550132" }
# Subscribe
When Iterable receives an SMS that includes the pre-filled text and its unique code, Iterable automatically subscribes the user to the SMS message type associated with the SMS Smart Opt-In link.
SMS replies that don't include the unique code cannot be attributed to a user. If this happens, no subscribe event occurs.
Example subscribe event on the user profile:
{ "channelIds": [], "createdAt": "2023-11-16T17:40:48.000Z", "email": "", "eventType": "emailSubscribe", "itblInternal": { "documentCreatedAt": "2023-11-16 17:40:49 +00:00", "documentUpdatedAt": "2023-11-16 17:40:49 +00:00" }, "itblUserId": "e54ac628-0000-4a2b-0000-57d795e1d16e", "messageTypeIds": [ 999999 ], "profileUpdatedAt": "2023-11-16 17:40:48 +00:00", "signupSource": "Unknown", "templateId": 99999999, "userListIds": [] }
Notes on subscribe event fields:
-
eventType
is set toemailSubscribe
. Iterable uses this value for all subscribe events regardless of channel, not just for email. -
signupSource
is set toUnknown
. When on the user profile, this field indicates the original source when a brand new user subscribes. SMS Smart Opt-In only works for existing users in Iterable. Existing user profiles aren't updated to reflect this value.
# Want to learn more?
For more information about some of the topics in this article, check out these resources. Iterable Academy is open to everyone — you don't need to be an Iterable customer!
Iterable Academy
Support docs