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.
Experiments can use these events as a primary metric. Flow completion and paywall purchase map to flow_completed and iap_purchase. Custom metrics may also require properties.field_key (choice or capture layers) or step_id (screen/surface events) so multi-layer flows stay unambiguous.
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
Capture values from text fields, scale, wheel picker, date/time, number stepper, phone, address, permission requests, and app-review outcomes.
| 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 shown (Integration Node such as RevenueCat or Superwall, or External Surface Node / headless host UI).
| Property | Meaning |
|---|---|
surface_node_id | Integration / External Surface Node id (surf_*) |
provider | e.g. revenuecat, superwall, headless |
offering_id | RevenueCat offering when configured |
placement_id | Superwall placement when configured |
surface_outcome
External surface finished.
| Property | Meaning |
|---|---|
surface_node_id, provider | Same as presented |
outcome | Paywall: purchase_completed, purchase_cancelled, restore_completed, dismissed, failed. Headless: completed, back, 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 a paywall / commerce external surface in the flow.
| Property | Meaning |
|---|---|
provider, surface_node_id, product_id | Commerce context (provider is revenuecat or superwall) |
offering_id, package_id, period_type | Optional partner metadata (RevenueCat offering/package; Superwall may mirror placement as offering_id) |
price, currency | Optional localized store price |
Experiment Paywall purchase primary metrics count distinct users with this event.
Sensitive text redaction
Only text_submitted events participate in field-level redaction:
- Mark capture layers as sensitive in the manifest for PII fields (text, date/time, phone, address, and similar).
- Rheo replaces
properties.valueandproperties.textwith__redacted__for sensitive fields. - Safe fields (scales, permission outcomes, app review outcomes, and other non-PII captures) 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.
Related
- SDK
- Customers & analytics
- Experiments: Primary metric mapping to these events