Agency Playbook
Onboarding a client, one master list or a copy per client, making links across clients, reading clients side by side, and the hybrid splits between agency and client.
On this page
An agency runs the same practice many times over. Every client gets the letter from the Introduction: a channel, a source, an initiative, a product, a launch month. What changes is whose values fill it, which tools open it, and who writes each link.
Onboarding a client
Two things get built for a new client: an inventory of what already exists, and the client’s list, started from the agency’s base.
The inventory
What it holds, gathered before a single new link:
- The questions the client’s reports have to answer. The dimensions come from those, not from the parameters (Chapter 1).
- Every source, medium and campaign value already in the client’s analytics, pulled unfiltered (Chapter 8), with each old value mapped to its new one (When You Inherit a Mess).
- Every place a link gets written for them: the email platform’s tagging settings, the ad platforms’ campaign and ad names (Chapter 5, Chapter 6).
- Every tool that reads the values: analytics, the CRM and its lead forms, any warehouse and its spend join (Chapter 7).
- The links that live long: printed QR codes, saved email templates, bios (Chapter 10).
- Who on the client’s side makes links today, and who approves a new value.
The base template
The base is the part of the list every client shares. Each client’s list starts as a copy of it, or as a workspace narrowed from it (Chapter 9, Chapter 10).
| Part | In the base | Each client fills |
|---|---|---|
| Mediums | the closed list: cpc, paid_social, email and the rest | which ones it runs |
| Format | lowercase; _ inside a value, - between segments | (none) |
| Campaign | [initiative]- | its initiatives and products |
| Sources | the shape, as in partner-acme | its own values |
| Empty segment | na, never a closed gap | (none) |
Two invented clients on the same base, a B2B software company and a shoe retailer:
| Client and slot | Value |
|---|---|
| Software sources | linkedin, newsletter, partner-acme |
| Software campaign | webinar-api-2025_04 |
| Retailer sources | instagram, tiktok, affiliate-jane_smith |
| Retailer campaign | summer_sale-sandals-2025_06 |
A campaign with no product keeps the place with na in both: brand_awareness-na-2025_05. The mediums and the pattern come from the base; the sources and products are each client’s own.
A region is where the base gets a choice. If any client sells in more than one market, the pattern can carry a region for every client, as Chapter 10’s region-first version does (europe-), with single-market clients carrying us or na. Every name then splits the same way, at the cost of a segment some clients never use. Or only those clients get the region, and each client’s names are parsed by their own segment count (Chapter 4).
What reads the values, client by client
The letter stays the same from client to client. What opens it doesn’t. Vendor behavior, each row from the vendor’s own page:
| Client’s tool | What it does with UTM values | Source |
|---|---|---|
| GA4 | Builds its default channels from rules on source and medium: Paid Social is a social source with a paid medium. | Google, checked 2026-10-06 |
| GA4 with Google Ads auto-tagging | On a click with a gclid, source, medium and campaign come from auto-tagging; your utm_content and utm_term go to Manual Ad Content and Manual Term. | Google, checked 2026-10-06 |
| Adobe Analytics | Records a tracking code only where the implementation sets its campaign variable, typically from a parameter such as cid. Classifications group it; rule-based classifications are to be deprecated after February 28, 2027. | Adobe, Adobe, checked 2026-10-06 |
| Matomo | Detects utm_ parameters. By default it keeps two campaign dimensions, name and keyword; its Marketing Campaigns Reporting plugin keeps six. | Matomo, checked 2026-10-06 |
| Mixpanel | The JavaScript SDK adds the page’s UTM values to its events, and stores the first ones seen for an identified user as initial_utm_ properties. | Mixpanel, checked 2026-10-06 |
| Amplitude | The Browser SDK tracks attribution by default and sets initial_utm_ user properties the first time it sees a user’s values. | Amplitude, checked 2026-10-06 |
| HubSpot | Its own tracking sets Original and Latest Traffic Source in its own categories, with utm_campaign in a drill-down. Your exact values on a lead take custom properties and hidden form fields (Chapter 7). | HubSpot, HubSpot, checked 2026-10-06 |
More tools, stage by stage, are in The Tool Landscape.
One master list, or a copy per client
Chapter 10 maps this choice for teams. With clients in the rows, it reads:
| Set-up | Gives | Costs |
|---|---|---|
| One shared list, no boundaries | every value in one place | every client’s values on every client’s menu |
| One master list, a workspace per client | a change made once; the same mediums everywhere | a client’s own rule has to fit inside the master |
| A copy per client | each client its own rules, end to end | every change made once per copy; nothing keeps the copies matching |
The first row is Chapter 10’s TechCrunch mix-up, a composite: a fintech’s partner-techcrunch picked for a hospital’s links, unnoticed for six weeks. The fix in that story was a workspace per client, each narrowed from one agency template.
Either way, each list needs one owner who makes every change and keeps its changelog (Chapter 10). If the client has one, the agency sits in the link builders’ row of Chapter 10’s roles table, building links from values the client defines. If not, the agency holds the pen for that client’s list as well as its own base.
Making links across clients
An account manager who works for several clients in a morning switches lists each time. Where each client’s list is a workspace, the switch is a menu change: the previous client’s values aren’t on the new menu. Where it’s one shared list, nothing stops a value crossing over except someone noticing.
The campaign is the value every channel types. Where several teams build links for one client’s campaign, Chapter 9’s two-stage workflow defines it once, from fields, and every channel team picks it from a dropdown of defined campaigns (Chapter 9); where one team makes all of a campaign’s links, one stage with closed fields holds it. For an agency, the value defined once is also the client’s ad campaign name, the join key to that client’s spend (Chapter 6).
Some writers sit outside any builder. A client’s email platform may be set to write its own tags, and with Google Ads auto-tagging on, GA4 takes source, medium and campaign from Google Ads instead of your UTMs (Chapter 5). Those settings live in each client’s accounts, so they go in that client’s inventory, not the base.
Reading clients side by side
No link names the client. Each client’s links land on that client’s site and in its own analytics, so the client is known from where the data came from. Where several clients’ data meets in one place, each client’s rows get two columns as they land: the client, and its type.
From there, a portfolio view is a grouping: each client’s sessions by medium, then summed by client type. Example numbers, one month, share of sessions:
| Medium | Software clients (3) | Retailers (4) |
|---|---|---|
cpc | 34% | 22% |
paid_social | 18% | 38% |
email | 21% | 24% |
social | 9% | 7% |
referral | 15% | 3% |
offline | 3% | 6% |
Every row holds because every workspace takes its mediums from the same base list. One client typing paid-social adds a row the others don’t have, and its sessions drop out of the paid_social row. Until it’s mapped (When You Inherit a Mess), that client can’t be summed with the rest.
Mediums compare across clients because they share a list. Campaigns don’t: each client’s initiatives and products are its own. If a portfolio question needs initiatives side by side (every client’s webinars, say), the initiative values have to come from a shared list too, which is the first hybrid split below.
For each client’s own review, Chapter 8’s two numbers, kept from one audit to the next. Example numbers:
| Client | Unapproved values | Names on the pattern |
|---|---|---|
| Software client 1 | 0 | 42 of 42 |
| Retailer 2 | 3 | 31 of 36 |
| Retailer 4 | 1 | 18 of 19 |
Chapter 8 reads them as a trend across audits.
The hybrid splits
Between “the agency’s base for everything” and “the client’s own list for everything” sit two splits. Each can be set per client.
By slot
Whose list each slot draws from:
| Slot | Agency base | Client’s list |
|---|---|---|
| Medium | the closed list | which ones it runs |
| Source | the shape | the values |
| Initiative | a shared list, if clients are compared by it | the client’s own, if not |
| Product, region | (none) | the values |
The more slots come from the base, the more of the portfolio view holds, and the more often a client’s own vocabulary has to fit someone else’s list.
By link
Who makes which links:
| Who makes them | Gives | Costs |
|---|---|---|
| The agency, all of them, finished in the brief | the client’s team never meets the taxonomy | every link waits on the agency |
| The client, in its own workspace | links without waiting | links for campaigns the agency may not hear about, until an audit |
| The agency for paid, the client for owned | each side makes the links it runs | one campaign, two makers, unless its value is defined once |
Finished links travel as tagged URLs in the campaign brief, or as templates with the client’s values already filled in. The less an outside team has to interpret, the fewer ways a value can drift between the brief and the link.