Rheo documentation
Developer Guide

Event catalog

SDK analytics event names, properties, and sensitive text redaction.

Purpose

Mobile SDKs emit a closed set of analytics events that power flow funnels, experiment stats, customer timelines, and response breakdowns in the dashboard. This page lists every event name, what triggers it, and which properties you can expect.

Events are batched automatically by the SDK—you do not call these APIs directly.

Common fields on every event

FieldDescription
Event idUnique id per event
TimestampWhen the event occurred (UTC)
Flow + versionWhich flow revision was running
Experiment + variantSet when the channel runs an A/B test
Step idCurrent screen (or external surface for paywall events)
App user idStable SDK user id you provide
Custom user idOptional CRM/backend id
Session idPer-launch session
Platformios, android, or web
Locale, app versionOptional host metadata
Custom propertiesArbitrary key-value from SDK config
PropertiesEvent-specific payload (when applicable)

Event reference

flow_started

Emitted once when resolve succeeds and the runtime starts.

No extra properties.

step_viewed

Emitted when the current screen changes.

No extra properties.

step_completed

Emitted when leaving a screen forward (not skip, not OAuth failure without advance).

PropertyWhen
field_keyManual-submit input on screen
empty_capturetrue when navigating away without capture

step_skipped

Emitted on explicit skip action.

PropertyWhen
field_key, empty_captureSame as step_completed for manual-submit screens

choice_selected

One event per choice (multi-select emits multiple).

PropertyMeaning
field_keyInput layer field key
valueChoice option id

text_submitted

Text, scale, permission, and app-review capture values.

PropertyMeaning
field_keyCapture key
valueString value (redacted server-side when sensitive)

Mark PII fields as sensitive in the manifest; Rheo replaces values with __redacted__ before storage.

flow_completed

Terminal success.

PropertyMeaning
responseCountNumber of captured answers in completion map

flow_abandoned

User abandon, host abandon(), or provider unmount while still running.

PropertyMeaning
stepIdLast screen id (when available)

decision_evaluated

Branch taken at a decision node.

PropertyMeaning
decision_node_idDecision node id
matched_case_idCase id or null for else branch
used_else_branchWhether the else branch ran
clause_digestStable hash of evaluated clause

Hyperlink layer tap (https only for host extraction).

PropertyMeaning
layerIdLayer id
hrefSchemeURL scheme
linkHostHost when scheme is https

surface_presented

External surface (e.g. RevenueCat paywall) shown.

PropertyMeaning
surface_node_idExternal surface node id
providere.g. revenuecat
offering_idRevenueCat offering when configured

surface_outcome

External surface finished.

PropertyMeaning
surface_node_id, providerSame as presented
outcomee.g. purchase_completed, dismissed, failed

app_review_prompt_shown / app_review_prompt_dismissed

In-app review button flow (iOS ~1.5s delay semantics).

PropertyMeaning
layer_idButton layer id

attribution_context_observed

Once per attribution provider when merged SDK attributes first expose that source (integration health).

PropertyMeaning
attribution_providerNormalized provider id

iap_purchase

Successful in-app purchase from an external surface.

PropertyMeaning
provider, surface_node_id, product_idCommerce context
offering_id, package_id, period_typeOptional RevenueCat metadata
price, currencyOptional localized store price

Sensitive text redaction

Only text_submitted events participate in field-level redaction:

  1. Mark text inputs as sensitive in the manifest for PII fields.
  2. Rheo replaces properties.value and properties.text with __redacted__ for sensitive fields.
  3. Safe fields (scales, permission outcomes, app review outcomes) store literal values.

OAuth and email-password values never appear in analytics events or terminal answers — see Authentication layers.

Delivery semantics

  • The SDK batches 1–500 events per upload; one channel per batch.
  • Blocked workspaces (usage limit or billing suspended) reject events before ingest.
  • Accepted batches may not appear in analytics instantly if backend ingestion is delayed—see SDK troubleshooting.