Normalize messy job titles into seniority and function
Turns the chaos of raw titles — emojis, slashes, vanity titles, abbreviations — into two controlled-vocabulary fields plus a decision-maker flag. It's the unglamorous prompt that makes everything downstream work: routing, scoring, and personalization all break when 'Chief Revenue Wizard 🧙' sits unparsed in your title column.
You are a data-normalization function running inside an enrichment pipeline. Your job is to convert one raw, messy job title into two clean labels: seniority and function. You behave like a deterministic function: the same input always produces the same output, and you never editorialize.
You will be given a raw job title string exactly as it came from LinkedIn, a data vendor, or a form fill. It may contain emojis, slashes, pipes, multiple roles, abbreviations, or non-English words.
Mapping rules:
- seniority is one of: c-level, vp, director, manager, senior-ic, ic, owner-founder, unknown.
- function is one of: sales, marketing, engineering, product, operations, finance, hr, it, customer-success, legal, general-management, other, unknown.
- Multiple roles ('Co-founder & Head of Sales'): classify by the most senior role for seniority and its stated function; founders with a named function get owner-founder plus that function.
- Abbreviations resolve conventionally: CRO is c-level sales, RevOps is operations, SDR/BDR is ic sales, GTM without a level is unknown seniority, marketing function only if stated.
- 'Head of X' maps to director unless the company is clearly tiny, which you cannot know — so always director.
- Non-job strings ('Helping brands grow 🚀', a company name, gibberish) get unknown/unknown.
- Never infer from a company name or from what a person 'probably' does.
OUTPUT CONTRACT — follow exactly:
Return a single JSON object:
{"seniority": "<one allowed value>", "function": "<one allowed value>", "is_decision_maker": <true if seniority is c-level, vp, director, or owner-founder, else false>}
- Return ONLY the JSON. No markdown fences, no commentary, no restating the input.
- Both values must come from the allowed lists character-for-character.
- When genuinely ambiguous, unknown beats a guess. unknown/unknown is a valid, correct output.How to use it
- 1
Copy the prompt into Claude, ChatGPT, or any LLM — or into a Clay AI column.
- 2
In Clay, map your raw title column as the single input; run it on every new list before any scoring or routing step.
- 3
Test against your 30 weirdest real titles — the ones with emojis, pipes, and dual roles — and tighten mapping rules for any miss.
- 4
Filter and route on the outputs: is_decision_maker for campaign eligibility, function for message-angle selection.
Best practices
Extend the mapping rules with your market's quirks (clinical titles, agency titles, non-English patterns) rather than letting the model improvise per row.
Audit the unknowns monthly — a spike usually means a new data source with a different title format entered the waterfall.
Never merge normalized values into copy; they're routing labels. The prospect wrote 'Head of Growth' and should be addressed that way.
Example: what this looks like in practice
An outbound team imports 12,000 contacts from three vendors and LinkedIn scrapes; titles arrive as everything from 'CRO' to 'VP, Rev Ops & Enablement | ex-Oracle' to 'girl dad ⚾ | sales leader'. This prompt normalizes the column in one run: 9,800 rows get clean seniority and function, 1,400 flag unknown, and is_decision_maker instantly cuts the sendable list to 4,100. Function-based routing then sends operations titles the tooling-consolidation angle and sales titles the pipeline-coverage angle. The team's previous regex sheet for this had 340 rules and still missed the emojis; they deleted it.
Best fit
This prompt is one gear in a bigger machine. We orchestrate 20+ tools into outbound systems our clients own — and guarantee the results.
Apply for a Pilot Spot → →Frequently asked questions
Run an AI column with a controlled vocabulary: fixed allowed values for seniority and function, explicit mapping rules for abbreviations and edge cases, and an unknown fallback. The fixed lists are the key — free-form normalization just trades one messy column for another, while controlled values feed filters and routing directly.
More personalization at scale (clay & claygents) prompts
Generate a cold email first line from scraped research data
The workhorse of AI-personalized outbound: converts whatever research your enrichment waterfall produced into one 12–22-word observation-led first line per row. The swap-test rule and fact-invention ban are what separate lines that read researched from the AI slop prospects now delete on sight.
Turn a Claygent website scrape into a personalized one-liner
Produces a sub-25-word, website-specific opening line for every row in a Clay table — no human in the loop. The output contract forces plain text only and a NOT_FOUND fallback, so unreachable sites and thin homepages return a filterable sentinel instead of a hallucinated compliment that ends up in a prospect's inbox.
Analyze a pricing page for sales-relevant intelligence
Extracts a structured pricing profile from any pricing page: model, tier count, exact displayed prices, free-offer type, and a one-line read on their sales motion. At scale it segments prospect lists by how companies charge — which predicts budget, buying process, and which of your angles will land.