Skip to main content

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 PartnerConversion event).
  • 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 EmailOpen event) or ad views (e.g. an AdImpression event) to build audiences from off-site engagement.
Every method below ultimately calls one endpoint — Permutive’s pixel-tracking endpoint — with a small set of parameters. The differences between methods come down to two independent choices: how you identify the user, and how the pixel is fired. The rest of this guide is organized around those two choices.
Before you start

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.
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.
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.
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

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.
1

With a first-party identifier (recommended)

Example output:
2

With the Permutive user ID

Example output:
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.
Many platforms expose a macro for the rand cache-buster (and for IDs). Prefer the platform’s macro over a static value — check your platform’s macro documentation, and see the FAQ on using macros.
These route the px/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.
Each of these adds a redirect hop, which adds an encoding layer to the nested px/track URL. The snippets handle this for you, but read the encoding FAQ before adapting them — the p value ends up double-encoded in the AppNexus and Trade Desk patterns.
px/track records whatever it receives — it performs no consent enforcement of its own. It is your responsibility to ensure the pixel only sends events and identifiers where you are permitted to do so.
Two mechanical points to be aware of:
  • The gdpr, gdpr_consent and consent parameters 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 at px/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

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/track decodes the p parameter once to recover your JSON — so on a direct request, p must be single-encoded.
  • A property value sitting inside p is part of that JSON — it inherits p’s encoding; don’t encode it separately.
  • If the entire px/track URL is carried as a parameter or redirect target inside another URL — an AppNexus getuid redirect, or The Trade Desk’s ttd_passthrough — that outer hop adds one more decode, so everything inside (including p) needs one extra layer. The provider strips one layer when it redirects; px/track strips 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.
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.