Skip to main content
Terminus
Contents
Keeping It TrueChapter 9 · ~12 min read

Where Links Get Made

A tool is worth what it refuses at the moment a link is made. The tool ladder, five ways to break your own rules on every rung, and the workflow around the tool: one stage, or two where several teams share a campaign.

On this page
The chapter in 7 min, as a video.Next video: Chapter 10 · Ownership and Change →

Eight chapters in, here is what the book has asked of every link:

  • values from one closed list (Chapter 3)
  • one pattern for every campaign name (Chapter 4)
  • one campaign value on every channel and in every ad platform name (Chapters 5 and 6)
  • that same value, copied unchanged into the CRM (Chapter 7)

And here are two rows from the spring sale’s first three weeks that meet none of it:

Campaign / sourceSessions
Spring Sale Runners / Facebook156
spring-sale-runners-2025 / Facebook94

Marcus, Stride’s new social media contractor, typed both by hand. Dana’s audit found them three weeks in (Chapter 8).

The audit caught it afterwards. Could the place links get made refuse it up front?

The usual answer is a purchase: buy a UTM builder. Teams shop by feature list (link history, bulk creation, short links), or by what a team their size is supposed to use. They come home with a tool that assembles every link correctly and still accepts any value typed into an open field. Marcus’s two spellings would get through it exactly as they got into the ad platform.

The team thinks it bought enforcement. It bought construction.

A tool can say no in three ways

At the moment a link is made, a tool can hold a rule in only three ways:

  1. It doesn’t offer the wrong value. A closed field, a dropdown. Facebook isn’t on the menu, so nobody picks it.
  2. It won’t finish without the right one. A required field; a cascading dropdown, where the value in one field narrows the next field’s menu; a validation rule that checks a pattern or a combination.
  3. It holds the link for a person. An approval: someone looks before the link ships.

Anything else is a rule beside the path: a guide, a training session, a note at the top of a sheet. It holds when someone remembers it.

Every free-text field with no rule is a way in.

A box labeled “campaign” takes Spring Sale Runners as happily as spring_sale-runners-2025_03, and analytics files each under its exact string, a row apiece.

Free text can carry a format rule, though. The tool lowercases what’s typed, turns spaces into underscores (or refuses them) and checks the value against a pattern. That stops the case and spacing splits from Chapter 3: Facebook becomes facebook. It can’t stop a different word, like fb, or a value that fits the pattern and still isn’t on the list, like spring_promo-runners-2025_03. A field can hold a value in any of these ways:

  1. An open field with no rule: anything typed.
  2. Free text with a format rule: the right form, any word.
  3. A closed menu: only listed values.
  4. A value assembled from closed fields: listed pieces, in the pattern’s order.
  5. A dropdown of campaigns defined first: each one picked whole, never assembled on the form.

A tool refuses only what it can see: the values and the destination. It can’t see where the link will be posted, so the newsletter’s link pasted onto Stride’s own homepage banner passes every rule it has. Nor can it see links made somewhere else, like a contractor’s link typed straight into an ad platform (Chapter 8). Those stay with the audit, or with a person who approves.

The difference a buyer misses starts with what a URL builder is: a form where you paste the address, fill in the values and copy out the tagged link. A builder assembles one link correctly. A governance platform keeps hundreds consistent, across people and across months.

Take Marcus up the ladder

Tools climb in five rungs. Read each one by what it makes impossible and what it costs to run, never by who’s supposed to use it.

  1. Typing in the URL barMakes impossible: nothing. Costs: nothing to set up; every value typed from memory.
  2. A free URL builderMakes impossible: a badly joined link, if it reads the URL first. Costs: nothing; every value still typed fresh.
  3. A shared sheet with dropdownsMakes impossible: an off-list value in a dropdown cell (or only warns, as its editor set it). Costs: a formula and its tabs to keep working.
  4. One link builder everyone usesthe first rung where every value comes from the listMakes impossible: any value off the list, in every closed field. Costs: setting it up, and making every link there.
  5. A platform with approvalsMakes impossible: a link nobody looked at. Costs: running it, and someone who approves.

