# Mobile Analytics Events Catalog Schema version: `1.0.0` (see `ee/mobile/src/analytics/events.ts`) Notes: - Event names are stable identifiers and must not be repurposed. - Properties should avoid PII; do not include ticket subject, comment text, requester/contact data, or tokens. ## Events | Event | When | Properties (non-exhaustive) | |---|---|---| | `app.startup.ready` | App boot is complete and navigation state is restored | `durationMs`, `signedIn` | | `auth.sign_in.blocked` | User attempted sign-in but CTA was gated | `reason` (`missing_base_url` \| `host_not_allowlisted`) | | `auth.sign_in.start` | User tapped Sign In and sign-in state was created | *(none)* | | `auth.sign_in.open_failed` | Failed to open the system browser for sign-in | `reason` (`cannot_open_url` \| `exception`) | | `auth.sign_in.opened_browser` | System browser opened successfully | *(none)* | | `auth.callback.failed` | Deep link callback was received but rejected | `reason` (provider error code or `missing_params` \| `state_mismatch`) | | `auth.exchange.failed` | OTT exchange failed | `errorKind`, `status` | | `auth.exchange.succeeded` | OTT exchange succeeded | `expiresInSec` | | `auth.refresh.failed` | Session refresh failed | `errorKind`, `status` | | `auth.refresh.revoked` | Session refresh indicates token revoked/expired and session was cleared | `status` | | `auth.refresh.succeeded` | Session refresh succeeded | `expiresInSec` | | `auth.logout` | Logout initiated | `hadSession` | | `api.request.succeeded` | Any API request succeeds | `method`, `path`, `status`, `durationMs`, `attempts` | | `api.request.failed` | Any API request ultimately fails (after retries/optional auth refresh) | `method`, `path`, `status`, `errorKind`, `durationMs`, `attempts` | ## Common properties All mobile events automatically include: - `schema_version`: current analytics schema version (`1.0.0`)