# Tracking plan template

Use alongside https://caldmartech.com/articles/how-to-build-a-tracking-plan
Illustrative examples are not an API payload or an automatic Segment import.
Replace bracketed values. Keep test evidence free of customer personal data.

## Plan overview
- Business question: [decision this plan supports]
- Scope and exclusions: [journeys, environments, systems]
- Business owner: [role/name]
- Engineering owner: [role/name]
- Version and review date: [version/date]

## Event inventory
| Event | Business purpose | Source | Owner | Status |
| --- | --- | --- | --- | --- |
| Lead Submitted | Measure accepted enquiries | Enquiry backend | [owner] | Proposed |
| Lead Qualified | Measure first qualified outcome | CRM | [owner] | Proposed |
| Subscription Started | Measure first paid subscription | Billing backend | [owner] | Proposed |

## Event specification — duplicate for each event
- Name: Lead Submitted
- Definition: Backend successfully saves an accepted enquiry.
- Trigger location: [service, handler, or integration]
- Exclusions: Validation failures, rejected spam, test submissions, retries.
- Repeat rule: Separate accepted enquiries count separately, even for one person.
- Business owner: [owner]
- Implementation owner: [owner]
- Failure investigation owner: [owner]
- Status: Proposed

### Property dictionary
| Field | Type | Required | Definition / allowed values | Example | Source |
| --- | --- | --- | --- | --- | --- |
| event_id | string | Yes | Stable occurrence ID reused on retry | evt_demo_001 | [producer] |
| occurred_at | UTC timestamp | Yes | Original acceptance time | 2026-10-23T14:30:00Z | [producer] |
| lead_id | string | Yes | Internal lead record ID | lead_demo_001 | [lead store] |
| form_id | string | Yes | Approved form inventory value | demo_request | [form configuration] |
| utm_source | string | No | Omit if unknown or unavailable | newsletter | [permitted acquisition context] |

### Identity and retry contract
- Anonymous-to-known identity mapping: [keys, owner, timing]
- Missing identity behavior: [hold, omit, or another explicit rule]
- Duplicate suppression: [system, key, retention window, replay behavior]
- Late or out-of-order events: [handling]
- Permission and data handling rules: [collection, routing, retention]

### Destination mapping — repeat per destination
- Destination and business use: [tool/use]
- Receiving event/action: [name]
- Message-level mapping: [identity, occurrence time, message identifier]
- Property mapping: [source field -> receiving field]
- Required fields and permitted identifiers: [fields]
- Routing conditions and exclusions: [conditions]
- Expected delivery delay: [agreed target]
- Failure/retry handling: [behavior and owner]
- Current documentation: [URL and review date]

### Acceptance evidence
| Scenario | Expected result | Actual result / evidence | Reviewer | Date |
| --- | --- | --- | --- | --- |
| Accepted enquiry | One event with required fields at each destination | [pending] | [reviewer] | [date] |
| Rejected enquiry | No event | [pending] | [reviewer] | [date] |
| Retry | Stable ID/time; agreed duplicate handling | [pending] | [reviewer] | [date] |
| Missing required field | Failure surfaced and investigated | [pending] | [reviewer] | [date] |
| Missing optional source | Omitted; no guessed attribution | [pending] | [reviewer] | [date] |
| Routing restriction | No delivery to restricted destination | [pending] | [reviewer] | [date] |

Add trigger-specific tests for qualification re-entry and failed/confirmed payments.
Record source IDs, event IDs, and destination evidence using synthetic data.

## Change log
| Version / date | Change | Affected reports / campaigns | Migration | Approver |
| --- | --- | --- | --- | --- |
| [version/date] | [change] | [consumers] | [rollout and historical impact] | [owner] |
