SDK changelog

What changed in the code that collects your data, and what it means for numbers you have already looked at. Each SDK also ships its own CHANGELOG.md inside its package; this page is the aggregate.

Reading dead clicks across this boundary

The interactive prop on click events — the thing dead-click detection reads — changed meaning in the web tracker 0.2.0, Capacitor 0.3.0 and React Native 0.7.0. A window spanning those upgrades mixes two definitions, and so does any project that runs both a site and an app. Segment app traffic from web while comparing, and prefer windows that sit entirely on one side.

Server

2026-08agenthog.io
  • added

    Attribution attach and Singular postbacks

    Two new ways for third-party attribution to reach a session’s utm_* columns: the context.attribution wire field (an MMP verdict attached by the SDK), and POST /postbacks/singular — Singular Internal BI postbacks delivered server to server, configured from project settings. Precedence per column: a real deep-link value > the MMP verdict > the install-referrer stamp; an organic answer never erases the referrer verdict. ah user now derives first_touch/latest_touch from the session ledger, and ah users --source filters people by first-touch source.
  • changed

    utm_source is alias-normalized at ingest

    The same network used to appear under several spellings depending on the pipe — Facebook, fb4a, apps.facebook.com from Meta alone. New sessions store one canonical name (meta, google, tiktok, …); unknown values pass through unchanged, and raw values survive in landing_params. Historical rows are not rewritten, so a source report spanning this deploy can show the same network split across old and new spellings — a seam at the deploy date, not a data change.

Web tracker

0.2.0ah.js
  • changed

    interactive now recognises framework click bindings

    It used to mean “this element has an interactive role” — a <button>, a role="button", an onclick attribute. A React onClick on a plain <div> did not count, so a framework site reported much of its click volume as dead clicks. Expect that count to drop sharply, and to start meaning something. Requires ah.js to run before your app binds its handlers — the documented <script … defer> in <head> does; a tag manager firing after hydration falls back to the old answer.
  • changed

    Click names and selectors move for elements inside a bound container

    A click on a child of a <div onClick> is now attributed to that div and named from its text. A click group can split in two across this deploy — same action, one row under the old name and one under the new. Goals or funnels keyed on an old click: name need updating.
  • added

    The tracker reports its version

    window.agenthog.version, the x-agenthog-version header on /ah.js, and context.sdk on the wire — stored on the session and segmentable with --by sdk. Earlier builds were unversioned, so data could not be tied to the build that produced it, and ah.js cannot be pinned. Every SDK now reports its build this way.

Capacitor

0.4.0@brightmotion/agenthog-capacitor
  • added

    setAttribution — attach an MMP's verdict to the session (0.4.0)

    AgentHog.setAttribution({ provider, utm_source, … }) forwards a mobile measurement partner’s attribution callback (e.g. Singular’s) into the session’s utm_* columns via context.attribution, on the next flush’s normal cadence. Each distinct payload is delivered once — MMP callbacks re-fire every launch and the repeats are no-ops — and an undelivered payload survives a crash or offline launch and rides the next launch’s first flush. reset() clears it. A real deep-link value still wins over the verdict, and utm_source: "organic" is safe to pass.
  • changed

    interactive now recognises framework click bindings

    An Angular (click) on a plain <div> now counts. An app that builds its navigation from divs used to report most of its taps as dead. Call AgentHog.init() before bootstrapApplication — listeners registered before init are invisible, which under-reports rather than misreports.
  • changed

    Tap names and selectors move for elements inside a bound container

    A tap on an icon inside a <div (click)> is attributed to that div and named from its text — click: div becomes click: Record. Same group-splitting caveat as the web tracker.

React Native

0.8.0@brightmotion/agenthog-react-native
  • added

    setAttribution — attach an MMP's verdict to the session (0.8.0)

    setAttribution({ provider, utm_source, … }) forwards a mobile measurement partner’s attribution callback (e.g. Singular’s) into the session’s utm_* columns via context.attribution, on the next flush’s normal cadence. Each distinct payload is delivered once — MMP callbacks re-fire every launch and the repeats are no-ops — and an undelivered payload survives a crash or offline launch and rides the next launch’s first flush. reset() clears it. A real deep-link value still wins over the verdict, and utm_source: "organic" is safe to pass.
  • added

    Dead taps are reported

    A tap that lands on no pressable used to be discarded, so React Native could never surface a dead tap at all. Such taps now arrive with interactive: false. Set deadClicks: false in the provider config to keep only real presses.
  • changed

    A disabled Pressable is a dead tap, not a working control

    React Native keeps onPress on a disabled control and never calls it, so the greyed-out “Continue” button — usually the most valuable dead tap in an app — was reported as working.
  • changed

    Engagement metrics shift

    A click counts as an interaction regardless of interactive, and interactions drive engaged and bounce. A session whose only activity was tapping dead space used to bounce; it now counts as engaged. This matches how the web tracker has always behaved, but it is a step change in your bounce and engagement rates on the day you ship it.
  • fixed

    Multi-touch, unmeasurable touches, and the reported SDK version

    A two-finger tap on dead space emitted two clicks. A touch with no coordinates no longer invents a dead tap. And 0.6.0 reported itself as AgentHogRN/0.5.0 in the ingest user-agent — sessions from that release cannot be told apart from 0.5.0 ones.

Unity

The Unity SDK ships its changelog inside the package — Unity’s Package Manager renders it beside the description. Nothing in the changes above applies to it yet: Unity still drops a tap that hits no interactive element, so it reports no dead clicks.

The ah CLI

@brightmotion/agenthog ships a CHANGELOG.md in its npm package. Nothing above changes the CLI itself, but ah clicks and the dead-click line in ah digest read the interactive prop, so the caveat at the top of this page applies to what they show you.