Screen tracking (SDK) for retention programs in Customer.io

Customer.io partner logo

Table of Contents

Summarize this documentation using AI

This banner was added using fs-inject

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Overview

If you’re running retention in Customer.io, screen tracking is one of the cleanest ways to understand what customers actually do in your app—without relying on brittle URL logic or guessing intent from purchases alone. When you capture screen views consistently (and stitch them to the right profile), you unlock higher-confidence cart recovery, better browse-based follow-ups, and tighter reactivation targeting; if you want help pressure-testing your tracking plan before you ship, book a strategy call.

In most retention programs, we’ve seen screen events become the difference between “we sent reminders” and “we orchestrated intent.” The key is treating screen tracking like instrumentation, not analytics—your naming, identity, and payload decisions will directly affect segmentation and journey logic.

How It Works

Screen tracking is just event tracking with a consistent convention: every time a user lands on a screen in your app (Product, Collection, Cart, Checkout, Order Confirmation), your SDK sends an event into Customer.io with a stable event name and a screen identifier. The retention win comes from two things: (1) you can segment on recency/frequency of specific screens, and (2) you can trigger journeys off high-intent screens like Cart or Checkout.

  • Anonymous → identified stitching: A user might browse anonymously, then log in or enter email at checkout. Your SDK should track screen events under an anonymous identifier first, then call identify when you know who they are, and merge that prior activity into the known profile. In practice, this is where programs tend to break—teams track screens but never merge, so browse/cart intent never powers messaging.
  • Event structure: Send a consistent event like screen_view with properties such as screen_name, plus commerce context (e.g., product_id, variant_id, collection_id, cart_value). Keep the event name stable; vary intent via properties.
  • Device and channel targeting: Because this is SDK-driven, you can reliably tie behavior to device tokens for push/in-app, then use email/SMS as fallback when permission or deliverability constraints exist.
  • Segmentation + orchestration: Once events land, you build segments like “Viewed Cart screen in last 2 hours AND no Purchase event” and trigger a workflow that sends push → waits → sends email/SMS if still not converted.

Step-by-Step Setup

The goal is to ship a minimal, correct implementation first: consistent naming, correct identity, and just enough properties to drive retention decisions. You can always enrich later, but if you get identity wrong, you’ll spend months patching journeys with ugly workarounds.

  1. Define your screen taxonomy before writing code.
    Pick canonical names you’ll keep for a year: Home, Collection, Product, Cart, Checkout, OrderConfirmation, Account. Avoid UI-driven names like “PDP_v2” unless you want to rebuild segments every redesign.
  2. Install the Customer.io SDK for your platform.
    Use the native mobile SDK (iOS/Android) or your framework SDK (React Native/Flutter/Expo) and confirm you can send a basic test event to your workspace.
  3. Implement identity correctly (non-negotiable).
    On app launch, initialize with an anonymous identifier (or let the SDK manage it). When you capture a stable customer identifier (email, customer_id) call identify immediately. If you support logout, reset identity so the next user doesn’t inherit prior behavior.
  4. Track a single standardized screen event.
    On every screen impression, send screen_view with screen_name. Add contextual properties only where they matter:
    • Product: product_id, variant_id, price, category
    • Cart: cart_value, item_count, currency
    • Checkout: cart_value, shipping_method (if known)
  5. Validate event volume and naming in Customer.io.
    Make sure you see the event consistently for real navigation (not just initial render). Check that screen_name values match your taxonomy exactly—case and spacing mistakes create “ghost segments.”
  6. Create one retention segment and one trigger to prove the pipe.
    Example: segment = “screen_view where screen_name = Cart in last 60 minutes AND no purchase in last 60 minutes.” Trigger a journey from that segment or directly from the event.

When Should You Use This Feature

Screen tracking matters when the app is the primary shopping surface (or a meaningful repeat channel), and you want to react to intent faster than purchases can tell you. It’s especially useful when your email/SMS program is strong but you’re missing the behavioral signals that make timing and content feel “obvious” to the customer.

  • Cart recovery with push-first: If a customer hits Cart then disappears, you can trigger a push within minutes, then fall back to email/SMS if they don’t return. This consistently outperforms “send cart email 4 hours later” when the app is installed.
  • Browse-based product discovery: Track Product and Collection screens, then follow up with the exact category they browsed. This is how you make “recommendations” feel like continuation, not a blast.
  • Reactivation based on real disengagement: Segment “no screen_view in 30 days” (not just “no purchase”). You’ll catch customers who stopped opening the app even if they still buy occasionally via other channels.
  • Repeat purchase timing: If customers repeatedly visit Account or OrderHistory without purchasing, that’s often a replenishment signal—trigger a reminder with their last purchased items.

Real D2C scenario: A skincare brand sees customers open the app, view a cleanser on the Product screen, then jump to Cart and drop. With screen tracking, you can trigger a 10-minute push: “Still deciding? Here’s how to pair it with your moisturizer,” then an email 2 hours later featuring the exact cleanser + a bundle. Without screen tracking, you’re guessing based on last purchase or generic browse emails.

