Add Google (GA4 and Google Ads)
GA4 and Google Ads are separate products sharing one tag. What PixelCapi sends to each, why the GA4 tag is browser-only, and what is not implemented yet.
updated
Google is two products behind one tag: Google Analytics 4 and Google Ads. PixelCapi treats them separately, because they fail separately. GA4 receives server-side events through the Measurement Protocol; Google Ads receives its page signal through the tag. Enhanced Conversions is not sent yet — that is stated here rather than buried, and the plugin reports it to you as a missing configuration.
What you need
| Value | Where it comes from | Used for |
|---|---|---|
Measurement ID (G-…) |
GA4 → Admin → Data streams | GA4 browser tag |
| API secret | GA4 → Admin → Data streams → Measurement Protocol API secrets | GA4 server-side sending |
Conversion ID (AW-…) |
Google Ads → Goals → Conversions | Google Ads tag |
The GA4 tag is browser-mode only, on purpose
The GA4 configuration is emitted only for accounts in browser mode. If it were emitted in
server mode as well, the tag would fire its own page_view and that page view would be
counted a second time against the one sent through the Measurement Protocol.
The Google Ads configuration is different: it is emitted whenever any configured account carries an Ads conversion ID, in either mode. Ads and GA4 are separate products and gating the whole tag on GA4’s mode meant an Ads ID on a server-mode account could never fire at all.
A page carrying only an Ads configuration makes zero requests to
google-analytics.com. It does send en=page_view — but to google.com/ccm/collect with a
tid=AW-… parameter, which is Google Ads’ own page signal, not a GA4 page view.
That distinction matters when you are debugging. en=page_view appears on both endpoints.
Only the tid= parameter tells you which product you are looking at. Grepping a network
log for the event name alone will show you a double count that is not there.
Consent Mode v2
There is a dedicated setting with three values:
- Off — no consent block is emitted, and the Measurement Protocol consent object is omitted entirely.
- Basic (the default) — a default-denied consent block is emitted and tags are withheld until consent is given.
- Advanced — additionally loads tags before consent, in Google’s cookieless mode. This is behind a warning, because whether it is lawful for you is a decision about your own compliance posture, not a checkbox we can make on your behalf.
Anything unrecognised sanitises to basic, and existing installs migrate to basic.
This setting is separate from the plugin’s own consent source (which decides where a consent decision comes from). Two different questions, two different settings.
A debugging trap worth knowing
When you verify Consent Mode by watching the network tab, a consent-granted page can appear
to send nothing at all. It is not broken. Google’s consent block carries
wait_for_update: 500, which holds the hit for half a second. An absent request is not
evidence of absence until you have waited longer than the tag’s own timeout.
What is confirmed
Server-side delivery to GA4 is proven against real credentials on a live site. The
Measurement Protocol returns HTTP 204 and the events arrive in a real GA4 property —
including purchase, with its revenue. Consent Mode v2 has been verified live as well.
That distinction is worth drawing out. Google’s /debug/mp/collect endpoint validates the
shape of a request without authenticating it, so on its own it can only ever prove the
structure is right and nothing about whether anything arrived. Delivery has now been checked
the only way it can be: against a real property, watching for the events to appear in it.
One thing this does not change: the plugin’s own Verify button still cannot authenticate your Google credentials, because Google’s verification endpoint has no way to do that without OAuth. Proven delivery and an unverifiable credential check are two separate facts, and PixelCapi reports both rather than letting the first quietly imply the second.
What is not implemented yet
- Google Ads Enhanced Conversions are not sent. Conversions are recorded; the hashed customer data that would raise their match quality is not attached yet. Whenever an Ads conversion ID is configured, the plugin reports this to you as a missing-requirement finding in Diagnostics rather than staying quiet about it.
Next
Was this page helpful?