Skip to content

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);
signals.identify('[email protected]', { first_name: 'Jane' });

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.

A session is one visitor on one property on one UTC day. Everything the tracker and your code send is attached to it:

GroupWhat lands on the session
PagesEntry and exit URL, path and title, per-page view counts
ActivityTime on site (only while the tab is active and focused), max scroll depth 0-100
ReferrerReferring URL and domain
AttributionUTM parameters, click ids, and the channel decided on arrival
DeviceBrowser, OS, device class, viewport size, country and city
EventsEvery signals() call, with value and meta
MoneyRevenue from signals.revenue(), orders, and ad cost allocated by the ad integrations
ContactA 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.

The script sends three kinds of request to api.snipform.io, all from the browser:

  1. Load - once per page, GET /v2/signal/load with the page URL, title, referrer and viewport in headers. The response carries the session id and a view id.
  2. Pings - POST /v2/signal/{viewId}/ping when the tab goes hidden or loses focus, when the visitor reaches a new scroll depth (debounced 2 seconds), at 100% scroll, and on exit via sendBeacon. Each ping carries time on site and max scroll.
  3. Writes you trigger - events, acquisition and identify, POST to /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.

  • 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 the data-signal attributes.
  • 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.