All modules:
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.
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.
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.
Tracking from composables that have no ViewModel to track through: LocalEventTrackerService, TrackScreenView, TrackOnLifecycleEvent, rememberTracker and Modifier.trackImpression. Requires no DI framework.
The vocabulary and the fan-out. A plain Kotlin/JVM module with no Android, vendor or DI dependency.
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.
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.
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.
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.
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.