Push Notification Campaign Measurement
Track and measure push notification campaign performance on iOS and Android to attribute re-engagement events to specific push campaigns and optimize user retention strategies.
Singular provides seamless tracking for push notification campaigns across Firebase Cloud Messaging (FCM), Apple Push Notification Service (APNs), and third-party platforms including CleverTap, MoEngage, WebEngage, OneSignal, Salesforce Marketing Cloud, and Braze.
How Push Notification Tracking Works
Singular tracks push notification campaigns by embedding tracking links in notification payloads and attributing app opens to the originating campaign.
Tracking Flow
- Create Campaign: Build a push notification with a Singular tracking link embedded as custom key/value data
- User Receives Notification: Push provider delivers notification to user's device
- User Taps Notification: User opens app by tapping the notification
- SDK Processes Payload: Singular SDK extracts tracking data from notification payload
- Attribution Recorded: Singular attributes the app open as a re-engagement event to the push campaign
Re-engagement vs. Acquisition: Push notification tracking measures re-engagement (existing users returning to your app), not new user acquisition. The tracking link must be configured with re-engagement enabled.
Supported Push Notification Providers
Singular supports push notification tracking across all major push providers and marketing automation platforms.
Platform Support Matrix
| Provider | Platform | Integration Type | Singular Support |
|---|---|---|---|
| Firebase Cloud Messaging (FCM) | Android | Custom Data Payload | ✔ |
| Apple Push Notification Service (APNs) | iOS | Custom Data Payload | ✔ |
| CleverTap | iOS, Android | Custom Data Payload | ✔ |
| MoEngage | iOS, Android | Custom Data Payload | ✔ |
| WebEngage | iOS, Android | Custom Data Payload | ✔ |
| OneSignal | iOS, Android | Custom Data or Launch URL | ✔ |
| Salesforce Marketing Cloud (SFMC) | iOS, Android | Custom Data or OpenDirect | ✔ |
| Braze | iOS, Android | Custom Data or On-click Behavior | ✔ |
Integration Flexibility: Some providers (OneSignal, SFMC, Braze) support direct tracking link integration via CTA fields, eliminating the need for custom SDK configuration. See Alternative Integration Methods for details.
Prerequisites
Verify your app meets these requirements before implementing push notification tracking.
Required Setup
Singular SDK Integration
Install and configure the Singular SDK with push notification support enabled.
- Android SDK: Integrate following the Android SDK Integration Guide
- iOS SDK: Integrate following the iOS SDK Integration Guide
- Push Support: Enable push notification support during SDK initialization
Push Notification Infrastructure
Configure push notification delivery in your app and backend systems.
- Android: Firebase Cloud Messaging configured with valid server key
- iOS: APNs certificates or tokens configured in Apple Developer account
- Device Registration: App successfully registers for push notifications and stores tokens
- Delivery Testing: Verify push notifications reach devices successfully
Push Provider Account
Set up and configure your push notification service provider.
- Provider Account: Active account with FCM, APNs, or third-party platform
- Custom Data Support: Verify provider supports custom key/value pairs in payloads
- API Access: Credentials configured for sending notifications programmatically
Implementation Steps
Follow these steps to implement push notification campaign tracking with Singular.
Step 1: Create Singular Tracking Link
Generate Re-engagement Link
Create a Singular Link configured specifically for re-engagement tracking of push notification campaigns.
- Navigate to Singular Links: Access the Singular Links section in your Singular dashboard
- Create New Link: Click "Create New Link" and select your app
- Enable Re-engagement: Toggle "Re-engagement" setting to ON (critical for push tracking)
- Configure Parameters: Add campaign parameters for attribution (source, medium, campaign name)
- Generate Link: Save and generate both short and long URL formats
Complete guide: Building Singular Tracking Links
Critical: The tracking link MUST have re-engagement enabled. Links without re-engagement enabled will not properly attribute push notification opens.
Example Link Configuration:
Re-engagement Toggle:
Generated Link:
Step 2: Add Link to Push Notification Payload
Configure Custom Data
Embed the Singular tracking link in your push notification's custom data section using the standard key name.
Configuration Requirements:
-
Key Name: Use
sng_linkas the custom data key (case-sensitive) - Value: Paste your complete Singular tracking link (short or long format)
- Data Type: String value in custom data payload
Firebase Cloud Messaging Example
Add custom data to FCM notifications through Firebase Console or API.
Firebase Console Configuration:
{
"notification": {
"title": "Special Offer Inside!",
"body": "Open now to claim your reward"
},
"data": {
"sng_link": "https://your-app.sng.link/Abc12/xyz9?pcn=push_campaign"
},
"to": "device_registration_token_here"
}
Apple Push Notification Service Example
Include custom data in APNs payload using the standard aps dictionary format.
APNs Payload Structure:
{
"aps": {
"alert": {
"title": "Special Offer Inside!",
"body": "Open now to claim your reward"
},
"sound": "default",
"badge": 1
},
"sng_link": "https://your-app.sng.link/Abc12/xyz9?pcn=push_campaign"
}
Both Formats Supported: Singular accepts both short links (sng.link) and long links (custom domain format). Use whichever format fits your tracking infrastructure.
Step 3: Configure SDK to Process Custom Key
Android SDK Configuration
Configure the Singular Android SDK to extract and process the
sng_link custom data key from FCM notifications.
// In your FirebaseMessagingService
override fun onMessageReceived(remoteMessage: RemoteMessage) {
super.onMessageReceived(remoteMessage)
// Extract custom data from notification
val data = remoteMessage.data
// Check for Singular tracking link
if (data.containsKey("sng_link")) {
val singularLink = data["sng_link"]
// Pass to Singular SDK for attribution
Singular.setGCMData(data)
}
// Display notification to user
showNotification(remoteMessage)
}
Complete integration guide: Android Push Notification Support
iOS SDK Configuration
Configure the Singular iOS SDK to extract and process the
sng_link custom data key from APNs notifications.
// In your AppDelegate
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// Check for Singular tracking link
if let singularLink = userInfo["sng_link"] as? String {
// Pass to Singular SDK for attribution
Singular.setAPNSData(userInfo)
}
completionHandler(.newData)
}
// For iOS 10+ UNUserNotificationCenter
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
// Check for Singular tracking link
if let singularLink = userInfo["sng_link"] as? String {
// Pass to Singular SDK for attribution
Singular.setAPNSData(userInfo)
}
completionHandler()
}
Complete integration guide: iOS Push Notification Support
Step 4: Test and Validate
Testing Procedure
Verify push notification tracking works correctly before launching campaigns.
- Send Test Notification: Trigger a test push notification with Singular link in custom data
- Receive on Device: Confirm notification appears on test device
- Tap Notification: Open app by tapping the notification
- Check SDK Logs: Verify SDK logs show Singular link extraction
- Validate Dashboard: Confirm re-engagement event appears in Singular dashboard within 5 minutes
Platform-Specific Validation:
- iOS: iOS Validation Guide
- Android: Android Validation Guide
Common Issues:
-
Missing Events: Verify
sng_linkkey name is exact (case-sensitive) - Wrong Attribution: Confirm re-engagement is enabled on tracking link
- SDK Not Processing: Check SDK initialization occurs before notification handling
Step 5: Monitor Campaign Performance
Analyze Push Notification Results
Track re-engagement performance and ROI of push notification campaigns in Singular's analytics reports.
Available Metrics:
- Re-engagement Events: Total app opens attributed to push notifications
- Re-engagement Rate: Percentage of users who opened app from push
- Revenue Attribution: Revenue generated by re-engaged users
- Campaign Comparison: Performance across different push campaigns
- Cohort Analysis: User behavior post-re-engagement
Dashboard Example:
Access reports through: Analytics → Aggregated Analytics Reports → Filter by Re-engagement Source
Alternative Integration Methods
Some push providers support direct tracking link integration without requiring custom data configuration in SDK.
Direct CTA Integration
Certain platforms allow Singular tracking links to be configured directly in notification CTA fields, automatically launching the app with attribution data.
OneSignal Launch URL
OneSignal supports direct tracking links via the Launch URL feature.
- Configuration: Add Singular link to Launch URL field in notification composer
- Behavior: Tapping notification opens app with Singular link automatically processed
- SDK Requirement: Minimal—standard Singular SDK integration sufficient
Documentation: OneSignal Launch URL
Salesforce Marketing Cloud OpenDirect
SFMC provides OpenDirect functionality to launch apps with tracking links.
- Configuration: Set Singular link as OpenDirect URL in message setup
- Behavior: Notification tap triggers app launch via OpenDirect protocol
- Platform Support: Available for both iOS and Android
Documentation: SFMC OpenDirect
Braze On-Click Behavior
Braze allows Singular tracking links to be configured in notification on-click behavior settings.
- Configuration: Add Singular link to On-click Behavior field in push composer
- Behavior: Notification tap opens app with automatic link processing
- Action Types: Supports deep linking and external URL options
Documentation: Braze On-Click Behavior
Recommendation: Use direct CTA integration when available—it simplifies implementation and reduces SDK configuration requirements. However, custom data method provides maximum flexibility across all providers.
Best Practices
Follow these guidelines to maximize accuracy and effectiveness of push notification campaign tracking.
Campaign Structure
Link Configuration
- Unique Links Per Campaign: Create separate tracking links for each push campaign to isolate performance
- Descriptive Parameters: Use clear campaign names in tracking link parameters
- Consistent Naming: Establish naming conventions for push campaigns (e.g., push_promo_2025_q1)
- Test Before Launch: Validate each new tracking link with test notifications
Technical Implementation
-
Case Sensitivity: Always use
sng_linkexactly as written (lowercase) - URL Encoding: Ensure tracking links are properly URL-encoded in API requests
- Payload Size: Monitor notification payload size—keep under platform limits (4KB for APNs, 4KB for FCM)
- Error Handling: Implement fallback logic if custom data is missing from notification
- SDK Version: Use latest Singular SDK version for optimal push notification support
Performance Optimization
- Segmentation: Target push campaigns to engaged user segments for higher open rates
- Timing: Send notifications during optimal engagement windows based on user behavior
- A/B Testing: Test different messaging and timing with separate tracking links
- Frequency Caps: Limit push frequency to avoid user fatigue and opt-outs
- Deep Linking: Combine push tracking with deep links to specific in-app content
Troubleshooting
Common Issues and Solutions
| Issue | Cause | Solution |
|---|---|---|
| Events not appearing in dashboard | Re-engagement not enabled on link | Verify tracking link has re-engagement toggle enabled in Singular Links |
| SDK not extracting link | Incorrect custom data key name |
Confirm key is exactly sng_link (case-sensitive)
|
| Attribution to wrong campaign | Using same link across campaigns | Create unique tracking link for each campaign |
| Delayed event reporting | Network latency or offline mode | SDK queues events and sends when connection restored—allow up to 24 hours |
| iOS notifications not tracked | Missing APNs data handler |
Implement setAPNSData() in notification delegate
methods
|
| Android notifications not tracked | Missing FCM data handler |
Call setGCMData() in FirebaseMessagingService
|
Support: For additional troubleshooting assistance, contact Singular Support with push notification payload examples, SDK logs, and dashboard screenshots showing the issue.