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’sutm_*columns: thecontext.attributionwire field (an MMP verdict attached by the SDK), andPOST /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; anorganicanswer never erases the referrer verdict.ah usernow derivesfirst_touch/latest_touchfrom the session ledger, andah users --sourcefilters 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.comfrom Meta alone. New sessions store one canonical name (meta,google,tiktok, …); unknown values pass through unchanged, and raw values survive inlanding_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>, arole="button", anonclickattribute. A ReactonClickon 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. Requiresah.jsto 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 oldclick:name need updating. - added
The tracker reports its version
window.agenthog.version, thex-agenthog-versionheader on/ah.js, andcontext.sdkon 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’sutm_*columns viacontext.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, andutm_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. CallAgentHog.init()beforebootstrapApplication— 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: divbecomesclick: 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’sutm_*columns viacontext.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, andutm_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 withinteractive: false. SetdeadClicks: falsein the provider config to keep only real presses. - changed
A disabled Pressable is a dead tap, not a working control
React Native keepsonPresson 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 ofinteractive, and interactions driveengagedandbounce. 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 asAgentHogRN/0.5.0in 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.