Now hand Marcus each rung in turn, with his three values: Spring Sale Runners, spring-sale-runners-2025, and the source Facebook.

The URL bar and the free builder take all three. The free builder’s fields are open. It puts whatever you type in the right place, correctly joined, which is correct construction of a wrong value.

The sheet stops Facebook. Its source column is a dropdown, and a sheet’s dropdown rejects anything else, or only warns, as its editor set it. The campaign column is a free cell, though, and both spellings go straight in.

We used to tell teams to start in a spreadsheet. After watching dozens of them try, we’d put it differently: keep your rules in a sheet, and never make your links in one.

The sheet starts out as a rulebook, like Dana’s. Then it grows a formula per column and a tab per team, until it has become the link factory nobody maintains: the Franken-spreadsheet. A sheet holds values better than a free builder does, and assembles links worse. The five breaks below show where.

One link builder everyone uses stops all three. Source and medium come from menus. The campaign is assembled by concatenation from closed fields (initiative, product, launch month), so neither of Marcus’s spellings is a value it can produce. The menus can also lean on each other:

A cascading dropdown: once the medium is email, the source menu offers only Stride's two email sources.

Two more rules live at this rung. A cross-field rule checks a combination: retail_display only with offline. A conditional rule asks for a field only when another one calls for it: the display, asked for only when the source is retail_display, filling content.

Assembling a value from fields brings one more rule: every segment is required on every name, because a gap that closes up shifts every segment after it (Chapter 4). A builder holds that rule in three ways:

  1. It makes each segment’s field required.
  2. It offers na as an option, or writes na into an empty segment.
  3. It never removes an empty segment’s separators, so a name like us--shoes keeps every segment in its place.

A shared builder can also record who made each link, and when. The audit (Chapter 8) traces an odd row to its link and its maker, and a row that matches nothing in the record came from outside the builder, as Marcus’s would have. The record also shows who needs ten minutes with the list. A free builder with no sign-in can’t keep one.

Where a team works in two stages, Marcus picks the campaign whole. It’s on his form as a dropdown of the campaigns already defined, so spring_sale-runners-2025_03 is the only spelling he can choose. That workflow gets its own section below.

The platform adds what a form can’t. A governance platform sits above the shared builder:

  • An approval puts a person between the form and the launch. It’s the only check at the moment of making that can know where a link will be posted.
  • A workspace gives each team or client only its own part of one taxonomy, so another team’s values aren’t on its menu. Choosing that set-up is Chapter 10’s question.
  • Links made in bulk go through the same rules: in a grid, from an import, or through an API, which lets another system, such as a CMS (the system your site’s pages are published from), ask for links. Every value is checked against the lists before anything ships.
  • A webhook runs the other way: the platform tells another system, such as a team’s chat channel, each time a link is made.

Five ways to break your own rules

Marcus tested one kind of mistake. Here are five, tried on every rung:

  1. Type Facebook as the source.
  2. Skip the medium.
  3. Write eu where the list says europe.
  4. Tag an internal link: the newsletter’s link, reused on Stride’s homepage banner.
  5. Start from a landing page that already has a query string: stride.com/spring-sale?ref=partner.

For each one, which is the lowest rung that refuses it? Decide before you open it.

Show the first rung that refuses each
BreakStopped first byHow
Facebookthe sheeta dropdown
no mediumone buildera required field
euthe sheeta dropdown
internal linkno rungcan’t see it
?ref=partnera free builder, if it reads the URLadds &

The first three rows, one line each:

  • Facebook: the sheet’s dropdown rejects it, or only warns, as its editor set it. A format rule on a free field makes it facebook, right by luck; fb would pass.
  • No medium: a sheet’s formula assembles whatever the row holds, empty cell included. A free builder’s required fields, if it has any, are its maker’s choice; in one builder everyone uses, they’re yours.
  • eu: refused only where the region has a dropdown of its own. Typed into a free field, format rule or not, it gets through every rung.

