Eventify Setup Guide

Eventify → GA4: Setup Tutorial

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.

Step 0: Create the GA4 Property

  1. Go to analytics.google.com and sign in with the Google account you want to own this data.
  2. Click Admin (gear icon, bottom left) → under the “Account” column, click Create Account (or pick an existing account for your organization) → name it (e.g. “Eventify”).
  3. Under the “Property” column, click Create Property → name it (e.g. “Eventify Ticket Portal”) → set your timezone and currency (match the currency your tickets are mostly sold in — you can still report other currencies, this is just the default display).
  4. Fill in basic business details when asked, then finish setup.
  5. In the new property, go to Admin → Data Streams → Add stream → Web.
  6. Enter your ticket portal's URL, give the stream a name, and click Create stream.
  7. On the stream's detail page, copy the Measurement ID — it looks like G-XXXXXXXXXX. This is your {{YOUR MEASUREMENT ID}} for every step below.
📌
Write this ID down somewhere — you'll paste it into 3 different tags later.

Step 0.5: Create the GTM Container and Install It

  1. Go to tagmanager.google.com and sign in.
  2. Click Create Account → name it (e.g. “Eventify”) → for “Where to use container” pick Web → name the container after your ticket portal's domain → Create.
  3. Accept the terms. You'll see two code snippets (one for <head>, one right after <body>).
  4. Give both snippets to whoever manages the Eventify portal's site (or paste them yourself if you control it) — they go under app.eventify.io → your event → Registration → Registration Settings → Tracking Code tab (Tracking Code sits as its own tab alongside Registration Settings, not nested inside it). Paste the first snippet into “Add code before </head> tag” and the second into “Add code before </body> tag”, then Save & Next.
  5. Back in GTM, note the container ID shown at the top right, like GTM-XXXXXXX — this confirms you're in the right container for every step from here on.

Step 0.6: Add a Base Tag So GA4 Gets Pageviews

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

  • Name: Google Tag
  • Tag ID: {{YOUR MEASUREMENT ID}}
  • Triggering: Initialization - All Pages
  • Save.
⚠️
This tag connects your container to your new GA4 property — without it, none of the event tags below have anywhere to send data.

Step 0.7: Confirm Eventify Is Actually Pushing the Right Events

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.

Step 1: Create 3 Triggers

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.

#NameEvent name to matchRegex?Fires onUsed by tag (later step)
1CE - purchasepurchaseOFFAll Custom EventsGA4 - Purchase (Step 3)
2CE - order_placedorder_placedOFFAll Custom EventsGA4 - order_placed (Step 4)
3CE - funnel^(view_item_list|add_to_cart|remove_from_cart|begin_checkout|add_payment_info)$ONAll Custom EventsGA4 - funnel (Step 5)
⚠️
Keep the ^ and $ in #3 exactly — without them it'll also match future events that merely contain those words.
📌
CE - funnel in particular doesn't get used until Step 5, when you create the GA4 - funnel tag and set its Triggering field to CE - funnel. That's the only place it gets referenced — nothing more to do with it here in Step 1.
⚠️
Common mistake: each trigger has two separate fields — don't mix them up.
  • Trigger Name (top of the screen, next to the folder icon) = the CE - ... label, e.g. CE - purchase. This is what you'll pick from a dropdown later when setting a tag's Triggering field.
  • Event name (inside the trigger config) = the plain raw event name Eventify actually sends, e.g. purchase — no “CE -” prefix here.
If these get swapped (trigger named “Purchase” but Event name field set to CE - purchase), the trigger will never fire, since no real event is ever literally named CE - purchase.

Step 2: Create 13 Data Layer Variables

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 NameData Layer Variable Name
DLV - ecommerce.transaction_idecommerce.transaction_id
DLV - ecommerce.order_idecommerce.order_id
DLV - ecommerce.order_statusecommerce.order_status
DLV - ecommerce.currencyecommerce.currency
DLV - ecommerce.valueecommerce.value
DLV - ecommerce.taxecommerce.tax
DLV - ecommerce.feeecommerce.fee
DLV - ecommerce.discountecommerce.discount
DLV - ecommerce.couponecommerce.coupon
DLV - ecommerce.payment_typeecommerce.payment_type
DLV - ecommerce.payment_gateway_idecommerce.payment_gateway_id
DLV - ecommerce.roundecommerce.round
DLV - ecommerce.ticket_countecommerce.ticket_count

