Campaigns in Customer.io
Campaigns in Customer.io are workflows of multiple messages which adapt to and send in response to user or data behaviour.
Creating a Campaign
The first step in creating a campaign is giving it a name, description, and adding any appropriate tags. Once you’ve done that, you must choose a trigger type. This is what defines the foundations of your campaign.


Trigger Types
When you create a campaign, we ask you What triggers this campaign? Your answer determines how, and when, people trigger your campaign.
Campaigns can have two different subjects: people and data.
A People campaign is a traditional messaging campaign: you trigger the campaign when a person meets certain criteria; they receive messages, attribute updates, etc.
A Data campaign is based on data from an external source, letting you transform that data, associate it with people—like Zapier or Segment but entirely within Customer.io. Because data, not people, is the subject of your campaign, data campaigns don’t typically send messages directly. Rather, they let you associate data with people—which can trigger subsequent campaigns.


People campaign triggers
They meet conditions lets you specify one or more segments that people are in or not in to trigger a campaign. Because segments have conditions determining who is in the segment, we call this a conditional trigger campaign. If you use this option, people enter your campaign as soon as they match the condition(s) defined by your segment. This option is best for things like recurring NPS surveys, onboarding drip campaigns, or inactivity reminders.
A particular date triggers a campaign on a specific or relative date based on an attribute in a person’s profile. Date triggered campaigns are useful for recurring cases such as birthdays, anniversaries, and subscription renewals.
They perform an event indicates an event triggered campaign. This kind of campaign helps you respond to a person’s activity in your app or website. They’re helpful for providing receipts, confirmations, etc.
They fill out a form indicates a Form triggered campaign. This kind of campaign lets you take advantage of form responses to trigger campaigns. You can connect a form to your workspace or have a Facebook Lead Ad integration. Use this type of campaign to send messages to new leads and try to convert them to customers or users.
Condition Trigger
Selecting the They meet conditions option indicates a condition-based trigger. We’ll prompt you to choose one or more segments that your audience is in or not in. If you haven’t created a segment yet, you can click Create a new data-driven segment to set conditions for a new segment.


You can set multiple segments using and or or conditions. Using and means that people need to match all the segments before they enter the campaign; Using or means that a person can be a member of any one segment to trigger your campaign.
You can use JSON dot notation in condition logic
If you store attributes or event data in JSON objects or arrays, you can use JSON dot notation in your branch conditions to evaluate these properties. Use array[]
to represent any item in an array or array[0]
to represent the first item in the array. See Storing and using JSON for more information about dot notation in Customer.io.
Frequency
By default, people will enter condition-triggered campaigns once. If your campaign does not use a Filter, you can let customers enter your campaign multiple times with the Frequency setting.
When you enable the Frequency setting, you use one of these options to determine how often a person can re-enter your campaign:
Changing frequency
Re-match to off: After the change, people will only enter the campaign once. Anyone who might have re-entered in the future will no longer do so.
Re-match to fixed interval: Only new people who match your settings will restart. This does not apply to people who have already been through the campaign.
Fixed interval to off: Any people who are scheduled to re-enter this campaign will not do so, but those who are already in the campaign will continue their journey.
Interval to re-match: People who are scheduled to re-start your campaign will not do so. They will need to stop matching the trigger conditions and re-match them to enter again. Those who are already in the campaign will continue their journey.
Date Trigger
When setting up a campaign that’s triggered by a particular date, there are four things you need to choose. Once you’ve picked an attribute, a preview panel will be shown that lets you test your choices with people from your workspace.
#1: How often the campaign should recur There are three options for recurrence frequency:
Only once, on this date
: This option looks at the entire date, including month, day, and year to determine when the campaign should be triggered. This date must be in the future in order for the campaign to be triggered.Every month
: This option triggers the campaign once per month on the day of the month specified by the date attribute. The month and year are ignored. For example, if the date attribute is June 5th, 1977, the campaign will trigger every month on the 5th. If the current month doesn’t include that day (e.g. there is no September 31st) then Customer.io will send on the last day of the month.Every year
: This option triggers the campaign once per year on the month and day specified by the date attribute. The year is ignored. For example, if the date attribute is June 5th, 1977, the campaign will trigger once per year on June 5th.
#2: Whether the campaign should trigger on the date, or at an offset before or after
on
: Trigger the campaign on the recurrence datebefore
: Numbers of days prior to the recurrence date to trigger the campaignafter
: number of days after the reccurence date to trigger the campaign
#3: The attribute used to determine when to trigger the campaign
Customer.io will schedule the campaign based on the date value in this attribute. The attribute must contain a date in either Unix timestamp or ISO 8601 format. If the format isn’t recognized or the attribute isn’t present for a person, then they will never trigger the campaign.
Attributes updated on the same day as the campaign
When you set the Person’s attribute value on the same day specified as the trigger, if it is set before the specified trigger time for the campaign, it will fire on that same day since the date in the attribute match the criteria and the trigger time has not passed yet.
Let’s say today is July 1st, 2020 and you update a Person’s value for the trigger attribute to July 1st. If the time specifed in the trigger condition has already passed, the Person will not trigger this campaign today. For the campaign to be triggered, the attribute value must be set before the specified trigger time for the campaign. For example, if the campaign is supposed to trigger at 1pm on the date, then the campaign will not trigger if the attribute is updated at 2pm on the same date.
#4: Time of day the campaign should trigger
Finally, you need to choose the time on the recurrence date that the campaign should trigger. The time stored in the date attribute will not be used to determine when the campaign is triggered.
If you’re storing the timezone
attribute for your customers, then you can select the user's time zone
rather than choosing a single time zone to use when triggering the campaign.
Event Trigger
From the dropdown, choose the event that you want to use to trigger your campaign. The preview will show any recent occurrences of the event.
You can use JSON dot notation in condition logic
If you store attributes or event data in JSON objects or arrays, you can use JSON dot notation in your branch conditions to evaluate these properties. Use array[]
to represent any item in an array or array[0]
to represent the first item in the array. See Storing and using JSON for more information about dot notation in Customer.io.
Event filters
If you have a particular event attribute you want to use as a filter (e.g., if you only want to target people who bought a specific product), click and add your attribute filter either by clicking on “Add as filter” next to the desired attribute in the event preview, or by adding it manually:


