Calculator Usage Analytics — GTM + GA4 Setup Guide (Part 3)

The speed-up calculator and the filler calculator now push usage events to the dataLayer. Nothing shows up in Google Analytics until you wire the events through in the GTM web UI — this is that checklist, and it is self-contained: every step is spelled out here, nothing requires opening the earlier guides. One-time setup of roughly 20 minutes.

Why: both tools are "grab a number and alt-tab back to the game" pages, so GA4's standard metrics can't tell successful 10-second visits from real bounces. These events measure actual tool usage — including visitors who compute a result and read it off the screen without ever clicking Copy.

Design guarantee: the site never fires a purchase event, and GA4 only counts revenue from purchase — so nothing here can ever appear as revenue. Monetization reports stay at $0.

The events the site sends

Speed-up calculator (/speed-up-calculator)

Event Fires when Notable data
speedup_snapshot User leaves/hides the page after entering quantities (one snapshot per changed bag state — unchanged state never re-fires) total_seconds, total_days (rounded to 0.1), items_count (total speed-ups entered), distinct_denoms (how many different denominations), per-type totals seconds_regular / seconds_research / seconds_wall / seconds_healing / seconds_training / seconds_merging / seconds_crafting, snapshot_trigger (visibilitychange or pagehide)

Filler calculator (/filler-calculator)

Event Fires when Notable data
filler_copy The conversion: Copy-result button clicked with a valid result comp (the composition as typed, e.g. 208), fill_size (number, e.g. 100000), ratio_t5 (e.g. 60), output_lang (en or localized — was the copied text English?), copy_ok (false = clipboard failed, worth watching on iOS)
filler_snapshot User leaves/hides the page with a valid result on screen (deduped like the speed-up snapshot) same comp / fill_size / ratio_t5, plus did_copyfalse means the visitor computed a result but read it off the screen without copying; combined with filler_copy this answers "do visitors actually use the tool"
filler_multi_generate Multi-comp generator produced output comps_count, fills_count, ratios_count, line_count (lines generated)
filler_multi_copy Copy on the multi-comp output line_count, copy_ok
filler_set_pref A display toggle changed pref (output_thousands / input_thousands / english_output), pref_value (true/false)
filler_edit_list A saved list was customized in Settings list_type (comp / fill / ratio), list_action (add / delete / reorder / reset)

Every page seeds page_locale onto the dataLayer before GTM loads and the Google tag already forwards it, so all events above can be segmented by language with no extra wiring.

Part 1 — GTM (tagmanager.google.com → container GTM-NF8QBRSZ)

1. Create Data Layer Variables (24 of them)

Variables → User-Defined → New → Data Layer Variable (version 2). Create one per name below, naming the variable the same as the data layer key. If a variable with the name already exists from an earlier setup, skip it — do NOT create a duplicate. (snapshot_trigger, items_count and page_locale will already exist.)

Speed-up: total_seconds · total_days · distinct_denoms · seconds_regular · seconds_research · seconds_wall · seconds_healing · seconds_training · seconds_merging · seconds_crafting

Filler: comp · fill_size · ratio_t5 · output_lang · copy_ok · did_copy · comps_count · fills_count · ratios_count · line_count · pref · pref_value · list_type · list_action

2. Create one trigger for all events

Triggers → New → Custom Event

3. Create one GA4 event tag

Tags → New → Google Analytics: GA4 Event:

(Unused parameter rows on an event are harmless — GA4 drops parameters that aren't present in a given event's payload, so one tag covers all seven events.)

4. Consent

Nothing to configure: the new tag gets the same built-in consent checks (analytics_storage) as the rest of the container — CookieYes + Consent Mode already gate it. Visitors who decline analytics won't send these events.

5. Preview, then publish

Part 2 — GA4 (analytics.google.com → Admin)

6. Mark the key events

Marking filler_copy and speedup_snapshot as key events does two things: they show up as conversions, and GA4 counts their sessions as engaged — so the tool pages' bounce rate finally reflects reality instead of punishing 10-second successful visits.

(Google's April 2026 update removed the "Key events" admin page, hence the longer flow.)

  1. Fire each event once so GA4 knows it exists: during the step-5 GTM Preview session, confirm both filler_copy and speedup_snapshot appear in Admin → Data display → DebugView.
  2. Admin → Data display → Events.
  3. Find the filler_copy row. (The list can lag DebugView by up to 24 h — if it's missing, come back later.)
  4. On that row, turn on Mark as key event.
  5. In the validation/settings flow, answer:
  6. Repeat steps 3–5 for speedup_snapshot.

(If you later decide that read-off-the-screen usage should also count as engagement, mark filler_snapshot as a key event the same way — left off by default so the conversion list stays meaningful.)

7. Register custom definitions

Admin → Data display → Custom definitions:

Custom metrics (event scope, unit Standard):

Custom dimensions (all event scope):

(snapshot_trigger, page_locale and the items_count metric are already registered from the earlier setups — skip them. The seven seconds_* params and the multi-comp *_count params are forwarded to GA4 but deliberately left unregistered to keep the definition quotas clean; register one later if a report needs it. Only registered parameters become usable in reports, and data before registration isn't backfilled — do this right after publishing.)

8. Verify in DebugView

While GTM Preview is connected: Admin → Data display → DebugView shows the events live. Confirm filler_copy carries comp/fill_size/ratio_t5, the snapshots carry snapshot_trigger, and Reports → Monetization still shows $0 revenue.

Where the answers show up (after ~24–48 h)