> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getflowpilot.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Event taxonomy

> The analytics events FlowPilot emits, what each means, and how they map to dashboard metrics.

FlowPilot emits a fixed set of analytics events. Each one is an `event_type` on the [events endpoint](/reference/sdk-rest-api). This page defines every type, the key fields it carries, and how the dashboard turns them into metrics.

## Event types

| `event_type`          | Meaning                                         | Key fields it carries                                    |
| --------------------- | ----------------------------------------------- | -------------------------------------------------------- |
| `flow_start`          | A flow began (was presented and started).       | flow, version, placement, user, session                  |
| `screen_view`         | A screen became visible.                        | `screen_id`, `screen_name`, `screen_index`               |
| `screen_exit`         | A screen was left.                              | `screen_id`, `time_on_screen_ms`                         |
| `flow_complete`       | The flow finished successfully.                 | `time_since_flow_start_ms`                               |
| `flow_exit`           | The flow was dismissed before completing.       | the screen it exited on                                  |
| `conversion`          | A revenue or goal event tied to the flow.       | `revenue`, `currency`, plus `product_id` in `properties` |
| `experiment_exposure` | The user was assigned to an experiment variant. | `experiment_id`, `variant_id`, `variant_name`            |
| `element_interaction` | A user interacted with an element.              | `element_id`, `element_type`, `interaction_type`         |
| `resolve_no_flow`     | A resolve returned no matching flow.            | `placement_id` (no flow IDs)                             |

Every event also carries the shared context: `user_id`, `session_id`, `app_id`, `device_platform`, `sdk_version`, `timestamp`, and (when applicable) `flow_id`, `flow_version_id`, `placement_id`, `experiment_id`, `variant_id`.

## What the SDKs emit

Both SDKs fire the same seven automatic lifecycle events, with these exact wire values:

`flow_start`, `flow_complete`, `flow_exit`, `screen_view`, `screen_exit`, `experiment_exposure`, `element_interaction`.

Two more exist that the SDKs do not fire automatically:

* `conversion` is sent explicitly via `trackConversion` ([iOS](/ios-sdk/conversions) / [Expo](/expo-sdk/conversions)), not as an automatic lifecycle event.
* `resolve_no_flow` is recorded **server-side** by the backend when a resolve matches no flow. The SDKs do not emit it.

The SDKs' automatic event names match the backend's recognized list exactly.

## Mapping to dashboard metrics

The placement and dashboard analytics are built from these raw events:

| Dashboard metric               | Derived from                                         |
| ------------------------------ | ---------------------------------------------------- |
| Impressions / Trigger Events   | `flow_start` count                                   |
| Completions / Flow Completions | `flow_complete` count                                |
| Completion Rate                | `flow_complete` divided by `flow_start`              |
| Funnel reach per screen        | distinct sessions with `screen_view` for that screen |
| Funnel drop-off                | distinct sessions with `flow_exit` on that screen    |
| Time per screen                | mean `time_on_screen_ms` from `screen_exit`          |
| Element engagement             | `element_interaction` rows grouped by element        |
| Experiment exposures           | `experiment_exposure` count per variant              |

Revenue is not aggregated or displayed at MVP, even though `conversion` events carry `revenue` and `currency`. See [Placement analytics](/dashboard/placement-analytics) and [Reading results](/dashboard/reading-results).

## Reading these in your app

Your app can observe every event (including `conversion`) through the SDK analytics callback. The callback fires in-process for each event the SDK enqueues. See analytics integration for [iOS](/ios-sdk/analytics) or [Expo](/expo-sdk/analytics) for the `AnalyticsEvent` shape and how to forward events to your own analytics.

## Related pages

* [Analytics integration (iOS SDK)](/ios-sdk/analytics)
* [Analytics integration (Expo SDK)](/expo-sdk/analytics)
* [Placement analytics](/dashboard/placement-analytics)
* [Reading results](/dashboard/reading-results)
