Change Log¶
Version 1.4.0¶
2026-10-18
- New:
herald-meta, which sends events to Meta's App Events, over Meta's Android SDK 19: conversions under Meta's standard names, and purchases throughMetaPurchaseEvent.
Version 1.3.0¶
2026-10-17
- Breaking:
TokenAdjustEventTrackerFactorytakes a list ofAdjustTokens, each pairing a token with an event type, instead of a map from event names:listOf(AdjustToken<SignUpCompleted>("abc123")). A renamed event keeps its token, the compiler checks the list, and an event that extends a listed type uses its token too. A type listed twice throws anIllegalArgumentException.
Version 1.2.0¶
2026-10-05
This release makes Herald stricter about data that used to be dropped without a word, and removes two settings that duplicated what you already control elsewhere.
- Breaking:
ScreenViewEventno longer hasscreenName. A screen view'snameis the screen's name, and every vendor sends it as the screen name. To show a different name in one vendor's screen reports, put a factory for that event before the vendor's screen-view factory. - Breaking: A screen view with its own screen-name parameter (
screen_namefor Firebase and Mixpanel,[Amplitude] Screen Namefor Amplitude) is refused with anIllegalArgumentException, reported to your error reporter, instead of having that parameter silently replaced. - Breaking:
AppsFlyerPurchaseEventandAppsFlyerSubscribeEventrefuse a parameter whose key they set themselves, such asaf_revenue, instead of silently replacing it. - Breaking:
FirebaseAnalyticsServiceandMixpanelAnalyticsServiceno longer takeidentificationEnabled. To keep the user id away from a vendor, register its provider withoutidentity. - Breaking:
MixpanelAnalyticsServiceno longer takesloggingEnabled. Set Mixpanel's logging on theMixpanelAPIwithsetEnableLogging, as Mixpanel's docs describe.
Version 1.1.0¶
2026-09-30
This release adds two vendors, AppsFlyer and Amplitude, and changes how you send revenue to Adjust. Your events no longer implement a vendor's revenue type. Instead, the vendor's factory builds that type from your event, so your events stay free of vendor code. See Revenue.
- New:
herald-appsflyersends events to AppsFlyer, using AppsFlyer SDK 7. AppsFlyer keeps no user attributes, so this module handles events only. - New: AppsFlyer starts when the user gives consent.
start()keeps the SDK stopped, andsetEnabled(true)starts it, so a fresh install sends nothing, not even the install, before the user agrees. - New:
AppsFlyerPurchaseEventandAppsFlyerSubscribeEventsendaf_purchaseandaf_subscribewith the amount underaf_revenue.AppsFlyerAdRevenueEventsends ad revenue throughlogAdRevenue. - New:
herald-amplitudesends events to Amplitude, using the Amplitude Kotlin SDK. Parameters keep their type, properties become user properties, and aScreenViewEventbecomes Amplitude's own[Amplitude] Screen Viewed. - New:
AmplitudeRevenueEventsends a purchase through Amplitude's revenue API. An optionalinsertIdmakes a purchase reported twice count once. - New: Amplitude consent uses Amplitude's opt-out, and
start()waits for the SDK to finish setting up, so a failed setup is reported to you. - New: Each module's API reference opens with an overview of the module, and every class links to its source code at the release tag. This applies to the javadoc jars on Maven Central and to the new website.
- Breaking: Adjust's revenue types are renamed and are now final data classes.
RevenueEventisAdjustRevenueEvent, andAdRevenueEventisAdjustAdRevenueEvent. Your Adjust factory builds one from your event instead of your event implementing it. - Breaking:
AdjustRevenueEventis sent with the newRevenueEventTracker, which takes the token.toAdjustEventno longer adds revenue to an event. - Breaking:
AdRevenueAdjustEventTrackerFactoryis removed. Your own Adjust factory now builds anAdjustAdRevenueEventand passes it toAdRevenueEventTracker.
Version 1.0.0¶
2026-09-18
The first release.
- New:
herald-coreholds events, properties andHeralditself, with no Android, vendor SDK or DI library. - New: Five small interfaces for your classes:
EventTrackerService,PropertyTrackerService,IdentifiableUserService,AnalyticsLifecycleServiceandConsentService. - New:
Heraldpasses each call to every vendor at the same time. A vendor that fails doesn't affect the others, and the failure goes to yourAnalyticsErrorReporter. - New: Factories decide what each vendor receives, answering with a
Resolution:Claimed,DroppedorDeclined. The last factory in each vendor's chain decides what happens to events no other factory took. - New: Two marker types,
ScreenViewEventandUserProperty. - New:
herald-firebasesends to Firebase Analytics, with typed parameters and GA4's ownscreen_view. - New:
herald-adjustsends to Adjust (SDK v5): events by dashboard token, purchases with revenue, and ad revenue. A fresh install stays quiet until the user gives consent. - New:
herald-mixpanelsends to Mixpanel, including the person's profile and super properties. - New:
herald-logprints every call to Logcat, for debug builds. - New:
herald-composetracks from composables:LocalEventTrackerService,TrackScreenView,TrackOnLifecycleEvent,rememberTrackerandModifier.trackImpression. - New:
herald-testingprovidesFakeAnalyticsProvider, which records every call so your tests can check them.