Client-side dedup misses prefetch and back-button reloads, so counts drift between dashboards and reality.
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.
- Every visit included
- Inputs never recorded
- EU-resident by default

- Signal
- 1x
- Coverage
- 100%
- Decision
- JSON
Why event tracking goes wrong
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 leadmaps does it
Clean first-party evidence, presented clearly enough for the whole team to act on.
01One SDK call, every kind of event.
Call leadmaps.track once for checkout_started with a plan property. Page views stay automatic and every custom event uses the same small API.
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.
04Typed, 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.

Turn the next question into a clear answer.
Keep the raw signal, the decision, and the context in one privacy-first workspace.

