Cleaning and Classifying
Outcome: normalized columns, a bucketed size band, one classification column with a fixed value set, and a working fit score.
- Surface
- Sync GTM app
- Level
- Beginner
- Uses
- Formula columns · AI classification
- Credits
- 0 for formulas, ~0.5 per row for AI classification
- Prerequisite
- Lessons 11 and 12
Why raw enrichment output is not usable yet
The data arrives in whatever shape each provider uses. Job titles are free text. Countries come as names, codes and abbreviations in the same column. Headcount is an exact integer that nobody wants to filter on precisely.
None of that filters, sorts or scores well. Cleaning is the free step that makes everything after it work.
Normalize first
Domains
Lowercase, strip protocol, strip www., strip path. Your identifier from lesson 04 — if it is not clean, dedupe and CRM matching both fail.
Names
Trim whitespace, fix all-caps, split combined names into first and last. Materially improves enrichment hit rate.
Countries
Pick one representation — ISO codes are the safest — and map everything to it. “US”, “USA”, “United States” and “United States of America” must not be four filter values.
Titles
Keep the original verbatim for use in copy. Derive a clean seniority and function alongside it. Never overwrite the original.
All of these are formula columns. They cost nothing and they run on every row.
Bucket the numbers
Exact numbers are for storing; bands are for deciding.
| Raw | Band |
|---|---|
employee_count | 1-10, 11-50, 51-200, 201-1000, 1000+ |
| Last funding date | <6mo, 6-12mo, 12-24mo, >24mo, none |
| Monthly traffic | <10k, 10-100k, 100k-1M, >1M |
Bands make filters readable, make scoring simple, and absorb the noise in modelled fields. A revenue estimate is meaningless to the dollar and useful to the band.
Classifying free text
Some columns are text that needs to become one of a small set of values — a title into a function, a description into a category, a research answer into a bucket.
Two approaches, and the order matters:
Rules first, for the predictable 80%
A formula with keyword matching. “CTO”, “VP Engineering”, “Head of Platform” → engineering. Free, deterministic, and instantly debuggable.
AI for the rest
An AI column that only runs where the rule column returned unclassified. Constrained to the same value set, with an unknown escape.
Running AI on every row when a rule handles most of them is a real and common waste. Rules also have the advantage that when they are wrong, you can see exactly why.
A classification column must have a closed value set, written down. If new values keep appearing, every filter and score downstream silently misses rows. Add an other bucket and review what lands in it rather than letting the set grow on its own.
The fit score
With clean bands and classifications, the score is a formula and costs nothing.
fit_score =
(size_band in ["51-200","201-1000"] ? 3 : 0)
+ (country in ["GB","IE","NL","DE"] ? 2 : 0)
+ (uses_competitor = true ? 3 : 0)
+ (funding_recency in ["<6mo","6-12mo"] ? 2 : 0)Keep it to four or five criteria and whole numbers. A score you cannot explain in one sentence is a score nobody will trust, and it will be overridden by whoever is working the list.
Then a status column: qualified = fit_score >= 6. That is the gate lesson 07 filtered on, now built from real data.
Do this now
Add normalization columns
Domain, name, country, seniority, function. Formula columns, free.
Band the numbers
Headcount at minimum. Funding recency if you have it.
Build the rule classifier
Keyword matching for your main free-text column. Check what falls through.
Add the AI fallback
Only on the unclassified rows, constrained to the same value set.
Write the fit score
Four or five criteria, whole numbers.
Add the qualified status
Then sort by score and read the top ten and bottom ten rows.
Sanity-check the extremes
If the top ten are not obviously better prospects than the bottom ten, the score has no resolution — change a criterion.
Check your work
- Every filter reads a normalized column, never a raw one
- Numbers are banded where they are used for decisions
- Classification has a closed, written value set
- The fit score fits on one line and you can explain it aloud
- Top-scored and bottom-scored rows are visibly different
Where this breaks
Overwriting the original value during cleaning is a mistake you cannot undo. Once a verbatim job title has been replaced by “engineering”, the copy in lesson 15 has nothing real to quote and you cannot re-derive the original. Always clean into a new column and keep the raw value. Storage is free; re-enriching is not.
Further automation
Clean columns are what make a table reusable. When the next segment arrives, the normalization, classification and scoring logic all carry over — only the filter values change. That is the difference between a table you rebuild each quarter and a template you re-point.
Next lesson
15 — Writing copy from your data, turning the columns you just cleaned into an opening line.
Reference for this lesson: Tables, Actions, AI agents, GTM Engineering — scoring and gating.