Driving engagement and retention with Campaigns
This page provides details about the Campaigns feature
The Campaigns feature lets you create powerful no-code automations that will display a Purchasely Screen for a particular Audience at the App start.
They are particularly useful to:
- Convert users by proposing limited-time offers or discounts
- Implement retention strategies leveraging Promotional Offers targeting active subscribers about to Churn (voluntarily or involuntarily)
- Create win-back strategies leveraging Promotional Offer for lapsed subscribers
- Run user research or collect user insights by publishing surveys to targeted users
⚠️ The Minimum SDK version required to use this feature is 5.1.0
Configuring a Campaign
How to set up a Campaign ?
For each campaign, you can define:
- WHO will be targeted by associating it with an Audience
- WHEN the campaign should trigger and define capping parameters
- WHAT Screen(s) should be displayed by selecting a Purchasely Screen or running an A/B test.
Name and ID:
Set the name of your campaign and id. The name and ID you set here, helps you track the campaign performance within Purchasely.
💡Adding a category lets you better organize the list of campaigns.

WHO - Audience:
Choose the audience whom you would like to run this campaign for.

If you haven't configured the desired audience yet, you can click on + Create new audience
and define your audience in the modale.
When: Scheduling,Trigger, Capping
You can customize the following parameters to fine-tune your campaign behavior:
-
Start date and time & end date & time : Define the campaign’s activation and expiration times to automate promotional events (e.g., Black Friday sales) without requiring manual intervention in the Purchasely Console.
All times are expressed in UTC/GMT. -
Trigger:By default, a campaign starts when the APP_STARTED event is triggered. This event occurs:
- When the app is launched for the first time.
- After the app is restarted following termination by the operating system (typically due to prolonged inactivity).
- When the user manually relaunches the app.
APP_STARTED
and other eventsFor now, the
APP_STARTED
event is the only one allowed but new events will be possible to use as a trigger in the months to come.
-
Frequency cap: Control how often the campaign is displayed to prevent overexposure and user fatigue. This configuration ensures a seamless and non-intrusive campaign experience for users while maximizing engagement.
The frequency cap can be configured in two ways:-
Session-based: Limits campaign display based on app session count.
Example: If set to trigger every 3 sessions, the campaign will appear at most once every 3 app launches.
Note: the SDK generates a new session after 30 minutes of inactivity
-
Period-based: Enforces a minimum time gap between consecutive displays.
Example: If set to a 2-day interval, the campaign will not be shown again until at least 48 hours have passed since the last display.
-
-
Impression cap: Restricts the total number of times a user can see the campaign throughout its duration.
Example: If set to 3, the campaign will not be displayed to a user after they have seen it three times, regardless of triggers or frequency cap settings.
-
Exposure window: Defines the maximum time a user remains eligible to see the campaign after their first exposure. This is particularly useful for creating limited-time offers that expire after a defined period.
It can be combined with a countdown component integrated into the Campaign Screen to reinforce urgency.
Example: If set to 24 hours, the campaign will only be available to a user for 24 hours after their first exposure, even if the overall campaign period is longer.
All the above-mentioned parameters can be combined to create highly customized campaign behaviors, allowing precise control over timing, frequency, exposure limits, and user experience.
What: screen, A/B test:
In this section, you set up the Screen to be displayed or the you can run an A/B test.
This Screen does not need to be necessarily a Paywall. It can also be an onboarding Screen, a User Survey or any type of Screen
For an A/B test, it can be either UI or Price A/B test. The following illustration shows how to choose a screen to display for this campaign.

Once you are completed with your set up, click the Start button at the end of this page, to start the campaign.
Once a campaign has been started, you can still adjust the capping parameters (start/end date & time, frequency capping, impression cap, exposure window) but you can't change the campaign's name or campaign's ID nor the associated Audience or Screen.
The results of the A/B test can be consulted in the A/B test section of the Console.
Campaign prioritization
Active campaigns can prioritized. This allows allow to define which Campaign a User should be exposed to when they are eligible several Campaigns at the same time.
For a user, if a Campaign is currently capped, the SDK will automatically go to the next eligible Campaign.
You can prioritize Campaigns by drag & dropping them in the desired order.

