{"_id":"@appmachina/expo","_rev":"4-2e41370fe6a369275480004074d78811","name":"@appmachina/expo","dist-tags":{"latest":"3.0.3"},"versions":{"0.0.1":{"name":"@appmachina/expo","version":"0.0.1","_id":"@appmachina/expo@0.0.1","maintainers":[{"name":"mikekhristo","email":"mike@layers.com"}],"dist":{"shasum":"80104e78baeff89fc7bff9e0c273470b7c27fc03","tarball":"https://registry.npmjs.org/@appmachina/expo/-/expo-0.0.1.tgz","fileCount":2,"integrity":"sha512-63qRhIZahTZv5GhyhA6oUaqvO9zwOYM8lvlJ9JiXLdWpaT4IeIYZAruQY2aAw1HRgJEiMYfm9YMfs48rXmXtSw==","signatures":[{"sig":"MEQCIC+XLf8oFRjqlCrJtK8OhZ45pyCtMWblE0a9GIMkVVvEAiBpTvl0trciSC0Lfglon+rBZO5S8Sd8n8Rl1egTM5y4ig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176},"main":"index.js","access":"public","_npmUser":{"name":"mikekhristo","email":"mike@layers.com"},"_npmVersion":"10.9.4","description":"AppMachina SDK - expo (placeholder)","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/expo_0.0.1_1775187841790_0.10856608746737706","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@appmachina/expo","version":"2.2.0","keywords":["expo","appmachina","analytics","sdk","config-plugin"],"author":{"name":"AppMachina Team"},"license":"MIT","_id":"@appmachina/expo@2.2.0","maintainers":[{"name":"mikekhristo","email":"mike@layers.com"}],"homepage":"https://github.com/appmachina/sdks#readme","bugs":{"url":"https://github.com/appmachina/sdks/issues"},"dist":{"shasum":"2bb29c3f4373ebf6a9a1fba0ff52e55f38cd5881","tarball":"https://registry.npmjs.org/@appmachina/expo/-/expo-2.2.0.tgz","fileCount":15,"integrity":"sha512-VAvHmyHh52OnMrEsl+rTFHdovepTudgf3tTSSzcL11AcHVwWUwTRRUpVEeTRzxTeeZRKLboP63PBHJldMR8beA==","signatures":[{"sig":"MEUCIQCa47VTT4/d4ZEfbRccmW10FPHyVTsUqc198l7na9eebgIgcZslEsGmxKIldsaP7sI4YtpyWwa40nHVRBssL49HVO0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80850},"expo":{"configPlugin":"./app.plugin.cjs"},"main":"./dist/index.js","type":"module","_from":"file:appmachina-expo-2.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","react-native":"./dist/index.js"},"./plugin":{"types":"./dist/plugin.d.ts","default":"./dist/plugin.js"},"./app.plugin.js":"./app.plugin.cjs","./app.plugin.cjs":"./app.plugin.cjs"},"scripts":{"test":"vitest run","build":"tsdown src/index.ts src/plugin.ts --format esm --dts --external @expo/config-plugins && tsdown src/plugin.ts --format cjs --outDir dist/cjs --external @expo/config-plugins"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:614f696d-8932-40ce-b1b8-6fc523acc6f1"}},"_resolved":"/tmp/0f3876c5e20ec023141ef8e0e596385e/appmachina-expo-2.2.0.tgz","_integrity":"sha512-VAvHmyHh52OnMrEsl+rTFHdovepTudgf3tTSSzcL11AcHVwWUwTRRUpVEeTRzxTeeZRKLboP63PBHJldMR8beA==","repository":{"url":"git+https://github.com/appmachina/sdks.git","type":"git","directory":"packages/expo"},"_npmVersion":"11.12.1","description":"AppMachina Analytics Expo SDK — convenience wrapper with config plugin","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","dependencies":{"@appmachina/react-native":"2.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@expo/config-plugins":"^8.0.0"},"peerDependencies":{"expo":">=50.0.0","react":">=18.0.0","expo-linking":">=6.0.0","react-native":">=0.73.0","expo-clipboard":">=5.0.0","@expo/config-plugins":">=8.0.0","expo-tracking-transparency":">=3.0.0"},"peerDependenciesMeta":{"expo-linking":{"optional":true},"expo-clipboard":{"optional":true},"@expo/config-plugins":{"optional":true},"expo-tracking-transparency":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo_2.2.0_1775193797919_0.08453590840723102","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@appmachina/expo","version":"3.0.2","keywords":["expo","appmachina","analytics","sdk","config-plugin"],"author":{"name":"AppMachina Team"},"license":"MIT","_id":"@appmachina/expo@3.0.2","maintainers":[{"name":"mikekhristo","email":"mike@layers.com"}],"homepage":"https://github.com/appmachina/sdks#readme","bugs":{"url":"https://github.com/appmachina/sdks/issues"},"dist":{"shasum":"f8fd5ab6579e3e73385bbd3ac63a49c160b31c9b","tarball":"https://registry.npmjs.org/@appmachina/expo/-/expo-3.0.2.tgz","fileCount":15,"integrity":"sha512-FQ3B8QjCw9mtEh8MaQIOKqW3XgH8JDf7CHkJ/LxLIlPS7XAlFLeo/6GWng1BxRGkIhsmTkAA8wjWNBugpM0ivg==","signatures":[{"sig":"MEYCIQCLx22WudYi4bqmsCg27lnIXAnYMdq/CPq50mFtNLeOegIhAIayq0Bmgfjt7F8FI0K3gaRJ0z640jxmFGvI7jOrfTiP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80850},"expo":{"configPlugin":"./app.plugin.cjs"},"main":"./dist/index.js","type":"module","_from":"file:appmachina-expo-3.0.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js","react-native":"./dist/index.js"},"./plugin":{"types":"./dist/plugin.d.ts","default":"./dist/plugin.js"},"./app.plugin.js":"./app.plugin.cjs","./app.plugin.cjs":"./app.plugin.cjs"},"scripts":{"test":"vitest run","build":"tsdown src/index.ts src/plugin.ts --format esm --dts --external @expo/config-plugins && tsdown src/plugin.ts --format cjs --outDir dist/cjs --external @expo/config-plugins"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:614f696d-8932-40ce-b1b8-6fc523acc6f1"}},"_resolved":"/tmp/08d565875acd32df90c7793fed76a1fd/appmachina-expo-3.0.2.tgz","_integrity":"sha512-FQ3B8QjCw9mtEh8MaQIOKqW3XgH8JDf7CHkJ/LxLIlPS7XAlFLeo/6GWng1BxRGkIhsmTkAA8wjWNBugpM0ivg==","repository":{"url":"git+https://github.com/appmachina/sdks.git","type":"git","directory":"packages/expo"},"_npmVersion":"11.12.1","description":"AppMachina Analytics Expo SDK — convenience wrapper with config plugin","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","dependencies":{"@appmachina/react-native":"3.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@expo/config-plugins":"^8.0.0"},"peerDependencies":{"expo":">=50.0.0","react":">=18.0.0","expo-linking":">=6.0.0","react-native":">=0.73.0","expo-clipboard":">=5.0.0","@expo/config-plugins":">=8.0.0","expo-tracking-transparency":">=3.0.0"},"peerDependenciesMeta":{"expo-linking":{"optional":true},"expo-clipboard":{"optional":true},"@expo/config-plugins":{"optional":true},"expo-tracking-transparency":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo_3.0.2_1775443249388_0.032445527309415745","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"@appmachina/expo","version":"3.0.3","publishConfig":{"access":"public"},"description":"AppMachina Analytics Expo SDK — convenience wrapper with config plugin","license":"MIT","repository":{"type":"git","url":"git+https://github.com/appmachina/sdks.git","directory":"packages/expo"},"author":{"name":"AppMachina Team"},"homepage":"https://github.com/appmachina/sdks#readme","bugs":{"url":"https://github.com/appmachina/sdks/issues"},"type":"module","main":"./dist/index.js","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","react-native":"./dist/index.js","default":"./dist/index.js"},"./plugin":{"types":"./dist/plugin.d.ts","default":"./dist/plugin.js"},"./app.plugin.js":"./app.plugin.cjs","./app.plugin.cjs":"./app.plugin.cjs"},"expo":{"configPlugin":"./app.plugin.cjs"},"keywords":["expo","appmachina","analytics","sdk","config-plugin"],"dependencies":{"@appmachina/react-native":"3.0.3"},"peerDependencies":{"@expo/config-plugins":">=8.0.0","expo":">=50.0.0","expo-clipboard":">=5.0.0","expo-linking":">=6.0.0","expo-tracking-transparency":">=3.0.0","react":">=18.0.0","react-native":">=0.73.0"},"peerDependenciesMeta":{"@expo/config-plugins":{"optional":true},"expo-clipboard":{"optional":true},"expo-linking":{"optional":true},"expo-tracking-transparency":{"optional":true}},"devDependencies":{"@expo/config-plugins":"^8.0.0"},"types":"./dist/index.d.ts","sideEffects":false,"engines":{"node":">=18.0.0"},"scripts":{"build":"tsdown src/index.ts src/plugin.ts --format esm --dts --external @expo/config-plugins && tsdown src/plugin.ts --format cjs --outDir dist/cjs --external @expo/config-plugins","test":"vitest run"},"_id":"@appmachina/expo@3.0.3","_integrity":"sha512-zGPvCWyavIXddb/b6Q2GLedVWdjtYOpevbMrvt0mkG4eDM+l0LoaJSDHi86FVH+KmWAhN0XUeQMBcQwl4YcZqA==","_resolved":"/tmp/735a34decdd76807a9a3ebd24243ccb1/appmachina-expo-3.0.3.tgz","_from":"file:appmachina-expo-3.0.3.tgz","_nodeVersion":"22.19.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-zGPvCWyavIXddb/b6Q2GLedVWdjtYOpevbMrvt0mkG4eDM+l0LoaJSDHi86FVH+KmWAhN0XUeQMBcQwl4YcZqA==","shasum":"1e16b65dae466f57bb463859afcf0e0cbc8ef98a","tarball":"https://registry.npmjs.org/@appmachina/expo/-/expo-3.0.3.tgz","fileCount":15,"unpackedSize":80850,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIB/4UuzIZRMO9hq/nYnwF/py+zskziRt9rcNrHNW5XFvAiAr/I2d6C8RPkmY9IbS9K5SHjNNlYwbs4PtqFbeMT5FnQ=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:614f696d-8932-40ce-b1b8-6fc523acc6f1"}},"directories":{},"maintainers":[{"name":"mikekhristo","email":"mike@layers.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/expo_3.0.3_1776227385304_0.8769866060540368"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-03T03:44:01.674Z","modified":"2026-04-15T04:29:45.552Z","0.0.1":"2026-04-03T03:44:01.923Z","2.2.0":"2026-04-03T05:23:18.056Z","3.0.2":"2026-04-06T02:40:49.546Z","3.0.3":"2026-04-15T04:29:45.451Z"},"bugs":{"url":"https://github.com/appmachina/sdks/issues"},"author":{"name":"AppMachina Team"},"license":"MIT","homepage":"https://github.com/appmachina/sdks#readme","keywords":["expo","appmachina","analytics","sdk","config-plugin"],"repository":{"type":"git","url":"git+https://github.com/appmachina/sdks.git","directory":"packages/expo"},"description":"AppMachina Analytics Expo SDK — convenience wrapper with config plugin","maintainers":[{"name":"mikekhristo","email":"mike@layers.com"}],"readme":"# AppMachina Expo SDK\n\n`@appmachina/expo` is the AppMachina analytics SDK for Expo managed workflow projects. It wraps `@appmachina/react-native` and adds Expo-specific integrations: a config plugin for native setup automation, `expo-tracking-transparency` for ATT, `expo-linking` for deep links, `expo-clipboard` for clipboard attribution, and React context/hooks for idiomatic usage.\n\nUse this package for **Expo managed workflow** projects. For **bare React Native** projects, use [`@appmachina/react-native`](https://www.npmjs.com/package/@appmachina/react-native) instead.\n\n## Requirements\n\n- Expo SDK 50.0.0+\n- React Native 0.73.0+\n- React 18.0+\n\n## Installation\n\n```bash\nnpx expo install @appmachina/expo\n```\n\n### Optional Peer Dependencies\n\nFor full functionality, install these Expo packages:\n\n```bash\nnpx expo install expo-tracking-transparency expo-linking expo-clipboard\n```\n\n- **expo-tracking-transparency** -- ATT permission dialog (iOS)\n- **expo-linking** -- Deep link handling\n- **expo-clipboard** -- Clipboard attribution for deferred deep links (iOS)\n\n## Quick Start\n\n### 1. Add the Config Plugin\n\nIn your `app.config.js` or `app.json`:\n\n```js\nexport default {\n  expo: {\n    plugins: [\n      [\n        '@appmachina/expo',\n        {\n          ios: {\n            attUsageDescription: 'We use this to show you relevant content.',\n            urlSchemes: ['myapp'],\n            associatedDomains: ['myapp.com']\n          },\n          android: {\n            intentFilters: [\n              { scheme: 'myapp', host: 'open' },\n              { scheme: 'https', host: 'myapp.com', pathPrefix: '/app' }\n            ]\n          }\n        }\n      ]\n    ]\n  }\n};\n```\n\nThen run prebuild:\n\n```bash\nnpx expo prebuild\n```\n\n### 2. Initialize with the Provider\n\n```tsx\nimport { AppMachinaProvider } from '@appmachina/expo';\n\nexport default function App() {\n  return (\n    <AppMachinaProvider\n      config={{\n        appId: 'your-app-id',\n        environment: 'production'\n      }}\n      requestTracking={true}\n      enableDeepLinks={true}\n      onDeepLink={(data) => console.log('Deep link:', data.url)}\n      onError={(error) => console.error('AppMachina error:', error)}\n    >\n      <MyApp />\n    </AppMachinaProvider>\n  );\n}\n```\n\n### 3. Use Hooks in Components\n\n```tsx\nimport { useAppMachinaScreen, useAppMachinaTrack } from '@appmachina/expo';\n\nfunction SignupButton() {\n  const track = useAppMachinaTrack();\n\n  return <Button title=\"Sign Up\" onPress={() => track('signup_click', { source: 'hero' })} />;\n}\n\nfunction ProfileScreen() {\n  const screen = useAppMachinaScreen();\n\n  useEffect(() => {\n    screen('Profile');\n  }, []);\n\n  return <View />;\n}\n```\n\n## Config Plugin\n\nThe AppMachina Expo config plugin automates native project configuration via `npx expo prebuild`.\n\n### Plugin Options\n\n```typescript\ninterface AppMachinaExpoPluginProps {\n  ios?: {\n    /** Custom ATT usage description for the permission dialog. */\n    attUsageDescription?: string;\n    /** URL schemes for deep linking (e.g., ['myapp']). */\n    urlSchemes?: string[];\n    /** Associated domains for Universal Links (e.g., ['myapp.com']). */\n    associatedDomains?: string[];\n    /** Additional SKAdNetwork identifiers to register. */\n    skAdNetworkIds?: string[];\n    /** Include default SKAdNetwork IDs (16 major ad networks). Default: true. */\n    includeDefaultSKAdNetworkIds?: boolean;\n  };\n  android?: {\n    /** Intent filters for deep linking. */\n    intentFilters?: Array<{\n      scheme: string; // e.g., 'myapp' or 'https'\n      host?: string; // e.g., 'myapp.com'\n      pathPrefix?: string; // e.g., '/app'\n    }>;\n  };\n}\n```\n\n### What the Plugin Configures\n\n**iOS (Info.plist)**:\n\n- `NSUserTrackingUsageDescription` -- ATT usage description (defaults to a generic message if not provided)\n- `SKAdNetworkItems` -- SKAdNetwork IDs from Meta, Google, TikTok, Snapchat, X, Unity, AppLovin, IronSource (16 default IDs) plus any custom IDs you specify\n- `CFBundleURLTypes` -- Custom URL schemes for deep linking\n\n**iOS (Entitlements)**:\n\n- `com.apple.developer.associated-domains` -- Associated domains for Universal Links (auto-prefixed with `applinks:`)\n\n**Android (AndroidManifest.xml)**:\n\n- Intent filters on `.MainActivity` for deep link and App Link handling\n- `android:autoVerify=\"true\"` is set automatically for HTTPS intent filters\n\n### Default SKAdNetwork IDs\n\nThe plugin includes 16 SKAdNetwork IDs by default from these networks:\n\n- Meta/Facebook\n- Google/YouTube\n- TikTok\n- Snapchat\n- Twitter/X\n- Unity Ads\n- AppLovin\n- IronSource\n\nSet `includeDefaultSKAdNetworkIds: false` to disable defaults.\n\n## React Provider & Hooks\n\n### AppMachinaProvider\n\n```tsx\nimport { AppMachinaProvider } from '@appmachina/expo';\n\n<AppMachinaProvider\n  config={AppMachinaRNConfig}\n  requestTracking?: boolean     // Request ATT on mount. Default: false\n  enableDeepLinks?: boolean     // Listen for deep links. Default: true\n  onDeepLink?: (data) => void   // Deep link callback\n  onError?: (error) => void     // Error callback (init + runtime)\n>\n  {children}\n</AppMachinaProvider>\n```\n\nThe provider:\n\n1. Creates a `AppMachinaReactNative` instance\n2. Calls `init()` with AsyncStorage persistence\n3. Optionally requests ATT permission via `expo-tracking-transparency`\n4. Optionally sets up deep link listening via `expo-linking`\n5. Forwards runtime errors (from track/screen/flush) to `onError`\n6. Shuts down the SDK on unmount\n\n### useAppMachina\n\n```typescript\nfunction useAppMachina(): { isReady: boolean; appmachina: AppMachinaReactNative | null };\n```\n\nAccess the SDK context. Returns `isReady: false` until initialization completes.\n\n```tsx\nfunction MyComponent() {\n  const { isReady, appmachina } = useAppMachina();\n\n  if (!isReady) return <Text>Loading...</Text>;\n\n  return <Button title=\"Track\" onPress={() => appmachina?.track('button_press')} />;\n}\n```\n\n### useRequiredAppMachina\n\n```typescript\nfunction useRequiredAppMachina(): AppMachinaReactNative;\n```\n\nReturns the SDK instance, throwing an error if not yet initialized or used outside a `<AppMachinaProvider>`. Use when your component requires the SDK to be available.\n\n```tsx\nfunction CheckoutButton() {\n  const appmachina = useRequiredAppMachina();\n\n  return (\n    <Button\n      title=\"Checkout\"\n      onPress={() => appmachina.track('checkout_started', { cart_value: 49.99 })}\n    />\n  );\n}\n```\n\n### useAppMachinaTrack\n\n```typescript\nfunction useAppMachinaTrack(): (eventName: string, properties?: EventProperties) => void;\n```\n\nReturns a stable, memoized track function. No-op until the SDK initializes.\n\n```tsx\nconst track = useAppMachinaTrack();\ntrack('signup_click', { source: 'hero' });\n```\n\n### useAppMachinaScreen\n\n```typescript\nfunction useAppMachinaScreen(): (screenName: string, properties?: EventProperties) => void;\n```\n\nReturns a stable, memoized screen tracking function. No-op until the SDK initializes.\n\n```tsx\nconst screen = useAppMachinaScreen();\nuseEffect(() => {\n  screen('Profile');\n}, []);\n```\n\n## Imperative API\n\nAll exports from `@appmachina/react-native` are re-exported from `@appmachina/expo`. You can use the SDK without the provider:\n\n```typescript\nimport { AppMachinaReactNative } from '@appmachina/expo';\n\nconst appmachina = new AppMachinaReactNative({\n  appId: 'your-app-id',\n  environment: 'production'\n});\nawait appmachina.init();\n\nappmachina.track('event_name', { key: 'value' });\nappmachina.screen('ScreenName');\nappmachina.setAppUserId('user_123');\nawait appmachina.setUserProperties({ plan: 'premium' });\nawait appmachina.setConsent({ analytics: true, advertising: false });\nawait appmachina.flush();\nappmachina.shutdown();\n```\n\nSee the [@appmachina/react-native README](https://www.npmjs.com/package/@appmachina/react-native) for the full imperative API documentation.\n\n## ATT (App Tracking Transparency) -- iOS\n\n### Via Provider\n\nSet `requestTracking={true}` on `<AppMachinaProvider>` to automatically request ATT permission on mount.\n\n### Via Expo Functions\n\n```typescript\nimport { getExpoTrackingStatus, requestExpoTrackingPermission } from '@appmachina/expo';\n\n// Request permission (auto-updates device info and consent on the AppMachina instance)\nconst status = await requestExpoTrackingPermission(appmachina);\n// Returns: 'authorized' | 'denied' | 'restricted' | 'not_determined'\n\n// Check current status without prompting\nconst currentStatus = await getExpoTrackingStatus();\n```\n\nWhen `appmachina` is passed, `requestExpoTrackingPermission` automatically:\n\n- Collects IDFA if authorized\n- Updates device info with IDFA and ATT status\n- Sets advertising consent based on the result\n\n### Via SDK Instance\n\n```typescript\nconst status = await appmachina.requestTrackingPermission();\n```\n\nThis also auto-detects `expo-tracking-transparency` and prefers it when available.\n\n## Deep Links\n\n### Via Provider\n\nSet `enableDeepLinks={true}` (default) and provide an `onDeepLink` callback:\n\n```tsx\n<AppMachinaProvider\n  config={config}\n  enableDeepLinks={true}\n  onDeepLink={(data) => {\n    console.log('Deep link:', data.url);\n    navigation.navigate(data.path);\n  }}\n>\n```\n\n### Via Expo Functions\n\n```typescript\nimport { parseDeepLink, setupExpoDeepLinkListener } from '@appmachina/expo';\n\nconst cleanup = await setupExpoDeepLinkListener((data) => {\n  console.log('Deep link:', data.url);\n  console.log('Source:', data.queryParams.utm_source);\n});\n\n// Later: cleanup()\n```\n\n### Auto-Tracking\n\nThe SDK automatically tracks `deep_link_opened` events (configurable via `autoTrackDeepLinks` in the config). This runs in addition to your `onDeepLink` callback.\n\n## Clipboard Attribution -- iOS\n\n```typescript\nimport { readExpoClipboardAttribution } from '@appmachina/expo';\n\nconst data = await readExpoClipboardAttribution();\nif (data) {\n  console.log('Click URL:', data.clickUrl);\n  console.log('Click ID:', data.clickId);\n}\n```\n\nUses `expo-clipboard` under the hood. The SDK's `init()` also reads clipboard attribution automatically when enabled by remote config.\n\n## Expo Router Integration\n\nFor automatic screen tracking with Expo Router:\n\n```typescript\nimport { useAppMachinaExpoRouterTracking, useRequiredAppMachina } from '@appmachina/expo';\nimport { usePathname, useGlobalSearchParams } from 'expo-router';\n\nfunction RootLayout() {\n  const appmachina = useRequiredAppMachina();\n  useAppMachinaExpoRouterTracking(appmachina, usePathname, useGlobalSearchParams);\n\n  return <Stack />;\n}\n```\n\n## SKAdNetwork (SKAN) -- iOS\n\nSKAN is auto-configured from the server's remote config. No additional setup is required beyond including SKAdNetwork IDs in your config plugin (which is done by default).\n\nAccess the auto-configured SKAN manager:\n\n```typescript\nconst skanManager = appmachina.getSkanManager();\nif (skanManager) {\n  const metrics = skanManager.getMetrics();\n  console.log('Current conversion value:', metrics.currentValue);\n}\n```\n\nFor manual SKAN configuration, see the `@appmachina/react-native` documentation.\n\n## Full Export List\n\n### From `@appmachina/react-native`\n\n```typescript\n// Core\n(AppMachinaReactNative, AppMachinaError);\n\n// Types\n(AppMachinaRNConfig,\n  ConsentState,\n  DeviceContext,\n  Environment,\n  EventProperties,\n  UserProperties,\n  DeepLinkData,\n  ClipboardAttribution,\n  SKANConversionRule,\n  SKANPresetConfig,\n  SKANMetrics,\n  ATTStatus);\n\n// SKAN\nSKANManager;\n\n// ATT\n(getATTStatus, requestTrackingAuthorization, isATTAvailable, getAdvertisingId, getVendorId);\n\n// Deep Links\n(parseDeepLink, setupDeepLinkListener);\n\n// Utilities\n(getOrSetInstallId, readClipboardAttribution, useAppMachinaExpoRouterTracking);\n```\n\n### Expo-Specific\n\n```typescript\n// Config plugin\nwithAppMachina (default export from '@appmachina/expo/plugin')\nAppMachinaExpoPluginProps\n\n// ATT\nrequestExpoTrackingPermission, getExpoTrackingStatus\n\n// Deep Links\nsetupExpoDeepLinkListener\n\n// Clipboard\nreadExpoClipboardAttribution\n\n// React\nAppMachinaProvider, AppMachinaProviderProps,\nuseAppMachina, useRequiredAppMachina, useAppMachinaTrack, useAppMachinaScreen\n```\n","readmeFilename":"README.md"}