Setting up an event in Google Analytics 4 means one of three things, and picking the wrong one is why most setups go sideways. You either flip a switch that is already there, create a rule in the GA4 interface that rewrites an event you already collect, or send a genuinely new event from your site with Google Tag Manager or gtag.js. GA4 is event based from top to bottom, so every pageview, scroll and purchase is the same kind of object with a different name.
gtag('event', 'name', {params}). Register any custom parameter under Admin, Data display, Custom definitions or it will not appear in reports. Mark the important ones as key events.This guide walks the whole path in the current GA4 interface: what you get for free, what you can build without touching code, when you genuinely need a tag manager, how parameters become reportable dimensions, and how to prove the whole thing works in DebugView before you walk away from it.
The four kinds of GA4 events
Google splits events into four buckets, and knowing which bucket your target sits in saves a lot of wasted work.
Automatically collected events arrive the moment the tag loads. You get first_visit, session_start, user_engagement and a handful of others with no configuration at all.
Enhanced measurement events are collected by a set of listeners you toggle per data stream. Google’s documented list covers page views, scrolls, outbound clicks, site search, video engagement, file downloads and form interactions.
Recommended events are Google’s reserved names and parameter schemas for common business actions such as purchase, generate_lead, sign_up and add_to_cart. They are not collected for you, but if you send them with the documented parameters, GA4 and Google Ads know how to use them.
Custom events are everything else. You name them, you define the parameters, and you accept that they will not show up in most standard reports until you build an exploration or register custom dimensions.
generate_lead, sending lead_form_submitted instead costs you automatic reporting and Google Ads compatibility for no benefit.Step one: turn on enhanced measurement
Go to Admin, then under Data collection and modification click Data streams. Select your web stream. Enhanced measurement sits near the top with a toggle and a gear icon.
Open the gear and you can enable or disable each listener independently. Two are worth a second look. Site search fires view_search_results and by default watches for the query parameters q, s, search, query and keyword. If your site uses something else, add it in the advanced settings for that toggle. Form interactions fires form_start and form_submit and is genuinely useful on simple HTML forms, but it often misses JavaScript widgets and single page apps entirely.
Step two: create an event in the GA4 interface
The Create event tool builds a new event out of one you already receive. No code, no deployment, and it starts collecting from the moment you save. It cannot invent data that was never sent.
Go to Admin, under Data display click Events, then Create event. Choose your data stream and click Create. Give the new event a name, then set the matching conditions.
A classic example is turning a specific thank you page into a lead event:
Custom event name: generate_lead
Matching conditions:
event_name equals page_view
page_location contains /thank-you/
Parameter configuration:
[x] Copy parameters from the source event
Modify parameters:
lead_source = website_formSave it, and every qualifying pageview now also produces a generate_lead event with an extra parameter. The original page_view keeps firing, so nothing is lost.
The same screen holds Modify event, which rewrites an existing event rather than creating a second one. Use it to clean up messy names or to strip a parameter you should not be collecting. Modify rules run before create rules, which matters if you chain them.
Step three: send a real custom event
When the interaction is not already in your data, something on the page has to send it. There are two mainstream ways.
With Google Tag Manager
In your GTM container, create a trigger for the interaction, for example a Click trigger limited to elements matching a CSS selector. Then create a tag of type Google Analytics: GA4 Event, point it at your measurement ID or your configuration tag, and set the event name.
Add parameters in the Event Parameters section. Keep names lowercase with underscores, and keep them consistent across the site. Preview the container, confirm the tag fires, then publish. If GTM is not on your site yet, our guide to installing Google Tag Manager on WordPress covers the container setup.
With gtag.js directly
If you loaded GA4 with the Google tag rather than GTM, you can call the event straight from your own JavaScript:
<button id="download-guide">Download the guide</button>
<script>
document.getElementById('download-guide').addEventListener('click', function () {
gtag('event', 'guide_download', {
guide_name: 'ga4 event setup',
guide_format: 'pdf',
value: 5,
currency: 'USD'
});
});
</script>Event names are case sensitive, capped at 40 characters, and must start with a letter. Parameter names are capped at 40 characters and parameter values at 100 characters for most events. Do not put anything that identifies a person into a parameter: Google’s terms prohibit it, and properties have been disabled over it.
Step four: register parameters as custom dimensions
This is the step people skip, and then they file a support ticket because their parameter is missing. GA4 collects the parameter regardless, but it will not appear as a dimension in reports or explorations until you register it.
Go to Admin, under Data display click Custom definitions, then Create custom dimension. Give it a report friendly name, set the scope to Event, and pick the exact parameter name from the dropdown or type it in.
Two things to know. Registration is not retroactive: you will see data from the moment you create the definition, not before. And Google’s documentation states that data typically becomes available for reporting after 24 to 48 hours, so do not panic on day one.
| Scope | What it describes | Standard property limit | Typical use |
|---|---|---|---|
| Event | One occurrence of an event | 50 | Form name, video title, download format |
| User | A property of the visitor | 25 | Account tier, logged in status |
| Item | A product inside an ecommerce array | 10 | Product color, supplier |
| Session | A single session | Limited, check quota | Campaign variant |
Click Quota information in the top right of the Custom definitions screen at any point to see how much of your allowance you have used. Analytics 360 properties get higher ceilings.
Step five: mark key events
Google renamed conversions to key events inside Analytics, while the word conversion now refers to what Google Ads counts. The practical mechanics did not change.
Go to Admin, under Data display click Key events. If the event has already been collected at least once, it appears in the list with a toggle. Flip it on. If it has not fired yet, use New key event and type the name exactly as you send it.
Keep the list short. Three to six key events per property is a healthy number. Marking every micro interaction as a key event makes the Advertising reports useless and inflates every conversion rate you report. For a wider view of turning this data into decisions, see our guide on using Google Analytics for marketing.
Step six: verify in DebugView
Never trust an event you have not watched arrive. DebugView shows a live stream of events from devices in debug mode.
Enable debug mode one of three ways: switch on Preview in Google Tag Manager, install the Google Analytics Debugger browser extension, or send debug_mode: true as a parameter. Then go to Admin, under Data display click DebugView.
Trigger your event on the site. It should appear in the timeline within a few seconds. Click it and the parameter list expands so you can confirm names and values character by character. If the event arrives but a parameter is missing, the problem is in your tag. If nothing arrives at all, the problem is in your trigger or in the tag loading at all. Our walkthrough on tracking a custom event in Google Analytics goes deeper on the debugging loop.
Troubleshooting
The event fires but reports show nothing. Standard reports lag behind DebugView by up to 24 hours for most surfaces. Use the Realtime report for the first check and give the standard reports a day before you conclude anything is broken.
The parameter is missing from explorations. You almost certainly did not register it as a custom dimension. Registering it now starts collection from today and will not backfill.
Counts are roughly double what you expect. Look for two sources of the same event: enhanced measurement plus a manual tag, a GTM tag firing on both a click and a form submit trigger, or two GA4 configuration tags on the same page.
The event name shows up with strange casing. GA4 event names are case sensitive, so Guide_Download and guide_download are two different events. Use Modify event to consolidate them, and fix the source so it stops happening.
You hit the custom dimension limit. Audit what is actually used in reports before requesting more. Most properties have several registered dimensions nobody has queried in a year. Archive them to free the slot.
Frequently asked questions
Do I need Google Tag Manager to set up GA4 events?
No. Enhanced measurement and the Create event tool cover a surprising amount without any code. You need GTM or gtag.js only when the interaction is not already present in your data, such as a click on a specific button or a step inside a checkout flow.
What is the difference between a key event and a conversion?
Google now uses key event for the important actions you flag inside Analytics, and reserves conversion for what Google Ads counts and optimizes toward. A key event marked in GA4 can be imported into Google Ads, where it becomes a conversion action.
How many custom events can I create?
Custom event names are effectively generous rather than unlimited, but the practical constraint is custom dimensions: standard properties allow 50 event scoped dimensions. Most teams run out of dimension slots long before they run out of event names, so plan the parameter schema first.
Why can I not find my custom event in a standard report?
Custom events do not appear in most standard reports by design. Look at Reports, Engagement, Events for the raw count, then build a free form exploration or a custom report in the Library if you need to break it down by parameter.
Can I rename an event after it has been collecting for months?
You can create a Modify event rule that renames it going forward, but historical data keeps the old name. In practice you keep both names in your reports for a transition period and note the switch date in your documentation.
Does the Create event tool work retroactively?
No. Both Create event and Modify event apply only to data collected after you save the rule. If you need the same treatment for past data, you have to do it downstream, for example in a BigQuery export.
The bottom line
Work from the cheapest option upward. Check whether enhanced measurement already collects it, then whether the Create event tool can derive it from existing data, and only then reach for a tag. That order keeps your container small and your deployments rare, which is worth more than any single clever tag.
Whatever you build, register the parameters, verify in DebugView, and keep the key event list short and meaningful. Google’s official events documentation is the reference to check when a name or parameter looks ambiguous, and it is updated far more often than any tutorial.
