Everything downstream of a tag reads the name: the report, the key event, the Ads conversion, the audience, the BigQuery join. Renaming later does not move the history — it splits it. So the name gets decided before the tag is published, by these eight rules.
/ Amplio Data · 27 July 2026 · use → to advance
/ 01 — One name, three surfaces
| Surface | What carries the name | Devenish |
|---|---|---|
| Site | The dataLayer push — one named event per form, never GTM's automatic form listener | contact_submitted |
| GA4 | The event received through the container, then marked as a key event | contact_submitted |
| Google Ads | The conversion action, sourced from that GA4 event, enhanced conversions on | contact_submitted |
When three systems disagree about what a thing is called, every conversation about it starts with a translation. One name means anyone can follow a lead from the form to the bid without a map. There is exactly one exception, and it is the next rule.
/ 02 — GA4's vocabulary before our own
| What happened | dataLayer event | GA4 event | Why |
|---|---|---|---|
| Contact form submitted | contact_submit | generate_lead | Feeds the lead reports and the Ads import path unchanged |
| Call booked | user_booked_call | generate_lead | Same outcome as a form lead, so it totals with it |
| Early access signup | early_access_signup | sign_up | Unlocks the signup funnel template |
| Consent scan finished | scan_complete | scan_complete | Nothing recommended means this — a custom name is correct |
| Order placed | purchase | purchase | The recommended name already is the natural one |
A recommended name buys prebuilt reports, the Ads conversion import and audience templates — none of which can be retrofitted onto a synonym · when both names differ, the mapping goes in the client's tracking plan as a table, not in someone's head
/ 03 — The shape
GA4 event names are case sensitive. Purchase and purchase are two different events sitting in the same property, splitting the same revenue.
No spaces, no dots, no accents. tramitación_de_la_compra is a real production event name we inherited; it breaks every downstream join and nobody can type it twice the same way.
contact_submitted, cart_viewed, scan_complete. Read as a sentence about something that already happened, so a report row is a fact rather than an instruction.
hero_cta_clicked, never clicked. Forty characters is GA4's hard limit on the name — if you need more, what you are trying to say belongs in a parameter.
/ 04 — Detail belongs in parameters
Carries method, value, currency, email. Contact form and booked call arrive as the same event with a different method, so the lead total is right without anyone summing two rows.
Also 25 parameters per event, 100 characters per value, 50 event scoped custom dimensions. A name per variant spends the scarce thing to save the plentiful one.
Every parameter we send is registered as a custom dimension the same day. Certify's consent_state is sent, unregistered, and therefore unreportable — the standing reminder.
MiniCRM sends Status and ContactId. The server container maps them to snake_case before GA4 sees them — the enhanced conversion aliases are lowercase and case sensitive, so capitalized keys miss silently.
/ 05 — Key events are a short list
| Property | Key events | What the list is for |
|---|---|---|
| Odisei | add_to_cart · purchase | Two names, both revenue shaped; five legacy key events were unmarked to get here |
| Certify | start_registration | One name. A second one appearing in the audit is a finding, not a feature |
| Velo | generate_lead · sign_up · scan_start · scan_complete | Built to the convention from day one, so the list needed no cleanup |
GA4 registers a name roughly 24h after the first hit, and there is no create by name in the Events hub. Build the tag, let it fire, star it the next day. The audience builder's event picker is the one workaround.
purchase is immovableIt is a Google default and locks harder once Ads is linked. Do not fight it — name around it, and never point it at a site that has no orders.
/ 06 — Inside the container
[Type] - [Description].| Object | Pattern and why | Real names |
|---|---|---|
| Tag | Destination, then the event it sends — sorts the container by where data goes | GA4 - purchase[Stape] Meta - Purchase |
| Trigger | cEvent for a custom event, Block for an exception — the two you search for at 2am | cEvent - purchaseBlock - duplicate purchase |
| Variable | dlv, cjs, const — the prefix tells you what breaks if it returns undefined | dlv - ecommerce.valuecjs - normalized items |
| Version | A short name is fine, the description stays empty | unblock purchase tags |
The destination half mirrors that platform's own vocabulary — GA4 events lowercase, Meta standard events Title Case. That is deliberate: a tag name should read like the thing it sends, so a mismatch is visible before you open it.
/ 07 — UTMs
Google and google are two sources in the same report. Casing is the cheapest way to split a channel in half.
cpc, paid, email, organic, referral, social. Ads and Organic match no pattern, so the traffic files as Organic Social or Unassigned — exactly how a client's paid Meta spend disappeared into organic.
facebook, instagram, youtube — not Social_Media. A bucket in the source slot cannot be un mixed later.
server-side-tagging-search-gb at campaign level, {campaignid} as the account fallback, so a campaign built in a hurry is still tagged.
/ 08 — What drift looks like
| Fault | Example | What it costs |
|---|---|---|
| Accented names | tramitación_de_la_compra | Breaks BigQuery joins; cannot be typed reliably twice |
| Four casings, one estate | PopUp-Submission · Submit lead form · qualify_lead | Nobody can guess a name, so every report is hand built |
| Data inside the name | tel:02882250160 as an event name | A new name per phone number; the 500 cap does the rest |
| Key events pointing at ghosts | thank_you, purchase on a site with no orders | Conversions read zero while real leads arrive unmarked |
| A name outside the target set | prep_submission_10 counting as a conversion | Inflates conversions and poisons Ads bidding |
None of these were sloppiness at the time — each one was a reasonable local decision made without a written convention · that is what this document is for
/ 09 — Before the tag is published
dataLayer event, GA4 event, parameters, custom dimension, key event yes or no, Ads conversion action. Six cells, filled before the tag exists.
One search. If Google has the word, the argument is over and the GA4 layer takes it.
An unregistered parameter is a parameter that does not exist. Custom dimensions are created when the event is, not when someone asks for the report.
The name has to fire once before GA4 will accept it, so the build is not finished when the tag publishes. It is finished when the star is on.
/ The convention
The written convention lives in the vault at 03-Resources/Playbooks/event-naming-convention.md, with the worked examples and the client by client target sets. The weekly tracking audit reads the same target sets and reports any name outside them, so the convention is enforced by a job rather than by memory. New build, new client, inherited container: name it this way from the first tag, and there is nothing to migrate later.