Tracking
First-party page views, clicks, and product events — captured, attributed, and fed back into the CRM.
Tracking captures first-party behavioral events — page views, clicks, form submissions, and product events — from your website and app. Those events tie back to contacts and accounts, so your CRM reflects what people actually do, not just what you've typed in.
Event types
Pact recognizes a set of built-in event types and accepts any custom type you send:
page_viewclickform_submitvideo_playdownload_pdf- any custom
event_typestring you define
The Tracking page surfaces your highest-volume event types as KPIs, with a live feed of recent events.
What an event carries
Each event records its type, when it happened, the visitor's distinct_id, an optional session_id, the url and referrer, a free-form properties object, and the source it came from. When an event is linked to a contact_id or account_id, it shows up on that record's timeline and engagement view.
{
"event_type": "page_view",
"distinct_id": "anon-7f3a",
"url": "https://acme.com/pricing",
"referrer": "https://google.com",
"properties": { "plan_viewed": "growth" },
"dedupe_key": "pageview-pricing-page"
}
Install on your website
Add your site under Tracking → Install, name the domains it runs on, and paste the one line Pact gives you into the <head> of every page:
<script>window.pact=window.pact||function(){(pact.q=pact.q||[]).push(arguments)};</script><script async src="https://app.pact.place/pact.js" data-key="pws_…" data-api="https://api.pact.place"></script>
pact.js records page views (including route changes in single-page apps) and the first interaction with each form — which form, never what was typed. The install page shows the first event the moment it arrives.
- Consent first. Where consent is required — and wherever a visitor's country is unknown — nothing is set or sent until the visitor accepts. If your site has no banner of its own,
pact.jsshows a short prompt with your banner's wording; if it does, adddata-prompt="off"and callpact('consent', true)orpact('consent', false)from it. - Global Privacy Control is honored automatically. A browser that sends GPC is never identified or tracked, in any region.
- First-party only. The visitor id is a cookie on your own domain (
pact_vid, 13 months), set only when the rules allow. No third-party cookies and no fingerprinting. - Only your domains. A site key works only from the domains you list, so a copied snippet does nothing elsewhere.
You can also send events yourself: pact('track', 'demo_requested', { plan: 'growth' }), pact('page'), and pact.vid() for the current visitor id.
Ingest and idempotency
Website events arrive through pact.js; your servers can send events with POST /v1/tracking/events. Include a dedupe_key and Pact will ignore a repeat with the same key — so a retried request never double-counts.
Sources and health
Events are grouped by source — web, server, mobile, and api. Each source shows a health status based on how recently it last sent: healthy within five minutes, degraded within an hour, down beyond that. It's an at-a-glance way to catch a broken tag.
Attribution and feeding the CRM
Tracked events are stitched to people through the distinct_id and, once known, contact_id / account_id. From there they power buying signals on accounts and feed the segments you push through activation.
Tracking respects consent
The tracking channel is part of the consent model. Visitors who haven't granted
tracking consent in regulated jurisdictions are handled according to your
compliance rules.