What Mixpanel traffic looks like
Mixpanel ships events as base64-encoded JSON. The wire format is what makes raw DevTools inspection painful.
- Endpoint pattern
api.mixpanel.com/track(EU-residency projects useapi-eu.mixpanel.com, Indiaapi-in.mixpanel.com;api-js.mixpanel.comappears with newer SDK versions); profile updates go to/engage;decide.mixpanel.comserves SDK config (no events there)- Transport
- Base64-encoded JSON in a
dataparameter, either in anapplication/x-www-form-urlencodedPOST body or in the query string; batched sends put a JSON array indata, so one request can carry many events - Key parameters
eventthe event name ·properties.tokenproject token, Mixpanel's equivalent of a measurement ID ·properties.distinct_idthe identity key, plus$device_id/$user_idon newer SDKs · dollar-prefixed defaults ($browser,$current_url,$screen_height…) mixed in with your custom properties in the same object
The data parameter decoded, as Event Watcher shows it:
{
"event": "Signup Completed",
"properties": {
"token": "a1b2c3…",
"distinct_id": "18f2ab…",
"$device_id": "18f2ab…",
"$browser": "Chrome",
"$current_url": "https://example.dk/signup",
"plan": "pro"
}
}
Debugging Mixpanel with Event Watcher
- The Mixpanel parser does the base64 decode for you, across all three transport shapes: JSON body, form-encoded
data, query-stringdata. - Batched arrays split into individual events, each showing its event name,
distinct_id, and full properties object: "copy the payload, decode it in the console, pretty-print it" becomes clicking an event in the stream. - The project token and the region inferred from the endpoint (US / EU / India) surface per event.
- Filtering the stream to Mixpanel while clicking through a funnel is a fast way to confirm every step actually leaves the browser.
Mixpanel and consent
Analytics consentThe extension checks Mixpanel against the analytics consent category. Mixpanel has opt-out APIs (opt_out_tracking()) but no degraded consent-mode ping: any /track request before an analytics grant is a real pre-consent event, flagged and counted in the violations counter.
Watch for the common half-gated setup: the snippet loads and calls init before consent (setting the mp_ cookie and a distinct_id) while only track calls are deferred. EU data residency changes the endpoint, not the consent obligation.
Common debugging scenarios
- Events land in the wrong project. Read the decoded
tokenper event. Sites that migrated projects often leave one hardcoded token in an old snippet. - Funnels break at identify. Compare
distinct_idon events either side of login; if it never changes, theidentify()call didn't reach the wire. - Duplicate events. Pivot Grouped view by Event Name. Duplicates sharing a
distinct_idand arriving milliseconds apart mean double-binding, while duplicates from two scripts are attributed by the Script Tree view. - EU residency verification. Confirm hits go to
api-eu.mixpanel.comand nothing falls back to the US endpoint. - Property missing on some pages. Compare the same event's decoded properties across pages in Grouped view instead of diffing base64 blobs.