Skip to main content
Terminus
Contents
Keeping It TrueChapter 8 · ~11 min read

Mistakes and Audits

No tool stops every mistake. What validation can and can't stop, why consistent values make a wrong row stand out, and how an audit makes sure someone looks.

On this page
The chapter in 6 min, as a video.Next video: Chapter 9 · Where Links Get Made →

Every envelope carries the same letter. What happens when someone types it wrong?

Three weeks into the spring sale, Dana finds out. She pulls every campaign value with sessions since March 1. No filter. Seven rows:

Campaign, then source / mediumSessions
spring_sale-runners-2025_03
newsletter / email
842
spring_sale-runners-2025_03
facebook / paid_social
2,104
spring_sale-runners-2025_03
instagram / paid_social
631
spring_sale-runners-2025_03
google / cpc
489
spring_sale-runners-2025_03
retail_display / offline
73
Spring Sale Runners
Facebook / paid_social
156
spring-sale-runners-2025
Facebook / paid_social
94

You saw the last two before you read a single number.

And a typo doesn’t stay where it was typed. Chapter 7 carried the values onto the lead, the deal and the warehouse row, and every one of them keeps the misspelling exactly as written.

The usual plan for clean data is not to make mistakes. Pick the right tool, set it up well, and the mistakes stop. So teams buy or build the tool, and stop looking. They read the dashboard they already trust, filtered to the values they expect.

Then a mistake gets through. Some always do: a contractor who never opened the builder, a valid value on the wrong link. Nobody is looking for it, and it grows for a quarter inside the numbers a decision is made on.

No tool stops every mistake. What you can do is make every mistake visible, and make sure someone looks.

Mistakes get in three ways, and none of them is careless

Those two rows came from Marcus, a new social media contractor. He set up a Facebook ad for the sale and typed its values by hand. Twice, differently.

He used two of the three ways any mistake gets in:

  1. In a hurry. Someone types or picks a value. Marcus typed Spring Sale Runners because that’s what the sale is called.
  2. Outside the place links get made. Marcus typed straight into the ad platform, so the builder never saw his link. A web developer hand-coding a banner comes through the same door.
  3. Changed on the way. A link built right can be rewritten after it leaves, by Chapter 5’s writers and rewrites. That door belongs to Chapter 5 and its published link check. Here it only gets counted.

Marcus did what seemed reasonable with what he had.

A rule stops what breaks it, and nothing else

Validation is a check of each value against the rules at the moment a link is made. Is it on the list? Does it fit the pattern? Is it lowercase, with only safe characters? It stops a value that breaks a rule before the link exists.

Here’s what it would have said about Marcus’s values, one by one, with the fix for each:

Typed, then the fixBreaks
Facebook
facebook
lowercase
Spring Sale Runners
spring_sale-runners-2025_03
lowercase; spaces; the pattern
spring-sale-runners-2025
spring_sale-runners-2025_03
hyphens inside words; no month

Every value he typed breaks a rule from Chapter 3, so validation would have stopped every one, had he made the link where it runs.

He didn’t. A check stops a value that breaks a rule, and only for links made where the check runs.

And some mistakes break no rule at all.

The plain one is a right value on the wrong link. newsletter and promotional_email are both on Stride’s list. Tag a promotional email newsletter and every check passes, because no rule can know which email this is.

The sharp one is a link in the wrong place. Say someone copies the newsletter’s link onto a banner on Stride’s own homepage:

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

The newsletter's link, on a banner on stride.com. Every value is on the list. Only the placement is wrong.

Tags on a link make a claim: this visit came from here. On a link inside your own site, the claim is false, because the visitor is already there.

A shopper arrives from a Google ad, browses, and clicks the banner. The tool reading the link records a newsletter interaction that brought nobody. What it does with that depends on the tool: a new visit, a new touch in the path, a share of the sale’s credit. Whichever it is, the tool records it under the newsletter’s values, beside every honest newsletter click. The newsletter can end up with credit for shoppers a Google ad paid to bring.

Never tag an internal link.

Every value on that banner is valid. The link still lies. How GA4 handles one is in GA4 Field Notes.

So whatever tool you choose, something gets past it: links made where no check runs, and links no check could fault.

Consistency makes the wrong row stand out

When every value comes from one list and every campaign follows one pattern, a report has a known shape. One row per source and medium a campaign ran on. Every value in the same form.

