LeadHaste
IntermediateNo variables to fill, paste & go

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.

The prompt
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. 1

    Copy the prompt into Claude, ChatGPT, or any LLM — or into a Clay AI column.

  2. 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. 3

    Test against your 30 weirdest real titles — the ones with emojis, pipes, and dual roles — and tighten mapping rules for any miss.

  4. 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

Roles
RevOpsSDR / BDRMarketer
Company size
Startup (1–10)SMB (11–50)Mid-market (51–500)Enterprise (500+)
Audience
B2B
Industries
Any industry
Works with
Any LLM
Difficulty
Intermediate

This prompt is one gear in a bigger machine. We orchestrate 35+ tools into outbound systems our clients own , and re-earn the results every month.

Book your free ICP review → →
Prompt FAQ

Frequently asked questions

How do I standardize job titles in Clay?

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.

Why not use regex or a lookup table for title normalization?

Lookup tables work until they meet reality: emojis, dual roles, vanity titles, vendor-specific formats, and other languages generate infinite variants. Teams end up maintaining hundreds of rules that still miss 20% of rows. An LLM with strict mapping rules handles the long tail in one prompt — and the unknown fallback catches what it can't.

What does the is_decision_maker flag actually gate?

Send eligibility and offer selection. Deriving it inside the prompt from the seniority value keeps the logic consistent across every row and every list, instead of living in three different Clay formulas that drift apart. If your definition differs — say, managers count in SMB — adjust the derivation line once.