Two rows decide the argument.

The sheet loses a test a free builder can pass. A URL’s query starts at the first ?. Any later ? is ordinary data inside it, and the query splits into pairs only on &. So a sheet formula that always adds ? turns the partner page into this:

stride.com/spring-sale?ref=partner?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale-runners-2025_03

Split the way analytics splits it, the link holds three pairs, not four:

  • ref reads partner?utm_source=newsletter
  • utm_medium reads email
  • utm_campaign reads spring_sale-runners-2025_03
  • utm_source is never set

The medium and the campaign arrive. The source never does. A builder that reads the URL before it adds anything sees the ? already there and adds & instead.

So climbing the ladder isn’t the test.

The internal link passes every rung’s rules. Every value in it is on the list; only its placement is wrong (Chapter 8). An approver at the top rung can catch it, as a person, and the audit can catch it afterwards. No rule does.

No tool, then, makes everything impossible. Ask of any tool which breaks it refuses.

Now look for the feature list in that table: link history, bulk creation, short links. None of them decides a single row.

Run the five on any tool you’re weighing, in a trial or a sandbox (a test account where nothing ships), with your real lists and your ugliest real URL. For each break, write down one of three results: it prevents it, it warns you, or it waves it through.

Our builder takes the same test

I’m biased: I built one of these tools. But I’ve also seen what happens without one, and the cost of manual tracking isn’t analyst hours. It’s every decision made on bad data.

Here’s ours, under the same five breaks. This is Stride’s list from Chapter 3, live, built in Terminus. Chapter 3 had you browse it. This time, try to break it.

Loading the live builder…
Show what it does
BreakResult
Facebookprevented
no mediummarked required; record what copy does
euwaved through
internal linkwaved through
?ref=partnerbuilt right

Source and medium are closed menus: in the Form view, type Facebook and the only thing you can pick is the list’s facebook. The medium is marked required; copy the link with it still empty, and record what you get. The initiative is free text with a format rule, lowercased with spaces turned to underscores, so eu becomes the campaign’s first segment. Stride has no region field, so there’s no list for eu to miss. Nothing in the builder can know where a link will be posted. And a landing page that already has a query string gets the tags added with &: stride.com/spring-sale?ref=partner&utm_source= and on.

Its settings also allow the segment rule from the builder rung: each segment’s field can be required, and an empty one can be filled with a value such as na. A setting that removes extra separators exists, and it’s off by default.

Whatever you recorded for the medium, two get through on any form: a new word in a free-text field, and a placement it can’t see.

Here is where it sits. Links are made in its forms, a grid, CSV import or the API, and checked against the published governance model. Approved records become the links teams launch (stage 2), are pushed to a data warehouse by connectors (stage 5), and are readable through the API and webhooks.

One stage or two

Every tool sits inside a workflow, and the workflow decides who types what.

One stage. The link maker assembles the campaign on the link form, picking each part from its own menu: initiative, product, launch month. It suits a team that runs each campaign itself, usually a smaller one, and needs nothing extra to run.

Two stages. A separate team creates the campaign first, building its value by concatenation from fields. Then each channel or regional team builds its links from it. Their form still has the campaign field, already assembled, as a dropdown of the campaigns defined first:

StageWhoChoosesGets
1. Defineone teamspring_sale, runners, 2025_03the campaign
2. Buildeach channelsource, medium, contentlinks

It suits a bigger company, where several teams launch one coordinated campaign across regions, markets and many channels. Every team’s links carry the same value, and a pattern change is made once, by the defining team (Chapter 10). It needs someone who defines campaigns, and a place that holds a campaign before any of its links exist.

The difference is how launches are run, not which way is safer.

