What Amplitude traffic looks like
The Amplitude browser SDK batches aggressively: one request often carries several events queued since the last flush.
- Endpoint pattern
api2.amplitude.com/2/httpapi(older SDKs:api.amplitude.com; EU-residency projects:api.eu.amplitude.com);amplitude.com/batchis a dedicated batching endpoint. Config requests toregionconfig.amplitude.comand SDK loads fromcdn.amplitude.comare part of the same footprint but carry no events- Transport
- JSON POST body with two things at the top level: the project's
api_keyand aneventsarray; older instrumentation sometimes sends URL-encoded form data with the events JSON in aneparameter instead - Key parameters
event_typeevent name (SDK-generated names are bracketed, like[Amplitude] Page Viewed) ·user_id/device_idthe identity pair ·session_idmillisecond timestamp marking session start ·event_properties/user_propertiesthe custom payload where tracking-plan drift shows up
A typical event batch, as Event Watcher captures it:
{
"api_key": "a1b2c3d4…",
"events": [
{
"event_type": "[Amplitude] Page Viewed",
"user_id": "user@example.dk",
"device_id": "3f6a91…",
"session_id": 1754640000000,
"event_properties": { "page_path": "/pricing" }
}
]
}
Debugging Amplitude with Event Watcher
- The Amplitude parser handles all the body formats: JSON body, form-encoded
e/eventsparameters, and query-string variants. - Each batched request unpacks into individual events, showing the event name, user ID, device ID, session ID, and the full event and user property objects per event.
- Verify a tracking plan against the wire: filter to Amplitude, trigger the interaction, and read the decoded
event_propertiesinstead of un-base64ing DevTools payloads by hand. - The
api_keyis surfaced too, which settles "which project is this actually sending to" in one glance.
Amplitude and consent
Analytics consentThe extension checks Amplitude against analytics consent. Amplitude has no consent-mode-style degraded ping: a request reaching /2/httpapi before the CMP grants analytics is a straightforward pre-consent fire, marked as such and counted in the violations tally.
The usual root cause: the SDK initializes on page load with a device ID cookie already set, while the consent gate only wraps the track() calls. Identity establishment then precedes consent even when events are held back.
Common debugging scenarios
- Events show in the panel but not in Amplitude Charts. Check the decoded
api_keyagainst the intended project; staging keys in production are a classic. - Session counts look inflated. Compare
session_idacross consecutive events; a new value on every event means the SDK re-initializes per page instead of persisting. - Anonymous users never merge. Inspect
user_idvsdevice_idon events before and after login to confirm the identify call actually landed on the wire. - A property is
undefinedin charts. Find the event in the stream and checkevent_propertiesas sent; the gap is usually upstream in the dataLayer, which push source attribution can pin to a script. - Events fire before the banner. The pre-consent badge plus the violations counter make the audit concrete instead of anecdotal.