This tower does not push to git. To approve, a human makes this exact edit and commits it:
1. Open docs/marketing/journal/005-analytics-ga4-datalayer-only.md in the docs repo. 2. Change the line "- **Status:** proposed" to "- **Status:** active". 3. Commit and push. The journal's git history is the audit trail; this tower does not commit on your behalf.
005: Behavior analytics is GA4 through the existing GTM, dataLayer-only; no new vendors
- Date: 2026-08-30
- Decider: engine proposal (Claude), pending Daud approval of the GTM container config step
- Status: proposed
- Review by: 2026-10-15
Decision
Full-funnel behavior instrumentation (view_item, view_item_list, select_item, begin_checkout, add_shipping_info, add_payment_info, purchase, plus voucher_applied and newsletter_subscribe) ships as typed dataLayer pushes through the existing lib/analytics.ts bridge into the GTM container already on the page. GA4 standard event names are used so built-in reports work without custom setup. No second analytics vendor, no new scripts, no client-side ad pixels. Full spec: docs/marketing/specs/analytics-tracking-plan.md.
Evidence
- Recon (2026-08-30) found near-zero event coverage: the one ecommerce-shaped call (
view_item) was wired to a documented no-op stub (lib/utils/legacy-stubs.ts:20-22) and the entire checkout path had zero analytics calls. GA4 could see pageviews at best; behavior could not be monitored, which is the gap this closes. - A dataLayer push is an in-memory array append; the GTM container script is already loading today, so instrumentation adds no network requests and no script weight. This satisfies the measurement spine's speed rule by construction.
- The site just completed a CWV overhaul; adding any new vendor script (PostHog, Clarity, etc.) would spend that budget for capabilities GA4 plus
growth.conversion_logalready provide. Session replay is the only real gap and stays a journal-gated future experiment with a before/after CWV read. - Revenue truth remains Stripe + growth (blueprint first principle 1); GA4
purchase.transaction_idequals the PaymentIntent id so the layers reconcile without GA4 ever becoming the reward signal.
Predicted effect
Within 7 days of the GTM tags being configured (the human runbook step), GA4 shows a complete tour-to-purchase funnel with 95 percent or more of Stripe-confirmed bookings appearing as purchase events (client-side loss from blockers is expected; the growth server feed covers it for ads). CWV (LCP, INP, CLS) in CrUX is unchanged over the following 28 days.
Measured effect
(pending)