GA4 Configuration Guide (Phase 2)
Owner: Engineering + Analytics · Schema version 1
The event instrumentation lives in js/app.js (bridge) and
docs/analytics/event-contract.md (taxonomy). This document is the GA4-side
setup: which custom dimensions to register, which events to mark as key events,
and the three explorations to build. Do the UI work in the GA4 console — these
are one-time property-configuration steps, not code.
Step 1 — Register event-scoped custom dimensions
Create these event-scoped custom dimensions (not user-scoped). Only these eleven — every value is a low-cardinality enum, so they stay reportable.
| GA4 dimension | Event parameter | Values |
|---|---|---|
| Entry point | entry_point |
direct, landing_cta, template, recent_project, shared_link |
| Start path | start_path |
template, ai, import, blank |
| Creation path | creation_path |
template, ai, import, blank |
| Milestone | milestone |
first_content, first_customization, first_outcome |
| Last milestone | last_milestone |
none, first_content, first_customization |
| Template category | template_category |
social_post, presentation, logo, motion_text, blank, … |
| Export format | format |
mp4, webm, gif, png, svg, pdf, lottie |
| Error category | error_category |
unsupported_capability, encoding_rendering, memory_size, permission_download, unknown |
| UI location | ui_location |
toolbar, gallery, empty_state, panel |
| App version | app_version |
release version string |
| Platform form factor | platform_form_factor |
desktop, tablet, mobile |
Do not register event_schema_version, surface, or session_stage as custom
dimensions — they are carried on every event but are only used for debugging and
segmentation-by-default, not decisions.
Wait 24–48 hours after the first events land before validating a dimension — GA4 surfaces new dimensions asynchronously.
Step 2 — Mark key events
Mark exactly these as key events (keep well under the 30-key-event limit):
creation_milestone_reached(withmilestone=first_outcome) — the activation outcomeexport_completedshare_completed
Optionally project_saved as a fourth. Do NOT mark item_selected, undo,
canvas_size_changed, or any interaction event — they are noise for this goal.
Step 3 — Build three Explorations
Exploration 1: Activation funnel
Standard funnel exploration, steps in order:
editor_openedstart_path_selectedcreation_milestone_reached(filtermilestone = first_content)creation_milestone_reached(filtermilestone = first_customization)creation_milestone_reached(filtermilestone = first_outcome)
Breakdown dimensions: acquisition source, device, browser, locale, start_path.
Exploration 2: Creation-to-outcome path
Free-form exploration segmented by creation_path (template vs blank vs import):
- Export completion rate =
export_completed÷export_started - Save completion, time-to-first-outcome (median), abandonments
- Use this to pick the default onboarding route (UX-01).
Exploration 3: Retention cohort
Cohort exploration:
- Cohort dimension: first activation week (derived from
first_outcome) - Metric: returning users at 1-day and 7-day
- Segment: returners who fired
continue_project_openedvs those who did not
DebugView checklist (before trusting the data)
- [ ]
editor_openedfires once per tab session - [ ]
pwa_installedfires once (not twice) on install - [ ]
export_completedandexport_failedare mutually exclusive per export - [ ] Consent-denied / DNT /
?notrack=1produce zero events - [ ] Every event carries
event_schema_version=1+ the 5 common-context fields - [ ] No event carries
error,prompt,filename, or any banned key - [ ]
creation_milestone_reachedfires at most once per milestone per session