Consent-based open tracking lets you include Iterable's email open-tracking
pixel only for recipients who have agreed to it. When you turn on
Use consent-based open tracking for a project, Iterable checks the
emailTrackingPixelConsent field on the user profile when it renders a
marketing email, and adds the tracking pixel only when that field is true.
This control is off by default. Until you turn it on, Iterable doesn't evaluate
emailTrackingPixelConsent, and pixel behavior follows the project's existing
open-tracking setting.
Iterable doesn't collect tracking-pixel consent from recipients, and it doesn't backfill existing profiles. You collect consent in your own systems, then write the boolean to Iterable.
To learn how Iterable records an emailOpen event, and for project-wide open
tracking, see Email Open Tracking.
# In this article
# Turn on consent-based open tracking
To change this setting, you need the Manage Settings permission.
- Go to Settings > Project Settings.
- In the Email section, turn on Use consent-based open tracking.
- Click Save.
IMPORTANT
Turn this setting on only after you've stored consent values on user profiles.
If you enable it first, marketing emails omit the tracking pixel for every user
whose emailTrackingPixelConsent field is false or missing. Your organization
is responsible for collecting and updating users' consent for email tracking
pixels in your own systems.
If your Customer Success Manager (CSM) previously disabled open tracking for all users in this project, turning on Use consent-based open tracking overrides that restriction. Iterable then tracks opens for users who have consented, and continues to omit the pixel for users who haven't consented or who are missing the consent field.
# Set emailTrackingPixelConsent
emailTrackingPixelConsent is a system-defined boolean on the user profile.
Use this field rather than a custom field with a similar name. Iterable treats
only an exact boolean true as consent. The string "true" is not consent.
| Value | Marketing email | Transactional email |
|---|---|---|
true | Tracking pixel added | Tracking pixel added |
false | Tracking pixel omitted | Tracking pixel added |
Missing or not a boolean true
| Tracking pixel omitted | Tracking pixel added |
Iterable doesn't check emailTrackingPixelConsent for transactional emails, so
those sends always include the tracking pixel. Iterable classifies a send as
marketing or transactional by the message channel,
not by campaign name or template. If you send marketing content on a
transactional channel, Iterable includes the tracking pixel regardless of the
user's consent value. Applicable regulations may still require consent for that
send. Your organization is responsible for making sure the channel
classification in Iterable matches the regulatory treatment of your messages.
# Consent metadata
Iterable stores metadata for this field in
itblInternal.emailTrackingPixelConsentMetadata. That object includes a
timestamp (changedAt) and the update source (updatedVia). Iterable generates
these values. Don't send this object in user update requests.
This metadata isn't shown in the Iterable UI. You can retrieve it with
GET /api/users/{email}
or GET /api/users/byUserId/{userId}.
The metadata records only the latest consent change. It isn't a versioned
history of every consent event. changedAt is set when the consent value is
first written, and it updates only when that value actually changes. Writing
the same value again doesn't change the timestamp. If you need to show consent
as of a specific date, such as when a particular email was sent, keep a
timestamped consent log in your own systems.
# Update consent on user profiles
Write the boolean to Iterable with any of these profile-update paths:
POST /api/users/updatePOST /api/users/bulkUpdate- CSV or other profile imports
- A User Profile tile in a Journey
To withdraw consent, set the field to false. Blank values in a CSV import
don't change the stored value.
NOTE
You can use a Journey to set emailTrackingPixelConsent from profile
attributes or from a link click. See
Manage tracking-pixel consent with user profile fields
and
Capture tracking-pixel consent from a link click.
Iterable doesn't provide a built-in tracking opt-out link, but you can add a
link to capture and update tracking-pixel consent.
Tracking-pixel consent is separate from consent to receive marketing email.
Channels, message types, and preference centers don't set
emailTrackingPixelConsent. A subscription preference center
manages consent to receive messages. It doesn't record tracking-pixel consent.
# Manage tracking-pixel consent with user profile fields
Use a Journey to set emailTrackingPixelConsent for users who match profile
attributes in your consent policy, such as country, locale, account type, or
lifecycle state.
- Build a dynamic list from a segmentation rule.
- Use that list as the audience for a scheduled Journey.
- Update
emailTrackingPixelConsentwith a User Profile tile. - Run the Journey again only when consent needs to be recalculated.
Write false for users in a market, region, or profile state where your policy
disables tracking. Write true only when you have an affirmative consent
signal, such as a form submission or a trusted value from your source system.
You can use this same Journey pattern for either value. Leaving a profile
audience, such as a France or fr_FR segment, doesn't grant consent.
When more than one rule can apply, decide which one takes precedence. For
example, your policy might let an explicit opt-out override a profile rule
and require an explicit opt-in before you write true. Work with your
compliance and privacy teams to set these rules.
# Disable tracking for a country or locale
This example sets emailTrackingPixelConsent to false for users whose
country is France or whose locale is fr_FR.
In Segmentation, save a
dynamic list that matches users where country equals France or locale
equals fr_FR. Name the list for the rule, such as
Pixel consent - France or fr_FR - disable. Dynamic lists refresh from their
segmentation criteria, so membership changes as profiles change.
NOTE
When you segment on emailTrackingPixelConsent, the comparators are Equals
and Does Not Equal. You can't check whether the field is set.
Does Not Equal false returns users whose value is true. It doesn't
return users who are missing the field. To leave out users who already have
consent, exclude users where emailTrackingPixelConsent equals true.
Use that exclusion when your policy keeps an existing opt-in. If this rule
should set false even for users who currently consent, leave those users in
the list.
Create a Journey and set the Start tile entry source to Schedule.
- Under Add to Journey, select the dynamic list.
- Use a one-time schedule to set consent from current profiles. Use a recurring schedule to re-evaluate the rule as profiles change.
- Under Exclude from Journey, add any audiences your policy keeps out of this update, such as users with a verified opt-in.
- Set Maximum entries to 1 for a one-time update. For a recurring Journey, choose a limit that matches how often consent should be recalculated. Unlimited lets a user enter again each time they qualify.
Add a User Profile tile and connect it to the Start tile. Select Use the data below and enter:
{ "emailTrackingPixelConsent": false }
Use the boolean false or true. The strings "false" and "true" aren't
valid consent values.
End the Journey after the profile update. If a later tile reads
emailTrackingPixelConsent, add a short
delay after the
User Profile tile so the update can finish first.
# Update the audience once or on a schedule
Use a one-time schedule when you want to set consent from the profiles you have
now, such as the first time you apply a France or fr_FR rule. Set
Maximum entries to 1.
Use a recurring schedule when profiles should be rechecked. A scheduled Journey
adds users who are on the list when the schedule runs. A user who later leaves
the list hasn't granted consent. Write true from a separate, explicit consent
update.
| Rule | Example | Typical update |
|---|---|---|
| Country or locale |
country equals France, or locale equals fr_FR
| Set emailTrackingPixelConsent to false when policy requires no tracking |
| Region |
region equals a region where your policy disables tracking | Set to false
|
| Account state |
accountStatus equals inactive
| Set to false when inactive profiles are non-consented |
| Source system | A source field equals an opted-out value | Set to false
|
| Explicit consent | A consent event or trusted source value indicates opt-in | Set to true
|
Before you publish, preview the dynamic list. Test users who match each part of the rule, users who match none of it, and a user who already has the value you're writing. After the Journey runs, confirm the profile value. Later marketing emails use the value stored when Iterable renders each message. See Review sends after consent changes.
# Capture tracking-pixel consent from a link click
Iterable doesn't include a tracking opt-out link in your email template. Add
your own link. When a recipient clicks it, Iterable records an email click that
includes the URL. A Journey can use that click to set
emailTrackingPixelConsent.
Use a click-triggered Journey when the link is in one campaign and you want the profile updated soon after the click. Use a dynamic list and a scheduled Journey when you want the update to run in a batch, or when the link is in more than one campaign.
The steps below withdraw consent by writing false. Don't write true from a
link click alone. Automated security scanners can click links in an email
without any action from the recipient, so a click isn't an affirmative consent
signal. To record consent, send recipients to a page where they confirm their
choice, such as a form, and write true from that confirmation.
# Update consent from a click in one campaign
- Create a Journey. On the Start tile, set the entry source to Event occurs > Email click. See Start Tile.
- Select the campaign that contains the link.
- Match the consent URL.
- For one URL, filter the click on the Start tile. The URL conditions there are Equals and Starts With. Use Equals for an exact URL, or Starts With when the URL includes a query string that can vary. Connect Start directly to the User Profile tile.
- For more than one URL, add a Yes/No Split after Start. Is One Of is available on the Yes/No Split. Set Filter by to This journey's triggering event, set the event to Email click, and match the URL with Equals, Starts With, or Is One Of. Email click events include the clicked URL. See System Webhooks. Connect the Yes branch to the User Profile tile, and leave the No branch unconnected so those users exit without a profile change.
- Set Maximum entries to 1 if each user should update consent from this link once. Set it to Unlimited if a later click should update consent again.
Add a User Profile tile, select Use the data below, and enter:
{ "emailTrackingPixelConsent": false }
Set the field to boolean false. Don't clear the field to withdraw consent.
Iterable omits the pixel from marketing emails when the field is missing, but
false records an explicit withdrawal on the profile.
End the Journey after the profile update. Add a short delay after the User Profile tile only if a later tile needs to read the updated field.
# Update consent from clicks across campaigns
- Create a dynamic list that requires an email click, and match the clicked URL with Equals or Starts With. Use Is One Of to match more than one exact URL.
- Set the Start tile to Schedule, and under Add to Journey select the dynamic list. A scheduled Journey adds the list's members each time the schedule runs. See Start Tile.
- Choose a cadence, such as once a day.
- Set Maximum entries to 1 if each user should take this path once, or Unlimited if a later click should update consent again.
- Use the same User Profile tile update as the single-campaign Journey.
If you filter the list on emailTrackingPixelConsent, use Equals true
for a link that withdraws consent. That matches users whose stored consent will
change. Does Not Equal false returns those same users and leaves out
profiles that are missing the field. Users who are missing the field already
have the pixel omitted on later marketing emails.
Between the user's click and the next scheduled run, the profile still has the
previous consent value. If that value is true, Iterable includes the tracking
pixel on marketing emails rendered during this window. The pixel is omitted
after the Journey writes false.
Test with the URL you'll use in production, a repeated click, a profile that's
missing the field, and profiles that already have true and false.
# Review sends after consent changes
Iterable decides whether to include the pixel when it renders the email. Later changes don't rewrite messages that were already sent.
- Future marketing emails use the current field value and project setting.
- Previously sent emails keep the HTML that was rendered at send time. If a
pixel was included, it can still record an
emailOpenwhen the image loads. - Click tracking isn't affected. Open tracking and click tracking use separate mechanisms.
If you use Stored Messages
to store email send payloads, you can review the stored HTML to see whether a
send included the tracking pixel. System webhook emailSend payloads can also
include pixelInjectionOutcome (InjectTracking or Omit) and
pixelInjectionReason. These fields describe whether Iterable included the
pixel at send time. They don't include the recipient's consent value. See
System Webhooks.
If you turn the setting on during an active campaign, or only some recipients consent to the tracking pixel, campaign reporting can include both tracked and untracked messages.
Marketing emails sent without the pixel don't produce emailOpen events, so
open counts decrease for those sends. A missing emailOpen doesn't always mean
the recipient didn't open the message. The pixel might not have been included.
Metrics that include assumed opens
can still count a click as an open. For the metrics and Iterable features that
use open data, see Email Open Tracking.