We're launching soon! Stay tuned for updates.

ATS Keyword Optimization: Mirror the Job Description, Don't Stuff It

Keyword optimization is necessary and badly misunderstood. How to extract the terms a job description actually checks, where to place them, and why mirroring beats stuffing against an LLM-augmented screen.

H
Houman Ekrami
Founder, ProPage
11 min read
ATS Keyword Optimization: Mirror the Job Description, Don't Stuff It

Keyword optimization is the most over-followed and least understood resume advice of the last decade. The over-followed version: paste your resume and the job description into a scanner, read a match percentage, and cram in terms until the number turns green. That habit was mildly effective in 2018. Against a 2026 screen it backfires, because the file is now read twice: once by a parser that rewards the literal terms, and once by a language model that punishes the ones you can't back up.

The job is to satisfy both readers. Mirror the job description's exact language everywhere your real work matches it, and nowhere it doesn't. This post is the procedure: how to pull the checked words out of a posting, where to put them, how the stuffing penalty works, and a worked example of one summary rewritten to mirror one job description. The format and parser-mechanics side lives in the ATS resume guide; this is the language half.

Pull the checked words out of the posting

Before you touch the resume, take the job description apart. Three passes, five minutes, no tool required.

Frequency: the words that repeat are the words that count

Read the posting twice. On the second pass, note every noun, verb, tool, and title that appears more than once, plus any named system, framework, certification, or methodology that appears even once. A word the company repeated is a word they're screening for. A word-frequency tool can surface these faster (paste the posting into any counter for exact counts), but a careful manual read catches the same five-to-ten terms and catches them with their context, which you need for placement.

The output of this pass is a short list: the literal terms, in the literal form the posting used them. "Stakeholder management," not "working with stakeholders." "A/B testing," not "experimentation," if the posting said "A/B testing." The form matters because the oldest parsers still match literally.

Must-haves versus nice-to-haves

Not every keyword carries the same weight. Most postings separate the two for you, in two blocks usually labeled "Requirements" or "Minimum qualifications" and "Preferred" or "Nice to have." The required block is load-bearing in a way the preferred block is not: on rule-based systems, a missing required term can bucket you into "does not meet minimum qualifications" with no further read, while a missing preferred term costs a point or two.

So rank your list. The required terms you can honestly claim go in first and go in prominently. The preferred terms you can claim go in where they fit. The terms you can't honestly claim, required or not, stay out, and you decide whether the gap is small enough to apply anyway. Mirroring cannot manufacture a qualification you don't have. It can only make sure the ones you do have are visible.

Literal match versus synonym

The parser generation determines whether synonyms count. Older keyword matchers, the kind still running under a lot of legacy enterprise hiring, compare strings: "managed" and "led" are two different words, and only the one in the posting scores. Newer matchers, and the LLM screens layered on top of them, understand that "K8s" and "Kubernetes" are the same thing, and that a data analyst who "built dashboards" is adjacent to a "business intelligence" role.

The rule that satisfies both: use the posting's exact term at least once, where it's true, then vary your language naturally. Hitting the literal term once covers the string-matcher. Varying afterward keeps the file from reading as a posting paraphrased back at itself, which is the thing the LLM screen flags. If the posting says "managed," use "managed" in the bullet that best proves it, and use "ran," "owned," or "led" in the others. (Choosing those verbs well is its own craft; the resume action verbs guide goes deep on it.)

Where the keywords go

A keyword is worth different amounts in different places. The same term carries more weight in a bullet that proves it than in a list that asserts it. Three locations, in descending order of credibility.

Recent-role bullets: highest value. A keyword attached to a specific outcome is the one the LLM screen rewards, because it reads as evidence rather than assertion. "Built the experimentation pipeline that ran 40 A/B tests a quarter" mirrors "A/B testing" and proves it in the same breath. This is where your most important must-haves belong, in the work, with a number. A term that appears only here, never in a list, still scores and still convinces.

The summary: highest visibility. The top of the resume is read first by the recruiter and weighted early by the parser. Put the title you're targeting and your two or three strongest must-have terms here, in a sentence that would be true even if no one were screening for them. The summary is also the most-scanned line for the LLM pass, so a generic one (seen across thousands of candidates) contributes nothing, while a specific one pulls weight. The worked example below is a summary, taken apart and rebuilt.

The skills section: literal, and only what you can defend. This is where the literal terms live for the string-matchers: the tools, languages, frameworks, and methods, written exactly as the posting writes them. The discipline is that every term here should also appear, with evidence, somewhere else on the page. A skill in the list and nowhere else is an orphan, and a column of orphans is what an LLM screen reads as padding. The skills section is an index of the resume, not a place to add things the resume doesn't support.

The stuffing penalty is now bigger than the missing-keyword penalty

For most of ATS history the optimization ran one direction: more matching keywords, higher score, no downside to adding one more. That asymmetry is gone. The largest employers now run a language-model pass that summarizes and rates each file before a human sees it, and that model reads padding as a negative signal.

Three patterns trigger it. A keyword block in white text or a tiny font, hidden from the human but visible to the parser: the oldest trick, and the most reliably penalized now, because the model reads the hidden text and registers the contradiction with the visible resume. A skills section of thirty terms with evidence for six of them: the model notes the twenty-four it can't corroborate. The exact posting phrase repeated verbatim five times: the model recognizes the job description reflected back, and discounts it.

