{"_id":"@codeimplants/analytics","_rev":"3-b3a2ebe005b2ea3ce2ab5e221157182b","name":"@codeimplants/analytics","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@codeimplants/analytics","version":"0.1.0","_id":"@codeimplants/analytics@0.1.0","maintainers":[{"name":"codeimplants","email":"codeimplants@gmail.com"}],"homepage":"https://github.com/codeimplants/analytics#readme","bugs":{"url":"https://github.com/codeimplants/analytics/issues"},"dist":{"shasum":"f0713c08bffd80214db43e6e5b2d88b77b804018","tarball":"https://registry.npmjs.org/@codeimplants/analytics/-/analytics-0.1.0.tgz","fileCount":25,"integrity":"sha512-Ckv21VWpkuRrPq0pY7A2yxXxLCqJMiPpFBWhcB4OVUqKZGUJA8SDE3mY4rcRguXiSRCpxUJulxMaQYCxLEzHjA==","signatures":[{"sig":"MEUCIHAYEZmKaDREx24CCuXyn6Q6/mB0RVxDlSmFe6AiNsRCAiEA67rRAFjDy0UkzX6LFpKfBpBc1E+oaoIpv+0UiY7kYOc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13896},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"9cd5973fda22560ceb2d79600602d46cdc869cdb","private":false,"scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"codeimplants","email":"codeimplants@gmail.com"},"repository":{"url":"git+https://github.com/codeimplants/analytics.git","type":"git"},"_npmVersion":"11.7.0","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@react-native-firebase/analytics":"^23.8.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@tsconfig/node20":"^20.1.8","@tsconfig/strictest":"^2.0.8","@types/react-native":"^0.72.8"},"_npmOperationalInternal":{"tmp":"tmp/analytics_0.1.0_1769763954798_0.5277537897051503","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@codeimplants/analytics","version":"0.2.0","_id":"@codeimplants/analytics@0.2.0","maintainers":[{"name":"codeimplants","email":"codeimplants@gmail.com"}],"homepage":"https://github.com/codeimplants/analytics#readme","bugs":{"url":"https://github.com/codeimplants/analytics/issues"},"dist":{"shasum":"026bacb9ce4ce22724ea53195517b042499fc0ea","tarball":"https://registry.npmjs.org/@codeimplants/analytics/-/analytics-0.2.0.tgz","fileCount":26,"integrity":"sha512-+FYQmhBZZDd1S+Pn48chLK0FUXRG9rLifFtbYlu29J+9pPkm9lqMUfjU8hSs/mswDoRF+aaqDP4WwKDf8ZCkmw==","signatures":[{"sig":"MEQCIFSH71L51LVOA0n1zojeR15pnLkquzm6edgx7ApVyp/NAiA2vCF0FnxCkQk5qn3ohLg8TfZ6LDMQJeGi9YTfPdZVVw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28715},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"e835e0b487a492421a3f5c858cca9ab4d3cf87ab","private":false,"scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"codeimplants","email":"codeimplants@gmail.com"},"repository":{"url":"git+https://github.com/codeimplants/analytics.git","type":"git"},"_npmVersion":"11.6.2","description":"Shared analytics SDK for all **CodeImplants** mobile apps (React Native).","directories":{},"_nodeVersion":"22.12.0","dependencies":{"@react-native-firebase/analytics":"^23.8.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@tsconfig/node20":"^20.1.8","@tsconfig/strictest":"^2.0.8","@types/react-native":"^0.72.8"},"_npmOperationalInternal":{"tmp":"tmp/analytics_0.2.0_1771874409326_0.45564944647659145","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@codeimplants/analytics","version":"0.4.0","private":false,"main":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"tsc","prepublishOnly":"npm run build"},"devDependencies":{"@tsconfig/node20":"^20.1.8","@tsconfig/strictest":"^2.0.8","@types/react-native":"^0.72.8","typescript":"^5.9.3"},"dependencies":{"@react-native-firebase/analytics":"^23.8.4"},"repository":{"type":"git","url":"git+https://github.com/codeimplants/analytics.git"},"gitHead":"60a55cd48cad032407a2d70eea385a3222c592f3","_id":"@codeimplants/analytics@0.4.0","description":"Shared analytics SDK for all **CodeImplants** mobile apps (React Native).","bugs":{"url":"https://github.com/codeimplants/analytics/issues"},"homepage":"https://github.com/codeimplants/analytics#readme","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-EAjln6w26HzLuOSVpCAjC9v9OtTBcQBrrnp8qsih3aK7rPoS0HtVvmvFoBF8VsizL6J+y/mijyzp1OhG+9VmrA==","shasum":"23753132e12cc3b87efbd5d52afb3ea29952bbb9","tarball":"https://registry.npmjs.org/@codeimplants/analytics/-/analytics-0.4.0.tgz","fileCount":29,"unpackedSize":43583,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCSch+FqdFnmlLKeIzHdYImxxm3Ho4luEu4PSmy8dKS2QIhAJzWn5Xsqv+2+x56WN8IadgEOA9ja2Tbsoj9HQsb1w7b"}]},"_npmUser":{"name":"codeimplants","email":"codeimplants@gmail.com"},"directories":{},"maintainers":[{"name":"codeimplants","email":"codeimplants@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/analytics_0.4.0_1784967771655_0.952051320727475"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-30T09:05:54.689Z","modified":"2026-07-25T08:22:51.969Z","0.1.0":"2026-01-30T09:05:54.948Z","0.2.0":"2026-02-23T19:20:09.481Z","0.4.0":"2026-07-25T08:22:51.813Z"},"bugs":{"url":"https://github.com/codeimplants/analytics/issues"},"homepage":"https://github.com/codeimplants/analytics#readme","repository":{"type":"git","url":"git+https://github.com/codeimplants/analytics.git"},"description":"Shared analytics SDK for all **CodeImplants** mobile apps (React Native).","maintainers":[{"name":"codeimplants","email":"codeimplants@gmail.com"}],"readme":"# @codeimplants/analytics\r\n\r\nShared analytics SDK for all **CodeImplants** mobile apps (React Native).\r\n\r\nBuilt on top of `@react-native-firebase/analytics` (GA4), this package provides a **safe, centralized, and governed** analytics layer — ensuring your app never crashes due to analytics, events are always valid, and data is always clean.\r\n\r\n---\r\n\r\n## Table of Contents\r\n\r\n- [Features](#features)\r\n- [Prerequisites](#prerequisites)\r\n- [Installation](#installation)\r\n- [Setup: React Native (Firebase)](#setup-react-native-firebase)\r\n- [Initialization](#initialization)\r\n- [API Reference](#api-reference)\r\n  - [Analytics.init](#analyticsinit)\r\n  - [Analytics.track](#analyticstrack)\r\n  - [Analytics.screen](#analyticsscreen)\r\n  - [Analytics.setUser](#analyticssetuser)\r\n  - [Analytics.clearUser](#analyticsclearuser)\r\n- [Available Events](#available-events)\r\n- [Types](#types)\r\n- [Integration Patterns](#integration-patterns)\r\n  - [React Native App (Expo / Bare)](#react-native-app-expo--bare)\r\n  - [Navigation Screen Tracking](#navigation-screen-tracking)\r\n  - [Authentication Events](#authentication-events)\r\n  - [App Lifecycle Events](#app-lifecycle-events)\r\n  - [Network / Reliability Events](#network--reliability-events)\r\n  - [User Identity](#user-identity)\r\n- [Environment Behaviour](#environment-behaviour)\r\n- [Internal Safeguards](#internal-safeguards)\r\n- [Mandatory Rules](#mandatory-rules)\r\n\r\n---\r\n\r\n## Features\r\n\r\n- ✅ **Never crashes the app** — every analytics call is wrapped in a try/catch\r\n- ✅ **Clean GA4 data** — only pre-approved event names can be tracked\r\n- ✅ **Environment separation** — analytics is disabled in `local` environments automatically\r\n- ✅ **Double-init protection** — calling `init` more than once is a no-op\r\n- ✅ **Rate-limiting guard** — rapid duplicate events are throttled (min 300ms apart)\r\n- ✅ **Payload sanitization** — max 25 params, max 100 chars per value, type-safe\r\n- ✅ **GA4 DebugView** — automatically enabled for non-production environments\r\n- ✅ **User identity management** — `setUser` / `clearUser`\r\n\r\n---\r\n\r\n## Prerequisites\r\n\r\nThis package requires `@react-native-firebase/analytics` to be installed and configured in your **host app**.\r\n\r\n- React Native `>=0.72`\r\n- `@react-native-firebase/app` configured\r\n- `@react-native-firebase/analytics` installed\r\n\r\n### Install Firebase in your app\r\n\r\n```bash\r\n# npm\r\nnpm install @react-native-firebase/app @react-native-firebase/analytics\r\n\r\n# yarn\r\nyarn add @react-native-firebase/app @react-native-firebase/analytics\r\n```\r\n\r\nFor platform-specific Firebase setup (google-services.json / GoogleService-Info.plist), follow the [React Native Firebase documentation](https://rnfirebase.io/).\r\n\r\n---\r\n\r\n## Installation\r\n\r\n### From npm (public package)\r\n\r\n```bash\r\nnpm install @codeimplants/analytics\r\n```\r\n\r\n### From a monorepo (workspace)\r\n\r\nIf your app is in the same monorepo, add the workspace reference in your app's `package.json`:\r\n\r\n```json\r\n{\r\n  \"dependencies\": {\r\n    \"@codeimplants/analytics\": \"*\"\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## Setup: React Native (Firebase)\r\n\r\nEnsure your Firebase project is connected:\r\n\r\n1. Create a Firebase project at [https://console.firebase.google.com](https://console.firebase.google.com)\r\n2. Register your Android and iOS apps\r\n3. Download `google-services.json` → place under `android/app/`\r\n4. Download `GoogleService-Info.plist` → place under `ios/<AppName>/`\r\n5. Follow the native setup steps from [rnfirebase.io](https://rnfirebase.io/)\r\n\r\n---\r\n\r\n## Initialization\r\n\r\nCall `Analytics.init` **once** at the very start of your app — before any screen renders or events fire.\r\n\r\n```ts\r\nimport { Analytics } from \"@codeimplants/analytics\";\r\n\r\nAnalytics.init({\r\n  appName: \"my-app\",\r\n  environment: \"prod\", // \"dev\" | \"qa\" | \"preprod\" | \"prod\"\r\n  appVersion: \"1.0.0\",\r\n  enableAnalytics: true,\r\n});\r\n```\r\n\r\n> ⚠️ **Init is idempotent** — calling it more than once is safely ignored. Only the first call takes effect.\r\n\r\n> ⚠️ **Analytics is disabled in `local` environment** — events will be silently dropped even if `enableAnalytics: true`.\r\n\r\n---\r\n\r\n## API Reference\r\n\r\n### `Analytics.init`\r\n\r\n```ts\r\nAnalytics.init(config: AnalyticsConfig): void\r\n```\r\n\r\nInitializes the analytics SDK with your app's configuration and sets up the GA4 adapter.\r\n\r\n| Parameter         | Type                   | Required | Description                                 |\r\n| ----------------- | ---------------------- | -------- | ------------------------------------------- |\r\n| `appName`         | `string`               | ✅       | Name of the app (used as an event property) |\r\n| `environment`     | `AnalyticsEnvironment` | ✅       | One of `dev`, `qa`, `preprod`, `prod`       |\r\n| `appVersion`      | `string`               | ✅       | App version string (e.g. `\"2.1.0\"`)         |\r\n| `enableAnalytics` | `boolean`              | ✅       | Master kill-switch for all analytics        |\r\n\r\n---\r\n\r\n### `Analytics.track`\r\n\r\n```ts\r\nAnalytics.track(\r\n  eventName: AnalyticsEventName,\r\n  payload?: AnalyticsEventPayload\r\n): Promise<void>\r\n```\r\n\r\nTracks a custom event. Only events from `AnalyticsEvents` are accepted.\r\n\r\n**Automatic enrichment** — every event payload is automatically extended with:\r\n\r\n- `environment` — the configured environment\r\n- `app_name` — the configured app name\r\n- `app_version` — the configured app version\r\n\r\n**Payload sanitization rules:**\r\n\r\n- Maximum **25 parameters** per event (extras are dropped)\r\n- String values are truncated to **100 characters**\r\n- Only `string`, `number`, `boolean` values are allowed (nulls are filtered)\r\n\r\n```ts\r\nimport { Analytics, AnalyticsEvents } from \"@codeimplants/analytics\";\r\n\r\nawait Analytics.track(AnalyticsEvents.LOGIN_SUCCESS, {\r\n  method: \"email\",\r\n  user_type: \"premium\",\r\n});\r\n```\r\n\r\n---\r\n\r\n### `Analytics.screen`\r\n\r\n```ts\r\nAnalytics.screen(screenName: string): Promise<void>\r\n```\r\n\r\nLogs a screen view event to Firebase Analytics via `logScreenView`. Sets both `screen_name` and `screen_class` to the provided value.\r\n\r\n```ts\r\nawait Analytics.screen(\"HomeScreen\");\r\n```\r\n\r\n---\r\n\r\n### `Analytics.setUser`\r\n\r\n```ts\r\nAnalytics.setUser(userId: string): Promise<void>\r\n```\r\n\r\nAssociates all subsequent events with the given user ID (calls Firebase `setUserId`).\r\n\r\n```ts\r\nawait Analytics.setUser(\"user_abc123\");\r\n```\r\n\r\n---\r\n\r\n### `Analytics.clearUser`\r\n\r\n```ts\r\nAnalytics.clearUser(): Promise<void>\r\n```\r\n\r\nRemoves the user ID association. Call this on logout.\r\n\r\n```ts\r\nawait Analytics.clearUser();\r\n```\r\n\r\n---\r\n\r\n## Available Events\r\n\r\nAll valid event names are defined in `AnalyticsEvents`. **Do not use raw strings** — always import and use this constant.\r\n\r\n```ts\r\nimport { AnalyticsEvents } from \"@codeimplants/analytics\";\r\n```\r\n\r\n| Constant                  | Event Name                | Category              |\r\n| ------------------------- | ------------------------- | --------------------- |\r\n| `SCREEN_VIEW`             | `screen_view`             | Navigation            |\r\n| `LOGIN_SUCCESS`           | `login_success`           | Auth                  |\r\n| `LOGIN_FAILURE`           | `login_failure`           | Auth                  |\r\n| `LOGOUT`                  | `logout`                  | Auth                  |\r\n| `API_FAILURE`             | `api_failure`             | Network / Reliability |\r\n| `RETRY_ATTEMPT`           | `retry_attempt`           | Network / Reliability |\r\n| `OFFLINE_DETECTED`        | `offline_detected`        | Network / Reliability |\r\n| `APP_OPEN`                | `app_open`                | App Lifecycle         |\r\n| `APP_BACKGROUND`          | `app_background`          | App Lifecycle         |\r\n| `SUPPORT_CONTACTED`       | `support_contacted`       | Support               |\r\n| `APP_UPDATE_PROMPT_SHOWN` | `app_update_prompt_shown` | Updates               |\r\n\r\n> 🚫 Any event name not in this list will be **silently dropped** at the validator level.\r\n\r\n---\r\n\r\n## Types\r\n\r\n```ts\r\nimport type {\r\n  AnalyticsConfig,\r\n  AnalyticsEnvironment,\r\n  AnalyticsEventPayload,\r\n} from \"@codeimplants/analytics\";\r\n```\r\n\r\n### `AnalyticsEnvironment`\r\n\r\n```ts\r\ntype AnalyticsEnvironment = \"dev\" | \"qa\" | \"preprod\" | \"prod\";\r\n```\r\n\r\n### `AnalyticsConfig`\r\n\r\n```ts\r\ntype AnalyticsConfig = {\r\n  appName: string;\r\n  environment: AnalyticsEnvironment;\r\n  appVersion: string;\r\n  enableAnalytics: boolean;\r\n};\r\n```\r\n\r\n### `AnalyticsEventPayload`\r\n\r\n```ts\r\ntype AnalyticsEventPayload = Record<string, string | number | boolean | null>;\r\n```\r\n\r\n### `AnalyticsEventName`\r\n\r\n```ts\r\n// Derived automatically — union of all values in AnalyticsEvents\r\ntype AnalyticsEventName = \"screen_view\" | \"login_success\" | \"login_failure\" | ...;\r\n```\r\n\r\n---\r\n\r\n## Integration Patterns\r\n\r\n### React Native App (Expo / Bare)\r\n\r\nInitialize analytics in your root `App.tsx` or `index.js`:\r\n\r\n```tsx\r\n// App.tsx\r\nimport React, { useEffect } from \"react\";\r\nimport { Analytics, AnalyticsEvents } from \"@codeimplants/analytics\";\r\n\r\nconst APP_ENV = process.env.APP_ENV ?? \"local\"; // \"local\" | \"dev\" | \"qa\" | \"prod\"\r\n\r\nAnalytics.init({\r\n  appName: \"my-app\",\r\n  environment: APP_ENV as any,\r\n  appVersion: \"1.0.0\",\r\n  enableAnalytics: APP_ENV !== \"local\",\r\n});\r\n\r\nexport default function App() {\r\n  useEffect(() => {\r\n    Analytics.track(AnalyticsEvents.APP_OPEN);\r\n  }, []);\r\n\r\n  return <RootNavigator />;\r\n}\r\n```\r\n\r\n---\r\n\r\n### Navigation Screen Tracking\r\n\r\nAutomatically log screen views with React Navigation:\r\n\r\n```tsx\r\nimport { NavigationContainer } from \"@react-navigation/native\";\r\nimport { Analytics } from \"@codeimplants/analytics\";\r\n\r\nexport default function RootNavigator() {\r\n  return (\r\n    <NavigationContainer\r\n      onStateChange={(state) => {\r\n        const currentRoute = state?.routes[state.index];\r\n        if (currentRoute?.name) {\r\n          Analytics.screen(currentRoute.name);\r\n        }\r\n      }}\r\n    >\r\n      {/* your navigators */}\r\n    </NavigationContainer>\r\n  );\r\n}\r\n```\r\n\r\n---\r\n\r\n### Authentication Events\r\n\r\n```ts\r\nimport { Analytics, AnalyticsEvents } from \"@codeimplants/analytics\";\r\n\r\n// On successful login\r\nasync function handleLoginSuccess(userId: string) {\r\n  await Analytics.setUser(userId);\r\n  await Analytics.track(AnalyticsEvents.LOGIN_SUCCESS, { method: \"email\" });\r\n}\r\n\r\n// On login failure\r\nasync function handleLoginFailure(reason: string) {\r\n  await Analytics.track(AnalyticsEvents.LOGIN_FAILURE, { reason });\r\n}\r\n\r\n// On logout\r\nasync function handleLogout() {\r\n  await Analytics.track(AnalyticsEvents.LOGOUT);\r\n  await Analytics.clearUser();\r\n}\r\n```\r\n\r\n---\r\n\r\n### App Lifecycle Events\r\n\r\n```tsx\r\nimport { useEffect } from \"react\";\r\nimport { AppState } from \"react-native\";\r\nimport { Analytics, AnalyticsEvents } from \"@codeimplants/analytics\";\r\n\r\nexport function useAppLifecycleTracking() {\r\n  useEffect(() => {\r\n    const subscription = AppState.addEventListener(\"change\", (nextState) => {\r\n      if (nextState === \"background\" || nextState === \"inactive\") {\r\n        Analytics.track(AnalyticsEvents.APP_BACKGROUND);\r\n      }\r\n    });\r\n\r\n    return () => subscription.remove();\r\n  }, []);\r\n}\r\n```\r\n\r\n---\r\n\r\n### Network / Reliability Events\r\n\r\n```ts\r\nimport { Analytics, AnalyticsEvents } from \"@codeimplants/analytics\";\r\n\r\n// Track API failure\r\nasync function fetchData(endpoint: string) {\r\n  try {\r\n    const res = await fetch(endpoint);\r\n    if (!res.ok) throw new Error(`HTTP ${res.status}`);\r\n    return await res.json();\r\n  } catch (error) {\r\n    await Analytics.track(AnalyticsEvents.API_FAILURE, {\r\n      endpoint,\r\n      error: String(error),\r\n    });\r\n    throw error;\r\n  }\r\n}\r\n\r\n// Track retry attempt\r\nasync function retryFetch(endpoint: string, attempt: number) {\r\n  await Analytics.track(AnalyticsEvents.RETRY_ATTEMPT, { endpoint, attempt });\r\n  return fetchData(endpoint);\r\n}\r\n\r\n// Track offline state\r\nimport NetInfo from \"@react-native-community/netinfo\";\r\n\r\nNetInfo.addEventListener((state) => {\r\n  if (!state.isConnected) {\r\n    Analytics.track(AnalyticsEvents.OFFLINE_DETECTED);\r\n  }\r\n});\r\n```\r\n\r\n---\r\n\r\n### User Identity\r\n\r\n```ts\r\nimport { Analytics } from \"@codeimplants/analytics\";\r\n\r\n// Set user after login / session restore\r\nawait Analytics.setUser(\"user_42abc\");\r\n\r\n// Clear user on logout or session expiry\r\nawait Analytics.clearUser();\r\n```\r\n\r\n---\r\n\r\n## Environment Behaviour\r\n\r\n| Environment | Analytics Collected | DebugView (GA4) |\r\n| ----------- | ------------------- | --------------- |\r\n| `dev`       | ✅ If enabled       | ✅ Enabled      |\r\n| `qa`        | ✅ If enabled       | ✅ Enabled      |\r\n| `preprod`   | ✅ If enabled       | ✅ Enabled      |\r\n| `prod`      | ✅ If enabled       | ❌ Disabled     |\r\n\r\n> Even if `enableAnalytics: true`, the `local` environment will **never** send events to Firebase. This prevents development noise in your GA4 dashboard.\r\n\r\n---\r\n\r\n## Internal Safeguards\r\n\r\nThe following safety mechanisms are built into the SDK — you don't need to implement them yourself:\r\n\r\n| Safeguard             | Description                                                        |\r\n| --------------------- | ------------------------------------------------------------------ |\r\n| **Try/Catch wrapper** | All Firebase calls are wrapped — analytics never crashes the app   |\r\n| **Double-init guard** | `init` can only take effect once per app session                   |\r\n| **Event allowlist**   | Unknown event names are silently dropped by the validator          |\r\n| **Rate-limit guard**  | Events fired within 300ms of each other are dropped                |\r\n| **Payload sanitizer** | Max 25 params, max 100 chars per string value, filters null values |\r\n| **Environment gate**  | `local` environment always skips tracking                          |\r\n| **Init check**        | `track` / `screen` are no-ops if `init` was never called           |\r\n\r\n---\r\n\r\n## Mandatory Rules\r\n\r\n| Rule                                                                     | Detail                                                  |\r\n| ------------------------------------------------------------------------ | ------------------------------------------------------- |\r\n| ❌ Do NOT import `@react-native-firebase/analytics` directly in your app | Always go through this SDK                              |\r\n| ❌ Do NOT invent or hardcode event name strings                          | Always use `AnalyticsEvents.*` constants                |\r\n| ✅ Call `Analytics.init` exactly once at app startup                     | Place it before any screen renders                      |\r\n| ✅ Always use `Analytics.setUser` after login                            | And `clearUser` on logout                               |\r\n| ✅ Use `Analytics.screen` for screen tracking                            | Integrate with your navigation library's state listener |\r\n","readmeFilename":"README.md"}