Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 114 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

Getting started

STARTER GUIDES & TUTORIALS

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Features

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

OTHER

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Introduction

This Getting started section is designed to help you take your first steps with Batch. Whether you are setting up your first campaign or exploring automation features, you will find everything you need here to get started and understand how the platform works.

Batch platform centralizes all your customer engagement needs in a single tool. It allows you to send Emails, SMS, Push Notifications, and In-App Messages and offers features to manage every stage of your campaigns and automations.

Batch's Dashboard is divided into five main tabs

  1. Analytics: view insights into your channels' performances with detailed reports.

  2. Profiles: explore your userbase, create segments and audiences, access custom data, and view detailed user profiles.

  3. Campaigns: create one-shot Email, SMS, or Push campaigns, from targeting to message composition and orchestration.

  4. Automations: set up automated recurring or trigger Email, SMS, Push, or In-App messages based on user behavior and predefined conditions.

  5. Settings: define global settings for your channels and manage marketing pressure by adjusting sending frequency with labels and capping.

Ready to create your first communications? Let’s get started! 🚀

Cover

Create your first one-shot campaign

Cover

Create your first recurring automation

Cover

Create your first trigger automation

Cover

Create your first Email Message

Cover

Create your first SMS message

Cover

Create your first Push Message

Cover

Create your first In-App Message

How to add a member to your team?

You can invite members of your team and grant them different permissions depending on their role in your company.

Batch allows users with the "Administrate" permission to to their team. This enables your tech, marketing and editorial teams to work together on the same interface with different accesses to Batch's features.

Make sure you are the admin of the account to add new team members or choose the apps they can access.

Data

Orchestration

Customer Engagement Platform

Analytics

Mobile Engagement Platform

Analytics

Inviting new members

First, open your account's menu located on the top right corner of the dashboard (in Batch Customer Engagement Platform) or the bottom left corner (in Batch Mobile Engagement Platform).

Click 'Manage team', then click 'Invite user':

To reinforce access control to our product, the Dashboard forces administrators to use multi-factor authentication (MFA) to perform certain sensitive operations. If your company is not set up with an MFA method, the modal will simply ask for password authentication.

Then, pick the right permissions for the new team member and select the apps they will be able to see the dashboard:

There are several permissions you can grant or revoke:

  • Administrate: Grants full access to company account (team members, users permissions, etc). Note: an account can have more than one Administrator.

  • Review: Grants read-only access to the dashboard. Review users will not be able to create or edit campaigns.

  • App: Grants users' rights to create, edit, and archive apps.

  • Campaign: Grants users rights to create, edit and delete campaigns.

  • Privacy: Grants users' rights to manage GDPR settings.

If one of your teammates already has a Batch account registered with his email address, contact our support team (support@batch.com) with the following information:

  • Email address of his first account.

  • Email address of the team he wants to join.

We will add them to your team with all the apps created with the previous account.

Managing Existing Users

Adding/removing existing users

You can resend invites, delete and manage existing users from the Account Manager too:

Setting app-level permissions

To facilitate collaborative work, a user with 'Administrate' rights can also grant another user access to a group of selected apps. This is handy to ensure specific users cannot access certain apps on the dashboard or if you have multiple projects with separate teams working on each one.

Setting a country/language restriction

In addition to app-level permissions, you can restrict the rights of existing users to make sure they can only create push campaigns or In-App automations for users living in specific countries.

This is useful to avoid targeting mistakes if an international team is working on the same app on Batch dashboard (e.g. editors sending a notification to all your users by forgetting to target a specific country). Here is what the campaign editor looks like for a user who can only send notifications to Canada, in French or English:

On Batch dashboard, users with a country/language restriction (e.g. Canada + English/French) will exclusively see in their campaign list:

  • Campaigns matching their country/language restriction (e.g. Canada + English/French)

  • Campaigns that don't include any country/language targeting (e.g. templates).

Your Batch Customer Success Manager will be here to help and set up these restrictions for you!

add new people

Search Profiles

Profile information

You can access the profile view using:

  • Custom ID

  • Installation ID

Overview

Batch allows you to track the performance of your orchestrations across different channels with two comprehensive views:

  • Performance Analytics: An analytics tab offering a macro-level view to monitor the evolution of key metrics over time.

  • Orchestration Analytics: A detailed, orchestration-specific view providing additional insights, accessible within each orchestration.

Analytics data is updated in real time and assigned to the date the message was originally sent. For instance, if a message is sent on January 1st and recipients interact with it (e.g., open or click) on January 2nd or 3rd, all such interactions are recorded under January 1st.

For Trigger and Recurring Automations, Profiles can receive messages repeatedly if they re-enter a Trigger Automation or are targeted again by a Recurring Automation. Analytics will reflect these multiple message sendings by displaying cumulative metrics, including the total number of sent messages, opens, clicks, and other engagement data.

Team

Team access page allows the management of user permissions within Batch.

The administator can manage rights of other users.

Various rights described in Batch allow granularity in what users can do within Batch.

Naming and labelling

Naming your campaign

After you have set up your app to send push notifications, you can click the "Push" tab and choose New Push Campaign to send your first push notification.

The first step in creating a campaign is to give it a name. Keep in mind that it is how you are going to be able to distinguish it from the many others you are going to create, so try to be as specific as possible.

Deleting an orchestration, a step in a trigger automation, or removing a language version of a campaign does not erase related analytics. Metrics for messages sent in these cases remain available.

Note that you can access raw analytics data (e.g., when a profile opened an email) via the Export Profile Events API.

Adding a label

You can simply attach up to 3 labels to a campaign via the Associate labels button.

Labels have two main purposes:

  • Marketing pressure limit: You can set a specific marketing pressure limit on all the campaigns attached to the same label (e.g. no more than 1 push a week for all campaigns using the "onboarding campaigns" label).

  • Filtering: You can filter your campaigns list based on the labels attached to your campaigns (e.g. "onboarding campaigns"):

In case you are using Batch's APIs, you can also attach one or several labels to a campaign created from the Campaigns API or to notifications sent from the Transactional API.

team access

Overview

On Batch, you can create and manage three types of Orchestrations:

  • Campaigns: they allow you to send one-shot messages to your users.

    • Now: Send your campaign as soon as you run it.

    • Scheduled: Send your campaign whenever you want in the future, based on each Profile's local time or on Universal time (UTC).

  • Recurring Automations: Send messages in a recurring way, on specific intervals over time. Recurring Automations are great to onboard your new users for instance. You can schedule several automations that will be sent throughout their first week after installing your app, to help them discover all the features and benefits it has to offer. They are also a good way to announce special offers that last over a certain period, encourage them to upgrade to a newer version and more.

  • Trigger Automations: Send one or a serie of messages, following a user action, via different channels and with decisioning logics. Trigger Automations are useful to manage a wide variety of use cases, from simple welcome notifications sent shortly after users install the app to advanced abandoned cart alerts or user journeys.

On each Orchestration, you have access to a wide range of feature to be able to organize them, set marketing pressure rules, specify your targeting and personalize your message.

The following sections will walk you through the different types of Orchestrations and their capabilities.

Data management

The Data management page shows the list of all the custom data collected on the Profile base that powers Email, Push v2 & SMS.

The Data management page shows the list of all the custom data collected at least once on your apps and website from Batch SDKs or from the Profile API.

Enabling New Data

Recently attributes and events that have been tracked and not enabled yet are displayed in a dedicated section. New custom data need to be manually enabled before being displayed in the targeting and personalization fields.

Editing Data

You can add a display name to any attributes or events. This is useful if you want to display simplified names in the interface instead of the technical name of the attributes/events. The technical name will still be displayed in the Profile view for debug purposes.

You can also change the data type of an attribute (e.g. from string to date) if you already made that change in the code of your app or in your call to the Profile API. Batch will adapt the operators displayed in the campaign editor to the new data type. If you changed the data type by mistake, Batch indicates with a * the data type detected for that attribute (e.g. "Integer*").

Archive data

Archiving data makes it unavailable for targeting and personalization. It can be restored at any given time.

FAQ

The Frequently Asked Questions (FAQ) section will answer your most common questions. Feel free to check it out before reaching out to our support team!

In-app messaging

Settings

MEP to CEP migration

Overview

Settings regroup all the elements that should be setup properly, to be able to orchestrate the greatest engagement strategies.

Settings

Push

Message personalization

Implementation guides

Message

Email address

The profile view page will present all data associated with a profile, including:

  • Attributes: Display various profile characteristics and preferences.

  • History: Show a history of profile actions, sent messages and interactions.

  • Subscriptions: List any subscriptions or opt-ins associated with the profile.

This centralized view provides a complete picture of the user's data, enabling efficient profile management and analysis.

Screenshot

History

Profile actions

All events tracked by a profile apps or websites via Batch SDKs methods are displayed on the Profile view, as well as events sent via API.

Message events

Message events are events related to messages sent by Batch.

The following events are tracked:

  • Sent: for Email, Push v2, SMS

  • Sent opt-in: for Push v2

  • Delivered: for Email , SMS, Mobile Landing and In-App

  • Open: for Email, Push v2.

  • Machine open: for Email

  • Click: for Email

  • Bounces: for Email

  • Suppressed: for Email, when an email adress is in the suppression list

  • Dismissed: for Mobile Landing and In-App

This page applies to the data lifecycle of Profiles that powers email, SMS, and Push v2 channels.

SMS

SMS is a message sent straight to your users' phones, exactly when you want. It’s a fast, direct, and highly effective communication channel, perfect for grabbing attention, engaging customers, and driving action!

This guide will walk you through composing a powerful SMS message. Let’s get started! 🚀

Compose your SMS message

Add message

Composing your SMS message is the first and most important step. To make it effective:

  • Start strong: use attention-grabbing words right from the first line.

  • Be clear and concise: focus on one key idea, keep it short and easy to understand.

  • Add a direct call to action: let users know exactly what to do next.

  • [optional] Use a link: keep your message clickable.

You can (sparingly) to add visual appeal 🌟

Add personalization

Adding personalization to your SMS feel more relevant and create a sense of direct communication with the user. Make your message feel personal by !

This grabs attention but it also builds trust and increases engagement.

All you need to do is to click the {...} Insert variable button next to the title or the body of your message and pick an attribute:

Multi-language

You can also create multiple versions of a message, one for each language, by clicking , ensuring that profiles receive the message in their own language:

When adding a new language version, the default version will be duplicated, keeping your format options, images, and other elements intact, so you only need to edit the text that requires translation.

A default version will be sent to profiles that don’t have a message already specified in their language.

Testing your SMS

  1. Directly in your notification center

Now that your SMS message is ready to be sent, you can test by sending you a test!

Use the Send test button on the SMS message window and add your phone number:

The SMS is immediately sent! ✨

  1. Test your user data directly on Batch

It is possible to preview the dynamic data of your email using the "Preview As" feature. To do so, use your custom user ID (or one of your users), then enter it in the dedicated field:

🚀 Your SMS is now ready to be sent! Click on the 'Save and run' button at the bottom of the form to activate it or save it as a draft and come back later.

Segments

This feature allows you to create and save dynamic user Segments and use these Segments in the targeting of omnichannel Orchestrations.

You can leverage Segments in three area of Batch described below.

The Segment page

From this page, you can see the list of all your Segments with their names, estimated reach and the number of orchestrations to which they are attached.

From the Segments table you can :

  • Create your Segments.

    • You can have up to 500 active Segments.

  • Access a filtered view of the Campaigns and Automations that use the different Segments ("View X campaign" and "View X automation" buttons in the three dots menu).

  • Modify or delete your Segments.

    • It is not possible to delete a segment if it is used in one or several running orchestrations.

    • If a Segment used in a running orchestration is modified, the orchestration will automatically take into account the change. To be noted that the update is not instantaneous: if a message sending has already begun, the modifications to the Segment cannot be taken into account.

  • Duplicate your Segments.

    • You can create a new Segment from an existing one.

  • Export your Segments

    • Click on the "Export profiles" option in the three dots menu to request a Segment export. You will then receive a link to download the export by Email. The link will remain available for 3 months after receipt of the Email.

      • As profile data is sensitive, only Admin users can export Segments.

    • Details of the export file :

The Query Builder

When creating an Orchestration, you can click on a “Use segment” button, allowing you to :

  • Call Segments as blocks in the targeting.

  • Nest Segments (inclusions and/or exclusions) by calling up to 20 Segments in your targeting.

When a Segment is linked to an Orchestration, you can access/ view the Segment from the query builder regardless of the campaign status (draft, running, complete) by clicking on the eye icon.

You can also call Segments in the targeting of Campaigns created by API.

The Campaigns and Automations listings

You can filter these listings by Segments in addition to existing filters (channel, date, status...).

Profile Analytics

This page provides an overview of the profiles in Batch. It shows how many have an email address, a mobile app/web, or a phone number attached for example.

Header

Total of profiles: Profiles centralize data and events gathered from various sources such as apps, websites, and APIs. They can either be logged-in or anonymous, reachable via email or not. Profiles are automatically generated when a user first engages with your app, visits your website, or if you send data using a Custom ID via API.

Identified profiles: Profiles that have a Custom ID, usually shared after login or sign-in.

Anonymous profiles: Profiles that didn't log in to their customer accounts yet. Anonymous profiles are automatically generated by Batch when a user visits your app or website and you don't know how to recognize them yet.

Push

You can filter the push section to access specific information about iOS, Android, or Web push subscritpions.

Push subscriptions

This sections provides a breakdown of profiles that are subscribed and not subscribed to push notifications, based on the total number of profiles eligible for push notification subscriptions. For example, when filtering for iOS push notifications, you would only consider profiles that have the iOS app installed.

New subscriptions

This bar chart illustrates the daily count of new push notification subscriptions over the past 30 days. It exclusively shows new sign-ups and does not reflect any unsubscriptions that occurred during the same timeframe.

Email

Email subscriptions

This section provides a breakdown of profiles according to their marketing email subscription status, based on the total number of profiles with an email address.

Subscribed: Subscribed profiles have explicitly given their consent to receive marketing emails. You can send them both transactional and marketing emails.

Unsubscribed: Unsubscribed profiles have opted out of receiving marketing emails. Unsubscriptions are automatically tracked when a user clicks on an unsubscribe link in your email. You can also manage unsubscribed profiles through the Profile API, for instance, if a user unsubscribes from a preference center in your app. You can send them transactional emails only.

Never subscribed: Never subscribed profiles have shared an email address with you, such as during the creation of a user account, but they did not subscribe to marketing emails. You can send them transactional emails only. It's also possible to reset a profile email subscription status to "Never Subscribed" using the Profile API.

New email subscriptions

This bar chart illustrates the daily count of new email marketing subscriptions over the past 30 days. It exclusively shows new sign-ups and does not reflect any unsubscriptions that occurred during the same timeframe.

SMS

This section provides a breakdown of profiles according to their marketing SMS subscription status, based on the total number of profiles with a phone number.

Subscribed: Subscribed profiles have explicitly given their consent to receive marketing SMS. You can send them both transactional and marketing SMS.

Unsubscribed: Unsubscribed profiles have opted out of receiving marketing SMS. Unsubscriptions are automatically tracked when a user unsubscribes from SMS using a STOP code. You can also manage unsubscribed profiles through the Profile API, for instance, if a user unsubscribes from a preference center in your app. You can send them transactional SMS only.

Never subscribed: Never subscribed profiles have shared a phone number with you, such as during the creation of a user account, but they did not subscribe to marketing SMS. You can send them transactional SMS only. It's also possible to reset a profile SMS subscription status to "Never Subscribed" using the Profile API.

Profiles are powering Push v2, email and SMS channels. Push v1 is powered by an installation based data model, siloed by platform (iOS, Android, Web).

How to secure your account using two-factor authentication (2FA)?

2FA (Two-Factor Authentication) is the best way to secure your account from any intrusion.

Batch allows you and your team to use 2FA to fully secure your access to the dashboard with an additional security layer. But first, what is 2FA and how does it work?

2FA for Two-Factor Authentication

As its name suggests, 2FA allows you to add an extra step in your authentication process on a desktop website/app, via a code verification from your smartphone.

After having prompted your password as you would normally do, you will be asked to input a code fetched from a dedicated 2FA mobile app, previously linked with the website/app you're logging into:

Step 1: Input your password

Step 2: Type the 'Batch.com' code from the 2FA mobile app on Batch dashboard login menu

And now you're connected in a fully secure way!

How to set up 2FA on Batch?

First, hop into your Security settings via the top right-hand corner menu by clicking on 'Security'.

In the Security tab, click on 'Enable' under the Two-factor authentication section.

Then follow the given instructions: open your favorite 2FA Mobile app, add a new login, scan the given QR Code and type the code your 2FA app gives you in the Batch dashboard. You will find a list of apps you can use to set up 2FA below.

There you go, 2FA has been set up on your account! Last but not least, the Team section of the Account Manager gives your team Manager insights on who has already set up 2FA.

If you're seeking a 2FA tool:​

Authy is a good solution if you are looking for a simple 2FA authentication app that includes multiple backup options: /.

You can also use one of these alternatives. The list is not exhaustive:

  • Duo Mobile: /

GDPR & privacy

This is where brands brands manage their GDPR settings and can see Data Processing Agreement document.

Account Settings & Security

You can edit your account settings by expanding the menu in the top right corner, clicking on your initials.

Basic Information

Allows you to edit basic information about your account such as your first name, last name and the email address used to login.

Security

If the Single Sign-On (SSO) feature is disabled, you can edit here the settings related to the security of your account. Otherwise, you will see "Your security settings are managed by your organization".

Password Modification

Use that part of the settings to change your password. If you don't remember your password, log our request for a password reset .

Two-factor Authentication (2FA)

You can easily enable/disable Two Factor Authentication (2FA).

2FA adds an extra layer of security to your dashboard by asking for an auto-generated code from a second device each time you login. This protects your account in case your password is compromised.

Once enabled, Batch will generate a QR Code you will be able to scan with an authentication app and provide a list of recovery codes.

Make sure you print or save your recovery codes as this will be the only way to restore access to your account.

Catalogs

Catalogs are collections of non-user-centric data (e.g., product catalogs, media articles). This data can be used directly within messages to power advanced personalization scenarios like abandoned cart campaigns, product recommendations or sales opening.

  • Referencing catalog data

Account Settings

You can edit your account settings by expanding the menu in the bottom left corner and choosing one of the two options below your name.

Basic Information

Allows you to edit basic information about your account such as your first name, last name and the email address used to login.

Security

If the Single Sign-On (SSO) feature is disabled, you can edit here the settings related to the security of your account. Otherwise, you will see "Your security settings are managed by your organization".

Password Modification

Use that part of the settings to change your password. If you don't remember your password, log our request for a password reset .

Two-factor Authentication (2FA)

You can easily enable/disable Two Factor Authentication (2FA).

2FA adds an extra layer of security to your dashboard by asking for an auto-generated code from a second device each time you login. This protects your account in case your password is compromised.

Once enabled, Batch will generate a QR Code you will be able to scan with an authentication app and provide a list of recovery codes.

Make sure you print or save your recovery codes as this will be the only way to restore access to your account.

Channels

Batch allows you to communicate with your users through multiple channels, each with its own characteristics, benefits, and best use cases. To help you make the most of them, each channel has a dedicated documentation page focused on message composition:

In-App Templates

In-App templates are utilized in In-App messaging within the Batch platform. They provide a structured framework for orchestrating in-app and mobile landing engagement strategies.

A template defines the structure of an in-app message, not its specific content. For further details on template functionality, refer to the section of the documentation.

About content visualization, note that during template editing, text and images can be included for visualization purposes. This content is not saved with the template. Specific content is added when a message is created using the template.

Template management functions:

The In-App templates page offers the following capabilities:

  • Create templates: New templates can be created from scratch or based on existing templates.

  • Rename templates: Custom templates can be renamed.

  • Delete templates: Custom templates can be deleted.

  • Search templates: Templates can be located using the search function.

  • Modify templates: Existing templates can be modified and saved as a new template or by overwriting the current version.

Note: Pre-built Batch templates cannot be updated, renamed, or deleted. They can be used as a foundation for creating custom templates.

Overview

Profiles centralize user data and events from multiple sources, such as Apps, Websites, and APIs, in a single place based on a custom user ID.

A unified user base made up of Profiles, anonymous or identified is associated with each Projects.

When a user interacts with any of the platforms within a Project, their actions are fed into the associated Profiles. For example, this allows you to trigger automated emails based on user behavior, regardless of which platform the user used.

Profiles also store engagement information such a user's email address and email subscriptions, making it easy for you to send targeted and relevant communications to your customers.

Profiles are powering Push V2, email and SMS channels. Push V1 is powered by an installation based data model, siloed by platform (iOS, Android, Web).

Profile Overview

The userbase tab gives you an overview of your current iOS, Android or Web userbase, allowing you to elaborate new push strategies and understand how to best engage with your users.

There are three kind of information you can see on your userbase:

  • Basic statistics: Total number of users, opt-in rate, etc.

  • Smart Segments: Distribution of your users in Batch Smart segments.

  • Native and custom segments statistics.

Manage Team

Manage team allows full coordination of your team work on Batch.

Managing Permissions

Batch lets you set specific permissions at the user-level to facilitate team collaboration.

There are several permissions you can grant or revoke:

  • Administrate: Grants full access to company account (team members, users permissions, etc). Note: an account can have more than one Administrator.

Privacy Center

The Privacy center makes it easy to handle data access and data removal requests. Requests must be submitted for every app separately and must provide a valid data subject identifier (e.g. customer-level or device-level ID). You can also use Batch REST API to do the same thing (know more on the GDPR API):

GDPR request information is available via our Dashboard and APIs for 20 to 30 days after request creation. After this time, you will not be able to query its status anymore. Pending requests are always available.

The dashboard also shows the status of all your data access/removal requests. You can also filter these requests by origin (Dashboard or API):

Company Settings

Company settings encompass several Administrate right related elements.

Company Name

You can edit here the company name that will be displayed in the dashboard of your teammates.

Making 2FA Mandatory

Labels

Labels have two main purposes:

  1. Marketing pressure limit: You can set a specific marketing pressure limit on all the campaigns attached to the same label (e.g. no more than 1 push a week for all campaigns using the "onboarding campaigns" label).

  2. Filtering: You can filter the list of your campaigns based on the labels attached to your campaigns (e.g. "onboarding campaigns"):

Cappings

Frequency capping allows you to limit the number of messages a profile can receive in a certain time frame.

The feature is restricted to users with App or Administrate rights.

Account administrators can require new and existing teammates to use two-factor authentication (2FA) when they sign into Batch.

Reset API Key

Account administrators can reset the API key if needed, for example if it leaked in a chat conversation, by mistake. All services leveraging Batch APIs will have to get the new key after the reset.

here
use emojis
inserting variables
Multi-language

Google Authenticator: iOS/Android

  • Microsoft Authenticator: iOS/Android

  • iOS
    Android
    iOS
    Android
    here
    security
  • Review: Grants read-only access to the dashboard. Review users will not be able to create nor edit orchestrations.

  • App: Grants users rights to edit and manage apps.

  • Campaign: Grants users rights to create, edit and delete campaigns and automations.

  • Privacy: Grants users rights to manage GDPR settings.

  • Project-level Permissions

    To facilitate collaborative work, a user with "Administrate" rights can grant another user access to specific projects. This is useful if you want to make sure specific users cannot access all the project on the dashboard.

    The user will have the same permissions on all the assigned projects.

    It is not possible to have different permissions on the the different channels part of a project. A user must have the same rights on iOS, Android, Web apps part of a project and these rights will also automatically apply to email and SMS channels.

    Troubleshooting

    I didn't receive my invite

    Here are some suggestions to find the issue:

    1. Check your spam folder and look for an email sent by hello@batch.com.

    2. Resend the invite: Ask the administrator of Batch account to double-check the email address they used or resend the invite.

    3. Validation link: If none of the above work, your manager can send you the confirmation link he will see after inviting you.

    I Get "[Email Address] Is Already Registered On Batch.Com"

    If one of your teammates already has a Batch account registered with his email address, he needs to contact our support team (support@batch.com) with the following information:

    • Email address of his first account.

    • Email address of the team he wants to join.

    We will add him to your team with all the apps he created with his previous account.

    Can I Manage Several Accounts With The Same Email Address?

    You cannot manage more than one account with the same email address.

    If you have a Gmail account or use Google Apps, you can add a "+" at the end of your username to benefit from dynamic alias (e.g. andrew+secondaccount@gmail.com).

    How Can I Delete My Account?

    Just ask us to delete your account at support@batch.com. Our team will let you know when it's done.

    Manage team
    Label-based Capping

    You can create a frequency capping for all the orchestrations attached to a specific labels. It works for orchestrations created via the Dashboard or Batch's APIs.

    Batch dynamically checks the number of messages across all channels (email, SMS, push) that have been sent in the last X hours/days to see if the message has to be sent or not.

    If you send a multiplatform push message, it counts as one sending even if the person might receive the push on several devices.

    Important note: Messages sent very closely or at the same time may not be taken into account by the capping feature.

    Global Capping

    You can either define a simple limit that will be applied to all the notifications you send or fine-tune your global frequency capping:

    • All push notifications: The capping rules affects all your push notifications.

    • Orchestrations: The capping rules only affects notifications coming from campaigns and automations created on the dashboard or with the Campaign API.

    • Transactional: The capping rules only affects notifications sent with the Transactional API.

    • In-app messages: This capping rules only affects In-app messages. It can be setup by session or interval of time.

    All these rules can work together. For example, you can set a global capping of 5 push notifications per day and create two additional rules that will ensure users won't receive more than 1 transactional push every 2 hours and 1 push from a marketing campaign per week.

    Global capping is only available on Push v1 and thus siloed by platform (iOS, Android, Web). In Push v2, it is possible to apply the same capping rule on all orchestrations putting on them the same label.

    Capping analytics

    You can see the number of messages that were not delivered because users already reached the limit defined in your dashboard settings. The corresponding metric is called "Skipped".

    capping
    • It is in CSV format.

    • Its name contains the extract date and the Segment name.

    • It contains the list of profiles in the Segment at the time of export, with the following information on each profile: Custom ID, Profile ID, phone number and email (when information is available for user).

    • Profiles that have neither install nor custom ID are not exported.

    profile analytics
    GDPR

    Push

    In-App

    Email

    SMS

    Cover
    Cover
    Cover
    Cover
    profile view

    Basic statistics

    There are 4 metrics you should check to see how your app is performing:

    Installs

    Total number of installs of your app since you released it with Batch SDK. This number includes users who still have your app on their device or who already uninstalled it.

    The number of users is updated in real time.

    Opt-ins

    This is the percentage of users who have opted-in to push notifications in your app or website.

    Number of tokens

    Appears on hover on "Opt-ins". The interpretation of this metric differs from an OS to another:

    Android

    On Android, Batch retrieves automatically the token of your new users. Users who have a token are users who still have your app on their device.

    iOS

    On iOS, the token collection can depend on the background refresh. You can go in Xcode and see if "Remote notifications" is checked as a background mode in your app's Capabilities to see if it's enabled.

    • If enabled: Batch collects tokens for all your users, even for those who choose not to receive push notifications. In this case, users who have a token are also users who have your app on their device.

    • If disabled: Batch only collects tokens for users who opt-in for push notifications. In this case, users who don't have a token are users who didn't accept notifications or uninstalled your app.

    Please note that users can disable background refresh for your application so these stats may be imprecise.

    Smart Segments

    Understanding smart segmentation

    Smart Segments are automatically created by Batch using a proprietary algorithm. They let you visualize precisely who is using your app, and who is not, who is buying your product, and who is churning away.

    Our algorithm analyses the sessions of your users from the moment they install your app and put them in 4 different segments. Here is a short definition of every segment:

    • New: Newcomers to your app that haven't yet established themselves as engaged, lasting users.

    • Engaged: Congratulations! These users are actively using your app.

    • Dormant: These promising users haven't used your app in a while. Reengage them!

    • One-time: Users that have had your app for a while but have only opened it once.

    We are also showing the predictive and intermediate Smart Segments that our algorithm calculates:

    • Risky Engaged: Users with a high risk of becoming dormant in the next days if you don’t re-engage them with a targeted notification.

    • Promising New / Dormant users: Users who are about to become engaged. Don’t miss the opportunity to send them a message!

    Batch also shows the number of imported tokens who haven't been reintegrated to Batch Smart Segments yet. You will find more information on token import here.

    The Profile overview page provides insights on the installation base that powers Push v1, siloed by platform (iOS, Android, Web). For details about Push v2 Profile Analytics go there.

    Requesting Data Access

    As soon as the request is completed, users with the Privacy and Administrate rights will receive an email (e.g. "[BATCH] Your GDPR request [request token] has been processed") with a link to an archive containing all the data Batch has stored for the provided identifier (e.g. list of sent notifications, list of installs attached to the id along with the data collected for each install, etc).

    That file can also be downloaded from the Privacy center:

    Requesting a Data Removal

    All the data Batch has stored for the provided identifier will be deleted.

    Batch will blacklist the ID for one month after the data removal. If you request a data removal for a specific ID and your user keeps or reinstall the app, Batch will not accept the data coming from that install. Batch will also discard the data sent from the for that specific ID.

    The Privacy center requests applies to the installation base that powers Push v1, siloed by platform (iOS, Android, Web) but also to Profiles leveraged to send emails, SMS and pushes via Push v2.

    privacy center
    Restricted to users with App or Administrate rights.

    Creating a Label

    You can create as many labels as you want. Every label you create has: 

    • A code: Unique id of a label. Use it as a reference in your calls to the Batch API. Avoid editing label codes. By changing a label's code, you might trigger errors on your API calls if you don't update them with the new name. This may also reset the frequency capping limits on running campaigns already using this label.

    • A name: Used to identify your label on the dashboard.

    Managing Labels

    You can edit the code and the name of existing labels or delete them if needed. Batch shows the number of orchestrations attached to each label so you can understand the impact of deleting or modifying one.

    Note that labels created in the Omnichannel tab can be leveraged in Email, SMS and Push v2 orchestrations. Labels created in iOS, Android and Web tabs are related to Push v1, siloed by platform.

    General

    In this section, you can setup the general parameters of the apps and the the website part of your projects.

    Note that there can only be one iOS app, one Android app and one website per roject. Also, projects creation, apps creation, deletion and add-on Projects is managed via your CSM.

    Projects Information

    That settings section contains basic information about your project, app or website.

    Project Name

    Required - Name of your app or project. You can defined it freely. The icon will be automatically defined based on apps and website part of the project.

    Project Icon

    The icon is automatically deduced from the apps part of your project.

    Batch won't use this icon in the push notifications.

    Project Key

    The project key is used to leverage Batch APIs by specifying the project you want to work on.

    Managing Environments Separately

    If you need to manage development, staging and production environments separately, you can create separate projects on the dashboard and rename them accordingly (e.g. [DEV] MyProject, [PROD] MyProject, etc).

    Apps and Websites Information

    App/website Name

    Required - Name of your app or website. Batch will prefill that field based on the information gathered from the App Store, the Play Store or the metadata of your website. This name is not visible in the Dashboard, only the project name is.

    Note that Batch won't use this name in the push notifications.

    URL

    Required, Web only - The URL of your website. Batch uses that URL to get the name and the icon of your website. Batch also uses your website URL to generate the SDK Auth key.

    SDK

    Required, iOS/Android only - Platform or framework used to develop your app. You can choose between iOS/Android (Native), Cordova, React Native, Flutter. Modifying that parameter will adjust the integration steps.

    API Keys

    Here you can see the list of all the IDs needed to leverage our APIs, SDKs integrate the SDK or implkement the Inbox.

    SDK API Keys

    Batch generates an SDK API key for every app and website added to your company. The SDK API key identifies your website or your app on a specific platform. For example, you will notice your iOS app, your Android app and your website don't have the same SDK API key.

    The SDK API key has two purposes:

    • APIs: The SDK API key is the unique reference to your website or your app on a specific platform when you call Batch REST APIs.

    • Integration: The SDK API key authenticates the requests sent to Batch servers and allows Batch to attach the data to the right app or website.

    Restricted to users with App or Administrate rights.

    REST API Key

    The REST API key authenticates the calls made to Batch APIs targeting your apps/websites API keys.

    The REST API key is sensitive information as it allows you to send push notifications, display In-App messages, send data, and more from Batch APIs. Do not expose it to your users and avoid sharing it in your company. Batch only generates one valid REST API key per company.

    If you suspect your REST API key is compromised, send an email to support@batch.com describing the issue. Our team will invalidate the REST API key and generate a new one after receiving validation from a user with the "administrate" right.

    Restricted to users with Administrate rights.

    Inbox secret

    The Inbox secret key is the authentication key required to use the Inbox feature in your app.

    Restricted to users with App or Administrate rights.

    Notifications

    The Notifications tab centralizes the stats on all the notifications sent from the dashboard or the API. At a glance, you can see how your messages perform over time to improve your push strategy. If you want to go further, you can easily export all your stats in CSV format.

    Batch shows your notifications stats in two different categories:

    • Global analytics: Average performance of your push campaigns. It shows the number of sent notifications, the open rate and more.

    • Detailed stats: Detailed stats on all your notifications, ordered by date and category.

    Global analytics

    Gives you valuable information on the volume of notifications sent every day. You can choose a custom date range in the top right corner if you want to analyze a specific period of time.

    • Total push sent: The total amount of sent push notifications.

    • Campaigns: Number of notifications sent from the dashboard or using the Campaigns API.

    • Transactional: Number of messages sent from the Transactional API.

    • Errors: Number of APNS/FCM/WNS errors retrieved during the selected period of time.

    You can also see the average performance of all your messages:

    • Open rate: Indicates the percentage of users who opened your notification directly or indirectly. We calculate it as follows: direct opens + influenced opens / total sent notifications.

    • Direct: Total number of users who opened your app by tapping the notification.

    • Influenced: Total number of users who received a notification and opened your app within 3 hours.

    • Reengage rate

    Detailed stats

    The second part of the Notifications analytics shows detailed stats of all your sent notifications:

    • Daily: Day by day view of the campaigns and transactional notifications sent by Batch.

    • Campaigns: List of all the campaigns sent from the dashboard or the campaigns API.

    • Transactional: List of all the transactional notifications sent during the selected period of time.

    You can sort columns in ascending or descending order by clicking on the column header. This is helpful to find your best performing campaigns and transactional push notifications.

    Exporting data

    You can export all your stats by clicking Download CSV. The CSV file contains detailed information on your campaigns such as:

    • Date: Send date of the campaign (E.g. 2020/06/27).

    • Time: Send time of the campaign (E.g. 11:30).

    • Timezone: Timezone setting used for the campaign (now, GMT or local). See more on campaign scheduling .

    Audiences

    Audiences allow you to upload static target lists (e.g. top 500 buyers, etc) coming from other sources.

    Creating an Audience

    You can easily create an Audience from the "Audiences" tab:

    • Click on the “Add Audience” button of your dashboard.

    • Choose a Display Name (mandatory).

    • Choose a Name (optional).

      • If you don’t define a Name Batch will generate one based on the Display Name.

    • Choose an Audience type, it can be:

      • Customer User IDs

      • Emails

      • Install IDs

    • Upload your file:

      • Your file must be a csv or txt file (50MB maximum) containing a list of IDs (one per line) in the first column and an optional string attribute in the second one. Adding an attribute is useful for personalization purposes.

    Other methods to import Audiences in Batch:

    • Via API. You can add more additional fields in additional columns if you upload an audience via API.

    • Via the Audience Importer. The importer automatically imports audiences from your data stores via (S)FTPs. Audience Importer setup is upon request. Reach support or your CSM to know more.

    Managing an Audience

    You can easily edit and delete your Audiences from the "Audiences" tab. For each Audience, Batch displays information such as:

    • Display name: Name of the audience, only used in the dashboard.

    • Name: This is the unique ID of your audience.

    • Type: Type of ID used in the campaign.

    • Estimate / IDs: estimated number of Profiles matching the IDs in the audience. Depending on the number of IDs included in your audience, the estimate may take several minutes to calculate the number of tokens matching your audience.

    Functional help on Email and Install ID Audiences

    • Audience Targeting is Profile-Based:

      • If an Email or Install ID in your audience is not linked to an existing profile in Batch, that email/ID will be ignored during targeting. No new profiles are created (e.g., this does not support importing new anonymous users).

      • Multiple Profiles linked to one Email:

    The Dashboard displays Audiences associated to Push v1 which is siloed by Platform (in iOS, Android and Web tabs) and Audiences associated to Push v2, email and SMS channels, in the Omnichannel tab.

    Reach

    The Reach tab shows how the reach of your push campaigns evolves over time. At a glance, you can see the total number of installs opt-in to push notifications and the number of new opt-in/opt-out installs every day.

    Global analytics

    Gives you valuable information on the volume of new installs opt-in to push notifications everyday. You can choose a custom date range in the top right corner if you want to analyse a specific period of time.

    • Total tokens: Total number of installs with a token.

    • Total opt-ins: Number of installs with a token opt-in to push notifications.

    • New opt-ins: Number of new opt-in installs.

    • Opt-outs: Number of new opt-out installs.

    Detailed stats

    The second part of the Reach analytics shows the same stats in a table. You can sort columns in ascending or descending order by clicking on the column header. This is helpful to find your best performing days.

    You can export all your stats by clicking Download CSV.

    Data Lifecycle

    Profiles store all data sent by API or SDK, as attributes, events, and reachability information. They can be anonymous or identified once you attach a Custom ID to them after login or sign-in.

    Profile anatomy

    Identifiers

    Campaigns

    Campaigns are made for schedule-based, one shot messages. You can create Campaigns for each channel: Email, SMS and Push. They can be managed from the “Campaigns” tab of your dashboard.

    Creating a Campaign

    To create a campaign, click on the “New Campaign” button on the top right-hand corner of your Campaigns listing and select the channel you want to use to send your message.

    Once on the Campaign builder:

    In-App

    An In-App message appears right inside your app while your user is actively using it. It is a great way to communicate in the moment and in context, perfect for guiding, informing, or prompting action.

    This guide will walk you through crafting a clear, impactful In-App message. Let’s get started! 🚀✨

    Prerequisite: Create a theme

    Before launching your first In-App automation, you will need to create a theme.

    To do so: go to Settings → Themes → Create your first theme:

    Create your first recurring automation

    Need help creating your first recurring automation? Here are all the steps you need to follow.

    Recurring automations help you engage users with consistent and scheduled messaging, perfect for reminders, promotions, or regular updates. This guide will walk you through creating your first recurring automation, covering targeting, scheduling, and message composition. Let’s get started! 🚀

    The ‘Automations’ tab is dedicated to ‘automated’ campaigns such as Recurring and Trigger.

    Here is a short guide to help create your first recurring automation on Batch following the 3 steps of the Automations form:

    Email

    An email consists of the following elements:

    Header Information:

    • Sender Address

    • Custom Reply-To (optional)

    • Subject Line

    Debug

    Batch provides simple debug tools that allow you to test your integration (⚙ Settings → Debug) and debug your calls to the Transactional API.

    Integration Debug Tool

    Key metrics

    Targeted Metrics

    Messages planned for a given orchestration can be categorized into several states:

    • Skipped (email only): The message was not sent because the email address was flagged due to hard bounces or excessive soft bounces. In the Profile Export Events API, this status is also included in the email_bounce event with the bounce code recipient_in_suppression_list

    Troubleshooting

    If you are having trouble understanding why Batch is not showing correct data for your app, here are some suggestions.

    I’m not seeing any data on my dashboard

    If Batch is not showing any data on your dashboard, here are some suggestions to find the issue:

    • 24h delay. Keep in mind that installs, DAU, starts and redeems are updated on a 24h basis.

    Analytics

    Basic analytics

    The automations list gives you some basic information on the performance of your In-App automation:

    • Trigger: The event that triggers your In-App message.

    Audience

    The Audience tab is the first screen you see when you click on the Analytics tab. It shows five basic metrics: Daily Active Users (DAU), installs, starts, push and redeems.

    These indicators are updated on a 24h basis.

    Selecting a date range

    By default, the dashboard displays one month of data for the app you've selected. You can choose a custom date range in the date picker.

    Batch can also show you the number of installs an app receives

    Email

    Email is a versatile and impactful way to communicate with your users. Delivered straight to their inbox, it’s ideal for sharing rich content, building loyalty, and driving action. Whether you’re welcoming new users, promoting an offer, or nurturing long-term relationships, email is a key touchpoint in your customer journey.

    This guide will walk you through composing your Email message. Let’s get started! 🚀

    Compose your Email message

    Campaigns migration

    Once your app has been released with Batch SDK, you will be able to migrate your push campaigns to Batch. The migration steps vary depending on the you choose:

    • If you chose the Hot Swap method, you need to migrate your campaigns as soon as possible since the new opt-in users are only reachable via Batch.

    • For a Staged Migration, all users will still be reachable from both your previous provider and Batch, so you can migrate the campaigns gradually over days/weeks.

    : The percentage of users reengaged out of the total push notifications sent during the campaign.
  • Users: Users who received the notification and became engaged 3 days after receiving it.

  • Kind
    : Type of notification sent, transactional or marketing.
  • Group or campaign: Name or group_id of the campaign (E.g. new_follower).

  • Sent: Total number of sent notifications.

  • Direct open: Total amount of direct opens.

  • Influenced open: Total number of influenced opens.

  • Reengaged users: Total number of reengaged users.

  • Errors: Total amount of APNS/FCM errors.

  • here
    global notification analytics
    detailed notifications analytics
    Reviewing Data Attached to an ID

    Batch provides a simple tool you can use to see the list of installs tied to a specific ID and the data Batch collected for each one of them. You can search installs based on:

    • An advertising ID: IDFA (iOS) or GAID (Android). You can find your advertising ID by using My Device ID on iOS or by going to your device settings → Google → Ads on Android.

    • A Custom User ID: Your own user IDs shared with Batch.

    • An Installation ID: ID generated by Batch for all the installs the first time your users open the app. You can get your installation ID in the log of your app or display it in your app for debug purposes.

    You can also see the data collected for random installs in your userbase.

    For every install, the debug tool displays basic information on the left side:

    • Basic information: Device type, last SDK start date, country, language, installation date, push op-tin status, app/OS/SDK version.

    • API Key: API key tied to the install. This can be your live or your dev API key.

    • Custom user ID: Custom User ID set for the install. The field will be empty if no custom user ID is set.

    • Installation ID: ID generated by Batch for the install when user opened the app for the first time.

    • Push Token: Push token attached to the install. The field will be empty if Batch hasn't received any token yet for the install or if the token has been invalidated (e.g. uninstall).

    On the right side, you will find the list of all the data collected for a specific install:

    • Native data: app version, bundle ID, carrier code, city code, device brand/type, installation date, last location, and more.

    • Custom data: You will find here the list of all the attributes, tag collections and events received from the SDK or the Custom Data API. You search a specific value in the list if needed.

    The dashboard will display the most recent install first. Simply click again the "Debug" or "Reload" button to refresh the list of installs and update the attributes/events list.

    Sending a Test Notification

    Batch enables you to send a test notification to all the installs attached to the ID you are debugging. Click the "Send Test Push" button at the top of the installs list:

    If you need to send push notifications to your device on a regular basis, then you should add your ID as a test device by clicking the "Save as a test device" button.

    Debugging a Trigger Campaign

    You can also see if a specific install is or has been in the user journey of a trigger automation. Click the ⚡️ lightning icon in the top right corner of the debug tool. This will show the list of trigger campaigns that targeted your install at some point.

    For every campaign, you can see when your install entered the user journey and when/why it exited that user journey:

    • push_done: Batch sent a push to the install when the timer finished

    • cancel_event: Your user triggered the cancellation event before the timer finished.

    • stop: The trigger campaign has been stopped before the timer was finished.

    • no_pushtoken: Batch tried to send a notification to the install, but it didn't have a token. This may happen if users didn't see the opt-in prompt yet or didn't turn off push notifications on iOS.

    • pushtokennot_registered: The token attached to the install was not valid anymore when Batch tried to push it. This usually happens when users reinstall or uninstall the app.

    • query_mismatch: The install was not matching anymore the targeting of the campaign when the timer finished.

    Troubleshooting

    There are several points you should check if you don't find any installs matching your advertising ID (IDFA/GAID):

    • App restriction: Your app may not be able to collect advertising IDs. This happens frequently on iOS, especially if it doesn't displays ads.

    • Device settings: Check your device settings to be sure you didn't turn on limited ad tracking in Settings → Privacy → Advertising.

    • Batch integration: Make sure that the advertising id collection hasn't been disabled.

    Transactional API Debug Tool

    Batch provides a simple debug tool that lets the list of all the targeted push tokens for any given API call to the Transactional API. Go to ⚙️ Settings → Debug, select "Transactional" and input the token generated by the API on each successful call:

    The advanced analytics view gives you detailed information for a specific transactional push:

    • Sent: The total amount of sent push notifications.

    • Not Found: Number of Custom User ID or installation ID are not linked to any push token.

    • Undeliverable: Number of push tokens that were flagged as invalid by Apple/Google. Your app may have been uninstalled.

    • Errors: Number of APNS/FCM/WNS errors.

    Note that Debug is only relative to Push v1, which is siloed by platforms (iOS, Android, Web). CEP offers a richer cross-channel Profile view, described in Profiles section.

    debug
    hourly
    (UTC)
    . All you need to do is select a time period
    (no greater than 3 days)
    in the date picker. This is a great way to find out at what times during the day your users are the most receptive.

    Additionally, you can see how your userbase is distributed around the world in order to optimize your marketing strategies or decide in which language you should localize your next push notification.

    The counters per region displayed on the map are calculated based on the data collected at the first application start. If the user's region changes overtime or is overwritten, the counters will remain unchanged.

    Interpreting your statistics

    There are 5 metrics you should check daily to see how your app is performing over time and measure the impact of your push campaigns:

    DAUS

    "AVG DAUs" stands for average number of Daily Active Users. It's a basic metric that shows the average number of users who open your app on a daily basis.

    Pay attention to the evolution of your app's DAUs. They're a good indicator for seeing if the involvement of your users is increasing or if you need to send a push notification to re-engage them.

    The DAUs/Installs ratio is also a basic indicator to measure the ‘stickiness’ of your app. Depending on the category of your app, this ratio can vary between 15% or 30%.

    Installs

    Number of new installs over a period of time. Updates and reinstalls are considered as new installs.

    Bear in mind that users coming from an older version of your app and upgrading to a version with Batch's SDK (after a first release or a token import) are considered as new installs.

    Starts

    Number of times the SDK "starts" in your app over a period of time. The SDK starts every time a user opens your app.

    The starts/DAUs ratio can help you to measure the average number of sessions initiated by your users.

    Push

    Total number of marketing and transactional push notifications sent over a period of time. Click on the Notifications tab if you want to see a full report on your push strategy (global open-rate, global re-engage rate, etc).

    Revenue

    Income generated in your app. Make sure you are sending custom data on transactions to see this indicator.

    Uninstalls

    Number of invalid tokens deleted daily, based on the feedback received from the platform push services (e.g. APNS on iOS, FCM on Android, etc). Tokens are considered invalid when users uninstall the app or clear your website data (web push notifications only). Batch receives these feedback every time a token is targeted by a push campaign. You may notice an increased number of uninstalls on days when you send many campaigns, as Batch will receive more feedback from the push services.

    Rolling MAU

    "MAU" stands for Monthly Active Users. It shows the number of users who opened your app at least once in the last 30 days.

    audience tab
    smart segments
    Project General
    detailed reach
    reach global
  • Last update: Date of the last update.

  • If a single Email in your audience is linked to multiple profiles, Batch will initially target all of them.
  • However, due to Batch's standard email deduplication, only one profile will ultimately receive the communication. This might not be the 'primary' profile, but this is considered acceptable, as clients should ideally manage a clean, one-to-one email-to-profile database.

  • Multiple Installs per Profile:

    • If you upload only one Install ID for a profile that has multiple installations, the communication will be sent to ALL installations linked to that profile.

  • audiences
    Profile ID

    The profile ID is a unique ID automatically generated by Batch.

    Installation ID

    The installation ID is an anonymous ID generated by Batch the first time users open your app or your website. That ID changes each time users reinstall your app or web session data is wiped. If a users visit your website from the same computer, using different web browsers (e.g. Chrome, then Firefox, then Microsoft Edge), Batch will attach visits to different installation IDs. A profile can store up to 50 installation IDs.

    Custom ID

    The custom user ID is a native field you can use to attach a unique user ID to a profile. That ID will act as a reconciliation identifier between Batch Profile base and your own backend.

    Attributes

    Native attributes

    They have preset names and formats and are designed to capture common and essential information about profiles. They can be automatically collected by Batch (e.g. app version after SDK implementation)

    Custom attributes

    Any attribute specific to your needs and industry that is relevant to better target profiles and personalize messages (e.g. a loyalty status)

    Events

    They are used to trigger automations and refine targeting (eg. add_to_cart event)

    Note that when a mobile device is offline, data can still be captured by Batch SDK and push to Batch later when the connexion is back.

    How to create a profile?

    Batch automatically generates new profiles in 3 scenarios:

    • When a user starts your app or visits your website for the first time

    • When the Profile API is called with a Custom ID that isn't yet known to Batch

    • When a Custom ID is set via SDK, and this Custom ID isn't yet known to Batch

    Developers do not need to explicitly declare the creation of a new Profile. Batch handles this process automatically, either updating an existing profile or creating a new one based on the data set via API or SDK.

    Each profile has a unique profile_id generated by Batch. Other identifiers can be linked to it depending on its position in the lifecycle:

    • Custom ID: The custom ID is a native field you can use to attach a unique user ID to a profile. That ID will act as a reconciliation identifier between Batch Profile base and your own backend. It can only be attached to 1 profile at a time.

    • Installation ID: The installation ID is an anonymous ID generated by Batch the first time users open your app or your website. That ID changes each time users reinstall your app or web session data is wiped. Think about it as a device identifier that can travel from one profile to another depending on login/logout actions on your app or website. It can only be attached to 1 profile at a time.

    Anonymous Profiles

    Before you identify a profile with a Custom ID, Batch generates an anonymous profile.

    The installation ID that triggered the creation of the profile is attached to the Profile.

    Anonymous profiles are reachable via push notifications once they opt-in.

    Logged-in Profiles

    Logged-in Profiles are Profiles with a Custom ID that has been shared:

    • via Profile API with any attribute update or event tracking

    • via SDK with the identify method

    Logged-in Profiles are reachable via email, push notifications and SMS.

    What happens when setting a Custom ID on an anonymous profile?

    The profile lifecycle in Batch is closely aligned with real-life user interactions. Understanding how data is stored against profiles can be clarified by examining common user actions: sign-in, login, and logout.

    Sign-in

    Definition: This occurs when you set a Custom ID that is not yet known to Batch.

    Process: The Custom ID will be assigned to the initial profile, and all previously collected data will be retained within this profile.

    Login

    Definition: This happens when you set a Custom ID that Batch already associates with another profile. This situation can arise if the user has previously logged in on another device or if data was sent via the Profile API using this Custom ID.

    Process: The anonymous profile will become orphaned, and all installations will be linked to the already existing profile. To transfer attributes from the anonymous profile to the logged-in profile, resend data via SDK after the identify call. Events that have been collected during the anonymous session will be reattributed to the identified Profile (last 3 months of events for apps and last month of event for web, with a limit of 10,000 events).

    Orphaned Profiles

    Definition: Orphaned Profiles are profiles that lack both Custom IDs and Installation IDs. This happens after a login from a previously anonymous profile.

    Process: These profiles become unreachable and are excluded from all dashboard analytics and exports.

    How are attributes reconciled on Profiles?

    The majority of attributes on Profiles are reconciled using the "last update rule". This means that the most recently written value for an attribute will be displayed in the Profile view and used for targeting and personalization purposes, regardless of the attribute's source (SDK or API). This rule applies to:

    • All custom attributes

    • Email address

    • Phone number

    • Marketing email subscription status

    • Marketing SMS subscription status

    Exceptions

    Certain native attributes follow different priority rules when being reconciled. These exceptions are as follows.

    Region and Language

    Priority order:

    1. Set via API

    2. Set via SDK

    3. Automatically collected by the SDK

    Timezone

    Priority order:

    1. Automatically collected by the SDK

    2. API set

    GDPR & Privacy

    Profiles are compatible with the GDPR API, as well as all privacy requests made from the dashboard. To respond to privacy requests (data export and data deletion), Batch finds the Profile that matches the identifier in the privacy request and follows standard identity resolution process.

    It means that when a data request is made with an Installation ID, Batch will not be able to find a Profile that holds this Installation as well as a custom user ID. To read or delete a logged in Profile (with a custom user ID), it is necessary to provide its custom user ID in the privacy request.

    Event retention

    Events tracked by SDKs or the Profile API are stored and can be used for targeting for 1095days (3 years) by default. Contact the support to customize this policy.

    Inactive profiles

    Profiles that have not been active for a certain period of time are classified as inactive and deleted.

    What is an inactive profile?

    A profile will be considered inactive if no activity is detected for it for a certain period. By default, the period of inactivity is set to 390 days. You can reach out to your Customer Success Manager to shorten this period.

    Activity on a profile may be:

    • Data sent from a mobile application or website via Batch SDKs. Example: an open or a visit, change of opt-in status for push notifications, custom attribute or event tracking, etc.

    • Custom data tracking via Custom Data API or Profile API

    • User event tracking via Trigger Events API or Profile API

    • Upload or update of email subscription information via Profile API, Email Subscription API or mobile and web SDKs. Example: modification of email address, update of opt-in status for email marketing, etc.

    • Engagement events with emails received: open or click.

    What is the impact of these deletions?

    Once a profile's data has been deleted, it can no longer be targeted by all messages based on the Profile based data model. This implies email, SMS, and push V2 messages.

    If an activity takes place for a user after their profile has been deleted (e.g., a user returns to the application 14 months after their last activity), a new profile will be created for them.

    This behavior is consistent with the profile lifecycle management in Batch. When a profile is deleted due to inactivity, the system essentially "forgets" about that user. Upon the user's return and subsequent activity, Batch treats them as a new user, creating a fresh profile to store their data.

    This page applies to the data lifecycle of Profiles that powers email, SMS, and Push v2 channels.

    First, you need to give a Name to your Campaign.

    • A draft Campaign cannot be saved if it has no name.

    • The name is how you are going to be able to distinguish the Campaign from the many others you are going to create, so try to be as specific as possible.

  • In addition to the name, you can also attach labels to your Campaign.

    • On the dashboard, just click on the “Add labels” button on the right of the Campaign name section to choose and associate up to 5 labels to your Campaign.

    • You can also attach one or several labels to a Campaign created from the Campaign API.

    • Labels have two main purposes:

      • Marketing pressure limit: You can set a specific marketing pressure limit on all the Campaigns attached to the same label (e.g. no more than 1 push a week for all campaigns using the "onboarding campaigns" label). You will find more information here: .

      • Filtering: You can filter your Campaigns listing based on the labels attached to your Campaigns (e.g. "onboarding campaigns"):

  • Then you need to specify your Targeting; to which profiles you want to send your message to. You will find more information on the targeting section.

  • After this, you have to define your Timing; when you want your users to receive your message. You have 2 options:

    • Now: Use it to send your message as soon as you click the "SEND" button.

      • Be aware that, with this option, the timezones of the profiles will not be taken into account.

    • Scheduled: Use it to schedule your message in the future based on each profile's local time or on Universal time (UTC).

      • Profile's local time: Use it to make sure your message will be received at the same hour in every timezones.

        • For example, if your Campaign is scheduled to be sent on Friday, July 19th at 6pm, your American, French and Chinese users will receive it on Friday, July 19th when it's 6pm in their country.

        • A Profile's local time Campaign can take up to 24 hours to be completed according to where your users live.

  • Finally, you need to compose your message. You will find more information on the message section.

  • Managing a Campaign

    Stopping a Campaign

    • A Universal time (UTC) Campaign cannot be stopped after sending.

    • A Profile's local time Campaign can be stopped, however, stopping this Campaign only cancels it for users located in timezones that have not yet reached the scheduled sending time.

      • For example, if the Campaign is scheduled for 2PM (local time) and is canceled at 3PM UTC, a targeted user located in the US (UTC-4) will not receive that Campaign.

    Modifying a Campaign

    • A Campaign can be modified until it is completed.

    • You can modify its targeting, timing and/or content.

    • If your Campaign is scheduled to be sent at a later date, or in other words if the sendings have not started, all your changes can be taken into account.

    • However, if sendings are already in progress, all the people concerned by these sendings, will not be affected by your changes. Changes will only be effective for sendings that have not yet started.

      • We advise you not to modify your Campaign when sendings have started to avoid errors. This particularly applies to local Campaigns.

    Deleting a Campaign

    Any deletion is definitive, you will no longer be able to access your Campaign.

    Understanding Campaigns listing

    All the Campaigns you have created since the project was created are available on the listing.

    From the Campaigns listing you can:

    • Filter the listing by:

      • Date: Filter campaigns that were active over the period, meaning sends occurred between the two selected dates.

      • Status: Draft, Planned, Stopped, Completed.

      • Channels: Email, SMS, Push.

      • Labels: All CEP labels attached to the project.

        • You can select several options for each filter and combine filters.

    • Access quick actions that adapts to the Automation status (by clicking on the three dots buttons):

      • If in draft:

        • Edit Campaign.

        • Run Campaign.

    • Access key metrics:

      • Delivery: number of sent

      • Interaction: percentage of opens

    • Access key dates related to a Campaign's status and content by hovering over the status icon on the listing page or within the Campaign form:

      • Created at: The date and time the Campaign was initially created (i.e., first saved).

      • Last edit: The date and time the Campaign's content was last modified since its creation.

      • Currently {Campaign status}: The Campaign's current status (e.g., Draft, Planned, Sending, Stopped, Completed) and the date/time it entered this status (this does not apply to the 'Completed' and 'Sending' statuses).

    • Export your Campaigns Analytics (by clicking on the “Export” button).

    • Search a specific Campaign.

    What is explained on this page is focused on how Campaigns works for Email, SMS and Push v2 channels. For Push v1, the behavior is slightly similar with the main difference that it works by platform (iOS, Android, Web).

    campaign list
    You can choose between five formats:
    • Fullscreen

    • Banner

    • Modal

    • Image

    • WebView

    Customize your theme

    Themes are fully customizable, including:

    • Background and text colors

    • Header, title, and image

    • Number of CTAs

    • Overall layout and appearance

    Once your theme is ready, you will be able to select it from the dropdown menu during the "Message" step when setting up your campaign. (See: In-App - Part 4 - Editing Your In-App Campaign Message)

    Create your In-App automation

    Now that your theme is ready, go to Automations > iOS or Android > Create a New Campaign:

    Name your In-app automation and set up targeting

    Just like with a push campaign or automation, you can define the audience targeting conditions.

    If you’re using dynamic targeting (e.g., opt-in status), enable "Re-evaluation just before display" to ensure the SDK recalculates the audience in real time before the message is shown.

    Set the trigger action

    This is the user action that will cause the message to be displayed:

    • Choose from any tagged and tracked event collected by the Batch SDK

    • You can also set:

      • Priority: if multiple campaigns use the same trigger, set which one takes precedence.

      • Capping (optional): limit how many times a user can see this message.

      • Grace Period (optional): define a minimum delay between two displays of the same campaign.

      • Start/End Date: schedule your campaign’s availability window with start and end times.

    Customize the message and CTA behavior

    Now it’s time to craft your message 🌟

    Select a theme for your In-App message using the dropdown menu:

    Fill in the content for your campaign: title, body text, visuals, etc.

    Define the behavior of your Call-to-Action (CTA):

    • Choose what the CTA should do:

      • Redirect to a URL or screen

      • Trigger a smart re-opt-in

      • Copy something to the clipboard

      • Open the rating popup

      • …and more

    You can also attach secondary actions to the CTA, such as:

    • Tracking an event

    • Adding or removing a tag

    These secondary actions can later be used in audience segmentation or as future triggers.

    And that is it! With these steps, you are ready to launch personalized, real-time In-app automations that engage users exactly where they are: inside your app ✨

    Targeting: full base or fine-tuning segmentation, through native targeting or custom data;

  • Timing: sending time that can either be now or scheduled;

  • Message: the content of the campaign that will be sent to the user.

  • First, go to your Batch Dashboard and go to Automations > New automation > Select the channel of your choice (Recurring Email, Push or SMS), and name it to start a new automation:

    Optional: you can add labels to your automation (up to 5):

    Labels serve two main purposes: they allow you to set a marketing pressure limit across all campaigns/automations sharing the same label, and they enable you to filter campaigns/automations based on their assigned labels.

    Then, let's set up your recurring automation! 💪

    Targeting

    The targeting block is where you will define the segmentation of your automation.

    By default, Batch considers that you will target your entire audience. First, you can select a specific country or language.

    Then, you can refine your segmentation through different options, by clicking:

    Add Conditions

    From then on, you will be able to select native targeting elements but also profile attributes (data specific to your app business and selected thanks to the tagging plan).

    You can add up as many conditions as you want, and create specific scenarios by clicking on 'AND/OR'.

    Use Segment

    It will allow you to call Segments as blocks in the targeting and combine segments (inclusions and/or exclusions) by calling up to 10 segments in your targeting:

    When a segment is linked to an orchestration, you can access / view the segment by clicking on the eye icon 👀

    Use Audience

    You can add a specific Audience to your communication:

    Play with AND/OR option

    You can add up as many conditions as you want, and create specific scenarios by clicking on 'AND/OR':

    💡 Let's take the example of a recurring automation to wish users happy birthday with a nice message like; "Happy Birthday 🎁 Celebrate your special day with 20% OFF – just for you!". This automation is to be sent based on user's birth date.

    Here's what automation targeting should look like:

    Timing

    Now that we know who to send your communication to, let's define when to send it!

    First, set up the date and the hour of the first sending of the automation, and then the end date if needed:

    You can choose to send your on Local time or Global time (UTC):

    • The Local Time option lets you send a message that will be received at a given time according to the user’s time zone. This ensures that marketing efforts target your users at a uniform time.

    • On the other hand, the Global Time (UTC) option allows you to send a message to your users at a specific UTC time regardless of their location.

    Finally, let's define the frequency of the automation!

    Depending on your automation goal, you can adapt the frequency of sending between days, weeks, and months.

    It is also the time to set up a capping rule if you want to limit the number of times a user will receive your automation:

    Message

    Message editors vary from one channel to another. To learn more about composition, visit the following sections:

    Run your Recurring Automation

    Now that your recurring automation is ready, you can either run it or keep it as a draft and launch it later 🌟

    Once your campaign is live, you can track its performance in the Analytics section.

    Preheader (optional)

    Body: Designed with Batch Email Composer or uploaded as HTML

    All fields use personalization, except the sender address, which must be selected from predefined options set in the Settings.

    Header information

    Email Sender

    The sender name and address appear as the source of the message.

    • Email senders are categorized by orchestration type (marketing or transactional) and are defined in the Settings.

    • Learn more about configuring email senders here.

    Custom Reply-To

    By default, replies to your email are directed to the sender’s address. You can specify an alternative reply-to address if needed.

    Subject

    The subject line is the first thing recipients see. Make it engaging by incorporating personalization.

    Preheader

    The preheader appears next to the subject line and is, by default, the beginning of your email body. You can override it to display relevant and concise text.

    Email Body

    You can create your email body using one of the following methods:

    1. Email Composer

    Batch’s Email Composer, powered by Stripo, allows you to design emails from scratch. Existing templates or modules can also be re-used

    Helpful resources:

    • Stripo Education Portal

    2. Upload HTML Template

    If you have a pre-designed email template, upload it directly.

    • See the guide:

    Preview Options

    Preview your email in both Desktop and Mobile modes to ensure proper rendering across devices.

    Send a Test

    • Test emails include "[TEST]" at the beginning of the subject line for easy identification.

    • The list-unsubscribe header is not included in test emails.

    • Other behaviors are similar to test messages across all channels. See more details here.

    Opt-in Management

    Unsubscribe Link

    You must include an unsubscribe link in Marketing emails. Learn how to add one with

    When a recipient clicks the link:

    • They are unsubscribed from your marketing emails.

    • Recipients are redirected to a personalized landing page. See how to proceed in.

    Suppression Rules

    Batch maintains a suppression list with the following policies:

    • Hard Bounces: Any email address that hard bounces is put on the suppression list for both marketing and transactional emails.

    • Soft Bounces: After 5 consecutive soft bounces on marketing emails, the email address is put on the suppression list for marketing emails only.

    Spam Complaints are treated as unsubscribes. The recipient’s marketing status is set to "unsubscribed," but their email is not added to the suppression list.

    Email Deliverability

    Batch offers extensive resources on email deliverability, sender reputation, and warm-up strategies. Access these resources in .

    .
  • Sending: The message is in transit. Delivery confirmation may take time, especially if you’ve chosen a low send rate .

  • Sent: The message has been successfully sent by Batch.

  • Delivery metrics

    Email

    • Sent: The message was dispatched by Batch.

    • Delivered: The email was successfully accepted by the recipient's email server.

    • Opened: The email was opened, this rate can be seen with and without machine opens (for instance due to Mail Privacy Protection). The open rate is calculated by dividing the number of email opens by the number of emails delivered.

    • Clicked: At least one of the links in the email has been clicked. Batch unsubscribe links are not taken into account. The click rate is calculated by dividing the number of emails clicked at least once by the number of emails delivered.

    • Bounced: Delivery failed. The bounce rate is calculated by dividing the number of email bounced by the number of emails sent. Detailed explanation about Bounces available here. For a detailed explanation, refer to .

    • Unsubscribed: The recipient opted out via the List-Unsubscribe header or Batch unsubscribe link. The unsubscribe rate is calculated by dividing the number of email that led to an unsubscription by the number of emails delivered.

    Push

    • Sent: The message was accepted by the push provider (Apple or Firebase(Google)) for a specific device installation.

    • Sent opt-in: The message was accepted by the push provider (Apple or Firebase(Google)) for a specific opt-in device installation. We recommend tracking this metric as pushes sent to opt-out devices are unlikely to be seen, making sent opt-in a more realistic indicator of deliverability.

    • Opened: The recipient opened the notification or was influenced to open the app/site. This metric includes both direct opens (user taps/clicks the push) and influenced opens (user opens the app/site within 3 hours after receiving the push). The open rate is calculated by dividing the number of unique opens (direct & influenced) by the number of sent opt-in. Influenced opens are only available for messages sent after August 1st 2025.

    • Opened directly: A complementary metric showing only direct opens (taps on the push notification).

    • Bounced: Delivery failed, often because the app was uninstalled or other errors occurred. The bounce rate is calculated by dividing the number of bounces by the total number of messages injected into the push provider (where injected equals sent plus bounce).

    Push analytics can be filtered by platform type: Web Push, Mobile Push, or specific platforms like Android or iOS.

    A profile with multiple devices (e.g., phone, tablet, computer) may receive multiple notifications, resulting in more sent messages than targeted profiles. Each interaction (open, unsubscribe) is recorded independently. For example, if a profile receives and opens the push notification on both their phone and computer, the dashboard will reflect 2 sent messages and 2 unique opens.

    In case your push notification redirects to a Mobile Landing (see In-App & Mobile Landing), Mobile Landing metrics can also be available:

    • Clicked: The number of clicks on any button within the In-App message, excluding clicks on buttons configured with a “Dismiss”. This metric does not include other dismissal methods like clicking the top-right 'X' button or swiping.

    • Click rate: total of clicked messages divided by the total of displayed Mobile Landings. For a push orchestration with Mobile Landing, the number of displayed Mobile Landings should be equivalent to “Push Opened” ones apart from rare exceptions (user opens its push in airplane mode, etc.)

    The metrics above are the ones of Push v2. Push v1 that is siloed by Platform (iOS, Android, Web) offers comparable push specific metrics and other ones such as uninstalls or reengaged, that are fully described in the interface.

    In-App

    • Delivered: The in-app was successfully displayed to the recipient who may then either click on a CTA or dismiss it after reading.

    • Clicked: The number of clicks on any button within the In-App message, excluding clicks on buttons configured with a “Dismiss”. This metric does not include other dismissal methods like clicking the top-right 'X' button or swiping.

    • Click rate: Total of clicked messages divided by the total of delivered In-App.

    SMS

    • Sent: The message was dispatched by Batch.

    • Delivered: The message successfully reached the recipient's phone number.

    • Clicked: SMS URL shortening and tracking must be enabled to track clicks. At least one of the links in the SMS has been clicked. The click rate is calculated by dividing the number of SMS messages clicked at least once by the number of SMS messages delivered.

    • Bounced: The message could not be delivered due to issues like:

      • Absent subscriber: The phone is turned off or out of network coverage.

      • Unknown subscriber: The phone number is inactive.

      The bounce rate is calculated by dividing the number of SMS bounced by the number of SMS sent.

    • Unsubscribed: The recipient opted out by replying with the appropriate STOP keyword. The unsubscribe rate is calculated by dividing the number of SMS that led to an unsubscription by the number of SMS delivered.

    Integration issue: If you still don't see any stats for your app 24h after changing the API key, you should follow again the basic setup of the SDK.

    The number of installs is too low after my first update with Batch

    This can happen for several reasons:

    First session

    Your users need to open the app once after updating it to a version built with Batch. Batch will place them in the NEW segment and retrieve their device token so you can send them a message right away.

    The number of installs/push tokens will increase progressively the first week, as your users migrate and make their first session.

    Token imports

    If you’re coming from another push provider, you may need to import your push tokens and send a notification to your old users to accelerate the transition. Make sure you don't target the new segment the week following the integration of Batch in your app.

    The number of installs is different from my other tools

    The reason data on Batch and your usual analytics tool or app store analytics may differ slightly, is that Batch may use different methodology and metrics to process and display the stats (timezones, data collection method, etc).

    If the difference is too big be sure Batch runtime is integrated correctly.

    Feel free to ping us at support@batch.com or if you have any other questions on your analytics.

    I'm wondering how often are the analytics refreshed

    Audience tab

    The Audience tab is the first screen you see when you click the Analytics tab (more information here). Daily Active Users, installs, starts and the revenue shown on the Overview tab are refreshed daily, at 12:00 PM GMT.

    Notifications tab

    The analytics shown on the Notifications tab is refreshed in real-time for the current day.

    Note that the reengage rate and the repartition between influenced and direct opens are based on an estimate, which is recalculated within a few days after the campaign has been sent.

    Userbase tab

    The userbase tab gives you a complete overview of your current userbase (more information here). There are two kinds of data displayed on the Userbase tab:

    Basis statistics

    The number of installs and tokens are refreshed in real-time:

    Native and custom data

    The data is refreshed daily, at 12:00 PM GMT. Please note new custom attributes sent from the Custom Data API may take up to 24h to appear on the dashboard.

    Displayed: Total number of unique devices that have already displayed the message.

    Automation analytics

    Automation analytics exports can be downloaded from the dashboard. The export is in the form of a CSV file containing automations metrics, settings, and much more. It allows you to filter your automations' metrics & data to include in your export. These exports are available from the In-App tab.

    For example, you can:

    • Analyze In-App automations performance

    • Compare automations metrics by label, type, source, country, etc.

    • Run in-depth analysis thanks to the extended data exported: sending time, targeting type, message content, etc.

    • Etc.

    Set your export from the Automations list

    First, click on "Filter" and select the status, date range, and labels of automations. Click on "Apply filters" button to save your choices.

    Then, click on "Export" button on top of the last column.

    Export filters

    Before downloading the CSV Export, you can specify the granularity of your export. By default we are exporting the automations corresponding to the filters you selected. You also have the possibility to export directly the metrics for all your automations by checking "All automations" button.

    Automation’s metrics & data

    All exports automatically contain essential data by default:

    • Essentials metrics represent all the metrics available in your CSV export by default, they are always included. Here is the list of the metrics: token; source; status; label; automation name; device synced; display; clicks; 1st button; 2nd button; close.

    In addition to the default export data, you can add additional data:

    • Extended data allows you to enrich your CSV export with the following automations setup information: start date (recurring and trigger); end date (recurring and trigger); smart segments; country; custom audience (YES/NO); languages; targeting applied (fullbase or custom targetting); trigger event; message; format; button 1 action; button 2 action; global action; tracking id.

    Split data

    You can choose the level of granularity of your CSV export. The automation granularty is always selected, you have the possibility to go further in the granularity of your CSV export by choosing to split the data by days.

    Advanced analytics

    Similarly to push automations, the Analytics button will let you see more detailed statistics about your automation.

    Let's dive into the details of the available statistics here:

    Summary

    • Devices synced: number of unique devices that were targeted by the automation and have downloaded, or synced the automation locally. This is not the number of displayed of the In-App, see below.

    • Displayed: number of times the message was displayed.

    • Clicked: number of clicks on one of the buttons of the In-App automation. The top-right 'X' close button is not included in this total.

    • Click rate: total of clicked messages divided by the total of displayed messages.

    Performance

    The performance section will run you through the results of your automation, from the number of displayed messages to click distribution.

    • Displayed: Number of times the message was displayed.

    • Clicked 1st/2nd button: Number of clicks on the message's buttons. Hover over the tooltips to read the content of the buttons in your message. (Fullscreen, Banner and Modal formats only)

    • Close: Number of clicks on the native close button.

    • Buttons: WebView format only - Total number of clicks on the message’s buttons. Click “See clicks details” to get the clicks and click rate per button.

    Daily statistics

    The histogram view allows you to compare visually two metrics of your choice on a given time range. You can also choose the array view to see all the metrics at once:

    • Displayed: Number of times the message was displayed.

    • Clicked: Number of clicks on one of the message's button.

    • 1st / 2nd button: Number of clicks on the 1st / 2d button of the In-App message.

    Header Informations

    First, you will need to define your header information with:

    • the Sender which is the email address and name that will appear as the sender of the message

    • the Reply to field (optional)

    • the Subject of your message.

    Create the body of your email

    1. Design your message with our Email Composer

    Batch allows you to create an email from scratch through our Email Composer.

    1. Upload your HTML template

    If you have a template ready to be used, you can upload it here!

    Multi-language

    You can also create multiple versions of a message, one for each language, by clicking Multi-language, ensuring that profiles receive the message in their own language:

    When adding a new language version, the default version will be duplicated, keeping your format options, images, and other elements intact, so you only need to edit the text that requires translation.

    A default version will be sent to profiles that don’t have a message already specified in their language.

    A/B Test

    You can A/B test your email! Here's how:

    • Enable the feature by toggling the switch at the top right of the Message section.

    • Create variants: You can create up to four variants, either by duplicating an existing one or starting from scratch:

    Testing your email message

    1. Directly in your inbox

    Now that your message is written and ready to captivate your readers, you can test how it looks on your device!

    Use the Send test button on the email message window and type your email address:

    If you want to reach more than one address, don't forget to separate all of them with a comma:

    The email is immediately sent! ✨

    We recommend sending tests to different email clients (Apple Mail, Thunderbird, etc.) and mailbox providers (Gmail, Yahoo, Outlook, etc.) to make sure your message is well displayed on all of them.

    1. Test your user data directly on Batch

    It is possible to preview the dynamic data of your email using the "Preview As" feature. To do so, use your custom user ID (or one of your users), then enter it in the dedicated field:

    You can also send this email, filled-in with the personalization data of the selected profile, using the 'Send test' feature as shown above.

    🚀 Your first email campaign is now ready to be sent! Click on the 'Save and run' button at the bottom of the form to activate it or save it as a draft and come back later.

    Campaigns creation

    For both migration types, you need to create in parallel:

    1. A campaign targeting the imported tokens, with the previous provider's payload

    2. A campaign targeting the rest of the userbase, without the previous provider's payload

    Targeting imported users

    After we’ve completed your tokens import, a new filter will be available:

    1. Imported tokens only, which are the manually imported tokens, not yet detected by our SDKs

    2. Collected tokens only, which are the tokens already collected through the Batch SDK

    Refer to the Targeting section to know more about this segmentation feature.

    There are a few things you need to keep in mind before targeting your newly imported users:

    • The Imported tokens only filter is not targeted by default when you create a new campaign. Don't forget to select it the next time you want to send a notification.

    • The first time you send a notification to your imported users, Batch will clean the inactive or invalid tokens that may come from your previous push provider. Depending on how many invalid tokens we find, the number of imported tokens will decrease a few days after the import.

    If you select the Imported tokens only filter, you must include the previous provider's payload in your campaign to contact your users correctly (more details here).

    Campaigns statistics

    The campaign statistics are provided by the Batch SDK. This is why you may notice that the campaign statistics are not available for campaigns that target users who don’t have Batch SDK.

    Imported tokens and APIs

    The imported tokens can be targeted via the (via "Filter push tokens" or through Audiences if you have imported the Custom User ID with the push tokens).

    Your API-scheduled notifications can be migrated in the same way as described above.

    You can find more details in our Data lifecycle documentation.

    Anytime you target the imported tokens (even when using the API), don't forget to include the previous provider's payload.

    migration type

    Push

    A Push notification is a message sent directly to your users' smartphones at the moment you choose. It’s a powerful communication channel on iOS and Android, helping you engage with your customers and prompt them to take action.

    This guide will walk you through composing your Push message. Let’s get started! 🚀

    Compose your Push message

    Before composing your message, the first step is to decide which platform(s) you want to send your push notification to:

    • iOS & Android – mobile apps.

    • Web Push – For browser-based notifications (mobile and desktop).

    • All platforms – If you want to reach your audience on mobile and desktop

    Add message

    Once you've selected your platform(s), it is time to bring your message to life ✨

    This is the most crucial part of your notification — it’s what captures attention and drives engagement.

    • Title: Keep it short, human, and relevant. Your title should grab attention instantly while staying concise.

    • Body: Be clear, concise, and actionable. The body text expands on the title and tells users why they should tap.

    You can (sparingly) to add visual appeal 🌟

    Add personalization

    Personalized push notifications feel more relevant and create a sense of direct communication with the user. Make your message feel personal by !

    This grabs attention, but it also builds trust and increases engagement.

    All you need to do is to click the {...} Insert variable button next to the title or the body of your message and pick an attribute:

    Add Media

    A great push notification isn’t just about text — visual elements like icons and media can increase visibility, engagement, and click-through rates! When used correctly, they help your notification stand out in a crowded notification tray.

    You can include an image to appear in the expanded version of the notification — ideal for promotions, visuals, or content highlights:

    A/B Testing

    You can your push notifications! Here's how:

    • Enable the feature by toggling the switch at the top right of the Message section.

    • Create variants: You can create up to four variants, either by duplicating an existing one or starting from scratch:

    Variants work with the multi-language functionality, so you can easily combine both!

    Multi-language

    You can also create multiple versions of a message, one for each language, by clicking , ensuring that profiles receive the message in their own language:

    When adding a new language version, the default version will be duplicated, keeping your format options, images, and other elements intact, so you only need to edit the text that requires translation.

    A default version will be sent to profiles that don’t have a message already specified in their language.

    Define the on-click action

    What should happen when a user taps the notification?

    Choose from:

    • Redirect to app

    • Open deeplink: you can add a redirection link towards a page of your app, your website, a landing page, or stores.

    In the second option, you can choose to use the same deeplink across all platforms, or define separate links for iOS, Android, and Web by clicking on "Split by platform" to ensure users are redirected to the most relevant destination based on their device:

    Advanced settings

    In the Advanced settings section, you can add an and .

    Testing your push

    1. Directly in your notification center

    Now that your push message is ready to be sent, you can test how it looks on your device!

    Use the Send test button on the push message window and add your or and click on Send test:

    The push is immediately sent! ✨

    💡 We recommend testing on various device types (iOS, Android, OS versions and screen sizes) to ensure your message displays correctly across all of them.

    1. Test your user data directly on Batch

    It is possible to preview the dynamic data of your email using the "Preview As" feature. To do so, use your (or one of your users), then enter it in the dedicated field:

    🚀 Your push is now ready to be sent! Click on the 'Save and run' button at the bottom of the form to activate it or save it as a draft and come back later.

    Orchestration analytics

    Orchestration Analytics provides an in-depth view of how individual orchestrations perform, offering detailed insights and tailored metrics for each channel.

    Key features

    Channel-specific metrics

    Metrics for the selected orchestration are displayed based on the chosen date range and filters, such as:

    Date range

    By default, analytics for Trigger and Recurring Automations show data for the past 7 days. The date range can be adjusted to match your analysis needs.

    Trends

    Trends compare current metrics with those from the previous period to let you detect and measure variations.

    A/B testing reports

    Campaigns and Recurring Automations with A/B tests have dedicated reports to compare the performance of each variant, helping you identifying the most effective one.

    In cases where a winner is selected (either manually for a Recurring Automation or using the Automatic Winner selection feature for a campaign), the dashboard will display two tables:

    • One with the variant results during the test period (we do not count opens and clicks that occur after the winning variant is selected).

    • One with the results of the winning variant after its selection.

    Detailed breakdowns

    Analyze specific subsets of the orchestration, such as:

    • Languages: For multi-language orchestrations.

    • Steps: For Trigger Automations with multiple steps.

    Exportable metrics

    From the orchestration listing page, you can export detailed performance data split by orchestration, step, and language. The default time range includes messages from the past 7 days but you can extend it up to the past 6 months. Reactions (open, click, etc.) within 5 days after sending are included.

    Trigger Automation specificities

    Trigger Automation dedicated analytics are described in .

    Email dedicated insights

    Email orchestrations include additional analytics tools to refine performance analysis:

    Mailbox provider report

    Breaks down key metrics by recipient mailbox provider to identify potential issues (e.g., spikes in bounces or unsubscribes) with specific providers. Non-identifiable providers are grouped under “Other.”

    Standard are displayed, in addition to Spam complaint. An email is flagged as spam when a recipient reports it to their mailbox provider, typically based on their personal judgment of content, send frequency, or relevance. This information is provided by most mailbox providers, but notably not by Gmail or GSuite.

    In your reports, a spam complaint rate higher than 0.1% will be highlighted in orange as concerning, while a rate exceeding 0.3% will be highlighted in red, indicating a critical issue that demands immediate corrective action.

    Delivery report

    Displays how messages were categorized (e.g., Sent, Delivered, Bounced). Refer to the section for more details.

    Bounce report

    Tracks bounce trends over time and provides a detailed distribution of bounce reasons and bounces by mailbox provider. See additional detais in .

    Clicks per URL

    Analyzes the distribution of clicks among URLs. URLs are grouped algorithmically for easier visualization. To maintain a maximum of 50 distinct URLs, the algorithm first removes URL parameters and, if necessary, trims parts of the path. Alternatively they can be grouped by tags see more in.

    In-App & Mobile Landing dedicated insights

    In-App Actions distribution report

    This report is designed to help you understand how users interact with your In-App messages, providing valuable insights into the distribution of clicks and actions.

    The report details various user interactions within the In-app, which can include:

    • Dismissal actions, such as clicking on the close icon or other system-based dismissals (e.g., swiping the in-app away on iOS).

    • Auto-dismiss if the option is enabled, tracking instances where the in-app disappears automatically.

    • Clicks on buttons or images.

    For clicks on buttons or images, the report provides more specific information, including the button's label, the action configured behind it, and details related to that action (e.g., the specific deeplink URL or the text copied to the clipboard).

    When multiple languages are enabled, the button label from the default language version is displayed in the report for aggregated actions. However, if different language versions of the same button trigger distinct underlying actions, each unique action will appear as a separate row, with non-default actions showing the label from their respective language version. Furthermore, as Call-to-actions (CTAs) may differ across A/B test variants, their performance data is segmented and presented in dedicated sections or tabs for clear comparison.

    If the In-app message is edited, please note that modifications are propagated to user devices only after synchronization. This means that for a given period, some users may still see the previous version of the in-app while others have already accessed the new one. This overlap can explain why analytics data for that period may include interactions with both the old and new versions.

    Overview

    In-App messages are messages displayed inside your app. You can trigger them when users open your app or as contextual reminders when they perform a specific action (e.g. tapping a button, browsing a page, etc).

    You can also trigger an In-App message after your users open a push notification, as a mobile landing page. This is great to communicate with all your users, even with users who have turned off push notifications.

    Batch's In-App messages allow you to cover a wide variety of use cases. You can use them to:

    • Boost your push opt-in rate, by triggering a message on a meaningful action and explaining why your users should turn on push notifications.

    • Increase conversion, by onboarding new users with special offers, recommending additional content to engaged users or reminding users they left items in their cart.

    • Optimise retention, by presenting key features of your app, app updates, and more.

    • Or simply communicate with all your users (e.g. scheduled maintenance, beta testing program, etc).

    We have been working on native formats that bring the same experience to all your users regardless of the OS they are using.

    Choosing the right trigger

    Batch allows you to trigger In-App messages in two different ways:

    • Mobile Landings: The In-App message is displayed as a landing page when users open your push notification. Here's how to add them to a push campaign.

    • In-App automations: The In-App message is displayed when users open your app or when they make a specific action in your app. The message can be displayed to users who are not opt-in for push notifications. This useful to communicate with your entire userbase or suggest actions when your users browse your app.

    Choosing the right format

    All Batch formats are highly customisable. You can tailor the overall layout of the In-App message, colors, image and button from Settings > Themes.

    Fullscreen

    Use the fullscreen format for all your important messages, such as an update reminders, a last minute offer or anything that deserve to interrupt the navigation. Fullscreen In-App messages are also useful for detailed announcement as they can contain more text and a picture. We strongly recommend that you use:

    1. Title: 15-35 characters.

    2. Body: 110-200 characters.

    3. CTA: Up to 18 characters or simple action words (e.g: visit now, later, sell it now).

    The fullscreen format is supported from the 1.10 version of the SDK (and higher).

    Banner

    Banners are useful to suggest actions while your users are browsing the app and avoid bothering them when they are making important actions. Use them to promote features of your app, suggest interesting content or additional items (e.g. premium delivery, related articles, etc).

    We strongly recommend that you use:

    1. Title: 10-25 characters.

    2. Body: 40-70 characters.

    3. CTA: Up to 18 characters or simple action words (e.g: visit now, later, sell it now).

    Banners are supported from the 1.11 version of the SDK (and higher).

    Modal

    The modal format is a good alternative if you need to show an important message to your users, without interrupting them with a full screen In-App message. Batch allows you to fully personalize your modal with several CTAs, an image and an auto-close timer.

    The modal format is supported from the 1.14 version of the SDK (and higher).

    Image

    The image format is useful if you want to use a 100% custom design or simply reuse an image your team already prepared for a marketing automation. Batch allows you to display a full screen image or to display it as a modal with a close button or an auto-close timer.

    We strongly recommend that you use:

    1. Title: 10-25 characters.

    2. Body: 40-70 characters.

    3. CTA: Up to 18 characters or simple action words (e.g: visit now, later, sell it now).

    The image format is supported from the 1.14 version of the SDK (and higher).

    WebView

    The WebView format is useful if you want to use content based on a custom responsive HTML page developed and hosted on your side, or based on a URL from a third-party tool. Batch allows you to include your custom design in a fullscreen or modal style.

    For more information, see this .

    The WebView format is supported from the 1.17 version of the SDK (and higher).

    How to implement and send SMS with Batch?

    A step-by-step guide on how to set up and start sending SMS with Batch from defining your campaign goals to sending them to your users.

    This is a step-by-step guide on how you can set up and start sending SMS campaigns using Batch. Whether you want to send transactional updates, promotional messages or engage your customers through texts.

    1. Define Your SMS Campaign goals

    Before launching any marketing or transactional SMS campaigns, it is important that you set clear goals. This will help shape your strategy, target audience, and messaging. It also provides known performance indicators through which you can track and measure the success of your SMS Marketing communications.

    • Your Marketing campaign goals may include: increasing sales, boosting customer engagement, driving traffic to your website, etc.

    • Your Transactional campaign goals may include: ensuring a smooth customer experience by providing instant updates on order processing, delivering important information, account alerts, appointment reminders, etc.

    2. Build a contact list

    Import contact information

    For each of your user profiles to be reachable via SMS, you need to make sure to include:

    → A phone number that conforms with the . (E.g. "+33182837140").

    → An SMS Marketing subscription status if you plan on running marketing communications through this channel.

    You can import your existing contact list and automatically sync new profiles by plugging Batch into your data sources:

    • Using our to sync profile data from your backend or other tools you might be using

    • Using our Mobile (iOS / Android) and Web SDKs to collect data from your mobile apps or website. This is useful if your users can set or update their notification channel preferences from your mobile app or website

    Note: Batch will automatically update the profile's SMS Marketing subscription based on feedback from mobile carriers. E.g. when the user unsubscribes by sending the STOP keyword.

    Enrich Profile data

    Sending personalized and well-segmented SMS Marketing messages is key to optimizing customer engagement and improving conversion rates.

    Enrich your contact list with profile data such as attributes or events and use this data to build your segments (e.g. using filters like location, past purchase behavior, or engagement history) and personalize your messages (e.g. including the recipient’s first name or last purchased item).

    Note: Batch's unified data model allows you to leverage Profile data to engage your users across all channels. Thus, if you already have an omnichannel project through which you run email or push notification campaigns, you may already have the necessary Profile data available for your SMS targeting and orchestration needs.

    A. Server side data

    Setting Profile attributes and tracking events via the

    B. Client side data

    Setting Profile attributes from the SDK:

    Tracking events from the SDK:

    Compliance

    You should ensure that explicit consent is obtained and stored for all contacts that wish to subscribe to your SMS Marketing campaigns in addition to providing an easy opt-out option in your messages (e.g. instructing your recipients to click on a link if they want to unsubscribe from your SMS Marketing communications).

    To facilitate your compliance, Batch will include a default unsubscription option when required by local guidelines. For instance, the "STOP" mention is always included in Marketing SMS messages sent to French phone numbers.

    3. Configure your sender settings

    First, you'll need to identify the countries you'd like to send SMS to among the list of countries Batch supports across Europe. This will help establish all requirements regarding your SMS Sender ID(s).

    Configuring a Sender ID (the name that appears on recipients' phones) on your Batch omnichannel project is necessary to send SMS communications.

    Batch allows you to enhance your brand visibility by setting your brand name (or a recognizable identifier) as a custom Alphanumeric Sender ID (Up to 11 characters).

    To ensure compliance with SMS-related laws and regulations in certain regions where Alphanumeric senders are not allowed, Batch will default to an authorized Sender ID format in those regions.

    To configure an SMS Sender ID on your omnichannel project, simply reach out to the Solutions Engineer in charge of your implementation or to our customer support team at .

    4. Setup and test your SMS campaigns

    All that is left to do is to create your first SMS automations or campaigns and test them as indicated in 👉 .

    You can also include SMS steps in your omnichannel automations as described in 👉 .

    Userbase

    The userbase tab gives you a complete overview of your current userbase, allowing you to elaborate new push strategies and understand how to best engage with your users.

    There are three kind of information you can see on your userbase:

    • Basic statistics: Total number of users, opt-in rate, etc.

    • Smart Segments: Distribution of your users in Batch Smart segments.

    • Native and custom segments statistics.

    Newly tracked attributes, tags and events are hidden by default. You will need to manually display them from the dashboard "Custom data" tab located in Settings section.

    Basic statistics

    There are 4 metrics you should check to see how your app is performing:

    Installs

    Total number of installs of your app since you released it with Batch SDK. This number includes users who still have your app on their device or who already uninstalled it.

    The number of users is updated in real time.

    Opt-ins

    This is the percentage of users who have opted-in to push notifications in your app or website.

    Number of tokens

    Appears on hover on "Opt-ins". The interpretation of this metric differs from an OS to another:

    Android

    On Android, Batch retrieves automatically the token of your new users. Users who have a token are users who still have your app on their device.

    iOS

    On iOS, the token collection can depend on the background refresh. You can go in Xcode and see if "Remote notifications" is checked as a background mode in your app's Capabilities to see if it's enabled.

    • If enabled: Batch collects tokens for all your users, even for those who choose not to receive push notifications. In this case, users who have a token are also users who have your app on their device.

    • If disabled: Batch only collects tokens for users who opt-in for push notifications. In this case, users who don't have a token are users who didn't accept notifications or uninstalled your app.

    Please note that users can disable background refresh for your application so these stats may be imprecise.

    Smart Segments

    Smart Segments are automatically created by Batch using a proprietary algorithm. They let you visualize precisely who is using your app, and who is not, who is buying your product, and who is churning away.

    Our algorithm analyses the sessions of your users from the moment they install your app and put them in 4 different segments. Here is a short definition of every segment:

    • New: Newcomers to your app that haven't yet established themselves as engaged, lasting users.

    • Engaged: Congratulations! These users are actively using your app.

    • Dormant: These promising users haven't used your app in a while. Reengage them!

    • One-time: Users that have had your app for a while but have only opened it once.

    We are also showing the predictive and intermediate Smart Segments that our algorithm calculates:

    • Risky Engaged: Users with a high risk of becoming dormant in the next days if you don’t re-engage them with a targeted notification.

    • Promising New / Dormant users: Users who are about to become engaged. Don’t miss the opportunity to send them a message!

    Batch also shows the number of imported tokens who haven't been reintegrated to Batch Smart Segments yet.

    You will find more information on Smart Segments targeting .

    Native & Custom attributes

    Batch's userbase analytics also allow you to see how your users are distributed in the different segments of your app.

    Native attributes

    These segments are built automatically using data from users’ devices. This data is very practical to:

    • Region / Language: Localize the content of your push notifications in a specific language.

    • Custom user identifier: See how many users are logged in in your app.

    • OS version / App version: Invite your users to update your app if an important part of your userbase is still using an old version.

    • Device type: Keep supporting an old model of Android/iOS device.

    See to know more on Batch native attributes.

    Custom data

    Batch allows you to create your own segments based on custom data (attributes, collections of tags and events). This is useful to see what your users are doing in your app, which feature they are using the most and more.

    All you need to do is to tag your app first. Then you will be target these specific segments from the dashboard or the API.

    SMS

    An SMS orchestration requires filling in a single field: the SMS message. Messages cannot be sent if this field is empty.

    URL shortening and tracking

    When you enable the URL shortening option in your settings, any URLs included in your SMS messages starting with https:// , http:// , www. or tel:// will automatically be converted to a shortened link, such as https://sms.sh/xxxxxx. This applies to all URLs, including those passed as profile or event attributes.

    This feature offers two main benefits:

    • Shorter, cleaner messages: shortened URLs take up fewer characters, keeping your SMS messages concise and improving their appearance.

    • Better analytics: shortening URLs allows us to track clicks, which unlocks a new key metric for your analytics: SMS link clicks.

    Note that Batch will re shorten any links that have already been shortened by an external tool. The "Send test" feature also shortens links, giving you an accurate preview of how the final message will appear to recipients.

    Sender ID

    At the top of the SMS composer, one of your alphanumeric Sender IDs is displayed. This is typically the same across all countries.

    However, in certain countries (e.g., Belgium and Italy), alphanumeric Sender IDs are not allowed. For these countries, SMS messages are sent from a Shortcode.

    Countries

    During the initial setup of the SMS channel with Batch, you must specify the list of countries where SMS should be sent:

    • SMS sent to phone numbers in unsupported countries will fail and appear as bounces in the analytics.

    • To add more eligible countries, contact us.

    Marketing SMS & STOP Keywords

    For marketing SMS campaigns, Batch automatically appends the appropriate STOP keyword and number based on the recipient’s country. For example, in France, the appended text is “STOP 36184” , which takes 11 characters in your SMS.

    When a recipient replies with the STOP keyword Batch immediately updates all profiles associated with that phone number, setting their SMS marketing opt-in status to “unsubscribed.”

    SMS Parts & Encoding

    An SMS may consist of one or multiple parts depending on:

    1. Message Length: The number of characters in the message.

    2. Character Encoding: Either GSM-7 (default) or Unicode (UNI) if special characters are used.

    The GSM-7 character set includes the basic Latin alphabet (A-Z), numbers (0-9), and a set of common symbols:

    Note: the following characters are also part of the GSM-7 character set, however, they count as 2 characters instead of one:

    B. The Unicode (UNI) character set includes all characters that are not part of the GSM-7 set listed above. For instance:

    • Additional accented letters (ë, â, ï, etc)

    • Non-Latin alphabets (Arabic, Chinese, Cyrillic, etc)

    • Emojis

    • Other symbols (©, ™, ★, etc)

    Character Limit by Encoding:

    The number of characters allowed in a message part varies depending on the used character encoding.

    For multi-part messages, additional invisible data headers are added to enable concatenation, reducing the character limit per part.

    GSM-7:

    • 1 part = up to 160 characters

    • Multi-part SMS = up to 153 characters per part

    Unicode (UNI):

    • 1 part = up to 70 characters

    • Multi-part SMS = up to 67 characters per part

    Batch does not allow sending SMS longer than 4 parts (approx. 612 GSM-7 or 268 Unicode characters) to ensure reliable delivery. For more details on character encoding and its impact, refer to this .

    Batch helps you estimate the number of parts for a given message, However. when personalization is used, this estimate may not be accurate, as the length of attributes can vary between profiles.

    An SMS message can be composed of one or several message parts, each part being limited to a maximum number of characters. The number of characters allowed per message part depends on two factors:

    1. The type of characters used in the message

    2. The number of required message parts (one or several)

    Marketing vs Transactional SMS

    Transactional SMS is used to relay transactional information. You can use this type of SMS to share important information such as order status, delivery notifications, etc.

    On the other hand, Marketing SMS is used to share promotional content. Unlike the former, this type of SMS requires prior consent from the recipient as well as clear unsubscription instructions within the message.

    Thus, when an SMS automation or campaign is set to only target users who are subscribed to your SMS Marketing communications, Batch will automatically append unsubscription instructions at the end of your message.

    Note: The number of characters required for the STOP mention will be included in the character count of your SMS.

    Pricing

    SMS pricing depends on:

    • Recipient’s Country: The cost is based on the phone number’s home country, even if the recipient is roaming abroad.

    • Number of Parts: Each part is charged as a separate SMS. For example, a 2-part message costs twice as much as a 1-part message. It is more likely to have a higher number of message parts when using Unicode encoding since the message part character allowance is lower.

    You can view the number of SMS parts in:

    • Orchestration Analytics: For each orchestration.

    • Billing Section: Provides a detailed cost breakdown.

    Delivery Speed

    Delivery speed for SMS can be customized during the onboarding process to meet your specific needs, ensuring messages are sent at the optimal pace, whether for time-sensitive campaigns or large-scale orchestrations.

    How to switch from the Transactional API to the Profile API?

    As part of the , you might want to switch from the (or its variant, the Partner API) to a more user-friendly option: sending custom events via the and scheduling your Trigger Push Automations directly from the Automation Builder.

    This option is not applicable yet if you are targeting Installation IDs with the . It will be available soon.

    How to send a transactional email with Batch?

    Need help creating your first transactional email automation? Here are useful insights and steps to follow.

    A bit of context first

    Transactional what?

    Transactional emails contain information about an action a recipient has taken, unlike marketing e-mails that intend to drive the recipient towards an action you want them to take.

    How to migrate Mobile Push to Batch?

    Batch allows you to migrate seamlessly from most push solutions on the market. Our migration methodology allows you to keep reaching your whole audience and migrate your running campaigns without interruption.

    Here is an overview of the migration steps:

    1

    Integrate Batch SDK in your app (optionally keep the other provider's SDK for the first release);

    2

    Tag your app to keep collecting the necessary custom data on your users;

    Company Settings

    Batch provides an interface where you can manage all your company settings. It is restricted to Administrate rights.

    Manage Team

    Adding a Teammate

    To add a teammate, click "Manage team" → "Invite user":

    The list of your pending invites is greyed out until the user accepts the invite and creates his account. You can delete or resend an invite at any moment.

    Managing Permissions

    Batch lets you set specific permissions at the user-level to facilitate team collaboration.

    There are several permissions you can grant or revoke:

    • Administrate: Grants full access to company account (team members, users permissions, etc). Note: an account can have more than one Administrator.

    • Review: Grants read-only access to the dashboard. Review users will not be able to create nor edit campaigns.

    • App: Grants users rights to edit and manage apps.

    • Campaign: Grants users rights to create, edit and delete campaigns.

    • Privacy: Grants users rights to manage GDPR settings.

    App-level Permissions

    To facilitate collaborative work, a user with "Administrate" rights can grant another user access to a group of selected apps. This is useful if you want to make sure specific users cannot access all the apps on the dashboard or if you have multiple projects with separate teams working on each one.

    The user will have the same permissions on all the assigned apps. Batch also allows you to grant access permissions from the app on the dashboard.

    Troubleshooting

    I didn't receive my invite

    Here are some suggestions to find the issue:

    1. Check your spam folder and look for an email sent by hello@batch.com.

    2. Resend the invite: Ask the administrator of Batch account to double-check the email address they used or resend the invite.

    3. Validation link: If none of the above work, your manager can send you the confirmation link he will see after inviting you.

    I Get "[Email Address] Is Already Registered On Batch.Com"

    If one of your teammates already has a Batch account registered with his email address, he needs to contact our support team (support@batch.com) with the following information:

    • Email address of his first account.

    • Email address of the team he wants to join.

    We will add him to your team with all the apps he created with his previous account.

    Can I Manage Several Accounts With The Same Email Address?

    You cannot manage more than one account with the same email address.

    If you have a Gmail account or use Google Apps, you can add a "+" at the end of your username to benefit from dynamic alias (e.g. andrew+secondaccount@gmail.com).

    How Can I Delete My Account?

    Just ask us to delete your account at support@batch.com. Our team will let you know when it's done.

    Company Settings

    Company Name

    You can edit here the company name that will be displayed in the dashboard of your teammates.

    Making 2FA Mandatory

    Account administrators can require new and existing teammates to use two-factor authentication (2FA) when they sign into Batch.

    Plans & Billing

    You will find here all the information related to your plan and billing.

    Plan

    Batch will display here the current plan for your company.

    Invoicing Information

    All the information needed on your company to process the invoices: full name, company, VAT number, address, zip code, city and country.

    Invoice History

    Users on self-service plans can see here all their invoices and download them as pdf files.

    GDPR & Privacy

    In addition to the ability to request data removal or data access, you can edit all your GDPR-related information from the dashboard.

    Company Information

    Declare here whether you process or not any EU customer personal data and if you are subject to GDPR constraints. You can also edit the information needed about your company (e.g. company name, address, zip code, city and country) and see the date of the last modification.

    Data Protection Officer

    Optional - Name/email address of your company's DPO.

    Types of Data Collected

    List of the data collected with Batch. You can add custom fields if needed.

    Data Processing Agreement (DPA)

    You can read again the DPA here. Please note the DPA must be accepted to use Batch, unless you declared your company is not subject to GDPR constraints.

    Universal time: Use it to send your message at a specific UTC time regardless of targeted profiles location.
    • For example, if your Campaign is scheduled to be sent on Friday, July 19th at 6pm global time (UTC), your users will receive it at 2PM in the US (UTC -4), 8PM in France (UTC +2) and at 2AM on July 20th in China (UTC +8).

    Replicate.

  • Delete.

  • If stopped:

    • Edit Campaign.

    • Go to Analytics.

    • Run Campaign.

    • Replicate.

    • Delete.

  • If planned:

    • Edit Campaign.

    • Go to Analytics.

    • Stop Campaign.

    • Replicate.

    • Delete.

  • If completed:

    • Go to Analytics.

    • Replicate.

    • Delete.

    • The dates displayed are based on your browser's local time.

    global frequency capping
    use emojis
    inserting variables
    A/B test
    Multi-language
    expiration (TTL)
    customize the payload
    Custom ID
    Installation ID
    Custom user ID
  • Mobile carrier: Know which carrier are using your users.

  • Custom identifier: Know how many users have a custom ID. This may be useful for apps with login walls or that require an account to make significant actions (purchase, etc).

  • City: Know in which city most of your users are living. Batch uses Wi-Fi-based geolocation to find the city of your users.

  • here
    here
    basic userbase
    smart segments
    attributres custom et natives
    custom data
    schema lifecycle 1
    schema lifecycle 2

    Email message

    SMS message

    Push message

    Email
    SMS
    Push
    Cover
    Cover
    Cover
    guide
    sms stop
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ¡ ¿ ! " # ¤ % & ( ) ' * + , - . / Ä Ö Ñ Ü § ä ö ñ ü à @ £ $ ¥ è é ù ì ò Ç Ø ø Å å Δ _ Φ Γ Λ Ω Π Ψ Σ Θ Ξ Æ æ ß É
    € ^ { } [ ] ~ |
    Step-by-step
    1

    Audit your current usage of the Transactional API

    Establish the list of your running Transactional API calls. You can refer to the Analytics > Notifications > Transactional tab on the Batch dashboard to get the list of messages sent via the Transactional API over a specific time period.

    2

    [Back-end] Prepare your calls to the Profile API

    • Associate each Transactional message with a new Custom Event:

      • Event name: For consistency, you can use the "Group ID" of your current Transactional API call.

      • Additional data: If your transactional message contains personalization, associate the personalization values .

    • Get ready to send these events via the

    3

    [Dashboard] Prepare your Trigger Automations

    • for each transactional message using the Batch Automation Builder. The trigger event must be the one defined in step 2.

    4

    [Back-end] Switch from the Transactional API to the Profile API

    Once the automations are running on the dashboard, stop calling the Transactional API and start sending the custom events via the Profile API so that the automations created in step 3 are triggered.

    Example: Order shipped 📦

    Let's apply the above steps to an example:

    1

    Audit your current usage of the Transactional API

    You currently notify clients when their order has been shipped. To do so, you call the with a payload that looks like this:

    2

    [Back-end] Prepare your calls to the Profile API

    • You prepare your calls to the Profile API by associating your transactional message with a new Custom Event:

      • Event name: You choose to call it order_shipped, just as the group ID of your call to the .

      • Additional data: For personalization purposes, this use case requires the order ID and the parcel tracking link. So you add 2 to the new event: id (String) and parcel_tracking_link

    3

    [Dashboard] Prepare your Trigger Automations

    • You for this use case:

    You add the personalization values from the trigger event

    4

    [Back-end] Switch from the Transactional API to the Profile API

    Now that the automation is running on the dashboard, you stop calling the Transactional API and start sending the custom event order_shipped via the Profile API so that the automation created in step 3 is triggered.

    migration from the Batch MEP to the CEP

    They take the form of 1-to-1 automated and personalized scenarios, usually linked to account activity or a commercial transaction, like a password reset request or an order validation.

    What about delivrability?

    Some specific rules apply to transactional emails:

    • They do not require a marketing opt-in status;

    • They are sent in real time;

    • They have a higher criticality than other scenarios, and tend to generate higher engagement rates as well.

    With Batch, each email sending purpose is isolated for deliverability reasons.

    Transactional emails are sent from a dedicated subdomain (e.g. service.domain.com) and a specialized IP / IP pool with an excellent reputation.

    This protects the deliverability of transactional emails from other types of scenarios sent with Batch (newsletters, marketing automation, etc.).

    Management on the Batch dashboard

    To satisfy the need of brands and media to no longer have silos between marketing and transactional emails, we have chosen to handle them in a coordinated manner on the Batch platform.

    This has several advantages:

    • Technical simplicity: you have a single endpoint for all server-side data operations: our Profile API. In the case of a transactional scenario, it allows you to track an event enriched with additional data for message personalization purposes. This single event can be used across different types of scenarios and different channels, streamlining API calls and data flows and considerably simplifying technical implementations.

    • Integrated tracking: delivery and engagement indicators are tracked in a centralized way on the Batch dashboard. You can consolidate information related to a recipient, such as scenarios received, opened and clicked.

    • Operational team autonomy: business teams can modify templates or carry out A/B testing independently. This frees up the bandwidth of technical teams to concentrate on other tasks.

    Technical implementation

    When a transactional trigger is detected in your back-end, call the Profile API to track a user event for the given recipient, via its Custom user ID.

    Attach to the event any data you need to personalize the email as event attributes.

    In case of highly personalized emails such as order confirmations, you can use attributes objects to structure your data.

    For example, in case of an order tracking email, track a parcel_sent event when the order has just left the warehouse.

    Here is an example of how the payload could look like:

    And that's it! The rest is done on the dashboard.

    💡 In addition to email, the trigger event can be used to trigger a message on any channel operated by Batch, thanks to our centralized data model.

    How to setup the email from the Batch dashboard?

    Go to the Batch dashboard, Automations → Email → New automation → Email Trigger.

    Set up entrance

    Click on 'Select trigger' and choose the event that will trigger the email:

    Select trigger in automation

    Target opt-out users

    Click on 'Add targeting' and uncheck the toggle Only send to opted in users.

    Transactional emails do not need a marketing opt-in status.

    Disable marketing opt-in in targeting conditions

    Compose your email

    1. Add your sender

      Click on the message block and select a sender attached to your transactional sending subdomain.

    2. Define the subject of your email

      You can add dynamic personalization by clicking on the brackets {...} if needed.

    3. Compose your email

      Last but not least, there are 2 ways to create the body of your email:

      1. Design your message with our Email Composer.

        Batch allows you to create an email from scratch via our Email Composer.

      2. Upload your HTML template.

      If you have a template ready to be used, you can upload it here!

    Do not forget to add your dynamic variables coming from the event!

    Set an email sender and an object

    Saving your automation

    Click on the 'Save and run' button at the bottom of the form to activate it or save it as a draft and come back later.

    Your email is now ready to be sent! 🎉 (in real-time as soon as the trigger event is captured by Batch, from your sending subdomain dedicated to transactional emails).

    3

    Get the push payload expected by your former push solution and Import your current push tokens to target users who have not upgraded the app yet;

    4

    Migrate your push campaigns from your former push solution to Batch without interruption.

    Prerequisites

    Follow these steps to start the migration:

    1

    Create an account on https://batch.com/register.

    We recommend that you invite your team members from the account manager section (in the bottom left corner of your dashboard, under "Manage Team" → "Invite user").

    2

    Create your apps on the Batch dashboard.

    We recommend creating two applications per OS on the dashboard: one for tests and one for production (e.g. MyApp and [DEV] MyApp).

    3

    Integrate Batch SDK in your app.

    Follow our dedicated documentation: / / / / .

    Migration types

    Depending on your constraints, you will choose to keep or remove the SDK of your previous push provider for the first release of your app with Batch. Here are details on these two migration types to help you make a decision.

    Both methods guarantee a 100% import of tokens and the possibility to target users who have updated the app or not.

    Keep both SDKs: Staged migration

    In this case, the first app release integrates both the previous push solution’s SDK and Batch SDK. This makes it possible to use one or the other solution in parallel to send push notifications as long as the SDKs coexist in the app.

    The timeline for teams training on Batch dashboard and tokens export/import is more flexible with this method. There is no sudden service interruption with your former push provider. The cohabitation of SDKs can cause duplicate pushes on Android. In this case, you need to use an Interceptor in your app (see Push payload).

    Include only Batch SDK: Hot swap migration

    The SDK of the previous push solution is removed from the app once Batch SDK is integrated. As soon as the version of the app with Batch is released, Batch is the only solution that collects the new push tokens, and becomes the only solution that you can use to target your userbase.

    This method allows you to migrate within a short timeframe, but implies fixed tokens export dates and that your marketing teams are comfortable using the dashboard before the first app release with Batch.

    Tagging plan

    You should list the campaigns to be migrated to determine the tagging plan to be implemented.

    You should keep the same attributes and arrays names as your previous tagging plan to ensure that your imported tokens will be targeted by your campaigns (see how to import custom data with your push tokens).

    Push tokens import

    A push token is an anonymous ID generated by the push services (Apple, Google, etc.) that is used to target your users via push notifications. In the context of a migration, importing all your existing tokens makes it possible to reach your whole userbase, including users who don’t have a version of the app that includes Batch SDK yet.

    You should plan to export the tokens after the apps have been released with the Batch SDK to avoid any loss in the collection of tokens between the time of export and the time when Batch starts collecting them.

    Here are the detailed specifications for the tokens import: Importing your tokens.

    Push payload

    After migrating your push tokens to Batch, you will be able to target users who are still using a version of the app that does not include Batch SDK.

    To contact these users correctly, you need to use the payload that is expected by the SDK of your previous push solution. You have to get in touch with your previous push provider to get it.

    iOS

    The iOS payload of a push notification is standard and push notifications are displayed by the system. The expected payload is still needed to manage deeplinks.

    Android

    On Android, push notifications are handled by the SDK. The expected payload is required to manage the whole content: the title and body of the push notification, the deeplinks, etc. In case of a staged migration (see Migration types), both SDKs might try to display the notification sent by Batch, which may result in duplicate push notifications.

    To address this, here is an interceptor to be integrated into your app that disables the Batch receiver when the payload of another solution is detected (read more on how to register it ):

    In case you cannot import your push tokens or retrieve the payload expected by your previous push provider, you will need to start collecting your userbase from scratch. This happens, for example, if you previously used Firebase as a push service (read more here).

    Testing

    Once all elements have been integrated, you need to test the basic implementation following these guides: iOS / Android.

    As part of the migration process, it is crucial to ensure that all users will be contacted correctly and that there is no unexpected behavior in any version of the app. You will find all the extra testing steps here: Testing.

    Campaigns migration

    Once your app has been released with Batch SDK and your tokens have been imported, you can start migrating your push campaigns. Here is how to proceed:

    1

    Create your campaigns as drafts on the Batch dashboard.

    2

    Deactivate the campaigns running with your previous push provider.

    3

    Activate your campaigns on the Batch dashboard.

    You must never run the same campaign from both push solutions: some tokens might be present in both userbases and might receive the notification twice.

    The process of campaign migration is detailed here: Campaigns migration.

    Email key metrics
    Push key metrics
    In-App key metrics
    SMS key metrics
    Email key metrics
    Targeted Metrics
    orchestration analytics
    E.164 international standard
    iOS documentation
    Android documentation
    Web documentation
    iOS documentation
    Android documentation
    Web documentation
    support@batch.com
    this guide
    this guide
    API payload with SMS contact information
    Mobile preference center
    Batch dashboard - Profile view
    Batch dashboard - SMS editor
    SMS preview of received message
    fullscreen
    banner
    modal
    image
    webview

    This guide is specific to Batch's Mobile Engagement Platform(More on the ).

    email composer
    Screenshot of the Batch dashboard showing the feature "Filter" from the targeting block with the description of the 2 options in a drop-down menu: "Collected tokens only" and "Imported tokens only"

    Upload your ready-to-use HTML template

    Uploading an HTML email template into Batch requires careful attention to detail. It is essential to review a few key elements to ensure everything looks and functions as expected. This final check helps you deliver a polished and professional email that matches your original design and renders properly across all inboxes.

    By following this step-by-step guide, you’ll catch any small issues before going live — giving your template the best chance to perform and engage your audience effectively.

    Let’s dive in and get your campaign ready for success 🚀

    Introduction and prerequisites

    Which tool should you use?

    To modify the HTML of your emails, we recommend using a code editor of your choice, such as:

    • Visual Studio Code (download )

    • Sublime text (download )

    • Any other tool of your preference 🔧

    These tools allow you to visualize your code more clearly using color coding and save your changes in HTML format.

    Find your HTML poorly structured? Go to to make it more intelligible.

    Prerequisites

    Before uploading your template to Batch, make sure you’ve completed the following steps:

    • Save your HTML file as index.html or mail.html (max size: 512 KB).

    • Place all images used in your email inside a folder named images.

    👉 Once these two steps are done, you’re ready to start editing the HTML to make it Batch-compatible. Need more guidance? Check out our article

    HTML modification

    Add a pre-header

    A is the short line of text that appears right after the subject line in the inbox preview. It’s a great opportunity to grab attention and increase your open rate.

    To add one, simply insert a hidden element at the very top of your HTML email, just after the opening <body> tag:

    This text won’t be visible in the email body, but it will show up in the inbox preview. Choose something catchy and relevant to encourage your user to open your email!

    Mirror link management

    Mirror links (“View this email in your browser”) are not supported and must be removed from your HTML template:

    To do this, search your HTML for phrases such as "View this email in your browser" or "view online". Once located, delete the entire block of code that includes the mirror link.

    Don’t forget to remove both the opening and closing tags of the block to avoid any display issues.

    Manage your links

    When an email campaign is sent, all redirection links are automatically rewritten to enable click tracking. That is why it is crucial to ensure that the links in your HTML accurately reflect your original URLs. Search for all href attributes in your HTML:

    • Replace each one with your original redirect link, including any tracking parameters from your analytics platform (e.g., xtor for Piano, utm for Google Analytics, etc.).

    This ensures both proper tracking and a seamless user experience.

    Manage images and gifs

    When uploading your email template as a .zip file to the Batch dashboard, it must contain two essential components:

    1. An HTML file named index.html

    2. A folder named images that includes all visuals used in the email (images, GIFs, etc.)

    To ensure images display properly in the final email, all image links in your HTML must reference this images folder.

    How to do it:

    1. In your HTML file, search for all src= attributes.

    2. Update each image path to follow this format:

    This step is key to making sure your visuals render correctly when the email is sent.

    1. To speed things up, there is a function that allows you to replace one word with another:

    2. on your html tool, once you're in the html file of your e-mail, press ctrl + F

    3. A pop-up window will appear at the top right of the screen

    Adding the unsubscribe link

    When a user clicks the unsubscribe link in your email, this action must be properly tracked by Batch to ensure they are no longer targeted in future campaigns.

    To do this, your HTML must include two key elements in the unsubscribe section:

    1. The unsubscribe variable – This allows Batch to register the user's unsubscription in real time.

    2. The unsubscribe confirmation page – On clicking on "Unsubscribe": the user will be sent to a landing page indicating that their request has been taken into account.

    You can find all the links to Batch unsubscribe landing pages by following this link:

    Personalization

    Personalizing with user attributes

    You can personalize your message using user attributes — a common use case is displaying the recipient’s first name.

    👉 Head over to our complete for more details and best practices.

    Dynamic images

    You can display dynamic images using IF conditional blocks in your HTML. Here’s how to do it:

    • Use the attribute name exactly as it is sent to Batch (e.g. subscription_end_date).

    • Adjust the src= value for each condition to show a different image depending on the user's data. Example:

    Use the src keyword in your code editor to quickly locate image links in your HTML.

    Dynamic links

    If your email has dynamic links or if the links contain customization, here are the steps to follow in order to make them effective:

    Dynamic redirect link

    Here is the Batch structure to use:

    If you want the user to be redirected to a specific page related to actions they have previously carried out when they click on the link.

    Link with customization

    Here is the Batch structure to use:

    If you want to collect a some information about your users (e.g. first name, email, language, etc.) when the link is clicked.

    To find redirection links in your HTML, search for href.

    Final checks

    Once you have made all the changes required to migrate your template to Batch, we invite you to 🪄

    Analytics

    Basic analytics

    Understanding the results of a push campaign is key to analyzing the performance of a message. The campaign list gives you basic information on all your push campaigns:

    • Sent: The total amount of sent push notifications. This number is updated every few minutes.

    • Open rate: The percentage of users who opened your notification directly or indirectly. Please note that the open rate of a campaign scheduled in local time may change over time since Batch can take more than 12 hours to deliver push notifications to all your users in different timezones ().

    Campaign analytics

    Campaign analytics exports can be downloaded from the dashboard. The export is in the form of a CSV file containing campaigns metrics, settings, and much more. It allows you to filter your campaigns' metrics & data to include in your export. These exports are available from the Push tab.

    For example, you can:

    • Analyze push notifications campaigns performance

    • Analyze A/B test campaigns

    • Compare campaigns metrics by label, type, source, country, etc.

    • Run in-depth analysis thanks to the extended data exported: sending time, targeting type, message content, etc.

    Set your export from the Campaigns list

    First, click on "Filter" and select the status, date range, labels, sources, and types of campaigns. Click on "Apply filters" button to save your choices.

    Then, click on "Export" button on top of the last column.

    Export filters

    Before downloading the CSV Export, you can specify the granularity of your export. By default we are exporting the campaigns corresponding to the filters you selected. You also have the possibility to export directly the metrics for all your campaings by checking "All campaigns" button.

    Campaign’s metrics & data

    All exports automatically contain essential data by default:

    • Essentials metrics represent all the metrics available in your CSV export by default, they are always included. Here is the list of the metrics: token; type; source; status; sent date (now/scheduled); label; campaign; sent; sent opt-ins; direct open; influenced open; reengaged users; errors; uninstalls; skipped; opt-outs-feedback.

    In addition to the default export data, you can add additional data:

    • Extended data allows you to enrich your CSV export with the following campaigns setup information: start date (recurring et trigger); end date (recurring and trigger); sent time (now/scheduled and recurring); utc/local (now/scheduled and recurring); smart segments; country; custom audience (YES/NO); languages; targeting applied (fullbase or custom targetting); message; rich media (YES/NO); deeplink; custom payload.

    Split data

    You can choose the level of granularity of your CSV export. The campaign granularty is always selected, you have the possibility to go further in the granularity of your CSV export by choosing to split the data by days and/or by variation by selecting the A/B versions.

    Advanced analytics

    If you want to see more detailed stats about a specific campaign, you can click the Stats icon in the campaign list.

    Let's dive into the details of the available statistics here:

    Summary

    You can find here global data on your campaign, since it has been created. The metrics displayed here can depend on the campaign's nature and status:

    • Target: Total number of installations that meet your campaign's conditions.

    • Sent: Total amount of push notifications accepted by Apple or Google, but not necessarily delivered to the end device.

    • Bounced: Total number of notifications Apple or Google couldn't deliver because users didn't have the app anymore or because of other errors.

    • Opened: Total number of users who clicked the notification (direct open) or opened the app in a 3 hours range after receiving the push (influenced open).

    How to modify my open rate calculation?

    Batch allows you to choose between 2 relevant ways to calculate your open rate.

    • Monitoring direct and influenced opens: This is the default calculation method. It generates a coherent open rate since it is based on only users who actually received your push campaigns.

    • Monitoring direct opens exclusively: This method excludes the influenced opens. Influenced opens may be irrelevant for media apps because users open the app frequently, regardless of the notifications received in the last 3 hours.

    Need to change the way Batch calculates the open rate for your app? Please contact our team at or use the live chat.

    Performance

    The Performance report is built like a conversion funnel. It allows you to measure your campaign's success at a glance:

    • Opt-ins: Number of notifications sent to opt-in users.

    • Direct: Number of users who clicked the notification.

    • Influenced: Users who received the notification and did not click it, but opened the app in a 3 hours range afterwards.

    • Reengaged: Dormant users who received a notification, opened it and then came back to the app/website in the 3 days following the notification reception.

    If you attached a to your push campaign, you will find additional stats:

    • Landing display: Total number of users who displayed the Mobile Landing.

    • 1st/2d button: Number of clicks on the first or the second button of your Mobile Landings. Hover over the tooltip to see the content.

    Delivery

    The Delivery report gives you detailed information on the status of all the device tokens targeted by your campaign:

    Sent

    • Opt-ins: Notifications sent to users who were opt-in to push notifications when the campaign targeted them.

    • Opt-outs: Notifications sent to users who were not opt-in to push notifications when the campaign targeted them.

    • Imported: Notifications sent to imported users.

    • Dev API Key: Notifications sent for installations on the Dev Api Key. A high number of notifications sent on the Dev Api Key can mean that your production app version does not integrate the right Batch API Key.

    Undelivered

    • Skipped: Number of unserved notifications because the capping limit was reached for the targeted installation.

    • Uninstalls: We tried to send the campaign to those devices but they no longer have the app installed.

    • Errors: Errors sent by the push provider (FCM/APNS). Click the list icon to see the list of errors.

    A/B testing

    Batch also shows relevant information on your campaign if you are using the A/B testing feature. In the detailed results of your campaign, you will see how each message perform over time in a tabbed view.

    If you want to track the number of marketing and transactional push notifications sent everyday from the dashboard or the Campaigns/Transactional API and see the global open-rate of your campaigns, take a look at Notifications, in the Analytics tab.

    User Journey

    If you created a user journey, Batch will display an additional report in your campaign analytics. You will be able to see how many users are still waiting for the timer to finish and why they exited the user journey:

    You will also see the number of push notifications sent every day from your trigger campaign:

    Create your first one-shot campaign

    Need help creating your first one-shot campaign? Here are all the steps you need to follow.

    One-shot campaigns are perfect for sending timely and impactful messages, whether for announcements, promotions, or user engagement. This guide will walk you through setting up your first campaign in Batch, covering targeting, scheduling, and message composition. Let’s get started! 🚀

    The ‘Campaigns’ tab is dedicated to ‘one-shot’ campaigns, including Now and Scheduled campaigns.

    The campaign editor is made up of 3 steps:

    1. Targeting: full base or fine-tuning segmentation, through native targeting or custom data;

    2. Timing: sending time that can either be now or scheduled;

    3. Message: the content of the campaign that will be sent to the user.

    To begin, go to your Batch Dashboard, then navigate to Campaigns > New campaign > Select the channel of your choice (Email, Push, or SMS message), and name it to start a new campaign:

    Optional: you can add to your campaign (up to 5):

    serve two main purposes: they allow you to set a marketing pressure limit across all campaigns/automations sharing the same label, and they enable you to filter campaigns/automations based on their assigned labels.

    Then, let's set up your campaign! 💪

    Targeting

    The targeting block is where you will define the segmentation of your campaign.

    By default, Batch considers that you will target your entire audience. First, you can select a specific country or language.

    Then, you can refine your segmentation through different options, by clicking:

    Add Conditions

    From then on, you will be able to select native targeting elements (Email domain, etc.), but also profile attributes (data specific to your app business and selected thanks to the tagging plan):

    Use Segment

    It will allow you to call as blocks in the targeting and combine segments (inclusions and/or exclusions) by calling up to 10 segments in your targeting:

    When a segment is linked to an orchestration, you can access / view the segment by clicking on the eye icon 👁️.

    Use Audience

    You can add a specific to your communication:

    Play with AND/OR option

    You can add up as many conditions as you want, and create specific scenarios by clicking on 'AND/OR':

    💡 Let's take the example of a one-shot campaign sent out on Valentine's Day with a pretty cool message like; “Roses are red, violets are blue... our Valentine's sale is just for you 💝”.

    This campaign is to be sent to:

    • Users from your “VIP clients” segment

    • Users who purchased within the last 2 months (high probability of purchase)

    Here's what campaign targeting should look like:

    Timing

    Now that we know who to send your communication to, let's define when to send it!

    There are 2 possibilities:

    • Now

    By selecting Now, the communication will be sent as soon as you click the 'Save and run' button at the bottom of the form.

    • Scheduled

    Selecting Scheduled will bring up new fields for setting up the time and date.

    💡 For example on 07/10/2024 at 17h15:

    You can choose to send your communication on Local time or Global time (UTC):

    • The Local Time option lets you send a message that will be received at a given time according to the user’s time zone. This ensures that marketing efforts target your users at a uniform time.

    • On the other hand, the Global Time (UTC) option allows you to send a message to your users at a specific UTC time regardless of their location.

    Last but not least, let's compose your message! ✍️

    Message

    Message editors vary from one channel to another. To learn more about composition, visit the following sections:

    Run your campaign

    Now that your campaign is ready, you can either run it or keep it as a draft and launch it later 🌟

    Once your campaign is live, you can track its performance in the section.

    Testing

    As part of the migration process, you need to take extra steps to review your implementation and ensure that all users will be contacted correctly.

    Testing the payload

    To ensure that the payload you retrieved (see Payload) is working correctly, you need to send test notifications from the Batch dashboard to tokens associated with a version of the application that only includes the SDK of your previous push provider.

    Here is how to do it:

    1

    Retrieve the push tokens associated with your test devices for the app that includes the SDK of your previous push provider only (through its dashboard, the logs of the apps that include the SDK of your previous push provider, or in the token export files).

    2

    Create a campaign on the Batch dashboard and fill in a title, a message, and a test deeplink (also test without deeplink).

    3

    Add the payload from your previous push provider to the Payload box:

    It is possible to use the elements filled in earlier in the form by using variables in the "Payload" field. This will prevent you from filling in these elements twice (which will be useful, particularly for your real campaigns later on).

    The variables to use are:

    Here is an example Android payload:

    This is just an example of a payload. Yours will depend strictly on your previous push provider, your use, and your implementation.

    4

    Send a test push to the retrieved tokens using the test feature available in the campaign form. You will need to select "Temporary device" and then "Push token".

    Specificities per OS

    Unlike Android, on iOS, it is not necessary to include all the payload keys that you retrieved from your previous provider. Some elements, such as the title and body of the notification, are handled using Apple's standard keys. These will be systematically included in the push notification sent via Batch, and it will not be necessary to include them in the "Payload" box. Meanwhile, other elements such as the deeplink are managed by the push SDK. You will need to keep the corresponding keys.

    Here is an example iOS payload:

    This is just an example of a payload. Yours will depend strictly on your previous push provider, your use and your implementation.

    To send this test push, the authentication settings ( / ) specified for both applications in Batch > Settings > Channels > Push must match the settings used in the test applications.

    Notification reception tests

    The tests are summarized in the following tables, depending on the you choose.

    For each test case, send a test notification from the Batch dashboard or your previous provider's dashboard (see "Dashboard to use"), with or without adding the previous provider's payload (see "Use previous provider's payload?") and on the specified app (see "App to target").

    It is very important to test the following elements:

    • The title is displayed correctly ;

    • The message is displayed correctly ;

    • Deeplinks: ensure that all types of links used by your app result in the correct redirection ;

    • App opens after clicking on a push without deeplink ;

    Staged migration

    Dashboard to use
    Use previous provider's payload?
    App to target
    Expected result

    Hot Swap

    Dashboard to use
    Use previous provider's payload?
    App to target
    Expected result

    What’s next

    Once the basic implementation has been tested ( / ) and the tests listed above are successful, you can release your app on the stores.

    Recurring Automations

    Recurring Automations are made for message sendings that repeat at specified intervals based on each Profile's local time or on Universal time (UTC). You can create Recurring Automations for each channel: Email, SMS and Push. They can be managed from the “Automations” tab of your dashboard.

    Creating a Recurring Automation

    To create a Recurring Automation, click on the “New Automation” button on the top right-hand corner of your Automations listing and select the channel you want to use to send your message.

    Creating a Recurring Automation is similar to creating a Campaign, except for the Timing. Check .

    Overview

    Message composition follows a similar process for:

    • Campaigns

    • Recurring Automations

    • Trigger Automation Steps

    Refer to the corresponding channel documentation for detailed guidance on message composition:

    {
    	"group_id": "order_shipped",
    	"recipients": {
    		"custom_ids": ["129c7819-9c88-496e-9a5f-62db34a3ce61"]
    	},
    	"message": {
    		"title": "📦 Your order BC257637 has been shipped!",
    		"body": "Click here to keep track of your parcel"
    	},
    	"deeplink" : "https://wwww.mybrand.com/BC257637"
    }
    [
      {
        "identifiers": {
            "custom_id": "johndoe123"
        },
        "events": [
            {
               "name": "parcel_sent",
               "attributes": {
                       "carrier_name": "DHL Express France",
                       "collection_point": "E-mobile Paris 3",
                       "date(delivery_date)": "2024-02-12T10:10:10",
                       "url(tracking_link)": "www.dhl.com/suivi/456",
                       "order_id": 456
                       }
            }
        ]
      }
    ]
    package com.batchlabs.android.batchstore.core;
    ​
    import android.content.Context;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.NotificationCompat;
    ​
    import com.batch.android.BatchNotificationInterceptor;
    ​
    public class BatchInterceptor extends BatchNotificationInterceptor {
        @Nullable
        @Override
        public NotificationCompat.Builder getPushNotificationCompatBuilder(@NonNull Context context, @NonNull NotificationCompat.Builder defaultBuilder, @NonNull Bundle pushIntentExtras, int notificationId) {
            if (pushIntentExtras.getString(<KEY_FROM_OTHER_PAYLOAD>) != null) { // replace <KEY_FROM_OTHER_PAYLOAD> with a key that is always contained in the payload expected by the SDK of your previous push provider
                return null;
            }
            return defaultBuilder;
        }
    }
    difference between Batch's CEP and MEP
    labels
    Labels
    Segments
    Audience
    Analytics
    Cover

    Email message

    Email
    Cover

    SMS message

    SMS
    Cover

    Push message

    Push
    Design an email template with the email composer
    Upload an HTML template

    Analyze Trigger campaigns' user journey metrics

  • Etc.

  • Open Rate: Total of opened notifications (direct + influenced) / Total of notifications sent to users who accepted push notifications and are not in the imported segment.

  • see more here
    support@batch.com
    Mobile Landing
    export
    statistics
    Trigger push sent
    campaigns

    Custom Data

    The Custom data pages shows the list of all the custom data collected on the installation base that powers Push v1, siloed by platform (iOS, Android, Web).

    The Custom Data tab shows the list of all the custom data collected once for your app/website from the SDK (attributes, tag collections, events) or from the Custom Data API (user attributes, user tag collections).

    Enabling New Custom Data

    New custom data need to be manually enabled before being displayed in the userbase tab and used in a campaign. Before activating a new attribute, tag collection or event, make sure the name and the data type is correct.

    Editing Existing Custom Data

    You can add a custom name to any attributes or events. This is useful if you want to display simplified names in the interface instead of the technical name of the attributes/events:

    You can also change the data type of an attribute (e.g. from string to date) if you already made that change in the code of your app or in your call to the Custom Dara API. Batch will adapt the operators displayed in the campaign editor to the new data type. If you changed the data type by mistake, Batch indicates with a * the data type detected for that attribute (e.g. "Integer*").

    Switching Environments

    Use the "DEV/PROD" toggle to switch between the list of custom data attached to the Dev API Key or the Live API Key.

    each time you were calling the Transactional API.

    Activate these automations.

    (URL).
  • Here is how the payload you will include in your call will look like:

  • order_shipped
    in the title (
    id
    ) and the deeplink (
    parcel_tracking_link
    ) fields of your message, using the
    {...}
    buttons:
    • Then you activate this automation ("Run" button).

    Create one trigger automation
    create a dedicated trigger automation
    A screenshot of the Batch dashboard, in the automation builder section, that shows a push notification "order shipped"
    1. Once you have entered the new value, click on "Replace all".

    here
    here
    Small DevTool
    How to upload my email templates?
    pre-header
    personalization guide
    test its appearance in Batch and then in your inboxes
    Insert the recipient's first name dynamically

    Check the format of the push display on Android (reduced, extended, etc.) ;

  • Push notifications are displayed in the system notification center ;

  • Only one push notification is displayed.

  • Doesn't work on Android, but allows you to check that the push is received on iOS and that there is no unexpected behavior.

    Batch

    No

    App with both SDKs

    On iOS and Android, good reception of the push, and redirection if deeplink. Note: If you receive the notification twice in this test case, you will need to develop a mechanism that disables the previous provider's SDK if the Batch payload is detected. You can use the method to detect if a notification comes from Batch.

    Previous provider

    No

    App with both SDKs

    On iOS and Android, good reception of the push, and redirection if deeplink.

    Doesn't work on Android, but allows you to check that the push is received on iOS and that there is no unexpected behavior.

    Batch

    Yes

    App with Batch SDK

    On iOS and Android, good reception of the push, and redirection if deeplink. Note: If you receive the notification twice in this test case, please check the implementation of the Interceptor.

    Batch

    Yes

    App without Batch SDK

    On iOS and Android, good reception of the push, and redirection if deeplink.

    Batch

    No

    Batch

    Yes

    App with Batch SDK

    On iOS and Android, good reception of the push, and redirection if deeplink.

    Batch

    Yes

    App without Batch SDK

    On iOS and Android, good reception of the push, and redirection if deeplink.

    Batch

    No

    migration type
    iOS
    Android
    Screenshot of the Batch campaign form highlighting the Payload box
    Screenshot of the Batch campaign form highlighting the "Send a test" feature with its Push token field

    App without Batch SDK

    App without Batch SDK

    On a Recurring Automation, to define your Timing, you have to:

    • Set the day and time when you want the first occurrence of your message to be sent.

    • Set the day and time when you want to stop your Automation i.e. when you want the repetition to stop.

      • As for Campaigns, the day and time can be on the Profile's local time or on the Universal Time (UTC).

    • Set the frequency with which messages are sent.

      • The frequency has a minimum limit of 1 message per day and no maximum limit.

  • If you want to limit the number of occurrences of a message a Profile will receive, you can use Capping.

    • When Capping is disabled, Profiles in your targeting will be able to receive the message on each occurrence i.e. each time the timing occurs.

    • When Capping is enabled, Profiles in your targeting will only be able to receive X occurrences of the message. X being the value you have set.

      • If a profile has several devices, then we will send X occurrences of the message per profile AND per device. For example, if you set the capping to 2 and a user targeted by your Automation has an iPhone and an iPad, they will receive 2 occurrences of the message on each of these devices.

  • Managing a Recurring Automation

    Stopping a Running Orchestration

    • A Recurring Automation can be stopped and relaunched as many times as necessary until the end date is reached.

    • Sendings will resume on the sending date defined in the form and not immediately after the Automation is relaunched.

    Modifying a Recurring Automation

    • A Recurring Automation can be modified until the end date is reached.

    • You can modify its targeting, timing and/or content.

    • If your Automation is scheduled to be sent at a later date, or in other words if the sendings have not started, all your changes can be taken into account.

    • However, if sendings are already in progress, all the people concerned by these sendings, will not be affected by your changes. Changes will only be effective for sendings that have not yet started.

      • We advise you not to modify your Campaign when sendings have started to avoid errors. This particularly applies to local Campaigns.

    • If you change the start date to within 24 hours of the first send, people will not receive the message again; they will receive a message on the next occurrence.

    Deleting a Recurring Automation

    Any deletion is definitive, you will no longer be able to access your Automation.

    Intelligent Warm-up mode

    Intelligent Warm-up mode help you manage your email sender reputation by gradually increasing sending volumes in order to build trust with email providers.

    You can define and manage the warm-up process with three key parameters:

    • Initial Sending Volume: The volume for the first day's send (default: 500).

    • Volume Increase Percentage: The percentage increase applied to the sending volume for each subsequent day (default: 50%).

    • Engagement Selection Criteria: A single criterion used to target people from the least engaged to the most engaged. It creates an ordering based on a user attribute. Users without a value for the selected attribute are targeted last. Supported attributes are:

      • Date Attributes (e.g., last_email_open) are sorted by default from most recent to oldest.

      • Number (Float or Integer) Attributes (e.g., a custom scoring). The sort order is determined by you between descending or ascending. Integers are converted to floats for normalization before sorting.

    The behaviors specific to the warm-up mode are as follows, the rest is identical to the functioning of Recurrings:

    • Creation Blockers & Warnings: The system includes checks to prevent unsuitable warm-up plans:

      • Blocker (before launch): Warm-up duration less than 2 days or more than 89 days.

      • Warning: Volume increase percentage greater than 100%.

      • Warning (after launch): Warm-up duration more than 89 days. If certain criteria are modified during the warm-up process, it can result in a warm-up exceeding 89 days. In this context, we will not block saving the modifications, but the automation will stop after 89 days and the remaining tasks (sends) will be abandoned.

    • Manual Intervention Allowed: You can manually intervene by modifying:

      • The daily increase percentage.

      • The engagement criteria.

      • The email content.

    • Restrictions (even before launch):

      • Timing cannot be based on Profile's local time (Global Time is enforced).

      • Capping setting is forced to 1 and occurrence is daily.

      • A/B testing is not allowed.

    • Restrictions (after launch): Once the orchestration has started sending, the following cannot be changed:

      • Market/Transac subdomain.

      • Start date (unless the start date hasn't passed).

      • Initial sending volume.

    • Data overload prevention:

      • A maximum of 4 Warm-up Automations can be running simultaneously across the same project.

    Understanding Automations listing

    The listing is common for Recurring Automations and Trigger Automations. All the Automations you have created since the project was created are available on the listing.

    From the Automation listing you can:

    • Filter the listing by:

      • Date: Filters out Automations that were active over the period.

      • Status: Draft, Running, Stopped, Completed.

      • Channels: Email, SMS, Push.

      • Labels: All CEP labels attached to the project.

        • You can select several options for each filter and combine filters.

    • Access quick actions that adapts to the Automation status (by clicking on the three dots buttons):

      • If in draft:

        • Edit Orchestration.

        • Launch Automation.

    • Access key metrics:

      • Delivery: number of sent.

      • Interaction: percentage of opens.

    • Access key dates related to an Automation's status and content by hovering over the status icon on the listing page or within the Automation form:

      • Created at: The date and time the Automation was initially created (i.e., first saved).

      • Last edit: The date and time the Automation's content was last modified since its creation.

      • Currently {Automation status}: The Automation's current status (e.g., Draft, Planned, Running, Stopped, Completed) and the date/time it entered this status (this does not apply to the 'Completed' status).

    • Export your Automations Analytics (by clicking on the “Export” button).

    • Search a specific Automation.

    What is explained on this page is focused on how Recurring Automations works for Email, SMS and Push v2 channels. For Push v1, the behavior is slighly similar with the main difference that it works by platform (iOS, Android, Web).

    Campaign documentation here
    recurring

    Email

  • Push

  • In-App & Mobile Landing

  • SMS

  • Multi-Language Selection

    Composition

    Message composition handle multiple languages versions across all channels. Languages come from your systems, fed to Batch via APIs or captured by Batch SDKs.

    When enabled, you can easily create and manage different language versions of the same message. Profiles will receive the version matching the language set in their profile.

    A default language message is mandatory to ensure delivery to profiles whose language is not covered by the redacted versions.

    To streamline the creation of new language versions:

    • Email: The default language template is duplicated and can be customized independently for each language.

    • Push: Media and icons from the default template are duplicated and can also be customized independently.

    • In-App & Mobile Landing: Structure of the in-app(=template) is the same across all languages. Text, images and CTA actions can be specified by language. When a new language is added, images and CTA actions are duplicated from the default language and can also be customized independently.

    • SMS: No information is duplicated from the default language.

    Languages can be added or removed at any time even when the orchestration is live.

    Analytics

    Results can be analyzed by language. However, splits are only available for non-deleted language versions.

    A/B Test

    The A/B testing feature is available for Push, In-App, Email Campaigns and Recurring Automations.

    Creating an A/B Test

    To create an A/B test, simply enable the “A/B Testing” toggle at the top of the message composer.

    A/B testing can be used in combination with Multi-Language: you can set specific languages for each variant.

    Once A/B testing is activated, you can create up to four variants:

    • By duplicating an existing variant.

      • We recommend that you first add the languages and message content per language to the variant you want to duplicate, as the languages will also be duplicated.

    • By creating a new variant from scratch.

    • [Beta] By generating a new variant with AI (available for Push notifications and Email subject lines only). The AI can suggest additional variants (B, C, D) based on the content of your existing ones. If several variants already exist (e.g., A & B), the AI uses them all as input context when generating the next one (e.g., C).

    Profiles are distributed randomly and equally among the variants. For example, with four variants, each will receive 25% of the profiles.

    Each field, such as sender, subject, reply-to, and email body for email, or message title, body, deeplink, image, and custom icon for push, can be customized for each variant.

    Note: Parameters in the “Advanced settings” section (e.g., priority, payload) are common to all variants.

    Managing a Running A/B Test

    Once an orchestration with an A/B test is launched, adding or deleting variants is not possible to maintain consistency.

    • To test new variants alongside existing ones, replicate the orchestration (this will replicate all variants, even if a winner has been chosen) and launch a new orchestration.

    However, you can modify the content of variants after launch. Keep in mind that such changes may bias the test.

    • It is recommended to only edit variants for critical errors (e.g., typos, incorrect images).

    Note: It is not possible to activate A/B testing on a standard Recurring Automation that has already been launched.

    Specific Cases for Recurring Automations

    Variant stability: Profiles re-entering the automation will always remain assigned to the same variant they were assigned previously until a winner is elected.

    • Example: If a profile was assigned to Variant A initially, they will continue receiving Variant A until a winner is selected.

    • This ensures consistent communication with users.

    You can choose a winner from the Analytics page, using the “Pick Winner” button in the A/B test results table to send this variant for all profiles targeted by the Automation.

    • Once a winner is chosen, other variants can no longer be reactivated and variant stability is no longer applied.

    • If you want to start a new test, replicate the automation.

    Reviewing A/B Test Results

    An A/B test results table is available in the Analytics section, showing key metrics for each variant.

    For emails, the best-performing metrics (e.g., highest open/click rates, lowest unsubscribe rate) are highlighted in green. For push, the highest open rate is highlighted. These indicators help you choose the winning variant based on performance.

    The results table has two statuses:

    1. Test Period: Metrics are updated in real-time as messages are sent. Filters on the Analytics page apply to this data.

    2. Post-Test Period: Once a winner is selected, metrics for the variants are fixed and no longer update (except for interactions with messages sent before the winner selection). The table is greyed out and moved to the bottom of the page. Analytics filters no longer apply to the A/B test results. Example: If Variant A is chosen as the winner, and a user opens Variant B (sent before the winner selection), the open metric for Variant B will still update in the results table. However, any interactions with Variant A after it is declared the winner will not update the test metrics.

    Channel metrics (all metrics outside the A/B test results table) data combines the statistics from the AB test phase (from the different variants) and the post-test phase following the winner's choice. In other words, it shows all messages delivered since the launch of the Orchestration.

    If you want to see the statistics for the winner only, use the date filters, setting the start date to the date on which the winner was elected.

    Optimizing A/B Tests Campaigns with Automatic Winner Selection

    You can perform AB tests on your Email Campaigns and automatically select the highest-performing variant to send to the rest of your audience. This optimizes Campaigns based on concrete data and improves engagement rates.

    To do so, enable the Automatic Winner Selection toggle in the Experiment bloc. Once it is activated, you need to define:

    • The size of the test group:

      • The percentage of the audience to include in the test group (from 1% to 99% of the audience can be affected to the test group).

      • We display an estimate of the number of profiles that will be in the test group to assess the statistical significance of the test.

    • The winner selection criteria:

      • Open rate = Unique Opens / Delivered.

      • Click rate = Unique Clicks / Delivered.

    • The winner variant launch:

      • When the winning variant is sent to the remaining audience.

        • The minimum delay between Campaign launch and sending the winning variant is 1 hour.

        • The maximum delay is 30 days.

    Please ensure you consider the following information when managing your A/B tests with Automatic Winner Selection:

    • If the statistics service does not respond, or if there is perfect equality between the variants, the AB test continues by splitting the audience equally among the variants.

    • The sending time of a Campaign with a winning variant cannot be modified once the Campaign has been launched.

    • The parameters of the experiment cannot be modified either once the Campaign has been launched.

    • Stopping a campaign is definitive.

    • The targeting of the Campaign is re-evaluated when sending the winning variant, and the individuals who have already received a variant are removed from the target. Thus the number of profiles in the Audience can evolve over the duration of the test.

    • It should also be noted that opens and clicks may be recorded after the winner has been selected, which may have an impact on the results of the test period.

    Preview as & Send a test

    Preview as

    Preview messages using any profile to check how personalization is applied. Simply enter the profile's Custom ID. If needed, you can locate the Custom ID by searching the Profile View with the email address or installation ID.

    The Profiles previously used for previews are automatically saved, making them easily accessible for future checks.

    Send a Test

    Testing your message before sending it to your audience is highly recommended to ensure proper delivery and correct rendering.

    For each channel, input the relevant recipient details:

    • Email: Enter email addresses separated with commas (,).

    • SMS: Enter a phone number in international format (e.g., +33...).

    • Push, In-App and Mobile Landing: Enter an installation ID or Custom ID.

    Recipient details for tests are also saved automatically for quick access during future tests.

    The test message sent will match your current configuration in the Batch dashboard, specifically:

    • The profile being impersonated using the Preview as feature.

    • The language version currently visible (if multi-language is enabled).

    • The A/B test variant currently visible (if A/B testing is enabled).

    This setup allows maximum flexibility to test any message composition effectively.

    For additional details on test email-specific behaviors, refer to the dedicated section Email.

    Error Prevention

    If your message is incomplete, you’ll receive a detailed warning, and the orchestration cannot be launched. However, it can still be saved as a draft for completion later.

    Refer to the dedicated sections for each channel to see what elements are mandatory.

    Note that what is explained on this page is focused on how messages works for email, SMS, In-App v2 and Push v2 channels. For Push v1, the behavior is slighly similar with a few differences. For exemples the AB test has only 2 variants.

    Illustration showing 3 campaigns as blocks to be migrated from a previous push solution to Batch

    Import tokens

    If you are coming from another push provider, Batch provides a way to import your existing iOS or Android tokens from any other push provider.

    Here is why you need to import your tokens after a migration:

    • Token collection: Batch needs to collect all your users' tokens again if you don't import them. Part of your userbase will be unreachable during this period.

    • App updates: Some users may not update your app. As a consequence, you won't be able to push them after the migration.

    • Inactive users: In case the OS automatically updates your app, your users will still have to open your app to get a new token.

    Batch can import all your existing tokens instantly with basic and custom data (e.g. attributes and arrays). This ensures you won't lose any tokens during the migration and you will still be able to send push messages to 100% of your audience.

    What is a token

    A push token is an anonymous ID generated by Apple (iOS) or Google (Android) for your installation. Batch's SDK collects automatically that token each time you open the app and sends it to our servers. If your users were offline the first time they opened your app, Batch will collect the token the next time they open it with a working Internet connection.

    Each time you schedule a push message sending from the Dashboard, Batch will:

    1. Select the installs associated to profiles matching your targeting;

    2. Find the tokens attached to these installs;

    3. Send the list of targeted tokens to Apple/Google with the message you want to deliver to these users.

    Apple and Google automatically invalidate push tokens when users uninstall the app. They will generate a new token if the same users reinstall the app later.

    Batch automatically takes care of updating/cleaning your users’ tokens. Please note we do not receive that kind of feedback in real time. We receive information on the validity of your users' tokens each time you try to send them a push notification.

    Please note that test push notifications do not trigger a token invalidation feedback by Apple or Google even if the device is no longer reachable, only push orchestrations in production will trigger a token invalidation feedback by Apple or Google if the device is no longer reachable. The response time from Apple or Google is very variable, the push token can be considered valid by Apple for several days or even weeks after their invalidation in some cases.

    Also, note that Google invalidates push tokens after 9 months (270 days) of device inactivity (= no activity on the entire device, not only on a specific app). Targeting an inactive user will generate an "invalid token" feedback in this case.

    Token import format

    The format of your devices' tokens export must be a valid CSV file (comma or semicolon delimited). Android/iOS devices tokens must be exported separately.

    Before sending us your export, please review the format of each field in your import file. The CSV file must contain the following fields, in this order: push_token, custom_id, region, language, timezone, install_date. Optional columns mean that their value can be empty, but they still must be present.

    Once you're done, please rename your CSV file as EXPORT_APPNAME_OS_APIKEY.csv (e.g. EXPORT_MYAPP_ANDROID_5BAB93CA7BD1A40183C959DA00CC0F). The "APIKEY" must be the Live API key of the app you will find in the dashboard settings. Then send the CSV files to . Our team will notify you once the import is complete.

    Importing custom data

    Attributes can be attached to imported tokens. All types of attributes supported on profiles can be imported.

    They should be represented as a JSON object of tags and attributes and then encoded as Base64.

    Attribute rules

    Attribute names are strings. They should be made of lowercase letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters (e.g. has_premium).

    Their values must be any of the following types:

    • String

      • Must not be longer than 200 characters and can be empty. For better results, you should make them upper/lowercase and trim the whitespaces.

    • Numbers

    • Dates

    Array rules

    Array names are strings. They should be made of lowercase letters, numbers or underscores ([a-z0-9_]) and can't be longer than 30 characters.

    They must be represented as an array of strings. Individual values must be lowercased strings, and not longer than 64 characters.

    Example

    JSON Representation of profile attributes.

    Which, encoded in Base64 for the CSV ends up being:

    Data lifecycle when importing tokens & their data

    Glossary

    • Anonymous Profile: a Profile without a Custom ID

    • Identified Profile: a Profile with a Custom ID, shared to Batch after sign-in or login

    Trying to import a push token that is already collected by Batch

    When your end user starts your app that implements Batch SDK, Batch automatically collects the push token, even if it was previously collected by your former push notification tool.

    So, when going through the CSV import file, we first check if the push token doesn't already exist in the Batch Profile base.

    In that case, we simply skip the import of the push token and its data.

    Import of anonymous push tokens & their data

    When processing your import file, Batch creates new profiles for previously unknown push tokens. Here's how it works:

    1. Batch checks if the push token exists in its system.

    2. If not found, a new profile is generated to store the token and its associated data.

    3. When the user launches the app, Batch creates another profile with the new installation's push token, marked as "collected."

    4. The profile with the imported token becomes orphaned.

    Import of push tokens & their data when they're linked to a Custom ID

    For push tokens associated with Custom IDs, the import process is as follows:

    1. Batch verifies if the push token exists in its system.

    2. If not found, Batch attempts to match the Custom ID from the import file with existing profiles.

    Scenario 1: Matching Profile Found

    We will merge the imported data with the existing profile according to these rules.

    1. Push token: Added to the existing profile.

    2. Custom attributes:

      • If the attribute already exists on the target profile or has been previously deleted (with a null value), the imported attribute will be skipped and the attribute value in the existing profile will be kept.

      • If the attribute doesn't exist on the target profile, the imported attribute will be merged into the profile.

    No profile exists with this Custom ID

    If no profile exists with the Custom ID:

    • A new identified profile is created.

    • All data associated with the imported token is linked to this new profile.

    Specific behaviors of native attributes

    Native attributes (language, region, timezone) can be imported alongside tokens.

    Important considerations:

    • These imported native attributes have the lowest priority for targeting or personalization.

    • Other methods of setting these attributes (e.g., via API) all take precedence.

    Export steps by provider

    Importing from Airship

    If you're coming from Airship, you will only need to request an export of your devices' tokens to your account manager.

    Before sending us the export at support@batch.com, make sure the data is in the format described above and rename the files as follows to make sure our team can import it as quickly as possible: EXPORT_APPNAME_OS_APIKEY.csv. We will notify you once the import is complete.

    Importing from PushWoosh

    You can request an export of your devices' tokens at , mentioning your username.

    Before sending us the export at support@batch.com, make sure the data is in the format described above and rename the files as follows to make sure our team can import it as quickly as possible: EXPORT_APPNAME_OS_APIKEY.csv. We will notify you once the import is complete.

    Importing from OneSignal

    If you're coming from OneSignal, you will need to request an export of your devices' tokens through an API export. You can find how to request your raw token export. This can be done from One Signal's dashboard too.

    Then, make sure the data is in the format described above and rename the files as follows to make sure our team can import it as quickly as possible: EXPORT_APPNAME_OS_APIKEY.csv

    All you have to do now is send us your exports at support@batch.com. Our team will notify you once the import is complete.

    What's next

    Once your push tokens have been successfully imported to Batch, your whole userbase is reachable and you can migrate your campaigns.

    Note that this page is related to token imports for Push v2. Push v1 works in a slightly similar way, but by Platform (iOS, Android).

    How to implement mobile push on iOS/Android?

    Welcome to Batch!

    Batch allows you to communicate with your customers on every contact point on mobile and desktop sending push notifications or displaying In-app messages.

    A full integration of Batch takes a week on average and is divided into five steps:

    1. Account creation - Required

    2. SDK integration - Required

    3. - Optional

    4. - Optional

    5. - Optional

    1. Account Creation

    You can create an account now on .

    We recommend that you invite your team members from the , in the bottom left corner of your dashboard, under "My team" > "Add member".

    Feel free to contact us at if your account is not on the correct plan.

    2. SDK Integration

    Once your account is created, add your first apps to the dashboard and follow the instructions described in the documentation: / / / / .

    • SDK integration

    • Push setup

    • In-app messaging setup

    On Android, make sure you choose an existing project instead of creating a new one on Firebase if you are migrating from another push provider.

    We recommend these additional steps after completing the basic integration:

    • Rich push notifications (iOS only): / / / .

    • Notifications icon (Android only): Set a and a custom . More information is available here for / .

    • Do Not Disturb mode: You should set the Do Not Disturb mode on the pages of your app where In-App messages should not be displayed ( / / / / ). In particular, to manage the display of In-App Messages with the splashscreen with the Android native SDK, you should implement the feature to exclude the splashscreen from the Batch start cycle.

    These optional steps might be necessary depending on your needs:

    • Custom In-App font: You can set a custom font for In-App Messages and Mobile Landings to align with your brand guidelines ( / / ).

    • Provisional authorization: On iOS versions higher than 12, you can add support for to push users who did not opt in for push notifications.

    • Analytics integration: Make sure you integrate an event dispatcher to connect Batch to your analytics tool and improve the campaign conversion tracking (e.g., Google Analytics, Firebase Analytics, AT Internet, etc). More information here: / .

    You can find a sample of the SDK integration here: / / / .

    3. Profile Data Collection

    In addition to the data the SDK in your app, you can collect Profile data to improve your user segmentation.

    Custom User ID

    Batch can collect a unique user ID ( / / / /) that will uniquely identify user Profiles and centralize profile data from attached devices. This is a recommended step if your app has a login wall or if users can create an account inside your app.

    You can use that Custom user ID with the to:

    • send events to trigger 1-to-1 push notifications to one or several user IDs (e.g., package delivery notification, etc) ;

    • send profile data (attributes, events, or arrays) to Batch to enrich a user's profile data.

    User ID collection also allows your teams to target with one click users who are/are not logged in (see ).

    Don't know what ID to choose? Refer to our dedicated guide:

    Custom Language/Region

    Batch automatically detects the language and the country of your users’ devices.

    If your app is available in multiple languages and/or multiple countries, we recommend that you overwrite the values automatically detected by Batch: / / / / .

    Tagging Plan

    In addition to the data collected natively by the SDK (e.g., last visit date, installation date, etc), you can collect additional information on your users and feed Batch with non-user-centric data.

    👉 Refer to our dedicated guide on .

    Your developers can start the basic integration of the SDK while the tagging plan is being discussed. The tagging plan is usually planned at the very end of the integration.

    Test and Release

    Before releasing your apps to the stores, please follow the steps from these guides to review the implementation:

    4. Push token migration

    Batch can import existing tokens in case you migrate from another push provider.

    In this case, please refer to our documentation on .

    5. API setup

    With Batch RESTful APIs, you can easily send profile data and trigger push notifications to leverage Batch’s engagement features:

    • The allows you to create and enrich user profiles with profile data such as attributes, events, and arrays. This data can then be used to create segments or trigger messages.

    • The allows you to send one-shot push notification campaigns to your segments built based on chosen criteria.

    • The allows you to retrieve your campaigns' performance data to feed your analytics or BI tools with more insights.

    Feel free to check our if you also want to send notifications to the visitors of your website.

    Channels

    You will find here all the settings related to your different channels.

    Email Settings

    Email senders

    Email settings is where you setup email senders, such as "coupons@company.com".

    The latter part of the email sender (e.g.: "@company.com") is setup a implementation time with Batch teams, and associated to one of the sender types defined below.

    You can freely define the first part of the email sender (e.g.: "coupons") in this Settings section.

    Three sender types exist:

    • Marketing: senders used for marketing purposes, such as email blasts and promotional campaigns.

    • Transactional: senders used for transactional purposes, such as account creation or purchase confirmation.

    • All: senders that can be used for both purposes. This is mostly useful for pre-production / testing purposes.

    These senders type are linked to different IP ranges. This is made to make sure deliverability is optimal, especially for transactional messages.

    When you will create a marketing or transactional orchestration, senders will filters based on their types.

    Also, when you send a campaign via the Campaign API, you can specify the sender you want to use bases on the sender ID visible on this page.

    Send rate

    You can specify the number of email messages to be sent per minute to protect your app or website architecture.

    Even tough the Send rate is different for Push and Email, it operates identically (the default value is different but the functional logic is identical). Check a bit further down this page.

    Push Settings

    You will find here all the settings related to push notifications, from uploading your iOS certificate, editing your FCM IDs to editing the push delivery speed.

    Separate settings apply to Push v1 and Push v2, and you will find a dedicated section for each in the interface:

    • You will find the Push V2 settings in a ‘Push’ tab in the Channels settings.

    • And the Push V1 settings via the ‘more’ dropdown in the top right-hand corner of the Channels settings.

    Note that :

    • The section on test devices has not been reproduced on the push V2 settings.

    • Push configurations operate identically for both Push V1 and Push V2, as do the following settings: priority, expiration TTL, and collapse key.

      • The only difference is that the push V2 default Orchestrations settings (TTL, priority, Collapse key) are common to the different platforms (IOS, Android, Web).

    • Managing message sending speed works differently between Push V1, where the feature is called

    To learn more about Push V1 settings, check .

    Restricted to users with App or Administrate rights.

    Push configuration

    Apple Push Notification Service (APNS)

    On iOS, Batch servers need to have a valid certificate to communicate with Apple Push Notification Services (APNS). There are two types of files you can use:

    • p8 files (recommended): Valid for all the apps added to your Apple developer account. You will need to specify the Application Identifier (App ID) or the Bundle ID of your app on Batch's dashboard.

    • p12 certificates: Generated for a unique App ID and are only valid for one year.

    If you are using a p8 file, here are the fields you will need to fill in:

    • App ID / Bundle ID / Topic: We recommend you use the bundle ID you will find in Xcode. You can also use the app ID available from the .

    • Team ID: The team ID is also available from the .

    On iOS, if the development version of your app uses a different bundle ID than your production app, you will need to create two separate apps on the dashboard.

    Firebase Cloud Messaging (FCM)

    Basic Setup

    On Android, Batch needs a Service Account Key issued from your Firebase project to send notifications. Service Account Keys can be generated from the .

    Once you are logged in, select your project then click the ⚙ next to your project name and "Project settings". Click on the "Service Accounts" tab, and then on the blue "Generate new private key" button to create and download a key.

    Using Several FCM Service Account Keys

    You can provide several service account keys for a single Android app. Batch will automatically use the appropriate key when sending notifications to a token.

    This is useful if you have to switch to another Firebase project (e.g. lost Firebase credentials, etc) and want to keep sending push notifications to users who didn't update the app yet. You can also use that feature to avoid creating two separate apps if you don't use the same Firebase project in staging and production.

    Click the "Update FCM config" button and confirm. You can now upload a new service account key.

    Web

    Web push API settings (Chrome, Firefox, Safari on macOS Ventura or higher)

    Vapid Keys

    Each website has a pair of VAPID keys associated with it:

    • A public key: Inserted in the JavaScript tag and used to request a subscription to the browser's push service when users turn on push notifications.

    • A private key: Used by Batch servers to sign the authorization headers sent to the push service of each browser, when you want to send a notification to your opt-in users.

    If needed, you can change the VAPID keys to match the one you were using with another provider.

    SDK Auth Key

    The SDK Auth Key is a key generated by Batch for every website added to the dashboard, using the SDK API Key and the URL declared when you added your website. A new SDK Auth Key will be generated if you change the URL of your website in the dashboard settings.

    The Auth Key is used in the JavaScript Tag on your website. It authenticates the requests sent to Batch servers. If that SDK Auth Key doesn't match an existing Auth Key generated in the past for your SDK API Key, Batch will reject the request (e.g. 401 error - unauthorized).

    If you need to test your integration on a different domain than the one declared in the dashboard settings, you will need to set the "dev" parameter to true in your JavaScript tag and declare your development origins.

    Subdomain Name

    Only used in deprecated HTTP / multidomain mode

    Name of the subdomain Batch will use for your website.

    Safari (≥ macOS Ventura)

    For Safari (< macOS Ventura), Batch needs a website name to communicate in the push package requested by Safari before displaying the authorization prompt to a user. This is the name that will appear on your Safari push notifications.

    Batch also needs a list of allowed domains as well as push certificates associated with each domain in order to communicate with Apple Push Notification Services (APNS). Each certificate is generated for a unique Website Push ID.

    Allowed Dev Origins

    List of additional origins authorized in development mode, only when the 'dev' parameter is set to true in your JavaScript tag.

    Web Push Icons

    • Default icon: This icon is displayed on all web push notifications. It is mandatory to upload one for Safari web push configuration.

    • Small icon: This icon is displayed on web push notifications received on Android devices.

    Orchestration default settings

    Send rate

    Send rate :

    • Is counted in messages per minute.

      • If a Profile has several installations, then messages will always be sent at the same time to all these installations, so there is no risk of a user receiving the same communication but at different times on different installations.

    • Is common to all platforms (iOS, Android, Web).

    • Is round down to the lowest integer, e.g. for a rate of 1000 msg/min that's 16.66 msg/s, which we round up to 16msg/s so we can assure that we will never send faster than the specified rate.

    Send rate is set in 3 places:

    • In Channel settings, where it is set as the default value. You can activate it or not, and set a value if activated.

      • The default send rate will apply to new Orchestrations only, existing Orchestrations will not be impacted by changes to these default settings.

      • We provide an estimation of the sending time based on the size of the userbase and the defined delivery speed.

    • In Orchestration settings, where you can change the default value to apply a different send rate to an Orchestration.

    Restrictions and limitations:

    • Minimum and Maximum Send rate :

      • Minimum: 1,000 messages/minute.

      • Maximum: 1,000,000 messages/minute.

    • Maximum Sending Time: when an Orchestration sending time exceed 12 hours, remaining messages are dropped / will not be sent. This prevents excessively long sending durations that could impact Orchestrations effectiveness.

    Expiration (TTL)

    You can set a global expiration delay or a Time To Live (TTL) in hours for all the notifications sent to your app/website users. The notification won't be displayed if the device doesn't receive it or doesn't come back online within this time.

    By default, Batch sets a TTL of 14 days for all the notifications you send. If your user's device comes back online before being off for two weeks, it will display the last notification you sent to your user (iOS) or all the notifications sent over the previous two weeks (Android and web push). On iOS, APNS should only store for one month the notification waiting to be displayed.

    If you setup a different TTL between iOS and Android and send a push on both platforms, iOS TTL will be leveraged.

    Priority

    iOS/Android only

    Defines the priority of your notifications on iOS (APNS) and Android (FCM). The default value is high on iOS and Android.

    On Android, you can use the high priority if you have a messaging/VoIP app and if you notice delivery issues due to native (Doze) or constructor related (Samsung Smart Manager, etc) energy-saving features.

    If you setup a different a different priority between iOS and Android and send a push on both platforms, iOS TTL will be leveraged.

    High priority Android notifications can drain your user's battery faster since they wake up the device and open a network connection. Switch to Normal priority if your notification is not time-sensitive.

    Collapse Key

    Android only

    Defines how notifications are managed when an offline device goes online. If enabled, the device will only show the most recent notification. If disabled, it will show all the notifications received when the device was offline.

    You should disable the collapse key if all your notifications matter (e.g. messages, etc). You can use up to three different collapse keys if you want users to get only one notification of each kind when coming online (e.g. marketing message, alert, etc).

    SMS Settings

    Most SMS settings are configured during implementation. For more information, visit the .

    URL shortening and tracking

    can be toggled on or off anytime in the SMS settings page.

    How to implement Web Push with Batch?

    Welcome to Batch!

    Batch allows you to send push notifications directly to web browsers on desktop and mobile. They allow you to re-engage your users, even if your website is closed. After a 30-minute setup, you will be able to push them directly from your website without making them install your app. And just like native applications, web push notifications can include rich content.

    A full integration is divided into five steps:

    1. Account creation - Required

    2. SDK integration - Required

    3. - Optional

    4. - Optional

    5. - Optional

    6. - Optional

    1. Account Creation

    You can create an account now on .

    We recommend that you invite your team members from the , in the bottom left corner of your dashboard, under "My team" > "Add member".

    Feel free to contact us at if your account is not on the correct plan.

    2. SDK integration

    Once your account is created, add your website to the dashboard.

    You will find all the technical details on the integration in the :

    1

    JavaScript Tag

    Get the tag: Batch automatically generates the JavaScript tag when you add your website to the dashboard. You will find it by clicking the "Integrate" button in the top right corner or in "Settings" → "Channels" → "Website" → "Get the code".

    Add the JavaScript tag to the code of your web pages. This can be done manually or using a Tag Manager (e.g., ).

    2

    Alternative integrations:

    • If you cannot upload the Service Worker at the root of your website, you need to declare its path ()

    • If your website is already using a service worker, you will need to take the steps described here in the .

    Take these two extra steps to perform a full integration of Batch:

    • Icons: Set up a default and a small icon to ensure notifications are displayed correctly ().

    • Opt-in optimisation: Customise the pre-permission prompt that will allow you to collect your users' tokens.

    The integration may vary if you .

    3. Opt-in optimisation

    To maximise the chances that your users subscribe to notifications, we built multiple ways of asking for permission ().

    You can choose between three different formats:

    • An alert

    • A banner

    • A button.

    In case you don't want to use Batch's formats, you can trigger the native prompt of each browser. That permission request can be shown 3 times a week.

    • Safari & Firefox: The native permission request must be triggered by a user action (e.g. a click). A custom pre-permission prompt is often used to ensure this flow.

    • Chrome / Chromium: We recommend relying only on the native request, as extra steps generally reduce opt-in rates.

    4. Profile data collection

    In addition to the data the SDK on your website, you can collect profile data to improve your segmentation and personalization.

    Custom User ID

    Batch lets you track a unique user ID () that will uniquely identify user Profiles and centralize profile data from attached devices. This is a recommended step if your website has a login wall or if users can create an account on your website.

    You can use the Custom user ID with:

    • The , to send push notifications in mass to your users remotely (e.g., from a CMS, etc). ;

    • The , sends custom data (attributes and events) to Batch on a user ID server-side.

    User ID collection also allows your teams to:

    • Target logged-in / logged-out users (see )

    • Upload static segments exported from your userbase (e.g., top 500 buyers, etc) or created by third-party tools (see )

    Custom Language/Region

    Batch automatically detects the language and the country of your users’ browser. If your website is available in multiple languages and/or multiple countries, we recommend that you overwrite the values automatically detected by Batch ().

    Tagging Plan

    To go further, you can collect additional information on your users and feed Batch with non-user-centric data.

    👉 Refer to our dedicated guide on .

    Your developers can start the basic integration of the SDK while the tagging plan is being discussed. The tagging plan is usually planned at the very end of the integration.

    5. Test and release

    You should see a push permission prompt the next time you visit your website. We recommend you try sending a test notification to your browser after accepting push notifications: .

    Once the integration is completed, the JavaScript tag can be released. Batch will start collecting your users’ tokens, and you will be able to send your first notifications from the dashboard.

    6. APIs Setup

    With Batch RESTful APIs, you can easily send profile data and trigger push notifications to leverage Batch’s engagement features:

    • The allows you to create and enrich user profiles with profile data such as attributes, events, and arrays. This data can then be used to create segments or trigger messages.

    • The allows you to send lists of user IDs. Your segmentation will then be available on the dashboard as an Audience.

    • The allows you to send one-shot push notification campaigns to your segments built based on chosen criteria.

    Depending on the use cases you plan to set up, we can help you through the use of these APIs.

    How to prepare for the migration from the MEP to the CEP? (for CRM teams)

    Learn how to prepare your data, segments, and campaigns to ensure a seamless transition from the MEP to the CEP.

    Migrating from the Mobile Engagement Platform (MEP) to the Customer Engagement Platform (CEP) is a major step forward. It allows you to manage all your engagement channels (push, in-app, email, web push) from a single dashboard, powered by a unified user profile and real-time orchestration.

    While the technical migration (SDKs, APIs, connectors) is handled separately, this guide focuses on what operational teams need to do to get ready for the switch.

    If you are looking for the technical migration checklist, you will find it here.


    1. Validate your data and tagging plan

    Once your user profiles are synchronized, the first step is to validate your data. From the Profile Data section, you can now check which attributes and events are available for each platform (Android, iOS, Web).

    Each data point includes a source indicator by platform. Make sure that your key events (such as session starts, purchases, and subscriptions) are consistent across all platforms.

    Validated data will be available for segmentation and trigger automations later.

    Validate your tagging plan before creating new campaigns. This ensures that all data used for segments and automations is fully synchronized.


    2. Create shared labels across all platforms

    Labels in the CEP are cross-platform. This means a single label can be used from Mobile and Web pushes to Email or SMS, making campaign organization and reporting much simpler.

    Navigate to the Labels tab and recreate your existing labels there. You will be able to filter, group, and report on campaigns more easily than before.

    Why labels matter Labels are key to keeping your campaigns organized and measurable. They let you classify, search, and report across all campaigns, regardless of channel or platform. Well-structured labels also power cross-platform analytics and simplify capping and performance tracking. Learn more about label management in the .


    3. Define cross-platform capping rules

    Once your labels are ready, it is time to define your capping rules. Capping now works across all platforms, ensuring users won’t receive too many notifications regardless of the device they use.

    You can create your new rules in the Capping tab.

    If you set a capping rule of 2 messages per day, a user receiving a web push and a mobile push counts as 2, even if they’re on different platforms.


    4. Create dynamic segments for recurring audiences

    Segmentation has been completely redesigned in the CEP. You can now create dynamic segments that automatically update based on real-time user data. These segments can then be reused across multiple campaigns or automations.

    1. Go to the Segments tab.

    2. Create your audiences using the filters and attributes you validated earlier.

    3. Save them for recurring use in campaigns.

    Use dynamic segments for recurring audiences like “Active users last 7 days” or “Users with push enabled.”


    5. Set your delivery speed (Send Rate)

    The Send Rate (delivery speed) sets the maximum speed at which your messages are sent. It works like a speed limiter, ensuring the system never sends faster than the configured rate. The actual speed may vary depending on system load or network conditions. This helps you manage server load and control pacing during large-scale message sends.

    You can adjust the send rate from the Push Settings tab when creating or editing a campaign.


    6. Replicate your recurring campaigns to the CEP

    Recurring campaigns created in the MEP can be easily migrated to the CEP. Use the Replicate on CEP button available in your MEP campaign list.

    Once replicated, you will be able to manage these campaigns directly in the new dashboard, using the unified CEP interface.

    Review the mobile landing, label, and segments once replicated; these may differ slightly depending on your new setup.


    7. Recreate your trigger automations

    Trigger campaigns are now orchestrated from the Omnichannel section of the dashboard.

    You can recreate your previous triggers here and benefit from advanced CEP orchestration capabilities:

    • Multi-channel triggers

    • Quiet time management

    • Enhanced conditions

    • A/B/C/D testing on time, content, channel

    For a full walkthrough, visit the .

    Do not copy-paste dynamic content from the MEP to the CEP.

    When migrating your push automations from the MEP to the CEP, avoid copying and pasting message content that contains personalization variables (e.g., u.optin_compositionbox_pushnotif, triggerEventAttr, etc.).

    The CEP uses a different syntax and variable engine. If you copy/paste MEP content directly, your personalization rules (conditions, variables, or fallback values) will not display correctly during tests or live sends.

    ✅ What to do instead

    • Reinsert all personalization variables manually using the Insert Variable button in the CEP editor.

    • You don’t need to modify or remove prefixes, such as u. because these were part of the MEP’s template language and are handled differently in the CEP.

    • Ensure the attributes you use exist in your CEP data model. Native attributes now use the prefix b. (for example: b.my_native_attribute

    If you are unsure whether an attribute is available in the CEP, check the Profile Data tab.


    8. Prepare and activate your new In-App templates

    In-App templates have been redesigned in the CEP with a more flexible format and new design options. They will be available once your mobile apps are updated with SDK 3.1.

    You can already prepare these templates in advance from the In-App Templates tab.

    Important

    If migrating from In-App v1 to v2, you must manage this transition carefully to avoid disruption.

    Here is how to:

    • You should activate the

    Existing in-app campaigns will continue to run on the MEP during the transition. Once SDK 3.1 is live, recreate your templates using the new format.

    For a full overview of the new In-App features and capabilities, .


    9. Review the final checklist before launching campaigns

    ✅ Validate your tagging plan ✅ Create shared labels ✅ Define capping rules ✅ Build dynamic segments ✅ Set your delivery speed ✅ Replicate recurring campaigns ✅ Recreate triggers in Omnichannel ✅ Prepare new In-App templates

    Once these steps are complete, you are ready to launch your first campaigns on the CEP.


    Next steps:

    [
        {
            "identifiers": {
                "custom_id": "129c7819-9c88-496e-9a5f-62db34a3ce61"
            },
            "events": [
                {
                    "name": "order_shipped",
                    "attributes": {
                        "id": "BC257637",
                        "url(parcel_tracking_link)": "https://wwww.mybrand.com/BC257637"
                    }
                }
            ]
        }
    ]
    <div style="display: none; max-height: 0px; overflow: hidden;"> YOUR PREHEADER TEXT </div>
    src="images/image-name"
    {% if user_gender == 'female' %}
      <img src="images/female.png">
    {% else %}
      <img src="images/male.png">
    {% endif %}
    https://drive.google.com/{{ triggerEventAttr('attribut') }}
    https://nom-entreprise.typeform.com/to/xxxx#email={{attribut1}};user_id={{attribut2}};language={{attribut3}}
    {BATCH:TITLE} // notification title
    {BATCH:BODY} //notification body
    {BATCH:DEEPLINK} // notification deeplink
    {
      "body_key": "{BATCH:BODY}",
      "url_key": "{BATCH:DEEPLINK}",
      "title_key": "{BATCH:TITLE}"
    }
    {
        "test_key": "yes",
        "url_key": "{BATCH:DEEPLINK}",
        "id_key": "1234"
    }

    The targeting.

  • The ability to stop and resume the Automation.

  • Replicating an IP warm-up orchestration is not allowed.

  • Stop/Rerun is blocked from the main listing (to enforce awareness of changes).

  • Replicate.

  • Delete.

  • If Stopped:

    • Edit Orchestration.

    • Go to Analytics.

    • Launch Automation.

    • Replicate.

    • Delete.

  • If running:

    • Edit Orchestration.

    • Go to Analytics.

    • Stop Automation.

    • Replicate.

    • Delete.

  • If completed:

    • Go to Analytics.

    • Replicate.

    • Delete.

  • First run: The date and time the Automation was run for the first time.

    • The dates displayed are based on your browser's local time.

  • "Global Time" is forced for simplified time management (not possible to send the Campaign on local time).

    ).
    Switch to In-App v2
    flag only when a sufficient number of users have migrated to
    SDK 3.1 or later
    .
  • You can estimate this share using the estimated reach feature, which filters out users running an older SDK version.

  • No rollback is possible: once the new endpoint is serving v2 In-App automations, you cannot revert to v1.

  • Labels documentation
    Trigger Automations documentation
    see the In-App documentation
    Read the full technical migration checklist
    Explore CEP trigger orchestration

    Optional The installation date as a UNIX timestamp (in seconds). It may be used for the initial targeting of imported tokens, but will be overwritten once the token is collected.

    Must be sent as UNIX timestamps in seconds, and their key wrapped in date(). E.g. "date(birthday)": 1512640800

    Id

    Description

    push_token

    Required A device's push token

    custom_id

    Optional The custom ID of a user if you have one (email address, integer, etc).

    region

    Optional Country of the user. If you do not specify a region, the user will automatically be put in the XX (no country) category. This should be written in ISO 3166-1 alpha-2 format. See here for all valid region codes. E.g. "US"

    language

    Required Language of the user in ISO 639-1 format. See here for all valid language codes. E.g. "en"

    timezone

    Optional User's timezone name in TZ database format. If you do not specify a timezone, it will be "GMT".

    E.g. "Europe/Paris"

    custom_data

    Optional Custom attributes and tag collections. See Importing custom data for more information.

    support@batch.com
    help@pushwoosh.com
    here

    install_date

    {
      "age": 26,
      "finished_onboarding": true,
      "first_name": "John",
      "date(became_premium)": 1512640800,
      "interests": ["sports", "finance"]
    }
    ewogICAgImFnZSI6IDI2LAogICAgImZpbmlzaGVkX29uYm9hcmRpbmciOiB0cnVlLAogICAgImZpcnN0X25hbWUiOiAiSm9obiIsCiAgICAiZGF0ZShiZWNhbWVfcHJlbWl1bSkiOiAxNjU5NjQwODAwLAogICAgImludGVyZXN0cyI6IFsic3BvcnRzIiwgImZpbmFuY2UiXQp9
  • Improved debugging: Display the Installation ID generated by Batch safely in your app to help users report issues with push notifications or allow your team to add their device as a test device (iOS / Android).

  • Profile data collection
    Push token migration
    API setup
    https://batch.com/register
    account manager section
    support@batch.com
    iOS
    Flutter
    React Native
    Cordova
    small icon
    accent color
    Cordova
    React Native
    iOS
    Android
    Flutter
    React Native
    Cordova
    Excluding activities
    iOS
    Android
    React Native
    provisional notifications
    iOS
    Android
    iOS
    Android
    React Native
    Flutter
    collects natively
    iOS
    Android
    Flutter
    React Native
    Cordova
    has custom user ID
    iOS
    Android
    Flutter
    React Native
    Cordova
    How to create a Tagging Plan?
    How to test the integration on iOS?
    How to test the integration on Android?
    migrating Mobile Push to Batch
    web push integration guide
    'delivery speed,'
    and Push V2, where it's named
    'send rate.
  • In the Campaign API for Campaigns sent via API. Check the following documentation to learn more on the .

  • Push Send rate documentation
    this documentation
    Developer Console
    Developer Console
    Firebase Console
    SMS Channel page
    URL shortening and tracking

    Service Worker

    Download and upload the Service Worker to the root of your website.

    The Exports API allows you to retrieve your campaigns' performance data to feed your analytics or BI tools with more insights.
  • The GDPR API requests a data report containing a specific user's data or triggers the removal of the user's data.

  • Opt-in optimisation
    Profile data collection
    Test and release
    APIs setup
    https://batch.com/register
    account manager section
    support@batch.com
    Google Tag Manager
    see documentation
    documentation
    know more here
    integrate Batch into a Progressive Web App
    know more here
    collects natively
    see documentation
    Campaigns API
    Profile API
    has custom user ID
    Audiences
    see documentation
    How to create a Tagging Plan?
    How to test my web push integration?
    Profile API
    Audience API
    Campaign API
    isBatchPush()
    A screenshot of the Batch dashboard, in the automation builder section, that shows the details of a push notification "order shipped"

    Create your first trigger automation

    Need help creating your first trigger automation? Here are all the steps you need to follow.

    Trigger automations allow you to respond to user actions or events in real time with personalized messages. They’re ideal for onboarding sequences, re-engagement flows, or any scenario where timing matters. This guide will walk you through setting up your first trigger automation in Batch, covering targeting, scheduling, and message composition. Let’s get started! 🚀

    The ‘Automations’ tab is dedicated to ‘automated’ campaigns such as Recurring and Trigger.

    Here is a short guide to help create your first omnichannel trigger automation on Batch following the 4 steps of the automation builder:

    1. Set up entrance: which event triggers the campaign, its lifetime, its target, etc;

    2. Manage the first delay and cancellation events: when to send the email and which event can cancel it;

    3. Compose your message: the content of the campaign that will be sent to the user;

    4. Add a second message sent after a delay.

    First, go to Automations > New automation, start a new Omnichannel trigger, and name it:

    Optional: you can add to your automation (up to 5):

    serve two main purposes: they allow you to set a marketing pressure limit across all campaigns/automations sharing the same label, and they enable you to filter campaigns/automations based on their assigned labels.

    Then, let's set up your trigger automation! 💪

    Automation Settings

    It is time to define when to send your automation and who to send it to!

    1. Entry Event

    By clicking on the Select trigger frame a new modal opens. There, you will be able to choose the right trigger event and all the orchestration settings.

    💡 Let's take the example of a cart abandonment scenario! The idea is to bring in all users who have reported the “added_to_cart” event with a value of over 50 euros or more:

    After selecting the trigger event, there are 4 settings:

    • Capping

    The capping is the limit on the total number of entrances followed by at least one message sent to the user.

    If you put “2”, it means the user will not enter more than twice an automation that sent him at least a message.

    🔎 More examples

    If the capping is “2” in an automation that has 5 messages steps:

    • case 1: the person enters, waits in a delay step and ends up being excluded from the automation by a cancel event before being addressed by a message, it’s not counted for capping.

    • case 2: the person enters once and receives 5 messages, it counts as “+1”

    • case 3: the person enters and receives only 2 messages and then is excluded due to a cancel event, it counts as “+1".

    By clicking the toggle button you will be able to define that limit 👇

    • Grace period

    Use the grace period to set a minimum delay in hours or days for a user to re-enter an automation after exiting it. A user can exit an automation for two reasons:

    • Because of an exit event

    • He arrived at the end of the automation.

    Note that if a user enters the automation but exits it before receiving any messages, we do not apply the grace period. So he could re-enter the automation right after exiting it if he triggered the event again.

    • Parallel automations

    By default, if the user fires the trigger event of the automation multiple times, it will be reset.

    You may want to parallelize automation flows and allow the user to trigger several times the same automation. You can do that by activating the Parallel automations mode.

    The mode allows you to trigger an automation each time the user fires the trigger event with a new event parameter (Ex: Trigger an email for each trip booked by the user based on the trip ID parameter). This ID must be one of the attributes attached to the event or the event label and can only be a String.

    Click on the Continue button to continue to set up your automation!

    2. Targeting

    Click on the Targeting icon to display the targeting modal where you will define the segmentation of your campaign.

    By default, Batch considers that you will target your entire audience. First, you can select a specific country or language.

    Then, you can refine your segmentation by clicking:

    • 'Add Condition': from then on, you will be able to select native targeting elements (Email domain, etc.), but also profile attributes (data specific to your app business and selected thanks to the tagging plan).

    • 'Use Segment': this will allow you to call as blocks in the targeting and combine segments (inclusions and/or exclusions) by calling up to 10 segments in your targeting. When a segment is linked to an orchestration, you can access / view the segment by clicking on the eye icon 👀

    • 'Use Audience': you can add a specific to your email (find how to create a Custom Audience

    Also, note that if you focus sendings on opt-in contacts (which will happen for all non-transactional use cases), the opt-in status will be checked before each email sendings, to make sure the user is still opted-in. If, along with an automation, the person opt-out, it will continue its progress but not be messaged (until the user potentially re-optin).

    Play with AND/OR option

    You can add up as many conditions as you want, and create specific scenarios by clicking on 'AND/OR':

    When you are satisfied, click on the Continue button!

    3. Timing

    Click on the Timing icon to manage the lifetime of the automation by choosing specific starting and ending dates:

    4. Quiet times

    You can add Quiet times setting to specify either quiet hours or quiet days, during which the profiles in this automation will not be messaged.

    Click on the Quiet times icon to choose the right timeslot:

    You have two fallback strategies to choose from if your communication is sent during these Quiet Times:

    • Send at the next available time;

    • Skip the message and continue;

    Delay and Exit events

    Now that you have successfully set up your trigger event, you can manage when to send your automation and if you want to cancel the sending after the occurrence of chosen events:

    The first delay can be conditional to a date passed in the event. For example, it’s possible to have in the event 1st January 2024 and set up a +3 days timer. Note that in that case, we’d not allow a longer than 64 days wait time as a default setup.

    The first delay and all others can also be a simple delay of up to 30 days.

    • Exit event(s)

    By clicking the toggle button you will be able to add one or several exit events:

    Users who trigger one of the exit events will exit the automation. You can use a custom event and apply filters based on additional event data (Label, Attributes, Tag collection).

    If you are using Parallel automations, the exit event must have the same ID as the entry event. If the ID differs, the cancellation will not be processed.

    Add further messages and delays

    You can add other automation steps with delays after your first message by clicking on the + icon!

    Clicking on it will automatically add a delay step followed by an automation step. You can modify the delay and add a cancellation event by clicking on the timer button.

    The maximum number of automation steps is 20.

    Point of attention: Be careful of the behavior of the automation in the case of multiple steps. If no parallel automation mechanism applies, and if the trigger happens again for a user already in the automation, it will restart and the user will restart from the beginning. Then, the grace period and the capping will not applied.

    This behavior will evolve shortly to treat this use case better.

    Yes/No Split

    Set up complex flows in your Automations and split users based on a new targeting rule along the journey!

    Imagine different scenario branches based on Profiles conditions and unlock a wide variety of sophisticated and personalized CRM scenarios without losing the simplicity of Batch Dashboard.

    The Yes/No Split leverages all Profiles data to split the workflow into 2 branches:

    • Yes, people match the condition;

    • No, they don’t.

    Then, you can send a different message or even a different type depending on whether the user matches or doesn't match the new rule.

    Example: Here the split will depend on whether users are opt-in to marketing emails or not. If they are, they'll get an email. Otherwise, they'll get an SMS message ✅

    How to use it?

    Once you have chosen the trigger event, you can add the Yes/No Split at every step of an omnichannel trigger automation. Click on the + button and then select Yes/No Split:

    Then, choose a new segmentation rule to set up the split and give it a name:

    It can be through Segments (more information on user Segments ), or Custom Audiences (more information on Custom Audiences ).

    Be aware that entry event information cannot be used as split targeting rules.

    Random Split

    The Random Split allows you to divide the users of an automation into 2 to 4 groups based on algorithms. You may choose the percentage of users entering each group according to your use case and customize everything on the branch such as delays or exit events.

    This allows you to test and optimize use cases. Try different series of messages, various delays and times of sending, other content and types of messages. Learn more about use cases in 👈

    Let's now see how to create these branches! 💪

    How to use it?

    Once you have chosen the trigger event, you can add the Random Split at every step of an omnichannel trigger automation. Click on the + button and then select Random split:

    Then customize the branches as you wish! By clicking again on the '+', add messages, delays, exit events or even another split on the branches.

    Choose between 2, 3 or 4 branches and adjust the percentage of users of each of them. Just keep in mind that the sum of branches must always be 100%.

    The algorithm for randomization is efficient at high volumes but less at very low volumes. If you send 30 people in the automation for a test and have 3 (33%, 33%, 34% branches) you might not have exactly 10 people by branch.

    Message

    Message editors vary from one channel to another. To learn more about composition, visit the following sections:

    Run your Trigger Automation

    Now that your trigger automation is ready, you can either run it or keep it as a draft and launch it later 🌟

    Once your campaign is live, you can track its performance in the section.

    Targeting

    Thanks to the Batch Query Builder, present on all Orchestration creation interfaces and Segments, you can define precisely who you are going to target.

    Our Query Builder is composed of all the elements encompassed in the block called Targeting:

    • Collected/Imported tokens.

    • Marketing/transactional

    • Country

    • Language

    • Segmentation

    This documentation walks you through these different targeting capabilities.

    Targeting collected or imported push tokens

    This section is visible on your dashboard only if you are in the process of importing app push tokens* from a third party tool (through a CSV upload). For more information on how to import tokens check

    After uploading your CSV file you will be able to define in the targeting of your Campaigns and Recurring Automations** through the “Filter push tokens” section if you want to target :

    • Imported tokens only (tokens not yet known to our SDK).

    • Collected tokens only (tokens known to our SDK).

    • Both types of tokens, imported and collected.

      • This option is only possible from the Campaign API.

    Unlike the rest of the targeting at query builder level, targeting is done at installation level and not at profile level. As a result, if a profile has 2 push tokens, one collected and one imported, if you target the collected tokens then only the collected token of the profile will receive the message and not the other token attached to the same profile.

    *This filtering only concerns app tokens and not web tokens. **The targeting on collected/imported is not available for Trigger Automations.

    Defining if the orchestration is Marketing or Transactional

    For both SMS and Email Orchestrations, you will have to define in your targeting if:

    • Your message is for transactional purposes:

      • If you select this option, all your profiles with the channel on which you are creating a message, opt-in or not, will be targeted.

    • Your message is for marketing purposes only:

    Adding conditions

    • Click the "Add condition" button to see the list of Built-in and profile data you can use to define your targeting.

    • You can add up to 31 targeting conditions and up to 64 values in each targeting condition and nest them into subgroups.

      • Within a group, the same AND & OR operator established the link between conditions.

      • Between groups, you can use different AND & OR operators.

    Adding Segments

    Segments allow you to save time when creating your targeting by calling pre-defined dynamic user targets.

    • Click the “Use Segment” button to define the Segments you want to include or exclude from your targeting.

    • You can call several Segments within the same Segment condition:

      • Up to 10 segments can be called.

      • Segments leverage specific operators allowing you to check the pertenency of a person to at least one of the segments listed (contains any of) or all (contains all of)

    Check the .

    Adding Audiences

    Audiences allow you to upload static user targets exported from your userbase (e.g. top 500 buyers) or created by third-party tools.

    • Click the “Use Audience” button or select the “Audiences” condition within the Built-in data to define the Audiences you want to include or exclude from your targeting.

    • As for Segments, you can call several Audiences and Audiences leverage specific operators (contains any of, etc.)

    Check the .

    Using Countries and Language Targeting

    Batch captures users' language and country within Profiles. You can use this data for targeting purpose.

    • You can select countries and languages by using the drop-down menu or typing.

    • There is no limit to the number of countries and languages you can select.

    Targeting on Built-in data

    Built-in data allow you to target users based on common and essential information about profiles. They can be automatically collected by Batch (e.g. app version after SDK implementation) or be sent via API or Batch SDK (e.g. email address).

    Opt-in statuses

    Use it to target users according to whether they are Opt-in or not to your channels:

    • Email Opt-in: users who are subscribed to your marketing email communications.

    • SMS Opt-in: users who are subscribed to your marketing SMS communications.

    • Push Opt-in*: users who are subscribed to push notifications.

      • You can target users according to whether they are opt-in to Web and/or IOS and/or Android push notifications.

    *Imported tokens are not considered as Opt-in.

    Has Custom ID

    Use it to target users based on whether they have a custom_id or not. It allows Batch users to target anonymous or identified profiles. For example to target anonymous people and encourage them to create an account.

    Last Visit

    Use it to target profiles based on their last visit date e.g. the last time the user opened the app or connected on the website. It is often used by Batch customers to reactivate inactive / less active users.

    Email attributes

    • Email domain.

    • Last email click (transactional and marketing).

    • Last email open (transactional and marketing).

    Installation

    Use it to target users based on when they last installed the app. It is often used for onboarding scenarios but also to gauge user engagement.

    • If there are several installs attached to your profile, the installation data will only reflect the most recent installation date among your devices.

      • This way, you can easily manage reinstallation use cases.

    • The installation date isn't available on the web.

    App version

    Use it to target users based on what app version they are using on iOS and Android. It is widely used for app updates, in-app ratings, and promoting new features.

    • If there are several installs attached to your profile, the app version data returns the version of the last active install per platform (iOS and Android).

    Targeting Profile attributes

    With Batch you can track events and assign profile attributes to your users in order to personalize your messages and refine your targeting.

    There are 3 categories of custom data:

    • Attributes: they define users based on their settings (signup date, etc), user profile (user city, user gender, etc) or their current status (nb remaining credits, etc). They can contain different type of data (string, number or decimal, boolean, date).

    • Tag Collections: A tag is a collection of strings. Tags may be called Channels or Topics with other push providers. The difference is that Batch attaches a "tag" to your user and will only make the list of users once you have created your Campaign on the dashboard or from the API.

    • Events: Events allow you to target your users based on how they interact with your app (read article, play video, follow user). Every event has a key, an occurence date, an optional label, and an optional data object.

    Event Targeting

    With Batch Event Targeting you can :

    • Target on all events, with no source limit: mobile SDKs, Web SDKs, Profile API.

    • Perform multi-attribute targeting on a single event.

    • Use a wide range of operators of different types to refine targeting.

    To use Event Targeting, start by choosing your events. When on the query builder, click on “Add conditions”. You will see all the custom events you track among the different targeting conditions. To find your events more easily, we recommend that you use the search. Select your events, and click on the “Add conditions” button.

    Once back on the query builder, you can build your Event Targeting by choosing among the 3 options :

    • Last_event : Use it to target profiles based on the last occurrence of the event.

      • Example : If you want to target profiles who completed a purchase in the last 30 days.

    • Count : Use it to target profiles based on the number of occurrences of the event within the past 3 years (the event retention period) without specifying a time period over which the events were triggered.

    If you want to specify the attributes that need to be attached to the event for it to be taken into account in the targeting, for example the type of article / the product category / the brand, then you can filter the event using the icon to the left of the cross at the far right of your query. It will open a new line under the event query where you can pick your attributes and specify their values.

    • Example : If you want to target profiles who completed the purchase of a specific product (a red dress for example).

    Be aware that :

    • All following Event attributes are supported : String, Number, URL, date, Array, Boolean.

    • You can filter on up to 10 attributes.

    • Only the “and” operator is supported between attributes.

    Retargeting

    Use retargeting to target users based on if they have reacted or not to a previous Email, Push or SMS communication :

    We deduplicate Push Retargeting Events by profile. If a profile receives the same push notification on 3 devices, it counts as 1 sent.

    Retargeting events are stored for 90 days, so you can retarget an Orchestration that was sent up to 3 months ago.

    When on the query builder, click on “Add conditions”. You will see 3 new Built-in data, in the “interaction” section :

    • Sent message

      • Event available on Email, Push and SMS, does not include skipped, does include bounces.

    • Opened message

      • Event available on Email and Push.

    For each Retargeting Event you need to :

    • Specify an occurrence of the event, either within an allotted time (count_since) or not (count), or look at the last occurrence (last_event).

      • To find out more about operators, check the previous section on Event targeting.

    • Specify if you want to observe this event on either a particular orchestration (and optionally, a particular step), or on one or more channels.

    Retargeting Events are available :

    • In Campaigns and Automations targeting.

    • In Yes/No Splits.

    • In Segments.

    You can also quickly create a new Campaign to retarget users who have reacted to a previous Campaign by clicking on its additional actions menu and selecting 'Retarget campaign'. You can then choose which reaction event you wish to retarget and which channel you are going to use to send your new Campaign. You will then be redirected to this new Campaign.

    Estimated Reach

    The potential reach indicator shows you the approximate number of users who are going to receive your message, based on your current targeting options. To be relevant, this value needs to be displayed relatively quickly, which rules out calculating it on the entire userbase. Reach estimation is extrapolated by running the selection on a sample of the userbase.

    Move the mouse over the value of your estimated reach to see the steps and details of its calculation.

    The 'estimated reach' is an estimation of the users that will receive the push campaign, not the real computed value as its purpose is to give you a quick result right after creating your campaign.

    💡 This estimate is based on data from the Userbase which is updated in real-time, as new installations and uninstallations are reported to Batch.

    We take a small representation of your token base and estimate the number of users that match the query then give you an approximate result.

    Here is a simplified explanation of how it works:

    • The profile data is organized into 128 partitions.

    • Batch reads the first 16 partitions and extrapolates from the remaining partitions to determine the number of profiles that can be reached.

    If, after reading the first 16 partitions, we can determine that the cardinality is too low (there are fewer than 100 profiles per partition), then the entire set of partitions is read to obtain an exact value.

    Also,to better understand how the estimation is made, a funnel graph is displayed on mouse over, to show the various stages of calculation:

    What is explained on this page is focused on how targeting works for email, SMS and Push v2 channels. For Push v1, the behavior is slightly similar with a few differences. For exemples there is no notion of segments in Push v1.

    Push

    Overview

    Push channel refers to both mobile (iOS, Android) and web push.

    Each push message can be sent to all platforms at once or to a subset of them. By default only iOS and Android platforms are enabled, but this can be changed at any moment.

    Your message can be previewed on iOS, Android, Web (iOS) and Web (Windows).

    A push message is composed of:

    • A title

    • A message body

    • (optional) A custom icon (Android & Web only)

    • (optional) A media: an image (iOS, Android and web notifications for Chrome), video (iOS) or audio (iOS)

    • (optional) A deeplink redirection

    • (optional) A Mobile Landing

    • Advanced settings (see dedicated section)

    Title and Message body

    This is the most important part of your push notification, make sure your message is not too long and to write it accordingly to your targeted audience.

    Emoji emoticons

    You can add emoji emoticons to the title or the body of your iOS, Android, Windows or web push notifications.

    If you want to insert an emoji in your message you can:

    • Chrome 68+: Right-click any text field and select "Emoji" or "Emoji & Symbols".

    • Windows: Simply press the Windows key + the period button to display Windows's emoji keyboard on Windows 10. In case you are using an older version of Windows, you can copy-paste an emoji from emojipedia: / / .

    • Mac: Press CTRL + CMD + Space to display the emoji keyboard and pick an emoji.

    Image & Custom Icon

    You have two options to add an attachment:

    • Browse an image from your computer.

    • Use a media URL (supports image, video, and audio). These URLs can also use personalization.

    Image (optional)

    Batch lets you send large-format notifications with a large image attachment on iOS, Android and Chrome (Web). We require a landscape image in PNG or JPG format, with a minimum size of 300×200 px and a maximum file size of 10 MB. For web push notifications, the image is displayed only on Chrome for Windows and Android, but it will not appear on other browsers like Chrome (macOS) or Firefox.

    Video (optional)

    On iOS, you can attach a video file to your push notification via a URL. The video must be in MP4 format (max. 50 MB), with a valid mime type and hosted on an HTTPS server. The video will be downloaded automatically on your users' devices and iOS will drop the download if it takes more than 30 seconds.

    You can also attach a GIF file to your push notification. The GIF file must have a valid mime type and be hosted on an HTTPS server.

    If notifications are sent to Android and/or Web in addition to iOS, you can select an image as a fallback, since video is not supported on Android or Web push notifications.

    Audio (optional)

    On iOS, you can attach an audio file to your push notification via a URL. The audio must be in MP3 format (max. 5 MB) with a valid mime type, hosted on an HTTPS server. The OS will automatically download the mp3 file and drop the download if it takes more than 30 seconds.

    If notifications are sent to Android and/or Web in addition to iOS, you can select an image as a fallback, since audio is not supported on Android or Web push notifications.

    Custom Icon (optional)

    On Android and Web, you can add a specific icon for the notifications sent by a push campaign. Batch requires a square image, PNG, JPG or WebP, with a minimum width of 192px. On Web, if a default icon is set in the settings, this custom icon overrides it. The custom Icon is not an iOS setting and does not impact iOS messages.

    Deeplink URL (optional)

    Deeplinks allow you to direct users to a specific place in your app. Batch Push campaigns can accept this link scheme to direct users to a particular area within your app upon opening the push notification (i.e. The news you mention in your notification, etc).

    Please note that the Deeplink URL must be a link based on a URL scheme that you specify within your app and should begin with "app://", "http://", or "https://". URLs starting with "www." are not compliant.

    If the same push orchestration is targeting several platforms, the deeplink URL can be specified by platform.

    Mobile Landing

    Mobile Landing is a specific application of our In-App messaging feature, enabling you to optionally configure an In-App message to display immediately after a user opens a push notification.

    Requirement: To successfully display a Mobile Landing triggered by a push notification, the user must have a compatible version of your application and the Batch SDK installed. If the version is not compatible, the Mobile Landing message will not be displayed upon push open.

    For comprehensive details on how to create, design, and customize Mobile Landing messages, including information on available blocks, customization options, and actions, please refer to the main documentation section. Mobile Landing messages are built using the same composer and capabilities described there.

    Advanced settings

    Custom payload

    An optional JSON string that can contain additional parameters that your application can handle when receiving push notifications if configured to do so. The root of the JSON must be an Object and cannot have the reserved key com.batch. You can use {BATCH:TITLE}, {BATCH:BODY} and {BATCH:DEEPLINK} variables. They will be replaced.

    For example, you can use the custom payload to:

    • Set a badge value for your app icon on iOS

    • Customise your notification sound on iOS

    • Add action buttons to your notification

    • Send silent notifications

    FCM/APNS Priority

    Defines the priority of your message on iOS (APNS), Android (FCM) and Web. The default value is high.

    On Android, you can use the high priority if you have a messaging/voip app and if you notice delivery issues due to native (Doze) or constructor related (Samsung Smart Manager, etc) energy saving features.

    High priority Android notifications can drain your user's battery faster since they 'wake up' the device and open a network connection. Switch to Normal priority if your notification is not time-sensitive.

    FCM Collapse key

    Defines how notifications are managed when an offline device goes online. If enabled, the device will only show the most recent notification. If disabled, it will show all the notifications received when the device was offline.

    You should disable the collapse key if all your notifications matter (E.g. messages, etc). You can use up to 3 different collapse keys if you want users to get only one notification of each kind when coming online (E.g. marketing message, alert, etc).

    Expiration (TTL)

    You can set an expiration delay or a Time to Live (TTL) in hours for your notification. The notification won't be displayed if the device doesn't receive the notification or doesn't come back online within this time.

    By default, Batch sets a TTL of 14 days for all the notifications you send. If your user's device comes back online before being off for two weeks, it will display the last notification you sent to your user (iOS) or all the notifications sent over the previous two weeks (Android and web push).

    In addition to setting an expiration delay for your push campaign, you can set a global expiration delay that will be applied to all your notifications. This can be done from the dashboard settings > Channels > Push settings.

    We strongly recommend you set a short global TTL for web push notifications to prevent customers from wanting to opt-out. Users who accept to receive web push notifications are more likely to turn off their device (e.g. a laptop at home, etc) and receive many notifications from your website when they go back online.

    Send a Test

    • When specifying a Custom ID, the test will only be sent to installations on platforms enabled for the given push message. For example, if the push message is configured for Android and Web only, no test will be sent to an iOS installation.

    • Similarly, if an installation ID is specified but corresponds to a platform not enabled for the push message, the test will not be sent.

    • Other behaviors are similar to test messages across all channels.

    Safari APNS

    For web push, Safari APNS is no longer supported. As of macOS Ventura (13.0), Safari implements the same Web Push Protocol other browsers do and does not require any additional configuration from your part.

    Inbox

    Inbox is an optional feature. If you are interested, reach .

    The Inbox API allows you to fetch and process notifications that users have previously received, even if their device was offline. You can then do anything you want with the data, such as making a "notification center", where the user can catch up with previous notifications in a list.

    The API gives you access to the entire notification, including its raw payload. It also lets you know if the notification has already been read. Once received/stored in the inbox, your push notifications will remain for a 3 months period.

    Zoom on how Mobile Push works

    Batch relies on Apple (APNS: Apple Push Notification Service) and Google (FCM: Firebase Cloud Messaging) push services to send push notifications on iOS and Android.

    Understanding How Batch's SDK Works

    Batch SDK must be integrated into your app. Your integration is attached to an app on Batch's side thanks to the "API key" you specified in your code when you completed the integration.

    On the first app open, the SDK will start and Batch will register a new install. For every new install, Batch generates an anonymous "installation ID".

    All the data collected from the app until users uninstall it will be attached to that "installation ID":

    Collecting a Push Token

    In order to send a push notification to a device, Batch needs to collect a "token". That token is anonymous and delivered by Apple and Google push services.

    Here is how Batch collects a new token:

    1. The app requests and receives a token from APNS/FCM. On iOS, this can happen when the app starts or when users accept push notifications, depending on the background refresh support.

    2. Batch SDK collects that token and sends it to Batch servers.

    The token is refreshed on every app start. This makes sure Batch always has a valid token to push your user.

    Sending a Mobile Push Notification

    In order to send a push notification to several devices, Batch servers provide the list of tokens that need to be pushed to the Apple / Google push notification service. Batch also provides a payload, containing all the data the app needs to display properly the notification (message, image, deeplink, etc).

    Then, Apple/Google push notification service handles the delivery to the device. They provide feedback on errors or issues (e.g. invalid tokens, push certificate issues, etc). Batch cleans automatically your userbase based on this feedback. Batch SDK also sends feedback to Batch Servers when users click a notification.

    Zoom on how Web Push works

    Batch supports sending push notifications directly to web browsers, on desktop and mobile, even if your website is closed. Batch relies on two different technologies to deliver push notifications to the browser of your users, on desktop or mobile:

    • The Push API W3C standard

    • Service Workers

    Any browsers implementing both technologies will be compatible with our Web SDK and will be able to receive push notifications: Google Chrome, Mozilla Firefox and any Chromium-based browsers (Microsoft Edge, Opera, Vivaldi, etc).

    Understanding How Batch Works

    Integrating Batch into your website is simple. You must:

    1. Upload Batch's service worker to the root of your website

    2. Add Batch's javascript tag to the code of your web pages

    Your integration is attached to an app on Batch's side thanks to the "API key" specified in the javascript tag the dashboard automatically generates for you.

    On the first session, the javascript tag will start and Batch will register a new install. For every new install, Batch generates an anonymous "installation ID".

    All the data collected from the website until users clear site data will be attached to that "installation ID".

    Collecting a Token

    In order to send a push notification to a device, Batch needs to collect an endpoint. That endpoint is anonymous and delivered by the servers of each browser (e.g. Google, Mozilla, etc).

    Here is how Batch collects an endpoint and generates a token:

    1. The javascript tag triggers the native permission prompt.

    2. If users turn on push notifications, the browser requests an endpoint to the push notification service.

    3. The push notification service then generates a public endpoint and sends it to the browser.

    4. Batch service worker collects that endpoint and the javascript tag sends it to Batch servers.

    Batch servers store that endpoint for the installation and generate a "token". That token contains:

    • An endpoint: the anonymous id generated by the push notification service for the browser (endpoint)

    • The public key of the user's browser that allows it to decode the notification Batch will send (p256dh). The browser of every subscriber has a different public key.

    • A secret key (auth).

    Here is what a token looks like:

    Sending a Web Push notification

    Here is how Batch sends push notifications to your users:

    1. First, Batch encodes the content of the notification for every subscribed browser, based on the public key. The message sent from Batch can only be decoded by your user's browser.

    2. Batch servers send the notification over HTTPS to the push notification service, signing the requests using a "private VAPID key" known exclusively by Batch.

    3. Then the push notification service only reads the header to know which endpoint should be targeted. It cannot decode the message. The push notification service will also check if Batch is allowed to push that browser based on the private VAPID key and check if the endpoint is still valid (e.g. in case users cleared site data or uninstalled the browser).

    Batch uses the feedback received from the push service to delete tokens that may be invalid in your profile base. Batch Service Worker will also send feedback to Batch servers when users click the notification. You can find both information in your campaign reports.

    User targeting

    This is where you make all of your targeting selections and decide the audience of your push campaign.

    Adding conditions

    Click the "Add conditions" button to see the list of native and custom conditions you can add to your campaign. By default, if you don't select any group, Batch assumes you intend to target your whole audience.

    You can organise your conditions into subgroups. This allows you to use different AND & OR operators between each group of conditions. You can add up to 31 target conditions and up to 64 values in each target condition.

    Smart Segments

    Smart Segments are automatically generated by Batch from the moment the SDK is implemented in your app. They allow you to take action on your userbase in a meaningful manner, based on their engagement level.

    New

    The NEW segment contains newcomers to your app that haven't yet established themselves as engaged, lasting users. They're still trying to understand what your app can do for them or how amazing your game is.

    Don't overwhelm them with information they don't need or repetitive notifications. Use Batch to welcome them and present them with the features they may need to discover in order to engage them from the start. E.g. Send a welcome push notification to New users only (1 daily recurring push campaign with a capping of 1).

    Engaged

    Users of the ENGAGED segment are your regular users. They open your app frequently, they enjoy it the way it is and know exactly why they're using it. For all these reasons, they are the most receptive users you have and you want to keep them engaged.

    Don't bother them with random push notifications to promote basic features of your app or to remind them to come back. They already do. Communicate the aspects of your app they probably don't know about yet, make them discover new features after an update or show them you care about them with special offers. E.g. Automatically send your users a notification when they become Engaged (1 daily recurring push campaign with a capping of 1).

    One-time

    One-timers are users who did not come back after they first launched your app. They probably didn't understand what your app can do for them, installed your app and forgot to come back or they just didn't want to go further if your app has a login. Still, they might come back in the future if you send them the right message.

    Don't send them notifications too often asking them to perform a specific actions in your app. They probably don't care. Focus on what they probably miss or they can obtain from using your app. E.g. Entice One Time users to come back with a weekly notification (1 weekly recurring campaign for one timers with capping).

    Dormant

    Dormant users were 'engaged' at one point, but have not launched your app for a long time. They're basically not using it any more, but they still remember it and probably why they installed it.

    Don't just ask them to come back. Give them a good reason to start using your app again such as new features, a special offer or anything showing that you've improved since their last session. E.g. Re-engage Dormant users with a weekly notification (1 weekly recurring campaign for Dormants and no capping)

    Imported

    The imported segment contains all the push tokens we have imported if you migrated from another push provider. These users will be progressively analyzed and transferred to other segments after their first session.

    Note that we are also showing the predictive and intermediate Smart Segments that our algorithm calculates:

    • Engaged risky: Users with a high risk of becoming dormant in the next days if you don’t re-engage them with a targeted notification.

    • New promising / Dormant promising users: Users who are about to become engaged. Don’t miss the opportunity to send them a message!

    Custom Audiences

    Custom audiences allow you upload static segments exported from your userbase (e.g. top 500 buyers, etc) or created by third-party tools. You can easily retarget these custom audiences with a push or an In-App campaign from the dashboard. You can easily create a custom audience from the dashboard settings or using the Custom Audience API.

    Either you are editing a push or an In-App campaign, you can select a custom audience from the campaign editor:

    You can also use the "Custom audience" attribute. Click the "Add conditions" button, then go to the "Native attributes" tab to find it. This is useful if you are planning to include a custom audience in complex segmentation with different operators (AND/OR). You can also use it to target or exclude up to 3 different custom audiences.

    Countries and languages

    Batch automatically detects the country and the language of your users. This allows you to easily limit the range of your push campaign to one or several countries/languages with only one click from the dashboard. No need to segment your database yourself.

    Countries targeting

    You can leave this section blank to target globally, or you can specify your grouping of countries by using the drop-down menu or typing. There is no limit to the number of countries you can select.

    Languages targeting

    Leaving this section blank will target all languages and increase the reach of your campaign. If you don't have a message in the language of a user (e.g. Japanese), Batch will deliver the message in the default language of your app. You can check the default language of your app in ⚙ Settings → General.

    If you only want to send a notification to users speaking a specific language, then you can target them here. It may be useful if you want to target a multilingual country and you only have a message in one language.

    Here are a couple of examples:

    • Belgium: Dutch, French.

    • Canada: English, French.

    Native attributes

    Native attributes allow you to target users based on data the SDK collects automatically. Several conditions can be set in the same campaign and with different operators (equals to, lower than, greater than, etc).

    OS / app version

    These attributes allow you to target a specific OS/app version to send update reminders and more. All you have to do is to select the OS or the app version you want to target in the dropdown menu:

    OS / Browser model

    Web push only These attributes allow you to target a specific OS/Browser model.

    Device type

    On iOS, the device type attribute value must be a valid model name (e.g. iPhone8,1, iPad2,1, etc).

    On Android, the device type value must be the name of a valid device. A list of all the devices supported by the PlayStore . Make sure you chose a value in the "model" column (e.g. SM-G900H).

    Device category

    This attribute allows you to target users depending on their device category : mobile or desktop. Note: tablets belong to the mobile category.

    This is Web push only

    Installation date

    Allows you to target users based on the number of hours / days elapsed since the install. The days are counted in sections of 24 hours from the hour of install.

    With this attribute you can easily create several onboarding campaigns, sent several days after the install (e.g. D +1: Welcome message / D +3: Recommend a feature / D +8: Rate the app).

    Recommendation: Users coming from an older version of your app and upgrading to a version with Batch's SDK (after a first release or a token import) are considered as new installs. If you are planning to use this attribute to send 1-3-7 days post-install notifications, we recommend that you wait at least 7 days to make sure you only target your new users.

    Last push date

    The last push date attribute allows you to target users according to the last date they received a push via the dashboard or the Campaigns API. The days are counted in sections of 24 hours from the hour of last push. This is especially useful if you want to avoid bothering users that have already received a push from you lately.

    Last visit date

    The Last visit date attribute allows you to push users based on the time elapsed since their last visit. The days are counted in sections of 24 hours from the hour of the last visit. This is useful to reengage users who haven't opened the app for a while.

    Mobile carrier

    Allows you to target users based on the mobile carrier they use. The code shown next to the carrier name is a combination of the Mobile country code (MCC) and the Mobile network code (MNC). The full list of MCC and MNC codes is .

    Please note that some mobile carriers may have several MCC+MNC codes. This attribute is not supported on iOS 16.4 and higher.

    Has custom user ID

    Allows you to target users who have a custom user identifier. Apps with login walls or that require an account to make significant actions (purchase, etc) can use this option to increase the number of logged in users.

    Transactions tracked

    The Transactions Tracked attribute allows you to target users who already have or haven't made any purchases in your app yet. This is useful to improve your onboarding process if you have an mcommerce app.

    Make sure you are sending custom data on transactions to use this attribute.

    City

    The "City" attribute allows you to target your users based on the city Batch guessed for your users using IP-based geolocation. Data is refreshed every time your users open your app or visit your website.

    The accuracy of IP-based geolocation varies depending on the network connection of your users. The detection tends to be more accurate if users are connected to a Wi-Fi network. You can test the accuracy of the detection by checking the value Batch has on your install using the debug tool.

    Last location

    The last location attribute allows you to send contextual push notifications to users who have been detected in a specific area using their GPS location. All you have to do is to type an address and adjust the size of the targeted area (in meters). Data is refreshed every time your users open your app.

    Do not request GPS location in your app to track it exclusively with Batch. The geolocation authorization needs to be asked for a legitimate purpose, related to a feature of your app (e.g. store locator, route calculation, etc). For the last location attribute to be operational, you need to share the GPS location collected by the app to Batch using the native methods of the SDK ( / ).

    Retarget audience / opens

    You can easily retarget or exclude users based on the push notifications they have received or opened recently. This will work for any campaigns created from the dashboard or the Campaigns API over the last 14 days.

    Retarget Push Audiences

    The "Retarget audience" attribute allows you to retarget or exclude users who have received a notification from a specific push campaign.

    You can use that condition to retarget users who have recently received a push containing a coupon code and forgot to use it. This is also useful if you want to target all your userbase, except users who were targeted by a specific campaign targeting a for example.

    Retarget Push Openers

    The "Retarget opens" attribute lets you retarget or exclude users users who have opened a notification coming from a specific push campaign.

    This is helpful if you want to communicate with users who show interest for a certain type of content. You can also use that attribute to avoid bothering users who are not opening your notifications.

    Retarget In-App Viewers

    The "Retarget In-App Viewers" attribute allows you to retarget or exclude users who have seen an In-App message from a specific In-App or push campaign.

    You can use that condition in your push campaign to exclude users who have seen your In-App message for example.

    Custom attributes

    With Batch you can track events and assign custom attributes to your users in order to send contextual notifications.

    Newly tracked attributes, tags and events are hidden by default. You will need to manually display them from the dashboard settings > .

    Attributes

    Attributes can define users based on their settings (signup_date, etc), user profile (user_city, user_gender, etc) or their current status (nb_remaining_credits, etc). They can contain different type of data (string, number or decimal, boolean, date).

    You can use custom attributes to:

    • Improve your onboarding flow (e.g. "Post a comment and be part of the events" if has_commented is false).

    • Optimize your inapp content sales (e.g. "Hurry! 40% off on our coins packs!" if nb_remaining_coins < 5).

    • Target the right users (e.g. "Free delivery today for our London users!" if user_city is "London").

    Tag collections

    A tag is a collection of strings. Tags may be called Channels or Topics with other push providers. The difference is that Batch attaches a "tag" to your user and will only make the list of users once you have created your campaign on the dashboard or from the API.

    You select several tags and use an AND/OR operator. This allows you to segment your userbase based on:

    • Users interests: You can use a tag collection to know what your users' favorite brands/items/etc are and send them contextual notifications.

    • Thematic opt-in: You can also use them to manage thematic push optin in your app.

    Events

    Events allow you to target your users based on how they interact with your app (read_article, play_video, follow_user). Every event has a key, an occurence date, an optional label, and an optional data object.

    You can use events to:

    • Entice users to come back (e.g. "3 news you cannot miss this week!" if they haven't read an article over the last 7 days).

    • Invite your loyal users to share your app (e.g. "Enjoying the app? Invite your friends to unlock a special character" if they never invited friends).

    • And many more, depending on your app and your tagging plan.

    Potential Reach

    The potential reach indicator shows you the approximate number of users who are going to receive your message, based on your current targeting options.

    It gives you a good idea of the impact your push campaign will have and helps you to understand how relevant your targeting is.

    You can also see the percentage of users who have opted in to receive push notifications by hovering the number of targeted users.

    How to get ready to migrate from the Batch MEP to the CEP? (for Tech & Product teams)

    Follow these steps to prepare your upgrade from the Batch Mobile Engagement Platform (MEP) to the Batch Customer Engagement Platform (CEP).

    The Customer Engagement Platform (CEP) provides enhanced capabilities, improved performance, and a more powerful approach to managing your customer engagement strategies. Ensuring these prerequisites are met will facilitate a smooth transition and enable you to leverage the full potential of the Batch CEP.

    Learn more about how to differentiate the Batch CEP and MEP on this page.

    • Please carefully review all sections relevant to your Batch usage and complete the necessary actions before requesting the CEP activation from our teams.

    • This guide provides an extensive overview, but it might not be exhaustive. Please make sure that everything important to you will be available on the CEP. If you’re unsure, don’t hesitate to contact us!

    1. SDK version

    The Batch CEP relies on newer versions of the Mobile and Web SDKs to support its advanced features and ensure optimal performance.

    All versions of the Batch SDK are compatible with the CEP, but note that some features are only available in newer versions. In particular, upgrade to version 3.1 of the mobile SDK to use the new In-App and Mobile Landings features.

    2. Tagging plan: cross-platform matching

    When migrating to the CEP, your apps and websites will be grouped into omnichannel projects. Data must be consistent across the different apps and websites to ensure omnichannel features work smoothly.

    An omnichannel project can contain a maximum of 1 Android app, 1 iOS app, and 1 website.

    Ensure you test the data collection carefully using on the Batch dashboard.

    3. APIs

    To ensure full compatibility with the CEP, apply the adjustments detailed below to the you are currently using.

    Remember to keep the MEP APIs running as long as you still need them during the migration phase.

    Transactional & Partner APIs

    If you are using the (or its variant, the Partner API), we recommend . This will especially allow your marketing teams to edit the content of these transactional messages without relying on your back-end teams.

    This option is not applicable yet if you are targeting Installation IDs with the . It will be available soon.

    In any case, the is fully compatible with the CEP. Simply note that it relies on the Batch v1 Data Model, so exporting Events (push_sent, push_open, etc.) related to sendings done with this API will still be done using the .

    Campaigns API

    If you are using the , you need to:

    The Date format has evolved from yyyy-MM-ddThh:mm:ss to yyyy-MM-ddThh:mm:ssZ.

    In-app Campaigns API

    Custom Audience API

    This option is not applicable if you are sending Installation IDs with the . In this case, contact us so that we can review your needs and define the best approach together.

    Custom Data API

    Once the CEP is activated for your account, you will need to do a one-shot API call to send all attributes again for all users so that they are available for the CEP usage.

    App Data API

    GDPR API

    The is fully compatible with the CEP, without any additional action on your side.

    Export API

    Webhooks

    Trigger Events API

    4. Additional features

    Custom Exports

    You may have set up custom exports to receive files from Batch on external storage that you manage (such as SFTP, S3, AWS, etc.).

    There are two types of exports:

    • Userbase exports: These are fully compatible with the CEP.

    CSV audience importer

    You may have requested from Batch to set up a custom script to import audiences from files that you drop on external storage that you manage (such as SFTP, S3, AWS, etc.).

    Editorial Dashboard

    5. Third-party integrations

    You may have configured (Analytics, CDP, etc.).

    (used to connect the Batch mobile SDK with external Analytics tools) are compatible with the CEP, without any additional action on your side.

    Next Steps

    Once you have performed the necessary checks and updates:

    1. Test: After making changes, especially SDK updates and data format adjustments, test your app extensively. Pay close attention to data collection across all relevant platforms (iOS, Android, Web).

    If you have any questions about any of the steps outlined above, feel free to reach out to us via your dedicated Customer Success Manager or .

    Plans & billing

    Plans & Billing allows users to monitor volumes of message sent and Monthly Active profiles (MAPs) by Project.

    Edition

    Start by clicking the New Automation button from the In-App tab on Batch's dashboard.

    In order to create your first In-App automation, you will need to from the dashboard settings.

    Labels & targeting

    Exactly like push automations, you are able to add labels to your In-App automations via the

    Message edition

    The message editor lets you create notifications in several languages, A/B test them and see them on your device before you send them your users.

    Language selection

    You can add as many localized versions of your message as you want by clicking on "+". Batch will automatically send the message in the right language to every targeted users.

    ).
    labels
    Labels
    Parallel automations
    Segments
    Audience
    here
    here
    here
    our Blog's article
    Analytics
    Cover

    Email message

    Email
    Cover

    SMS message

    SMS
    Cover

    Push message

    Push

    By default, only collected tokens will be targeted.

    If you select this option, only opt-in profiles on the channel on which you are creating a message will be targeted.

    You can access/view the segment from the query builder regardless of the campaign status (draft, running, complete) by clicking on the eye icon.

    • It will open the Segment in a new tab.

  • If there are several installs attached to your profile, to define the Push Opt-in Status, we look at the last active install by platform (IOS, Android and Web).

  • Example : If you want to target profiles who read more than 30 articles.

  • Count_since : Use it to target profiles based on the number of occurrences of the event over a specific time period.

    • Example : If you want to target profiles who read more than 3 articles over the past 7 days.

  • For Email: does not include machine opens, only includes the first open action.

    • If a user opens the same email 5 times , we will only consider the first open (because that is the engagement action) and the date associated with this event is the date of the first open. This is identical to the way Analytics works.

  • For Push: includes only direct opens.

  • Clicked message

    • This event is only available on Email and does not include clicks on unsubscribe links. It only includes the first click action on each link.

      • If a user clicks on the same link 5 times, we will only consider the first click. However, if a user clicks on different links in the same Email, it will count as several clicks.

  • this documentation.
    complete section on Segments
    complete section on Audiences
    targeting
    estimated reach
    userbase
    native et custom data
    Custom emojis: Some device manufacturers use a set of custom emojis. See how they look here: Samsung / LG.
    Finally, the browser receives the push notification. Batch service worker decodes it and displays it.
    iOS
    Android
    Windows
    In-App & Mobile Landing
    support@batch.com
    push composer
    {
    	"endpoint": "https://fcm.googleapis.com/fcm/send/f1JDSGNXoZM:APD91bFRRV4I-WCFDcEmSNGYii_7MyzG8gVgP0bYWGknKoNEmPkuDpUdkAKqb6O0Dr0xTO_2xDXqDnp4quk7iL_5PK3-J22RPrT-9Hsb4c_G4SBxNHqPX7Do5VHvNAm_SOk_foHGtA5u",
    	"keys": {
    		"p256dh": "BC2bogMsUCbFwomx4l1gXD984UYeNrz5qh3x_pHCt-UKfNFNaJp6xoQQo7MYqi_aglI780qcraGSut1CvRs67NI",
    		"auth": "RFKT6wLk1X5lPwsMTOyKcA"
    	}
    }
    With the same additional data for events (consistent keys and value structures)
  • Inform us
    :
    Reach out to us to confirm that you have completed the prerequisite actions, and we will work with you to schedule the migration of your account to the CEP.
    Migrating from v3
    the Debug feature
    switching from the Transactional API to the Profile API
    connections between Batch and our partners' solutions
    support@batch.com
    Associate Labels
    button. You can reuse an existing label or create new one. You will be able to filter your automations from the automations list based on the label you choose here.

    The targeting process is exactly the same for In-App automations as it is for push automations. See here for more information.

    Synchronization workflow

    Though the targeting interface is similar, In-App and push automations work differently. When the app is launched, the SDK automatically retrieves from Batch's servers the list of automations available at that moment.

    This implies that every events and attribute that have been collected during the current session won't be taken into account for the targeting of an In-App automation until the next session.

    For instance, if you set the targeting to a count of events, then the user's own count has to match the targeting criteria at the app launch rather than during the session in order to display the In-App automation.

    Potential reach

    Unlike a push automation, Batch doesn't need any push token to display an In-App message to your users. As a consequence, the estimate will display the number of targeted installs.

    Trigger condition

    In-App automations will appear on your users’ screen according to a specific trigger. This is especially useful to show the message to your user at the right moment.

    For example, you can choose to display an In-App promoting a discount when a user is on the adequate category page. You could also invite a user to get a premium account after they read a certain category of article if you have a news app.

    Choosing a trigger

    You can use a session start or any event that have been tagged during the integration of the SDK. You can be even more specific by choosing an event label.

    If you don’t select any labels, Batch will trigger the message on every trigger of the selected event.

    Starting from version 1.19 of the SDK, the native trigger event 'As soon as possible' is deprecated. It will be removed from the dashboard as soon as you update the SDK to the required version (1.19+). In addition, the functioning of the native trigger event 'New session' is revised. Explanations on the old and new versions are below.

    For all current and future In-App automations, here is how the native trigger events work depending on the user’s SDK version:

    If the user's SDK version is greater than or equal to 1.19

    New session If you choose to display your In-App automation with the trigger 'New Session', the message will appear on the first launch of your app:

    • When a user matching the set targeting opens the app and therefore starts a new session, Batch’s SDK will retrieve all the information related to the automation.

    • It will then trigger the automation as soon as the synchronization is finished.

    You can choose to set this trigger to promote functionalities such as thematic preferences, for optin automations, or even to inform users about an app maintenance for instance.

    If the user has a limited network connection, the synchronization may be delayed. After a certain time, the SDK will stop the synchronization and will not display any more message to avoid impacting the user experience.

    Please note that during the user’s very first session, the SDK is not initialized yet and it is therefore not possible to display an in-app message within the session.

    If the user's SDK version is lower than 1.19

    New session If you choose to display your In-App automation with the trigger 'New Session', the message will appear on the second launch of your app:

    • When a user matching the set targeting opens the app and therefore starts a new session, Batch’s SDK will retrieve all the information related to the automation, but not display it yet.

    • It will then trigger the automation as soon as the user launches the app for the second time.

    You can choose to set this trigger to promote functionalities such as thematic preferences, for optin automations, or even to inform users about an app maintenance for instance.

    Choosing a priority

    You can select a priority level between Standard, Important and Critical. Priority works on automations with identical trigger event, and identical label if one was specified. When two or more automations should be displayed at the same time, the system selects the automation with the highest priority: this is the one that will be displayed after the trigger event occured.

    If multiple automations have the same priority level, we rely on our automatic priority system to automatically define priority based on multiple criteria.

    Here are a couple of examples of usage of priorities:

    • Standard-level priority could be selected for your long-term use cases: onboarding, app review, etc.

    • Important level priority could be selected for temporary campaigns: conversion or subscription campaigns, account creation, reopt-in campaign, etc.

    • Critical level priority could be selected for emergency campaigns: downtime or out-of-service messages, asking your user to update the app, etc.

    Setting a capping and grace period

    The capping allows you to limit the maximum number of times an In-App automation will be displayed to a user. This is useful to avoid overwhelming your users with the same message.

    The grace period allows you to set a delay between each display of the same In-App message. This feature is quite handy to avoid your user to see the same message multiple times in a single session.

    Setting a start/end time

    This section lets you program your In-App automation. You can schedule the start and the end date of your automation based on global time or local time.

    We highly advise you set an ending date. In-App automations are functional even in the absence of connectivity, so setting an ending date will prevent the automations to be displayed for disconnected users after you manually disable it from the dashboard.

    Message edition

    A few words on the message edition interface:

    • First of all, notice that you can create translations if you are targeting several languages. Just click the [ + ] button in the top left corner.

    • You can select your theme in the top bar of the message edition section. Every text field that you have enabled during theme creation is now editable.

    • You can use any PNG or JPG image wider than 640px in your In-App message, preferably in a portrait format with a few pixel wide margin on the side if there is text in it. Don't exceed 2MB to be sure the image will load up quickly including with poor connectivity. You can add an image from your computer or use a URL to this image.

    • Finally, try to be creative with your image by using a gradient or transparency, a nicely set up image will often improve your automation performance.

    Message personalization

    If you want to improve the conversion rate of your in-app automation, you can personalise the content of your notification for every customer, based on the same attributes you may already be using for user segmentation.

    All you need to do is to click the {...} button next to the title or the body of your message and pick an attribute:

    Batch will replace dynamically the attribute with a custom value for each user. If no value is found for a targeted user, Batch will send the message without the value or use the default value you set when you added the attribute.

    Message personalization is available on the Enterprise plan and, as an option, on other paid plans.

    Editing buttons with actions

    Choose the action that will be triggered when your user presses a button on your in-App message. The available actions are detailed in this section.

    Built-in action Rules

    • The default action when using action buttons will be "Dismiss".

    • You can always add a custom action registered in the app. This allows you to combine custom actions registered in the app and built-in actions.

    • There can only be one action at a call-to-action level.

    Exception for the batch.clipboard action that you can associate to a deeplink action.

    List of available built-in actions:

    Dismiss

    Dismiss the In-App message.

    Deeplink

    Dismiss the In-App message and open the deeplink or Web page out of the app or in the in-app browser.

    Clipboard

    Available in Batch 1.17 and higher

    Copy to the clipboard the provided text and dismiss the In-App message.

    Push Opt-In And Smart Re-Optin Prompt

    Available for iOS from Batch 1.11 and 1.12 respectively

    Available for Android from Batch 1.19.2

    Both display the system push notification authorization prompt to eligible users. In addition to displaying it, the Smart Re-Optin prompt opens the system notification settings if the user has already been asked for push notifications opt-in.

    If the user is already opt-in, the message will disappear after clicking the button but no further action will be triggered.

    Rating

    Available in Batch 1.17 and higher

    iOS: Displays the app rating dialog. The In-App system dialog cannot be displayed more than three times in a 365 days period. Your automation should be rate-limited to three times per year per user.

    Android: Displays the Google In-App review feature. Your automation should be rate-limited.

    The "play-core" library is required to display the Google In-App review feature.

    Smart App tracking prompt (iOS only)

    Available in Batch 1.16 and higher

    Displays the system prompt for tracking consent. Asks for Tracking consent using the AppTrackingTransparency framework. If the user has already been asked and refused to consent, it opens the app's settings where tracking can be enabled.

    Redirect to settings (iOS only)

    Available in Batch 1.12 and higher

    Open the notification settings of the current application where notifications can be enabled.

    Additional button actions:

    Track An Event: Set up an event with optional event labels and event attributes.

    Batch allows you to select an existing event or to create a new one directly from here.

    2 inputs are available when retrieving an event in your In-App message:

    • Event name (mandatory)

    • Event Label (optional)

    Track A Tag: Batch allows you to track a tag in one of your existing tag collections.

    3 inputs are mandatory when retrieving a tag in your In-App message:

    • Select Add or Remove a tag

    • Enter a tag collection name (string format)

    • Enter the name of the tag to add or to remove (string format)

    Using an In-App WebView theme

    If you select a theme based on the WebView format, you need to fill the Webview URL field with a link to your custom HTML design (ensure that this format is responsive).

    Once you have added a valid URL, a preview of your In-App Automation is displayed. You can test interactions by clicking on the screen.

    The preview will only be available for HTTPS URLs.

    Enabling your In-App automation

    The editor interface gives you a quick recap of your automation.

    If you're not ready to send it yet, be advised that you can save it as a draft for now and send it later. If everything's alright, then just hit the Save & Run button.

    Modifying your In-App automation

    Batch doesn't send live updates to your app when you save changes for an In-App automation or disable a campaign on the dashboard.

    These changes will be detected the next time your users open the app. During that session, the SDK will sync again with Batch servers. The SDK may still display an outdated version of your campaign or an In-App automation recently disabled. All the changes received from Batch servers will be applied in the next session. This is why we recommend you include an end date in your automations or double-check the wording of your automation before activating it:

    Case of In-App message display after disabling the In-App automation

    In-App automations cannot be disabled immediately for users who already synced it. These users will see your In-App message one last time.

    In-App automations cannot be disabled immediately. When you disable an In-App automation on Batch dashboard, Batch stops serving it to new installs and sets its status to "disabled", but users may still be able to display it if they already synced it before.

    This happens because the SDK must sync with Batch servers at least once to be aware of the new status of preloaded In-App automations. The SDK syncs with Batch servers after displaying preloaded automations, when users open the app.

    As a result, users who synced the automation before you disabled it on Batch dashboard will display it one last time. All the changes received from Batch servers will be applied in the next session. This is why we recommend you include an end date in your automation or double-check the wording of your automation before activating it:

    Troubleshooting

    Are you not seeing your In-App automation while you fit the targeting? Here's a couple possible reasons:

    • Splash screen: If it's your first implementation, be advised that if there is a splash screen in your app, Mobile Landings and In-Apps triggered at session opening might not work (or will be dismissed just after the splash screen's disappear). To temporarily pause the In-App messages display, you can use the Do Not Disturb mode to solve this issue.

    • Do not disturb issue: Also, check in your implementation if the Do Not Disturb mode isn't activated by default and preventing In-App to be displayed.

    • Event tagging issue: If the In-App automation is triggered by a custom event, check if that event is triggered as expected. This can be easily done by using the Debug tool from Settings > Debug.

    If none of this reasons seems to help, don't hesitate to send us any of your questions to support@batch.com.

    create a theme

    If you don't have a message in the language of a user, Batch will deliver the message in the default language of your app. You can check the default language of your app in ⚙ Settings → General.

    Title and message body

    Title (optional)

    You can set a custom title that will appear on iOS and on Android. On iOS, the title is displayed on devices running iOS 10 (and higher), on the Apple Watch or in the notification center (since iOS 8).

    Message body

    This is the most important part of your push notification, make sure your message is not too long and to write it accordingly to your targeted audience.

    Message personalization

    If you want to improve the conversion rate of your push campaigns, you can personalise the content of your notification for every customer, based on the same attributes you may already be using for user segmentation.

    All you need to do is to click the {...} button next to the title or the body of your message and pick an attribute:

    Batch will replace dynamically the attribute with a custom value for each user. If no value is found for a targeted user, Batch will send the message without the value or use the default value you set when you added the attribute.

    You will find more information on message personalization in this page.

    Emoji emoticons

    You can add emoji emoticons to the title or the body of your iOS, Android, Windows or web push notifications.

    If you want to insert an emoji in your message you can:

    • Chrome 68+: Right-click any text field and select "Emoji" or "Emoji & Symbols".

    • Windows: Simply press the Windows key + the period button to display Windows's emoji keyboard on Windows 10. In case you are using an older version of Windows, you can copy-paste an emoji from emojipedia: iOS / Android / Windows.

    • Mac: Press CTRL + CMD + Space to display the emoji keyboard and pick an emoji.

    • Custom emojis: Some device manufacturers use a set of custom emojis. See how they look here: / .

    • Android 4.4: On Android versions before 4.4, emoji emoticons might not be displayed correctly.

    A/B testing

    The A/B testing feature allows you to test two different messages in the same campaign. A/B testing is key to sending the most effective message and vastly improving your open and re-engagement rates. You can easily A/B test your messages with one click on the "Start A/B testing" button.

    What kind of content can I A/B Test?

    • Length of the wording —find our best practices here for mobile push

    • The tone of the message

    • Emojis

    • Dynamic Content (on mobile push notification only)

    • Image

    • Deeplink

    How to preview each version?

    • Click on the Eye icon to select the version to show in the preview and to send as a test.

    How can I compare the analytics?

    • Once your campaign is live, you can compare the performance of each variant. In the detailed results of your campaign, you will see how each message performs over time in a tabbed view.

    How can I keep the best wording?

    • If it is a recurring or trigger campaign, you can disable the one that performs poorly. To disable a version, go on the Automations tab and click on your campaign.

    Mobile Landing

    Mobile Landings allow you to display an In-App message when users open your push notification. This is great to manage scenarios that require a specific action from your users (update reminders, etc) or to have all their attention (new feature announcement, exclusive offers, etc).

    See SDK documentation about it for and .

    You can choose between several formats depending on your use case: Fullscreen, Banner, Modal, Image or Webview.

    You can easily add a Mobile Landing to your push campaign by switching on the "Mobile Landing" option:

    Why Should I Use a Mobile Landing?

    Mobile Landings can be useful in a wide variety of use cases:

    • Increase your open rate: When sending a push notification you want to keep your notification short, sweet and inviting. So Mobile Landing lets you express yourself without sending a very long push notification to your users.

    • Keep your user base updated: When announcing a new feature or service, put all the details on the Mobile Landing.

    • Ease the payment process: when announcing a discount code in your notification let your user benefit from the 1-Click process by adding a button that will automatically apply the discount code to the basket.

    • Follow your user journey: When a new feature is announced after presenting it to your user base, you can direct them to the mentioned feature so they can discover it.

    • Give more context before directing users to a website: when directing to a page outside the app (for example your YouTube page), trigger a landing page when users open the app and let them click or not the In-App button if they are still interested.

    How to Create a Mobile Landing?

    Here are the two main steps you need to take to create a Mobile Landing:

    1. Pick or create a new template for your Mobile Landing

    2. Then edit the content of your Mobile Landing (text, image, etc).

    If you already have created a Mobile Landing or an In-App message, then head to step 2.

    Step 1: Create a new In-App theme

    Go to the Settings > Themes section of the dashboard. Select one of the four formats available:

    • Fullscreen: This format lets you mix images and text. Add buttons to let your users get a full understanding of what you are talking about. As it is a full-screen format, you can use it for long messages explaining a specific matter;

    • Banner: Banners can be displayed at the top or the bottom of the screen with up to two buttons. This is very useful for informative purposes;

    • Modal: The modal format will always be displayed in the centre of the screen. You can add an image, disable text fields, and buttons and change their colour. You can also set a 10-second timer to auto-dismiss the In-App message;

    • Image: The image format is useful if you want to use a 100% custom design or simply reuse an image your team already prepared for a marketing campaign. Batch allows you to display a full-screen image or to display it as a modal with a close button or an auto-close timer

    Step 2: Edit your message

    Now that your template is ready to use, you can attach a Mobile Landing to your push notification.

    Once you are done with the conception of the push notification, turn on the "Mobile Landing" option by activating the toggle.

    Then select the template you want to use in the drop-down menu.

    Here are some specs about the Mobile Landing components:

    • Button: There are three types of actions allowed in a button. It can either dismiss the Mobile Landing, direct to a specific page inside or outside the app or trigger a custom action (open the settings of the device, apply a discount code.

    • Image: they have to be at least 300 pixels in width & height and weigh no more than 5MB.

    Sending a test

    You will need to find and save your device token first to send your first test notification: iOS / Android / Web.

    You can click the "Send a test" button to see how your message looks on your device, test your deeplink or see if the Mobile Landing is displayed correctly.

    You will find the list of all the registered test devices from Settings > Push Settings and send them a test message. This is helpful to check if the token of your saved devices are still valid and delete them if it's not the case.

    Advanced settings

    Deeplink URL

    Deeplinks allow you to direct users to a specific place in your app. Batch Push campaigns can accept this link scheme to direct users to a particular area within your app upon opening the push notification (i.e. The news you mention in your notification, etc).

    Please note that the Deeplink URL must be a link based on a URL scheme that you specify within your app.

    Attachments

    You have two options to add an attachment:

    • Browse media from your computer

    • Use a URL to your media:

    If you use a URL, Batch won’t be hosting audio and video files: make sure you can handle potential traffic surges.

    You can add dynamic data to customize your media URL.

    Custom icon

    On Android, you can add a specific icon for the notifications sent by a push campaign. Batch requires a square image, PNG or JPG, with a minimum width of 192px.

    Image

    Batch lets you send large-format notifications with a large image attachment. We require a landscape image, PNG or JPG, with a minimum width and height of 200px (max. 10MB).

    Images can be displayed on:

    • iOS 10+: Make sure your iOS app supports rich notifications.

    • Android 4.1+

    • Web: Chrome 56+ on Windows/Android.

    Audio

    iOS 10+ only. The file must be an mp3 file (max. 5 MB) with a valid mime type, hosted on an HTTPS server. The OS will automatically download the mp3 file and drop the download if it takes more than 30 seconds.

    Video / GIF

    iOS 10+ only. You can add a video attachment using an mp4 file (max. 50 MB), with a valid mime type and hosted on an HTTPS server. The video will be downloaded automatically on your users' devices and iOS will drop the download if it takes more than 30 seconds.

    You can also attach a GIF file to your push notification. The GIF file must have a valid mime type and be hosted on an HTTPS server.

    Custom payload

    An optional JSON string that can contain additional parameters that your application can handle when receiving push notifications if configured to do so. The root of the JSON must be an Object and cannot have the reserved key com.batch. You can use {BATCH:TITLE}, {BATCH:BODY} and {BATCH:DEEPLINK} variables. They will be replaced.

    For example, you can use the custom payload to:

    • Set a badge value for your app icon on iOS

    • Customise your notification sound on iOS

    • Add action buttons to your notification

    • Send silent notifications

    FCM/APNS Priority

    Defines the priority of your message on iOS (APNS) and Android (FCM). The default value is high on iOS and Android.

    On Android, you can use the high priority if you have a messaging/voip app and if you notice delivery issues due to native (Doze) or constructor related (Samsung Smart Manager, etc) energy saving features.

    High priority Android notifications can drain your user's battery faster since they 'wake up' the device and open a network connection. Switch to Normal priority if your notification is not time-sensitive.

    FCM Collapse key

    Defines how notifications are managed when an offline device goes online. If enabled, the device will only show the most recent notification. If disabled, it will show all the notifications received when the device was offline.

    You should disable the collapse key if all your notifications matter (E.g. messages, etc). You can use up to 3 different collapse keys if you want users to get only one notification of each kind when coming online (E.g. marketing message, alert, etc).

    Expiration (TTL)

    You can set an expiration delay or a Time to Live (TTL) in hours for your notification. The notification won't be displayed if the device doesn't receive the notification or doesn't come back online within this time.

    By default, Batch sets a TTL of 14 days for all the notifications you send. If your user's device comes back online before being off for two weeks, it will display the last notification you sent to your user (iOS) or all the notifications sent over the previous two weeks (Android and web push).

    In addition to setting an expiration delay for your push campaign, you can set a global expiration delay that will be applied to all your notifications. This can be done from the dashboard settings > Push settings.

    We strongly recommend you set a short global TTL for web push notifications to prevent customers from wanting to opt-out. Users who accept to receive web push notifications are more likely to turn off their device (e.g. a laptop at home, etc) and receive many notifications from your website when they go back online.

    Review

    While the review page is self-explanatory, it's not to be dismissed. Look over and verify all the details of the campaign before saving all of your work or activating the campaign. If you need more time to edit your campaign, you can save it as a draft.

    Duplicate

    After saving your campaign as a draft, you can duplicate it easily by clicking on the "Replicate" button. The campaign duplication also works between iOS and Android apps.

    You can also duplicate your campaign from the Actions menu, next to your campaign's name.

    editor
    is available here
    available here
    custom audience
    "Custom data" tab
    smart segments
    custom audiences
    country languages
    native
    custom install
    estimated reach
    targeting

    Timing & delivery

    Batch handles all the tricky scheduling and timezones issues for you. Our technology makes sure your users always receive their message when you want them to, whether it's a hot news, a scheduled announcement or a recurring message. Simply choose the time, select a few simple options and forget about it. We’ll take care of the rest.

    There are several options to choose from:

    • Now: Use it to send your notification as soon as you click the "SEND" button.

    • Scheduled: Select that option to schedule a campaign in the future based on your users' local time or on global time (UTC).

    • Recurring: Create push campaigns that repeat at specified intervals based on your users' local time or on global time (UTC). This is handy for long term automated campaigns or expiry alerts.

    • Trigger: Trigger campaigns allow you to send push notifications after users installed the app or triggered an action (e.g. add to cart, etc). Use that option for all your abandoned cart and onboarding scenarios.

    Now

    Send a push notification instantly to your users regardless of their timezone. This is the best option if you work in the media and want to be the first to announce breaking news.

    E.g. “Royals beat Mets in Game 1 of World Series, 5-4 in 14 innings. Game 2 is Wednesday night.”

    Note that a push notification cannot be stopped after sending. Carefully verify its timing, content and targeting.

    Scheduled

    The Scheduled option allows you to reach your users at a specific time in the future. You can schedule a push notification based on:

    Local time

    The Local Time option lets you send a push notification that will be received at the same hour in every country. This ensures that marketing efforts target your users at a uniform time.

    When you choose a specific date and time, Batch will send the first notifications at the chosen time starting with users just west of the International Dateline (GMT+12) and each hour afterwards for 24 hours until the conclusion of the campaign.

    For example, if your push campaign is scheduled to be sent on Friday, July 19th at 6pm, your American, French and Chinese users will receive it on Friday, July 19th when it's 6pm in their country.

    Safety net

    If you set a specific date and time and the date/time you've selected has already passed for a particular time-zone, the campaign will not deliver a push to the users within that time-zone unless they are within 30 minutes of the campaign start time.

    This safety net will catch any users that might have been missed and deliver the push, though you should avoid setting last-minute campaigns, as they could be delivered at undesired times.

    Stopping a push campaign

    Stopping a local time based campaign only cancels it for users located in timezones that have not yet reached the scheduled sending time. For example, if the push campaign is scheduled for 2PM (local time) and is canceled at 3PM UTC, a targeted user located in the US (UTC-4) will not receive that campaign.

    Global time (UTC)

    The Global Time (UTC) option allows you to send a push notification to your users at a specific UTC time regardless of their location.

    For example, if your push campaign is scheduled to be sent on Friday, July 19th at 6pm global time (UTC), your users will receive it:

    • At 2PM in the US (UTC -4)

    • At 8PM in France (UTC +2)

    • At 2AM on July 20th in China (UTC +8)

    Note that a global time (UTC) push notification cannot be stopped after sending. Carefully verify its timing, content and targeting.

    Recurring

    You can create push campaigns that repeat at specified intervals based on your users' local time or on global time (UTC). You can also use a capping to limit the number of times users receive a recurring push notification.

    Depending on the recurrence you choose, you can send two different types of notifications:

    Retention notifications

    Sent every week/month to your inactive users. You can either target specific Smart Segments or use the Last visit date native attribute.

    You can send a notification every weekend to the users in the Dormant segment, with a capping of 3 to make sure you don't overpush them.

    Onboarding notifications

    Sent automatically at a specific moment, depending on:

    • : Allows you to create a complete onboarding flow with notifications sent on day 1, 3, 7 after the install.

    • The last visit date: Recommended if you want to push users who are becoming dormant (e.g. 10 days after the last visit).

    • : To create push scenarios based on custom data. Example: Automatically push users who haven't made a purchase in 20 days.

    Onboarding notifications should be sent everyday, with a capping of 1. This will make sure the notification is sent at the right moment for each user, and only once. Please note that your campaign capping will not work if you target the Imported segment.

    Frequency capping: We recommend you set a global frequency capping if you want to limit the number of notifications a device can receive in a customisable time frame.

    Trigger

    The trigger option enables you to send a notification from one minute to several days after users have installed the app or triggered an action in the app.

    Trigger campaigns are useful to manage a wide variety of use cases, from simple welcome notifications sent shortly after users install the app to advanced abandoned cart alerts.

    Understanding How User Journeys Work

    To enter the user journey and receive a push notification from a trigger campaign, users need to:

    1. Trigger: Trigger the event specified in the campaign (e.g. add to cart). Users immediately exit the user journey when they trigger the cancellation event (e.g. checkout).

    2. Timer: Wait until the timer set in the campaign is finished. The timer will be reset if users perform again the trigger action (Unless the is activated).

    3. Targeting: Finally, match the targeting set in your campaign when the timer is finished.

    Users may enter the user journey again after receiving a push notification if they trigger the right event later. They will receive another notification depending on the frequency capping limit and the grace period set in the campaign.

    You can see how many users are still waiting for the timer to finish or why they exited the user journey from the campaign analytics.

    Setting Up a Trigger Campaign

    Choosing a Trigger

    The trigger action is the most important part of your campaign. Some trigger events are available by default, or you can use custom events.

    Installation

    The "Installation" trigger is available by default on iOS and Android campaigns. Users trigger it when they open the app for the first time.

    Important note: Use the “Installation” trigger only for campaigns without any additional targeting conditions (e.g. “Country” = “UK” or “Has custom user ID” = “false”). As user data might not be saved on Batch side yet when the “Installation” trigger occurs, users might not enter the journey of the campaign.

    Installed then opted-in

    The "Installed then opted-in" trigger is available by default on iOS and Android campaigns. Users trigger it when they opt-in to push notifications within 24 hours after they opened the app for the first time.

    The Installation date is attached to the native event "Installed then opted-in", you can use it to define the Push timing (see below).

    Subscription

    The « Subscription » trigger is available by default on web push campaigns starting with version 3 of the Web SDK. Users trigger is when they opt-in to push notifications on your website.

    Important note: Use the “Subscription” trigger only for campaigns without any additional targeting conditions (e.g. “Country” = “UK” or “Has custom user ID” = “false”). As user data might not be saved on Batch side yet when the “Subscrption” trigger occurs, users might not enter the journey of the campaign.

    Custom Events

    You can choose any events that have been tagged in your app during the integration of the SDK. You can also apply filters to your event based on any additional data that is attached to it (Label, Attributes, Tag collection) if you want to trigger the notification on a specific action.

    Setting the Timer

    The push timing can be set to « Immediately » meaning the push would be sent right after the trigger event is tracked or it can be based on a timer. The timer defines the time interval in minutes, hours or days to wait for receiving a notification. Batch will wait this amount of time from the chosen trigger date which can be either the date of the event or a custom date attached to the event (ex: send a push notification 1h before or after a said date).

    The minimum push timing is 1 minute and maximum push timing is 30 days.

    Cancellation Event

    You can add one or several cancellation events. Users who trigger one of the cancellation events before the push is sent will exit the user journey and won't receive the notification. You can use an event tagged in your app and apply filters based on additional event data too (Label, Attributes, Tag collection).

    Frequency Capping / Grace Period

    The frequency capping allows you to limit the maximum number of times an install with a token receives a notification. This is useful to avoid overwhelming your users with the same message.

    Use the grace period to set a period of time in days or hours during which new trigger events will be dismissed after a notification has been sent to the same opt-in install. This is handy to avoid sending too many messages to users too close together.

    If the is activated, the frequency capping and grace period settings will not be applied to the total number of notifications sent by the campaign. It will be applied individually to each user journey (e.g. trigger a maximum of 2 notifications with a minimum delay of 10h between each notifications, for each item added to the cart).

    Start / End Date

    You can schedule the start and the end date of your trigger campaign based on:

    • Local time: Batch will take into account the timezone of your users to start/end the campaign.

    • Global time: The campaign will start/end at a specific time (UTC) regardless of your users' timezone.

    Multi-trigger mode

    By default, if the user fires multiple times the trigger event of the campaign, the timer of the campaign will be reset.

    You may want to parallelize journeys, and allow the user to trigger several times the same campaign. You can do that by activating the multi-trigger mode.

    The multi-trigger mode allows you to schedule a push for each time the user fires the trigger event with a new ID (e.g. Trigger a push for each trip booked by the user on the app based on the trip ID). This ID must be one of the attributes attached to the event or the event label and can only be a String.

    If the is activated, only cancellation events with the same ID as the trigger event can cancel the trigger.

    Modifying a Running Trigger Campaign

    Here is everything you need to know before modifying the targeting or the user journey of your trigger campaign.

    Modifying the Trigger

    Trigger event: Users who performed the trigger event before you modified it will remain in the waiting queue.

    Cancellation event: The new cancellation event will be taken into account immediately, even for users who are already in the waiting queue.

    Modifying the Timer

    Increasing the Timer Duration: Batch will apply the new timer duration for users who are already in the waiting queue and for new users entering the user journey.

    Decreasing the Timer Duration: Batch will only apply the new timer duration for new users entering the user journey. Users who were already in the waiting queue will receive a notification based on the previous timer duration.

    Modifying the Targeting

    Users will remain in the waiting queue even if you modify the targeting of your campaign. They will exit the user journey if they don't match anymore the targeting of the campaign once the timer is finished.

    Modifying the Frequency Capping Limit

    The new frequency capping limit will be applied immediately to users who enter the user journey.

    Regarding users who already received several push notifications from your campaign, Batch will apply the new capping limit the next time they enter the user journey.

    E.g. If your trigger campaign had a capping limit of 5 push notifications and you change it to 3, users who have already received 3 notifications and are currently in the user journey will receive one last notification.

    The new frequency capping limit will be applied the next time they enter the user journey. They will not receive another notification from that campaign as they already reached the limit.

    Using Trigger Campaigns

    Trigger campaigns are useful to manage a wide range of use cases such as:

    Onboarding Campaigns

    Triggered a few minutes/hours after the first session of the user or up to 7 days later.

    Make sure the first notification you send to your users is relevant and brings value to the user :

    • If you have an e-commerce app, you can onboard your new users with a welcome promocode and/or direct them to the list of your most popular items.

    • If you have a media app, you can direct them to the list of trending articles or invite them to test your premium subscription for free.

    • You can also focus on important actions users need to take to fully enjoy your app and services: create an account, personalize their feed, etc.

    Abandoned Cart Alerts

    Trigger campaigns are handy to manage all your abandoned cart use cases. This applies perfectly to all your e-commerce use cases. E.g. alert users 30 minutes after they added an item and didn't place an order) and to a variety of other scenarios.

    Following the same logic, you can use trigger campaigns to alert users who left the app while they were in the middle of something important:

    • Medias: send a reminder to users who have checked your paywall but haven't subscribed yet.

    • Finance/services: alert users who have left the app without validating a step of the account creation (e.g. document upload for identity confirmation, etc) or who were about to subscribe to a new product and haven't validated the subscription yet.

    Update Reminders

    This can be done in two steps if you need to invite users to update to a major new version of your app (e.g. redesign, new features, breaking change or new subscription model).

    Targeting: Add the app version condition in the targeting part of your campaign. In this case, we will use the app version attribute to target all users who are using a version anterior to version 1.18 of the app.

    Scheduling: Pick an event that users should trigger in almost any session (e.g. read article, checked_item, etc).

    Interest-based Campaigns

    Using an may be more appropriate to manage that kind of use cases, but you can also use a trigger campaign to recommend products and additional content to users based on their last action:

    • Ecommerce: users who recently placed a purchase in your app are more likely to place a new one a short period later, especially if you push them an exclusive offer (e.g. free delivery, selected items, etc) of if you personalize the content of your notification (see more here).

    • Media: If your app offers thematic subscriptions, then you can push users who have recently read/watched content on a specific topic and offer them to subscribe. Here is how you could set up your campaign.

    Scheduled reminders

    You can use trigger campaigns to remind your users of important information related to an upcoming event. E.g. Alert users 24 hours before and upcoming trip they booked on your app.

    The trip_id received with every event in this example will act as a deduplication id. This means users will receive as many reminders as they booked trips, not only for the last one they booked.

    Using a similar logic, you can schedule a notification after an important event. E.g. Share a satisfaction survey 3 days after a user's checkout date.

    Troubleshooting

    There are several points you should also check if specific users never received the notification they were supposed to receive from a trigger campaign:

    • Debug tool: Use the to see why a specific install didn't receive a push notification from a trigger campaign:

    • Trigger: Make sure the event used in the campaign is triggered correctly in your app. Otherwise, some users will not be able to enter or exit the user journey set in your campaign. You can use the debug tool to run some tests.

    • Opt-in status: On iOS, users may not have turned on yet push notifications when Batch triggers the notification. This may happen with most of your onboarding campaigns. Use the debug tool to check the opt-in state of a specific install.

    Performance analytics

    The Analytics tab provides a comprehensive view of your key metrics across all channels, allowing you to track their evolution over time. Metrics are grouped by day, week, or month for an easy-to-understand overview. For detailed explanations of each metric, refer to the Delivery metrics section.

    Date Range

    Select a date range of up to 1 year to analyze long-term performance trends or focus on recent activity:

    Filters

    Narrow down the data by applying filters such as:

    • Labels

    • Languages

    Channels

    Thanks to this tab, you gain a comprehensive view of your key metrics, easily identify trends, and explore details with advanced filters for each channel.

    Email

    See available in the Performance Analytics view.

    You can drill down into data by specific mailbox provider or by to evaluate performance at a more granular level:

    Push

    See available in the Performance Analytics view.

    Here, you can focus on specific platforms such as Android, iOS, or Web to assess platform-specific engagement:

    A profile with multiple devices (e.g., phone, tablet, computer) may receive multiple notifications, resulting in more Sent messages than targeted profiles.

    Each interaction (open, unsubscribe) is recorded independently. For example, if a profile receives and opens the push notification on both their phone and computer, the dashboard will reflect 2 Sent messages and 2 Unique Opens.

    In-App

    See available in the Performance Analytics view.

    SMS

    See available in the Performance Analytics view.

    Omnichannel Trigger Automations

    Batch Automation Builder is an interface where you can create multi-step and multi-channel Trigger Automations. Thanks to different branching and targeting options you can create advanced scenarios in order to deliver personalised customer experiences.

    Entering and exiting the scenario

    You have 2 options to initiate the user's journey:

    Analysing Automation with Analytics
    App in foreground: If you set a timer in minutes, users may still be in the app when Batch triggers the notification. The notification will not be displayed on iOS if the app is in the foreground, except if you added support for that feature. On Android, an icon will appear in the status bar if users have the app opened in the foreground.
    The installation date
    A custom attribute
    multi-trigger mode
    multi-trigger mode
    multi-trigger mode
    In-App Campaign
    debug tool
    now
    scheduled
    Recurring
    trigger
    Trigger
    trigger schema
    User journey diagram
    Trigger Event Filters
    Trigger timer options
    Mutil-trigger Mode
    onboarding
    cart abandonment
    Trigger media targeting
    Trigger media scheduling
    trip information
    when
    Email key metrics
    Push key metrics
    In-App key metrics
    SMS key metrics
    push filter
    Email Sender
    performance analytics
    The triggering of a custom or native event, regardless of its source (API, SDK).
    • Before a first attempt to send a message to the user, new similar events received will make the user restart the automation.

    • After a first attempt to send a message within the automation, new similar events received while the user is waiting in the Automation will not restart the automation, and as such the user will continue their progress in the flow.

      • If you want the user to enter a new instance of the Automation each time they fire the trigger event, check "Parallel Automations" section below.

    • 2 native trigger events are available: Subscribed to mobile push notifications (iOS/Android) and Subscribed to web push notifications

      • Use these triggers to automate onboarding journeys, such as welcoming a user right after they opt in.

      • Combine the Subscribed to mobile push notifications trigger with targetings on Installation date to create app onboardings and limit onboarding to new app users.

      • A push subscription event is created each time a device subscribes, not only the first time. Apply capping at the automation level to avoid over-sending.

  • A change in the value of a custom profile attribute thanks to the Attribute Change Trigger feature: with this option, you can specify the old (optional) and new (mandatory) values for the attribute.

    • Native attributes and attributes of types Array, Object, and URL are not supported at the moment.

    • Trigger on attribute change is designed to work in near real-time, firing as soon as the attribute change is processed on a profile. Thus, we advise you to use Wait until or Quiet hours steps in your Automations to prevent messages from being sent at inappropriate times.

  • Note these behaviours for attribute change scenarios:

    • Profile creations will not be considered an attribute change.

    • There are no issues if you regularly update your profile attributes by resubmitting all attributes each time. If the attribute value does not change, it will not be considered an attribute change so it will not trigger the Automation with every update.

    • If the attribute type is modified with an override, the conditions will still apply to the previous type. The automation needs to be updated if you want to track the new attribute type. We do not recommend changing the type of an attribute used as a trigger for an Automation.

    To further refine user entry, you can:

    • Use event filters (only available on event-based scenarios). This feature allows you to filter the entry event based on event attributes.

      • Ex: in a retail scenario, upon an 'add to cart' event, you can ensure that only customers with a product of a specific value and/or belonging to a particular product category will enter the sequence.

    • Define your targeting. Use the query builder to specify which users you want to target by selecting targeting conditions amongst all events, attributes, segments and audiences at your disposal.

      • Targeting is checked at the entry of the Automation and after each delay step.

    • Specify a Capping at the Automation level. The capping is the maximum number of times a user can enter the automation. We count an entrance when at least one message has been sent to the user.

      • Ex: If the capping is 1 and the user first enters the Automation but ends up being excluded from it by an exit event before being addressed by a message, it will not count in the capping and the user will be able to re-enter the Automation.

    • Specify a Grace Period at the Automation level. The grace period is the minimum time between a user exiting the Automation and re-entering it. It can be up to 60 days. The grace period is counted from the moment a user reaches a final state in an automation (user finishes the automation, is excluded from it by an exit event etc.). Just like Capping, if an Automation has never attempted to send a message to a user, we do not apply the grace period.

      • Ex: If a user reaches a final state of an automation that never tried to send them a message, he can re-enter this same automation immediately.

    • Specify the type of communication, Marketing or Transactional, you want to send with the scenario. If you select “Marketing”, in step of the Automation, which is an Email or SMS message, only the users subscribed to the given channel’s marketing communications will be targeted. If you select Transactional, users will be targeted whether or not they have subscribed to the given channel. Please note that marketing vs transactional does not apply to push communications.

      • The marketing/transactional block is only evaluated when an SMS or Email message is sent, so there is no blocking to enter Trigger Automation (users who are opt-out to SMS and Email communications will be able to enter the Automation but will not be able to receive SMS or Email messages).

    • Enable Parallel Automations (only available on event-based scenarios) . When this option is activated, the user can trigger and advance through the same Automation several times in parallel. The Automation is triggered each time the user fires the trigger event with a new event parameter. The event parameter can be an attribute attached to the event or the event label but can only be a String.

      • Ex: Trigger a series of messages each time a user adds a product to his cart, based on the product category.

        • When Parallel Automations option is enabled, any external event later used in the scenario will be automatically checked to see if they carry the same discriminating attribute as the one specified on the entry event so it is not necessary to do it manually. For example: you create a scenario on an add_purchase event and enable parallel automations with an id associated with each add_purchase event as the discriminant attribute. If you add cancellation events to your scenario, Batch will automatically check that the cancellation events triggered by the user carry the same id as the one that the event that prompted entry into the Automation.

    • Specify a start date. Any event triggered before the start date will not trigger the Automation.

    • Specify an end date. When the end date is reached, the automation essentially goes to sleep, stopping any further progress and preventing any more messages from being sent.

    Regarding exiting from an Automation, users can exit for 3 reasons:

    • The user triggered an exit event. The user was in a wait until step and they triggered an exit event within the allotted time. When a user triggers an exit event, they are excluded from the Automation, and thus will not continue their journey.

    • The user arrived at the end of the Automation. The user just finished their journey and arrives at the final step of the Automation.

    • The user no longer complies with the targeting conditions. Each time the user moves from a delay step to another step, we re-check whether they still comply with the targeting conditions. If this is no longer the case, the user is excluded from the Automation.

    Behaviour when modifying an Automation

    • If you stop an Automation and restart it, it's treated as if the Automation had just been created. Everyone has to go through the entry event. If a user was already part-through the scenario before the Automation was stopped, they are removed from their state and they must once again wait for the entry event.

    • If you update the Automation to modify...

      • the trigger: Users who performed the trigger event before you modified it will remain in the waiting queue.

      • the exit events: The new exit events will be taken into account immediately, even for users who are already in the waiting queue.

      • the timer increasing the timer duration: Batch will apply the new timer duration for users who are already in the waiting queue and for new users entering the automation.

      • the timer decreasing the timer duration: ​Batch will only apply the new timer duration for new users entering the automation. Users who were already in the waiting queue will receive a notification based on the previous timer duration.

      • the splits : It will be applied immediately to users.

      • the frequency capping: It will be applied next time the user enter the automation.

      • the end date to a later date:

        • If there are less than 64 days between the initial end date and the date on which the new end date was set, then we listen to the events again and the users who were in the Automation retain their previous state (their place in the scenario).

        • If there are more than 64 days between the initial end date and the date on which the new end date was set, then the events are listened to again, but all users are evicted from the automation and must once more go through the entry event.

        Why 64 days? Because as soon as there is no more change of state in the scenario, the user’s state in the scenario is kept for 64 days. After 64 days, it automatically exists.

    Adding steps to the scenario

    To build your scenario, the Automation builder offers 3 main step types:

    Message steps

    You can create SMS, Email and Push messages and place them wherever you want in the scenario. On each message step you have the same composition interface as for Campaigns and Recurrings, complete with the same capabilities.

    • On the push channel you will be able to target either iOS and/or Android and/or Web devices.

    Split steps

    You can split your audience into different branches thanks to 2 main branching options. You can even nest multiple decision branches as desired.

    • Yes/No Splits: your audience is split into 2 groups depending on whether they match or not:

      • The targeting condition(s) you specified in the split.

      • The trigger event filters you specified in the split.

        • The operator between the two query blocks (”Segmentation” ie profile targeting and trigger event filtering) is always AND. This means a user must match both the profile query and the trigger event query to follow the "Yes" branch.

        • In addition to this, the operator between the different filtering conditions for the trigger event is always the same, either AND or OR.

        • Currently, complex attributes like arrays and objects are not supported for filtering in the trigger event query block.

        • The estimated reach calculation will only be displayed for the profile targeting part of the query. This is because it's not possible to accurately predict which profiles matching the targeting will also trigger the event with the correct attributes. If a Yes/No split only contains a trigger event query, the estimated reach will not be displayed.

        • If a client changes the trigger event for an Automation, a confirmation modal will appear to warn them of potential impacts. If they approve the change, the filter event query will be cleared.

    • Random Splits: your audience can be split into up to 4 algorithm-based random groups. Please note that if a specific user enters the Automation several times, they will not go into the same branch each time.

      • This feature is useful to run AB tests on the entire scenario, on a specific branch or message.

    Wait steps

    You can make your users wait for a defined period and/or for specific events.

    • The “Delay” step in the Automation Builder contains 3 different options.

      • The “Wait for” option makes it possible to set waiting times from 1 minute to 30 days between the various steps of the scenario. The starting point is the triggering of the input event.

        • You can chain several “Wait for” steps if you want the user to wait more than 30 days between 2 messages steps.

        • The “Wait until” option which makes it possible to define the time and, optionally, the weekday at which users will proceed to the next step.

          • Ex: If a user enters an automation at 11 a.m. with the first message step set to wait until 10 a.m., they will receive the message at 10 a.m. the following day.

        • The “Wait until date attribute” option which makes it possible to wait until a specific time before or after the date of a date attribute associated with the trigger event.

          • Ex: If your event is add_to_cart and you have associated it with the date when the sales end, you can wait 1 day before the sales end to send your next message.

        • For each of these delay options, exit events can be set. If one of these events is triggered by a user during the wait time, they will exit the automation.

    • The "Event" step in the Automation Builder allows to wait for up to 4 events over a defined time period. It works as follows: once the user enters the Event step, they are put on hold for a customer-defined duration. Two outcomes are possible:

      • The user triggers one of the expected events. They will then immediately proceed down that event's branch (without waiting for the timer to expire). Allowed events are:

        • Custom Events: (except the Automation trigger event which is not supported)

    To be noted that the maximum number of message steps you can have in the same Automation is 25.

    Handling the marketing pressure of the Automation

    To make sure each user entering the Automation receives an appropriate amount of messaging and receives messages at the right time you can:

    • Leverage automation level capping already described above.

    • Leverage label capping: This capping applies to all types of orchestrations (Campaigns, Recurrings and Trigger Automations). You can add up to 5 labels to your scenario. In the Automation Builder, after a message has been skipped (not sent) due to a capping rule, the user will not exit the automation flow, and instead continue to the next step.

    • Specify a quiet time: At the entry point of your scenario, the Quiet Time feature allows you to specify a time slot or days during which your audience won’t be messaged.

      • By enabling Daily Quiet hours, you define a time slot during which users will not receive messages.

      • By enabling Weekly Quiet Days, you define one or several days during which profiles will not receive messages.

      • You can enable Quiet hours on its own but Quiet days can only be enabled when Quiet hours is also activated (to make sure we will not send messages at midnight + 1 minute on the following day).

      • When you activate Quiet hours / Quiet days, you need to define what is the required behaviour for the messages that should have been sent during the Quiet time:

        • Send at the next available time (ex: an SMS message should have been sent on Sunday, which is a Quiet day. It will instead be sent in the first hour of the open message slot on Monday and, only after that, the user will continue their journey).

        • Skip the message step and continue (ex: an SMS message should have been sent on Sunday, which is a Quiet day, it will not be sent and the user continues their journey directly).

      • When Quiet Times (Quiet hours/Quiet days) are enabled, they are applied by default to all automation messages. However, it is possible to deactivate Quiet time from the Advanced Settings of each Automation message. Note that: The Quiet times (Quiet hours/Quiet days) are based on Profile's local time. If no local time can be found for a Profile, the Quiet times will be based on the Universal Time (UTC) Timezone.

    Analysing Automation with Analytics

    In the Automation, you have 2 views:

    • The “Builder” view: the one on which you land by default, allowing you to create, update and review your scenario by consulting key metrics.

    • The “Analytics” view: the one on which you can check how your Automation is performing in details, from an engagement and delivery perspective.

    You can access the Analytics view of your Trigger Automations directly from the Automations listing on the three dots kebab menu.

    In the Builder view, you can view (over the last 7, 30, or 90 days) :

    • The display of key engagement metrics and their trends on message steps.

      • Sent, Opened, Clicked and Unsubscribed rates (metrics vary by channel).

    • The display of user paths metrics:

      • The number of profiles that have entered and exited the Automation.

      • The number of profiles currently waiting on each delay step of the Automation (real time data).

      • The percentage of users who went down each branch of a Yes/No split.

    The Analytics view has up to 4 sections, depending on how many different channels and steps are used within the Automation:

    • The “Step by step” section: a table that sets out the key engagement data for each of the messages in your scenario, no matter the channel.

      • This section is displayed when there is more than one step in the Automation.

    • The “Email” section: gathers all the data of your email channel in the Automation, in other words the data of all your email messages. This section is similar to the Analytics available on Email Campaigns and Recurring Emails.

      • This section is displayed when there is at least one email message step in the Automation.

    • The “Push” section: same as for email.

    • The “SMS” section: same as for email.

    What is explained on this page is focused on how Trigger Automations works for Email, SMS and Push v2 channels. For Push v1, the experience is slightly different, with a form based interface, allowing you to create single push message sendings based on events received, by Platform (iOS, Android, Web).

    trigger automation
    Samsung
    LG
    personalization
    mobile landing
    media url

    Basics

    Introduction

    You can personalize your push notifications from the campaign editor using the data you have collected on your users. Batch provides a system of dynamic contents and a templating engine, allowing you to make dynamic messages for your campaigns.

    Using the templating engine, you can reference and use user data inside your message. You can also add conditions to a message so that the content changes if some condition is fullfilled.

    Here's a quick example to see how a dynamic content with a user attribute looks.

    Dynamic Content

    Before diving deep let's review the dynamic contents.

    We have implemented a dedicated interface to allow you to use user attributes in dynamic content and display custom data easily. When editing your message, just click on the {...} button, choose the custom attribute you want to personalize your message with and the formatting.

    That's it!

    As some of the targeted users might not possess the attribute you are using, you can add a default value. The preview will let you see how the notification will look for 10 random installs.

    Referencing attributes in your messages

    If you are using APIs to send your notifications, here is the syntax to use dynamic contents in a message. All attributes usable in a query are available in dynamic contents.

    They are:

    • attribute or c.attribute will refer to an installation attribute, collected from the SDK.

    • u.attribute will refer to a user attribute, collected via the Custom Data API.

    If the user's c.current_level attribute is 6 this evaluates to:

    Referencing properties in object attributes

    If you have an object attribute, you can reference its properties using the dot notation. Suppose you have an attribute address that is an object with the following properties:

    You can reference the properties like this:

    Please note that, for now, object attributes are only accessible through event attributes.

    Default values

    Note that with the previous dynamic content, if the user doesn't have the attribute the resulting message will be:

    This is probably not what you want, so you can add a default value. The default value is used when the attribute doesn't exist.

    Here is how to use them:

    If the user's u.special_offer attribute is -15% then it evaluates to:

    Otherwise it evaluates to:

    Referencing tag collections

    All tag collections usable in a query are available in a dynamic content.

    They are:

    • t.tag will refer to an installation tag collection.

    • ut.tag will refer to a user tag collection.

    However, there's a catch: since a tag is a collection of values and we can only output a single value using a dynamic content, we have to introduce the concept of filters. A filter is a function you can apply to a value to transform it.

    In the case of a tag collection you can use the filter join to concatenate all values into a single string.

    For example:

    Note that using a filter on a tag collection that doesn't exist always produces an empty string. Using the previous example, if the tag collection t.levels_done doesn't exist the dynamic content evaluates to:

    Loops are also available for tag collections, you can iterate over the values of a tag collection using the for loop, as explained in the .

    Formatting

    Using raw data like this is great but you might want to format the attributes yourself.

    Formatting is done by using the following filters:

    • to format a date attribute

    • to format a number attribute

    The two filters are explained in details in the reference but here is a small example:

    This evaluates to:

    Be sure to check out the reference documentation to learn about all options !

    Templating

    Dynamic contents are already really powerful but they're not always enough.

    For example, what if you want to display a completely different message based on which level a user is on, or how much fidelity points he has ?

    This is a job for templates.

    Templates allow you to do conditional statements, define variables and even do some light arithmetic.

    Conditions

    Suppose you want to congratulate a user based on how far he is into your game.

    You could write something like this:

    Now depending on the value of the user's current_level attribute, the message will be one of the 3 possibilities.

    Loops

    You might want to exploit a list of values, for example to display a list of products a user has bought. for loops are here for you, you can iterate over a list of values (like a tag collection or array attribute) and display them.

    Variables and arithmetic

    Sometimes it might be handy to compute some value and keep a reference to it so you can reuse it multiple times inside your template.

    It is mainly a quality of life improvement but still useful.

    For example, suppose you want to compute an expiration date based on multiple user attributes and remind the user when their subscription will expire.

    Given the following rules:

    • premium users have 90-days subscription

    • users subscribed to the newsletter have a 75-days subscription

    • users younger than 25 and not premium have a 60-days subscription

    • all other have a 50-days subscription

    You could write something like this:

    This evaluates to:

    Obviously the date will change based on what kind of subscription the user has.

    There are a couple of new features here:

    • Defining a variable with set $variableName = <expression>. A valid expression has to return a single value of any type.

    • Arithmetic. You can do simple math inside a template. Conveniently, you can add also do arithmetic on a date by using a

    • Concatenation. You can concatenate multiple values into a single one using the ~ operator.

    Referencing custom app data

    Dynamic contents and templating also allow you to reference custom application data to use in your messages.

    These are tables of key/value pairs that you can upload using our dashboard.

    For example, given a table with the name population_by_city with the following content:

    These are the population of Paris, Lyon, Marseille, Strasbourg and Bordeaux respectively.

    You can now use them like this.

    For someone in Paris, this evaluates to:

    You can use any attribute or literal value as the lookup key. This works too:

    However by doing this you lose the benefit of the custom app data table. This also works:

    Language matching

    The speaks function allows to customize contents according to the user language. It's recommended to use this function instead of the b.language native attribute as its value is not guaranteed to be stable. It accepts one or more languages as parameters, and returns true if the user language matches one of them according to the language matching rules.

    Referencing trigger event data

    In the context of a trigger campaign, using data from the trigger event is possible by using the attribute named trigger_event. It is an object attribute that contains the attributes of the trigger event that triggered the campaign.

    Here is how you can use it:

    You can still access the trigger event label, tags and attributes using 3 specific functions:

    • triggerEventLabel(): returns the label of the trigger event

    • triggerEventTags(): returns the tag collection attached to the trigger event. It can be used the same way as the tag collections.

    • triggerEventAttr(attribute_key): returns the attribute value corresponding to the given key, it is the equivalent of trigger_event.attribute_key

    Here are a few examples of how you can use them.

    Using the product name the user added to its cart:

    Or if the products are listed in the tag collection:

    Use cases

    After looking into how it works, let's look at some use cases for dynamic contents and templates that would otherwise be hard or even impossible to do.

    Electoral results

    Suppose you want to report on electoral results for every city in France. There are currently 35416 cities in France and you want each user to have the result from their city when receiving the notification.

    Without dynamic contents you could only do this by creating one campaign per city with a query matching the city. In that case you'd need more than 35k campaigns, this is obviously not good.

    Instead you can do the following:

    • create a table named electoral_results_201710 for example.

    • each row in the table should be $city_code => $result.

    Example:

    These are the results of Paris, Lyon, Marseille, Strasbourg and Bordeaux respectively.

    • Then, create a message containing a lookup on the table and city code.

    Example:

    For someone in Paris this will evaluate to:

    Each user will have a customised message based on where he is.

    Loyalty program goals

    Suppose you have a loyalty program for your application where the user can gain points and at some threshold you gain a loyalty level. Here is an example of a points scale:

    • 100 points - regular

    • 500 points - silver

    • 1000 points - gold

    • 5000 points - platinum

    Suppose also that you attach special one time discounts every time the user gains a level.

    Finally, suppose you want to remind a user that they're about to reach the next level with the following message:

    Let's break down what we need:

    • the number of points to reach to get to a level

    • the number of points that a user has to gain

    • the discount for a level

    Prerequisites

    For this to work you need to feed us the data we'll be working with; you can do so using custom attributes or the Custom Data API.

    We imagine the following user attributes:

    u.loyalty_points an integer value representing the current number of points a user has

    We also need two custom app data tables:

    loyalty_thresholds containing this:

    The query

    Before diving into the template let's look at what query we should use:

    This will match any user that is just about to reach the next level.

    The template

    Here is how the template could look like:

    Special discounts after a purchase

    Suppose you want to give a user a special discount if they didn't buy anything after a month, and at the same time you want to remind them what they bought.

    Suppose also that the discount changes based on how much time has passed since the purchase:

    • 20% after a month

    • 40% after more than two months

    For example you could have the following message:

    Let's break down what we need:

    • the product name of the last purchase

    • the date of the last purchase

    Prerequisites

    Like before, for this to work you need to feed us the data we'll be working with; you can do so using custom attributes or the Custom Data API.

    In this use case we'll use custom events so you need to have that working too.

    We image the following user attributes:

    u.last_purchase_product_name a string containing the product name of the last purchase. It should be a properly formatted string.

    We also need one custom event:

    e.purchase which tracks every time a user has purchased something.

    The query

    The query needs to filter users that haven't purchased anything since at least a month:

    The template

    Here is how the template could look like:

    Did you like your {{ u.last_purchase_product_name }} ? Get a {{ $discount }} discount on all purchase today!

    In-App Automations

    In-App messages are messages displayed inside your app. You can trigger them when users open your app or perform a specific action (e.g. tapping a button, browsing a page, etc). They can be managed from the “Automations” tab of your dashboard.

    Synchronization workflow

    When the app is launched, the SDK automatically retrieves from Batch's servers the list of automations available at that moment.

    This implies that every events and attribute that have been collected during the current session won't be taken into account for the targeting of an In-App automation until the next session.

    For instance, if you set the targeting to a count of events, then the user's own count has to match the targeting criteria at the app launch rather than during the session in order to display the In-App automation.

    Push subscription events are tracked at the profile level, allowing messages to reach all devices of a profile or be filtered by platform (iOS, Android, Web).

    You can filter the events on their attributes (e.g., wait for a purchase event where category = "shoes").

  • It is not possible to filter on complex attributes like arrays or objects, all other attribute types are supported.

  • Event filtering is optional.

    • If an expected event occurs (e.g., purchase) but does not match the specified attributes (e.g., category = "pants"), the event will be ignored and the profile will continue to wait.

  • Retargeting Events: You can wait for Opened message or Clicked message events.

    • For technical consistency with clicks, this step listens for all Opened message events, not just "initial opens."

    • Retargeting event filtering is mandatory.

    • You have to select the Campaign or Automation you want to retarget.

    • You can retarget the same Automation you are creating by selecting “This Automation”.

    • When retargeting an Automation you can define a specific step to retarget or not (if you do not specify a step, reactions to all messages of the Automation are taken into account).

  • The user does not trigger any of the expected events. They will wait for the timer to expire and then proceed down the timer's branch.

    • The wait time is configurable from 1 minute up to 30 days.

  • Specific behaviours:

    • Parallel Automations specific behaviour : When Parallel Automations option is enabled on your Automation, retargeting is limited to messages of the same Automation (”This Automation” is enforced).

    • Targeting Check: As with delay steps, the profile's eligibility for the Automation's targeting is re-checked when they exit the step (either on event or timeout). If they no longer match the targeting, they will exit the automation.

  • loop section
    formatDate
    formatNumber
    duration
    You're only on level {{ c.current_level }}, come back and play !
    You're only on level 6, come back and play !
    {
      "city": "Paris",
      "zip_code": "75001",
      "street": "1 rue de Rivoli"
    }
    You live in {{ address.city }}, {{ address.zip_code }} {{ address.street }}
    You're only on level, come back and play !
    Special offer: Get {{ u.special_offer|default('-5%') }} by subscribing today !
    Special offer: Get -15% by subscribing today !
    Special offer: Get -5% by subscribing today !
    You've already beaten those levels: {{ t.levels_done|join(',') }}
    You've already beaten those levels:
    You have accumulated {{ u.points|formatNumber(decimals=2) }} points, make sure to use them before {{ u.points_expiration_date|formatDate('yyyy-MM-dd') }}
    You have accumulated 20.68 points, make sure to use them before 2017-02-30
    
    <div data-gb-custom-block data-tag="if" data-0='3' data-1='3' data-2='3' data-3='3' data-4='3' data-5='3' data-6='3' data-7='3' data-8='3'>
    
    Good job on beating level 3 ! You're now halfway through the game, keep pushing !
    
    <div data-gb-custom-block data-tag="else" data-0='5' data-1='5' data-2='5' data-3='5' data-4='5' data-5='5' data-6='5' data-7='5' data-8='5' data-9='5'></div>
    
    Almost there ! One more level and you beat the game !
    
    <div data-gb-custom-block data-tag="else" data-0='6' data-1='6' data-2='6' data-3='6' data-4='6' data-5='6' data-6='6' data-7='6' data-8='6' data-9='6' data-10='6'></div>
    
    Amazing ! You've beat the game ! Go take a look at the amazing perks you unlocked !
    
    </div>
    
    
    <div data-gb-custom-block data-tag="for">
    
      You've bought {{ $product.name }} for {{ $product.price }}$ !
    
    </div>
    
    
    <div data-gb-custom-block data-tag="if">
    
    <div data-gb-custom-block data-tag="set" data-0='90' data-1='90' data-2='90' data-3='90' data-4='90' data-5='90' data-6='90' data-7='90' data-8='90' data-9='90' data-10='90' data-11='90' data-12='90' data-13='90' data-14='0'></div>
    
    <div data-gb-custom-block data-tag="else"></div>
    
    <div data-gb-custom-block data-tag="set" data-0='75' data-1='75' data-2='75' data-3='75' data-4='75' data-5='75' data-6='75' data-7='75' data-8='75' data-9='75' data-10='75' data-11='75' data-12='75' data-13='75' data-14='5'></div>
    
    <div data-gb-custom-block data-tag="else" data-0='25' data-1='25' data-2='25' data-3='25' data-4='5'></div>
    
    <div data-gb-custom-block data-tag="set" data-0='60' data-1='60' data-2='60' data-3='60' data-4='60' data-5='60' data-6='60' data-7='60' data-8='60' data-9='60' data-10='60' data-11='60' data-12='60' data-13='60' data-14='0'></div>
    
    <div data-gb-custom-block data-tag="else"></div>
    
    <div data-gb-custom-block data-tag="set" data-0='50' data-1='50' data-2='50' data-3='50' data-4='50' data-5='50' data-6='50' data-7='50' data-8='50' data-9='50' data-10='50' data-11='50' data-12='50' data-13='50' data-14='0'></div>
    
    </div>
    
    Hey {{ c.first_name ~ c.last_name }}, friendly reminder that your subscription will expire on {{ $expiration_date|formatDate('yyyy-MM-dd') }}
    Hey John Smith, friendly reminder that your subscription will expire on 2018-01-03
    2988507,2244000
    2996944,484344
    2995469,850726
    2973783,271782
    3031582,239157
    You live in a city of {{ lookup('population_by_city', b.city_code) }}
    You live in a city of 2244000
    You live in a city of {{ lookup('population_by_city', 2988507) }}
    You live in a city of {{ lookup('population_by_city', c.my_custom_city_code) }}
    Your {{ trigger_event.product_name }} is waiting for you !
    Your {{ triggerEventAttr('product_name') }} is waiting for you !
    {{ triggerEventTags() | count }} items are still waiting for you in your cart !
    2988507,Yes 20.3% - No 79.7%
    2996944,Yes 48.5% - No 51.5%
    2995469,Yes 74% - No 26%
    2973783,Yes 38% - No 62%
    3031582,Yes 93.2% - No 6.8%
    Election day result: {{ lookup('electoral_results_201710', b.city_code) }}
    Election day result: Yes 20.3% - No 79.7%
    Gain 55 more points to reach Gold and get a one time discount of 15%!
    regular,100
    silver,500
    gold,1000
    platinum,5000
    {
      "$or": [
        "$and": [
          "u.loyalty_points": {
            "$gte": 85
          },
          "u.loyalty_points": {
            "$lt": 100
          }
        ],
        "$and": [
          "u.loyalty_points": {
            "$gte": 475
          },
          "u.loyalty_points": {
            "$lt": 500
          }
        ],
        "$and": [
          "u.loyalty_points": {
            "$gte": 850
          },
          "u.loyalty_points": {
            "$lt": 1000
          }
        ],
        "$and": [
          "u.loyalty_points": {
            "$gte": 4950
          },
          "u.loyalty_points": {
            "$lt": 5000
          }
        ]
      ]
    }
    Gain {{ $remaining }} more points to reach {{ $nextLevel|upper }} and get a one time discount of {{ $discount }}
    Did you like your Nike Air Max ? Get a 20% discount on all purchase today!
    {
      "age(e.purchase)": {
        "$gte": "30d"
      }
    }

    Please note the following:

    • If the user has a limited network connection, the synchronization may be delayed. After a certain time, the SDK will stop the synchronization and will not display any more message to avoid impacting the user experience.

    • During the user’s very first session it is not possible to display an in-app message within the session.

    Creating an In-App Automation

    The first thing you need to do to save your In-App automation is to name it. You can also attach 1 to 5 labels to it, which allows you to define a label capping in the settings. Note that any changes to your labels and label capping can take up to 20 minutes to be effective. See the documentation on labels for more information.

    Choosing the right trigger

    You have several settings available to define when your in-app message will be displayed to your users.

    • First, you can choose 1 to 10 events to trigger its display. As soon as one of your users triggers any of these events, it will initiate the in-app's display (provided they meet other targeting criteria and conditions).

      • Custom trigger events must be events triggered by your users on their iOS or Android applications, which are sent via our SDK following the tagging plan established with our teams. It's not possible to trigger an in-app message based on an event triggered by API.

      • You can also trigger your In-app with the native event New session so the message will appear on the next launch of your user’s app or when the user returns to the foreground after being in the background for at least 5 minutes.

        • When a user matching the set targeting opens the app and therefore starts a new session, Batch’s SDK will retrieve all the information related to the automation. It will then trigger the automation as soon as the synchronization is finished.

    • You can then filter these events based on their string attributes (one filter at a time).

      • For example, if you want to specify multiple pages where the in-app message can be displayed, and the page name is an event attribute, you simply need to call the trigger event multiple times with a different filter each time.

    • You can also specify a delay between the event trigger and the in-app display. This delay can be up to 60 seconds and allows you to make your in-app messages less intrusive for your users.

      • If the application is in the background when the timer ends, the message will not be displayed. It will be shown the next time the event is re-triggered.

    Finally, you can also refine your display by setting a capping and grace period:

    If you do not have capping or a grace period on your in-app, it can be displayed every time a user triggers one of the triggering events, including within the same session.

    • The capping allows you to limit the maximum number of times an In-App automation will be displayed to a user. This is useful to avoid overwhelming your users with the same message.

      • If you have already had deliveries for your in-app message and you apply capping later, previous deliveries will be taken into account. For example, if I have an in-app message that has been running for two weeks and I add a capping of 1, any profiles that have already displayed the in-app message at least once since it was published will not see it again.

    • The grace period allows you to set a delay between each display of the same In-App message. This feature is quite handy to avoid your user to see the same message multiple times in a single session.

      • Just like with Capping, previous sends are taken into account when you apply a Grace Period after the fact. For example, if an in-app message was shown to a profile 30 minutes ago and I apply a Grace Period of 1 hour, that profile will not be able to trigger the in-app message again for another 30 minutes.

    info : Capping and grace period are applied at the profile level, not the device level. For example, with a capping of 2, only two in-app messages will be displayed in total, regardless of the user's number of devices. This means the user might not see the in-app message on one of their devices.

    Defining your targeting

    Check this documentation to know more about targeting.

    For in-app automations, targeting is checked after each trigger event occurs to ensure profiles still comply with the criteria before displaying the message.

    Under your Targeting you can check your In-app estimated reach, that is to say the number of profiles with installs with SDK version 3.1 and higher that match your targeting. The estimate gives a breakdown by device type (iOS and Android, excluding web).

    Defining your timing

    This section lets you program your In-App automation. You can schedule the start and the end date of your automation based on Universal time or Profile’s local time.

    You have more control over your timing thanks to the Quiet Times block: this feature allows you to specify a time slot or days during which your Profiles won’t be displayed messages.

    • By enabling Quiet hours, you define a time slot during which profiles will not be displayed messages.

    • By enabling Weekly Quiet Days, you define one or several days during which profiles will not be displayed messages.

      • You can enable Quiet hours on its own but Quiet days can only be enabled when Quiet hours is also activated (to make sure we will not send messages at midnight + 1 minute on the following day).

      • Note that: The Quiet times (Quiet hours/Quiet days) are based on device's local time.

        • Even if a user bypasses Quiet Hours by changing the date on their device, our backend will still prevent the message from being displayed. This is because the time is also verified server-side.

    Composing your message

    Check this documentation to know more about our In-App Composer and Settings.

    Note that In-App messages support multi-language and A/B testing, mirroring the capabilities available for Mobile Landings.

    Managing an In-App Automation

    Modifying an In-App Automation

    Batch doesn't send live updates to your app when you save changes for an In-App automation. These changes will be detected the next time your users open the app or returns to the foreground after being in the background for a few minutes.

    During that session, the SDK will sync again with Batch servers. The SDK may still display an outdated version of your campaign or an In-App automation recently disabled. All the changes received from Batch servers will be applied in the next session. This is why we recommend you include an end date in your automations or double-check the wording of your automation before activating it:

    The only element that is automatically synchronized and doesn't require restarting the application to apply the latest changes is the targeting.

    Stopping an In-App Automation

    If you need to stop an In-App Automation you can do so at any time. When an In-App message is about to be displayed, the SDK performs an automatic check against the server to confirm:

    • The campaign is still active (not stopped).

    • The user's profile still matches the defined targeting criteria.

    However, be aware of a brief delay due to the SDK's internal caching mechanism:

    • The SDK caches the Automation's status. If the Automation was synchronized (downloaded to the device) less than 30 seconds ago, the message might still be displayed without immediately checking the server for the "stopped" status.

    • After this 30-second cache window expires, the SDK will re-query the server, and the message will stop displaying immediately.

    In summary, while the Automation can be stopped immediately on the server side, it might take up to 30 seconds for the change to take effect on a user's device if the message was recently synced.

    Design your template with the Email Composer

    Introduction

    Batch Email Composer helps you build beautiful and impactful email templates, no code needed.

    Email remains one of the most impactful ways to connect with your users. Whether you're welcoming new customers, promoting an offer, or building long-term loyalty, email is a key touchpoint in the customer journey.

    This guide will walk you through how to make the most of the Email Composer. Let’s get started! 🚀


    Appearance Menu

    Let’s start with the Appearance menu. Why? Because the styles you define here will apply to your entire email 💪

    You only need to configure design elements once — these settings will automatically apply wherever that element is used. No need to restyle buttons, text blocks, or headings every single time.

    This saves time and ensures design consistency across your entire template.

    In the Appearance menu, you will find the following settings:

    General Settings

    In this tab, you define the overall look and feel of your email. You can:

    1. Set the Message width (default is 600px, the most common width across email clients);

    2. Choose the Message alignment (centered, left, or right-aligned within the inbox);

    3. Define default padding for structures you will add later;

    4. Pick a general background color and optional background image

    1. Choose whether to underline links throughout the email;

    2. Activate RTL text direction if you're writing in right-to-left languages (like Arabic or Hebrew for example);

    3. Manage responsive design (enabled by default, so your emails look great on both desktop and mobile).

    Stripes

    A stripe is a horizontal section of your email that contains structures, containers, and content blocks.

    To add a stripe, click the "+" icon at the bottom left of an existing stripe:

    Each stripe can be manually assigned a type: Header, Content, Footer, or Info area. Using different types of stripes can be helpful for structure and styling adjustments:

    You can:

    • Define unique font sizes for each stripe (especially useful for footers, which often use smaller text);

    • Customize text and link colors;

    • Apply a stripe background color to draw attention to specific sections;

    • Add a background image if your brand requires it.

    Some email clients, like Outlook, may not display background images. We recommend setting a solid background color as a fallback that matches your image's tones.

    Headings

    Need to highlight a key message or divide sections? Use Headings.

    Just select your text and apply a heading style from the formatting menu:

    In the Settings panel, you can customize the font, size, style, color, and line spacing of your headings to fit your design:

    Buttons

    Buttons drive action. Whether it's visiting your website, redeeming a promo, or following on social media— they matter.

    You can set global look for all your buttons:

    • Outlook support toggle (enabled by default, to ensure better rendering in Outlook via VML code)

    • Font and button size, style, and color;

    • Highlight hovered buttons (change colors when you hover the mouse over it);

    • Border radius;

    Mobile formatting

    All emails built with Batch are responsive by default. This means they automatically adapt to mobile screens. But for full control over how your content appears on smaller devices, you can customize certain settings specifically for mobile.

    Adjust your email for mobile

    1. Go to the "Appearance" tab in the editor;

    2. Open the "Mobile view" section:

    Here, you’ll be able to:

    • Set custom font sizes for headings H1, H2, and H3;

    • Adjust text size for buttons (we recommend 18px or higher for readability);

    • Apply different font sizes and margins for content;

    • Enable "Full-width buttons" to make your call-to-action buttons span the full width of the mobile screen;

    Back to Desktop view you can disable "Responsive images" for specific elements, if needed.

    Hide elements on mobile or desktop

    If you want to hide some elements on mobile or desktop devices, you don’t need to write a single line of HTML! To hide content from mobile users:

    1. Select the element you want to hide.

    2. Click the "Hide on mobile or desktop" option in the settings panel;

    With this enabled, the selected element won’t appear in the mobile/desktop version of your email — ideal for simplifying layouts or removing non-essential visuals.


    Content Menu

    Now that we've set our general styles in the Appearance menu, editing your template becomes much faster — no need to manually style each element one by one.

    In the Content menu, you will find three main building elements of your email:

    What is a Structure?

    In Batch, the stripe sits at the top of the email layout hierarchy. Each stripe must contain structures, which are automatically added by default.

    To insert an additional structure, just drag and drop it from the Content menu to the desired section of your email:

    Each stripe can hold multiple structures. And each structure can contain up to 8 containers in a row.

    You can move, copy, delete, or save a structure as a module by hovering over it and using the dropdown menu:

    What are Blocks?

    Blocks are the foundation of your email layout—they’re the most granular elements you’ll work with in Batch. In the Content → Blocks menu, you have access to 13 essential blocks such as:

    To use a block, just drag and drop it into your email layout and customize it as needed:

    What are modules?

    Modules are reusable sections — made up of stripes, structures, or containers — that help you speed up email creation:

    You can create your own custom modules and reuse them across templates. Learn .

    Now that you're familiar with the Content section of the Email Composer, it's time to start building your template 🚀

    Adding a logo or image

    Images bring your emails to life — whether it’s your logo for brand recognition or a banner to support your message. In Batch, adding visuals is quick and intuitive. You can upload images directly, link to them via URL, and adjust their appearance to fit seamlessly into your design. You can add images to your email in two simple ways:

    1. Drag and drop / upload from Computer

    • Drag your image directly into your email layout, or

    • Click the arrow icon to browse and upload from your device.

    Supported formats: JPEG, PNG, GIF Max file size: 3 MB Max resolution: 4000 × 4000 px

    2. Paste external image URL

    Don’t have the image locally? Paste a link to the image in the External Link field to pull it directly from the web.

    It is also possible to .

    Adding text

    Text is a core element of any email — whether you're crafting a warm welcome message, highlighting a promotion, or guiding users to take action. In Batch, is simple and flexible. You can easily drag a text block into your layout:

    Then, you can style it to match your brand, and structure your content for maximum impact:

    Adding CTA button

    A CTA (Call to Action) button is one of the most critical elements in your email — it directly impacts your click rate. Without a clear button, your audience can’t take the next step, whether it's making a purchase, signing up, or learning more.

    Here’s how to create one in Batch:

    • Drag and drop the "Button" block into your email layout, ideally next to the content it relates to.

    • Click the button block to activate the Settings panel.

    1. Enter the destination URL your button should link to.

    2. Add your button label (this is the call to action your users will see for example: Shop Now, Get Started).

    3. Customize the text styles: choose your font, size, and colors for both text and background.

    4. Set the

    In the , you can globally enable “Highlight hovered buttons.” The hover color itself is configured in the Content tab when editing a specific button.

    Add a spacer

    While a spacer won’t increase conversions, it plays an essential design role — it helps structure your content, adds breathing room, and improves overall readability.

    Here’s how to add and customize a spacer in Batch:

    • Drop the "Spacer" block inside that structure.

    • Click the spacer to open the settings panel.

    1. Enable dynamic resizing to manually adjust the spacer’s size by dragging;

    2. Choose a background color;

    3. Pick a line style — options include solid, dashed, or dotted;

    A well-placed spacer keeps your email clean, balanced, and easier to scan — small detail, big visual impact.

    Add video

    Want to make your emails more dynamic and engaging? Adding videos to your email is a great way to capture attention and increase interaction. Whether you’re showcasing a product demo, a testimonial, or event highlights, is quick and easy.

    Add social media

    Including social media icons in your emails is a great way to encourage your audience to connect with your brand beyond the inbox.

    Whether it's Facebook, LinkedIn, Instagram, or others, adding these links is simple with Batch. You can easily .

    Social blocks not only complete your email visually — they also help drive traffic to your online communities. Add them strategically, typically in the header or footer, to stay connected with your audience.

    Add banner

    Banners are the first element your reader will see at the opening of your email. They introduce your brand and set the tone of the e-mail, which is why it's so important to make them as impactful as possible.

    Let's see

    Add menu

    The Menu block allows users to navigate to specific pages on your website — or even to sections within the email itself. It is a smart way to guide your readers and encourage click-throughs, make sure it’s clear, concise, and consistent with your branding!

    Here’s how to add and customize a menu block in Batch:

    • Drag the "Menu" block into your email template.

    • Add additional menu items if needed. By default, Batch provides three items to start with.

    • In the Settings panel, choose whether your menu should display:

      • Icons only

      • Links only

      • Icons and links

    If you choose Links, the font and colors you defined in your General settings will automatically apply. You can further customize the font style (e.g., make it bold) directly from the settings panel.

    • Label each menu item and insert the corresponding URL for redirection.

    • Repeat for all menu tabs.

    • To hide menu items on mobile, simply click the “Hide on mobile” icon next to each item.

    Mobile optimization: enable the "Adaptive menu" toggle to ensure menu items stack vertically on mobile devices. This greatly improves readability and usability on smaller screens.

    Add countdown timer

    A countdown timer is a great way to capture attention and inspire action. It adds excitement by clearly showing how much time remains before an offer begins or ends — perfect for creating anticipation and encouraging quick decisions.

    To add a timer:

    • Drag a structure into your template.

    • Drop the "Timer" block into it.

    1. Set the end date and time;

    2. Choose the time zone;

    3. Choose number font, size and color

    4. Add background color

    1. Add a URL to redirect users to a specific page when they click the timer.

    2. Set alt text for the expired timer image for better accessibility.

    3. Align the timer to match your brand’s layout and design.

    4. Adjust the size for optimal display across devices.

    That’s it — your countdown timer is all set to drive engagement!

    Add HTML code

    Sometimes, your email design might require specific features or layouts that go beyond what the visual editor offers. In these cases, you can easily insert your own custom HTML code into your Batch template.

    Here’s how to do it:

    • Inside a structure, drag and drop the “HTML” block.

    • Click “Insert your HTML in the Code editor” to open the code editor window.

    1. Paste your custom HTML code into the editor.

    2. Customize or fine-tune the code as needed.

    This feature gives you the flexibility to embed widgets, dynamic content, or any HTML-based elements that fit your brand’s needs.

    Save a custom module

    If you find yourself reusing the same layout blocks across multiple emails — like headers, footers, product sections, or CTAs—Batch lets you save time by turning them into reusable custom modules.

    Once saved, you can quickly drag and drop these modules into future templates, keeping your emails consistent and efficient to build. Here is

    Add hidden preheader

    Email marketing is a powerful tool for engaging with your audience, but optimizing your campaigns for maximum impact requires attention to detail!

    One crucial element often overlooked is the pre-header, a valuable asset that can significantly improve the open rate of your email campaigns:

    You can directly into the HTML.


    Once your email template is complete, you can preview and test it by returning to the . This allows you to review how the template will appear in recipients' inboxes and make any final adjustments before sending 🚀

    Mobile formatting
    for your entire email;
  • Set the default font used across all text blocks (except headings);

  • Adjust line spacing to make your content more readable or match your brand tone;

  • Enable or disable paragraph bottom spacing;

  • Borders (full or per side, including color);

  • Inner padding;

  • Video
  • Social

  • Banner

  • Menu

  • HTML

  • border-radius
    to round the button corners, if desired.
  • Define an alignment.

  • Define the width of the spacer.
  • Adjust the alignment (centered by default, but you can change it to left or right);

  • Toggle "Responsive spacer" to ensure proper rendering on mobile devices;

  • Set padding to manage the space around the spacer within its container;

  • If needed, add anchor links (they are not supported in some email clients: iOS Gmail app, iOS Apple Mail, Outlook app on Android, Outlook app for macOS and AMP Emails).

  • Adjust the font size if needed for better visibility. For example, set it to “18” for a more prominent look.

  • If using Icons and links, choose the desired alignment and upload your icons.

  • Toggle "Display days" if you want the timer to show days

  • Choose your preferred separator (e.g., “:”, “-”, “/”).

  • Enable "Number labels" to show "days", "hours", etc., under digits.

  • Choose the language of your label

  • Style the labels (font, size, color).

  • Toggle "Expired timer image" to show a fallback image after expiry.

  • Define the timer’s width to suit your layout.

  • Choose whether to make the timer responsive

  • Use Advanced Settings to further customize digit and label colors.

  • Add padding to give the timer breathing room.

  • General settings
    Stripes
    Headings
    Buttons
    Structure
    Blocks
    Modules
    Image
    Text
    Button
    Spacer
    how to save modules on the email composer
    edit images directly into the Email Composer
    adding and customizing text and links
    Appearance tab
    adding videos in your Batch email template
    embed social media links using our Email Composer
    how to create an email banner?
    how to save modules on the email composer?
    add the pre-header
    email message editor
    Templates

    In-App & Mobile Landing

    In-App messages are messages displayed inside your app. You can trigger them when users open your app or as contextual reminders when they perform a specific action (e.g. tapping a button, browsing a page, etc). This is great to communicate with all your users, even with users who have turned off push notifications.

    You can also trigger an In-App message after your users open a push notification. That's what we call a Mobile Landing.

    The process for creating content for both Mobile Landing and In-App messages is similar. Unless specified otherwise, the information in this section applies to both features. Mobile Landing specificities are covered within the Push section.

    SDK Version Requirements: Using the In-App feature requires SDK version 3.1 or higher. The Mobile Landing feature is compatible with SDK version 3.0 or higher.

    Messages can be targeted to either both iOS and Android platforms or filtered for a single specific platform.

    These messages are designed using a drag & drop composer.

    Formats

    Available In-App message formats include:

    • Modal: A pop-up displayed over a portion of the screen. Modals can be positioned at the center, top, or bottom of the screen.

      • Center Modals: These appear in the middle of the screen and include a translucent backdrop that prevents interaction with the app content behind them.

      • Top/Bottom Modals: They were previously referred to as "banners" in the MEP. They are displayed at the top or bottom edge of the screen and do not have a backdrop, allowing users to continue interacting with the app content behind them. These modals can be "attached" directly to the screen edge by setting their margins to zero.

    Various visual customization options are available for these formats:

    Customization
    Description
    Value Type
    Applies to Format(s)

    Close options

    To allow users to dismiss the In-App message, several close options are available. Unless a button action within your message is specifically configured to dismiss the In-App, you must enable at least one of these options:

    • Close Icon: Displays a ‘X’ dismissible icon in the top right corner of the message. You can customize the color and background color of this icon separately.

    • Auto-Dismiss: The message automatically disappears after a specified duration. A visual gauge is displayed to show the remaining time. The auto-dismiss duration is customizable (in seconds).

    • Platform-specific dismissal methods (like swipe gestures on iOS or the back button on Android) are always possible.

    Color picking

    When configuring color options within the composer, click the color swatch (the colored square) next to a setting to open the color picker interface. This tool allows you to visually select a color, refine it using a spectrum slider, and quickly choose from a list of recently used colors. The chosen color's code (e.g., in Hex format) is displayed and can also be directly entered or copied and pasted.

    Blocks description

    Using our drag & drop composer, your In-App messages are composed of various blocks.

    Text

    The Text block allows you to include textual content within your message. It supports personalization to dynamically insert profile or trigger event specific information. See for more details.

    The following visual customization options are available for the Text block:

    Customization
    Description
    Value type

    Button

    The Button block allows you to include interactive buttons in your message layout.

    Each button should contain text. The customization options for this text (e.g., font size, color, decoration) are inherited from the Text block and applied directly to the button's label.

    Buttons must also have an action associated with them, defining what happens when the user interacts with the button. By default the Dismiss action is selected.

    Available built-in actions

    Configurable built-in actions that buttons can trigger include:

    • Dismiss Closes the In-App message.

    • Deeplink Closes the In-App message and opens the specified deeplink or web page.

    • Copy to clipboard Copies the provided text to the device's clipboard. The In-App message will be dismissed. Optionally, a deeplink or web page can also be specified to open after copying.

    • Smart Push re-optin Displays the system push notification authorization prompt to eligible users. If the user has already been asked for push notifications opt-in, it opens the system notification settings instead. If the user is already opt-in, the message will disappear after clicking the button but no further action will be triggered.

    In addition to these built-in options, you can also configure custom actions that are registered within your application. See corresponding documentation for and .

    The following visual customization options are available for the Button container itself:

    Customization
    Description
    Value type

    Image

    The Image block allows you to display images within your message layout.

    Images can be provided by uploading an image file directly or by referencing an image URL. Supported image formats are PNG and JPEG. Uploaded image files must not exceed 4MB in size.

    Images can optionally have an action associated with them, similar to buttons. Clicking the image will trigger this action. The available built-in actions are detailed in .

    The following visual customization options are available for the Image block:

    Customization
    Description
    Value type

    Height setting

    The Height of the image block can be set to auto , fill space or a custom pixel value. When set to auto, the height is automatically determined based on the image's intrinsic aspect ratio and the available width of the block's container, ensuring the image is displayed without distortion using its natural proportions. The custom option allows you to specify a fixed height in pixels.

    The fill space option is available exclusively for Fullscreen in-app experiences. When you choose this, the image expands vertically to occupy all available space within the in-app, dynamically adjusting to the device's screen dimensions. If you have multiple images set to 'Fill space', they will each evenly share the remaining vertical space.

    We recommend checking how your images display across various screen sizes when using this setting. This ensures optimal presentation, as images may not appear if the available screen space is insufficient.

    Accessibility description

    You can provide an accessibility description (alt text) for an image. This description should only be filled in if the image conveys information essential for understanding the content of the In-App message. This text is used by screen readers and other assistive technologies.

    Image selection guidelines

    Choosing the right images is key for effective In-App messages on all devices. The wide variety of screens means a perfectly identical display everywhere is impossible. Follow these tips to optimize your images. File specifications

    • Formats: Use standard web formats: PNG, JPG.

    • Size: Ensure images are lightweight for quick display. In-App messages should not exceed 4MB.

    • Minimum Dimensions: Aim for a minimum width of 640px to ensure good resolution.

    Display modes (sizing)

    You can control the height of the Image block using the Height setting. The Sizing setting (Fill/Fit) then controls how your image adapts to this block size. This setting is only applicable when the Height is set to a custom pixel value (not auto).

    • Fill: The image scales proportionally to fill the entire block. This may crop parts of the image if aspects ratios don't match. We recommend a square file, with a width of 1200px.

    • Fit: The image scales proportionally to be entirely visible within the block. Nothing is cut off. This may leave empty space on the sides if aspect ratios don't match.

    Design recommendations

    • Put key info in Text/Button Blocks: Don't put crucial messages only in the image. Text and buttons managed outside the image adapt better to various screens.

    • Image composition: Avoid placing text or important elements near image edges to prevent cropping in "Fill" mode. Center the most important element in your image.

    • Dimensions and aspect ratio: There's no single ideal size. Landscape format images (e.g., 2:1 or 3:1 ratios) work well for Fullscreen and Modal themes. Portrait formats suit designs where the image is the main focus.

    Crucial step: Test on devices

    The most important step is to test your message and images on real devices thanks to the Send test option. This verifies the final display on different screens before sending your campaign.

    Divider

    The Divider block allows you to insert a horizontal rule to visually separate content elements within your message layout.

    The following visual customization options are available for the Divider block:

    Customization
    Description
    Value type

    Spacer

    Note: The Spacer functionality is available starting with SDK version 3.1

    The Spacer block allows you to introduce customizable vertical space between content elements in your message layout. The available customization option for the Spacer block ensures flexible design implementation to meet your specific layout requirements.

    Customization
    Description
    Value type

    Height setting

    Configures the vertical space of the spacer block. For modal and fullscreen layouts, you can set a custom number of pixels.

    For fullscreen layouts, the "Fill space" option also allows the spacer to occupy all remaining vertical space, distributed evenly if multiple spacers are present.

    Columns

    The Columns block acts as an invisible container that allows you to arrange other blocks horizontally in multiple columns, supporting up to 5 columns.

    You can place any Text, Button or Image blocks inside a Columns block.

    The following settings are available for configuring a Columns block:

    Setting
    Description
    Value type

    Additional options

    Dark mode

    You can configure a dark mode version for each In-App template to match user device settings. With dark mode enabled, you can specify separate color values for light and dark themes. Each mode can be previewed directly within the In-App composer.

    Note that when using the “Send test option”, the In-App message will render according to the test device's dark mode setting, not the mode selected in the composer preview.

    Advanced settings

    Priority

    You can select a priority level between Standard, Important and Critical. Priority works on automations with identical trigger event, and identical label if one is specified. When two or more automations should be displayed at the same time, the system selects the automation with the highest priority: this is the one that will be displayed after the trigger event occurred.

    If multiple automations have the same priority level, we rely on our automatic priority system to automatically define priority based on multiple criteria.

    Default priority value is standard.

    Here are a couple of examples of usage of priorities:

    • Standard-level priority could be selected for your long-term use cases: onboarding, app review, etc.

    • Important level priority could be selected for temporary campaigns: conversion or subscription campaigns, account creation, reopt-in campaign, etc.

    • Critical level priority could be selected for emergency campaigns: downtime or out-of-service messages, asking your user to update the app, etc

    Tracking ID

    This setting is only usefull for apps with an event dispatcher solution setup.

    The tracking ID provides an additional tracking dimension at the Orchestration-level in your analytics solution.

    Payload

    An optional JSON string that can contain additional parameters that your application can handle when receiving In-app messages if configured to do so. The root of the JSON must be an Object and cannot have the reserved key com.batch.

    This feature is often used by your technical teams to add data to your in-app messages and retrieve it via SDK APIs.

    Custom fonts

    By default, Batch uses the system font set on the user's device.

    To use a custom font for your brand, it requires implementation in your application's native code.

    For bold or italic text styles to display correctly, the corresponding bold and italic font files must be provided and implemented alongside the regular font.

    Refer to the documentation for and for custom font platform-specific implementation details.

    Preview and device testing

    The In-App composer preview is a useful tool for designing your message, but final appearance and behavior can vary across devices and operating systems. Always test your In-App message on actual devices using the "Send test option" to ensure it looks and works as intended.

    Templates

    Templates are reusable blueprints for your In-App message layouts. Saving your In-App structure and styling as a template allows you to quickly create new messages with a consistent look and feel without starting over each time. Saving a message as a template is optional; In-App messages function independently of whether they were saved as templates.

    Modifications made to a template do not affect existing In-App messages or live campaigns that were created using that template, and vice versa. You can update the structure and styling of an existing In-App message and choose to save these changes by overwriting the original template or by creating a new template.

    As a starting point, a selection of pre-built Batch templates is available to showcase various In-App message possibilities. These specific templates are read-only and cannot be modified or overwritten.

    A template defines the structure and styling of an In-App message. This includes:

    • The type and position of each block (e.g., Image block, Text block, Button block, Columns block, Divider block).

    • The visual customization settings applied to each block (e.g., margins, colors, sizes, corner radius).

    Importantly, templates do not include the content or specific behavioral configurations. This means the following are not saved in a template:

    • The actual text written in a text block.

    • The image file uploaded or the image URL used in an Image block.

    • The specific action configured for a button or Image block, including the action type (e.g., deeplink, rating, smart re-optin) and any associated parameters (e.g., the target URL for a deeplink, the text for copy to clipboard).

    Importantly, when multi-language support is enabled, the template structure and styling are common across all languages while the content is managed separately for each language.

    The vertical size of all modals automatically adjusts to fit their content.
  • Fullscreen: A message that occupies the entire screen, overlaying the app content.

  • Margin

    Defines the spacing between the edges of the device screen and the In-App message content. Can be configured independently for top, bottom, left, and right sides.

    Pixels

    Modal only

    Radius

    Controls the roundness of the corners for the message container.

    Pixels

    Modal only

    Border

    Sets the thickness of the border around the message container. (Optional)

    Pixels

    Modal only

    Border Color

    Sets the color of the border around the message container, including opacity. (Optional)

    Color

    Modal only

    Font decoration

    Applies visual styles to the text. Multiple decorations (Bold, Italic, Underline, Strikethrough) can be selected simultaneously.

    bold/italic/underline/strikethrough

  • Rating

    • iOS: Displays the app rating dialog. Note that the system limits this dialog to a maximum of three displays within a 365-day period. Your automation triggering this action should be rate-limited accordingly (e.g., maximum three times per year per user).

    • Android: Displays the Google In-App Review feature. Your automation triggering this action should also be rate-limited. The play-core library is required in your application to display the Google In-App review feature. See .

  • Redirect to settings Opens the notification settings for the current application, where notification permissions can be managed.

  • Button color

    Sets the background color of the button, including opacity.

    Color

    Radius

    Controls the roundness of the button's corners.

    Pixels

    Border

    Sets the thickness of the border around the button. (Optional)

    Pixels

    Border Color

    Sets the color of the border around the button, including opacity. (Optional)

    Color

    Color

    Sets the color of the divider line, including opacity.

    Color

    Content alignment

    Controls the vertical alignment of blocks placed inside each column.

    top, middle, bottom

    Modal Position

    Controls the vertical alignment of the modal pop-up on the screen.

    top, middle, bottom

    Modal only

    Fullscreen Content Position

    Determines the vertical alignment of the message content block within the fullscreen container if the content does not fill the entire screen.

    top, middle, bottom

    Fullscreen only

    Background Color

    Sets the background color of the message container, including opacity.

    Color

    Margin

    Configures the spacing around the text block, independently for top, bottom, left, and right sides.

    Pixels

    Text alignment

    Controls the horizontal alignment of the text within the block.

    left/center/right

    Color

    Sets the color of the text.

    Color

    Font size

    Sets the size of the text using predefined scale options.

    Margin

    Configures the spacing around the button block, independently for top, bottom, left, and right sides.

    Pixels

    Padding

    Configures the internal spacing between the button's text content and its border/edges.

    Pixels

    Width

    Sets the width of the button relative to its container.

    Percentage

    Button alignment

    Controls the horizontal alignment of the button block within its parent container.

    Margin

    Configures the spacing around the image block, independently for top, bottom, left, and right sides.

    Pixels

    Height

    Sets the height of the image block. Explained below.

    either auto, fill space or with a custom number of pixel

    Sizing

    Controls how the image scales to fit within the block dimensions. Explained below.

    fill or fit

    Radius

    Controls the roundness of the image block's corners.

    Margin

    Configures the spacing around the divider block, independently for top, bottom, left, and right sides.

    Pixels

    Width

    Sets the width of the divider line relative to its container.

    Percentage

    Alignment

    Controls the horizontal alignment of the divider line within its container.

    left, center, right

    Thickness

    Sets the visual thickness of the divider line using predefined scale options.

    Height

    Sets the height of the spacer block. Explained below.

    Pixels / Fill space

    Number of columns

    Sets the number of vertical divisions within the block.

    2 to 5

    Sizing

    Defines how the available horizontal space is distributed among the columns. Can be set to auto (equal distribution) or custom percentages (a list of percentages for each column, which must total 100%).

    auto / custom sizing (in percentages)

    Spacing

    Sets the horizontal space between individual columns.

    Pixels

    Padding

    Configures the internal spacing between the content and the column edges.

    Personalization
    Android
    iOS
    Android
    iOS
    Modal
    Banner
    Fullscreen
    Fill display mode: left and right sides of the image are cropped
    Fit display mode: image is fully visible, there are some empty spaces at the top and bottom of the image
    Available built-in actions

    Modal, Fullscreen

    XS/S/M/L/XL

    left, center, right

    Pixels

    XS/S/M/L/XL

    Pixels

    Advanced

    The following documentation goes into more details on how to use the personalization and templating engine.

    You will learn about builtin filters, how to control whitespace if you include if/else statements, what kind of comparison you can use and more.

    Filters

    Sidenote - filters with arguments

    You may have noticed some filters take arguments. When this is the case, there is two way to give the arguments:

    • Using a named argument as such: join(separator=',')

    • Directly giving the value as such: join(',')

    In the following reference we will denote arguments that can be given unnamed as such: argName?: type where the ? indicates the argument is optional.

    General filters

    formatDate

    Input type date

    Arguments

    • pattern: string or (dateStyle: string, timeStyle: string)

    Optional arguments

    Filters for numbers

    abs

    Input type number or duration

    Return type int

    Description Returns the absolute value of a number, duration, or distance.

    Example Ex: {{ -13|abs }} will result in 13

    round

    Input type number or duration or distance

    Return type int

    Description Returns the closest int of a number, duration, or distance, rounding up.

    Examples Ex: {{ 46.8|round }} will result in 47 Ex: {{ 46.3|round }} will result in 46

    ceil

    Input type number or duration or distance

    Return type int

    Description Returns the closest int that is greater than the number, duration, or distance.

    Example Ex: {{ 46.2|ceil }} will result in 47

    floor

    Input type number or duration or distance

    Return type int

    Description Returns the closest int that is lower than the number, duration, or distance.

    Example Ex: {{ 46.8|floor }} will result in 46

    formatNumber

    Input type number

    Arguments none

    Optional arguments

    • decimals: number

    formatCurrency

    Input type number

    Arguments none

    Optional arguments

    • decimals: number

    Filters for strings only

    lower

    Input type string

    Return type string

    Description Converts a string to lowercase.

    Example Ex: {{ VINCENT|lower }} will result in vincent

    upper

    Input type string

    Return type string

    Description Converts a string to uppercase.

    Example Ex: {{ vincent|upper }} will result in VINCENT

    capitalize

    Input type string

    Return type string

    Description Converts the first letter to uppercase and all other letters to lowercase.

    Example Ex: {{ "john Smith"|capitalize }} will result in John smith

    title

    Input type string

    Return type string

    Description Converts the first letter of each word to uppercase and all other letters to lowercase.

    Example Ex: {{ "johN smith"|title }} will result in John Smith

    append

    Input type string

    Arguments

    • text?: string

    Return type string

    Description Appends the text to the value.

    prepend

    Input type string

    Arguments

    • text?: string

    Return type string

    Description Prepends the text to the value.

    Filters for tag collections only

    join

    Input type tag collection

    Arguments

    • separator?: string

    Return type string

    Description Returns a string which is the concatenation of all tag values separated by the provided separator.

    first

    Input type tag collection

    Return type string

    Description Returns the first tag value.

    Example Ex: {{ c.interests|first }} will result in sports (for someone with ["sports", "politics", "music"] in their c.interests tag collection)

    last

    Input type tag collection

    Return type string

    Description Returns the last tag value.

    Example Ex: {{ c.interests|last }} will result in music (for someone with ["sports", "politics", "music"] in their c.interests tag collection)

    contains

    Input type tag collection

    Arguments

    • element?: string

    Return type boolean

    Description Returns true

    Chaining filters

    It is possible to chain filters to produce more complex results, however you need to make sure the input and output types are compatible between filters.

    For example, you can't call formatDate on a number or even a string, the type has to be a date. Look at the table above to know what filters are compatible.

    Here is a valid example of chaining multiple filters:

    Given a user with this tag collection t.exams: ["2017-10-09T14:53:54Z", "2017-10-11T16:53:54Z"] the example evalutes to:

    As you can see we take the last value of the tag collection which returns a string, then pass that to date which parses it and returns a date type. Finally we pass that to formatDate.

    Expression

    An expression is something that returns any kind of value. It can a math operation, a comparison, a function call, a reference to an attribute or tag or even a literal value.

    Examples:

    Expression are used in:

    • if/else if conditions

    • variable assignment

    • expression output {{ ... }}

    Comparison

    Type comparison rules

    When comparing two values, they have to be of the same type otherwise it won't work.

    The rules are as follows:

    • A string can only be compared with another string

    • A date can only be compared with another date

    • A duration can be compared with another duration

    Operators

    • == compares two values for equality

    • != compares two values for inequality

    • > returns true if the left hand side is greater than the right hand side

    Combining comparisons

    As in any programming languages, you can combine comparisons easily:

    • and returns true if both the left hand side and the right and side are true

    • or returns true if either the left hand side is true or the right hand side is true

    • not negates a statement

    Data types

    Standard

    Standard types include:

    • string. You can write a literal string by using a ' character like this: 'This is a string'. To use a ' inside your string you need to double it like this: 'It''s great'

    • integer. You can write a literal integer like this: 230.

    Date

    Date is a special type that can't be created by a literal. However they are produced in a couple of cases:

    • if an attribute is a date (that is either a NSDate or a java.util.Date for iOS and Android respectively).

    • by converting a UNIX timestamp (number of seconds since January 1, 1970): {{ 1491814800|date|formatDate('yyyy-MM') }}

    • by using the keyword now which returns the date at the time of execution

    Duration

    Duration is a special integer with a time unit. Units can be:

    • days: 40d

    • hours: 24h

    • minutes: 30m

    Distance

    Distance is a special integer with a distance unit. It is also always positive. Units can be:

    • meters: 5600m

    • kilometers: 83km

    Casting rules

    You can cast values into different types by using a casting operation, provided the types are compatible. The casting operation looks like this:

    Casting looks exactly like a filter but it simply converts the original value to the type if the rules allow it.

    The rules of casting are as follows:

    from / to
    string
    int
    float
    bool
    date
    distance
    duration

    1 The string has to follow the pattern yyyy-MM-dd'T'HH:mm:ss or the resulting date will be empty.

    2 Casting from date to int will return the UNIX timestamp in seconds. Casting from int to date will treat the integer as a UNIX timestamp in seconds.

    3

    Rules:

    • casting from string to distance will treat the string as an integer representing the distance in meters.

    • casting from int to distance will treat the integer as the distance in meters.

    • casting from float

    You can pass a conversion distance unit as a parameter to the distance filter.

    Valid distance units are detailed above.

    Examples:

    • {{ '100'|distance }} will result into the distance 100m

    • {{ '12km'|distance('m') }} will result into the distance 12000m

    • {{ 2000|distance('km') }} will result into the distance 2000km

    4

    Rules:

    • casting from string to duration will treat the string as an integer representing the duration in days.

    • casting from int to duration will treat the integer as the duration in days.

    • casting from float

    You can pass a conversion duration unit as a parameter to the duration filter.

    Valid duration units are detailed above.

    Examples:

    • {{ '100'|duration }} will result into the duration 100d

    • {{ '100h'|duration }} will result into the duration 100h

    • {{ '48h'|duration('d') }} will result into the duration 2d

    Math rules

    Math operations on integers and floats work as you would expect:

    Will evaluate to:

    There are a couple of rules for operations on dates, durations and distances:

    • adding or subtracting a duration from a date will return a new date.

    • subtracting two dates will return a duration.

    • all operations between a duration

    Some unusual operators are available for your convenience:

    • // divides two numbers and returns the truncated integer result. Example: {{ 20 // 7 }} evaluates to 2.

    • % returns the remainder of the integer division of two numbers. Example: {{ 11 % 7 }} evaluates to 4.

    Whitespace control

    Up until now we haven't really talked about controlling how whitespaces are included - or not - in the message after the template has been rendered.

    By whitespace we mean new line characters and leading spaces before either an expression or a statement.

    Having control on this behaviour is important so that you can better structure your template and not have to write them all on the same line to avoid having newlines in your output.

    Default rules

    The default rules are as follows:

    • Expressions ({{ ... }}) strips the leading whitespaces if the output of the expression is empty

    Example:

    With a c.first_name attribute defined, this evaluates to:

    Note the space after Hello is kept.

    With no c.first_name attribute defined, it evaluates to:

    Note that there is only one space: the space after Hello has been removed

    • Statements ({% ... %}) always strips the trailing newlines

    Example:

    !

    This evaluates to:

    Depending on the current time it will change to afternoon or evening.

    Forced behaviour

    If the default behaviour doesn't suit you, you can force the behaviour with the following syntax:

    • {{+ +}} or {%+ +%} will force every whitespace to be kept

    • {{- -}} or <div data-gb-custom-block data-tag="-"></div> will force every whitespace to be stripped

    You can mix and match of course: {{+ ... -}} is completely valid.

    Example:

    Now that we forcefully remove the leading whitespace, with a c.first_name defined it evaluates to:

    Another example:

    Here we forcefully keep the leading whitespace, with no c.first_name defined it evaluates to:

    Note the space is kept.

    Custom Audience Data

    The Custom Audience API (v1.1) supports attaching attributes and tags to installation IDs.

    When a campaign targets such an audience, they can be used in your message by using the {{ customAudienceAttribute(<audience name>, <attribute name>) }} expression.

    Example

    Take the following Custom Audience API call, ran on the SAMPLE-LEVELUP audience:

    The following message:

    will result in:

    Audience Data

    The Audience API supports attaching attributes and tags to profiles.

    When a campaign or automation targets such an audience, they can be used in your message by using the {{ audienceAttribute(<audience name>, <attribute name>) }} expression.

    Example

    Take the following Audience API Update call:

    The following message:

    will result in:

    var onTitleClick = function(event) { var methodName = event.target.dataset.method; document.querySelector(".method-details[data-method='" + methodName + "']") .classList.toggle("method-shown"); } var titles = [].slice.call(document.getElementsByClassName("method-title")); for (var i = 0; i < titles.length; i++) { titles[i].onclick = onTitleClick; }

  • timezone: string, locale: string

  • Return type string

    Description Formats a date using either the pattern provided or the combined dateStyle/timeStyle. Ex: {{ installation_date|formatDate(pattern: 'yyyy-MM-dd') }} will result in 2025-01-01

    Ex: {{ installation_date|formatDate(dateStyle: 'LONG', timeStyle: 'SHORT') }} will result in Wednesday, January 1, 2025 12:00 AM

    The timezone argument allows you to format the date into a specific timezone. Ex: {{ installation_date|formatDate(dateStyle: 'SHORT', timeStyle: 'LONG', timezone: 'Europe/Paris') }} will result in 1/1/25 9:00:00 AM CET

    The locale argument allows you to format the date using a specific locale. A locale controls region-specific behavior when formatting a date. For example, with the US locale, the time will be suffixed with AM or PM, but not with the UK locale. Ex: {{ installation_date|formatDate(dateStyle: 'SHORT', timeStyle: 'LONG', locale: 'UK') }} will result in 01/01/25 09:00:00 CET

    locale: string

    Return type string

    Description Formats a number.

    For a weight float attribute of value 26.5 and a user using a US locale: Ex: {{ weight|formatNumber }} will result in 26.5

    The decimals argument allows you to control how many decimals should be printed: Ex: {{ weight|formatNumber(decimals: 2) }} will result in 26.50

    The locale argument allows you to format the number using a specific locale. A locale controls region-specific behavior when formatting numbers, such as setting the appropriate decimal separator. By default, the user's locale will be used. Ex: {{ weight|formatNumber(locale: 'fr', decimals: 2) }} will result in 26,50

    locale: string

  • symbol: string

  • Return type string

    Description Formats a number as currency.

    For a price float attribute of value 2406.5 and a user using a US locale: Ex: {{ price|formatCurrency }} will result in ¤ 2,406.50

    The symbol argument controls the currency symbol: Ex: {{ price|formatCurrency(symbol: '$') }} will result in $ 2,406.50

    The decimals argument allows you to control how many decimals should be printed: Ex: {{ price|formatCurrency(symbol: '$', decimals: 3) }} will result in $ 2,406.500

    The locale argument allows you to format the number using a specific locale. A locale controls region-specific behavior when formatting numbers, such as setting the appropriate decimal separator.

    Note: The locale has no impact on the currency symbol. By default, the user's locale will be used.

    Ex: {{ price|formatCurrency(symbol: '$', locale: 'fr') }} will result in 2 406,50 $ Ex: {{ price|formatCurrency(symbol: '€', locale: 'fr') }} will result in 2 406,50 €

    Example
    Ex:
    {{ john|append(' smith') }}
    will result in
    john smith
    Example
    Ex:
    {{ john|prepend('smith ') }}
    will result in
    smith john
    Example Ex: {{ c.interests|join(' ') }} will result in sports politics music (for someone with ["sports", "politics", "music"] in their c.interests tag collection)
    if the tag collection contains the given argument.

    Example Ex: {{ c.interests|contains('politics') }} will result in true (for someone with ["sports", "politics", "music"] in their c.interests tag collection)

    or a
    number
    . When comparing with a
    number
    it is treated as days; in other words
    {{ $myDuration == 3 }}
    is equivalent to
    {{ $myDuration == 3d }}
    .
  • A distance can be compared with another distance or a number. When comparing with a number it is treated as meters; in other words {{ $myDistance == 200 }} is equivalent to {{ $myDistance == 200m }}

  • A number can be compared with another number or a boolean.

  • >= returns true if the left hand side is greater than or equal to the right hand side
  • < returns true if the left hand side is lower than the right hand side

  • <= returns true if the left hand side is lower than or equal to the right hand side

  • ( and ) to group expressions.
    float. You can write a literal float like this: 20.30
  • boolean. A boolean is either true or false

  • seconds: 46s

    int

    ✓

    ✓

    ✓

    ✓2

    ✓

    ✓

    float

    ✓

    ✓

    ✓

    X

    ✓

    ✓

    bool

    ✓

    ✓

    ✓

    X

    X

    X

    date

    ✓

    ✓2

    X

    X

    X

    X

    distance

    ✓3

    ✓

    ✓

    ✓

    X

    X

    duration

    ✓4

    ✓

    ✓

    ✓

    X

    X

    to
    distance
    will remove the decimal part and treat it as an integer representing the distance in meters.
  • casting from boolean to distance will treat false as 0 and true as 1.

  • {{ 43.20440|distance }} will result into the distance 43m

  • {{ true|distance('km') }} will result into the distance 1km (not that you'd ever do that)

  • to
    duration
    will remove the decimal part and treat it as an integer representing the duration in days.
  • casting from boolean to duration will treat false as 0 and true as 1.

  • {{ 405|duration() }} will result into the duration 405d

  • {{ 43.409|duration('m') }} will result into the duration 43m

  • {{ true|duration('s') }} will result into the duration 1s

  • and a
    number
    are allowed and will return a
    duration
    in the original unit.
  • all operations between a distance and a number are allowed and will return a distance in the original unit.

  • ** raises the left hand side to the power of the right hand size. Example: {{ 2 ** 3 }} evaluates to 8.

    string

    ✓

    ✓

    ✓

    ✓1

    ✓

    ✓

    Your next exam is on {{ t.exams|last|date|formatDate('yyyy-MM-dd') }}
    Your next exam is on 2017-10-11
    <div data-gb-custom-block data-tag="set"></div>
    
    {{ c.my_string_attribute|float|int }}
    {{ (10 + 2) / 2 - (5 * 20) }}
    -94
    Hello {{ c.first_name }}!
    Hello Vincent!
    Hello!
    <div data-gb-custom-block data-tag="set" data-0='hh' data-1='hh' data-2='hh' data-3='hh' data-4='hh' data-5='hh'></div>
    
    Good 
    Good morning!
    Hello {{- c.first_name }}!
    HelloVincent!
    Hello {{+ c.first_name }}!
    Hello !
    {
      "ids": [
        {
          "action": "add",
          "id": "INSTALL-ID-1",
          "attributes": {
            "account_level": 20
          }
        }
      ]
    }
    Congratulations, you have reached level {{ customAudienceAttribute('SAMPLE-LEVELUP', 'account_level') }}!
    Congratulations, you have reached level 20!
    {
      "name": "EXAMPLE",
      "ids": [
        {
          "action": "add",
          "id": "CUSTOM-ID-1",
          "attributes": {
            "account_level": 20
          }
        }
      ]
    }
    Congratulations, you have reached level {{ audienceAttribute('EXAMPLE', 'account_level') }}!
    Congratulations, you have reached level 20!

    App Settings

    Batch provides a simple interface where you can access all your app/website parameters and use other advanced tools. Click the "Settings" button in the top right corner of the dashboard to:

    • General App Settings: Access all the information related to your app/website information (e.g. app name, website URL, API keys, etc).

    • Push Settings: Edit all your push-related settings (e.g. iOS push certificate, FCM settings, delivery speed limit, etc).

    • : See who can access your app in your team or grant app access to new teammates.

    • : See the list of custom data sent to Batch from the SDK or your servers, using the Custom Data API, and disable specific attributes/events.

    • : Create, edit or delete custom audiences.

    • : Create, edit or delete themes you can use in your In-App campaigns.

    • : Access the debug tool to see the data attached to specific IDs, test your integration, review the IDs targeted with the Transactional API or see if an install is in a user journey.

    • : Request data removal or data access for a specific ID.

    • : Create, edit or delete a label you can attach to a push or an In-App campaign.

    • : Limit the number of notifications an install can receive in a customisable time frame by creating or editing rules.

    Some options may be locked depending on your plan or on your access rights.

    General App Settings

    App/website Information

    That section of the settings contains basic information on your app or website.

    App/website Name

    Required - Name of your app or website. Batch will prefill that field based on the information gathered from the App Store, the Play Store or the metadata of your website.

    If you didn't provide your App Store/Play Store app ID when you created your app, it will be the name you chose. Batch only uses the app/website name in the app list and in in the push preview of the campaign editor. Feel free to modify it you need to organize your app list (e.g. "[DEV] My App", etc).

    Batch won't use that name in the push notifications. On iOS and Android, the app name displayed in your push is set in your project.

    URL

    Required, Web only - The URL of your website. Batch uses that URL to get the name and the icon of your website. Batch also uses your website URL to generate the SDK Auth key.

    SDK

    Required, iOS/Android only - Platform or framework used to develop your app. You can choose between iOS/Android (Native), Cordova, React Native, Unity or Adobe Air. Modifying that parameter will adjust the integration steps you can access by clicking the "Integrate" button, in the top right corner:

    App/website Icon

    Your app or website icon. The icon is only used in the app list and in in the push preview. Batch gathers your website icon from your site metadata. On iOS and Android, Batch uses the app store URL you provided to gather the app icon from the store.

    If you want to update your app icon, click the "Fetch icon from your application store/website" button and make sure you save the changes by clicking the "Update App" button.

    This is not the icon used in your push notification. On iOS, the app icon is set in your project. On Android and for web push notifications, you will need to set it manually when integrating Batch.

    Delete App

    Only users with the "Administrate" right can delete apps/websites. Batch will automatically disable all the running push/In-App campaigns. If you are using Batch APIs, any attempts to target the API key of the deleted app will be rejected.

    API Keys

    Here you can see the list of all the IDs needed to integrate the SDK, implement the Inbox feature use Batch APIs.

    SDK API Keys

    Batch generates an SDK API key for every app and website added to your company. The SDK API key identifies your website or your app on a specific platform. For example, you will notice your iOS app, your Android app and your website don't have the same SDK API key.

    The SDK API key has two purposes:

    • Integration: The SDK API key authenticates the requests sent to Batch servers and allows Batch to attach the data to the right app or website.

    • APIs: The SDK API key is the unique reference to your website or your app on a specific platform when you call Batch REST APIs.

    Websites only have one SDK API key. You can set the "dev" parameter to true in the JavaScript tag to switch to the development environment.

    iOS and Android apps have two different SDK API Keys:

    • Dev API key: Starts with "DEV". Use it for development or testing purposes. This API key won't trigger stats computation. Please take care not to ship an app to the store with that API key.

    • Live API key: Should be used in a production environment only and in the final version of your app on the store.

    Restricted to users with App or Administrate rights.

    Fixing API Key Issues

    If your KPIs decrease abruptly after an app update, then you may have released a version of your app using the Dev API key instead of the Live API key. You can check the API attached to your install in the .

    Users updating from a version including the Live API key will have their push token registered on both the live and development environment. As a consequence, they will receive push notifications twice.

    Take the following steps as soon as possible to fix the issue:

    1. Invalidate the Dev API key: Send an email at support@batch.com describing your issue. Our team will invalidate the DEV API Key after receiving validation from a user with the "Administrate" right.

    2. Release a new update: Make sure the new version includes the correct Live API Key.

    Managing Environments Separately

    If you need to manage sandbox and production environments separately, you can create separate apps on the dashboard and rename them accordingly (e.g. [DEV] MyApp, [PROD] MyApp, etc).

    This is a good option to reduce the risk of using the Dev API key in production or sending a test push in production. This will also allow developers to use a Live API key in their development builds, simplifying their tests.

    REST API Key

    The REST API key authenticates the calls made to Batch APIs targeting your apps/websites API keys.

    The REST API key is sensitive information as it allows you to send push notifications, display In-App messages, send data, and more from Batch APIs. Do not expose it to your users and avoid sharing it in your company. Batch only generates one valid REST API key per company.

    If you suspect your REST API key is compromised, send an email to support@batch.com describing the issue. Our team will invalidate the REST API key and generate a new one after receiving validation from a user with the "administrate" right.

    Restricted to users with Administrate rights.

    Inbox secret

    The Inbox secret key is the authentication key required to use the feature in your app.

    Restricted to users with App or Administrate rights.

    Push Settings

    You will find here all the settings related to push notifications, from uploading your iOS certificate, editing your FCM IDs to editing the push delivery speed.

    Restricted to users with App or Administrate rights.

    Basic Push Setup

    Apple Push Notification Service (APNS)

    On iOS, Batch servers need to have a valid certificate to communicate with Apple Push Notification Services (APNS). There are two types of files you can use:

    • p8 files (recommended): Valid for all the apps added to your Apple developer account. You will need to specify the Application Identifier (App ID) or the Bundle ID of your app on Batch's dashboard.

    • p12 certificates: Generated for a unique App ID and are only valid for one year.

    If you are using a p8 file, here are the fields you will need to fill in:

    • App ID / Bundle ID / Topic: We recommend you use the bundle ID you will find in Xcode. You can also use the app ID available from the .

    • Team ID: The team ID is also available from the .

    Make sure you send a test push to your device using the after editing any of these fields. This will avoid errors the next time you send a push campaign (e.g. revoked p8 file or "device not for topic" issues, due to a wrong bundle id).

    If the development version of your app uses a different bundle ID than your production app, you will need to create two separate apps on the dashboard.

    Firebase Cloud Messaging (FCM)

    Basic Setup

    On Android, Batch needs a Service Account Key issued from your Firebase project to send notifications. Service Account Keys can be generated from the .

    Once you are logged in, select your project then click the ⚙ next to your project name and "Project settings". Click on the "Service Accounts" tab, and then on the blue "Generate new private key" button to create and download a key.

    Using Several FCM Service Account Keys

    You can provide several service account keys for a single Android app. Batch will automatically use the appropriate key when sending notifications to a token.

    This is useful if you have to switch to another Firebase project (e.g. lost Firebase credentials, etc) and want to keep sending push notifications to users who didn't update the app yet. You can also use that feature to avoid creating two separate apps if you don't use the same Firebase project in staging and production.

    Click the "Update FCM config" button and confirm. You can now upload a new service account key.

    Huawei Mobile Services (HMS)

    Recent Huawei devices now rely on Huawei Mobile Services (HMS) for push notifications, as an alternative to Firebase Cloud Messaging (FCM). A single Android build can implement both FCM and HMS. You will find more details on the HMS integration in the documentation.

    Before sending your first push notification using HMS, you will need to add credentials on both Batch dashboard and Huawei AppGallery Connect.

    This guide assumes that you've already got an Huawei account and created your AppGallery application

    Enable Push Kit on AppGallery Connect

    PushKit needs to be enabled on AppGallery for HMS Push to work. and enable "Push Kit".

    Adding your app credentials to Batch dashboard

    Batch needs a pair of IDs to send push notifications using HMS: the Client ID and Client Secret of your Huawei project.

    Both are available on the :

    1. Click "AppGallery Connect"

    2. Go to "My Projects" and pick the right project

    3. Go to "Project Settings" → "App Information"

    Add these keys to the settings of your Android app on Batch dashboard. Click "Settings" → go to "Push Settings" → Then select "Huawei (HMS)" in the "Push Configurations" part.

    Additional setup on AppGallery Connect

    Batch will automatically generate credentials for your app. You will need to add them to your project settings on AppGallery Connect:

    • Callback address

    • Callback key

    • Callback username

    Here is how you can add these credentials to your project:

    1. Go to the Huawei Developer Console and click "AppGallery Connect".

    2. Select your project, click "Push Kit" in the left panel, then "Settings".

    3. Locate "Project-level message receipt" and click "Enable", once the "Select receipt" window is open, click "New".

    4. For "Supported Version", select "V1".

    Web

    Web push API settings (Chrome, Firefox, Safari on macOS Ventura or higher)

    Vapid Keys

    Each website has a pair of VAPID keys associated with it:

    • A public key: Inserted in the JavaScript tag and used to request a subscription to the browser's push service when users turn on push notifications.

    • A private key: Used by Batch servers to sign the authorization headers sent to the push service of each browser, when you want to send a notification to your opt-in users.

    If needed, you can change the VAPID keys to match the one you were using with another provider.

    SDK Auth Key

    The SDK Auth Key is a key generated by Batch for every website added to the dashboard, using the SDK API Key and the URL declared when you added your website. A new SDK Auth Key will be generated if you change the URL of your website in the dashboard settings.

    The Auth Key is used in the JavaScript Tag on your website. It authenticates the requests sent to Batch servers. If that SDK Auth Key doesn't match an existing Auth Key generated in the past for your SDK API Key, Batch will reject the request (e.g. 401 error - unauthorized).

    If you need to test your integration on a different domain than the one declared in the dashboard settings, you will need to set the "dev" parameter to true in your JavaScript tag and declare your development origins.

    Subdomain Name

    Only used in deprecated HTTP / multidomain mode

    Name of the subdomain Batch will use for your website.

    Safari (≥ macOS Ventura)

    For Safari (< macOS Ventura), Batch needs a website name to communicate in the push package requested by Safari before displaying the authorization prompt to a user. This is the name that will appear on your Safari push notifications.

    Batch also needs a list of allowed domains as well as push certificates associated with each domain in order to communicate with Apple Push Notification Services (APNS). Each certificate is generated for a unique Website Push ID.

    Allowed Dev Origins

    List of additional origins authorized in development mode, only when the 'dev' parameter is set to true in your JavaScript tag.

    Web Push Icons

    • Default icon: This icon is displayed on all web push notifications. It is mandatory to upload one for Safari web push configuration.

    • Small icon: This icon is displayed on web push notifications received on Android devices.

    Manage Push Delivery Speed

    Average number of sent push notifications per minute.

    By default, Batch will send push notifications at the maximum delivery speed defined in your plan (up to 1.000.000/minute).

    You can decrease/increase the delivery speed if needed. This will be applied to all the notifications sent to the users of your app/website, from Batch dashboard or the Push Campaigns API.

    This limit may not always be strictly enforced. To prevent overloading your site/app, consider setting a value lower than the maximum traffic it can handle as a safety buffer.

    If the push rate you have entered is too low, an alert message will appear. You can see in the example below that it will take +12 hours to send all push notifications to the entire user base.

    Batch makes sure that your push notification is not sent too late, at an inappropriate moment for your users. The sending will be automatically stopped:

    • After 12 hours, campaigns sent from the dashboard and by Push Campaigns API.

    • After 6 hours, for push sent by Transactional API. If the estimation is over that time, we recommend that you select a higher push delivery speed!

    Once a campaign is running, the campaign’s delivery speed can’t be changed for this campaign.

    Expiration (TTL)

    You can set a global expiration delay or a Time To Live (TTL) in hours for all the notifications sent to your app/website users. The notification won't be displayed if the device doesn't receive it or doesn't come back online within this time.

    By default, Batch sets a TTL of 14 days for all the notifications you send. If your user's device comes back online before being off for two weeks, it will display the last notification you sent to your user (iOS) or all the notifications sent over the previous two weeks (Android and web push). On iOS, APNS should only store for one month the notification waiting to be displayed.

    Priority

    iOS/Android only

    Defines the priority of your notifications on iOS (APNS) and Android (FCM). The default value is high on iOS and Android.

    On Android, you can use the high priority if you have a messaging/VoIP app and if you notice delivery issues due to native (Doze) or constructor related (Samsung Smart Manager, etc) energy-saving features.

    High priority Android notifications can drain your user's battery faster since they wake up the device and open a network connection. Switch to Normal priority if your notification is not time-sensitive.

    Collapse Key

    Android only

    Defines how notifications are managed when an offline device goes online. If enabled, the device will only show the most recent notification. If disabled, it will show all the notifications received when the device was offline.

    You should disable the collapse key if all your notifications matter (e.g. messages, etc). You can use up to three different collapse keys if you want users to get only one notification of each kind when coming online (e.g. marketing message, alert, etc).

    Test Devices

    This is the list of test IDs added by your team. You can easily rename, edit or delete them. Use the send a test button, next to the "edit" button, to check if that ID is still valid. You can add new test devices using the .

    Team Access Management

    To facilitate collaborative work, a user with "Administrate" rights can grant another user access to a group of selected apps. This is useful if you want to make sure specific users cannot access all the apps on the dashboard or if you have multiple projects with separate teams working on each one.

    You can review the list of access and grant access permissions on the application level from the "Team" tab. You can also manage the list of users who can access your company's dashboard from the team manager.

    Custom Data Management

    The Custom Data tab shows the list of all the custom data collected once for your app/website from the SDK (attributes, tag collections, events) or from the Custom Data API (user attributes, user tag collections).

    Enabling New Custom Data

    New custom data need to be manually enabled before being displayed in the userbase tab and used in a campaign. Before activating a new attribute, tag collection or event, make sure the name and the data type is correct.

    Editing Existing Custom Data

    You can add a custom name to any attributes or events. This is useful if you want to display simplified names in the interface instead of the technical name of the attributes/events:

    You can also change the data type of an attribute (e.g. from string to date) if you already made that change in the code of your app or in your call to the Custom Dara API. Batch will adapt the operators displayed in the campaign editor to the new data type. If you changed the data type by mistake, Batch indicates with a * the data type detected for that attribute (e.g. "Integer*").

    Switching Environments

    Use the "DEV/PROD" toggle to switch between the list of custom data attached to the Dev API Key or the Live API Key.

    Attributes, tags and tag collections attached to the Dev API key cannot be used as targeting conditions in push or In-App campaigns created on the dashboard. This is why they cannot be enabled from the "Custom Data" tag.

    Custom Audiences Management

    Custom audiences allow you to upload static segments exported from your userbase (e.g. top 500 buyers, etc) or created by third-party tools.

    You can retarget these custom audiences with a push or an In-App campaign from the dashboard.

    Creating a Custom Audience

    You can easily create, edit and delete custom audiences from the "Audiences" tab.

    Display Name

    The display name of your audience. Batch will only use it on the dashboard.

    Name

    The audience name is the ID of your custom audience. You will need it to target that audience if you are using the Push/In-App Campaigns API. Audience names can be up to 255 characters long.

    If you are planning to use the same audience on another platform, you will need to upload it for the other apps and make sure you use the same "audience name". This will ensure campaigns targeting a specific audience can be replicated from an app to another.

    Audience Type

    After uploading your audience, select the type of ID contained in your file:

    • Custom User IDs: Select that option if your file contains the type of internal IDs you share with Batch.

    • Advertising IDs: Choose that option if your file contains advertising IDs like IDFAs (iOS)/ GAID (Android).

    • Installation IDs: Select that option if your file contains a list of an anonymous IDs generated by Batch the first time users open your app or your website.

    Txt/csv File Upload

    Your file must be a csv or txt file (50MB maximum) containing a list of IDs (one per line). Use the preview to make sure the audience only contains the ids you need, in the correct format. Also, make sure the file doesn't contain any extra columns or headers.

    Managing Custom Audiences

    For each custom audience, Batch displays information such as:

    • Display name: Name of the audience, only used in the dashboard.

    • Name: This is the unique ID of your audience.

    • Type: Type of ID used in the campaign (e.g. Advertising ID or custom user ID).

    • Tokens / IDs: estimated number of tokens matching the IDs in the audience. Depending on the number of IDs included in your audience, the estimate may take several minutes to calculate the number of tokens matching your audience.

    In-App Themes Management

    Creating a Theme

    Choosing a format

    Before creating your first , you need to create a theme. Themes are templates you can use for your Mobile Landings or In-App Campaigns. You can choose between several formats.

    Restricted to users with Privacy or Administrate rights.

    Fullscreen

    Supported from Batch SDK 1.10. Fullscreen In-App themes can contain text (header, title, body), an image, up to two buttons and a close button. Use the fullscreen format for all your important messages that deserve to interrupt the navigation.

    Banner

    Supported from Batch SDK 1.11. Banners can be displayed on the top or the bottom of the screen. They can be attached to the borders to the device or not. Banners can contain text (title, body), up to two buttons, a close button and an auto-dismiss timer. Use banners to suggest optional actions and avoid bothering them when they are making important actions.

    Modal

    Supported from Batch SDK 1.14. The modal format will always be displayed in the center of the screen. You can add an image, disable text fields, buttons and change their color. You can also set a 10 second timer to autodismiss the In-App message.

    Image

    Supported from Batch SDK 1.14. Displays a full screen image or a modal with a close button or an auto-close timer. Editing an image theme is straightforward: Choose the format Batch will use to display your image (fullscreen or modal), the background color displayed behind the image and turn on/off the autodismiss option for your theme.

    WebView

    Supported from Batch SDK 1.17. The WebView format allows you to include a view based on custom HTML. All you need to define to edit a WebView theme is: the background color and opacity (visible during loading time and behind transparent images), and the color and background of the mandatory close button. Use it with your custom HTML design if other Batch formats don’t meet your needs.

    Customising a Theme

    Once you have picked a format, you can edit the layout and properties of your theme to adapt that format to your use case. Batch provides a simple interface to customise a new theme:

    General

    These are the basic properties of your theme:

    • Code: ID of your theme. Use it in the payload of your call to the In-App or Push Campaigns API (in case you use a Mobile Landing) to use a specific theme.

    • OS UI color: On iOS, determines whether the text of the statuts bar should be dark or light.

    • Placement: Top or Botton. Allows you to choose whether you want to display your banner on top or at the bottom of the screen (banner format only).

    • Attached

    Image

    The fullscreen, modal and image formats enable you to add an image in your In-App message. You can adjust the way Batch will display your image:

    • Cover: Batch will use the entire width of the screen to display the image. In portrait mode, depending on the screen size of the user device, the bottom and the top of the image will be cropped.

    • Contain: Batch won't crop the image vertically. You will now have two empty spaces on the left and the right of your image. If you choose the cover mode, we recommend you use the same color for the background of your In-App message and the background of your image.

    Text

    You can enable or disable blocks of centered text and change their color:

    • Header (fullscreen format only)

    • Title

    • Body

    Buttons

    You can add up to two buttons to your theme. For each button, you can modify the text and background color and the border-radius (in pixels, fullscreen format only).

    Close Button / Auto Dismiss

    Your theme must contain at least one button that will allow users to dismiss the In-App message. It can be:

    • A close button, in the top right corner of your theme. (mandatory for the WebView format)

    • An auto-dismiss option that will dismiss the In-App message after 10 seconds (banner, modal and image formats only)

    • Or a CTA, triggering a dismiss action.

    You can change the color and background of the close button. The auto-dismiss feature displays a gauge which shows the time remaining before the In-App message is dismissed.

    Previewing the Theme

    Once you are done editing your theme, you can save it and send a preview to your device to see how it looks. Click the "preview" button in the top right corner. Before sending a preview to your device, you can use one of the example contents in the dropdown menu.

    Managing Themes

    Themes are created at the company level. To find the right In-App design for your campaign, you can:

    • Create a brand new theme in your app.

    • Take a look at the themes created in the other app(s). If you want to attach available themes to your currently selected app, click on "Browse themes from other apps", select the themes thats fits and simply attach it to your app in order to use it on your campaign.

    You can also:

    • Create a copy of a theme in your app, click on the "..." button on a given theme and click on "Replicate".

    • Search or Filter themes by format: You can search or filter the displayed themes according to their format by using the drop-down menu.

    If there are themes you will not use anymore, you have two options:

    • "Detach" in order to remove the theme from the app you are on. This theme will however still be present in the themes lists of your other apps.

    • "Delete" to remove the theme permanently. This theme will be deleted on all your apps.

    Make sure the same themes are attached to the iOS and the Android version of your app to avoid campaign replication issues.

    Debug Tools

    Batch provides simple debug tools that allow you to test your integration (⚙ Settings → Debug) and debug your calls to the Transactional API.

    Integration Debug Tool

    Reviewing Data Attached to an ID

    Batch provides a simple tool you can use to see the list of installs tied to a specific ID and the data Batch collected for each one of them. You can search installs based on:

    • An advertising ID: IDFA (iOS) or GAID (Android). You can find your advertising ID by using on iOS or by going to your device settings → Google → Ads on Android.

    • A Custom User ID: Your own user IDs shared with Batch.

    • An Installation ID: ID generated by Batch for all the installs the first time your users open the app. You can get your installation ID in the log of your app or display it in your app for debug purposes.

    You can also see the data collected for random installs in your userbase:

    For every install, the debug tool displays basic information on the left side:

    • Basic information: Device type, last SDK start date, country, language, installation date, push optin status, app/OS/SDK version.

    • API Key: API key tied to the install. This can be your live or your dev API key.

    • Custom user ID: Custom User ID set for the install. The field will be empty if no custom user ID is set.

    • Installation ID: ID generated by Batch for the install when user opened the app for the first time.

    On the right side, you will find the list of all the data collected for a specific install:

    • Native data: app version, bundle ID, carrier code, city code, device brand/type, installation date, last location, and more.

    • Custom data: You will find here the list of all the attributes, tag collections and events received from the SDK or the Custom Data API. You search a specific value in the list if needed.

    The dashboard will display the most recent install first. Simply click again the "Debug" or "Reload" button to refresh the list of installs and update the attributes/events list.

    Sending a Test Notification

    Batch enables you to send a test notification to all the installs attached to the ID you are debugging. Clik the "Send Test Push" button at the top of the installs list:

    If you need to send push notifications to your device on a regular basis, then you should add your ID as a test device by clicking the "Save as a test device" button.

    Debugging a Trigger Campaign

    You can also see if a specific install is or has been in the user journey of a trigger campaign. Click the ⚡️ lightning icon in the top right corner of the debug tool. This will show the list of trigger campaigns that targeted your install at some point.

    For every campaign, you can see when your install entered the user journey and when/why it exited that user journey:

    • push_done: Batch sent a push to the install when the timer finished

    • cancel_event: Your user triggered the cancellation event before the timer finished.

    • stop: The trigger campaign has been stopped before the timer was finished.

    • no_pushtoken: Batch tried to send a notification to the install, but it didn't have a token. This may happen if users didn't see the opt-in prompt yet or didn't turn off push notifications on iOS.

    Troubleshooting

    There are several points you should check if you don't find any installs matching your advertising ID (IDFA/GAID):

    • App restriction: Your app may not be able to collect advertising IDs. This happens frequently on iOS, especially if it doesn't displays ads.

    • Device settings: Check your device settings to be sure you didn't turn on limited ad tracking in Settings → Privacy → Advertising.

    • Batch integration: Make sure that the advertising id collection hasn't been disabled.

    Transactional API Debug Tool

    Batch provides a simple debug tool that lets the list of all the targeted push tokens for any given API call to the Transactional API. Go to ⚙️ Settings → Debug, select "Transactional" and input the token generated by the API on each successful call:

    The advanced analytics view gives you detailed information for a specific transactional push:

    • Sent: The total amount of sent push notifications.

    • Not Found: Number of Custom User ID or installation ID are not linked to any push token.

    • Undeliverable: Number of push tokens that were flagged as invalid by Apple/Google. Your app may have been uninstalled.

    • Errors: Number of APNS/FCM/WNS errors.

    Privacy Center

    The Privacy center makes it easy to handle data access and data removal requests. Requests must be submitted for every app separately and must provide a valid data subject identifier (e.g. customer-level or device-level ID). You can also use Batch REST API to do the same thing.

    GDPR request information is available via our Dashboard and APIs for 20 to 30 days after request creation. After this time, you will not be able to query its status anymore. Pending requests are always available.

    The dashboard also shows the status of all your data access/removal requests. You can filter these requests by origin (Dashboard or API).

    Restricted to users with Privacy or Administrate rights.

    Requesting Data Access

    As soon as the request is completed, users with the Privacy and Administrate rights will receive an email (e.g. "[BATCH] Your GDPR request [request token] has been processed") with a link to an archive containing all the data Batch has stored for the provided identifier (e.g. list of sent notifications, list of installs attached to the id along with the data collected for each install, etc).

    That file can also be downloaded from the Privacy center.

    Requesting a Data Removal

    All the data Batch has stored for the provided identifier will be deleted.

    Batch will blacklist the ID for one month after the data removal. If you request a data removal for a specific ID and your user keeps or reinstall the app, Batch will not accept the data coming from that install. Batch will also discard the data sent from the Custom Data API for that specific ID.

    Labels Management

    Labels have two main purposes:

    1. Marketing pressure limit: You can set a specific marketing pressure limit on all the campaigns attached to the same label (e.g. no more than 1 push a week for all campaigns using the "onboarding campaigns" label).

    2. Filtering: You can filter the list of your campaigns based on the labels attached to your campaigns (e.g. "onboarding campaigns"):

    Restricted to users with App or Administrate rights.

    Creating a Label

    You can create as many labels as you want. Every label you create has: 

    • A code: Unique id of a label. Use it as a reference in your calls to the Transactional, Push or In-App Campaigns API. Avoid editing label codes. By changing a label's code, you might trigger errors on your API calls if you don't update them with the new name. This may also reset the frequency capping limits on running campaigns already using this label.

    • A name: Used to identify your label on the dashboard.

    Keep in mind labels are created on the app level. If you are planning to use the same label across different platforms (iOS/Android/Web), make sure you use the same "Code". Otherwise, you will not be able to replicate a campaign with one or several labels to another app without these labels.

    Managing Labels

    You can edit the code and the name of existing labels or delete them if needed. Batch shows the number of campaigns attached to each label so you can understand the impact of deleting or modifying one.

    Frequency Capping Management

    Batch's frequency capping allows you to limit the number of notifications a device can receive in a customisable time frame.

    That marketing pressure limit is useful when you accidentally target the same users several times in a short period of time, encouraging them to disable notifications or uninstall your app. This can happen when you are sending many different types of push notifications:

    • Alerts in real-time with the Transactional API (e.g. order confirmed, delayed flight, friend request, etc).

    • Recurring push notifications to automatically onboard newcomers or retain existing users.

    • And one-time campaigns to let your users know about new content, sales, and more.

    You can adjust the frequency capping for your app in two different ways.

    Global Capping

    You can either define a simple limit that will be applied to all the notifications you send or fine-tune your global frequency capping:

    • All push notifications: The capping rules will affect all your push notifications.

    • Campaigns: The capping rules will only affect notifications coming from campaigns created on the dashboard or with the Campaigns API.

    • Transactional: The capping rules will only affect real-time notifications sent with the Transactional API.

    All these rules can work together. For example, you can set a global capping of 5 push notifications per day and create two additional rules that will ensure users won't receive more than 1 transactional push every 2 hours and 1 push from a marketing campaign per week.

    Label-based Capping

    If you are looking for a more granular way of capping the number of push notifications a single device can receive, you can set a label-based frequency capping.

    You can create a frequency capping for all the notifications attached to a specific label. This will work for notifications sent from the dashboard or Batch's APIs:

    Please note all rules are dynamic. Batch will check the number of notifications that have been sent in the last X hours/days to see if the notification has to be sent or not.

    Batch uses the number of push notifications already sent to an install to determine whether the push should be sent or not. The number of push notifications sent to a specific install is counted in near-real-time. Campaigns sent very closely or at the same time may not be taken into account by the global capping feature.

    Campaign Analytics

    For all your push campaigns, Batch will display the number of notifications that were not delivered because users already reached the limit defined in your dashboard settings.

    Use the credentials displayed on Batch dashboard to fill in the form and click the "Submit" button.

  • Last update: Date of the last update.

  • : True or false. Determines whether the In-App message should be attached or not to the left and right borders of the screen (banner/modal formats only).
  • CTA mode: Horizontal or Vertical. Determines whether the two buttons of your theme should be arranged horizontally or vertically (fullscreen, banner, modal formats only)

  • Fullscreen: True or false. Determines whether the image should be displayed in fullscreen or detached from the screen borders (image format only)

  • Background: Hex color code. Background color of the theme.

  • Opacity: Percentage. Determines the opacity of the background of the theme. (WebView format only)

  • Push Token: Push token attached to the install. The field will be empty if Batch hasn't received any token yet for the install or if the token has been invalidated (e.g. uninstall).

  • pushtokennot_registered: The token attached to the install was not valid anymore when Batch tried to push it. This usually happens when users reinstall or uninstall the app.

  • query_mismatch: The install was not matching anymore the targeting of the campaign when the timer finished.

  • Team Access Management
    Custom Data Management
    Custom Audiences Management
    In-App Themes Management
    Debug Tools
    Privacy Center
    Labels Management
    Frequency Capping Management
    debug tool
    Developer Console
    Developer Console
    debug tool
    Firebase Console
    See Huawei's guide about enabling APIs
    Huawei Developer Console
    Debug tool
    In-App Campaign
    My Device ID
    custom data
    audiences
    theme
    debug
    privacy
    labels
    capping

    Personalization

    Introduction

    Personalization allows you to tailor messages based on each profile's characteristics and actions. You can personalize content by:

    • Referencing profile attributes or trigger event attributes (for Automations).

    • Applying formatting, such as capitalizing a last name or displaying a birthdate in a specific format.

    • Using conditions to customize content (e.g., showing different messages based on country or loyalty level).

    • Implementing loops to dynamically display multiple items (e.g., all products in a profile’s cart or recently purchased items).

    • Referencing data from Catalogs (e.g., showcasing top products or articles in a newsletter).

    Personalization is available across all channels and orchestration types (Campaigns, Recurring Automations, and Trigger Automations). All message text fields support personalization, except the email sender field.

    Personalization global behavior

    Batch dynamically replaces personalized attributes with profile or event specific values at the time of sending, ensuring each recipient receives a tailored message.

    During message creation, personalization code can be modified by clicking on the message content and previewed by selecting a specific profile. You can also send a test message based on the selected profile. If no profile is selected, attributes will be treated as empty in the send test.

    There are two ways to reference and format attributes:

    • Using the {...} Insert Variable button (also called Dynamic Content for email): This opens a guided modal that helps you select and format attributes, automatically inserting the correct code into your message.

    • Writing directly in Batch syntax: This allows for more advanced formatting options and greater flexibility when referencing and formatting attributes.

    Referencing attributes

    • First of all, to be available for personalization and appear in the selection modal, an attribute must be enabled in the Custom Data section.

    • Two types of attributes can be referenced in personalization:

      • Profile Attributes

        Available in all orchestration types (Campaigns, Recurring Automations, and Trigger Automations), these include details such as a recipient's first name. They can be either or custom attributes.

    Referencing attributes in messages

    Attributes must be enclosed in double curly braces:

    Profile custom attributes: {{ your_attribute }} Profile native attributes: {{ b.your_attribute }} Trigger event attributes: {{ trigger_event.your_attribute }}

    Example:

    Handling different data types

    This syntax supports most data types (string, integer, boolean, etc.), with specific behaviors for array and object attributes.

    Arrays

    Array attributes must be transformed before use; they cannot be inserted as-is. Example:

    More formatting options for arrays are available in the section.

    Objects (trigger event only)

    Object attributes can contain multiple properties, but only these specific properties can be referenced—never the entire object itself. Example: If a Trigger Event includes an attribute named delivery_address with the following properties:

    You can reference the properties like this:

    Note: Object attributes are only accessible in Trigger Event Attributes.

    Default values (optional)

    If an attribute is missing or null, personalization output is empty by default. However, you can define a fallback value.

    Example:

    If the profile's special_offer attribute is -15% then it evaluates to:

    If special_offer is missing:

    Whitespace handling

    To ensure smooth message formatting, whitespace (new lines and leading spaces) before an empty attribute is automatically removed. Example:

    With a firstname attribute defined, this evaluates to:

    Note the space after Hello is kept.

    If firstname is missing, the space is removed:

    This behavior can be overridden, see for more information.

    Audience data

    If you have uploaded specific profiles with the Audience API with their own attributes.

    They can be referenced in your message when the orchestration targets the corresponding audience, by using the {{ audienceAttribute(<audience name>, <attribute name>) }} expression.

    Example:

    Take the following Audience API Update call:

    The following message:

    will result in:

    Native attributes

    Some Batch native attributes can be used with Personalization to refer to Batch internal data.

    To access a native attribute, use the following syntax: {{ b.your_native_attribute }} The following is a non-exhaustive list of Batch Profiles native attributes:

    • campaign_token

    • creation_date

    • custom_id

    Referencing catalog data

    To reference the attributes of a catalog item, you’ll need the item ID assigned to it when it was added to the catalog. You can then use the lookup function to access the item's attributes.

    Formatting attributes

    You can apply formatting options to attributes to ensure they are displayed in the most relevant way. Formatting should be applied based on the attribute type.

    Transformations with arguments

    You may have noticed some transformations take arguments. When this is the case, there is two way to give the arguments:

    • Using a named argument as such: join(separator=',')

    • Directly giving the value as such: join(',')

    In the following reference we will denote arguments that can be given unnamed as such: argName?: type where the ? indicates the argument is optional.

    General transformations

    formatDate

    Input type date

    Arguments

    • pattern: string or (dateStyle: string, timeStyle: string)

    Optional arguments

    Transformations for numbers only

    abs

    Input type number or duration

    Return type integer

    Description Returns the absolute value of a number, duration, or distance.

    Example {{ -13|abs }} will result in 13

    round

    Input type number or duration or distance

    Return type integer

    Description Returns the closest integer of a number, duration, or distance, rounding up.

    Examples {{ 46.8|round }} will result in 47 {{ 46.3|round }} will result in 46

    ceil

    Input type number or duration or distance

    Return type integer

    Description Returns the closest integer that is greater than the number, duration, or distance.

    Example {{ 46.2|ceil }} will result in 47

    floor

    Input type number or duration or distance

    Return type integer

    Description Returns the closest integer that is lower than the number, duration, or distance.

    Example {{ 46.8|floor }} will result in 46

    formatNumber

    Input type number

    Arguments none

    Optional arguments

    • decimals: number

    formatCurrency

    Input type number

    Arguments none

    Optional arguments

    • decimals: number

    Transformations for strings only

    lower

    Input type string

    Return type string

    Description Converts a string to lowercase.

    Example {{ 'VINCENT'|lower }} will result in vincent

    upper

    Input type string

    Return type string

    Description Converts a string to uppercase.

    Example {{ 'vincent'|upper }} will result in VINCENT

    capitalize

    Input type string

    Return type string

    Description Converts the first letter to uppercase and all other letters to lowercase.

    Example {{ 'john Smith'|capitalize }} will result in John smith

    title

    Input type string

    Return type string

    Description Converts the first letter of each word to uppercase and all other letters to lowercase.

    Example {{ 'johN smith'|title }} will result in John Smith

    append

    Input type string

    Arguments

    • text?: string

    Return type string

    Description Appends the text to the value.

    prepend

    Input type string

    Arguments

    • text?: string

    Return type string

    Description Prepends the text to the value.

    length

    Input type string

    Return type integer

    Description Returns the length of the string

    Example {{ 'john'|length }} will result in 4

    trim

    Input type string

    Arguments none

    Optional arguments

    • nullIfEmpty: boolean

    Return type string

    Transformations for arrays of strings only (previously tag collections)

    join

    Input type array of strings

    Arguments

    • separator?: string

    Return type string

    Description Returns a string which is the concatenation of all tag values separated by the provided separator.

    first

    Input type array of strings

    Return type string

    Description Returns the first tag value.

    Example {{ interests|first }} will result in sports (for someone with ["sports", "politics", "music"] in their interests tag collection)

    last

    Input type array of strings

    Return type string

    Description Returns the last tag value.

    Example {{ interests|last }} will result in music (for someone with ["sports", "politics", "music"] in their interests tag collection)

    contains

    Input type array of strings

    Arguments

    • element?: string

    Return type boolean

    Description Returns true

    Transformations for arrays of objects and arrays of strings only

    count

    Input type

    array of strings or array of objects

    Return type int

    Description Returns the number of elements in the array.

    Example With fruits equals to ['apple', 'banana', 'cherry'] {{ fruits|count }} will result in 3

    Chaining transformations

    It is possible to chain transformations to produce more complex results, however you need to make sure the input and output types are compatible between transformations.

    For example, you can't call formatDate on a number or even a string, the type has to be a date. Look at the table above to know what transformations are compatible.

    Here is a valid example of chaining multiple transformations:

    Given a user with this array of strings exams: ["2025-10-09T14:53:54Z", "2025-10-11T16:53:54Z"] the example evalutes to:

    As you can see we take the last value of the array which returns a string, then pass that to date which parses it and returns a date type. Finally we pass that to formatDate.

    Conditions

    Conditions allow you to display specific parts of your message only to profiles that meet certain criteria.

    Conditions must be enclosed within {% ... %} and follow this syntax:

    You can add alternative conditions using else if, allowing different content to be displayed based on multiple conditions. Additionally, you can use else to define a default fallback when none of the previous conditions are met.

    Example:

    Suppose you want to congratulate a user based on how far he is into your game.

    You could write something like this:

    Now depending on the value of the user's current_level attribute, the message will be one of the 3 possibilities.

    Comparison

    Conditions can be based on the presence of an attribute. Example:

    Alternatively, conditions can be based on comparisons using various operators:

    Note: String values should always be enclosed in single quotes.

    Operators

    • == compares two values for equality

    • != compares two values for inequality

    • > returns true if the left hand side is greater than the right hand side

    Combining comparisons

    As in any programming languages, you can combine comparisons easily:

    • and returns true if both the left hand side and the right and side are true

    • or returns true if either the left hand side is true or the right hand side is true

    • not negates a statement

    Handling strings containing only spaces in conditions

    Strings consisting only of spaces (e.g., " ") are not inherently empty and will evaluate as true in if conditions.

    To treat such values as empty, use trim(nullIfEmpty: true), which converts them to None:

    Speaks function

    To customize contents according to the profile's language, you can use the speaks function. It accepts one or more languages as parameters, and returns true if the profile's language matches one of them.

    Loops

    Loops allow iterating over a list of values, such as displaying a list of products a user has purchased. The for loop enables structured iteration over arrays:

    If interests contains ["sports", "music", "travel"], the output will be:

    Handling Arrays of Objects

    An array of objects is a list where each element is an object. Arrays of objects can be nested up to three levels deep, meaning an object inside an array can contain another array of objects, and so on.

    Data in arrays of objects must be accessed using a for loop. It is not possible to reference a specific object within the array directly. Instead, the loop iterates over all objects in the array. For an array of objects product_list such as:

    the corresponding syntax is:

    Combining loops and conditions

    You can combine loops (for) and conditions (if) to dynamically personalize content based on multiple attributes.

    For example, when working with Trigger Event attributes, you may need to iterate over a list of orders and, within each order, iterate over the products it contains. Additionally, conditions can be applied to display specific content based on attribute values.

    Whitespace handling

    Statements ({% ... %}) always strips the trailing newlines, so there is no need to keep everything on the same line.

    Example:

    This evaluates to:

    Depending on the current time it will change to afternoon or evening.

    This behavior can be overridden, see for more information.

    Email container conditions

    For email messages, conditions and loops can be applied directly to an entire container or structure to:

    • Conditions: Display the container only if the profile meets the specified condition.

    • Loops: Iterate over an array to display its content within the container.

    Same rules apply as for inline personalization.

    Advanced transformations

    Variables and arithmetic

    Sometimes it might be handy to compute some value and keep a reference to it so you can reuse it multiple times inside your template.

    It is mainly a quality of life improvement but still useful.

    For example, suppose you want to compute an expiration date based on multiple user attributes and remind the user when their subscription will expire.

    Given the following rules:

    • premium users have 90-days subscription

    • users subscribed to the newsletter have a 75-days subscription

    • users younger than 25 and not premium have a 60-days subscription

    • all other have a 50-days subscription

    You could write something like this:

    This evaluates to:

    Obviously the date will change based on what kind of subscription the user has.

    There are a couple of new features here:

    • Defining a variable with set $variableName = <expression>. A valid expression has to return a single value of any type.

    • Arithmetic. You can do simple math inside a template. Conveniently, you can add also do arithmetic on a date by using a duration.

    • Concatenation. You can concatenate multiple values into a single one using the ~ operator. I’m

    Data types

    Standard

    Standard types include:

    • string. You can write a literal string by using a ' character like this: 'This is a string'. To use a ' inside your string you need to double it like this: 'It''s great'

    • integer. You can write a literal integer like this: 230.

    Date

    Date is a special type that can't be created by a literal. However they are produced in a couple of cases:

    • if an attribute is a date (that is either a NSDate or a java.util.Date for iOS and Android respectively).

    • by converting a UNIX timestamp (number of seconds since January 1, 1970): {{ 1491814800|date|formatDate('yyyy-MM') }}

    • by using the keyword now which returns the date at the time of execution

    Duration

    Duration is a special integer with a time unit. Units can be:

    • days: 40d

    • hours: 24h

    • minutes: 30m

    Distance

    Distance is a special integer with a distance unit. It is also always positive. Units can be:

    • meters: 5600m

    • kilometers: 83km

    Casting rules

    You can cast values into different types by using a casting operation, provided the types are compatible. The casting operation looks like this:

    Casting looks exactly like a transformation but it simply converts the original value to the type if the rules allow it.

    The rules of casting are as follows:

    from / to
    string
    int
    float
    bool
    date
    distance
    duration

    1 The string has to follow the pattern yyyy-MM-dd'T'HH:mm:ss or the resulting date will be empty.

    2 Casting from date to integer will return the UNIX timestamp in seconds. Casting from integer to date will treat the integer as a UNIX timestamp in seconds.

    3 Distance Rules:

    • casting from string to distance will treat the string as an integer representing the distance in meters.

    • casting from integer to distance will treat the integer as the distance in meters.

    • casting from float

    You can pass a conversion distance unit as a parameter to the distance transformation.

    Valid distance units are detailed above.

    Examples:

    • {{ '100'|distance }} will result into the distance 100m

    • {{ '12km'|distance('m') }} will result into the distance 12000m

    • {{ 2000|distance('km') }} will result into the distance 2000km

    4 Duration Rules:

    • casting from string to duration will treat the string as an integer representing the duration in days.

    • casting from integer to duration will treat the integer as the duration in days.

    • casting from float

    You can pass a conversion duration unit as a parameter to the duration transformation.

    Valid duration units are detailed above

    Examples:

    • {{ '100'|duration }} will result into the duration 100d

    • {{ '100h'|duration }} will result into the duration 100h

    • {{ '48h'|duration('d') }} will result into the duration 2d

    Math rules

    Math operations on integers and floats work as you would expect:

    Will evaluate to:

    There are a couple of rules for operations on dates, durations and distances:

    • adding or subtracting a duration from a date will return a new date.

    • subtracting two dates will return a duration.

    • all operations between a duration

    Some unusual operators are available for your convenience:

    • // divides two numbers and returns the truncated integer result. Example: {{ 20 // 7 }} evaluates to 2.

    • % returns the remainder of the integer division of two numbers. Example: {{ 11 % 7 }} evaluates to 4.

    Type comparison rules

    When comparing two values, they have to be of the same type otherwise it won't work.

    The rules are as follows:

    • A string can only be compared with another string

    • A date can only be compared with another date

    • A duration can be compared with another duration

    Example:

    Whitespace control override

    If the default behaviour doesn't suit you, you can force the behaviour with the following syntax:

    • {{+ +}} or {%+ +%} will force every whitespace to be kept

    • {{- -}} or {%- -%} will force every whitespace to be stripped

    You can mix and match of course: {{+ ... -}} is completely valid.

    Example:

    Now that we forcefully remove the leading whitespace, with a first_name defined it evaluates to:

    Another example:

    Here we forcefully keep the leading whitespace, with no first_name defined it evaluates to:

    Note the space is kept.

    Trigger Event Attributes

    Specific to Trigger Automations, these attributes are based on the event that triggered the automation, such as the list of products a profile just purchased.

    email
  • email_domain

  • has_custom_id

  • install_date

  • is_email_optin

  • is_push_optin

  • is_sms_optin

  • language

  • last_activity_date

  • last_email_click

  • last_email_click_marketing

  • last_email_marketing_click

  • last_email_marketing_open

  • last_email_open

  • last_email_transactional_click

  • last_email_transactional_open

  • last_visit_date

  • phone_number

  • region

  • timezone

  • timezone: string, locale: string

  • Return type string

    Description Formats a date using either the pattern provided or the combined dateStyle/timeStyle. Ex: {{ installation_date|formatDate(pattern: 'yyyy-MM-dd') }} will result in 2025-01-01

    Ex: {{ installation_date|formatDate(dateStyle: 'LONG', timeStyle: 'SHORT') }} will result in Wednesday, January 1, 2025 12:00 AM

    The timezone argument allows you to format the date into a specific timezone. Ex: {{ installation_date|formatDate(dateStyle: 'SHORT', timeStyle: 'LONG', timezone: 'Europe/Paris') }} will result in 1/1/25 9:00:00 AM CET

    The locale argument allows you to format the date using a specific locale. A locale controls region-specific behavior when formatting a date. For example, with the US locale, the time will be suffixed with AM or PM, but not with the UK locale. Ex: {{ installation_date|formatDate(dateStyle: 'SHORT', timeStyle: 'LONG', locale: 'UK') }} will result in 01/01/25 09:00:00 CET

    locale: string

    Return type string

    Description Formats a number.

    For a weight float attribute of value 26.5 and a user using a US locale: Ex: {{ weight|formatNumber }} will result in 26.5

    The decimals argument allows you to control how many decimals should be printed: Ex: {{ weight|formatNumber(decimals: 2) }} will result in 26.50

    The locale argument allows you to format the number using a specific locale. A locale controls region-specific behavior when formatting numbers, such as setting the appropriate decimal separator. By default, the user's locale will be used. Ex: {{ weight|formatNumber(locale: 'fr', decimals: 2) }} will result in 26,50

    locale: string

  • symbol: string

  • Return type string

    Description Formats a number as currency.

    For a price float attribute of value 2406.5 and a user using a US locale: Ex: {{ price|formatCurrency }} will result in ¤ 2,406.50

    The symbol argument controls the currency symbol: Ex: {{ price|formatCurrency(symbol: '$') }} will result in $ 2,406.50

    The decimals argument allows you to control how many decimals should be printed: Ex: {{ price|formatCurrency(symbol: '$', decimals: 3) }} will result in $ 2,406.500

    The locale argument allows you to format the number using a specific locale. A locale controls region-specific behavior when formatting numbers, such as setting the appropriate decimal separator.

    Note: The locale has no impact on the currency symbol. By default, the user's locale will be used.

    Ex: {{ price|formatCurrency(symbol: '$', locale: 'fr') }} will result in 2 406,50 $ Ex: {{ price|formatCurrency(symbol: '€', locale: 'fr') }} will result in 2 406,50 €

    Example
    {{ 'john'|append(' smith') }}
    will result in
    john smith
    Example
    {{ 'john'|prepend('smith ') }}
    will result in
    smith john
    Description Removes leading and trailing spaces from a string. If nullIfEmpty is set to true, the function will return None instead of an empty string when all characters are trimmed.

    Examples

    {{ " hello world "|trim }} will result in "hello world"

    Example {{ interests|join(' ') }} will result in sports politics music (for someone with ["sports", "politics", "music"] in their interests tag collection)
    if the tag collection contains the given argument.

    Example {{ interests|contains('politics') }} will result in true (for someone with ["sports", "politics", "music"] in their interests array of strings)

    >= returns true if the left hand side is greater than or equal to the right hand side
  • < returns true if the left hand side is lower than the right hand side

  • <= returns true if the left hand side is lower than or equal to the right hand side

  • ( and ) to group expressions.
    float. You can write a literal float like this: 20.30
  • boolean. A boolean is either true or false

  • seconds: 46s

    int

    ✓

    ✓

    ✓

    ✓2

    ✓

    ✓

    float

    ✓

    ✓

    ✓

    X

    ✓

    ✓

    bool

    ✓

    ✓

    ✓

    X

    X

    X

    date

    ✓

    ✓2

    X

    X

    X

    X

    distance

    ✓3

    ✓

    ✓

    ✓

    X

    X

    duration

    ✓4

    ✓

    ✓

    ✓

    X

    X

    to
    distance
    will remove the decimal part and treat it as an integer representing the distance in meters.
  • casting from boolean to distance will treat false as 0 and true as 1.

  • {{ 43.20440|distance }} will result into the distance 43m

  • {{ true|distance('km') }} will result into the distance 1km (not that you'd ever do that)

  • to
    duration
    will remove the decimal part and treat it as an integer representing the duration in days.
  • casting from boolean to duration will treat false as 0 and true as 1.

  • {{ 405|duration() }} will result into the duration 405d

  • {{ 43.409|duration('m') }} will result into the duration 43m

  • {{ true|duration('s') }} will result into the duration 1s

  • and a
    number
    are allowed and will return a
    duration
    in the original unit.
  • all operations between a distance and a number are allowed and will return a distance in the original unit.

  • ** raises the left hand side to the power of the right hand size. Example: {{ 2 ** 3 }} evaluates to 8.
    or a
    number
    . When comparing with a
    number
    it is treated as days; in other words
    {{ $myDuration == 3 }}
    is equivalent to
    {{ $myDuration == 3d }}
    .
  • A distance can be compared with another distance or a number. When comparing with a number it is treated as meters; in other words {{ $myDistance == 200 }} is equivalent to {{ $myDistance == 200m }}

  • A number can be compared with another number or a boolean.

  • string

    ✓

    ✓

    ✓

    ✓1

    ✓

    ✓

    Learn more about Custom Data here.
    Dynamic Content Insertion Modal
    Native attributes
    Formatting attributes
    Whitespace control override
    Whitespace control override
    Hello {{ firstname }}, your {{ trigger_event.product_name }} is waiting for you!
    You've already beaten those levels: {{ levels_done|join(',') }}
    {
      "city": "Paris",
      "zip_code": "75001",
      "street": "1 rue de Rivoli"
    }
    Your order will be delivered in {{ trigger_event.delivery_address.city }}, 
    {{ trigger_event.delivery_address.zip_code }} {{ trigger_event.delivery_address.street }}
    Special offer: Get {{ special_offer|default('-5%') }} by subscribing today!
    Special offer: Get -15% by subscribing today!
    Special offer: Get -5% by subscribing today!
    Hello {{ firstname }}!
    Hello Vincent!
    Hello!
    {
      "name": "EXAMPLE",
      "ids": [
        {
          "action": "add",
          "id": "CUSTOM-ID-1",
          "attributes": {
            "account_level": 20
          }
        }
      ]
    }
    
    Congratulations, you have reached level {{ audienceAttribute('EXAMPLE', 'account_level') }}!
    Congratulations, you have reached level 20!
        {% set $show = lookup('shows_catalog', favorite_show_id) %}
        {{$show.title}}
        {{$show.release_year}}
        {{$show.cast|join(', ')}}</div>
        {{$show.description}}
    Your next exam is on {{ exams|last|date|formatDate('yyyy-MM-dd') }}
    Your next exam is on 2025-10-11
    {% if condition %}
       Content to display if the condition is met.
    {% endif %}
    {% if condition1 %}
       Content if condition1 is met.
    {% elseif condition2 %}
       Content if condition2 is met (only if condition1 is not met).
    {% else %}
       Default content if none of the conditions are met.
    {% endif %}
    {% if current_level > 3 %}
    Good job on beating level 3! You're now halfway through the game, keep pushing!
    {% else if current_level > 5 %}
    Almost there! One more level and you beat the game!
    {% else if current_level == 6 %}
    Amazing! You've beat the game! Go take a look at the amazing perks you unlocked!
    {% endif %}
    {% if not birthday %}
      It looks like we don’t have your birthday on record! If you’d like to receive a surprise, don’t forget to add it.
    {% endif %}
    {% if loyalty_status == 'VIP' %}
    ...
    {% endif %}
    Hello {% if firstname|trim(nullIfEmpty:true) != None %} {{ firstname }} {% endif %}!
    {% if speaks('fr') %}
    Bonjour ! 
    {% else %}
    Hello!
    {% endif %}
    {% for interest in interests %}  
      - {{ interest }}
    {% endfor %}
    - sports
    - music
    - travel
    [
        {
          "name": "T-shirt",
          "price": 25
        },
        {
          "name": "Jeans",
          "price": 45
        },
        {
          "name": "Sneakers",
          "price": 60
        }
      ]
    {% for $product in product_list %}
      Product: {{ $product.name }}, price: {{ $product.price }}$!
    {% endfor %}
    {% for order in trigger_event.orders %}
    Order #{{ order.id }} details:
    {% for product in order.products %}
      - {{ product.name }} - {{ product.price }} {{ product.currency }}
    {% endfor %}
    {% if order.total_amount > 50 %}
        Shipping is free for you! 
    {% endif %}
    {% endfor %}
    {% set $hour = now|formatDate('hh')|int %}
    {% set $morning = $hour < 12 %}
    {% set $evening = $hour > 19 %}
    Good {% if $morning %}
    morning
    {% else if not $morning and not $evening %}
    afternoon
    {% else %}
    evening
    {% endif %}!
    Good morning!
    {% if premium %}
    {% set $expiration_date = c.subscription_date + 90d %}
    {% else if c.has_newsletter_subscription %}
    {% set $expiration_date = c.subscription_date + 75d %}
    {% else if c.age < 25 %}
    {% set $expiration_date = c.subscription_date + 60d %}
    {% else %}
    {% set $expiration_date = c.subscription_date + 50d %}
    {% endif %}
    Hey {{ c.first_name ~ c.last_name }}, friendly reminder that your subscription will expire on {{ $expiration_date|formatDate('yyyy-MM-dd') }}
    Hey John Smith, friendly reminder that your subscription will expire on 2026-01-03
    {{ c.my_string_attribute|float|int }}
    {{ (10 + 2) / 2 - (5 * 20) }}
    -94
    {% set $isYoungAdult = c.age > 18 and c.age < 26 %}
    {% set $hasEnoughBandwidth = c.has_fiber or (c.has_mobile and c.mobile_connection_type == '4g' %}
    {% if $isYoungAdult and $hasEnoughBandwidth %}
    Don't forget you can stream the match in 4k by subscribing!
    {% else %}
    Don't forget you can stream the match by subscribing!
    {% endif %}
    Hello {{- first_name }}!
    HelloVincent!
    Hello {{+ first_name }}!
    Hello !
    Catalogs API
    Profile API
    See more details.
    Campaign API
    technical guide
    Profile API
    Profile API
    here
    iOS
    Android
    Cordova
    Flutter
    React Native
    Android
    iOS
    Transactional API
    Profile API
    Transactional API
    Transactional API
    as attributes of these events
    Transactional API
    attributes
    Profile API
    Profile API
    iOS
    Android
    Flutter
    React native
    Cordova
    Profile API
    How to choose the right Custom User ID to use in Batch?
    Profile API
    Campaign API
    Export API
    documentation
    Campaign API
    Android
    iOS
    iOS
    Android
    Flutter
    React Native
    Expo
    Cordova
    Custom User ID
    MEP APIs
    Transactional API
    Transactional API
    Transactional API
    MEP Export API
    MEP Campaigns API
    CEP Campaigns API
    Orchestrations API
    In-app Campaigns API
    MEP Custom Audience API
    CEP Audiences API
    MEP Custom Audience API
    Custom Data API
    Profile API
    Profile API
    Custom Data API
    Custom Data API
    App Data API
    Catalogs API
    GDPR API
    MEP Export API
    Profile API - Export Profile Data
    Webhooks
    Trigger Events API
    Profile API
    Profile API
    Trigger Events API
    Profile API - Export Profile Data
    CEP Audiences API
    Event dispatchers
    How to test the integration on Android?
    How to test the integration on iOS?
    iOS
    Android
    Inbox
    How to add an unsubscribe link to your email template
    Email
    How to upload your email templates?
    How to add an unsubscribe link to your email template?
    Email Deliverability
    How to handle link tracking in emails?
    In-App Review
    Bounces
    Bounces
    Choosing a confirmation landing page