Overview
Off-site tracking lets you record events that happen away from your own pages — a conversion on a partner site, an email open, an ad impression in a video player — and attribute them to a user in Permutive. Typical use cases:- Campaign reporting — measure conversions driven by a campaign on partner inventory (e.g. a
PartnerConversionevent). - Campaign optimization — adjust targeting mid-flight to hit conversion KPIs.
- Suppression — drop users from a targeting cohort once they convert.
- Premium targeting — target users who visited a partner site but have not yet converted.
- Engagement audiences — track email opens (e.g. an
EmailOpenevent) or ad views (e.g. anAdImpressionevent) to build audiences from off-site engagement.
Before you start
- A custom event schema for your event must exist in your workspace. See Creating & Updating Event Schema.
- Decide which identifier you’ll use (see Identifying the user).
- If the event involves EU/UK/Swiss users, read Consent and privacy first.
Choose your setup
Find the row closest to where your event happens. This tells you the identifier and firing mechanism to use; the linked sections cover each in detail.On a page where the Permutive SDK is already loaded, prefer
permutive.track() — use px/track where the SDK isn’t available on that specific page (for example, a post-checkout page reached by redirect).Parameter reference
All methods build a request to:
The endpoint also accepts
s (session ID) and vid (view ID), which Permutive’s own SDKs set to stitch events into a browsing session. Off-site tracking has no such session, so leave them out.
Consent parameters such as
gdpr, gdpr_consent and consent are not read by px/track. They belong to the upstream ID-sync provider (e.g. AppNexus, Google), which uses them to decide whether to serve the request at all. See Consent and privacy.Identifying the user
You attach an event to a user in one of the following ways.Permutive user ID — most direct
Permutive user ID — most direct
If you already hold the Permutive-assigned user ID (for example, you read it on your own site before redirecting), pass it as
u. No it is needed.First-party identifier — most durable
First-party identifier — most durable
Use your own identifier (such as a hashed email) through Permutive’s identity framework. Pass the value as
i and its tag as it. This is the most reliable method across browsers and environments because it doesn’t depend on third-party cookies. Contact Support to confirm the identifier tag to use.Device ID (MAID) — app and CTV
Device ID (MAID) — app and CTV
In mobile-app and connected-TV environments there is no cookie, but the ad server can supply the device’s advertising ID through a macro. Pass the ID as
i with the it tag idfa (iOS IDFA) or aaid (Android AAID). This is the right path for video/CTV — contact Support to set it up: share the event you want to track and the ad server you’ll fire from, and Support will confirm the identifier setup for your workspace and the macro tokens to use in your tracking URL.Firing the pixel
- Tracking URL
- JavaScript tag
- HTML image pixel
Use this when you paste a URL into a third-party platform (such as an ad server’s impression/view-tracking field) and the platform fires the request for you.The snippets below build a URL you can copy. Run them in your browser console.Example output:Example output:
1
With a first-party identifier (recommended)
2
With the Permutive user ID
3
With a third-party cookie sync
Route the request through the partner’s sync endpoint so it can inject its cookie ID. See Third-party cookie sync providers for AppNexus, Google and The Trade Desk patterns — and note the encoding implications of the extra redirect hop.
Third-party cookie sync providers
These route thepx/track request through a partner’s cookie-sync endpoint, which substitutes its own user ID before redirecting. They are browser-only and depend on third-party cookies. Prefer a first-party identifier where the environment allows it.
Consent and privacy
Two mechanical points to be aware of:- The
gdpr,gdpr_consentandconsentparameters that appear in the third-party cookie sync patterns are read by the sync provider (AppNexus, Google, The Trade Desk), not by Permutive. The provider uses them to decide whether to serve the request and return its ID — for example, AppNexus rejects requests without them outright for EU/UK traffic. - That provider-side gate only exists when a sync provider sits in front of
px/track. When you fire the pixel directly (a first-party identifier, a Permutive user ID, or an ad-server tracking field pointing straight atpx/track), there is no gate in the request path — only fire the pixel where your own consent controls permit it.
This guide describes mechanisms, not legal advice. Confirm the requirements for your audiences with your privacy/legal team.
Verifying your implementation
1
Fire a test event
Trigger the pixel (load the page, open the test email, or preview the creative in your ad server).
2
Inspect the request that actually fires
In browser dev tools (Network tab) or your ad server’s creative preview, confirm the final URL: macros have expanded,
p is encoded the expected number of times, and the identifier is populated. Most issues are visible here.3
Check the event lands in Permutive
In the Events section of your dashboard, look for your event name (e.g.
PartnerConversion). Allow a little time for events to surface.Common failure modes
FAQ
How many times should I URL-encode the event properties?
How many times should I URL-encode the event properties?
The snippets in this guide handle encoding for you —
URLSearchParams applies the one layer that a direct px/track request needs. If you’re hand-assembling or adapting a URL, use this rule:Count the number of times the value will be URL-decoded between where you write it and where Permutive reads it, and encode it that many times.px/trackdecodes thepparameter once to recover your JSON — so on a direct request,pmust be single-encoded.- A property value sitting inside
pis part of that JSON — it inheritsp’s encoding; don’t encode it separately. - If the entire
px/trackURL is carried as a parameter or redirect target inside another URL — an AppNexusgetuidredirect, or The Trade Desk’sttd_passthrough— that outer hop adds one more decode, so everything inside (includingp) needs one extra layer. The provider strips one layer when it redirects;px/trackstrips the last.
Spaces:
URLSearchParams encodes a space as +, not %20. Both decode to a space in a query string, but be aware of the difference if you hand-assemble a URL.Can I use platform macros in the tracking URL?
Can I use platform macros in the tracking URL?
Yes — most ad servers and email providers offer macros for cache-busters and IDs, and using them is recommended (see the
rand tips above). One rule: never URL-encode the macro token itself. The platform matches it literally to substitute the value; an encoded token won’t be recognized and will appear verbatim in the fired URL.Next steps
Creating & Updating Event Schema
Set up the custom event schema your pixel events will validate against.
Contact Support
Troubleshoot an implementation or confirm identifier tags.