
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 pattern | Failure mode |
|---|---|
| Nightly warehouse → CRM | User converts at 9am; email at 9pm says "finish trial" |
| Duplicate identities | Anonymous install vs email account |
| Property drift | trial_end in CRM ≠ RevenueCat |
| Engineering bottleneck | Every 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
- SDK events:
onboarding_step_completed,paywall_viewed,feature_used, custom milestones. - Segments: rules like "completed step 1-2 but not 3 within 48h" or "trial active AND no
core_action." - Engage automations: enter segment → send email / push / webhook → exit on conversion or timeout.
- Revenue hooks: optional RevenueCat webhooks to align
subscription_statuson the profile.
Segments update from live behavior, not yesterday's batch.
Channels: email, push, webhooks
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.
| Channel | Latency | Reach after uninstall | Rich UI |
|---|---|---|---|
| Minutes | Yes (if address) | Low | |
| Push | Seconds | No | Notification only |
| Webhook | Seconds | N/A | Your handler |
| In-app (Convert) | Instant on open | No | High |
Engage plus Convert covers notify and show without a CRM sync.
Example automations (no sync required)
| Trigger (event / segment) | Push | Webhook | |
|---|---|---|---|
paywall_viewed + no trial_started 24h | Value recap | Short nudge | : |
| Onboarding stall step 3 | Tips email | "Pick up where you left off" | : |
trial_started + no aha_event 72h | Feature guide | Feature highlight | CS Slack |
RC CANCELLATION + reason price | Offer email | : | CRM note |
payment_failed | Update card link | Urgent banner | Billing 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
| Approach | CRM-led (Customer.io, Braze) | Event-triggered Engage on Rheo |
|---|---|---|
| Profile source | Imported users + attributes | SDK + optional RC webhooks |
| Behavioral triggers | Needs sync or API calls | Native segments on events |
| In-app flows | Deep links; limited remote UI | Shared Convert flows |
| Best when | Mature marketing org, many channels | Events 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
- Instrument milestones: same events for Analytics funnels and Engage segments.
- Identity: merge anonymous → account early so automations do not double-send.
- Marketing consent: gate promotional email/push; see consent-first analytics.
- Exit conditions: always define "user converted" to leave the journey (
trial_started,subscription_active). - Rate limits: cap emails per week; churned users need fewer touches, not more.
- 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
| Layer | Tool examples |
|---|---|
| Billing | RevenueCat, Stripe |
| Paywalls | Superwall |
| Analytics (optional second tool) | PostHog, Mixpanel |
| Journeys + lifecycle | Rheo 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.
| Symptom | Likely cause | Fix |
|---|---|---|
| Email after user already subscribed | Exit event not wired from RC webhook | Add subscription_active exit on webhook |
| Duplicate emails | Anonymous + identified profiles | Merge on signup; dedupe segment |
| Push never sends | Marketing consent false or no token | Check consent flag and FCM/APNs registration |
| Webhook storms | Retry without idempotency key | Hash user_id + automation_id + day |
| Segment always empty | Event name typo vs dashboard | Align 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:
- Internal accounts only for 48 hours.
- 5% of new trials for onboarding automations.
- 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.