Need to match more than one event attribute value? Set the event attribute to match: “attribute contains/ does not contain value1|value2, like so:


Event-triggered Frequency
By default, these campaigns will send each time the event is received. We do, however, ask if you want to set a limit here:


Choosing yes means that you can limit how many times people can move through campaigns. If you do so, you will have two options:
- Once ever: people will only receive the campaign the first time they perform the event. For example, if you’d like to congratulate someone the first time they complete a lesson in your eLearning app, you can use this setting. This way, you’ll ensure they don’t receive the email again once they’re a seasoned student and flying through lessons regularly.


- At most once within a given time period: people will only receive the campaign once within a time period of your choosing. For example, you want to send an email to someone when they receive notifications in your app. You only want them to receive the email once a day, regardless of how many application notifications they receive. Setting Frequency to “at most once within 24 hours” will ensure that, no matter how many new notifications people get, they will only get an email once.


Data campaign triggers
When you set up a campaign and select the Data arrives via webhook option, you’ll get a webhook URL. You’ll provide this URL to the service that you want to collect data from.


This campaign runs whenever this URL is called. The data from your external service can take any shape. You’ll manipulate the data and associate it people as a part of your campaign. This lets you perform Zapier-like transformations on your data without having to build an integration.
Right now, you can’t filter or otherwise limit data campaign triggers within Customer.io. You’ll have to make sure that your external service is set up to call your data campaign’s webhook URL with a relatively uniform data set and only when you want it to call the URL.
Because data campaigns aren’t associated with people—at least not directly—they don’t have many of the options that you’ll see in people campaigns. They have a much more streamlined workflow: data comes in, you convert it to the format you want, and the campaign ends. You won’t set a Conversion goal, Frequency, etc.
Filters
While triggers decide when your people campaign begins, filters determine whether or not the person who triggered the campaign should actually enter the campaign. For example, you might want to send a message when someone views the pricing page (trigger), but want to make sure you only message the ones who don’t already have a paying plan (filter).
Filters are evaluated right before sending any message, working as a confirmation step to make sure the right people stay in your campaign workflow. You can read up here on the differences between the two.
You cannot set a Frequency limit on campaigns that include filters.
Note for event triggered campaigns
To enter your campaign, people must match both the event attribute filter and any segment filters within 30 minutes after the event occurred. When a triggering event is sent to us but it doesn’t trigger the event-triggered campaign, it will retry for approximately 30 minutes, giving the person a chance to match the filter criteria and enter the campaign within that time. This buffer allows for a very common situation where, due to internet latency or other such delays, we get the event before we get other qualifying data.
Workflows
The workflow is where you create the messaging experience or journey of the people that the campaign is sent to. For data campaigns, the workflow is where you’ll manipulate your incoming data and associate it with people or forward it to external services.
Here, you can add a variety of items—messages, webhooks, attribute updates, or time delays. Use these to set up your campaign. Each item has its own settings, such as:
- Sending behaviour— whether or not the message sends automatically, queues a draft, or doesn’t send at all
- Send to unsubscribed/tracking for that individual workflow item (more on that below)
- The option to turn the message into an A/B test. We have documented how to create a conclusive A/B test result, as well as how to understand A/B test results.
Customer data
When people enter your campaign, you can use data associated with them in Customer.io dynamically with liquidA syntax that supports variables, letting you personalize messages for your audience. For example, if you want to reference a person’s first name, you might use the variable {{customer.first_name}}
.. You can reference people data in the format:
{{customer.data}}
For example, if you’re sending us a customer’s name using the attribute full_name, you can utilize it like this:
Hi, {{customer.full_name}}
!
You can also perform more complex operations using the data you send; we have more comprehensive information here.
Event attributes
A few things to remember when using event attributes
- They can be used in message content
You can use all of the data you send with an event in your messages. For example, if you send us a purchase event with the following data:
{"name":"purchase","data":{"price": "9.99", "product": "socks", "color":"blue"}}
You can send a receipt email (or push notification, or SMS, or any other action) with the product’s name, price, and color in it. Whatever you send in the event attributes is available to you; you can learn more about using event data here. - They can override certain email headers
If you send any of these attributes as part of your event, they will override your campaign settings:
from_address
,recipient
,reply_to
For example: If a purchase event triggers an email to send, but that purchase event contains recipient = wile.e.coyote@example.com as an attribute, then all emails triggered by that campaign will go to wile.e.coyote@example.com, no matter the settings in the campaign itself. They can include attachmentsDeprecated. Use the Transactional API to send emails with attachments. Here’s an example using a calendar .ics file.
Journeys
At Customer.io, we use Journeys to show the movement of people through a campaign. For each person, you can find these in the Journeys tab:


For each trigger type, they work a little differently:
Condition-triggered campaigns start a journey as soon as the person matches the campaign’s trigger conditions.
For event-triggered campaigns, a journey starts when we receive an event that matches the campaign’s trigger conditions. However:
- If the person does not meet the filter conditions when we receive the event, we will retry the event for up to 30 minutes.
- If the person still does not match the filter conditions after those 30 minutes, a journey will not be started for them and they will not enter the campaign. If the person does match the filter conditions within those 30 minutes they will enter the campaign and start a journey.
This happens to prevent race conditions that often happen when profile attribute values are updated very close to the time the event is sent. Retrying the event helps us ensure that the right people will enter your event triggered campaigns, even when various network conditions or integration issues cause us to receive API calls in an untimely manner.
Unsubscribes
Sending or not sending to unsubscribed people can be set for the entire campaign or individual messages within it. You will see the setting on the campaign level here:


Each individual message can override this:


Please keep in mind that sending to unsubscribes should only be used in transactional, important cases.
Goal & Exit
Conversion Goal
Conversion tracking lets you to track the success of messages and journeys based on whether or not a person performs an event, enters a segment, or exits a segment after they receive a message. If a person performs your goal criteria within a configurable time frame of a message in your campaign, the messageThe instance of a message sent to a person. When you set up a message, you determine an audience for your message. Each individual “send”—the version of a message sent to a single member of your audience—is a delivery. and journeyA person or data object’s path through your campaign. are marked converted. You can set goals to determine the success of your campaigns and messages, and follow conversion rates over time to try and improve your messaging strategies. See Conversion goals and exit criteria for more information about conversions.
We track conversions for the following message/delivery types:
Conversions attributed | Conversions not attributed |
---|---|
Slack Message | |
Twilio SMS | Create or update person action |
Customer.io Push Notifications | |
Webhooks1 |
Slack and Create or update person actions are often internal or used for analytics purposes, and don’t always send messages to end-users. For that reason, we don’t attach conversions to them. You can enable webhook conversions on individual webhook actions.
Exit Conditions
By default in Customer.io, people leave a campaign when they stop matching your trigger and filter conditions. However, you can override this behavior and determine the conditions that cause people to exit your campaign.
We evaluate exit conditions before people enter your campaign and before messages in your workflow. If someone meets the exit conditions, they’ll leave the campaign before they receive the next message in the campaign. If people already meet your exit criteria when they trigger the campaign, they’ll exit your campaign immediately, without going through any part of the campaign workflow!
If a person receives a message and then meets your exit criteria, they’ll continue through the campaign and any Create or Update Person, Create Event, or other actions until they reach the next message in the campaign.
For example, if your campaign notifies a person about items they left in their shopping cart, you probably don’t want to keep sending them reminders if they purchase the items in their cart. You can set people to exit the campaign if they’ve completed their purchase before the next follow-up message.