Campaigns are often planned first, in a project tool such as Asana or Workfront, a brief, or a CRM campaign record, often in Salesforce. In two stages, stage one usually starts there. Either way, the break test applies to how the value reaches the builder: copied by hand, it’s a rule beside the path; offered as a dropdown, it’s inside.

One campaign value is also the Meta campaign’s name, the join key from Chapter 6, and the campaign on every email.

Your situation

Seven things place you on this map:

  • If only people you’ve trained make links, closed fields do most of the work. If contractors or agencies make them too, the links made outside your tool are your widest gap: they need the same builder, or a place in the audit.
  • If one group runs each campaign, one stage fits. If several teams launch one across regions, markets and channels, two stages keep it one value.
  • If a value can’t be listed ahead, like a new initiative, a format rule keeps its form. Where it can, a menu also stops a different word.
  • If your names are Key-Value, they’re long and easy to mistype, so assembling them from fields matters more. If they’re Opaque IDs, nobody can type one: the tool has to write the ID and its lookup row together, and nobody can check a link by reading it.
  • If links are made in bulk or by another system, the grid, the import or the API needs the same rules as the form. If another system has to hear about each new link, you need webhooks.
  • If campaigns are already planned somewhere (a project tool, a wiki, the CRM), check whether the value reaches the builder by hand or is offered there.
  • If a wrong value costs you a broken join or a slide in front of the board, weigh an approver and the audit against it.

What changes

DecisionBeforeAfter
Choosing a toolits feature list, or what teams your size usewhat it refuses when you try to break your rules, in a trial
The sheetwhere links get madewhere the rules live; links made where only its values are offered
An open fieldleft as typeda format rule, or closed where a new word costs you
The campaign valuetyped by everyone who makes a linkpicked or assembled; defined once where several teams share it
What the tool missesnothing, you hopeplacement and links made elsewhere, for an approver or the audit
Who made a linkasked around, after the facta lookup in the builder’s record

Where the rule lives

Here the book’s thread arrives. Every chapter’s rule ended at the moment someone makes a link, and this chapter is about that moment. A tool holds a rule inside the path only where it won’t offer or won’t accept the wrong value. What an open field still accepts, links made somewhere else, and placements the tool can’t see stay beside the path, for an approver or the audit.

Beside the path

A list in a sheet, a note in a wiki, a free-text field with a hint under it: the rule holds when someone remembers it.

Inside the path

A closed menu, a required field, a campaign field that isn’t on the form: the wrong value can’t be made.

Check yourself

A builder has dropdowns for source and medium and a free-text campaign field. Which of three links can it stop: Facebook as the source, Spring Sale Runners as the campaign, or the newsletter's link reused on the homepage banner?

Show answer

Only the first. A pattern check would refuse that campaign, but not a well-formed one off the list; a closed or assembled field stops both, or a dropdown of campaigns defined in a first stage. The banner passes every rule, because the tool can’t see where a link is posted, so an approver or the audit catches it.

A sheet formula that always adds ? meets stride.com/spring-sale?ref=partner. What reaches analytics?

Show answer

ref reads partner?utm_source=newsletter. The medium and the campaign arrive; the source never does. A builder that reads the URL first adds & instead.

Three regional teams launch one product, and their campaign names come back three ways: spring_sale-runners-us, Runners Spring UK and europe_runners_spring. Which workflow fits, and what does each team still choose?

Show answer

Two stages: several teams launch one campaign. One team defines the value once, by concatenation, with the region in it if the report needs it. Each team then picks that value from a dropdown of the defined campaigns, and chooses source, medium and content.

In one line

A tool is worth what it refuses at the moment a link is made. Try to break your own rules with it, see what each field still lets through, and where several teams share a campaign, weigh defining its value once.

Before the next chapter

Try the five breaks in the tool your team makes links in today, and write down which it refuses, which it warns about and which it waves through.

Next · Chapter 10 · Ownership and ChangeNow the rules live in the tool. Who changes them?