Skip to content

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 through MetaPurchaseEvent.

Version 1.3.0

2026-10-17

  • Breaking: TokenAdjustEventTrackerFactory takes a list of AdjustTokens, 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 an IllegalArgumentException.

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: ScreenViewEvent no longer has screenName. A screen view's name is 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_name for Firebase and Mixpanel, [Amplitude] Screen Name for Amplitude) is refused with an IllegalArgumentException, reported to your error reporter, instead of having that parameter silently replaced.
  • Breaking: AppsFlyerPurchaseEvent and AppsFlyerSubscribeEvent refuse a parameter whose key they set themselves, such as af_revenue, instead of silently replacing it.
  • Breaking: FirebaseAnalyticsService and MixpanelAnalyticsService no longer take identificationEnabled. To keep the user id away from a vendor, register its provider without identity.
  • Breaking: MixpanelAnalyticsService no longer takes loggingEnabled. Set Mixpanel's logging on the MixpanelAPI with setEnableLogging, 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-appsflyer sends 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, and setEnabled(true) starts it, so a fresh install sends nothing, not even the install, before the user agrees.
  • New: AppsFlyerPurchaseEvent and AppsFlyerSubscribeEvent send af_purchase and af_subscribe with the amount under af_revenue. AppsFlyerAdRevenueEvent sends ad revenue through logAdRevenue.
  • New: herald-amplitude sends events to Amplitude, using the Amplitude Kotlin SDK. Parameters keep their type, properties become user properties, and a ScreenViewEvent becomes Amplitude's own [Amplitude] Screen Viewed.
  • New: AmplitudeRevenueEvent sends a purchase through Amplitude's revenue API. An optional insertId makes 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. RevenueEvent is AdjustRevenueEvent, and AdRevenueEvent is AdjustAdRevenueEvent. Your Adjust factory builds one from your event instead of your event implementing it.
  • Breaking: AdjustRevenueEvent is sent with the new RevenueEventTracker, which takes the token. toAdjustEvent no longer adds revenue to an event.
  • Breaking: AdRevenueAdjustEventTrackerFactory is removed. Your own Adjust factory now builds an AdjustAdRevenueEvent and passes it to AdRevenueEventTracker.

Version 1.0.0

2026-09-18

The first release.

  • New: herald-core holds events, properties and Herald itself, with no Android, vendor SDK or DI library.
  • New: Five small interfaces for your classes: EventTrackerService, PropertyTrackerService, IdentifiableUserService, AnalyticsLifecycleService and ConsentService.
  • New: Herald passes each call to every vendor at the same time. A vendor that fails doesn't affect the others, and the failure goes to your AnalyticsErrorReporter.
  • New: Factories decide what each vendor receives, answering with a Resolution: Claimed, Dropped or Declined. The last factory in each vendor's chain decides what happens to events no other factory took.
  • New: Two marker types, ScreenViewEvent and UserProperty.
  • New: herald-firebase sends to Firebase Analytics, with typed parameters and GA4's own screen_view.
  • New: herald-adjust sends 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-mixpanel sends to Mixpanel, including the person's profile and super properties.
  • New: herald-log prints every call to Logcat, for debug builds.
  • New: herald-compose tracks from composables: LocalEventTrackerService, TrackScreenView, TrackOnLifecycleEvent, rememberTracker and Modifier.trackImpression.
  • New: herald-testing provides FakeAnalyticsProvider, which records every call so your tests can check them.