From 5f9b201ad1687d0fd8f89c3345363f9644852fdb Mon Sep 17 00:00:00 2001 From: Garvey-radar Date: Wed, 5 Feb 2025 15:54:50 -0500 Subject: [PATCH 01/18] Added note for frequency capping SDK version --- docs/campaigns.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index 89747dfc6..e2684a391 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -53,6 +53,8 @@ You can also view these campaign conversion analytics by pressing the analytics ## Frequency Capping +In order to enable frequency capping, you must be running SDK version v3.19.6. + With frequency capping, you can limit the number of notifications a user receives from a campaign. This is useful to prevent excessive notifications for users. To set up frequency capping, navigate to the [setting page](https://radar.com/dashboard/settings). Under the campaigns section, define the maximum number of notifications allowed in the specified time window. From 18ea6cc3d52f0b62c3f462bdd56fd389b0c2927b Mon Sep 17 00:00:00 2001 From: Garvey-radar Date: Wed, 5 Feb 2025 16:40:49 -0500 Subject: [PATCH 02/18] Delete Beta version alert We dont need this anymore correct? --- docs/campaigns.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index e2684a391..d77584233 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -12,9 +12,7 @@ import Alert from '@site/src/components/Alert'; {` `} and above. - - This feature is currently in beta. Contact your customer success manager to enable it. If you encounter any issues or have feedback, please reach out to us at support@radar.com. - + Use campaigns to create location-based notifications effortlessly. Campaigns let you customize your notification content and targeting behavior with ease. From 096d51f00205677d4721ba03ed1f5c8b48f78373 Mon Sep 17 00:00:00 2001 From: Garvey-radar Date: Wed, 5 Feb 2025 17:05:57 -0500 Subject: [PATCH 03/18] Targeting options section Broke into subsections --- docs/campaigns.mdx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index d77584233..002407afa 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -31,9 +31,25 @@ Once set up, [create your campaigns](/campaigns#create-campaigns) using the dash To create a campaign via the dashboard, navigate to the [campaigns page](https://radar.com/dashboard/geofencing/campaigns) and click **Create**. Provide the campaign's name, notification body, and targeting details. You can target users using either geofences or places. ## Targeting options -Campaigns allow you to target users based on their entry into a geofence or place. Geofences can be targeted using geofence tags or IDs, while places can be targeted by categories or chains. Targeting applies to a user event when all targeting options are true. +Campaigns allow you to target users based on their entry into a specific type of geofence or place, their location permissions, and specific user IDs. -You can also target users based on their location-authorization status. For example, you might target a campaign to only target users with foreground-location permission. +*In order for a notification to be delivered, all targeting options must be true.* + +### Geofences and Places + +**Geofence tags -** allow you target groups of geofences based on their shared tags + +**Geofence external IDs -** allow you to target individual geofences by their unique ID + +**Place categories -** allow you to target categories like shopping malls (shopping-mall) or restaurants (restaurant) + +**Place chains -** allow you to target specific chains like Starbucks or Target + +### Location authorization + +Target users based on their location-authorization status. For example, you might target a campaign to only target users with foreground-location permission. + +### Specific users Under advanced options, you can find User ID (the [external ID](/sdk/ios#identify-user)) based targeting to target individual users. From 421b50447d6844db28d2d413b84b32be33b9c4ed Mon Sep 17 00:00:00 2001 From: Garvey-radar Date: Thu, 6 Feb 2025 13:59:57 -0500 Subject: [PATCH 04/18] More updates from Lily's feedback Forgot to make these separate pushes, but: - removed the notifications section for duplicity and made sure to cover that content in other sections - added more info to frequency capping - added notes about the SDK version required --- docs/campaigns.mdx | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index 002407afa..5fa259eb4 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -28,8 +28,9 @@ Once set up, [create your campaigns](/campaigns#create-campaigns) using the dash ## Create campaigns -To create a campaign via the dashboard, navigate to the [campaigns page](https://radar.com/dashboard/geofencing/campaigns) and click **Create**. Provide the campaign's name, notification body, and targeting details. You can target users using either geofences or places. +To create a campaign via the dashboard, navigate to the [campaigns page](https://radar.com/dashboard/geofencing/campaigns) and click **Create**. Provide the campaign details, targeting options, and notification details. +Notifications will only be delivered if the campaign is set to **Enabled**. ## Targeting options Campaigns allow you to target users based on their entry into a specific type of geofence or place, their location permissions, and specific user IDs. @@ -47,18 +48,16 @@ Campaigns allow you to target users based on their entry into a specific type of ### Location authorization -Target users based on their location-authorization status. For example, you might target a campaign to only target users with foreground-location permission. +Target users based on their device's location-authorization status. For example, you might target a campaign to only target users with foreground-location permission. ### Specific users Under advanced options, you can find User ID (the [external ID](/sdk/ios#identify-user)) based targeting to target individual users. -## Notification configurations - -You can configure the notifications Radar sends to users when they enter a geofence or place. Customize the notification body, and optionally, the notification title and the deep link URL. - ## Analytics +*Requires SDK version v3.19.6* + With Radar [Conversions](/api#log-a-conversion), you can log an event whenever a user interacts with a campaign notification. Refer to the [iOS SDK Conversions reference](/sdk/ios#conversions) for setup instructions. @@ -67,11 +66,19 @@ You can also view these campaign conversion analytics by pressing the analytics ## Frequency Capping -In order to enable frequency capping, you must be running SDK version v3.19.6. +*Requires SDK version v3.19.6* With frequency capping, you can limit the number of notifications a user receives from a campaign. This is useful to prevent excessive notifications for users. -To set up frequency capping, navigate to the [setting page](https://radar.com/dashboard/settings). -Under the campaigns section, define the maximum number of notifications allowed in the specified time window. +To set up frequency capping, navigate to the [campaign settings](https://radar.com/dashboard/settings#campaigns-settings) within the settings page. + +Define the maximum number of notifications allowed in the specified time window. + +The frequency cap is the maximum number of notifications allowed per user in the specified time window. This includes notifications from **all campaigns**. + +The time window is the length of time over which the frequency cap applies. +This is a rolling time window, so if the frequency cap is 2 and the time window is 48 hours, a notification could be delivered at hour 1, hour 24 and hour 49. + + ## Support From 12b28000410406463103d1daff2e60254567c9f5 Mon Sep 17 00:00:00 2001 From: Garvey-radar Date: Mon, 10 Feb 2025 11:37:33 -0500 Subject: [PATCH 05/18] Lily feedback contd Brought in more info from notifications. Added dependency info in conversions. --- docs/campaigns.mdx | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index 5fa259eb4..b89574277 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -31,9 +31,32 @@ Once set up, [create your campaigns](/campaigns#create-campaigns) using the dash To create a campaign via the dashboard, navigate to the [campaigns page](https://radar.com/dashboard/geofencing/campaigns) and click **Create**. Provide the campaign details, targeting options, and notification details. Notifications will only be delivered if the campaign is set to **Enabled**. + +## Notification Types + +### Client-side geofence notifications + +Radar's client-side geofence notifications make use of location notification triggers on iOS. These triggers work with foreground or "when in use" permissions. +This feature is privacy-friendly and won't collect any additional location data. +Notifications are only displayed after the user opens the app for the first time with the [Radar SDK](/documentation/sdk) installed. + +No additional lines of code are necessary to power client-side geofence notifications. +They function completely under the hood after setup. +The same calls to `Radar.trackOnce()` and `Radar.startTracking()` will return nearby geofences with notifications, which will then be registered on the device. + +Radar only controls the registration of notifications on the device. +Once that happens, surfacing notifications is subject to the [system limits and heuristics](https://developer.apple.com/documentation/usernotifications/unlocationnotificationtrigger#overview) that iOS enforces. + +### Event based notifications + +Event based notifications are the more traditional type of location-based notifications that rely on background ("Always allow") location permission. These types of notifications often provide less reach, but allow for more insight into conversions and analytics. + ## Targeting options + Campaigns allow you to target users based on their entry into a specific type of geofence or place, their location permissions, and specific user IDs. +Client-side geofence notifications and event based notifications support different targeting options. + *In order for a notification to be delivered, all targeting options must be true.* ### Geofences and Places @@ -59,6 +82,7 @@ Under advanced options, you can find User ID (the [external ID](/sdk/ios#identif *Requires SDK version v3.19.6* With Radar [Conversions](/api#log-a-conversion), you can log an event whenever a user interacts with a campaign notification. +To enable this for campaigns, make sure `radarInitializationOptions.autoSetupNotificationConversion` = `true`. Refer to the [iOS SDK Conversions reference](/sdk/ios#conversions) for setup instructions. From 67d0ee406cd72130be0184891317f73302bcabe4 Mon Sep 17 00:00:00 2001 From: Garvey-radar Date: Mon, 10 Feb 2025 11:51:56 -0500 Subject: [PATCH 06/18] Small edits --- docs/campaigns.mdx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index b89574277..80f0b697b 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -59,7 +59,7 @@ Client-side geofence notifications and event based notifications support differe *In order for a notification to be delivered, all targeting options must be true.* -### Geofences and Places +### Geofences and Places targeting **Geofence tags -** allow you target groups of geofences based on their shared tags @@ -69,11 +69,11 @@ Client-side geofence notifications and event based notifications support differe **Place chains -** allow you to target specific chains like Starbucks or Target -### Location authorization +### Location authorization targeting Target users based on their device's location-authorization status. For example, you might target a campaign to only target users with foreground-location permission. -### Specific users +### Specific users targeting Under advanced options, you can find User ID (the [external ID](/sdk/ios#identify-user)) based targeting to target individual users. @@ -95,12 +95,14 @@ You can also view these campaign conversion analytics by pressing the analytics With frequency capping, you can limit the number of notifications a user receives from a campaign. This is useful to prevent excessive notifications for users. To set up frequency capping, navigate to the [campaign settings](https://radar.com/dashboard/settings#campaigns-settings) within the settings page. -Define the maximum number of notifications allowed in the specified time window. +From there, define the maximum number of notifications allowed in the specified time window. The frequency cap is the maximum number of notifications allowed per user in the specified time window. This includes notifications from **all campaigns**. The time window is the length of time over which the frequency cap applies. -This is a rolling time window, so if the frequency cap is 2 and the time window is 48 hours, a notification could be delivered at hour 1, hour 24 and hour 49. +This is a rolling time window, so if the frequency cap is 2 and the time window is 48 hours, a notification could be delivered at hour 1, hour 24, and then a third at hour 49. + +*There is currently no way to prioritize the delivery of a certain campaign over another.* From 4fd2bf99044644fad15baa0ec87c9f0955746aea Mon Sep 17 00:00:00 2001 From: Kenny Hu Date: Tue, 10 Jun 2025 11:52:44 -0400 Subject: [PATCH 07/18] edits and also include csbn and campaign level freq cap --- docs/campaigns.mdx | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index 3999bac2e..e875c8fbf 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -22,10 +22,12 @@ First, [sign up](https://radar.com/signup) for Radar and get an API key. To use campaigns with geofences, start by [creating geofences](/geofences#create-geofences) through the dashboard, a CSV import, or the API. -To use campaigns with places, ensure that places are enabled through the [settings page](https://radar.com/dashboard/settings) and "nearby places" is activated. Reach out to your account manager to enable "nearby places" for your project. Then setup nearby places for the project via the [settings page](https://radar.com/dashboard/settings). +To use campaigns with places, ensure that places are enabled through the [settings page](https://radar.com/dashboard/settings) and `nearby places` is activated. Reach out to your account manager to enable `nearby places` for your project. Then setup nearby places for the project via the [settings page](https://radar.com/dashboard/settings). To use campaigns with events, ensure that the desired trigger events are enabled through the [settings page](https://radar.com/dashboard/settings). +To use campaigns with beacons, ensure that the beacons are created and enabled through the [beacons page](https://radar.com/geofencing/beacons) + Once set up, [create your campaigns](/campaigns#create-campaigns) using the dashboard. ## Create campaigns @@ -34,31 +36,15 @@ To create a campaign via the dashboard, navigate to the [campaigns page](https:/ Notifications will only be delivered if the campaign is set to **Enabled**. -## Notification Types - -### Client-side geofence notifications - -Radar's client-side geofence notifications make use of location notification triggers on iOS. These triggers work with foreground or "when in use" permissions. -This feature is privacy-friendly and won't collect any additional location data. -Notifications are only displayed after the user opens the app for the first time with the [Radar SDK](/documentation/sdk) installed. - -No additional lines of code are necessary to power client-side geofence notifications. -They function completely under the hood after setup. -The same calls to `Radar.trackOnce()` and `Radar.startTracking()` will return nearby geofences with notifications, which will then be registered on the device. -Radar only controls the registration of notifications on the device. -Once that happens, surfacing notifications is subject to the [system limits and heuristics](https://developer.apple.com/documentation/usernotifications/unlocationnotificationtrigger#overview) that iOS enforces. -### Event based notifications - -Event based notifications are the more traditional type of location-based notifications that rely on background ("Always allow") location permission. These types of notifications often provide less reach, but allow for more insight into conversions and analytics. ## Campaign types -### Client side geofence +### Client side geofence (iOS only) Use Radar's client side geofence notifications to display a notification on iOS devices when a user enters a geofence. These notifications work with foreground or "when in use" permissions, dramatically improving their reachable audience. -Radar's client side geofence notifications make use of location notification triggers on iOS. These triggers work with foreground or "when in use" permissions. No location data is collected in the background. +Radar's client side geofence notifications make use of location notification triggers on iOS. No location data is collected in the background. Calls to `Radar.trackOnce()` and `Radar.startTracking()`, which can be configured through remote configuration in the dashboard, will return to the client nearby geofences with notifications, which will then be registered on the device. @@ -68,13 +54,19 @@ Radar only controls the registration of notifications on the device. Once that h If the device is already inside the geofence when its client-side geofence notification is being synced, it will fire upon subsequent entry, not immediately. -Campaigns allow you to target users based on different triggers. Note not all triggers are available for client side geofence notifications. -Campaign triggers either target geofences or places. Geofences should be targeted using geofence tags or IDs, while places should be targeted by categories or chains. Targeting applies to a user event when all targeting options are true. +### Event based notifications -Campaigns allow you to target users based on their entry into a specific type of geofence or place, their location permissions, and specific user IDs. +Event based notifications are the more traditional type of location-based notifications that rely on background `Always allow` location permission. These types of notifications often provide less reach, but allow for more insight into conversions and analytics. -Client-side geofence notifications and event based notifications support different targeting options. +### Beacon based notifications (iOS only) + +Use Radar's client side beacon notifications to display a notification on iOS devices when a user enters a beacon region. These notifications work with foreground or "when in use" permissions. +Beacon based locations are much more accurate indoors as compared to GPS based locations, allowing for notification deliveries with high indoor accuracy. + +## Campaign targeting + +Campaigns allow you to target users based on different triggers. Note not all triggers are available for client side geofence notifications. *In order for a notification to be delivered, all targeting options must be true.* @@ -100,14 +92,19 @@ Target users based on their device's location-authorization status. For example, Under advanced options, you can find User ID (the [external ID](/sdk/ios#identify-user)) based targeting to target individual users. +### Beacon region targeting + +Target beacons based on their tag or their beacon ID. Radar converts those targeting options and converts them into an iBeacon region under the hood to trigger notifications as users enter iBeacon regions. + ## Frequency Capping -With frequency capping, you can limit the number of notifications a user receives from a campaign. This is useful to prevent excessive notifications for users. +With global frequency capping, you can limit the number of notifications a user receives from a campaign. This is useful to prevent excessive notifications for users. To set up frequency capping, navigate to the [setting page](https://radar.com/dashboard/settings). Under the campaigns section, define the maximum number of notifications allowed in the specified time window. The SDK will only sync up to the frequency cap number of notifications. As such, we'd recommend setting a cap of 2 notifications for a time window of 48 hours instead of 1 notification for 24 hours. +Additionally, at the campaign level, you can configure each campaign to ignore the global frequency capping or to set a campaign specific frequency cap (works in conjugation with the global cap). ## Analytics (iOS only) From ae7ab468b0a47df8123875a8be1aa87683087724 Mon Sep 17 00:00:00 2001 From: Kenny Hu Date: Thu, 14 Aug 2025 15:19:34 -0400 Subject: [PATCH 08/18] . --- docs/campaigns.mdx | 4 ++++ docs/sdk/android.mdx | 35 +++++++++++++++++++++++++++++++++++ docs/sdk/ios.mdx | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index 9a9096200..38fea054e 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -57,8 +57,12 @@ You can also target users based on their location-authorization status. For exam For event based campaigns, you can target users based on their device type (iOS, Android, or both). +### Advanced targeting options. + Under advanced options, you can find User ID (the [external ID](/sdk/ios#identify-user)) based targeting to target individual users. +User tags can be used to target specific groups of users. Refer to the [iOS](/sdk/ios#user-tags) or Android SDK reference for assigning tags to users. Campaigns targeting tags would be preferentially synced down to users. Reach out to your customer success manager to enable unlimited radius geofence search to preferentially sync down far away yet relevant geofences. + ## Notification configurations You can configure the notifications Radar sends to users when they enter a geofence or place. Customize the notification body, and optionally, the notification title and the deep link URL. diff --git a/docs/sdk/android.mdx b/docs/sdk/android.mdx index 48d64ae9f..263773508 100644 --- a/docs/sdk/android.mdx +++ b/docs/sdk/android.mdx @@ -1614,6 +1614,41 @@ With the [conversions API](/api#log-a-conversion), log a conversion, such as a p +### User tags + +With the [user tag API](/campaign#advanced-targeting-options), have [campaign](/campaign) only target users with the corresponding tags: + + + + + ```java + Radar.addTags(new String[]{"tag1", "tag2"}) + Radar.removeTags(new String[]{"tag1", "tag2"}) + Radar.setTags(new String[]{"tag1", "tag2"}) + Radar.getTags() + ``` + + + + + ```kotlin + Radar.addTags(arrayOf("tag1", "tag2")) + Radar.removeTags(arrayOf("tag1", "tag2")) + Radar.setTags(arrayOf("tag1", "tag2")) + Radar.getTags() + ``` + + + + + ## Notifications With `setNotificationOptions`, set the icon and the background color of foreground service and event notifications: diff --git a/docs/sdk/ios.mdx b/docs/sdk/ios.mdx index 5ae4ec17b..e46ba4b74 100644 --- a/docs/sdk/ios.mdx +++ b/docs/sdk/ios.mdx @@ -1831,3 +1831,36 @@ func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive respo ``` + +### User tags + +With the [user tag API](/api#log-a-conversion), have [campaign]() only target users with the corresponding tags: + + + + +```swift + Radar.addTags(["tag1", "tag2"]) + Radar.removeTags(["tag1", "tag2"]) + Radar.setTags(["tag1", "tag2"]) + Radar.getTags() +``` + + + + +```objc + [Radar addTags:[@"tag1", @"tag2"]]; + [Radar removeTags:[@"tag1", @"tag2"]]; + [Radar setTags:[@"tag1", @"tag2"]]; + [Radar getTags]; +``` + + From 0a2a97b22ad6c5b39e98deb1f36197c0f3b8d589 Mon Sep 17 00:00:00 2001 From: Kenny Hu Date: Thu, 14 Aug 2025 15:29:43 -0400 Subject: [PATCH 09/18] clean up --- docs/campaigns.mdx | 4 +++- docs/sdk/android.mdx | 2 +- docs/sdk/ios.mdx | 8 ++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index 38fea054e..006c83df5 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -59,9 +59,11 @@ For event based campaigns, you can target users based on their device type (iOS, ### Advanced targeting options. +Toggle the show advanced button to reveal advanced targeting options. + Under advanced options, you can find User ID (the [external ID](/sdk/ios#identify-user)) based targeting to target individual users. -User tags can be used to target specific groups of users. Refer to the [iOS](/sdk/ios#user-tags) or Android SDK reference for assigning tags to users. Campaigns targeting tags would be preferentially synced down to users. Reach out to your customer success manager to enable unlimited radius geofence search to preferentially sync down far away yet relevant geofences. +User tags can be used to target specific groups of users. Refer to the [iOS](/sdk/ios#user-tags) or [Android](/sdk/android#user-tags) SDK reference for assigning tags to users. Campaigns targeting tags would be preferentially synced down to users. Reach out to your customer success manager to enable unlimited radius geofence search to preferentially sync down notifications from far away yet relevant geofences. ## Notification configurations diff --git a/docs/sdk/android.mdx b/docs/sdk/android.mdx index 263773508..27537cef4 100644 --- a/docs/sdk/android.mdx +++ b/docs/sdk/android.mdx @@ -1616,7 +1616,7 @@ With the [conversions API](/api#log-a-conversion), log a conversion, such as a p ### User tags -With the [user tag API](/campaign#advanced-targeting-options), have [campaign](/campaign) only target users with the corresponding tags: +With the [user tag API](/campaigns#advanced-targeting-options), have [campaign](/campaigns) only target users with the corresponding tags: ```objc - [Radar addTags:[@"tag1", @"tag2"]]; - [Radar removeTags:[@"tag1", @"tag2"]]; - [Radar setTags:[@"tag1", @"tag2"]]; + [Radar addTags:@[@"tag1", @"tag2"]]; + [Radar removeTags:@[@"tag1", @"tag2"]]; + [Radar setTags:@[@"tag1", @"tag2"]]; [Radar getTags]; ``` From aa844e3d136605f424703df52c7d28d820d5fbf5 Mon Sep 17 00:00:00 2001 From: Kenny Hu Date: Thu, 14 Aug 2025 15:34:08 -0400 Subject: [PATCH 10/18] . --- docs/campaigns.mdx | 2 +- docs/sdk/android.mdx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index 006c83df5..766a5fa49 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -57,7 +57,7 @@ You can also target users based on their location-authorization status. For exam For event based campaigns, you can target users based on their device type (iOS, Android, or both). -### Advanced targeting options. +### Advanced targeting options Toggle the show advanced button to reveal advanced targeting options. diff --git a/docs/sdk/android.mdx b/docs/sdk/android.mdx index 27537cef4..26ec3ff86 100644 --- a/docs/sdk/android.mdx +++ b/docs/sdk/android.mdx @@ -1629,10 +1629,10 @@ With the [user tag API](/campaigns#advanced-targeting-options), have [campaign]( ```java - Radar.addTags(new String[]{"tag1", "tag2"}) - Radar.removeTags(new String[]{"tag1", "tag2"}) - Radar.setTags(new String[]{"tag1", "tag2"}) - Radar.getTags() + Radar.addTags(new String[]{"tag1", "tag2"}); + Radar.removeTags(new String[]{"tag1", "tag2"}); + Radar.setTags(new String[]{"tag1", "tag2"}); + Radar.getTags(); ``` From 8d0fed6b3d37aa19a3e54ff91b3ec202d737a4b8 Mon Sep 17 00:00:00 2001 From: KennyHuRadar <139801512+KennyHuRadar@users.noreply.github.com> Date: Thu, 14 Aug 2025 15:35:58 -0400 Subject: [PATCH 11/18] Update docs/campaigns.mdx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/campaigns.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index 766a5fa49..6b3815aa4 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -63,7 +63,7 @@ Toggle the show advanced button to reveal advanced targeting options. Under advanced options, you can find User ID (the [external ID](/sdk/ios#identify-user)) based targeting to target individual users. -User tags can be used to target specific groups of users. Refer to the [iOS](/sdk/ios#user-tags) or [Android](/sdk/android#user-tags) SDK reference for assigning tags to users. Campaigns targeting tags would be preferentially synced down to users. Reach out to your customer success manager to enable unlimited radius geofence search to preferentially sync down notifications from far away yet relevant geofences. +User tags can be used to target specific groups of users. Refer to the [iOS](/sdk/ios#user-tags) or [Android](/sdk/android#user-tags) SDK reference for assigning tags to users. Campaigns that target tags are preferentially synced down to users. If you want to preferentially sync notifications from far away but relevant geofences, reach out to your customer success manager to enable the unlimited radius geofence search feature. ## Notification configurations From b8ae799038b2219ae6671e6a44a2a420d1ba7f11 Mon Sep 17 00:00:00 2001 From: KennyHuRadar <139801512+KennyHuRadar@users.noreply.github.com> Date: Thu, 14 Aug 2025 15:36:05 -0400 Subject: [PATCH 12/18] Update docs/sdk/ios.mdx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/sdk/ios.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sdk/ios.mdx b/docs/sdk/ios.mdx index 7ec16f526..653cce630 100644 --- a/docs/sdk/ios.mdx +++ b/docs/sdk/ios.mdx @@ -1834,7 +1834,7 @@ func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive respo ### User tags -With the [user tag API](/campaigns#advanced-targeting-options), have [campaign](/campaigns) only target users with the corresponding tags: +With the [user tag API](/campaigns#advanced-targeting-options), you can configure [campaigns](/campaigns) to only target users with the corresponding tags: Date: Thu, 14 Aug 2025 15:36:12 -0400 Subject: [PATCH 13/18] Update docs/sdk/android.mdx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/sdk/android.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sdk/android.mdx b/docs/sdk/android.mdx index 26ec3ff86..ad2a1d96e 100644 --- a/docs/sdk/android.mdx +++ b/docs/sdk/android.mdx @@ -1616,7 +1616,7 @@ With the [conversions API](/api#log-a-conversion), log a conversion, such as a p ### User tags -With the [user tag API](/campaigns#advanced-targeting-options), have [campaign](/campaigns) only target users with the corresponding tags: +With the [user tag API](/campaigns#advanced-targeting-options), you can configure [campaigns](/campaigns) to only target users with the corresponding tags: Date: Fri, 15 Aug 2025 11:58:50 -0400 Subject: [PATCH 14/18] Edits --- docs/campaigns.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index 6b3815aa4..05feb629c 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -39,7 +39,7 @@ Use Radar's client side geofence notifications to display a notification on iOS Radar's client side geofence notifications make use of location notification triggers on iOS. These triggers work with foreground or "when in use" permissions. No location data is collected in the background. -Calls to `Radar.trackOnce()` and `Radar.startTracking()`, which can be configured through remote configuration in the dashboard, will return to the client nearby geofences with notifications, which will then be registered on the device. +Calls to `Radar.trackOnce()` and `Radar.startTracking()`, which can be configured through remote configuration in the dashboard, will return to the client nearby geofences with notifications, which will then be registered on the device. Default behavior involves syncing down geofences within 5 kilometers. To sync down geofences from further away, ask your Customer Success Manager to enable unlimited-distance syncing. Radar only controls the registration of notifications on the device. Once that happens, surfacing notifications is subject to the [system limits and heuristics](https://developer.apple.com/documentation/usernotifications/unlocationnotificationtrigger#overview) that iOS enforces. @@ -57,13 +57,13 @@ You can also target users based on their location-authorization status. For exam For event based campaigns, you can target users based on their device type (iOS, Android, or both). -### Advanced targeting options +### User targeting options -Toggle the show advanced button to reveal advanced targeting options. +Toggle the show advanced button to reveal the user targeting options. -Under advanced options, you can find User ID (the [external ID](/sdk/ios#identify-user)) based targeting to target individual users. +User tags can be used to target specific groups of users. Refer to the [iOS](/sdk/ios#user-tags) or [Android](/sdk/android#user-tags) SDK reference for assigning tags to users. When user tag targeting is configured on a campaign, the campaign will only apply to users who have at least one of the tags targeted. -User tags can be used to target specific groups of users. Refer to the [iOS](/sdk/ios#user-tags) or [Android](/sdk/android#user-tags) SDK reference for assigning tags to users. Campaigns that target tags are preferentially synced down to users. If you want to preferentially sync notifications from far away but relevant geofences, reach out to your customer success manager to enable the unlimited radius geofence search feature. +Alternatively, you can use the User ID (the [external ID](/sdk/ios#identify-user)) based targeting to target individual users. ## Notification configurations From 4a6c431b0cd57c27b48bccae4d0accc52b458468 Mon Sep 17 00:00:00 2001 From: Kenny Hu Date: Tue, 19 Aug 2025 16:07:03 -0400 Subject: [PATCH 15/18] add in app message docs --- docs/campaigns.mdx | 197 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 161 insertions(+), 36 deletions(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index 1b0cac82f..f571835ec 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -36,9 +36,6 @@ To create a campaign via the dashboard, navigate to the [campaigns page](https:/ Notifications will only be delivered if the campaign is set to **Enabled**. - - - ## Campaign types ### Client side geofence (iOS only) @@ -64,6 +61,121 @@ Event based notifications are the more traditional type of location-based notifi Use Radar's client side beacon notifications to display a notification on iOS devices when a user enters a beacon region. These notifications work with foreground or "when in use" permissions. Beacon based locations are much more accurate indoors as compared to GPS based locations, allowing for notification deliveries with high indoor accuracy. +### In app messaging + +In app messages give you a direct, flexible way to engage users right where they’re already active, without requiring push permissions or external channels. They’re a powerful developer tool for driving adoption, onboarding, and feature discovery with fully customizable timing and presentation. + +Radar's in app messages allow you deliver timely in app messages when we detect that the user is in a targeted geofence. no additional code is required to setup in app messages. + +#### Life cycle hooks + +##### iOS + +``` swift +class MyRadarInAppMessageDelegate : NSObject, RadarInAppMessageProtocol { + + // Called when the CTA button is clicked by the user and causes the in app message to be dismissed. + open func onInAppMessageButtonClicked(_ message: RadarInAppMessage) { + ... + } + + // Called when the dismiss button is clicked by the user and causes the in app messsage to be dismissed. + open func onInAppMessageDismissed(_ message: RadarInAppMessage) { + ... + } + + // Called just before the SDK displays the in app message. The return values decides if the in app message is displayed or discarded + open func onNewInAppMessage(_ message: RadarInAppMessage) -> RadarInAppMessageOperation { + ... + } +} +``` + +##### Android + +``` kotlin +class MyInAppMessageReceiver : RadarInAppMessageReceiver { + + // Called when the CTA button is clicked by the user and causes the in app message to be dismissed. + override fun onInAppMessageButtonClicked(payload: RadarInAppMessage) { + ... + } + + // Called when the dismiss button is clicked by the user and causes the in app messsage to be dismissed. + override fun onInAppMessageDismissed(payload: RadarInAppMessage) { + ... + } + + // Called just before the SDK displays the in app message. The return values decides if the in app message is displayed or discarded + override fun onNewInAppMessage(payload: RadarInAppMessage): RadarInAppMessageOperation { + ... + } + + + + + +} +``` + +#### Custom in app messages + +The Radar dashboard offers may ways to customize the look and feel of your in app messages. At the same time, we also allow developers to replace the in app message view with their very own custom in app message implementation. + +##### Android + +Implement your own custom implementation of `RadarInAppMessageReceiver` and override the method `createInAppMessageView`. Then, either pass the `RadarInAppMessageReceiver` as a parameter in `Radar.initialize()` or to `Radar.setInAppMessageReceiver()` + +``` kotlin +class MyInAppMessageReceiver : RadarInAppMessageReceiver { + + override fun createInAppMessageView( + context: Context, + inAppMessage: RadarInAppMessage, + onDismissListener: (() -> Unit)? = null, + onInAppMessageButtonClicked: (() -> Unit)? = null, + onViewReady: (View) -> Unit + ) { + val inAppMessageView = myInAppMessageView.initialize( + inAppMessage, + onDismissListener, + onInAppMessageButtonClicked, + ) + onViewReady(inAppMessageView) + } +} + +``` + +##### iOS + +Implement your own custom implementation of an class conforming to `RadarInAppMessageProtocol` and override the method `createInAppMessageView`. Then, either pass the class conforming to `RadarInAppMessageProtocol` to `Radar.setInAppMessageDelegate()` + +``` swift +class MyInAppMessageDelegate : RadarInAppMessageProtocol { + + func createInAppMessageView(_ message: RadarInAppMessage, onDismiss: @escaping () -> Void, onInAppMessageClicked: @escaping () -> Void, completionHandler: @escaping (UIViewController) -> Void) { + let inAppMessageViewController = myInAppMessageViewController.initialize( + inAppMessage, + onDismiss, + onInAppMessageClicked, + ) + completionHandler(inAppMessageViewController) + } +} + +``` + + +#### Analytics + +Analytics for in app messaging are available out of the box for both Android and iOS without additional setup. + +#### Deep linking + +The CTA button on the in app message can be used to perform deep linking. Simply define the `CTA link` field during campaign creation +Deep linking is available for both Android and iOS without any Radar specific setup. However, developer should register the scheme and handle deep linking as described in this [section](#deep-linking-1) + ## Campaign targeting Campaigns allow you to target users based on different triggers. Note not all triggers are available for client side geofence notifications. @@ -106,21 +218,33 @@ You can add metadata to the campaign, which will be accessible when the notifica ## Frequency capping -With global frequency capping, you can limit the number of notifications a user receives from a campaign. This is useful to prevent excessive notifications for users. -To set up frequency capping, navigate to the [setting page](https://radar.com/dashboard/settings). -Under the campaigns section, define the maximum number of notifications allowed in the specified time window. +*Requires SDK version v3.19.6* + +With frequency capping, you can limit the number of notifications a user receives from a campaign. This is useful to prevent excessive notifications for users. +To set up frequency capping, navigate to the [campaign settings](https://radar.com/dashboard/settings#campaigns-settings) within the settings page. + +From there, define the maximum number of notifications allowed in the specified time window. -The SDK will only sync up to the frequency cap number of notifications. As such, we'd recommend setting a cap of 2 notifications for a time window of 48 hours instead of 1 notification for 24 hours. +The frequency cap is the maximum number of notifications allowed per user in the specified time window. This includes notifications from **all campaigns**. + +The time window is the length of time over which the frequency cap applies. +This is a rolling time window, so if the frequency cap is 2 and the time window is 48 hours, a notification could be delivered at hour 1, hour 24, and then a third at hour 49. Additionally, at the campaign level, you can configure each campaign to ignore the global frequency capping or to set a campaign specific frequency cap (works in conjugation with the global cap). -## Analytics (iOS only) +## Additional setup for notification based campaign + +Client side geofence, Event based notifications, Beacon based notifications are considered notification based campaigns. Some additional setup are required for advanced features like analytics and deep linking. + +### Analytics *Requires SDK version v3.19.6* With Radar [Conversions](/api#log-a-conversion), you can log an event whenever a user interacts with a campaign notification. To enable this for campaigns, make sure `radarInitializationOptions.autoSetupNotificationConversion` = `true`. +Refer to the [iOS SDK Conversions reference](/sdk/ios#conversions) or [React Native Conversion references](/sdk/react-native#conversions) for setup instructions. + With Radar [Conversions](/api#log-a-conversion), you can also retrieve the source of an *opened_app* conversion for iOS apps. Within the *metadata* object of the [logged conversion](/sdk/ios#conversions), we will return a *conversion_source* with either - **`notification`** (app was opened using an external 3rd party notification) - **`radar_notification`** (app was opened using the configured on-prem notification): @@ -128,7 +252,11 @@ With Radar [Conversions](/api#log-a-conversion), you can also retrieve the sourc You can view these campaign conversion analytics by pressing the analytics button on the campaign's page. Alternatively, you can navigate to Geofencing -> Analytics -> Events -> Filters (top right) -> select Type as *opened_app* -> Apply Filters. From there, select *campaign_name* from the *grouped_by* dropdown. See screenshot below: ![OnPremiseNotifications](/img/notifications/conversion_source_analytics.png) -### Automated iOS setup +#### Android setup + +No additional setup is required for analytics for Android. + +#### Automated iOS setup Radar can associate `opened_app` events with a campaign notification that was clicked on to open the app. To set this up automatically, set the relevant flag on the initialization options. @@ -182,7 +310,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { -### Manual iOS setup +#### Manual iOS setup Alternatively, perform the manual setup: @@ -214,13 +342,21 @@ func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive respo -## Deep linking (iOS only) +### Deep linking -Radar's client side geofence notifications can be used for deep linking. This means that you can use Radar's deep linking functionality to open a specific view via on premise notification taps. +Radar's campaign notifications can be used for deep linking. This means that you can use Radar's deep linking functionality to open a specific view via on premise notification taps. Set up deep linking from the Radar's Dashboards by adding the **`radar:notificationURL`** to the `URL Schemes` of the desired navigation view of your app. -### Automated iOS setup +Radar campaigns use local notifications for deep linking. Due to iOS security restrictions, Universal Links opened from local notifications may redirect to Safari instead of your app. For reliable deep linking, use custom URL schemes (e.g., yourapp://) in your notification payloads. + +#### Android setup + +Refer to the [official android documentation](https://developer.android.com/training/app-links/deep-linking) to configure deep links for the android app. No additional Radar specific setup is required. + +#### iOS setup + +##### Automatic Radar's iOS SDK can automatically set up deep linking for you. To enable this feature, set the `autoHandleNotificationDeepLinks` option to `true` in the Radar `initialize` call. @@ -276,7 +412,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { It is recommended to use the automatic setup in conjugation with the `RadarURLDelegate` to handle the URL open. This implementation provides the most light way approach to get started with deep linking. -### Manual iOS setup +##### Manual If you want to set up deep linking manually, you can do so by adding the following line to your `UNUserNotificationCenterDelegate` implementation. @@ -308,7 +444,10 @@ func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive respo -### Automated React Native setup (iOS only) + +#### React Native setup + +##### iOS Radar's React Native SDK can automatically set up deep linking for you. To enable this feature, set the `autoHandleNotificationDeepLinks` option to `true` in the `radarInitializeOptions` via the `AppDelegate.mm`. ```Objective-C @@ -316,7 +455,6 @@ Radar's React Native SDK can automatically set up deep linking for you. To enabl { self.moduleName = @"main"; self.initialProps = @{}; - BOOL res = [super application:application didFinishLaunchingWithOptions:launchOptions]; RadarInitializeOptions *radarInitializeOptions = [[RadarInitializeOptions alloc] init]; radarInitializeOptions.autoHandleNotificationDeepLinks = YES; @@ -324,28 +462,15 @@ Radar's React Native SDK can automatically set up deep linking for you. To enabl return res; } ``` -### Handle system deep link - -Opening the notification will result in the SDK calling `[application openURL:url options:@{} completionHandler:nil];` This will open the URL in the app if it is registered for the scheme, or open the URL in the browser if it is not. -Developers should handle this by handling the [custom URL scheme](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app) or [universal link](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app) in their app. -React Native developers should also implement the native iOS handling of the deep link in their app. - -*Requires SDK version v3.19.6* - -With frequency capping, you can limit the number of notifications a user receives from a campaign. This is useful to prevent excessive notifications for users. -To set up frequency capping, navigate to the [campaign settings](https://radar.com/dashboard/settings#campaigns-settings) within the settings page. - -From there, define the maximum number of notifications allowed in the specified time window. - -The frequency cap is the maximum number of notifications allowed per user in the specified time window. This includes notifications from **all campaigns**. - -The time window is the length of time over which the frequency cap applies. -This is a rolling time window, so if the frequency cap is 2 and the time window is 48 hours, a notification could be delivered at hour 1, hour 24, and then a third at hour 49. - -*There is currently no way to prioritize the delivery of a certain campaign over another.* - +Alternatively perform the manual setup if you are setting the `AppDelegate` as the `UNUserNotificationCenterDelegate`. +```objc +- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { + [Radar openURLFromNotification:notification:response.notification]; + completionHandler(); +} +``` ## Support Have questions or difficulties with campaigns? Contact us at [radar.com/support](https://radar.com/support). From e312c7d3b1e63c073af6c8ffe56f58afb7b57f52 Mon Sep 17 00:00:00 2001 From: KennyHuRadar <139801512+KennyHuRadar@users.noreply.github.com> Date: Tue, 19 Aug 2025 16:10:36 -0400 Subject: [PATCH 16/18] Update docs/campaigns.mdx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/campaigns.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index f571835ec..f18be557d 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -114,7 +114,6 @@ class MyInAppMessageReceiver : RadarInAppMessageReceiver { - } ``` From d977d1d0884ff513ff48ca1e7cb1cc03540edfd5 Mon Sep 17 00:00:00 2001 From: KennyHuRadar <139801512+KennyHuRadar@users.noreply.github.com> Date: Tue, 19 Aug 2025 16:10:43 -0400 Subject: [PATCH 17/18] Update docs/campaigns.mdx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/campaigns.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index f18be557d..318a60715 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -101,7 +101,7 @@ class MyInAppMessageReceiver : RadarInAppMessageReceiver { ... } - // Called when the dismiss button is clicked by the user and causes the in app messsage to be dismissed. + // Called when the dismiss button is clicked by the user and causes the in app message to be dismissed. override fun onInAppMessageDismissed(payload: RadarInAppMessage) { ... } From ba8cb3bc75047028a20b5e828506a5ec023a876a Mon Sep 17 00:00:00 2001 From: KennyHuRadar <139801512+KennyHuRadar@users.noreply.github.com> Date: Tue, 19 Aug 2025 16:11:00 -0400 Subject: [PATCH 18/18] Update docs/campaigns.mdx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/campaigns.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/campaigns.mdx b/docs/campaigns.mdx index 318a60715..38e4a80d2 100644 --- a/docs/campaigns.mdx +++ b/docs/campaigns.mdx @@ -65,7 +65,7 @@ Beacon based locations are much more accurate indoors as compared to GPS based l In app messages give you a direct, flexible way to engage users right where they’re already active, without requiring push permissions or external channels. They’re a powerful developer tool for driving adoption, onboarding, and feature discovery with fully customizable timing and presentation. -Radar's in app messages allow you deliver timely in app messages when we detect that the user is in a targeted geofence. no additional code is required to setup in app messages. +Radar's in app messages allow you to deliver timely in app messages when we detect that the user is in a targeted geofence. No additional code is required to setup in app messages. #### Life cycle hooks