They perform the conversion action: When you set a conversion goal, this setting causes people to exit your campaign when they perform the conversion action (your audience performs an event, enters a segment, or leaves a segment)—even if they haven’t received a message from the campaign yet.
They no longer match the campaign trigger and filters: If a person stops matching the campaign criteria, they’ll exit the campaign before they reach the next message in the campaign workflow.
They perform the conversion action or they no longer match the campaign’s trigger and filters: If you set a conversion goal, a person exits the campaign if they either perform your conversion action or they stop matching the campaign’s trigger criteria—even if they haven’t received a message from the campaign yet.
People don’t exit, they move through the entire campaign: People won’t exit your campaign early. They’ll complete their entire journey, even after they meet your goal or stop matching your campaign’s trigger conditions during their journey.
Conversion goal timing does not affect exit criteria
If you set a conversion goal, you can use the conversion action as exit criteria. However, your exit criteria is independent of the conversion goal time frame. For example, if your conversion goal is to enter a segment, people who enter the campaign but already belong to the conversion segment will exit your campaign immediately—before they ever receive a message—and the journey won’t record a conversion.
Grace periods for exit conditions
For condition-triggered campaigns, if we notice that someone meets an an exit condition when we try to send someone a message, we pause their journey and allow time for them to stop meeting the exit condition. After that time period is up, if they no longer meet the exit condition, they will continue on in their journey through the workflow. This period of time is called a grace period which can vary in length. You can read more about grace periods here.
There is no grace periods for event-triggered campaigns.
Review
Once you’ve set up your campaign, the Review page will allow you to look over all of your settings once more before you get started. We’ll also surface any errors here.
In the case of a condition-triggered campaign, you’ll have the option to send to any existing matches. For other trigger types, this is not the case.
Forward-looking behaviour
Condition-triggered campaigns can be made retroactive, meaning that they allow people to be included even if they matched the trigger segments more than 24 hours before the campaign was created).
In other words, if you started a condition triggered campaign today, but want to include all the people who matched your trigger and filter conditions before the campaign was created, you can choose to do so on the Review page when you start the campaign:


We can’t force an event triggered campaign to send to people who performed the event in the past. You can create a segment triggered campaign based on your specific event, but you won’t be able to include any event attributes in your content.
Metrics & Reporting
Once a campaign is running, you can see the metrics on the overview page. From there, you can export them to a CSV.


The export will reflect the dropdowns selections for ‘Volume’. If you’ve selected ‘All emails’ for ‘last 30 days,’ for example, that’s what will be exported.
We also provide Email Webhooks to send email performance data from Customer.io to a URL you specify in order to receive information about events as they occur in real time. Customer.io sends the information as JSON in an HTTP POST. Read more about setup here.
You can also use Customer.io with Mixpanel or Kissmetrics.
Working with Campaigns
Stop a Campaign
To stop a Campaign, click into the individual Campaign and select “Stop” from the “Campaign Actions” dropdown menu near the top right corner of the page.
Once a Campaign is stopped,
- Users will no longer enter the Campaign.
- The Campaign workflow, triggers, goals, and exit conditions can still be edited.
If the Campaign has active Journeys in progress, you will have two options for how to handle People who are in the middle of their Journey through the Campaign’s Workflow:
- Force People to exit immediately, or
- Allow People to finish their Journey and exit the Campaign naturally. The Campaign will be in a “Stopping” state until all People have exited.
Restart a Campaign
To restart a Campaign, click into the individual Campaign and select “Restart” from the “Campaign Actions” dropdown menu near the top right corner of the page.


When restarting a Segment-triggered Campaign, there are two options for determining which people will enter the Campaign:
- Current People and future additions Choose this one if all People currently in the trigger conditions should enter. This includes any People currently in the trigger Segment, but will also take your Campaign frequency settings into account.
- Future additions only. Choose this option if only People who match your Campaign trigger conditions after the Campaign is restarted should enter.


Archive a Campaign
To archive a Campaign, click into the Campaign and select “Archive” from the “Campaign Actions” dropdown menu near the top right corner of the page.


Once a Campaign is archived,
- Users will no longer enter the Campaign.
- Any users currently in the Workflow will be forced out of the Campaign.
- Any unsent Drafts in the Campaign will be removed.
- A/B tests will automatically be paused.
- The Campaign Workflow, triggers, goals, and exit conditions will no longer be editable.
Emails from archived Campaigns will still appear in the Existing Emails section when adding new email content. Campaign Workflows from archived Campaigns will still be searchable and copy-able into new Campaigns. To remove archived content and prevent archived Workflows from being reused in the future, delete the Campaign instead.
Unarchive a Campaign
To unarchive a Campaign, click into the Campaign and select “Unarchive” from the “Campaign Actions” dropdown menu near the top right corner of the page.


When a Campaign is unarchived,
- The Campaign will move to the Active tab and be updated to “Stopped”.
- Any archived Segments used in the Campaign triggers, filters, goals, and exit conditions will be unarchived along with the Campaign.
Delete a Campaign
To delete a Campaign, click into the individual Campaign and select “Delete” from the “Campaign Actions” dropdown menu near the top right corner of the page.


When deleting a Campaign, all message content, settings, and report data will be removed.
Deleting a Campaign is a permanent action
Deleting a Campaign cannot be undone. Make sure to save any important data or content before deleting a Campaign.