Signals
Signals is the tracker. One script tag gives every visit a session, records page views, time on site and scroll depth, classifies where the visit came from, and gives you a global signals() function for everything the page knows that the tracker doesn’t: events, revenue, and who the visitor is.
<script src="https://cdn.snipform.io/api/analytics/signals.js?site=YOUR_PROPERTY_KEY" defer></script>signals('newsletter_signup');signals('add_to_cart', 4999, { sku: 'SKU-123' });signals.revenue(12900);Nothing is stored on the visitor’s device. The session id lives in a JavaScript variable and dies with the page; the server derives it again on the next request from a salted hash whose salt rotates daily per property, and the raw inputs (including the IP) are discarded. The full treatment is on Privacy & Compliance.
What a session is
Section titled “What a session is”A session is one visitor on one property on one UTC day. Everything the tracker and your code send is attached to it:
| Group | What lands on the session |
|---|---|
| Pages | Entry and exit URL, path and title, per-page view counts |
| Activity | Time on site (only while the tab is active and focused), max scroll depth 0-100 |
| Referrer | Referring URL and domain |
| Attribution | UTM parameters, click ids, and the channel decided on arrival |
| Device | Browser, OS, device class, viewport size, country and city |
| Events | Every signals() call, with value and meta |
| Money | Revenue from signals.revenue(), orders, and ad cost allocated by the ad integrations |
| Contact | A set-once link to the person, once identified |
Same-day visits from the same device merge into one session. After midnight UTC the salt rotates and the same visitor produces an unrelated id, so a session never spans days and never spans properties.
How the tracker reports
Section titled “How the tracker reports”The script sends three kinds of request to api.snipform.io, all from the browser:
- Load - once per page,
GET /v2/signal/loadwith the page URL, title, referrer and viewport in headers. The response carries the session id and a view id. - Pings -
POST /v2/signal/{viewId}/pingwhen the tab goes hidden or loses focus, when the visitor reaches a new scroll depth (debounced 2 seconds), at 100% scroll, and on exit viasendBeacon. Each ping carries time on site and max scroll. - Writes you trigger - events, acquisition and identify,
POSTto/v2/signal/{sessionId}/....
Loads and writes retry up to three times with backoff on network failures and 5xx responses. A 4xx is a deliberate rejection and is never retried.
Where the data goes
Section titled “Where the data goes”- The property dashboard: live view, sessions browser, channels, pages, and the Conversions you define on top of sessions.
- Automations: a signal can post to Slack, call your webhook or create a contact the moment it fires.
- The API and the PHP SDK: the same sessions, filterable with the query language.
- MCP: an AI assistant reading the same numbers.
- Install - script parameters, pinned versions, and verifying the first session.
- Events -
signals()and thedata-signalattributes. - Revenue - put money on a session, and feed conversions and ROAS.
- Identify - turn a session into a contact, with GPC respected.
- Session handoff - get the session id to your backend for server-side events.
- Channels - how a visit gets its channel, and how to override it.