A row that breaks the shape is one line, and it stands out on sight.

Nothing flagged Marcus’s rows. Dana found them because everything around them looked alike.

Test that. Here’s Stride’s paid social for the same three weeks, two ways. Dana’s report is the second. The first is a what-if: the same 2,985 sessions, had Stride’s team typed values freely, the way it did last spring (Chapter 1’s before-screen), with Marcus’s two rows unchanged among them.

Pretend you’ve never seen Marcus’s values. Which rows in each report would you send back?

What-if: everyone types freely

CampaignSourceSessions
Spring SaleFacebook512
Spring SaleInstagram213
Spring Sale RunnersFacebook156
spring-sale-2025FB412
spring-sale-runners-2025Facebook94
spring_sale-runners-2025_03facebook1,180
spring_sale-runners-2025_03instagram418

Dana's report

CampaignSourceSessions
Spring Sale RunnersFacebook156
spring-sale-runners-2025Facebook94
spring_sale-runners-2025_03facebook2,104
spring_sale-runners-2025_03instagram631
Paid social only, the sale's first three weeks: 2,985 sessions in each. The first report is a what-if, not Stride's data.
Show Marcus’s rows

What-if: everyone types freely

CampaignSourceSessions
Spring SaleFacebook512
Spring SaleInstagram213
Flagged: Spring Sale RunnersFacebook156
spring-sale-2025FB412
Flagged: spring-sale-runners-2025Facebook94
spring_sale-runners-2025_03facebook1,180
spring_sale-runners-2025_03instagram418

Marcus's rows, among five that break a rule.

Dana's report

CampaignSourceSessions
Flagged: Spring Sale RunnersFacebook156
Flagged: spring-sale-runners-2025Facebook94
spring_sale-runners-2025_03facebook2,104
spring_sale-runners-2025_03instagram631

Marcus's rows, the only two that break one.

In Dana’s report: two, on sight.

In the what-if, every row but two breaks a rule. Marcus’s rows look like everyone else’s. You could send back all five rule-breakers, and nothing would tell you which two spellings arrived this week, or that a new contractor was behind them.

Now take away the thing the belief counts on: the tool. Marcus never opened the builder, and nothing stopped him. The mistake was still found in three weeks, by eye, because every other row was consistent.

It wasn’t small, either. 250 of the campaign’s 2,985 paid social sessions is about 8%. Of all 4,389 sessions in Dana’s pull, it’s about 6%.

Consistency has a limit. A wrong value from the list lands inside a row that’s meant to exist. The promotional email tagged newsletter counts as newsletter traffic, and so does whatever the tool records from the homepage banner. No shape can flag that. It shows only as a number that’s off, to someone who knows what it should be.

An audit makes sure someone looks

A visible row still needs someone to see it.

We’ve watched teams tag flawlessly for six months and never once open the report. The tagging was never the point.

An audit is that look, done on purpose: someone opening the report, on a schedule, to find what the rules missed. Dana’s takes one pull and two looks.

The pull is every distinct value, unfiltered. Every value in each slot (an empty one counts as a value) and every source and medium pair, for the whole period. Unfiltered, because a filter on the right value can’t show a wrong one. A dashboard filtered to spring_sale-runners-2025_03 keeps that exact string and nothing else, so Spring Sale Runners never reaches the screen. It’s Chapter 3’s rule, turned on the dashboard.

The first look holds the pull against the list, its allowed pairs and the pattern. Whatever breaks a rule shows on sight, and that’s how Marcus’s rows turned up.

The second look holds it against the links that were made. A row no link explains is the find, however valid its values. Say the pull shows newsletter / email under a campaign no newsletter ever carried. Every value is on the list, and the row is still the find.

Then two numbers, kept from one audit to the next. On Dana’s pull:

  • unapproved values per slot: two campaign values nobody approved, beside the one that was
  • the share of campaign names that match the pattern: one of three

Counting the unapproved values, not all of them, keeps launches out of the number: every new campaign adds an approved value. Any unapproved value, or any campaign name that misses the pattern, means someone is making links the rules don’t reach, and the next job is finding out who. From one audit to the next, the first number should fall toward zero and the second rise toward all of them.

During a change of format, the same audit also watches the old format’s share of new clicks fall. Chapter 10 runs that change.

Fix it where it started, then remap the history

An audit’s find gets two fixes, in this order.

