Events
Every interaction, captured once.
Custom events, automatic page views, and JSON property payloads. The grammar is plain strings and JSON, so your data stays portable forever.
Why event tracking goes wrong
- Client-side dedup misses prefetch and back-button reloads, so counts drift between dashboards and reality.
- Untyped event names accumulate. "Sign Up" and "sign_up" become two metrics you cannot reconcile.
- Vendor-specific event grammars lock you into one analytics tool. Migration means rewriting every instrumentation call.
How leatmap does it
One SDK call, every kind of event.
leatmap.track("checkout_started", { plan: "pro" }). That is the entire API. Page views are automatic, custom events are a single function.
Server-side dedup.
The collector hashes (visitor, session, event, timestamp) and rejects duplicates. Your dashboards do not double-count, even under prefetch storms.
Open schema, portable forever.
Event names are strings, properties are JSON. Export the raw stream anytime. No remapping at the destination, no proprietary IDs to translate.
Typed, if you want.
Generate a TypeScript event registry from your own definitions. Catch typos at compile time instead of two weeks later in the dashboard.
Stop measuring with crossed fingers.
Get a tracking plan you can trust, a collector that enforces it, and a dashboard you actually want to open.