Track an event
Authentication
Request
Unique event ID (ULID)
Event name (page_view, order_completed, etc.)
Event timestamp (Unix seconds)
User traits (email, phone, etc.)
The requesting client’s environment.
ip and user_agent are stamped server-side from the connection: a
client-supplied address would defeat geo, velocity and bot scoring.
Google Consent Mode v2.
A category is granted, denied, or absent — and absent is a real third
state that ConsentWhenAbsent decides, not a synonym for either answer.
Semantics live in pivolio.consent.
Header-derived signals captured at the HTTP edge for bot scoring. None means the header was absent.
How this event reached us, and from which installation.
Replaces the free-form webhook_source: the kind is a closed vocabulary so
ingestion can be reported on, and integration_id answers which store or
receiver when a workspace has more than one.
Client-side session the event belongs to (rotated after inactivity).
Empty for server-side events, which have no session. A start time without an id is rejected — that would be a session that does not exist but began.
SDK library metadata. Empty when the event did not come from an SDK.
Half-filled is rejected rather than made unrepresentable: the group has to be constructible empty so it can always be present, so the “both or neither” invariant moves from the type to a validator instead of being lost.