Send and verify GA4 events
Configure GA4 server-side delivery, understand its enrichment and consent rules, and verify sent events.
CJM sends events to Google Analytics 4 only through Server Tracking rules. It does not automatically translate MQL, SQL, Opportunity, or Won into GA4 events. This keeps analytics event names under your control and avoids adding business milestones to GA4 without an explicit mapping.
Before you create a rule
- Open Setup → Channels and find Google Analytics 4.
- Select Connect.
- In Google Analytics, open Admin → Data Streams, select the web stream,
and copy its Measurement ID in the
G-...format. - In the same stream, open Measurement Protocol API secrets, create a secret, and copy it into API Secret.
- Select Save Configuration.
GA4 uses manual credentials, not OAuth. The API Secret is encrypted and is not shown again. When editing the connection, enter a new secret to replace the saved one.
You also need an installed Pixel that sends the source event to CJM and consent
configured for analyticsStorage.
Decide what to send
Open Setup → Server Tracking and create a Google Analytics 4 rule. Choose:
- one or more source Triggers;
- optional Event names to distinguish events that share a trigger;
- an optional source Pixel and URL condition;
- the destination GA4 Event name;
- optional value source, amount, and currency.
Be specific. For example, if the trigger is ecommerce, add the source event
name purchase when you only want completed purchases. Otherwise the same
rule can match other ecommerce actions too.
CJM converts a destination name such as CjmWon to GA4-style cjm_won before
sending it. For supported ecommerce events, the event's value, currency,
transaction ID, items, and coupon take precedence over rule values where
present.
Enrichment sent when available
Every GA4 request contains an event ID, timestamp, event name, and client ID.
CJM prefers the real _ga client identifier so the server event remains
connected to the browser session. If it is missing, CJM creates a stable
fallback from the Profile ID, or from the event ID for an anonymous visitor;
the event can still be measured, but it may start an unmatched GA4 session.
CJM can also include:
- Profile ID as GA4
user_idand the CJM session ID; - page URL and title;
- source, medium, campaign, term, and content from UTM parameters;
- country, region, city, and postal code, or IP as a fallback when resolved location is unavailable;
- device category, operating system, browser, brand, model, language, and screen resolution;
- value, currency, transaction ID, product items, and coupon;
- hashed email, phone, first name, and last name when permitted.
These fields help preserve session context, analyze acquisition, and connect server events to known users. CJM sends only the available fields.
Consent behavior
analyticsStorage must be granted for the GA4 event to be sent. Denied,
missing, or unspecified analytics consent blocks the whole request because the
request itself is measurement.
adUserData has a narrower purpose. When granted, CJM may add normalized,
SHA-256 hashed contact data to user_data for Google Signals matching. When it
is not granted, the analytics event can still be sent, but without those user
identifiers.
The rule cannot bypass either condition. Consent is resolved from the event first and then, when absent, from the current Profile.
Verify GA4 delivery
- Generate an event that matches the active Server Tracking rule.
- Open Signals → GA4.
- Choose the date range and filter by Status or originating CJM Event if needed.
- Select the row and check the event name, Server Tracking origin, linked Lead, value, payload, response, and error.
- Check GA4 separately to confirm that the event appears in the intended property and reports.
All GA4 rows show Server Tracking as their origin because GA4 has no automatic stage-based delivery. An Active row means the Measurement Protocol request returned a successful HTTP result; it does not guarantee that GA4 will attribute or expose the event immediately.
If a GA4 event is missing
Check, in order:
- the source event reached CJM;
analyticsStoragewas granted;- the GA4 connection has the correct Measurement ID and a current API Secret;
- the rule is Active and its trigger, event name, Pixel, and URL conditions match the source event;
- the destination event name is the intended one;
- the same event ID and destination name were not already processed.
If there is an Error row, open it for the stored response. If no row exists, the request was probably stopped before delivery by consent, missing configuration, rule matching, or duplicate protection.