Rheo
Diagram of in-app events triggering email and push lifecycle journeys
Product

Lifecycle email and push from in-app events (without a separate CRM sync)

Trigger Rheo Engage journeys from SDK events and segments. Use email, push, and webhooks without nightly CRM imports or duplicate user lists.

The default lifecycle stack looks like this: product analytics in one tool, user lists in Customer.io or Braze, and a nightly CSV or Zapier job that tries to keep trial_started in sync with last_seen_at. It works until it does not: duplicate profiles, six-hour lag, and automations that fire after the user already converted.

Subscription teams feel this most on behavioral triggers: stalled onboarding, paywall abandon, trial day three with no core action. Those signals live in the app now. They should not wait for a warehouse export.

Rheo Engage runs lifecycle email, push, and webhooks from the same SDK events and segments that power Analytics and Convert. No separate CRM sync is required for the common case: define the segment on journey behavior, attach the automation, respect marketing consent. This post explains the model, channels, and how it complements RevenueCat: not replaces your billing source of truth.

Why CRM sync breaks on mobile subscription apps

Sync patternFailure mode
Nightly warehouse → CRMUser converts at 9am; email at 9pm says "finish trial"
Duplicate identitiesAnonymous install vs email account
Property drifttrial_end in CRM ≠ RevenueCat
Engineering bottleneckEvery new trigger needs ETL

Event-triggered lifecycle flips the direction: the app (and server hooks) emit facts; Engage reacts.

The Rheo model: events → segments → automations

  1. SDK events: onboarding_step_completed, paywall_viewed, feature_used, custom milestones.
  2. Segments: rules like "completed step 1-2 but not 3 within 48h" or "trial active AND no core_action."
  3. Engage automations: enter segment → send email / push / webhook → exit on conversion or timeout.
  4. Revenue hooks: optional RevenueCat webhooks to align subscription_status on the profile.

Segments update from live behavior, not yesterday's batch.

Onboarding flow

Channels: email, push, webhooks

Email

Best for narrative, links to web checkout, and users who disabled push. Use for:

  • Trial education sequences branched on in-app progress
  • Win-back after voluntary cancel (paired with in-app: see email vs in-app win-back)
  • Payment failed instructions with clear CTA

Configure templates in Rheo; track opens/clicks where supported. Suppress sends when marketing consent is off.

Push

Best for time-sensitive nudges: "Finish setup," "Trial ends tomorrow." Requires OS permission; treat promotional pushes as marketing consent in regulated markets.

Pair push with in-app Convert flows: push opens app → remote onboarding or paywall variant loads without release.

Webhooks

Best for ops and mixed stacks:

  • Slack alert when high-LTV user hits cancel flow
  • Enrich Zendesk when user files bug after NPS detractor score
  • Fan-out to data warehouse if finance wants a copy

Webhooks fire on the same triggers as email: useful when legal wants email in one system but product events stay in Rheo.

ChannelLatencyReach after uninstallRich UI
EmailMinutesYes (if address)Low
PushSecondsNoNotification only
WebhookSecondsN/AYour handler
In-app (Convert)Instant on openNoHigh

Engage plus Convert covers notify and show without a CRM sync.

Example automations (no sync required)

Trigger (event / segment)EmailPushWebhook
paywall_viewed + no trial_started 24hValue recapShort nudge:
Onboarding stall step 3Tips email"Pick up where you left off":
trial_started + no aha_event 72hFeature guideFeature highlightCS Slack
RC CANCELLATION + reason priceOffer email:CRM note
payment_failedUpdate card linkUrgent bannerBilling queue

RevenueCat remains authoritative for billing; Rheo reacts to webhook-enriched profile state and in-app behavior in one place.

Compared to Customer.io / Braze

ApproachCRM-led (Customer.io, Braze)Event-triggered Engage on Rheo
Profile sourceImported users + attributesSDK + optional RC webhooks
Behavioral triggersNeeds sync or API callsNative segments on events
In-app flowsDeep links; limited remote UIShared Convert flows
Best whenMature marketing org, many channelsEvents already in Rheo SDK

Many teams keep Customer.io for newsletter-grade programs and use Rheo Engage for product-native triggers: not because one must win, but because sync cost hurts most on real-time behavior.

Implementation checklist

  1. Instrument milestones: same events for Analytics funnels and Engage segments.
  2. Identity: merge anonymous → account early so automations do not double-send.
  3. Marketing consent: gate promotional email/push; see consent-first analytics.
  4. Exit conditions: always define "user converted" to leave the journey (trial_started, subscription_active).
  5. Rate limits: cap emails per week; churned users need fewer touches, not more.
  6. Test users: dashboard preview to a segment of internal accounts.

Honest limits

  • Engage is not a full CDP for every ad network and SMS vendor at enterprise scale.
  • Complex branching across twelve channels may still belong in Braze if you already pay for implementation depth.
  • Transactional email (password reset) should stay on your auth provider.

Where Rheo fits: subscription apps that already ship Convert flows and want lifecycle on the same events without a nightly job.

Stack picture

LayerTool examples
BillingRevenueCat, Stripe
PaywallsSuperwall
Analytics (optional second tool)PostHog, Mixpanel
Journeys + lifecycleRheo Convert + Engage

Debugging automations that feel "late" or "wrong"

When a lifecycle message misfires, the bug is usually identity or exit rules: not the template.

SymptomLikely causeFix
Email after user already subscribedExit event not wired from RC webhookAdd subscription_active exit on webhook
Duplicate emailsAnonymous + identified profilesMerge on signup; dedupe segment
Push never sendsMarketing consent false or no tokenCheck consent flag and FCM/APNs registration
Webhook stormsRetry without idempotency keyHash user_id + automation_id + day
Segment always emptyEvent name typo vs dashboardAlign SDK event catalog with Engage rules

Log a single automation_decision event in development (entered, suppressed_consent, exited_converted) so support can trace one user without reading raw queues.

Rolling out without spamming your best users

Ship lifecycle in layers:

  1. Internal accounts only for 48 hours.
  2. 5% of new trials for onboarding automations.
  3. Full rollout after unsubscribe rate stays flat week over week.

Keep a global frequency cap: no more than three promotional emails and two promotional pushes per rolling seven days unless the user is in payment-failed utility mode.

Engage sits closest to Convert in the stack because both read the same behavioral stream: billing and paywalls stay in RevenueCat and Superwall.

Start for free and attach your first Engage automation to an in-app segment: email, push, or webhook: from the dashboard.