Summarize this documentation using AI
Overview
If you’re running mobile push through Customer.io, Android notification channels are one of those “set it once, benefit forever” pieces of infrastructure—when they’re done right. If you want a second set of eyes on your tracking + channel taxonomy before you scale cart recovery and winback, you can book a strategy call and we’ll pressure-test the setup like an operator would.
Android channels control how notifications behave on-device (sound, vibration, importance) and—more importantly for retention—how customers can mute/disable specific categories of messages. That means your channel design directly impacts deliverability for high-intent flows like abandoned cart and replenishment reminders.
How It Works
On Android (8.0+), every push notification must be assigned to a notification channel. The app defines channels at install/runtime, and the user can later manage those channels in OS settings (turn off “Promotions” but keep “Order Updates,” for example). In Customer.io, you’ll typically map message types to a stable channel ID so the SDK can post the notification into the right bucket.
- The app creates channels with an ID, name, and importance (plus sound/vibration settings). Once created, most channel properties can’t be changed programmatically—Android expects you to create a new channel ID if you need a materially different behavior.
- Customer.io sends a push payload that includes (or is mapped to) a channel ID. The Android SDK uses that channel ID when displaying the notification.
- Identity stitching matters: pushes are delivered to devices, but retention logic is driven by people. Your SDK
identify()call is what connects device tokens + events to the right person profile, so channel-level reporting and suppression logic doesn’t get messy. - Event tracking drives orchestration: channel design is only useful if your app events accurately distinguish intent (e.g.,
cart_viewedvscheckout_startedvspurchase_completed), so you can route the right push into the right channel.
Step-by-Step Setup
Most teams get tripped up because they treat channels like a creative decision (“Promos vs Updates”) instead of a systems decision (“What do we need to protect, measure, and scale?”). Set your channel taxonomy first, then wire the SDK so it’s deterministic.
- Define your channel taxonomy (keep it tight)
- Transactional (order/shipping/payment): highest importance, protected from promo noise.
- Cart & checkout recovery: high importance, but separate from transactional so users can manage it independently.
- Promotions / product discovery: default importance; expect higher opt-outs.
- Reactivation / winback: typically same as promos unless you have a reason to isolate.
- Create Android notification channels in the app
- Create channels on app start (or before first notification) using stable channel IDs (e.g.,
txn,cart,promo). - Choose importance based on business criticality. If you overuse “high importance,” users will disable you globally.
- Document channel IDs in your retention spec so marketing and engineering aren’t guessing later.
- Create channels on app start (or before first notification) using stable channel IDs (e.g.,
- Install and initialize the Customer.io Android SDK
- Initialize the SDK early in the app lifecycle so device registration and push handling are consistent.
- Confirm push token registration is flowing into Customer.io (device appears on the person profile after identify).
- Implement identity stitching with
identify()- Call
identify(customerId)immediately after login/account creation. - If you support guest checkout or browsing, track anonymous events and then merge by identifying once the user authenticates—otherwise cart recovery audiences will fragment across anonymous profiles.
- Send key attributes at identify time (e.g.,
email,phone,first_order_date,last_order_date,push_opt_inif you maintain it).
- Call
- Track the events that power retention routing
product_viewed(includesku,category)add_to_cart(includesku,qty,cart_value)checkout_started(includecart_value,items)purchase_completed(includeorder_id,revenue,items)push_permission_changed(if you can detect it) to keep suppression/expectations clean
- Map message types to channel IDs in your push payload strategy
- Decide how Customer.io messages will specify the channel (commonly via a payload field that your app reads, or via SDK support for channel routing).
- Keep the mapping deterministic: “cart recovery” always uses
cart. Don’t let individual campaigns invent new channel IDs.
- QA like a retention team, not just like engineering
- Disable the “promo” channel in Android settings and confirm transactional still delivers.
- Run a full cart scenario: add to cart → wait → receive cart push → purchase → confirm the user exits recovery flows.
- Confirm events land on the identified profile (not an anonymous duplicate).
When Should You Use This Feature
Channels matter most when you’re sending multiple types of push and you care about protecting high-intent revenue flows from being muted by promo fatigue. In most retention programs, we’ve seen push performance fall off a cliff when everything ships through one generic channel and users just turn it all off.
- Cart abandonment on mobile: Route cart recovery pushes into a dedicated
cartchannel so users can keep it on even if they mute promos. - Replenishment / repeat purchase: If you sell consumables (protein, skincare, coffee), replenishment reminders belong in a channel that isn’t competing with daily promo blasts.
- Order lifecycle trust: Transactional updates should always be isolated. If a customer disables promos, you still want shipping and delivery notifications to land.
- Winback for lapsed buyers: Channels won’t magically fix winback, but they prevent your winback pushes from being collateral damage when promo fatigue sets in.
Operational Considerations
Channels are a product decision with retention consequences. Once you ship them, changing behavior later is painful because Android treats channel settings as user-owned. Plan for segmentation and orchestration realities up front.
- Segmentation: Don’t just segment by “has device.” Segment by permission + engagement (e.g., push-enabled AND opened app in 30 days AND not purchased in 45 days). Channels help, but targeting still does the heavy lifting.
- Data flow: Your app defines channels; Customer.io triggers messages. If the app doesn’t recognize a channel ID in the payload, notifications can fail or fall back unpredictably (depends on your implementation). Keep a single source of truth for channel IDs.
- Identity stitching: In practice, this tends to break when guest users generate cart events, then later log in and buy—if you don’t merge/identify cleanly, you’ll keep sending cart pushes after purchase because the purchase landed on a different profile.
- Orchestration: Use purchase events as hard exits for recovery. Also consider “soft exits” like
checkout_startedso you’re not nagging someone who is actively converting. - Frequency pressure: If promos are too frequent, users disable the promo channel—and sometimes the whole app’s notifications. Channel separation reduces blast radius, but it’s not an excuse to over-send.
Implementation Checklist
If you want this to hold up over time (new campaigns, new agencies, new engineers), treat the checklist like release criteria. It’s easier to be strict now than to unwind channel chaos later.
- Android channel IDs are defined and documented (stable, human-readable, not campaign-specific).
- Channels are created on app start (or before first notification) for Android 8.0+ devices.
- Customer.io Android SDK is initialized early and consistently across app entry points.
identify()is called immediately after authentication, with key attributes.- Core commerce events are tracked with consistent naming and required properties.
- Push payload/channel mapping is deterministic (message type → channel ID).
- QA covers: channel disabled scenarios, identity merge scenario, and purchase exit scenario.
Expert Implementation Tips
The difference between “we have channels” and “channels improved retention” is usually operational discipline: stable IDs, strict routing, and clean identity.
- Keep channels to 3–5 max. Every extra channel is another place users can mute you—and another thing your team has to remember when building campaigns.
- Reserve high importance for true urgency. Cart recovery can be high importance if it’s time-sensitive, but promos rarely deserve it.
- Make cart recovery smarter with app-side signals: track
cart_updatedandcart_cleared. If someone removes the item, stop the sequence—don’t rely on timeouts. - Stitch identity before you fire intent events when possible. If a logged-in user adds to cart, make sure identify already happened; otherwise you’ll “lose” the event onto an anonymous profile.
- Use a single event schema across platforms (iOS/Android/Web). It makes Customer.io segmentation and reporting far less brittle.
Common Mistakes to Avoid
Most push programs don’t fail because of copy—they fail because the plumbing creates bad audiences or trains users to mute notifications. These are the patterns that show up repeatedly.
- One mega-channel for everything: users disable it after a promo streak, and your cart + order pushes die with it.
- Changing channel behavior without changing channel ID: Android won’t reliably apply changes; you end up thinking you fixed it when users still have old settings.
- Campaigns inventing new channel IDs: creates fragmentation and unpredictable delivery when the app doesn’t pre-create the channel.
- Not exiting flows on purchase: the classic “you forgot something” push after someone already checked out—guaranteed trust erosion.
- Broken identify(): pushes go to devices, but events go to the wrong profile, so suppression, frequency, and conversion attribution all become suspect.
Summary
If push is a meaningful revenue lever for your D2C brand, Android notification channels are foundational. Set a tight channel taxonomy, stitch identity cleanly with the SDK, and route message types deterministically so cart recovery and repeat purchase flows stay protected as you scale.
Implement Push Notification Channel with Propel
If you’re already running push in Customer.io, the highest-leverage work is usually tightening the SDK layer: clean identify(), consistent commerce events, and a channel map that won’t collapse when you add new campaigns. If you want an operator-style review of your current Android implementation (and how it impacts cart recovery and repeat purchase), book a strategy call and we’ll walk through the specifics.