Operational Considerations

Once the SDK is shipping events, the operational work is making sure the data is usable for segmentation and journeys without constant cleanup. Most teams underestimate how quickly “screen view” becomes noisy if you don’t set conventions and guardrails.

  • Segmentation hygiene: Build segments off a stable event name (screen_view) and filter by screen_name. This keeps your segment library manageable and reduces rework when you add new screens.
  • Identity stitching realities: If customers can browse without logging in, you need a plan for merging anonymous activity at the moment of identification. If you don’t, your cart recovery will miss the highest-intent users—because their cart view happened before you knew who they were.
  • Data flow timing: Screen events are high-volume. If you trigger journeys on every view without throttling, you’ll spam customers and overload your orchestration. Use frequency controls and add “cooldown” logic (e.g., only trigger cart recovery once per 24 hours per user).
  • Orchestration across channels: Treat push/in-app as the fast loop (minutes), and email/SMS as the slower loop (hours). Screen tracking makes that sequencing reliable because you’re reacting to app behavior, not delayed backend events.
  • Property governance: Only track properties you’ll actually use. A bloated payload makes QA harder and increases the odds of inconsistent values that break segments.

Implementation Checklist

If you want this to drive revenue (not just produce prettier dashboards), you need a short checklist that ensures events are consistent, identities are correct, and journeys won’t misfire at scale.

  • Screen taxonomy defined and documented (canonical screen_name values)
  • Customer.io SDK installed and verified in a non-prod environment
  • identify called immediately on login/email capture with a stable customer identifier
  • Anonymous activity merges into the identified profile (validated with a real test flow)
  • screen_view implemented across core commerce screens (Home, Collection, Product, Cart, Checkout, Confirmation)
  • Core properties added only where needed (product/cart context)
  • At least one segment built off screen recency + one triggered journey live
  • Frequency controls/cooldowns in place for high-intent triggers (Cart/Checkout)

Expert Implementation Tips

Once the basics work, these are the moves that make screen tracking actually usable for retention orchestration—especially when multiple teams ship app changes every sprint.

  • Stabilize names, not UI versions: Keep screen_name business-focused. If design ships “Cart v3,” your retention logic shouldn’t change.
  • Track “screen visible,” not “screen mounted”: In mobile frameworks, components can mount without being truly visible. Trigger on actual view/impression to avoid inflated counts and false triggers.
  • Use intent tiers: Treat Product as medium intent, Cart/Checkout as high intent. Your orchestration should reflect that with different delays, incentives, and channel priority.
  • Pair screen events with commerce events: Screen tracking tells you intent; purchase/order events confirm conversion. Use both so journeys exit cleanly and you don’t send “complete your order” after they already bought.
  • QA with real edge cases: Test login mid-session, app reinstall, logout/login as different user, and checkout in a webview. These are the cases that create duplicate profiles and broken attribution.

Common Mistakes to Avoid

Most “screen tracking didn’t work for us” stories come down to a handful of operational failures. Fix these early and your segmentation and recovery flows stay reliable.

  • Creating a different event name per screen: Viewed Cart, Viewed Product, etc. sounds clean until you need to manage 40 events and rebuild segments after every app release. Use one screen_view event with a screen_name property.
  • Not merging anonymous activity: Your highest-intent behavior often happens before identification. If you don’t stitch, you’ll under-trigger cart recovery and over-credit email/SMS to “random” conversions.
  • Over-triggering journeys: Triggering on every Cart view without cooldowns leads to message fatigue fast—especially for customers who comparison-shop and revisit the cart repeatedly.
  • Inconsistent property values: If screen_name is sometimes cart, sometimes Cart, sometimes CartScreen, your segments will silently miss people.
  • Tracking too much, too soon: Shipping dozens of properties before you know how you’ll use them slows QA and increases mismatch across platforms.

Summary

Screen tracking is retention instrumentation: it turns app navigation into reliable intent signals inside Customer.io. If your identity stitching is solid and your naming is consistent, you can trigger faster cart recovery, smarter browse follow-ups, and cleaner reactivation segments. If those two pieces are shaky, everything downstream gets noisy.

Implement Screen Events with Propel

If you’re implementing screen tracking in Customer.io, the fastest path is usually aligning on a screen taxonomy, identity rules, and 2–3 “money journeys” (cart recovery, browse follow-up, reactivation) before engineering ships anything. When you want a second set of operator eyes on your event plan and orchestration logic, book a strategy call—it’s often easier to fix the schema on paper than to unwind broken segments after the app update is live.

Contact us

Get in touch

Our friendly team is always here to chat.

Here’s what we’ll dig into:

Where your lifecycle flows are underperforming and the revenue you’re missing

How AI-driven personalisation can move the needle on retention and LTV

Quick wins your team can action this quarter

Whether Propel AI is the right fit for your brand, stage, and stack