Summarize this documentation using AI
Overview
If you’re running retention on mobile, Android notification channels are one of those “set it once or regret it later” pieces—because they directly affect whether customers ever see your pushes. With Customer.io, channels become the backbone for controlling importance, sound, and user-facing categories (like “Orders” vs “Promos”) so cart recovery and winback pushes don’t get muted into oblivion. If you want a second set of eyes on your tracking + push setup before you scale spend, book a strategy call.
In most retention programs, we’ve seen Android push performance get blamed on creative or timing when the real issue was channel configuration: everything shipped under one low-importance channel, or channels renamed midstream so users stayed subscribed to the “old” channel and never saw the “new” one.
How It Works
On Android 8.0+ (API 26+), every push notification must be posted to a notification channel. The channel defines the behavior users can control at the OS level—importance, sound, vibration, lock screen visibility. Once a channel is created on a device, Android treats it as user-owned: you can’t reliably change certain behaviors later, and deleting/renaming creates fragmentation.
- Customer.io sends the push (via your configured push provider), and your app receives it through the Android push plumbing (FCM) and the Customer.io SDK handler.
- Your app decides the channel for the notification at display time. Practically, that means you either:
- set a default channel for all pushes, or
- map different message types to specific channels (recommended for retention).
- Identity stitching matters: the SDK needs a stable
identify()call so the device token and push permission state attach to the right customer profile in Customer.io. If you delay identify until after purchase, your cart recovery pushes often target a profile with no device attached.
Real D2C scenario: a customer adds a serum to cart in your app, bounces, then gets a push 45 minutes later. If that push lands in a “Promotions” channel the customer muted weeks ago, you’ll see “sent” in Customer.io but no revenue lift. Splitting “Orders & Shipping” (high importance) from “Promos” (default) keeps transactional retention (delivery, back-in-stock, replenishment reminders) from getting buried.
Step-by-Step Setup
Do the channel work before you build journeys. Otherwise you’ll end up debugging “why didn’t this push convert?” when the OS never surfaced it. The goal is: channels created deterministically, channel IDs never change, and the SDK always has the right identity tied to the device.
- Install and initialize the Customer.io Android SDK Initialize the SDK early in your app lifecycle (typically in
Application.onCreate()) so device registration and push handling work consistently across sessions. - Implement identity stitching with
identify()Callidentify(customerId)as soon as you have a durable user ID (login, account creation, or even “continue as guest” if you generate a stable app user ID). Then update attributes (email, phone, timezone) as they become available. - Operator note: if you wait until checkout to identify, your highest-intent window (browse/cart) won’t have a reachable device on the right profile.
- Create your Android notification channels in-app On Android 8.0+, create channels via
NotificationManager. Use stable, versioned channel IDs (IDs are the permanent key; the user-facing name/description can evolve).- Recommended minimum set for D2C:
orders(high importance): shipping updates, delivery confirmations, payment issuesproduct_alerts(default/high): back-in-stock, price drop, replenishmentpromotions(default/low): campaigns, launches, bundles
- Do not rename IDs after release. If you must change behavior, create a new ID (e.g.,
promotions_v2) and migrate intentionally.
- Recommended minimum set for D2C:
- Decide how pushes map to channels Pick one approach and standardize it with your engineering team:
- Default channel: simplest, but you lose control (cart recovery and shipping updates compete in the same bucket).
- Channel-per-message-type: best for retention. Your app reads a payload key (like
channel_id) and posts the notification to that channel.
- Track the events that power retention Channels don’t matter if your targeting is wrong. Track clean, app-side events so Customer.io can segment and trigger accurately:
Product Viewed(withsku,category,price)Added to Cart(withsku,qty,cart_value)Checkout StartedOrder Placed(server-confirmed if possible)Push Permission/Notification Opt-Instate changes (so you can suppress or reroute)
- Validate end-to-end Send a test push for each channel to a real device, then confirm:
- the notification appears under the intended Android system category
- importance/sound behave as expected
- the device is attached to the correct Customer.io profile (post-
identify())
When Should You Use This Feature
If push is a meaningful revenue channel for your app, Android channels are not optional—they’re how you protect deliverability and keep customers from muting the messages that actually drive repeat purchase.
- Cart recovery on mobile when you need “Promos” separated from higher-intent nudges (and you want to tune importance without risking order updates).
- Reactivation for lapsed buyers where you want winback offers in a lower-importance channel, while keeping back-in-stock alerts more visible.
- Post-purchase retention (delivery confirmation → review request → replenishment) where “Orders” should stay high-visibility even if promos get muted.
- Product alerts (back-in-stock/price drop) where customers explicitly want the message, and you don’t want it treated like generic marketing.
Operational Considerations
Channels look like an engineering detail, but they change how you segment, orchestrate, and interpret performance in Customer.io. Treat them like part of your data model.
- Segmentation reality: Customer.io segments won’t automatically know which Android channel a user muted. Plan for performance variance by channel and consider tracking an in-app preference center event (e.g.,
Notification Preferences Updated) to mirror user choices into profile attributes. - Data flow: ensure device registration happens after SDK init and before you expect to send cart recovery. In practice, this tends to break when identify happens late or gets skipped on “guest” sessions.
- Orchestration: build journeys assuming some users will only accept “Orders” notifications. Route promotional winbacks to email/SMS for users who opted out of promo pushes, but keep product alerts eligible if they’re still enabled.
- Channel permanence: once created, you can’t reliably downgrade/upgrade behavior for existing users. If you need to change importance, create a new channel ID and migrate messaging intentionally.
Implementation Checklist
Before you declare push “done,” lock these in. This is the difference between a push program that scales and one that slowly decays as installs accumulate.
- Customer.io Android SDK installed and initialized early (Application level)
identify()called with a stable customer ID; attributes updated as they become available- Notification channels created on Android 8.0+ with stable IDs (no renames)
- Clear mapping from message type → channel ID (documented for marketing + engineering)
- Core retention events tracked app-side (view, add to cart, checkout start) with consistent properties
- QA on real devices for each channel’s importance/sound/visibility
- Fallback routing planned for users who disable promo notifications
Expert Implementation Tips
These are the small decisions that keep your retention metrics trustworthy and your push volume sustainable.
- Version channel IDs, not names. Keep
promotionsas an ID forever; change the display name if needed. If you must change behavior, createpromotions_v2and migrate gradually. - Don’t put cart recovery in the same channel as broad promos. Cart recovery is “high intent marketing”—it gets muted when it shares a channel with daily offers.
- Identify early, then stitch. If you have anonymous browsing, generate a stable app user ID and later alias/merge to the logged-in ID so pre-login cart events still power journeys.
- Track opt-in state as an event and an attribute. Events help with auditing; attributes help with segmentation and suppression.
- Use deep links consistently. Push clicks should land on the exact cart/product screen. Track
Push Clickedwith campaign metadata so you can separate “delivery” clicks from “promo” clicks.
Common Mistakes to Avoid
Most push programs don’t fail loudly—they just underperform while dashboards look “fine.” These are the usual culprits.
- Shipping everything through one default channel. Users mute it once, and you lose both promos and high-value alerts.
- Renaming channel IDs after launch. Existing users stay subscribed to the old channel; new users get the new one; reporting becomes impossible.
- Late or inconsistent
identify()calls. Device tokens attach to the wrong profile, so Customer.io sends to a profile with no device (or the wrong person). - Relying only on “sent” metrics. If Android suppresses notifications due to channel settings, you’ll see sends without real visibility.
- Not standardizing event schemas. “AddedToCart” vs “Add To Cart” across app versions breaks segments and triggers at the worst time (like a launch).
Summary
If Android push is part of your retention engine, channels are how you protect visibility and keep intent-based messaging from getting muted. Create stable channel IDs, map message types deliberately, and stitch identity early so Customer.io targets the right device. If you’re scaling cart recovery, winback, or replenishment, this setup pays back fast.
Implement Push Notification Channel with Propel
If you’re already building on Customer.io, the fastest path is usually aligning three things at once: SDK identity stitching, a clean event taxonomy, and a channel strategy that matches your retention motions (cart, post-purchase, winback). When those three line up, your journeys get simpler and your push performance becomes a lot more predictable.
If you want help pressure-testing your Android channel plan against your actual campaigns (and making sure your app events support the segmentation you need), book a strategy call.