Summarize this documentation using AI
Overview
If you’re pushing account- or household-level context into Customer.io, “Group” is the pattern that keeps that data organized and usable without wrecking person-level segmentation. If you want a second set of eyes on your identity and event mapping before you scale journeys, you can book a strategy call—most retention issues we see start as data-shape issues, not copy issues.
In practice, Group data matters when a person’s behavior depends on a shared entity: a household, a subscription “account,” a wholesale buyer, a loyalty tier container, or even a “cart” entity that multiple events need to reference consistently.
How It Works
Group is about how data enters Customer.io and how it stays joinable to a person later. The core idea: you send a stable group identifier (like account_id or household_id) and group attributes, then attach people and events to that same group id so segmentation and triggers can reliably “see” the shared context.
- Identity resolution happens in two layers. Person identity still keys off your person identifier (email, customer_id, etc.). Group identity keys off a separate
group_id. You’re not replacing person identity—you’re adding a second anchor. - Group attributes become reusable context. Things like
subscription_status,plan_type,store_credit_balance,vip_tier,household_size, orwholesale_price_listbelong on the group when they’re shared across multiple people. - Events need the same group id to be trustworthy. If “Order Placed” or “Cart Updated” events sometimes include
group_idand sometimes don’t, your segments will look right in spot checks and then fail under load (especially for multi-user accounts). - Segmentation accuracy depends on consistent mapping. The #1 operational win is being able to segment people by group state (e.g., “anyone in an account with an active subscription”) without duplicating that state onto every person profile and constantly fighting drift.
Real D2C scenario: You sell premium supplements where one household account can have multiple shoppers (partners, parents/kids). If you only track person-level attributes, you’ll end up sending “reactivate” to someone who’s inactive personally even though the household is actively ordering. With Group, you can suppress reactivation when group.subscription_status = active and instead run replenishment or cross-sell based on household-level cadence.
Step-by-Step Setup
The cleanest implementations start with a data contract: what is the group, what is the stable id, and which attributes belong to group vs person. Once that’s locked, the Customer.io setup is straightforward.
- Define your Group concept and ID.
Pick one:account_id,household_id,membership_id. It must be immutable (or you need a migration plan). Avoid using email domains, names, or anything that can change. - Decide what belongs on the Group vs the Person.
Group: shared state (plan, status, credit, tier, renewal date). Person: channel permissions, last seen, product preferences, personal LTV. If you put shared state on people, it will drift and break suppression logic. - Send Group updates into Customer.io.
From your source of truth (subscription platform, loyalty system, backend), send group attributes whenever they change. Treat this like “account profile updates,” not events. - Attach people to the Group.
When a person is created/identified, ensure you also associate them to the correctgroup_id. Do this at login, account creation, or first purchase—wherever you have the most reliable mapping. - Include
group_idon relevant events.
Cart, checkout, order, subscription, support events—anything that should be interpreted in account context. Consistency matters more than volume. - Validate in Customer.io with a segmentation sanity check.
Build a segment like “People where group plan_type = X” and spot-check 10–20 known accounts. Then verify event-triggered journeys pull the expected group attributes at send time. - Harden your orchestration rules.
Add guardrails: suppress reactivation if group is active; suppress cart recovery if group has a completed order in last N hours; route offers by group tier.
When Should You Use This Feature
Group is worth the effort when person-level data alone causes your retention automations to send the right message to the wrong customer. That usually shows up once you have shared purchasing behavior, shared entitlements, or multiple identities per “real” customer.
- Household purchasing patterns. One household reorders frequently, but different people place the orders—Group keeps replenishment logic accurate.
- Membership/subscription accounts. Plan status and renewal dates should live at the account level so winback doesn’t fire for active accounts.
- Wholesale / B2B-lite D2C. Multiple buyers under one retailer account; promotions and reorder reminders should respect account pricing and terms.
- Loyalty tiers and shared balances. If store credit or tier is shared, putting it on the person will constantly desync and cause “VIP” messaging to leak.
- Cart recovery with shared carts or devices. If multiple people can touch the same cart, group/cart context prevents duplicate or conflicting recovery flows.
Operational Considerations
This is where most teams get burned: the feature is simple, but the data flow and orchestration realities aren’t. If you want reliable triggers, you need to treat Group as part of your identity graph—not just extra fields.
- Segmentation: avoid attribute drift. In most retention programs, we’ve seen “account status” copied onto people for convenience, then it diverges. Keep shared truth on the group and reference it in segments.
- Data freshness: define your SLA. If group status updates lag (e.g., subscription cancelled but group still shows active for 6 hours), your winback and renewal journeys will misfire. Decide what “real-time enough” means and instrument accordingly.
- Event reliability: enforce group_id presence. If only some events include group context, you’ll build journeys that work in QA and fail in production edge cases. Add validation in your tracking layer.
- Orchestration: choose the source of truth. Don’t let Shopify, Recharge, and your backend all “own” the same group attributes. Pick one system to write each field; everyone else reads.
- Backfills and migrations. If you’re introducing Group after you’ve already been sending person-only data, plan a backfill so your segments don’t split into “new accounts with group” and “legacy accounts without group.”
Implementation Checklist
Before you build journeys on top of Group, lock these basics so your segments and triggers don’t turn into a weekly debugging project.
- Group ID is stable, unique, and present in your core systems
- Clear mapping: which attributes live on Group vs Person (written down)
- Group updates fire on change (not just nightly) for critical fields like status/tier
- Person-to-group association is set at login/signup/purchase consistently
- Key events include
group_id(checkout started, order placed, subscription updated, etc.) - Segments validate correctly against known accounts (spot checks)
- Journey entry/exit rules reference group state where appropriate (suppression + routing)
Expert Implementation Tips
Once Group is in, the biggest lift is making it operationally boring—meaning nobody has to think about it when launching a new retention flow.
- Use Group for suppression first, not targeting. The fastest ROI is stopping bad sends (reactivation to active accounts, discounting VIPs unnecessarily). Then expand into targeting.
- Version your tracking schema. If you change
plan_typevalues or renameaccount_status, you’ll silently break segments. Keep a lightweight schema doc and change log. - Prefer “state attributes” on Group over “state events.” For segmentation, it’s easier to ask “group status = cancelled” than to reconstruct state from a chain of events.
- Build a QA segment for missing group_id. Create a segment like “people with event X in last 7 days where group_id is missing” (or the closest equivalent in your setup). In practice, this catches tracking regressions early.
Common Mistakes to Avoid
Most failures aren’t about Customer.io—they’re about inconsistent data entering Customer.io and then being used as if it were consistent.
- Using a mutable group identifier. If the id changes, you’ll fragment history and your triggers will behave like you have multiple accounts.
- Duplicating group attributes onto people. This creates drift and conflicting logic (“person says cancelled, group says active”). Pick one place.
- Sending group updates too infrequently. Nightly syncs are usually fine for reporting, not for cart recovery, renewal reminders, or winback suppression.
- Forgetting to include group_id on events. Your journeys will trigger, but personalization and branching will be wrong—especially on multi-user accounts.
- No backfill plan. Your segments will exclude legacy customers and you’ll think the feature “doesn’t work,” when it’s just incomplete coverage.
Summary
If your retention program depends on shared state (households, accounts, subscriptions, tiers), Group is the difference between “mostly right” and operationally reliable. Get the ID stable, keep shared attributes on the group, and enforce group_id on events. Then build suppression and routing on top.
Implement Group Spec with Propel
When we help teams implement Group cleanly, the work is usually less about wiring and more about preventing downstream segmentation drift and trigger misfires. If you’re setting up Group (or cleaning up an existing identity mess) inside Customer.io, you can book a strategy call—we’ll pressure-test your group/person mapping, event coverage, and the first few segments you plan to operationalize.