All modules:

Link copied to clipboard

The Adjust adapter, over an AdjustInstance and an AdjustConfig the app builds. Events reach Adjust through dashboard tokens. For revenue, the app maps its events to AdjustRevenueEvent and AdjustAdRevenueEvent. A fresh install stays silent until consent.

Link copied to clipboard

The Amplitude adapter, over an Amplitude the app builds. Events carry typed properties, properties become user properties, a ScreenViewEvent becomes Amplitude's own [Amplitude] Screen Viewed, and a purchase the app maps to AmplitudeRevenueEvent goes through Amplitude's revenue API.

Link copied to clipboard

The AppsFlyer adapter, over an AppsFlyerLib the app initialises. It sends events only, since AppsFlyer keeps no user attributes: conversions under AppsFlyer's predefined names, and revenue through AppsFlyerPurchaseEvent, AppsFlyerSubscribeEvent and AppsFlyerAdRevenueEvent, which the app maps its events to. AppsFlyer starts on consent, not on start-up.

Link copied to clipboard

Tracking from composables that have no ViewModel to track through: LocalEventTrackerService, TrackScreenView, TrackOnLifecycleEvent, rememberTracker and Modifier.trackImpression. Requires no DI framework.

Link copied to clipboard

The vocabulary and the fan-out. A plain Kotlin/JVM module with no Android, vendor or DI dependency.

Link copied to clipboard

The Firebase Analytics (GA4) adapter, over a FirebaseAnalytics the app owns. Typed parameters reach GA4 as numbers, and a ScreenViewEvent becomes GA4's reserved screen_view.

Link copied to clipboard

A provider that prints every call instead of sending it anywhere — for debug builds and for seeing what an app reports. It writes through the one-method AnalyticsLogger, so it depends on no logging library.

Link copied to clipboard

The Meta adapter, over an AppEventsLogger the app creates. It sends events only, since Meta keeps no user attributes: conversions under Meta's standard names, and purchases through MetaPurchaseEvent, which the app maps its events to. Meta sends nothing from Herald until consent.

Link copied to clipboard

The Mixpanel adapter, over a MixpanelAPI the app owns. It covers both of Mixpanel's stores: a UserProperty goes to the people profile, any other property becomes a super property.

Link copied to clipboard

FakeAnalyticsProvider: a provider that records every call instead of sending it, with assertions over what was recorded. Register it with a real Herald in tests, so they exercise the same setup you ship.