Google Tag Manager
For teams using GTM as the hub for GA4, Google Ads, and any other tag-managed tool. You'll have Zellify funnel events pushed into the GTM dataLayer with consistent naming. You need a GTM container and a Zellify campaign.
What this integration does#
Zellify loads the GTM container on funnel pages. Every funnel event pushes a dataLayer object that GTM triggers can pick up. Configure GA4, Google Ads, or any tag-managed tool inside GTM as usual.
/f/<id> without a campaign) won't load the GTM container. If you're running Google Ads — which depends on GTM for conversion tracking — your traffic must go through a campaign link.Connect GTM#
- Open Dashboard → Campaigns → <campaign> → Settings.
- Enable Google Tag Manager.
- Paste your GTM container ID (format
GTM-XXXXXXX). - Save.
Unlike Meta and TikTok, GTM is not tied to a traffic-source choice. You can run GTM on a Meta-sourced campaign alongside the Meta Pixel.
Where to find your container ID#
Open Google Tag Manager and copy the container ID at the top of the dashboard.
Events pushed to dataLayer#
| Funnel event | dataLayer event name | Trigger |
|---|---|---|
| Page view | page_view | A funnel page is viewed |
| Lead | lead | A lead event is triggered |
| Page completed | page_completed | A user navigates away from a funnel page |
| Email captured | email_captured | A user submits their email |
| Checkout presented | checkout_presented | The checkout or payment form is shown |
| Payment method added | payment_method_added | A user enters their payment method |
| Payment succeeded | payment_succeeded | A payment completes successfully |
| Payment failed | payment_failed | A payment fails |
| Trial started | trial_started | A free trial begins |
| Subscription started | subscription_started | A paid subscription begins |
See Event reference for the canonical taxonomy.
Payload structure#
Every dataLayer push has the same shape:
Context fields (every event)#
page_location, page_title, page_slug, funnel_id, campaign_id, experiment_id, external_id, event_id, fbp, fbc, country, region.
Data fields by event#
page_completed, email_captured — the user's funnel answers and form responses.
checkout_presented, payment_method_added, payment_succeeded, payment_failed, trial_started, subscription_started —
- checkout session or transaction
id - total
amount(decimal) currencycode- product
category itemsarray, with each item carrying:productIdpriceIdprice(decimal)quantitypaymentType—recurringorone_timename(optional)
Using these events in GTM#
Create a GTM trigger on the dataLayer event name and a GA4 Event tag that reads data.* and context.* variables. For Google Ads conversions, wire the payment_succeeded event to an Ads conversion action with the data.amount and data.currency parameters.
Test and verify#
- Enable GTM's Preview mode against the funnel domain.
- Walk through a test funnel.
- Confirm the dataLayer pushes appear in the preview console.
:::tip Use GA4 DebugView alongside GTM Preview to confirm end-to-end tagging. :::
Going live#
Publish your GTM container. Confirm real events land in GA4 or Google Ads.
Troubleshooting#
| Symptom | Likely cause | Fix |
|---|---|---|
| dataLayer not pushing | GTM container ID mismatch or missing | Re-paste the container ID (format GTM-XXXXXXX) |
| GA4 events missing parameters | Tag not reading dataLayer variables | Add matching dataLayer variables in GTM and map them on the tag |
payment_succeeded counted twice in GA4 | Both the Zellify tag and a custom Ads tag firing | Consolidate on one conversion tag |