Campaigns above have a higher priority.
Following campaigns results
The Campaigns features allow you to follow the monetization KPIs for each Campaign created.

The KPIs include the number of Screens displayed, Unique Viewers, Conversions and Aggregated Revenue.
Let's dig into them.
Screens displayed
This KPI counts the total Screens displayed for a given Campaign.
It leverages the UI / SDK event PRESENTATION_VIEWED
and counts the total number of events carrying a property campaign_id
matching the campaign.
Each occurence of the event is counted, meaning that a same user seeing several different Screens associated to the Campaign or seeing the same Screen several times is counted.
Unique Viewers
This KPI counts the total Unique Viewers for a given Campaign.
It leverages the UI / SDK event PRESENTATION_VIEWED
and counts the total number of unique users who have generated an event carrying the property campaign_id
matching the campaign.
A same User viewing several Screens or several times the same Screen is counted only once.
Conversions to Offer
This KPIs counts the total number of Unique Users who converted to an Offer price through a Screen associated with the Campaign.
#CONVERSIONS_TO_OFFER
=
#TRIAL_STARTED
// subscriptions starting with a free trial
+#INTRO_OFFER_STARTED
// subscriptions starting with a discounted price
+#PROMOTIONAL_OFFER_STARTED
// subscriptions starting with a promotional offer
+PROMO_CODE_STARTED
// subscriptions starting with a promo code
A same User triggering several conversion events is counted only once.
The Conversion Rate to Offer displayed equals the#CONVERSIONS_TO_OFFER
/ #UNIQUE VIEWERS
Conversions to Regular
This KPIs counts the total number of Unique Users who converted to a Regular price through a Screen associated with the Campaign.
#CONVERSIONS_TO_REGULAR
=
# SUBSCRIPTION_STARTED (with offer_type = NONE)
// subscriptions starting directly at the regular price
+#TRIAL_CONVERTED
// free trials that converted to the regular price
+#INTRO_OFFER_CONVERTED
// non free trial intro offers that converted to the regular price
+#PROMOTIONAL_OFFER_CONVERTED
// promotional offers that converted to the regular price
+#PROMO_CODE_CONVERTED
// promo code / offer codes that converted to the regular price
+#SUBSCRIPTION_REACTIVATED (with offer_type = NONE)
// lapsed subscriptions that were reactivated at the regular price
A same User triggering several conversion events is counted only once.
The Conversion Rate to Regular displayed equals the#CONVERSIONS_TO_REGULAR
/ #UNIQUE VIEWERS
Conversions to OTP
This KPIs counts the total number of Unique Users who purchased a One-Time Purchase (either a consumable or non consumable) through a Screen associated with the Campaign. It leverages the event TRANSACTION_PROCESSED
with the carrying the property purchase_type
= CONSUMABLE
or NON_CONSUMABLE
and the property campaign_id
matching the campaign.
#CONVERSIONS_TO_OTP
=
#TRANSACTION_PROCESSED (with purchase_type = CONSUMABLE or NON_CONSUMABLE)
// transactions associated with a One-Time Purchase.
A same User triggering several conversion events is counted only once.
The Conversion Rate to OTP displayed equals the#CONVERSIONS_TO_OTP
/ #UNIQUE VIEWERS
Aggregated revenue
The revenue are aggregated depending on the Plan type (SUBSCRIPTION
or OTP
) and for subscriptions, depending on the type of Price paid by the subscriber (OFFER
or REGULAR
).
It leverages the event TRANSACTION_PROCESSED carrying a property campaign_id
matching the campaign and groups them by purchase_type and offer_type.
AGGREGATED_REVENUE_OFFER
=
SUM OFamount_in_xxx
values for allTRANSACTION_PROCESSED
events(with purchase_type = RENEWING_SUBSCRIPTION or NON_RENEWING_SUBSCRIPTION and offer_type != NONE)
AGGREGATED_REVENUE_REGULAR
=
SUM OFamount_in_xxx
values for allTRANSACTION_PROCESSED
(with purchase_type = RENEWING_SUBSCRIPTION or NON_RENEWING_SUBSCRIPTION and offer_type = NONE)
AGGREGATED_REVENUE_OTP
=
SUM OFamount_in_xxx
values for allTRANSACTION_PROCESSED
(with purchase_type = CONSUMABLE or NON_CONSUMABLE)
For auto-renewing subscriptions, revenue include both the initial transaction and all the subsequent renewing until the actual termination of the subscription.
Examples of Campaigns
Type | Name | Description |
---|---|---|
Special offer / conversion | Free user conversion | Displays a specific paywall to free users who are challenging to convert into loyal subscribers 🎯 : targets non active subscribers with the Built-in User Attribute Total number of Screen dismissed above a specific threshold (eg: 20).🗓️ : To create a fear of missing out, the campaign can be configured as a one time offer by adjusting the impression cap to 1 display per user . |
Special offer / conversion | Black Friday Offer | Displays a Black Friday Paywall featuring discounted offers. 🎯 : targets every user who is not already an active subscriber. 🗓️ : The campaign is scheduled in advance by defining start / end date & time => it will automatically get activated when the start date is reached, and deactivated when the end date is reached. |
Special offer / conversion | Limited time offer following the account creation | Incentive users to try the premium product by displaying a limited time offer following their registration. 🎯 : target all users after they created their account. 🎚️: Configure the campaign as follows 1. Configure the exposure window to 3 days after the first display. 2. Set the frequency capping parameter to "Trigger campaign every 1 app session" 3. Add a countdown to the paywall, configure it as a user countdown and map it with a custom user attribute (e.g.: signup_date , type: Date), define the offset to 3 days too. This type of timer remains consistent from one screen display to the other, like if you had not closed the Screen: the counting continues until the end date is reached.=> When the paywall is displayed for the first time, it initializes both the Campaign exposure window , and the Custom User Attribute signup_date with the current date.As a result, the paywall countdown and the exposure window are perfectly synchronized. The user will get out of the exposure window and therefore not be eligible to the campaign anymore when the countdown will reach 0. |
Engagement | User preferences | Display a sequence of surveys during the onboarding to fetch user preference and personalize the user experience 🎯 : targets every user who hasn't answered the survey. You can do that by associating a Custom User Attribute to the survey |
Retention | Cancellation survey | Displays a cancellation survey to get user insights on the cancellation reasons 🎯 : targets active subscribers with the Built-in User Attribute Subscription status = Auto-renewing disabled .If you want to exclude free trial / intro offer users who directly cancel the renewing of their subscription right after starting it out of security, you can either exclude them ( Active Offer Type ≠ Free Trial l & Active Offer Type ≠ Intro Offer ) or leverage the attribute Next renewal date (Next renewal date is in less than X days from now )🔂 : to prevent user fatigue and overexposure, the impression cap can be set to one display per user or the frequency cap can be set to once per 30 days . |
Engagement | Free trial extension | Display a free trial extension paywall to free trial users who have cancelled the auto-renewing of their subscription to give them a second chance to engage with your app and potentially form a habit. 🎯: You can target the active subscribers with the following attributes: Subscription status = Auto-renewing disabled & Active Offer Type = Free trial or Intro Offer If you want to exclude free trial / intro offer users who directly cancel the renewing of their subscription right after starting it out of security, you can leverage the attribute Next renewal date (Next renewal date is in less than X days from now ) |
Conversion to paid | Temporary discounted offer following a free trial | Some users cancel their subscription during the free trial because they find the regular price too expensive. It's sometimes worth offering them a discount limited in time to bridge the gap between the introductory offer price and the regular price, in order to get them used to your app and accept to pay for it. 🎯: Target active subscribers with the following attributes: Subscription status = Auto-renewing disabled & Active Offer Type = Free trial or Intro Offer If you want to exclude free trial / intro offer users who directly cancel the renewing of their subscription right after starting it out of security, you can leverage the attribute Next renewal date (Next renewal date is in less than X days from now )ℹ️: by adjusting the frequency capping, impression cap and the priority, you can alternate between this campaign and a free trial extension campaign, proposing one then the other or making them get display alternatively. ℹ️ ℹ️: you can also display this campaign only for users who gave the reason "The subscription is too expensive" when they are exposed to a cancellation survey. To achieve that: (i) map your cancellation survey with a custom user attribute (e.g.: cancellation_survey - type: String) and leverage this custom user attribute in your audience by adding the condition cancellation_survey = too_expensive ). You can also create a conditional user flow to present the retention offer right after the cancellation survey. |
Retention / voluntary churn | Discounted offers to paid subscribers about to churn | Display a retention paywall reminding the subscription benefits and leveraging promotional offers to propose a discounted price to a subscriber about to churn. 🎯: Target active subscribers with the following attributes: Subscription status = Auto-renewing disabled & Active Offer Type ≠ Free trial and Active Offer Type ≠Intro Offer ℹ️ ℹ️: you can also display this campaign only for users who gave the reason "The subscription is too expensive" when they are exposed to a cancellation survey. To achieve that: (i) map your cancellation survey with a custom user attribute (e.g.: cancellation_survey - type: String) and leverage this custom user attribute in your audience by adding the condition cancellation_survey = too_expensive ). You can also create a conditional user flow to present the retention offer right after the cancellation survey . |
Retention / involuntary churn | Billing detail update for subscribers in grace period | Display a Screen informing users that their subscription could not be renewed because of a billing issue, reminding them about premium membership benefits and inviting them to update their billing details to avoid losing them. 🎯: Target active subscribers with the following attributes: Subscription status = Grace period 🔂 : to maximize the chances to recover the subscription, this campaign should be displayed every time the app is started. |
Retention / involuntary churn | Yearly subscribers about to churn | Context: 25% of the yearly subscribers directly cancel the auto-renewing of their subscription out of security, because they want to be sure to get enough value for the money they paid upfront before renewing the subscription. But half of them forget the date of renewing and go past it without reactivating the subscription. As a result, they churn even though they did not mean to. To avoid that, you should remind them to reactivate their auto-renewing to avoid losing their premium benefits. For this scenario, you can create a set of campaigns that will get triggered over the last month before the end of the billing cycle, that will display paywalls with progressive discounts. Campaign 1: Simple reminder with premium membership benefits 🎯: Target active subscribers with the Built-in User Attribute Active Subscription Plan = [ID of the yearly plan] & Subscription status =Auto-renewing disabled & Next renewal date is in less than 30 days from now and more than 15 days from now .📱: The paywall features a button "Reactivate my subscription" (a simple Purchase Button mapped with their current Plan) that will reactivate the reset the Subscription status to Auto-renewing if they click on it.Campaign 2: Paywall with a limited discount to reward their loyalty 🎯: Target active subscribers with the Built-in User Attribute Active Subscription Plan = [ID of the yearly plan] & Subscription status =Auto-renewing disabled & Next renewal date is in less than 15 days from now and more than 5 days from now 📱: The paywall features a promotional a 10% promotional offer. If they take it, their subscription status will be reset to Auto-renewing and the promotion will apply upon its renewing. Campaign 3: Paywall with an aggressive 30% discount limited in time 🎯: Target active subscribers with the Built-in User Attribute Active Subscription Plan = [ID of the yearly plan] & Subscription status =Auto-renewing disabled & Next renewal date is in less than 5 days from now 📱: The paywall features a promotional an agressive 30% promotional offer and a countdown to create a sentiment of urgency. If they take it, their subscription status will be reset to Auto-renewing and the promotion will apply upon its renewing. |
Win-back / involuntary churn | Billing detail update for subscribers in billing retry | Display a Screen informing users that their subscription has been cancelled because of a billing issue, reminding them about premium membership benefits and inviting them to update their billing details to reactivate them. 🎯: Target lapsed subscribers with the following attributes: Expired Subscription status = Billing retry . |
Win-back / voluntary churn | Discounted offers to lapsed subscribers to win them back | Display a win-back paywall feature a promotional offer to lapsed subscribers. 🎯: Target lapsed subscribers with the following attributes: Active subscription = false & Exp. subscription = true You can leverage the Built-in Exp. Subscription Attributes to target more precisely these lapsed subscribers depending on their Expired Sub. Status (= Deactivated means it was voluntary churn), the plan they used to have (Expired sub. Plan ) the cumulated revenue they generated (Expired sub. cumulated revenue (USD) or Cumulated revenue (USD) ) and their Expired sub. expiry date .🗓️ : Limited-time offers are most efficient with agressive discount are the most efficient to win-back lapsed subscribers. Leverage the parameter Exposure window combined with a countdown component inside the paywall to make to create a FOMO. |
Updated 1 day ago