Also go to Variables → Built-In Variables and tick Event on (you'll need it in Step 5).

Step 3: Build the Purchase Tag

Tags → New → Google Analytics: GA4 Event

  • Name: GA4 - Purchase
  • Event Name: purchase
  • Measurement ID: {{YOUR MEASUREMENT ID}}
  • Ecommerce section → Send Ecommerce data: ON, Data source: Data Layer
    (This one tick automatically sends transaction_id, value, currency, tax, coupon, and the full ticket list — don't add rows for those.)
  • Add these 8 Event Parameters (Analytics doesn't know these fields on its own):
ParameterValue
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}}
⚠️
Common mistake: the table above has two columns — the left one (“Parameter”) must be typed as plain text (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.
  • Firing: Once per event
  • Triggering: CE - purchase

Step 4: Add the Order Tag recommended

Catches orders that are placed but never paid (approval-gated / pay-later orders).

Tags → New → Google Analytics: GA4 Event

  • Name: GA4 - order_placed
  • Event Name: order_placed
  • Measurement ID: {{YOUR MEASUREMENT ID}}
  • Send Ecommerce data: ON, Data source: Data Layer
  • Add all 9 Event Parameters (this event isn't standard, so nothing is automatic — even fields that are usually automatic need a row here):
ParameterValue
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}}
  • Triggering: CE - order_placed

Note: this tag can't carry the ticket list — that's fine, every paid order still gets it via the purchase tag.

Step 5: Add the Funnel Tag recommended

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

  • Name: GA4 - funnel
  • Event Name: type {{Event}} exactly, braces included (needs the built-in “Event” variable turned on from Step 2)
  • Measurement ID: {{YOUR MEASUREMENT ID}}
  • Send Ecommerce data: ON, Data source: Data Layer
  • Event Parameter: discount = {{DLV - ecommerce.discount}}
  • Triggering: CE - funnel

Step 6: Register Custom Fields in GA4 required

In the GA4 property that owns {{YOUR MEASUREMENT ID}} (not Tag Manager): Admin → Data display → Custom definitions

Create Custom Dimension (5 times):

Dimension nameScopeEvent/Item parameter
Order statusEventorder_status
Order IDEventorder_id
Gateway payment IDEventpayment_gateway_id
Item taxItemtax
Item line totalItemitem_total
⚠️
Common mistake: “Item tax” and “Item line total” must be created with Scope: Item, not Event. These are per-ticket fields (each ticket in an order can have its own tax and line total), so Event scope will never match them.

Create Custom Metric (4 times, scope always Event):

Metric nameEvent parameterUnit
FeefeeCurrency
Discount amountdiscountCurrency
Payment roundroundStandard
Tickets in paymentticket_countStandard
⚠️
Registering only captures data going forward — it's not retroactive.
📌
“Gateway payment ID” is optional and unique per payment — don't group reports by it, only use it as a filter to look up one transaction.
You do not need to register: transaction_id, value, currency, coupon, payment_type, or any standard ticket fields (item_id, item_name, price, quantity, etc.) — those report automatically.

Step 7: Test in Preview Mode before publishing!

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 once
  • ☐ On the purchase tag's Variables tab, every DLV - ecommerce.* shows a real value (not “undefined”)
  • ☐ Purchase tag's Parameters tab shows order_id, ticket_count, payment_gateway_id (and round, if paid in instalments)
  • ☐ Currency shows the real order currency, not a hardcoded value
  • items shows one row per ticket type
  • view_item_list fires once per page load, not once per click
  • ☐ Quantity buttons fire add_to_cart/remove_from_cart with the change amount, not the new total
  • begin_checkout fires once; going back and forward again fires nothing extra
  • ☐ Reopening an old confirmation email/page fires no purchase and no order_placed — this is the main bug you're fixing
  • ☐ Just viewing the ticket page (no purchase) fires nothing
  • ☐ In GA4 DebugView, the purchase event appears once per order — this confirms no duplicate tracking is happening
Once all boxes are checked, publish the container.