Eventify Setup Guide
Considering there is no existing GTM container and no existing GA4 property. Do these in order.
Steps 0–0.6 get the GA4 property and GTM container created. Steps 1 onward set up the actual tracking — wherever you see {{YOUR MEASUREMENT ID}}, use the one you copied in Step 0.
G-XXXXXXXXXX. This is your {{YOUR MEASUREMENT ID}} for every step below.<head>, one right after <body>).GTM-XXXXXXX — this confirms you're in the right container for every step from here on.This is the tag that actually connects your container to your new GA4 property. Without it, none of the event tags below have anywhere to send data.
Tags → New → Tag Configuration → Google Tag
{{YOUR MEASUREMENT ID}}Before building anything, verify the data is really there. Open the ticket portal, open the browser console (F12 → Console), and run:
window.dataLayer.filter(e => e && e.event)
Complete a test purchase and re-run it. You should see entries named view_item_list, add_to_cart, begin_checkout, purchase, etc. — each with an ecommerce object containing fields like transaction_id, value, order_id. If these events aren't showing up, the portal's ecommerce tracking isn't active on your account and none of the steps below will have data to read — check with Eventify support first.
Also check whether the portal calls gtag() directly:
typeof window.gtag
If this returns "function", that's expected — it's your own Google Tag from Step 0.6 defining it. Eventify's admin panel has no separate GA4/tracking field of its own, so there's no second integration to worry about here.
Go to Triggers → New → Custom Event, three times. These are just definitions for now — you don't attach them to anything yet. Each one gets wired to its tag later, in the step shown in the last column.
| # | Name | Event name to match | Regex? | Fires on | Used by tag (later step) |
|---|---|---|---|---|---|
| 1 | CE - purchase | purchase | OFF | All Custom Events | GA4 - Purchase (Step 3) |
| 2 | CE - order_placed | order_placed | OFF | All Custom Events | GA4 - order_placed (Step 4) |
| 3 | CE - funnel | ^(view_item_list|add_to_cart|remove_from_cart|begin_checkout|add_payment_info)$ | ON | All Custom Events | GA4 - funnel (Step 5) |
^ and $ in #3 exactly — without them it'll also match future events that merely contain those words.CE - ... label, e.g. CE - purchase. This is what you'll pick from a dropdown later when setting a tag's Triggering field.purchase — no “CE -” prefix here.CE - purchase), the trigger will never fire, since no real event is ever literally named CE - purchase.Go to Variables → User-Defined → New → Data Layer Variable, and make one for each row below. Name it exactly as shown, and paste the matching Data Layer Variable Name.
Set Data Layer Version = 2 on all 13. (Version 1 can't read names with a dot in them — it'll silently return nothing, no error.) Use a plain hyphen - in the name, not an en dash.
| Variable Name | Data Layer Variable Name |
|---|---|
| DLV - ecommerce.transaction_id | ecommerce.transaction_id |
| DLV - ecommerce.order_id | ecommerce.order_id |
| DLV - ecommerce.order_status | ecommerce.order_status |
| DLV - ecommerce.currency | ecommerce.currency |
| DLV - ecommerce.value | ecommerce.value |
| DLV - ecommerce.tax | ecommerce.tax |
| DLV - ecommerce.fee | ecommerce.fee |
| DLV - ecommerce.discount | ecommerce.discount |
| DLV - ecommerce.coupon | ecommerce.coupon |
| DLV - ecommerce.payment_type | ecommerce.payment_type |
| DLV - ecommerce.payment_gateway_id | ecommerce.payment_gateway_id |
| DLV - ecommerce.round | ecommerce.round |
| DLV - ecommerce.ticket_count | ecommerce.ticket_count |
Also go to Variables → Built-In Variables and tick Event on (you'll need it in Step 5).
Tags → New → Google Analytics: GA4 Event
purchase{{YOUR MEASUREMENT ID}}| Parameter | Value |
|---|---|
| order_status | {{DLV - ecommerce.order_status}} |
| order_id | {{DLV - ecommerce.order_id}} |
| round | {{DLV - ecommerce.round}} |
| ticket_count | {{DLV - ecommerce.ticket_count}} |
| fee | {{DLV - ecommerce.fee}} |
| discount | {{DLV - ecommerce.discount}} |
| payment_type | {{DLV - ecommerce.payment_type}} |
| payment_gateway_id | {{DLV - ecommerce.payment_gateway_id}} |
order_status, order_id, etc.), and only the right one (“Value”) should contain the {{DLV - ...}} variable reference. If you paste the {{DLV - ...}} variable into both columns, GA4 receives a parameter literally named {{DLV -ecommerce.order_status}} instead of order_status, and none of these custom fields will register correctly.Catches orders that are placed but never paid (approval-gated / pay-later orders).
Tags → New → Google Analytics: GA4 Event
order_placed{{YOUR MEASUREMENT ID}}| Parameter | Value |
|---|---|
| transaction_id | {{DLV - ecommerce.transaction_id}} |
| order_id | {{DLV - ecommerce.order_id}} |
| order_status | {{DLV - ecommerce.order_status}} |
| currency | {{DLV - ecommerce.currency}} |
| value | {{DLV - ecommerce.value}} |
| tax | {{DLV - ecommerce.tax}} |
| fee | {{DLV - ecommerce.fee}} |
| discount | {{DLV - ecommerce.discount}} |
| coupon | {{DLV - ecommerce.coupon}} |
Note: this tag can't carry the ticket list — that's fine, every paid order still gets it via the purchase tag.
One tag covers all 5 funnel events (view_item_list, add_to_cart, remove_from_cart, begin_checkout, add_payment_info).
Tags → New → Google Analytics: GA4 Event
{{Event}} exactly, braces included (needs the built-in “Event” variable turned on from Step 2){{YOUR MEASUREMENT ID}}discount = {{DLV - ecommerce.discount}}In the GA4 property that owns {{YOUR MEASUREMENT ID}} (not Tag Manager): Admin → Data display → Custom definitions
Create Custom Dimension (5 times):
| Dimension name | Scope | Event/Item parameter |
|---|---|---|
| Order status | Event | order_status |
| Order ID | Event | order_id |
| Gateway payment ID | Event | payment_gateway_id |
| Item tax | Item | tax |
| Item line total | Item | item_total |
Create Custom Metric (4 times, scope always Event):
| Metric name | Event parameter | Unit |
|---|---|---|
| Fee | fee | Currency |
| Discount amount | discount | Currency |
| Payment round | round | Standard |
| Tickets in payment | ticket_count | Standard |
Click Preview, go to the real ticket portal URL, and buy a ticket (a free one works).
Check off each of these in the debug panel:
purchase fires GA4 - Purchase exactly once; order_placed fires GA4 - order_placed exactly onceDLV - ecommerce.* shows a real value (not “undefined”)items shows one row per ticket typeview_item_list fires once per page load, not once per clickadd_to_cart/remove_from_cart with the change amount, not the new totalbegin_checkout fires once; going back and forward again fires nothing extra