{"_id":"@bitte-kaufen/expo-umami","_rev":"7-b6074064fe6dae45ee9ad22158091892","name":"@bitte-kaufen/expo-umami","dist-tags":{"latest":"0.2.6"},"versions":{"0.1.0":{"name":"@bitte-kaufen/expo-umami","version":"0.1.0","keywords":["expo","umami","analytics","tracking","react-native","bitte-kaufen"],"author":{"name":"Sascha Depold","email":"sascha@depold.com"},"license":"MIT","_id":"@bitte-kaufen/expo-umami@0.1.0","maintainers":[{"name":"sdepold","email":"sascha@depold.com"}],"homepage":"https://github.com/bitte-kaufen/expo-umami#readme","bugs":{"url":"https://github.com/bitte-kaufen/expo-umami/issues"},"dist":{"shasum":"0155aeaa0657cbdb53d16beceb3397c24c48ed24","tarball":"https://registry.npmjs.org/@bitte-kaufen/expo-umami/-/expo-umami-0.1.0.tgz","fileCount":48,"integrity":"sha512-SWsXcucT2ZWYtsWiFAq5hiiUiFaeNx7lRal9mcVHe3AeGdCGWpoqGz4uV/tVWomClVWTaad6xeOduPYcf/C4oQ==","signatures":[{"sig":"MEUCIQDzjzSEtCwtufPFmytbXoKshfD5PuliFqR9GaFH6FhkcQIgI9j1GGJLDOnLim554J1nfLi1GlpUXQMN2ikrhj71sE0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85881},"main":"build/src/index.js","types":"build/src/index.d.ts","gitHead":"5ecd7e32e5d3d265629f2741ad9f39f937084384","scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf build","watch":"tsc --watch","prepare":"npm run build","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"sdepold","email":"sascha@depold.com"},"repository":{"url":"git+https://github.com/bitte-kaufen/expo-umami.git","type":"git"},"_npmVersion":"10.9.4","description":"Umami analytics integration for Expo apps with batching and offline support","directories":{},"_nodeVersion":"22.21.1","dependencies":{"change-case":"^5.4.4","expo-device":"*","expo-constants":"*","expo-application":"*","expo-localization":"^17.0.8","@expo/config-plugins":"^8.0.0","@react-native-async-storage/async-storage":"^1.23.0"},"_hasShrinkwrap":false,"devDependencies":{"expo":"^51.0.0","react":"^18.2.0","vitest":"^4.0.15","typescript":"^5.3.0","@types/react":"^18.2.0","react-native":"^0.74.0","@types/react-native":"^0.72.0","@vitest/coverage-v8":"^4.0.15","react-test-renderer":"18.2.0","@testing-library/jest-native":"^5.4.3","@testing-library/react-native":"^13.3.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-umami_0.1.0_1765112480424_0.28561587920042975","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bitte-kaufen/expo-umami","version":"0.2.0","keywords":["expo","umami","analytics","tracking","react-native","bitte-kaufen"],"author":{"name":"Sascha Depold","email":"sascha@depold.com"},"license":"MIT","_id":"@bitte-kaufen/expo-umami@0.2.0","maintainers":[{"name":"sdepold","email":"sascha@depold.com"}],"homepage":"https://github.com/bitte-kaufen/expo-umami#readme","bugs":{"url":"https://github.com/bitte-kaufen/expo-umami/issues"},"app":"build/plugin/src/index.js","dist":{"shasum":"9a45333c495129057e91b7aaab20cfc7070e1652","tarball":"https://registry.npmjs.org/@bitte-kaufen/expo-umami/-/expo-umami-0.2.0.tgz","fileCount":48,"integrity":"sha512-RUj8+mUW4W+8RhSPZXFMqFQl2vswQV8WpsRJfaGq+RH2Ch4swZVVN0wb1wTeByGq6px4y6kunCyMpDa4+AIr1g==","signatures":[{"sig":"MEUCIQC6TsVsGaHArlOh2EhI7MqI1falP8f00vJwI2WeBJssoAIgevyu79jmBHIVN+CJ4TViEEulhJ0Xn/IJezy1M2C8VJw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86001},"main":"build/src/index.js","types":"build/src/index.d.ts","gitHead":"13b3ae6efad5de0bb25977ec1430dee9623fe4f3","scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf build","watch":"tsc --watch","prepare":"npm run build","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"sdepold","email":"sascha@depold.com"},"repository":{"url":"git+https://github.com/bitte-kaufen/expo-umami.git","type":"git"},"_npmVersion":"10.9.4","description":"Umami analytics integration for Expo apps with batching and offline support","directories":{},"_nodeVersion":"22.21.1","dependencies":{"change-case":"^5.4.4","expo-device":"*","expo-constants":"*","expo-application":"*","expo-localization":"^17.0.8","@expo/config-plugins":"^8.0.0","@react-native-async-storage/async-storage":"^1.23.0"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"expo":"^51.0.0","react":"^18.2.0","vitest":"^4.0.15","typescript":"^5.3.0","@types/react":"^18.2.0","react-native":"^0.74.0","@types/react-native":"^0.72.0","@vitest/coverage-v8":"^4.0.15","react-test-renderer":"18.2.0","@testing-library/jest-native":"^5.4.3","@testing-library/react-native":"^13.3.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-umami_0.2.0_1765120101339_0.7420164185230289","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bitte-kaufen/expo-umami","version":"0.2.1","keywords":["expo","umami","analytics","tracking","react-native","bitte-kaufen"],"author":{"name":"Sascha Depold","email":"sascha@depold.com"},"license":"MIT","_id":"@bitte-kaufen/expo-umami@0.2.1","maintainers":[{"name":"sdepold","email":"sascha@depold.com"}],"homepage":"https://github.com/bitte-kaufen/expo-umami#readme","bugs":{"url":"https://github.com/bitte-kaufen/expo-umami/issues"},"app":"build/plugin/src/index.js","dist":{"shasum":"de9478a6e1617e19adcd98798ecf6f3052931a72","tarball":"https://registry.npmjs.org/@bitte-kaufen/expo-umami/-/expo-umami-0.2.1.tgz","fileCount":49,"integrity":"sha512-Oue2s4FLFCCRxXNDkaocpF0ZxOTRgTscbUN7EnYxFDbPTv/l3Eh2ED44/bngWHo8O3egMy5NIJ8axgu8LidPXg==","signatures":[{"sig":"MEUCIQDyCWdnyqTXeVIjnVuTNfzJEPa8XmS5oWKqEfj1s8jEwwIgRbIJZGgd0lu9aDOIxBIbHbm8yJs8/SDL60MpoeNTx98=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85962},"main":"build/src/index.js","types":"build/src/index.d.ts","gitHead":"fd1f109c6547bf94d7c9c139ff30c0e040fbe604","scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf build","watch":"tsc --watch","prepare":"npm run build","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"sdepold","email":"sascha@depold.com"},"repository":{"url":"git+https://github.com/bitte-kaufen/expo-umami.git","type":"git"},"_npmVersion":"10.9.4","description":"Umami analytics integration for Expo apps with batching and offline support","directories":{},"_nodeVersion":"22.21.1","dependencies":{"change-case":"^5.4.4","expo-device":"*","expo-constants":"*","expo-application":"*","expo-localization":"^17.0.8","@expo/config-plugins":"^8.0.0","@react-native-async-storage/async-storage":"^1.23.0"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"expo":"^51.0.0","react":"^18.2.0","vitest":"^4.0.15","typescript":"^5.3.0","@types/react":"^18.2.0","react-native":"^0.74.0","@types/react-native":"^0.72.0","@vitest/coverage-v8":"^4.0.15","react-test-renderer":"18.2.0","@testing-library/jest-native":"^5.4.3","@testing-library/react-native":"^13.3.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-umami_0.2.1_1765120730011_0.9455530066294886","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@bitte-kaufen/expo-umami","version":"0.2.3","keywords":["expo","umami","analytics","tracking","react-native","bitte-kaufen"],"author":{"name":"Sascha Depold","email":"sascha@depold.com"},"license":"MIT","_id":"@bitte-kaufen/expo-umami@0.2.3","maintainers":[{"name":"sdepold","email":"sascha@depold.com"}],"homepage":"https://github.com/bitte-kaufen/expo-umami#readme","bugs":{"url":"https://github.com/bitte-kaufen/expo-umami/issues"},"app":"build/plugin/src/index.js","dist":{"shasum":"40f51a345d86fc7ad433d784c4473bb4b3e2da6b","tarball":"https://registry.npmjs.org/@bitte-kaufen/expo-umami/-/expo-umami-0.2.3.tgz","fileCount":53,"integrity":"sha512-Y9Tn0iO9Dr1h28lyDYs+b+5zwchZXnCRa9UocnojeTgIIcIg0mxfj+B6ZyaxF/fe4p6/3IngKOItNvwQljYeAw==","signatures":[{"sig":"MEUCIHbdfYIc/ahw/4ZtzzfViPQll6PbUmv5o+K5OVaDyFSzAiEAqFxo7xliegMJliNaiVWI/QoWCh2cheAtib63cZkn2WY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89650},"main":"build/src/index.js","types":"build/src/index.d.ts","gitHead":"42b5294b909965d74673fae51ae4541cc668713d","scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf build","watch":"tsc --watch","prepare":"npm run build","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"sdepold","email":"sascha@depold.com"},"repository":{"url":"git+https://github.com/bitte-kaufen/expo-umami.git","type":"git"},"_npmVersion":"10.9.4","description":"Umami analytics integration for Expo apps with batching and offline support","directories":{},"_nodeVersion":"22.21.1","dependencies":{"change-case":"^5.4.4","expo-device":"*","expo-constants":"*","expo-application":"*","expo-localization":"^17.0.8","@expo/config-plugins":"^8.0.0","@react-native-async-storage/async-storage":"^1.23.0"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"expo":"^51.0.0","react":"^18.2.0","vitest":"^4.0.15","typescript":"^5.3.0","@types/react":"^18.2.0","react-native":"^0.74.0","@types/react-native":"^0.72.0","@vitest/coverage-v8":"^4.0.15","react-test-renderer":"18.2.0","@testing-library/jest-native":"^5.4.3","@testing-library/react-native":"^13.3.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-umami_0.2.3_1765123154912_0.18737907820473088","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@bitte-kaufen/expo-umami","version":"0.2.4","keywords":["expo","umami","analytics","tracking","react-native","bitte-kaufen"],"author":{"name":"Sascha Depold","email":"sascha@depold.com"},"license":"MIT","_id":"@bitte-kaufen/expo-umami@0.2.4","maintainers":[{"name":"sdepold","email":"sascha@depold.com"}],"homepage":"https://github.com/bitte-kaufen/expo-umami#readme","bugs":{"url":"https://github.com/bitte-kaufen/expo-umami/issues"},"app":"build/plugin/src/index.js","dist":{"shasum":"2c5d43728d79978e556369e35e6474405803023f","tarball":"https://registry.npmjs.org/@bitte-kaufen/expo-umami/-/expo-umami-0.2.4.tgz","fileCount":54,"integrity":"sha512-N+SiX4KuBHFwRbqaSK87tx7Plw7sW5pqe9fFqJpuBmy/w2/VAk6oulvr5ITyRyivvtNpUl6RhF6B03PdScUCJw==","signatures":[{"sig":"MEUCIG3iruEkZDNwfA1WgdiCYk3TjiK66juteDgQPI4uvyLSAiEA3P46FX9CJ+f5ZUqBp22AFk8nvzXuG9DUnaGb5egg9nc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98881},"main":"build/src/index.js","types":"build/src/index.d.ts","gitHead":"565201efe8ea15a700bd5218ded01d51af77d784","scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf build","watch":"tsc --watch","prepare":"npm run build","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"sdepold","email":"sascha@depold.com"},"repository":{"url":"git+https://github.com/bitte-kaufen/expo-umami.git","type":"git"},"_npmVersion":"10.9.4","description":"Umami analytics integration for Expo apps with batching and offline support","directories":{},"_nodeVersion":"22.21.1","dependencies":{"expo-device":"*","expo-constants":"*","expo-application":"*","expo-localization":"^17.0.8","@expo/config-plugins":"^8.0.0","@react-native-async-storage/async-storage":"^1.23.0"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"expo":"^51.0.0","react":"^18.2.0","vitest":"^4.0.15","typescript":"^5.3.0","@types/react":"^18.2.0","react-native":"^0.74.0","@types/react-native":"^0.72.0","@vitest/coverage-v8":"^4.0.15","react-test-renderer":"18.2.0","@testing-library/jest-native":"^5.4.3","@testing-library/react-native":"^13.3.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-umami_0.2.4_1765136276870_0.36864470299532925","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@bitte-kaufen/expo-umami","version":"0.2.5","keywords":["expo","umami","analytics","tracking","react-native","bitte-kaufen"],"author":{"name":"Sascha Depold","email":"sascha@depold.com"},"license":"MIT","_id":"@bitte-kaufen/expo-umami@0.2.5","maintainers":[{"name":"sdepold","email":"sascha@depold.com"}],"homepage":"https://github.com/bitte-kaufen/expo-umami#readme","bugs":{"url":"https://github.com/bitte-kaufen/expo-umami/issues"},"app":"build/plugin/src/index.js","dist":{"shasum":"cc17fbf5cd7f0185dcbcc72b4f8d3ada18ab3d22","tarball":"https://registry.npmjs.org/@bitte-kaufen/expo-umami/-/expo-umami-0.2.5.tgz","fileCount":54,"integrity":"sha512-zDCrRaQkE5MM3EJjvg+UtbEmGGJOeB9HdP3ubhVdTohIBlZa8xdFsEhf2UZRBGJLwtvg5ugZZo5063/KP6a42w==","signatures":[{"sig":"MEUCIQDfHdJYIrQc0cKXpmqKXcp/5Fou0EccCquED2FGNOyjQAIgRZHu7tTw6G6we/jVXR/KwfffklPfL9pStFXvh9C19Pg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99712},"main":"build/src/index.js","types":"build/src/index.d.ts","gitHead":"68a30590a7869d7578677e17f9b75475015855db","scripts":{"test":"vitest run","build":"tsc","clean":"rm -rf build","watch":"tsc --watch","prepare":"npm run build","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"sdepold","email":"sascha@depold.com"},"repository":{"url":"git+https://github.com/bitte-kaufen/expo-umami.git","type":"git"},"_npmVersion":"10.9.4","description":"Umami analytics integration for Expo apps with batching and offline support","directories":{},"_nodeVersion":"22.21.1","dependencies":{"expo-device":"*","expo-constants":"*","expo-application":"*","expo-localization":"^17.0.8","@expo/config-plugins":"^8.0.0","@react-native-async-storage/async-storage":"^1.23.0"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"expo":"^51.0.0","react":"^18.2.0","vitest":"^4.0.15","typescript":"^5.3.0","@types/react":"^18.2.0","react-native":"^0.74.0","@types/react-native":"^0.72.0","@vitest/coverage-v8":"^4.0.15","react-test-renderer":"18.2.0","@testing-library/jest-native":"^5.4.3","@testing-library/react-native":"^13.3.3"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/expo-umami_0.2.5_1765567404721_0.2753515202962362","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@bitte-kaufen/expo-umami","version":"0.2.6","description":"Umami analytics integration for Expo apps with batching and offline support","main":"build/src/index.js","types":"build/src/index.d.ts","app":"build/plugin/src/index.js","scripts":{"build":"tsc","watch":"tsc --watch","clean":"rm -rf build","prepare":"npm run build","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","typecheck":"tsc --noEmit"},"keywords":["expo","umami","analytics","tracking","react-native","bitte-kaufen"],"author":{"name":"Sascha Depold","email":"sascha@depold.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/bitte-kaufen/expo-umami.git"},"peerDependencies":{"expo":"*","react":"*","react-native":"*"},"dependencies":{"@expo/config-plugins":"^8.0.0","@react-native-async-storage/async-storage":"^1.23.0","expo-application":"*","expo-constants":"*","expo-device":"*","expo-localization":"^17.0.8"},"devDependencies":{"@testing-library/jest-native":"^5.4.3","@testing-library/react-native":"^13.3.3","@types/react":"^18.2.0","@types/react-native":"^0.72.0","@vitest/coverage-v8":"^4.0.15","expo":"^51.0.0","react":"^18.2.0","react-native":"^0.74.0","react-test-renderer":"18.2.0","typescript":"^5.3.0","vitest":"^4.0.15"},"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","_id":"@bitte-kaufen/expo-umami@0.2.6","gitHead":"b03e696da7c5f47a10302d75f1a9e55fd3b01d1c","bugs":{"url":"https://github.com/bitte-kaufen/expo-umami/issues"},"homepage":"https://github.com/bitte-kaufen/expo-umami#readme","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-pQ7mSbuIf0ypus7kRnU+IH3X7NsWg9zBLqSIsWC4FSttCmzOyy8etNdxPHcFh3j8B6GxiCpz2DJj36VwrPox7A==","shasum":"df08e2fb1bc42f5ccf9115bb153f6eeb7edb3a82","tarball":"https://registry.npmjs.org/@bitte-kaufen/expo-umami/-/expo-umami-0.2.6.tgz","fileCount":56,"unpackedSize":104856,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDJbK+qHpCPfCg5OgArV4WlMQoLDizmChEcniaVHoGCoAIgWWkmuz5HMefUY3vO3L4dh5jWv3GzbvH38W0qQXphVCY="}]},"_npmUser":{"name":"sdepold","email":"sascha@depold.com"},"directories":{},"maintainers":[{"name":"sdepold","email":"sascha@depold.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/expo-umami_0.2.6_1765652265830_0.2267377619541613"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-07T13:01:20.320Z","modified":"2025-12-13T18:57:46.261Z","0.1.0":"2025-12-07T13:01:20.588Z","0.2.0":"2025-12-07T15:08:21.491Z","0.2.1":"2025-12-07T15:18:50.151Z","0.2.3":"2025-12-07T15:59:15.066Z","0.2.4":"2025-12-07T19:37:57.034Z","0.2.5":"2025-12-12T19:23:24.869Z","0.2.6":"2025-12-13T18:57:46.008Z"},"bugs":{"url":"https://github.com/bitte-kaufen/expo-umami/issues"},"author":{"name":"Sascha Depold","email":"sascha@depold.com"},"license":"MIT","homepage":"https://github.com/bitte-kaufen/expo-umami#readme","keywords":["expo","umami","analytics","tracking","react-native","bitte-kaufen"],"repository":{"type":"git","url":"git+https://github.com/bitte-kaufen/expo-umami.git"},"description":"Umami analytics integration for Expo apps with batching and offline support","maintainers":[{"name":"sdepold","email":"sascha@depold.com"}],"readme":"# @bitte-kaufen/expo-umami\n\n[![CI](https://github.com/bitte-kaufen/expo-umami/actions/workflows/ci.yml/badge.svg)](https://github.com/bitte-kaufen/expo-umami/actions/workflows/ci.yml)\n[![npm version](https://badge.fury.io/js/@bitte-kaufen%2Fexpo-umami.svg)](https://badge.fury.io/js/@bitte-kaufen%2Fexpo-umami)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nEasy Umami analytics integration for Expo apps with automatic batching, offline support, and app state management.\n\n## Features\n\n- **Easy Setup**: Configure via `app.json` or programmatically\n- **Automatic Batching**: Groups events and sends them in batches to reduce network calls\n- **Smart Flushing**: Automatically flushes queue when app backgrounds or closes\n- **Offline Support**: Optional AsyncStorage persistence for offline events\n- **TypeScript**: Full type safety out of the box\n- **Expo Integration**: Built specifically for Expo applications\n\n## Installation\n\n```bash\nnpx expo install @bitte-kaufen/expo-umami @react-native-async-storage/async-storage expo-application expo-constants expo-device expo-localization\n```\n\n## Configuration\n\n### Option 1: Config Plugin (Recommended)\n\nAdd the plugin to your `app.json`:\n\n```json\n{\n  \"expo\": {\n    \"plugins\": [\n      [\n        \"@bitte-kaufen/expo-umami\",\n        {\n          \"websiteId\": \"your-website-id\",\n          \"hostUrl\": \"https://analytics.example.com\",\n          \"batchSize\": 10,\n          \"batchInterval\": 30000,\n          \"persistEvents\": true,\n          \"debug\": false\n        }\n      ]\n    ]\n  }\n}\n```\n\nThen initialize in your app without parameters:\n\n```typescript\nimport { initUmami } from '@bitte-kaufen/expo-umami';\n\n// In your App.tsx or _layout.tsx\nuseEffect(() => {\n  initUmami(); // Reads config from app.json\n}, []);\n```\n\n### Option 2: Programmatic Configuration\n\n```typescript\nimport { initUmami } from '@bitte-kaufen/expo-umami';\n\nuseEffect(() => {\n  initUmami({\n    websiteId: 'ed825179-00f1-4828-a8a3-df52b68b58b5',\n    hostUrl: 'https://analytics.bitte.kaufen',\n    batchSize: 10,        // Send after 10 events (default: 10)\n    batchInterval: 30000, // Or every 30 seconds (default: 30000)\n    persistEvents: true,  // Save to AsyncStorage for offline (default: false)\n    debug: true,          // Enable debug logging (default: false)\n  });\n}, []);\n```\n\n## Usage\n\n> **💡 Best Practice: Use Web-Style URLs**\n> \n> When tracking screens, use web-style URL paths (e.g., `/home`, `/product/details`) instead of component names (e.g., `HomeScreen`, `ProductDetailsScreen`). This:\n> - Makes analytics data consistent with web applications\n> - Provides cleaner, more readable URLs in Umami dashboard\n> - Allows for hierarchical organization (`/settings/profile`, `/settings/notifications`)\n> - Example: Use `/overview` instead of `OverviewScreen`\n\n### Track Screen Views\n\n```typescript\nimport { trackEvent, trackScreenView } from '@bitte-kaufen/expo-umami';\n\nfunction HomeScreen() {\n  useEffect(() => {\n    trackScreenView('/home', { title: 'Home Screen' });\n  }, []);\n\n  return <View>...</View>;\n}\n```\n\n### Track Events with Data\n\n```typescript\nimport { trackEvent } from '@bitte-kaufen/expo-umami';\n\nfunction ProductScreen() {\n  const handlePurchase = () => {\n    trackEvent('/product/purchase', {\n      title: 'Product Purchase',\n      data: {\n        productId: '123',\n        price: 29.99,\n        currency: 'USD',\n      },\n    });\n  };\n\n  return <Button onPress={handlePurchase}>Buy Now</Button>;\n}\n```\n\n### Track Custom Events (Clicks, Impressions, etc.)\n\n```typescript\nimport { trackClick, trackImpression, trackCustomEvent } from '@bitte-kaufen/expo-umami';\n\nfunction ProductCard({ product }) {\n  useEffect(() => {\n    // Track when product card is viewed\n    trackImpression('/product/card', {\n      title: 'Product Card',\n      data: { productId: product.id, price: product.price },\n    });\n  }, [product]);\n\n  const handleAddToCart = () => {\n    // Track button click\n    trackClick('/product/add-to-cart', {\n      title: 'Add to Cart Button',\n      data: { productId: product.id },\n    });\n  };\n\n  const handleShare = () => {\n    // Track custom event with any name\n    trackCustomEvent('/product/card', 'share', {\n      title: 'Product Card',\n      data: { productId: product.id, method: 'social' },\n    });\n  };\n\n  return (\n    <View>\n      <Button onPress={handleAddToCart}>Add to Cart</Button>\n      <Button onPress={handleShare}>Share</Button>\n    </View>\n  );\n}\n```\n\n### Advanced: Custom Event Names\n\nYou can also pass a custom event name and title to `trackEvent`:\n\n```typescript\ntrackEvent('/home/hero', {\n  title: 'Home Hero Banner',\n  eventName: 'banner_interaction',\n  data: { position: 'top', action: 'swipe' },\n});\n```\n\n### Manual Flush\n\n```typescript\nimport { flush } from '@bitte-kaufen/expo-umami';\n\n// Force send all queued events immediately\nawait flush();\n```\n\n### Check Status\n\n```typescript\nimport { isInitialized, getQueueSize } from '@bitte-kaufen/expo-umami';\n\nconsole.log('Initialized:', isInitialized());\nconsole.log('Queued events:', getQueueSize());\n```\n\n## Configuration Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `websiteId` | string | **required** | Your Umami website ID |\n| `hostUrl` | string | **required** | Your Umami instance URL |\n| `batchSize` | number | `10` | Number of events before auto-flush |\n| `batchInterval` | number | `30000` | Milliseconds between auto-flushes |\n| `persistEvents` | boolean | `false` | Save events to AsyncStorage for offline |\n| `debug` | boolean | `false` | Enable console logging |\n\n## How It Works\n\n1. **Event Queueing**: Events are added to an in-memory queue\n2. **Batch Sending**: Events are sent when:\n   - Queue reaches `batchSize` events, or\n   - `batchInterval` milliseconds have passed, or\n   - App goes to background/inactive state\n3. **Batch API**: Uses Umami's `/api/batch` endpoint for efficient bulk sending\n4. **Offline Support**: When enabled, events persist to AsyncStorage and survive app restarts\n5. **URL Normalization**: Automatically ensures URLs start with `/` for consistency\n\n## Event Formatting\n\nURLs are used as-is with minimal normalization:\n\n```typescript\ntrackEvent('/home/product-list');\n// Sends: url = '/home/product-list', title = '/home/product-list'\n\ntrackEvent('/settings', { title: 'Settings Screen' });\n// Sends: url = '/settings', title = 'Settings Screen'\n\ntrackEvent('home');\n// Sends: url = '/home', title = 'home' (automatically adds leading /)\n```\n\n## API Reference\n\n### `initUmami(config?: UmamiConfig): Promise<void>`\n\nInitialize the Umami client. Can be called without parameters if using config plugin.\n\n### `trackEvent(url: string, options?: TrackEventOptions): Promise<void>`\n\nTrack a screen view or event. Options include:\n- `title?: string` - Custom title for the event (defaults to url)\n- `eventName?: string` - Custom event name (makes it a custom event instead of pageview)\n- `data?: Record<string, any>` - Custom event data\n\n### `trackScreenView(url: string, options?: TrackEventOptions): Promise<void>`\n\nAlias for `trackEvent`. Use whichever reads better in your code.\n\n### `trackClick(elementName: string, options?: TrackEventOptions): Promise<void>`\n\nTrack a click event. Automatically sets event name to 'click'.\n\n### `trackImpression(elementName: string, options?: TrackEventOptions): Promise<void>`\n\nTrack an impression event. Automatically sets event name to 'impression'.\n\n### `trackCustomEvent(url: string, eventName: string, options?: TrackEventOptions): Promise<void>`\n\nTrack a custom event with a specific event name.\n\n### `flush(): Promise<void>`\n\nManually flush all queued events immediately.\n\n### `isInitialized(): boolean`\n\nCheck if the client has been initialized.\n\n### `getQueueSize(): number`\n\nGet the current number of queued events.\n\n## Example App\n\n```typescript\n// app/_layout.tsx\nimport { useEffect } from 'react';\nimport { initUmami } from '@bitte-kaufen/expo-umami';\nimport { Stack } from 'expo-router';\n\nexport default function RootLayout() {\n  useEffect(() => {\n    initUmami(); // Uses app.json config\n  }, []);\n\n  return <Stack />;\n}\n\n// app/index.tsx\nimport { useEffect } from 'react';\nimport { View, Text } from 'react-native';\nimport { trackScreenView } from '@bitte-kaufen/expo-umami';\n\nexport default function HomeScreen() {\n  useEffect(() => {\n    trackScreenView('/home', { title: 'Home Screen' });\n  }, []);\n\n  return (\n    <View>\n      <Text>Welcome!</Text>\n    </View>\n  );\n}\n```\n\n## Migration from Umami Tracker\n\nIf you're currently using `umami.track()` directly:\n\n**Before:**\n```typescript\numami.track({\n  hostname: Application.applicationId ?? \"unknown.app\",\n  language: i18n.currentLocale(),\n  screen: `${Layout.window.width}x${Layout.window.height}`,\n  title: screenName,\n  url: `/my-page`,\n  data: { foo: 'bar' },\n});\n```\n\n**After:**\n```typescript\ntrackEvent('/my-page', {\n  title: 'My Page',\n  data: { foo: 'bar' },\n});\n```\n\nAll the boilerplate (hostname, language, screen size) is handled automatically.\n\n## License\n\nMIT\n\n## Contributing\n\nContributions are welcome! Please open an issue or PR on GitHub.\n","readmeFilename":"README.md"}