React Native SDK for OneSignal's push notification, email, SMS, and in-app messaging service
—
Outcome tracking and attribution for measuring notification effectiveness and user engagement.
Track user actions and conversions that result from notifications and in-app messages to measure campaign effectiveness.
/**
* Increases the "Count" of this Outcome by 1 and will be counted each time sent.
* @param name - The name/identifier of the outcome event
*/
function addOutcome(name: string): void;
/**
* Increases "Count" by 1 only once. This can only be attributed to a single notification.
* @param name - The name/identifier of the unique outcome event
*/
function addUniqueOutcome(name: string): void;
/**
* Increases the "Count" of this Outcome by 1 and the "Sum" by the value. Will be counted each time sent.
* If the method is called outside of an attribution window, it will be unattributed until a new session occurs.
* @param name - The name/identifier of the outcome event
* @param value - The numeric value to add to the outcome sum
*/
function addOutcomeWithValue(name: string, value: string | number): void;Usage Examples:
import { OneSignal } from "react-native-onesignal";
// Track basic outcomes (can be triggered multiple times)
OneSignal.Session.addOutcome("button_clicked");
OneSignal.Session.addOutcome("page_viewed");
OneSignal.Session.addOutcome("video_played");
// Track unique outcomes (only counted once per notification)
OneSignal.Session.addUniqueOutcome("app_opened");
OneSignal.Session.addUniqueOutcome("tutorial_completed");
OneSignal.Session.addUniqueOutcome("first_purchase");
// Track outcomes with monetary value
OneSignal.Session.addOutcomeWithValue("purchase", 29.99);
OneSignal.Session.addOutcomeWithValue("subscription", "15.99");
OneSignal.Session.addOutcomeWithValue("tip_given", 5);// Track shopping funnel outcomes
function trackEcommerceOutcomes() {
// User views product (can happen multiple times)
OneSignal.Session.addOutcome("product_viewed");
// User adds to cart (track each add)
OneSignal.Session.addOutcome("item_added_to_cart");
// User starts checkout (unique per session)
OneSignal.Session.addUniqueOutcome("checkout_started");
// Track purchase with value
OneSignal.Session.addOutcomeWithValue("purchase_completed", orderTotal);
// Track specific product category purchases
OneSignal.Session.addOutcome("electronics_purchase");
}// Track content engagement outcomes
function trackContentEngagement() {
// Article opened (can be multiple per session)
OneSignal.Session.addOutcome("article_opened");
// Video played (track each play)
OneSignal.Session.addOutcome("video_played");
// User subscribes (unique outcome)
OneSignal.Session.addUniqueOutcome("subscription_started");
// Premium upgrade with value
OneSignal.Session.addOutcomeWithValue("premium_upgrade", 9.99);
// Track content sharing
OneSignal.Session.addOutcome("content_shared");
}// Track gaming outcomes and monetization
function trackGamingOutcomes() {
// Level completed (can happen multiple times)
OneSignal.Session.addOutcome("level_completed");
// Achievement unlocked (track each achievement)
OneSignal.Session.addOutcome("achievement_unlocked");
// First game played (unique)
OneSignal.Session.addUniqueOutcome("first_game_played");
// In-app purchases with value
OneSignal.Session.addOutcomeWithValue("coins_purchased", 4.99);
OneSignal.Session.addOutcomeWithValue("power_up_purchased", 1.99);
// Daily login bonus claimed
OneSignal.Session.addOutcome("daily_bonus_claimed");
}// Track social engagement outcomes
function trackSocialEngagement() {
// Post created (can be multiple)
OneSignal.Session.addOutcome("post_created");
// Profile completed (unique setup)
OneSignal.Session.addUniqueOutcome("profile_completed");
// Friend added (track each connection)
OneSignal.Session.addOutcome("friend_added");
// Message sent (track engagement)
OneSignal.Session.addOutcome("message_sent");
// Premium membership (with value)
OneSignal.Session.addOutcomeWithValue("premium_membership", 19.99);
}// Track financial app outcomes
function trackFinancialOutcomes() {
// Account created (unique)
OneSignal.Session.addUniqueOutcome("account_created");
// Transaction completed (can be multiple)
OneSignal.Session.addOutcome("transaction_completed");
// Money transferred with value
OneSignal.Session.addOutcomeWithValue("money_transferred", transferAmount);
// Investment made with value
OneSignal.Session.addOutcomeWithValue("investment_made", investmentAmount);
// Feature usage tracking
OneSignal.Session.addOutcome("budget_tool_used");
OneSignal.Session.addOutcome("savings_goal_set");
}Outcomes are attributed to notifications within specific time windows:
// Best practices for outcome timing
function handleNotificationClick(notification) {
// Immediate outcomes - track right after notification interaction
OneSignal.Session.addOutcome("notification_clicked");
// Delayed outcomes - track when user actually completes action
setTimeout(() => {
OneSignal.Session.addOutcome("delayed_action_completed");
}, 5000);
}
// Track outcomes at appropriate times
function trackUserJourney() {
// Track at key conversion points
onAppOpen(() => {
OneSignal.Session.addUniqueOutcome("app_opened");
});
onPurchaseComplete((amount) => {
OneSignal.Session.addOutcomeWithValue("purchase", amount);
});
onFeatureUsed((featureName) => {
OneSignal.Session.addOutcome(`${featureName}_used`);
});
}These outcomes can be viewed in your OneSignal dashboard:
addOutcomeWithValue)// Structure outcome names for easy dashboard filtering
function useStructuredOutcomeNames() {
// Category-based naming
OneSignal.Session.addOutcome("ecommerce.purchase");
OneSignal.Session.addOutcome("ecommerce.cart_abandon");
OneSignal.Session.addOutcome("content.article_read");
OneSignal.Session.addOutcome("social.post_shared");
// Action-based naming
OneSignal.Session.addOutcome("user_action.login");
OneSignal.Session.addOutcome("user_action.logout");
OneSignal.Session.addOutcome("user_action.profile_update");
}// Always use numeric values for value-based outcomes
function trackValueOutcomes() {
// GOOD - numeric values
OneSignal.Session.addOutcomeWithValue("purchase", 25.99);
OneSignal.Session.addOutcomeWithValue("tip", 5);
OneSignal.Session.addOutcomeWithValue("subscription", 9.99);
// Convert strings to numbers when needed
const priceString = "15.99";
OneSignal.Session.addOutcomeWithValue("upgrade", parseFloat(priceString));
// Handle different currencies by converting to base unit
const priceInCents = Math.round(29.99 * 100); // Convert to cents
OneSignal.Session.addOutcomeWithValue("purchase_cents", priceInCents);
}Install with Tessl CLI
npx tessl i tessl/npm-react-native-onesignal