# Tianji product events (Hesychia) Helpers: `llm-fe/src/llm-fe/utils/analytics.ts` Consent gate: custom events + identify only when `hesychia_analytics_consent*` is `granted` (see #37). Page views: always via `Tracker` / `tracker.js` on prod + beta. ## Event catalog | Event name | Constant | Call site(s) | Payload (non-PII) | |------------|----------|--------------|-------------------| | Login Success | `LOGIN_SUCCESS` | SignIn, AuthCallback | `{ method: 'password' \| 'sso' }` | | Login Failed | `LOGIN_FAILED` | SignIn, AuthCallback | `{ method }` | | Sign Up Started | `SIGNUP_STARTED` | SignUp | — | | Sign Up Success | `SIGNUP_SUCCESS` | SignUp, AuthCallback (`created`) | `{ method? }` | | Sign Up Failed | `SIGNUP_FAILED` | SignUp, AuthCallback | `{ method? }` | | Logout | `LOGOUT` | AnalyticsSession (auth → logged out) | — | | Checkout Started | `CHECKOUT_STARTED` | SignUp, AuthCallback | `{ source }` | | Payment Success | `PAYMENT_SUCCESS` | BillingSuccess | `{ hasSessionId }` | | Payment Canceled | `PAYMENT_CANCELED` | BillingCancel | — | | Conversation Created | `CONVERSATION_CREATED` | MessageContext | `{ conversationId }` | | Message Sent | `MESSAGE_SENT` | AsyncDashboard2 | `{ hasConversation, hasAttachment }` | | ToS Acknowledged | `TOS_ACKNOWLEDGED` | TermsOfService | — | | Billing Portal Opened | `BILLING_PORTAL_OPENED` | BillingSection (Account) | `{ intent? }` | | Subscription Upgrade Started | `SUBSCRIPTION_UPGRADE_STARTED` | BillingSection, UsageSummaryCard | `{ source, plan_slug? }` | | Plan Change Started | `PLAN_CHANGE_STARTED` | BillingSection | `{ source, plan_slug? }` | | Subscription Cancel Started | `SUBSCRIPTION_CANCEL_STARTED` | BillingSection | `{ source: 'portal' }` | | Account Delete Started | `ACCOUNT_DELETE_STARTED` | DeleteAccountSection | — | | Account Delete Success | `ACCOUNT_DELETE_SUCCESS` | DeleteAccountSection | — | | Account Delete Failed | `ACCOUNT_DELETE_FAILED` | DeleteAccountSection | — | | Message Copied | `MESSAGE_COPIED` | MessageActions | `{ role }` | | Message Rated | `MESSAGE_RATED` | MessageActions | `{ rating: 'up' \| 'down' \| 'cleared' }` | | Message Rating Reason | `MESSAGE_RATING_REASON` | MessageActions | `{ reason, hasComment }` | | Message Exported | `MESSAGE_EXPORTED` | MessageActions, AsyncDashboard2 | `{ format, scope }` | | Activity Stage Completed | `ACTIVITY_STAGE_COMPLETED` | MessageContext | `{ stage, durationMs }` (no label/detail text) | ## Identify `identifyAccount(account)` sends `{ userId: email, companyId?, isCompanyManager? }`. No message text, document contents, or names. ## Environments Only prod/beta (`REACT_APP_DEPLOY_ENV` or production build with Tianji website id). Local dev skips unless env set.