Why this happens
Tealium's UDO is intentionally vendor-agnostic - your data layer should describe your business (product_id, cart_value, user_tier), not any specific analytics tool's parameter names. The GA4 tag template then translates your UDO keys into GA's expected event/parameter names through an explicit mapping step.
When teams skip that step - either by pasting raw gtag-style code into a Custom Container tag instead of using the native GA4 tag template, or by assuming a UDO key called ga_event_name gets picked up automatically - the tag either doesn't send the data GA expects, or duplicates logic the native tag template already handles.
Fix it
- Confirm your data layer key exists and holds the right value at the moment the tag fires: run
utag.datain the console on the page in question and locate the exact key (product_id,order_total) before touching the tag config. - In iQ, open the GA4 tag's settings and use its native mapping table to map each UDO key to the correct GA4 event parameter - you're telling the GA4 tag where to look, not renaming your data layer.
- For ecommerce items arrays, confirm the UDO key holds an actual array of item objects in GA4's expected shape (
item_id,item_name,price,quantity). A flat string where GA4 expects an array is the most common silent failure in this mapping. - Don't duplicate: if the native GA4 tag template already exists in your account, don't also hand-write a
gtag()call inside a Custom Container tag for the same event. Pick one - running both produces double-counted hits with no error to warn you. - Set the load rule for the GA4 tag to the same condition as the event you're mapping (a "purchase" load rule tied to your order-confirmation data layer trigger), rather than firing it on "All Pages" and relying on empty-value guards inside the mapping.
How to verify it worked
- Open GA4's DebugView with the Tealium profile in debug/trace mode simultaneously, and confirm the event appears with every mapped parameter populated - not just the event name.
- In Tealium's Trace tool, click into the specific tag firing and inspect the exact payload it sent. This shows you what left Tealium independent of what GA4 chose to do with it, which separates a mapping problem from a GA4-side problem.
- Check the Network tab for the outbound request to the GA4 collection endpoint and confirm the mapped parameters appear as query parameters with the values you expect - not blank, and not literally the string "undefined".
- Wait for the event to land in GA4's standard reports (Realtime first, then the relevant report) with the parameter values intact. DebugView confirms structure; standard reporting confirms nothing downstream - a GA4-side filter, a mismatched event name - is dropping it afterward.