Amplio Data · Event naming convention
Tracking standards · internal and client facing

An event name is a schema. You get one chance to set it.

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.

1
Name across three surfaces
8
Rules · the whole convention
500
Event names GA4 will ever hold
0
Backfill when you rename

/ Amplio Data · 27 July 2026 · use → to advance

Source: our own builds — Amplio, Velo, Devenish, Odisei, Certify
Amplio Data · Event naming convention

/ 01 — One name, three surfaces

The same word travels from the form to the bid.

SurfaceWhat carries the nameDevenish
SiteThe dataLayer push — one named event per form, never GTM's automatic form listenercontact_submitted
GA4The event received through the container, then marked as a key eventcontact_submitted
Google AdsThe conversion action, sourced from that GA4 event, enhanced conversions oncontact_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.

Reference build: Devenish Nutrition handover, June 2026
Amplio Data · Event naming convention

/ 02 — GA4's vocabulary before our own

If Google already has a word for it, use Google's word.

What happeneddataLayer eventGA4 eventWhy
Contact form submittedcontact_submitgenerate_leadFeeds the lead reports and the Ads import path unchanged
Call bookeduser_booked_callgenerate_leadSame outcome as a form lead, so it totals with it
Early access signupearly_access_signupsign_upUnlocks the signup funnel template
Consent scan finishedscan_completescan_completeNothing recommended means this — a custom name is correct
Order placedpurchasepurchaseThe 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

Live examples: ampliodata.io and veloconsent.com
Amplio Data · Event naming convention

/ 03 — The shape

Object first, action second, lowercase, underscores, ASCII.

/ 01

Lowercase, always

GA4 event names are case sensitive. Purchase and purchase are two different events sitting in the same property, splitting the same revenue.

/ 02

Underscores between words, ASCII only

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.

/ 03

Object then action, past tense

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.

/ 04

Specific, and under 40 characters

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.

Legacy names are retired on a deliberate cutover, never renamed mid flight
Amplio Data · Event naming convention

/ 04 — Detail belongs in parameters

One event, many parameters. Never one event per variant.

1
Event

generate_lead

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.

500
Names a property will ever hold

The cap is the reason

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.

0
Reports for an unregistered param

Register or it is invisible

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.

a–z
Parameter casing

Vendor casing stops at the server

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.

Limits are GA4 platform limits, standard property
Amplio Data · Event naming convention

/ 05 — Key events are a short list

Every property has a named target set. Everything else is drift.

PropertyKey eventsWhat the list is for
Odiseiadd_to_cart · purchaseTwo names, both revenue shaped; five legacy key events were unmarked to get here
Certifystart_registrationOne name. A second one appearing in the audit is a finding, not a feature
Velogenerate_lead · sign_up · scan_start · scan_completeBuilt to the convention from day one, so the list needed no cleanup
/ A

A name cannot be key evented until it has fired

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.

/ B

purchase is immovable

It 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.

Target sets are checked weekly by the tracking audit
Amplio Data · Event naming convention

/ 06 — Inside the container

Type prefix first, then the thing: [Type] - [Description].

ObjectPattern and whyReal names
TagDestination, then the event it sends — sorts the container by where data goesGA4 - purchase
[Stape] Meta - Purchase
TriggercEvent for a custom event, Block for an exception — the two you search for at 2amcEvent - purchase
Block - duplicate purchase
Variabledlv, cjs, const — the prefix tells you what breaks if it returns undefineddlv - ecommerce.value
cjs - normalized items
VersionA short name is fine, the description stays emptyunblock 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.

Prefixes in daily use across the Odisei, Certify and Amplio containers
Amplio Data · Event naming convention

/ 07 — UTMs

Lowercase, and the medium has to be one GA4 actually routes.

/ 01

Lowercase everything

Google and google are two sources in the same report. Casing is the cheapest way to split a channel in half.

/ 02

The medium comes from GA4's matching list

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.

/ 03

Source is the platform, never a bucket

facebook, instagram, youtube — not Social_Media. A bucket in the source slot cannot be un mixed later.

/ 04

Readable campaign slugs, with an account level fallback

server-side-tagging-search-gb at campaign level, {campaignid} as the account fallback, so a campaign built in a hurry is still tagged.

Rules as applied on the Odisei retag and the ampliodata.io Ads account
Amplio Data · Event naming convention

/ 08 — What drift looks like

Every fault below is real, and was found on a live account.

FaultExampleWhat it costs
Accented namestramitación_de_la_compraBreaks BigQuery joins; cannot be typed reliably twice
Four casings, one estatePopUp-Submission · Submit lead form · qualify_leadNobody can guess a name, so every report is hand built
Data inside the nametel:02882250160 as an event nameA new name per phone number; the 500 cap does the rest
Key events pointing at ghoststhank_you, purchase on a site with no ordersConversions read zero while real leads arrive unmarked
A name outside the target setprep_submission_10 counting as a conversionInflates 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

Sources: Odisei, Certify and an inherited WordPress estate
Amplio Data · Event naming convention

/ 09 — Before the tag is published

Write the name down before it fires.

/ 01

Fill the tracking plan row

dataLayer event, GA4 event, parameters, custom dimension, key event yes or no, Ads conversion action. Six cells, filled before the tag exists.

6
cells per event
/ 02

Check the recommended list first

One search. If Google has the word, the argument is over and the GA4 layer takes it.

1
check
/ 03

Register the parameters the same day

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.

same day
no backlog
/ 04

Star the key event the next day

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.

24h
registration lag
The same closed checklist every tracking implementation runs
Amplio Data · Event naming convention

/ The convention

Eight rules, one page, checked weekly.

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.

Questions to hello@ampliodata.io
Amplio Data · ampliodata.io · Barcelona