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
| Field | Description |
|---|---|
| Event id | Unique id per event |
| Timestamp | When the event occurred (UTC) |
| Flow + version | Which flow revision was running |
| Experiment + variant | Set when the channel runs an A/B test |
| Step id | Current screen (or external surface for paywall events) |
| App user id | Stable SDK user id you provide |
| Custom user id | Optional CRM/backend id |
| Session id | Per-launch session |
| Platform | ios, android, or web |
| Locale, app version | Optional host metadata |
| Custom properties | Arbitrary key-value from SDK config |
| Properties | Event-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).
| Property | When |
|---|---|
field_key | Manual-submit input on screen |
empty_capture | true when navigating away without capture |
step_skipped
Emitted on explicit skip action.
| Property | When |
|---|---|
field_key, empty_capture | Same as step_completed for manual-submit screens |
choice_selected
One event per choice (multi-select emits multiple).
| Property | Meaning |
|---|---|
field_key | Input layer field key |
value | Choice option id |
text_submitted
Text, scale, permission, and app-review capture values.
| Property | Meaning |
|---|---|
field_key | Capture key |
value | String 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.
| Property | Meaning |
|---|---|
responseCount | Number of captured answers in completion map |
flow_abandoned
User abandon, host abandon(), or provider unmount while still running.
| Property | Meaning |
|---|---|
stepId | Last screen id (when available) |
decision_evaluated
Branch taken at a decision node.
| Property | Meaning |
|---|---|
decision_node_id | Decision node id |
matched_case_id | Case id or null for else branch |
used_else_branch | Whether the else branch ran |
clause_digest | Stable hash of evaluated clause |
external_link_opened
Hyperlink layer tap (https only for host extraction).
| Property | Meaning |
|---|---|
layerId | Layer id |
hrefScheme | URL scheme |
linkHost | Host when scheme is https |
surface_presented
External surface (e.g. RevenueCat paywall) shown.
| Property | Meaning |
|---|---|
surface_node_id | External surface node id |
provider | e.g. revenuecat |
offering_id | RevenueCat offering when configured |
surface_outcome
External surface finished.
| Property | Meaning |
|---|---|
surface_node_id, provider | Same as presented |
outcome | e.g. purchase_completed, dismissed, failed |
app_review_prompt_shown / app_review_prompt_dismissed
In-app review button flow (iOS ~1.5s delay semantics).
| Property | Meaning |
|---|---|
layer_id | Button layer id |
attribution_context_observed
Once per attribution provider when merged SDK attributes first expose that source (integration health).
| Property | Meaning |
|---|---|
attribution_provider | Normalized provider id |
iap_purchase
Successful in-app purchase from an external surface.
| Property | Meaning |
|---|---|
provider, surface_node_id, product_id | Commerce context |
offering_id, package_id, period_type | Optional RevenueCat metadata |
price, currency | Optional localized store price |
Sensitive text redaction
Only text_submitted events participate in field-level redaction:
- Mark text inputs as sensitive in the manifest for PII fields.
- Rheo replaces
properties.valueandproperties.textwith__redacted__for sensitive fields. - 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.