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
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 / medium | Sessions |
|---|---|
spring_sale-runners-2025_03newsletter / email | 842 |
spring_sale-runners-2025_03facebook / paid_social | 2,104 |
spring_sale-runners-2025_03instagram / paid_social | 631 |
spring_sale-runners-2025_03google / cpc | 489 |
spring_sale-runners-2025_03retail_display / offline | 73 |
Spring Sale RunnersFacebook / paid_social | 156 |
spring-sale-runners-2025Facebook / 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:
- In a hurry. Someone types or picks a value. Marcus typed
Spring Sale Runnersbecause that’s what the sale is called. - 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.
- 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 fix | Breaks |
|---|---|
Facebookfacebook | lowercase |
Spring Sale Runnersspring_sale-runners-2025_03 | lowercase; spaces; the pattern |
spring-sale-runners-2025spring_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/
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
| Campaign | Source | Sessions |
|---|---|---|
| Spring Sale | 512 | |
| Spring Sale | 213 | |
| Spring Sale Runners | 156 | |
| spring- | FB | 412 |
| spring- | 94 | |
| spring_sale- | 1,180 | |
| spring_sale- | 418 |
Dana's report
| Campaign | Source | Sessions |
|---|---|---|
| Spring Sale Runners | 156 | |
| spring- | 94 | |
| spring_sale- | 2,104 | |
| spring_sale- | 631 |
Show Marcus’s rowsHide them
What-if: everyone types freely
| Campaign | Source | Sessions |
|---|---|---|
| Spring Sale | 512 | |
| Spring Sale | 213 | |
| Flagged: Spring Sale Runners | 156 | |
| spring- | FB | 412 |
| Flagged: spring- | 94 | |
| spring_sale- | 1,180 | |
| spring_sale- | 418 |
Marcus's rows, among five that break a rule.
Dana's report
| Campaign | Source | Sessions |
|---|---|---|
| Flagged: Spring Sale Runners | 156 | |
| Flagged: spring- | 94 | |
| spring_sale- | 2,104 | |
| spring_sale- | 631 |
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 cost | Sees | Misses |
|---|---|---|
| Validation: every link made in one place | rule-breakers, early | outside links; valid but wrong |
| Audit: someone’s time | odd rows from any door, late | valid but wrong, in a right row |
| Both: both costs | each other’s gaps | valid 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
| Decision | Before | After |
|---|---|---|
| The tool | means no mistakes | stops rule-breakers; consistency shows odd rows |
| Where you look | the dashboard, filtered | every distinct value, unfiltered |
| A mistake found | cleaned up in reports, every quarter | fixed where it started; history remapped once |
| When to audit | when a number looks wrong | after each change, and on a schedule between |
| An internal banner | tagged, to see what it drives | untagged: 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 answerHide 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 answerHide 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 answerHide 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.