# Journey: Trial signup to first report (worked example)

Fictional company: Acme Reports, a B2B reporting product at app.example.com. Every name, ID and number here is invented.

File: `martech-context/tracking-plan/trial-to-first-report.md`
Status: proposed
Plan version: 1
Last reviewed: 2026-10-17

## Decision

- Decision this plan supports: which setup step to fix first for self-serve trial workspaces that do not produce a first report from their own data within seven days of workspace creation.
- Action if the result is poor: the product owner chooses between connection guidance and an import-status screen; the lifecycle owner changes the setup reminder sequence for the stalled step only.
- Linked metric: `workspace_first_report_7d_v1` in `martech-context/metrics.md`

## Scope

- Primary actor: new workspace administrator
- Population: workspaces created through self-serve trial signup
- Exclusions: accounts flagged `is_internal`, accounts flagged `is_test` at creation, workspaces created by accepting an invitation
- Counting unit: workspace
- Entry: `workspace_created` with `creation_path = trial_signup`
- Outcome: first `report_generated` with `input_data_kind = customer_data` for that workspace
- Window: 168 hours from the entry `occurred_at`, start inclusive, end exclusive
- Repeat policy: a second workspace created by the same person is a separate entrant
- Complete-data cutoff: the warehouse load watermark, not the wall clock

## Event envelope

- event_name, event_id (plain UUID for the occurrence, reused on retry), occurred_at, received_at
- message_id: UUIDv5 of event_id, emitted name and emitter, under the plan namespace recorded in `decisions.md`; the value of every destination dedupe field
- anonymous_id, user_id, account_id, workspace_id at event time; account and workspace read on the server, never taken from the client's analytics call
- source, environment, contract_version

## Events

- `user_registered`: identity service commits a new user record. Source: backend. Consumers: GA4 acquisition reporting (`sign_up` key event), signup cohorts. Contract: `user_registered.yaml`
- `workspace_created`: workspace record committed. Source: backend. Consumer: metric denominator. Contract: `workspace_created.yaml`
- `data_source_connection_started`: the user submits the connection form for a provider. Source: browser. Consumer: investigation into connection drop-off. Contract: `data_source_connection_started.yaml`
- `data_source_connected`: credentials validated and connection persisted as available. Source: backend. Consumers: funnel step, HubSpot owner routing. Contract: `data_source_connected.yaml`
- `data_source_connection_failed`: the attempt reaches a terminal failure. Source: backend. Consumer: connection reliability report. Contract: `data_source_connection_failed.yaml`
- `report_generated`: report job completes and the report is stored and viewable. Source: backend. Consumers: metric numerator, lifecycle workflow. Contract: `report_generated.yaml`

`data_source_connection_started` (browser intent) and `data_source_connected` (backend fact) share `attempt_id`, so the drop-off between them can be measured without either event standing in for the other.

## Destinations

- Warehouse: all six events, canonical, through Segment
- GA4 (web stream `G-XXXXXXXXXX`, container `GTM-XXXXXXX`, advanced consent mode): `sign_up` only, a browser companion to `user_registered` sent by a dataLayer push once per `event_id`, created and marked as a key event in Admin before release; no product events, because no acquisition decision uses them
- Amplitude: all six events through Segment's Amplitude (Actions) destination, Insert ID mapped from `messageId`; snake_case names matching the canonical names; project naming convention set to snake_case
- Segment: one server source and one web source, both connected to the tracking plan `acme-trial-to-first-report`
- HubSpot: derived company properties `acme_first_data_source_connected_at`, `acme_connected_source_count` and `acme_first_customer_report_at`, written by the warehouse sync, not raw events. The sync upserts on `acme_account_id`, a unique-value company property holding `account_id`, never on domain. Workspace facts roll up to the account: earliest date, summed count.

## Owners

- Business owner: Head of Product (meaning of setup and first report)
- Implementation owner: Integrations team (connection events), Reporting team (report events), Identity team (signup)
- Data owner: Analytics lead
- Privacy reviewer: Data protection lead, for `user_registered` because it carries identity

## Open questions

- Does a scheduled refresh of a report created before the trial count as a first report? Owner: Head of Product, due 2026-10-24
- Should `csv_upload` connections count as connected for HubSpot routing? Owner: Sales operations lead, due 2026-10-24
