# GA4 key events for ecommerce: what to mark in 2026

Purchase is already a key event. Ads Personalization can star add_to_cart and session_start. Counting methods, default values, and what to unmark on a live store.

- Date: 2026-09-02
- Category: Analytics

GA4 key events are the events you star so Analytics treats them as business outcomes, not just traffic. I am Alan Vo, a Gold Coast web developer with 18 years on Magento, Shopify and WooCommerce catalogues. In 2026 the Admin UI still says key events where a merchandiser says conversions, and that naming gap is how a store ends up bidding on `add_to_cart`.

Google's [mark events as key events](https://support.google.com/analytics/answer/13128484) help article is the product rule I implement against. Starring is a property setting, not a second pixel. If `purchase` is duplicated, starring it only makes the fiction louder. Payload work still lives in [GA4 ecommerce events that match real revenue](https://alanvo.com/blog/ga4-ecommerce-events/). This note is which events I star, which I unstar, how counting methods change the number, and why Google Ads conversions are a different object.

## What changed for GA4 key events in 2026

What changed for GA4 key events in 2026 is the split Google published between a key event and a conversion. In [Conversions vs. key events](https://support.google.com/analytics/answer/13965727), a key event is an action that matters to the business and shows up in Analytics reports. A conversion is the action you also want for Ads bidding and Ads-side reporting. The flow is event, then key event, then conversion. You do not rebuild an existing property. Historical conversion data is still readable as key event data. Google Ads conversions shared into Analytics do not carry that history.

The rename is not cosmetic on a catalogue. People still import "GA4 conversions" into Ads and then wonder why `begin_checkout` is an optimisation target. Google is explicit: if you create a Google Ads conversion from a non-key event, Analytics marks that event as a key event automatically.

`purchase` is marked as a key event by default on web and app. App-only defaults include `first_open`, `in_app_purchase`, `app_store_subscription_convert` and `app_store_subscription_renew`. Those sit in addition to the events you mark yourself. Standard properties can mark 30 events. Analytics 360 properties can mark 50.

The production trap is Ads Personalization on a linked Google Ads account. The same help page then stars `add_to_cart`, `add_to_wishlist`, `begin_checkout`, `session_start`, `view_item`, `view_item_list` and `view_search_results`. That is a catalogue's entire browse path plus session start. Leave it starred and key event rate looks like a carnival.

You still send the event from the storefront. Google's [tag platform conversions guide](https://developers.google.com/tag-platform/devguides/conversions) is two steps for Analytics: fire the event with gtag or a GA4 Event tag, then mark it in the property. Marking without a correct `purchase` payload is a labelled empty box.

![GA4 key events charts on a widescreen monitor](../../images/blog/ga4-key-events-ecommerce-1.jpg)

## How GA4 key events actually work on a catalogue

How GA4 key events actually work on a catalogue is by event name, not by a parameter filter. Analytics registers a key event every time that `event_name` arrives. You cannot say "only when value is over 50" inside the star. If you need that, send a different event name from the theme or GTM and star that name. I almost never do that for revenue. I fix `purchase` instead.

Counting method is the second lever. [Change the counting method of key events](https://support.google.com/analytics/answer/13366706) gives two options. Once per event (recommended) counts every firing. Once per session (legacy) counts one per session even if the event fired five times. If a thank-you reload sends `purchase` twice, once per event counts two. Once per session hides the second. I set `purchase` to once per event and I stop the second fire in the pixel, with `transaction_id` as the dedupe key. Once per session is the default only for key events that came from Universal Analytics goals, including automatically created GA4 properties and the goals migration tool after April 2023. Migrated Magento and WooCommerce properties from the UA era often still sit there. I read the method before I argue about conversion rate.

Value is the third lever. [About default key event value](https://support.google.com/analytics/answer/13749237) says a default amount applies only when the event has no `value`. A $1 default on `generate_lead` invents revenue that then gets compared to Ads. I do not set a default on `purchase` or on `add_to_cart`.

The payload still has to be the recommended ecommerce shape. Google's [measure ecommerce](https://developers.google.com/analytics/devguides/collection/ga4/ecommerce) guide and the [purchase setup tutorial](https://developers.google.com/analytics/devguides/collection/ga4/set-up-ecommerce) want `transaction_id`, `value`, `currency` and an `items` array. [Recommended events](https://developers.google.com/analytics/devguides/collection/ga4/reference/events) say `value` should be the sum of price times quantity for the items, without shipping or tax stuffed into that sum, and that `currency` is required if you set `value`. Tax and shipping are their own parameters. Starring does not rewrite the object.

On Shopify I map `checkout_completed` to `purchase`. Theme GTM never sees hosted checkout. The Customer Events path is in [Shopify custom pixel for Google Tag Manager](https://alanvo.com/blog/shopify-gtm-custom-pixel/). Names have to match. On WooCommerce block checkout the thank-you is not always the old `order-received` body class. On Magento, a module that sends `checkout_success` will never fill the default `purchase` key event. I rename at the dataLayer.

![Spreadsheet and coffee while reconciling revenue](../../images/blog/ga4-key-events-ecommerce-2.jpg)

Marking is not retroactive. Reports pick up the star from the time you set it, with up to 24 hours for standard reports. Unstarring does not rewrite history. A week of `session_start` as a key event poisons the month even after you turn the star off.

## Production checklist for starring purchase without starring the funnel

The production checklist for starring purchase without starring the funnel is inventory, names, counting, value, Ads linkage, then a test order.

1. List every event currently starred. Include defaults and anything Ads Personalization added. Screenshot the Key events tab.
2. Confirm the live event name is exactly `purchase`. Shopify `checkout_completed`, Magento success observers and WooCommerce plugin names are mappings, not the GA4 name.
3. Confirm `purchase` has `transaction_id`, `value`, `currency`, `items`, `tax` and `shipping`. DebugView first, as in [GA4 DebugView](https://alanvo.com/blog/ga4-debugview-tracking/).
4. Leave `purchase` as a key event. That is the revenue outcome.
5. Unstar `session_start`, `view_item`, `view_item_list` and `view_search_results` if Ads Personalization starred them. Those are funnel diagnostics, not outcomes.
6. Unstar `add_to_cart`, `begin_checkout` and `add_to_wishlist` unless you will never import them into Ads. Carts and wishlists are not revenue.
7. Set `purchase` counting to once per event. Then stop duplicate thank-you fires. Do not use once per session as a bandage.
8. Do not set a default key event value on `purchase`. If value is missing, fix the pixel.
9. If you need Ads bidding, create a Google Ads conversion from the `purchase` key event, with the same value and transaction id rules. Do not create Ads conversions from browse events.
10. Check the key event lookback window so the number you quote matches [GA4 attribution for ecommerce](https://alanvo.com/blog/ga4-attribution-ecommerce/).
11. Place a test order. Confirm one `purchase` in DebugView, one key event in Realtime, and the same order id in admin. Refund it. Reconcile after 48 hours against the gateway.

A Magento catalogue with layered nav and a boutique Shopify theme still have one revenue event. Magento will fire more `view_item_list` events. Starring those lists does not tell you which filter converts.

## What breaks when GA4 key events include the whole browse path

What breaks when GA4 key events include the whole browse path is the conversion rate itself. `session_start` as a key event means almost every session converts. Channel comparison becomes noise. A merchandiser will ask why paid is working when the only thing that fired is a session. I have had that meeting. The screenshot of the star next to `session_start` ends it.

![Analytics graphs on a laptop in a dark office](../../images/blog/ga4-key-events-ecommerce-3.jpg)

Create a Google Ads conversion from `add_to_cart` and Smart Bidding will hunt carts, not orders. You will see more carts. You may see fewer purchases. The [conversions vs key events](https://support.google.com/analytics/answer/13965727) page is clear that a conversion is for campaign performance and bidding. Do not give bidding a browse event.

Migrated UA goals are the quiet double count. A property that still has `goal_3` or `order_confirmation` starred alongside `purchase` counts the same thank-you twice. I unstar the legacy names after I prove `purchase` is firing.

A default value on a lead-style event that a plugin also sends on every newsletter popup invents revenue that never hit the gateway. I keep revenue on `purchase` only. Consent still wraps this. If `analytics_storage` is denied, starring cannot recover a hit that never arrived. Server-side collection can send `purchase` later. Do not fire client and server `purchase` without `transaction_id` dedupe. That warning is in [server-side vs client-side analytics](https://alanvo.com/blog/server-side-vs-client-analytics/). Two measurement IDs are the other classic: a Shopify channel app plus GTM plus a Magento module will send three `purchase` events. Each is a key event. One owner.

## How to measure whether the stars match money

How to measure whether the stars match money is to pick one outcome event and compare it to the gateway, then to Ads, with timezone and lag named out loud.

Pull seven days of paid-and-captured orders from Shopify, WooCommerce or Magento. Pull GA4 `purchase` event count and purchase revenue. Pull key event count for `purchase` only. Those two GA4 numbers should be the same if `purchase` is the only revenue star and counting is once per event. If key event count is lower, you are on once per session or you starred a different name. If it is higher, another event is in the blended report.

Then pull Google Ads conversion count for the action created from that key event. They will not match exactly. Consent, modelled conversions, lookback and view-through exist. Direction should agree. A 2x gap is a tag. A small gap on a Safari-heavy fashion store can be privacy. I still want the GA4 `purchase` event closer to the gateway than to Ads.

Use DebugView on a real checkout, including Shop Pay and express wallets. Use an exploration for one SKU from `view_item` to `purchase`. Funnel events can stay unstarred and still be in the exploration. Key events are a highlight, not the only events you collect. Watch for `purchase` with empty items. Starring does not fill `items`. The connector does.

![Team looking at a dashboard on a wall screen](../../images/blog/ga4-key-events-ecommerce-4.jpg)

## Related work on this site

[Retail conversion at scale](https://alanvo.com/work/retail-conversion/) is three Magento stores, funnels and a $2.5 million year-on-year sales increase over three years. Conversion was an operational number, not a starred browse event. [Their Nibs](https://alanvo.com/work/their-nibs/) is a Shopify rebuild with published lifts of 31 percent more conversions and 48 percent more orders. That lift was journey and theme. GA4 still had to record one `purchase` per order. [Offporter](https://alanvo.com/work/offporter/) is another Shopify catalogue where checkout measurement has to survive hosted checkout. For payload shape, use [GA4 ecommerce events](https://alanvo.com/blog/ga4-ecommerce-events/). For channel credit after the star is honest, use [GA4 attribution](https://alanvo.com/blog/ga4-attribution-ecommerce/). For Ads value matching, use [Google Ads enhanced conversions](https://alanvo.com/blog/google-ads-enhanced-conversions/).

## FAQ

### Which GA4 key events should a store mark?

The GA4 key events a store should mark start with `purchase` and usually end there for revenue. Funnel events stay collected. They do not need a star. If the business also lives on leads, mark `generate_lead`, not `page_view`.

### Why do GA4 key events show more conversions than Shopify or Magento?

GA4 key events show more conversions than Shopify or Magento when you starred browse events, when `purchase` fires twice, or when a migrated UA goal still sits next to `purchase`. Count stars, then count `purchase` hits for one order in DebugView.

### Are GA4 key events the same as Google Ads conversions?

GA4 key events are not the same as Google Ads conversions. A key event is the Analytics highlight. A conversion is the Ads object you bid on. Google will auto-star an event if you create an Ads conversion from it. Keep bidding on `purchase`.

### Should add_to_cart sit in GA4 key events?

`add_to_cart` should not sit in GA4 key events on a live catalogue unless you are doing a time-boxed UX study and you will not import it into Ads. Ads Personalization may star it for you. Unstar it. Carts are a step. Orders are the outcome.


![Phone and laptop showing the same store metrics](../../images/blog/ga4-key-events-ecommerce-5.jpg)


HTML version: https://alanvo.com/blog/ga4-key-events-ecommerce/
