control tower / journal
Journal
engine connected
Proposed -- needs human approval

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_log already 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_id equals 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)