So the asymmetry now runs the other way. Missing one nice-to-have term costs a point. Reading as padded costs the file a rank the human never overrides. The decision rule when you're unsure about a keyword is therefore the opposite of the old one: when a term has no evidence behind it on the page, leave it out. The downside of omission is small and bounded. The downside of stuffing is large and, increasingly, invisible to you, because the rank penalty happens inside a model whose output you never see.

This is also why a match-rate percentage is a misleading target. The score measures overlap with the posting, which is exactly the quantity that stuffing inflates and the LLM screen discounts. Optimizing the number optimizes the wrong thing past a point. Hit the must-haves you can defend, then stop.

A worked example: one summary, mirrored to one job description

Theory turns concrete on the summary, because it's the densest keyword real estate on the page. Here's one job description and one candidate, taken through the rewrite.

The role is a senior data analyst posting. The load-bearing language, pulled by the frequency pass:

  • Required: SQL, dashboards (Looker), A/B testing, stakeholder management
  • Preferred: Python, dbt, experimentation platform

The candidate has all four required skills and Python, has never used dbt, and has used Mode rather than Looker.

Before (generic):

Results-driven data analyst with a passion for turning data into actionable insights. Experienced in a variety of analytics tools and skilled at communicating with stakeholders to drive business outcomes.

Nothing here is checkable. "Results-driven," "passion," "actionable insights," and "drive business outcomes" are the phrases an LLM screen has seen on ten thousand other resumes; they add nothing to the rank and nothing to the recruiter. The one real keyword, "stakeholders," floats without evidence. A frequency-matcher scores this low; the LLM pass scores it lower.

After (mirrored, credible):

Senior data analyst with six years building SQL pipelines and Looker dashboards for product teams. Designed and ran the A/B testing program at a 5M-user marketplace (300+ experiments) and partnered with PM and finance stakeholders to size and prioritize the roadmap. Strong in Python; comfortable owning the analytics stack end to end.

Every required term is present in its literal form (SQL, Looker dashboards, A/B testing, stakeholders), and every one is attached to a fact: six years, a named tool, a real scale, named partner functions. The preferred term the candidate genuinely has, Python, appears once. The two they don't, dbt and Looker-versus-Mode, are handled honestly: Looker is claimed because the candidate can defend it, and dbt is absent rather than faked.

What stuffing would look like (don't):

Senior data analyst | SQL | Looker | Tableau | Power BI | A/B testing | experimentation | dbt | Python | R | stakeholder management | dashboards | ETL | data visualization | machine learning

This version has a higher keyword count and a higher match percentage. It also claims Tableau, dbt, R, and machine learning, none of which the candidate can defend, and it reads to the LLM pass as exactly what it is. The "after" version, with fewer keywords and more evidence, ranks higher in 2026 than the keyword line does. That inversion is the whole point.

Keyword optimization is necessary, not sufficient

Everything above gets your file read. None of it gets you hired. That distinction is where most keyword advice quietly misleads.

Keyword optimization clears two gates: the parser that needs to find the terms, and the filter that ranks you against other applicants. Clearing them is necessary, because a resume that doesn't mirror the posting's language loses to one that does, all else equal. But all else is rarely equal, and the gates are the floor, not the game. Past the filter, a human reads the top of the queue and decides who to call, and that decision runs on evidence: the specific systems you've built, the numbers you can stand behind, the story the resume tells about what you'd do for them. No amount of mirroring substitutes for that.

This is also the honest answer for the candidate whose real experience doesn't match the must-haves. Mirroring can surface the qualifications you have; it cannot create the ones you don't, and faking them now costs you twice: once when the LLM screen discounts the unbacked terms, and again when the interview exposes the gap. If the must-haves genuinely aren't there, the fix isn't heavier optimization. It's a closer-matched role, or the real experience, gained. Keyword optimization is a visibility tool, not a qualification tool, and treating it as the second is the mistake the match-rate scanners encourage.

Make it a workflow, not a one-time rewrite

The repeatable version of all this is a workflow. Every application has a different posting, which means a different keyword list, which means a different summary and a reordered skills section. Done in a Word file under deadline, that produces four divergent resumes within a month and a LinkedIn profile that contradicts all of them.

Keep one source of truth instead. Hold your full career history (every system, number, and outcome) in one place, and tailor the surface per application: swap the summary, reorder the skills, foreground the bullets that match this posting. The evidence underneath doesn't change; which parts you bring forward does. And because that specific evidence is what makes the mirrored keywords credible to the LLM screen, the page that holds it does double duty: it's where the recruiter confirms the dates and numbers once the resume has earned their interest.

ProPage builds the resume and the public page from one data model, so the tailored versions stay honest to the same underlying facts. For the resume craft beneath the keywords, see How to write a resume in 2026; for summaries specifically, resume summary examples. For the parser mechanics this language work sits on top of, the ATS resume guide is the full map. And for why the page the recruiter lands on is the artifact worth owning, see what a professional identity URL is.

Mirror the posting where your work is real. Leave out what you can't defend. The screen rewards the resume that's honest in the language the job was written in.

Frequently asked questions

About the author

H
Houman Ekrami
Founder, ProPage

Houman founded ProPage to give every professional a URL that works everywhere — on paper and on the web.