GA4 only understands your business if you speak its vocabulary. Send purchase with items and value and the Monetisation reports fill themselves in. Send buy_now_click with price and you get an event count and nothing else. This reference lists the recommended events that matter outside gaming, with their parameters, example code and a frank note on which ones are worth your time.
Rules That Apply to Every Event
- Event names are case sensitive and use snake_case.
valueis a number.currencyis a three-letter code such as USD or AUD. Send both together.- Ecommerce events carry an
itemsarray inside anecommerceobject in the dataLayer, and the GA4 Event tag reads it with the ecommerce data option. - Push
{ ecommerce: null }before every ecommerce push so the previous event's items do not leak into the next. - Mark outcomes as key events in GA4 Admin.
Ecommerce Events
| Event | When | Required parameters |
|---|---|---|
| view_item_list | A list of products is shown | items, item_list_id, item_list_name |
| select_item | A product is clicked in a list | items |
| view_item | Product page viewed | currency, value, items |
| add_to_wishlist | Saved for later | currency, value, items |
| add_to_cart | Added to cart | currency, value, items |
| remove_from_cart | Removed from cart | currency, value, items |
| view_cart | Cart page viewed | currency, value, items |
| begin_checkout | Checkout started | currency, value, items, coupon |
| add_shipping_info | Shipping step completed | currency, value, items, shipping_tier |
| add_payment_info | Payment step completed | currency, value, items, payment_type |
| purchase | Order completed | transaction_id, currency, value, items, tax, shipping, coupon |
| refund | Order refunded | transaction_id, currency, value, items |
| view_promotion, select_promotion | Banner shown or clicked | items, promotion_id, promotion_name, creative_name |
Item parameters: item_id, item_name, price, quantity, plus optional item_brand, item_category through item_category5, item_variant, coupon, discount, index, item_list_name.
Purchase push:
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: '10234',
value: 129.90,
tax: 11.81,
shipping: 9.95,
currency: 'AUD',
coupon: 'WELCOME10',
items: [{
item_id: 'SKU-401',
item_name: 'Lumbar Support Cushion',
item_brand: 'Posture Co',
item_category: 'Cushions',
item_variant: 'Grey',
price: 59.95,
quantity: 2
}]
}
});
Lead Generation Events
| Event | When | Parameters |
|---|---|---|
| generate_lead | A form or enquiry is submitted | currency, value, lead_source |
| qualify_lead | Lead marked qualified in the CRM | currency, value |
| working_lead | Sales is working the lead | currency, value, lead_status |
| close_convert_lead | Lead became a customer | currency, value |
| close_unconvert_lead | Lead was lost | currency, value, unconvert_lead_reason |
| disqualify_lead | Lead disqualified | currency, value, disqualified_lead_reason |
Lead push from a form success event:
window.dataLayer.push({
event: 'generate_lead',
currency: 'USD',
value: 150,
lead_source: 'contact_form',
form_name: 'Request a quote'
});
The CRM stage events are sent server-side when the stage changes, through the Measurement Protocol with the original client ID, or imported via Data import. They are worth it for any business where lead quality varies by channel, which is every business.
Account and Subscription Events
| Event | When | Parameters |
|---|---|---|
| sign_up | Account created | method |
| login | User logged in | method |
| tutorial_begin, tutorial_complete | Onboarding steps | none |
| purchase | Subscription started or renewed | transaction_id, value, currency, items |
| refund | Subscription refunded | transaction_id, value, currency |
For trials, there is no dedicated recommended event. Use sign_up with a method of trial, or a custom start_trial event, and mark it as a key event.
Content and Engagement Events
| Event | When | Parameters |
|---|---|---|
| search | Site search performed | search_term |
| share | Content shared | method, content_type, item_id |
| select_content | A content item chosen | content_type, content_id |
| join_group | Joined a community | group_id |
| earn_virtual_currency, spend_virtual_currency | Loyalty points | virtual_currency_name, value |
Which Ones to Implement
- Ecommerce: view_item, add_to_cart, begin_checkout, purchase, and refund if you can. Add view_item_list and select_item only when you will use the list reports.
- Lead generation: generate_lead with value, plus phone and booking events as custom events, plus the CRM stage events if your CRM can send them.
- SaaS: sign_up, login, purchase, and a custom trial event.
- Everyone: nothing you will not look at. Every event is a maintenance obligation.
Verify
In GA4 DebugView, each event should appear with the parameters you sent. For ecommerce, expand the event and confirm the items array is attached. After a day, the Monetisation and Lead reports populate only if names and parameters are right. If they stay empty, the event name or a parameter name is off by a character.
Outcome
Your GA4 property speaks Google's vocabulary. Reports work without configuration, Google Ads can import clean key events, and when you build a dashboard, every metric you want already exists.
