---
file: naming-rules.md
owner_role: <marketing-operations-lead>
approver_role: <analytics-lead>
status: draft
version: 1
effective_from: <YYYY-MM-DD>
last_reviewed: <YYYY-MM-DD>
review_by: <YYYY-MM-DD>
review_cadence: quarterly
change_triggers: [new channel, new agency, new ad platform, new analytics destination, new tag manager container, new CRM object]
open_items: 0
---

# Naming rules

Copy to `martech-context/naming-rules.md`. Record the rules that exist or have been decided. To design a new convention, use the event-naming-convention, utm-convention-and-registry or campaign-naming-convention skill, then record the result here.

## Open items

- <question> | owner: <role> | due: <YYYY-MM-DD>

## Unrecognised values

A value that matches no rule below is flagged for review with the original value, a proposed value and the reason. Never create a new category or value to make it fit.

## Events

- Format: <lowercase snake_case, object then past-tense action, for example `report_exported`>
- Length: <strictest destination limit, checked live on YYYY-MM-DD>
- Variants are properties, not new events: <example>
- Reserved or vendor-standard names used as-is: <list, with the meaning that must match>
- Source of truth for the list of events: `tracking-plan/`

## Properties

- Format: <lowercase snake_case>; units in the name or a separate unit property: <rule>
- Shared properties are defined once in `data-dictionary.md`.
- Never in names or values: emails, names, phone numbers, free text, tokens.

## UTM parameters

- Case and separators: <lowercase; hyphens inside values; no spaces>
- `utm_source`: <approved list or link to `utm-registry.csv`>
- `utm_medium`: <approved list, mapped to channel rules>
- `utm_campaign`: <stable campaign identifier from the registry, not the display name>
- `utm_content`, `utm_term`: <rules>
- `utm_id`: <used | not used>
- Personal data in URL parameters: prohibited.
- Observed compliance, from one 90-day export measured <YYYY-MM-DD>: distinct values matching <n of m, percent>; sessions or clicks on matching values <percent>. Report both: a few malformed values can carry most traffic.
- Status: <followed | documented, not followed (weighted share below <80> percent; open item for the owner)>

## Campaign names in ad platforms

- Pattern: <fields and delimiter, for example `market_objective_audience_offer`>
- Allowed values per field: <lists>
- Join key to the UTM registry and cost tables: <field>

## Tag manager names

- Tags: <pattern, for example `<destination> - <type> - <event>`>
- Triggers: <pattern>
- Variables: <pattern>
- Folders and workspaces: <rule>

## CRM property internal names

- Format: <lowercase snake_case; prefix for the owning team or integration, for example `prod_` for product-synced fields>
- Internal names are permanent once created; labels can change.
- Properties written by an integration carry its prefix, so ownership is visible in the name.

## Identifiers and display labels

- Identifiers (event names, `utm_campaign`, campaign IDs) stay stable. Display labels can change. Joins and filters use identifiers only.

## Mappings and cutovers

Old values stay mapped so history still joins.

- <old value> -> <new value> | scope: <events | utm_source | campaign> | from: <YYYY-MM-DD> | decision: <decisions.md ID>

## Approved exceptions

- <value> | reason: <why> | scope: <where> | expires: <YYYY-MM-DD> | decision: <ID>

## Archive

Superseded rules with `effective_to` dates.
