What GA4 traffic looks like
GA4 sends hits to /g/collect, with two first-party shapes that catch people out. Both are still GA4.
- Endpoint pattern
google-analytics.com/g/collect, regional siblings likeregion1.google-analytics.com/g/collect,stats.g.doubleclick.net/g/collect(Google signals on), andgoogle.com/ccm/collect?…tid=G-(server-side / Consent Mode first-party path)- Transport
- GET with everything in the query string for small hits; POST for larger ones, with batched events as newline-separated event lines in the body
- Key parameters
tidmeasurement ID (G-XXXXXXX) ·enevent name (page_view,purchase, custom) ·cid/sid/_sclient ID, session ID, hit sequence ·ep.*/epn.*string and numeric event parameters ·up.*user properties- Consent signals
gcs,gcd,dma: Google Consent Mode state;gcs=G100means denied,G111granted- E-commerce
pr1,pr2, and so on: one item per parameter, withid,nm,pr,qtfields packed into each value
Debugging GA4 with Event Watcher
- Matches every endpoint variant above, including the regional and
/ccm/collectfirst-party shapes. - The GA4 parser splits each hit into readable groups: Event, E-Commerce, Session, User Identity, Campaign / Attribution, Consent, Advertising, Page / Document, and Client Hints.
- Batched POST bodies unpack into individual events: a single request carrying five events shows as five entries you can inspect separately.
- Grouped view pivoted by Event Name is a quick way to compare
ep.*payloads across repeated events.
GA4 and consent
Analytics consentThe extension checks GA4 against analytics consent. GA4 is the canonical Consent Mode platform: with advanced Consent Mode, hits legitimately fire before the CMP answers, but as cookieless pings carrying gcs=G100.
Worst case is the safe case: Event Watcher reads both the CMP's state and the gcs/gcd signals, so only a hit with full cookies before the user chose is flagged as a genuine violation.
See GA4 fires before consent and debugging Consent Mode v2.
Common debugging scenarios
purchasefires twice. Pivot Grouped view by Event Name and compare the two hits'_ssequence numbers and session IDs: double tag or page reload.- Wrong measurement ID on one page. Filter to GA4 and scan
tidper hit; agency and site-owner streams often overlap. - Items missing from e-commerce reports. The E-Commerce section of the parsed hit shows whether
pr1…prNare present and complete on the wire, before you blame the report. - A dataLayer event never becomes a GA4 hit. Confirm the push happened via which script pushed this dataLayer event, then check for a
/g/collecthit with the matchingen. - Consent Mode pings mistaken for tracking. The Consent section shows
gcsper hit. Check it before flagging a violation.