CleverTap Push Templates SDK helps you engage with your users using fancy push notification templates built specifically to work with CleverTap.
- Add the dependencies to the
build.gradle
implementation "${ext.push_templates}"
implementation "${ext.clevertap_android_sdk}" // 4.4.0 and above
- Add the following line to your Application class before the
onCreate()
CleverTapAPI.setNotificationHandler(PushTemplateNotificationHandler() as NotificationHandler);
CleverTapAPI.setNotificationHandler((NotificationHandler)new PushTemplateNotificationHandler());
Add the following code in your custom FirebaseMessageService class
public class PushTemplateMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
CTFcmMessageHandler()
.createNotification(getApplicationContext(), remoteMessage);
}
@Override
public void onNewToken(@NonNull final String s) {
//no-op
}
}
Remove the following Receivers and Services from your AndroidManifest.xml
and follow the steps given above
<service
android:name="com.clevertap.pushtemplates.PushTemplateMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name="com.clevertap.pushtemplates.PTNotificationIntentService"
android:exported="false">
<intent-filter>
<action android:name="com.clevertap.PT_PUSH_EVENT"/>
</intent-filter>
</service>
<receiver
android:name="com.clevertap.pushtemplates.PTPushNotificationReceiver"
android:exported="false"
android:enabled="true">
</receiver>
<receiver
android:name="com.clevertap.pushtemplates.PushTemplateReceiver"
android:exported="false"
android:enabled="true">
</receiver>
While creating a Push Notification campaign on CleverTap, just follow the steps below -
- On the "WHAT" section pass the desired values in the "title" and "message" fields (NOTE: We prioritise title and message provided in the key-value pair - as shown in step 2, over these fields)
- Click on "Advanced" and then click on "Add pair" to add the Template Keys
- You can also add the above keys into one JSON object and use the
pt_json
key to fill in the values
- Send a test push and schedule!
Basic Template is the basic push notification received on apps.
(Expanded and unexpanded example)
Auto carousel is an automatic revolving carousel push notification.
(Expanded and unexpanded example)
This is the manual version of the carousel. The user can navigate to the next image by clicking on the arrows.
(Expanded and unexpanded example)
If only one image can be downloaded, this template falls back to the Basic Template
The manual carousel has an extra variant called filmstrip
. This can be used by adding the following key-value -
Template Key | Required | Value |
---|---|---|
pt_manual_carousel_type | Optional | filmstrip |
(Expanded and unexpanded example)
Rating template lets your users give you feedback, this feedback is captured in the event "Rating Submitted" with in the property wzrk_c2a
.
(Expanded and unexpanded example)
Product catalog template lets you show case different images of a product (or a product catalog) before the user can decide to click on the "BUY NOW" option which can take them directly to the product via deep links. This template has two variants.
(Expanded and unexpanded example)
Use the following keys to enable linear view variant of this template.
Template Key | Required | Value |
---|---|---|
pt_product_display_linear | Optional | true |
Five icons template is a push notification with no text, just 5 icons which can help your users go directly to the functionality of their choice with a button's click.
If at least 3 icons are not retrieved, the library doesn't render any notification. The bifurcation of each CTA is captured in the event Notification Clicked with in the property wzrk_c2a
.
If user clicks on any notification area except the five icons, then by default it will launch an activity intent.
This template features a live countdown timer. You can even choose to show different title, message, and background image after the timer expires.
Timer notification is only supported for Android N (7) and above. For OS versions below N, the library falls back to the Basic Template.
The Zero Bezel template ensures that the background image covers the entire available surface area of the push notification. All the text is overlayed on the image.
The library will fallback to the Basic Template if the image can't be downloaded.
The Input Box Template lets you collect any kind of input including feedback from your users. It has four variants.
The CTA variant of the Input Box Template use action buttons on the notification to collect input from the user.
To set the CTAs use the Advanced Options when setting up the campaign on the dashboard.
Template Key | Required | Value |
---|---|---|
pt_dismiss_on_click | Optional | Dismisses the notification without opening the app |
*Note If pt_dismiss_on_click
is false we'll have to add the below code to not dismiss the
notification for Android 12 and above
fun dismissNotification(intent: Intent?, applicationContext: Context){
intent?.extras?.apply {
var autoCancel = true
var notificationId = -1
getString("actionId")?.let {
Log.d("ACTION_ID", it)
autoCancel = getBoolean("autoCancel", true)
notificationId = getInt("notificationId", -1)
}
/**
* If using InputBox template, add ptDismissOnClick flag to not dismiss notification
* if pt_dismiss_on_click is false in InputBox template payload. Alternatively if normal
* notification is raised then we dismiss notification.
*/
val ptDismissOnClick = intent.extras!!.getString(PTConstants.PT_DISMISS_ON_CLICK,"")
if (autoCancel && notificationId > -1 && ptDismissOnClick.isNullOrEmpty()) {
val notifyMgr: NotificationManager =
applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notifyMgr.cancel(notificationId)
}
}
}
This variant of the Input Box Template is particularly useful if the user wants to be reminded of the notification after sometime. Clicking on the remind later button raises an event to the user profiles, with a custom user property p2 whose value is a future time stamp. You can have a campaign running on the dashboard that will send a reminder notification at the timestamp in the event property.
To set one of the CTAs as a Remind Later button set the action id to remind
from the dashboard.
Template Key | Required | Value |
---|---|---|
pt_event_name | Required | for e.g. Remind Later , |
pt_event_property_<property_name_1> | Optional | for e.g. <property_value> , |
pt_event_property_<property_name_2> | Required | future epoch timestamp. For e.g., \$D_1592503813 |
pt_dismiss_on_click | Required | Value should be true . It dismisses the notification without opening the app and raises a required event to the user profile, needed to send a reminder notification. |
This variant raises an event capturing the user's input as an event property. The app is not opened after the user sends the reply.
To use this variant, use the following values for the keys.
Template Key | Required | Value |
---|---|---|
pt_input_label | Required | for e.g., Search |
pt_input_feedback | Required | for e.g., Thanks for your feedback |
pt_event_name | Required | for e.g. Searched , |
pt_event_property_<property_name_1> | Optional | for e.g. <property_value> , |
pt_event_property_<property_name_2> | Required to capture input | fixed value - pt_input_reply |
This variant passes the reply to the app as an Intent. The app can then process the reply and take appropriate actions.
To use this variant, use the following values for the keys.
Template Key | Required | Value |
---|---|---|
pt_input_label | Required | for e.g., Search |
pt_input_feedback | Required | for e.g., Thanks for your feedback |
pt_input_auto_open | Required | fixed value - true |
To capture the input, the app can get the pt_input_reply
key from the Intent extras.
Basic Template Keys | Required | Description |
---|---|---|
pt_id | Required | Value - pt_basic |
pt_title | Required | Title |
pt_msg | Required | Message |
pt_msg_summary | Required | Message line when Notification is expanded |
pt_subtitle | Optional | Subtitle |
pt_bg | Required | Background Color in HEX |
pt_big_img | Optional | Image |
pt_ico | Optional | Large Icon |
pt_dl1 | Optional | One Deep Link (minimum) |
pt_title_clr | Optional | Title Color in HEX |
pt_msg_clr | Optional | Message Color in HEX |
pt_small_icon_clr | Optional | Small Icon Color in HEX |
pt_json | Optional | Above keys in JSON format |
Auto Carousel Template Keys | Required | Description |
---|---|---|
pt_id | Required | Value - pt_carousel |
pt_title | Required | Title |
pt_msg | Required | Message |
pt_msg_summary | Optional | Message line when Notification is expanded |
pt_subtitle | Optional | Subtitle |
pt_dl1 | Required | Deep Link (Max one) |
pt_img1 | Required | Image One |
pt_img2 | Required | Image Two |
pt_img3 | Required | Image Three |
pt_imgn |
Optional | Image N |
pt_bg | Required | Background Color in HEX |
pt_ico | Optional | Large Icon |
pt_title_clr | Optional | Title Color in HEX |
pt_msg_clr | Optional | Message Color in HEX |
pt_small_icon_clr | Optional | Small Icon Color in HEX |
pt_json | Optional | Above keys in JSON format |
Manual Carousel Template Keys | Required | Description |
---|---|---|
pt_id | Required | Value - pt_manual_carousel |
pt_title | Required | Title |
pt_msg | Required | Message |
pt_msg_summary | Optional | Message line when Notification is expanded |
pt_subtitle | Optional | Subtitle |
pt_dl1 | Required | Deep Link One |
pt_dl2 | Optional | Deep Link Two |
pt_dln |
Optional | Deep Link for the nth image |
pt_img1 | Required | Image One |
pt_img2 | Required | Image Two |
pt_img3 | Required | Image Three |
pt_imgn |
Optional | Image N |
pt_bg | Required | Background Color in HEX |
pt_ico | Optional | Large Icon |
pt_title_clr | Optional | Title Color in HEX |
pt_msg_clr | Optional | Message Color in HEX |
pt_small_icon_clr | Optional | Small Icon Color in HEX |
pt_json | Optional | Above keys in JSON format |
pt_manual_carousel_type | Optional | filmstrip |
Rating Template Keys | Required | Description |
---|---|---|
pt_id | Required | Value - pt_rating |
pt_title | Required | Title |
pt_msg | Required | Message |
pt_big_img | Optional | Image |
pt_msg_summary | Optional | Message line when Notification is expanded |
pt_subtitle | Optional | Subtitle |
pt_default_dl | Required | Default Deep Link for Push Notification |
pt_dl1 | Required | Deep Link for first/all star(s) |
pt_dl2 | Optional | Deep Link for second star |
pt_dl3 | Optional | Deep Link for third star |
pt_dl4 | Optional | Deep Link for fourth star |
pt_dl5 | Optional | Deep Link for fifth star |
pt_bg | Required | Background Color in HEX |
pt_ico | Optional | Large Icon |
pt_title_clr | Optional | Title Color in HEX |
pt_msg_clr | Optional | Message Color in HEX |
pt_small_icon_clr | Optional | Small Icon Color in HEX |
pt_json | Optional | Above keys in JSON format |
Product Catalog Template Keys | Required | Description |
---|---|---|
pt_id | Required | Value - pt_product_display |
pt_title | Required | Title |
pt_msg | Required | Message |
pt_subtitle | Optional | Subtitle |
pt_img1 | Required | Image One |
pt_img2 | Required | Image Two |
pt_img3 | Required | Image Three |
pt_bt1 | Required | Big text for first image |
pt_bt2 | Required | Big text for second image |
pt_bt3 | Required | Big text for third image |
pt_st1 | Required | Small text for first image |
pt_st2 | Required | Small text for second image |
pt_st3 | Required | Small text for third image |
pt_dl1 | Required | Deep Link for first image |
pt_dl2 | Required | Deep Link for second image |
pt_dl3 | Required | Deep Link for third image |
pt_price1 | Required | Price for first image |
pt_price2 | Required | Price for second image |
pt_price3 | Required | Price for third image |
pt_bg | Required | Background Color in HEX |
pt_product_display_action | Required | Action Button Label Text |
pt_product_display_linear | Optional | Linear Layout Template ("true"/"false") |
pt_product_display_action_clr | Required | Action Button Background Color in HEX |
pt_title_clr | Optional | Title Color in HEX |
pt_msg_clr | Optional | Message Color in HEX |
pt_small_icon_clr | Optional | Small Icon Color in HEX |
pt_json | Optional | Above keys in JSON format |
Five Icons Template Keys | Required | Description |
---|---|---|
pt_id | Required | Value - pt_five_icons |
pt_img1 | Required | Icon One |
pt_img2 | Required | Icon Two |
pt_img3 | Required | Icon Three |
pt_img4 | Optional | Icon Four |
pt_img5 | Optional | Icon Five |
pt_dl1 | Required | Deep Link for first icon |
pt_dl2 | Required | Deep Link for second icon |
pt_dl3 | Required | Deep Link for third icon |
pt_dl4 | Optional | Deep Link for fourth icon |
pt_dl5 | Optional | Deep Link for fifth icon |
pt_bg | Required | Background Color in HEX |
pt_small_icon_clr | Optional | Small Icon Color in HEX |
pt_json | Optional | Above keys in JSON format |
Timer Template Keys | Required | Description |
---|---|---|
pt_id | Required | Value - pt_timer |
pt_title | Required | Title |
pt_title_alt | Optional | Title to show after timer expires |
pt_msg | Required | Message |
pt_msg_alt | Optional | Message to show after timer expires |
pt_msg_summary | Optional | Message line when Notification is expanded |
pt_subtitle | Optional | Subtitle |
pt_dl1 | Required | Deep Link |
pt_big_img | Optional | Image |
pt_big_img_alt | Optional | Image to show when timer expires |
pt_bg | Required | Background Color in HEX |
pt_chrono_title_clr | Optional | Color for timer text in HEX |
pt_timer_threshold | Required | Timer duration in seconds (minimum 10). Will be given higher priority. |
pt_timer_end | Optional | Epoch Timestamp to countdown to (for example, $D_1595871380 or 1595871380). Not needed if pt_timer_threshold is specified. |
pt_title_clr | Optional | Title Color in HEX |
pt_msg_clr | Optional | Message Color in HEX |
pt_small_icon_clr | Optional | Small Icon Color in HEX |
pt_json | Optional | Above keys in JSON format |
Zero Bezel Template Keys | Required | Description |
---|---|---|
pt_id | Required | Value - pt_zero_bezel |
pt_title | Required | Title |
pt_msg | Required | Message |
pt_msg_summary | Optional | Message line when Notification is expanded |
pt_subtitle | Optional | Subtitle |
pt_big_img | Required | Image |
pt_small_view | Optional | Select text-only small view layout (text_only ) |
pt_dl1 | Optional | Deep Link |
pt_title_clr | Optional | Title Color in HEX |
pt_msg_clr | Optional | Message Color in HEX |
pt_small_icon_clr | Optional | Small Icon Color in HEX |
pt_ico | Optional | Large Icon |
pt_json | Optional | Above keys in JSON format |
Input Box Template Keys | Required | Description |
---|---|---|
pt_id | Required | Value - pt_input |
pt_title | Required | Title |
pt_msg | Required | Message |
pt_msg_summary | Optional | Message line when Notification is expanded |
pt_subtitle | Optional | Subtitle |
pt_big_img | Required | Image |
pt_big_img_alt | Optional | Image to be shown after feedback is collected |
pt_event_name | Optional | Name of Event to be raised |
pt_event_property_<property_name_1> | Optional | Value for event property <property_name_1> |
pt_event_property_<property_name_2> | Optional | Value for event property <property_name_2> |
pt_event_property_<property_name_n> | Optional | Value for event property <property_name_n> |
pt_input_label | Required | Label text to be shown on the input |
pt_input_auto_open | Optional | Auto open the app after feedback |
pt_input_feedback | Required | Feedback |
pt_dl1 | Required | Deep Link |
pt_title_clr | Optional | Title Color in HEX |
pt_msg_clr | Optional | Message Color in HEX |
pt_small_icon_clr | Optional | Small Icon Color in HEX |
pt_ico | Optional | Large Icon |
pt_dismiss_on_click | Optional | Dismiss notification on click |
pt_json | Optional | Above keys in JSON format |
pt_title
andpt_msg
in all the templates support HTML elements like bold<b>
, italics<i>
and underline<u>
- Using images of 3 MB or lower are recommended for better performance under Android 11.
- A silent notification channel with importance:
HIGH
is created every time on an interaction with the Rating, Manual Carousel, and Product Catalog templates with a silent sound file. This prevents the notification sound from playing when the notification is re-rendered. - The silent notification channel is deleted whenever the notification is dismissed or clicked.
- For Android 11 and Android 12, please use images which are less than 100kb else notifications will not be rendered as advertised.
- Due to Android 12 trampoline restrictions, the Input Box template with auto open of deeplink feature will fallback to simply raising the event for a reply.
Template | Aspect Ratios | File Type |
---|---|---|
Basic | 4:3 or 3:2 or 2:1 | .JPG |
Auto Carousel | 3:2 (Android 11 & 12) and 4:3 (Below Android 11) | .JPG |
Manual Carousel | 3:2 (Android 11 & 12) and 4:3 (Below Android 11) | .JPG |
Manual Carousel-FilmStrip | 1:1 | .JPG |
Rating | 4:3 | .JPG |
Five Icon | 1:1 | .JPG or .PNG |
Zero Bezel | 4:3 or 3:2 or 2:1 | .JPG |
Timer | 3:2 (Android 11 & 12) and 4:3 (Below Android 11) | .JPG |
Input Box | 4:3 or 2:1 | .JPG |
Product Catalog | 1:1 | .JPG |
- For Auto and Manual Carousel the image dimensions should not exceed more than 840x560 for Android 11 and Android 12 devices and with 3:2 image aspect ratio
- For images in Basic, Auto/Manual Carousel templates the image dimensions should not exceed more than 400x200 for only Android 13+ devices.
- For images in Five Icons template the image dimensions should not exceed more than 300x300 for only Android 13+ devices.
- For Product Catalog image aspect ratio should be 1:1 and image size should be less than 80kb for Android 11 and Android 12 devices
- For Zero Bezel it's recommended that if your image has any text it should be present in the middle of the image for Android 12+ devices.
- For Android 12+ devices it's recommended that if your image has any text it should be present in the middle of the image.
With Android 12, the Rating and Product Display template push notifications do not get dismissed once the deeplink is opened.
To handle this, you'll have to add the following code to the onActivityResumed
or onNewIntent
of your app
val payload = activity.intent?.extras
if (payload?.containsKey("pt_id") == true && payload["pt_id"] =="pt_rating")
{
val nm = activity.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
nm.cancel(payload["notificationId"] as Int)
}
if (payload?.containsKey("pt_id") == true && payload["pt_id"] =="pt_product_display")
{
val nm = activity.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
nm.cancel(payload["notificationId"] as Int)
}
Bundle payload = activity.getIntent().getExtras();
if (payload.containsKey("pt_id")&& payload.getString("pt_id").equals("pt_rating"))
{
NotificationManager nm = (NotificationManager) activity.getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel(payload.getInt("notificationId"));
}
if (payload.containsKey("pt_id")&& payload.getString("pt_id").equals("pt_product_display"))
{
NotificationManager nm = (NotificationManager) activity.getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel(payload.getInt("notificationId"));
}
You can see the renditions of all the Push Templates on an Android 12 devices here
Check out the Sample app