First, where it started: the link, the person who made it, and the rule that would have stopped it. A builder that records who made each link turns that into a lookup (Chapter 9); without one, it’s asking around. Until that’s done, new rows keep arriving.

Then the history, by remap. The recorded rows never change. Chapter 1’s correction list reads them back into the campaign, as long as each spelling meant one thing. Both of Marcus’s did: each one was the spring sale and nothing else.

Skip the first fix and the remap becomes a habit. Cleaning up in reports alone is sometimes called post-hoc classification: Chapter 1’s remap, kept as a standing list instead of done once. It catches what it already knows about and nothing new. Every new variant needs another entry, and every system the value reached (the CRM, the warehouse, from Chapter 7) needs the same list.

When the history is years of links made with no list at all, the reference page on inheriting a mess gives the order of work.

Validation, audits or both

Each one sees what the other misses, and each costs something different:

Option, and its costSeesMisses
Validation:
every link made in one place
rule-breakers, earlyoutside links; valid but wrong
Audit:
someone’s time
odd rows from any door, latevalid but wrong, in a right row
Both:
both costs
each other’s gapsvalid but wrong, in a right row

Validation works before a single click is recorded, and sees nothing made outside it. An audit sees every door, Marcus’s included, but late, after the clicks are in, and only if someone runs it. Together they cover each other’s gaps, at both costs.

And a valid but wrong value, in a row that’s meant to exist, gets past both, which is why the internal link has a rule of its own.

How often to audit is set by how much changes between audits, not by who you are.

Your situation

Four questions set how hard you lean on each:

  • How much changes between audits? New people, contractors or agencies, a launch, a change of format: each one is a reason to look. If nothing changed, a schedule (quarterly, say) covers the stretch between.
  • How many links are made outside the place links get made? Contractors in ad platforms, developers coding banners. The more there are, the more the audit is your only view of them.
  • How soon does a number reach a decision? If launch-week numbers go in front of someone, or a board meeting is weeks away, an audit before then is what protects that decision.
  • Does anything validate at the moment of making? If nothing does, the audit is the only check you have.

What changes

DecisionBeforeAfter
The toolmeans no mistakesstops rule-breakers; consistency shows odd rows
Where you lookthe dashboard, filteredevery distinct value, unfiltered
A mistake foundcleaned up in reports, every quarterfixed where it started; history remapped once
When to auditwhen a number looks wrongafter each change, and on a schedule between
An internal bannertagged, to see what it drivesuntagged: a tag claims where the visitor came from

Where the rule lives

An audit is a rule beside the path. It works when someone remembers to look, and it finds a mistake only after the clicks are recorded. A check where links get made sits inside the path and stops a rule-breaker first, but only for links made there. So the audit stays, for everything that came in another way: Marcus’s ad, a developer’s banner, a link rewritten on its way out.

Check yourself

Three links: a value typed as Facebook into a builder with a validation rule; a contractor's ad link typed straight into the ad platform; a homepage banner carrying the newsletter's tags. Which does validation stop, which does the audit see, and which does neither?

Show answer

The builder stops the first, because the link was made where the check runs. The second never met the check; the audit sees it as a row that breaks the pattern. The third passes every rule and lands under the newsletter’s values, so neither sees it. It needs a rule of its own: never tag an internal link.

A dashboard filtered to spring_sale-runners-2025_03 shows nothing wrong. Can a misspelled copy of the campaign be hiding?

Show answer

Yes, and that dashboard can’t show it: a filter on the exact string keeps only that string. Pull every distinct campaign value for the period, unfiltered, and hold it against the list and the links you made.

An audit finds Marcus's 250 sessions under Spring Sale Runners and spring-sale-runners-2025, and you remap them into the campaign. Is the mistake fixed?

Show answer

The history is: each spelling meant one campaign, so a remap reads it back. The mistake isn’t. The link keeps sending the typo until it’s corrected where it was made, and every new variant would need another remap entry.

In one line

No tool stops every mistake: some pass every rule, and some never meet one. Keep every value consistent so a wrong row stands out, look on a schedule, and fix each mistake where it started.

Before the next chapter

Pull every distinct source, medium and campaign since your last launch, unfiltered. Find one row that no link you made explains, and trace it to where it was made.

Next · Chapter 9 · Where Links Get MadeThe audit caught it afterwards. Could the place links get made refuse it up front?