Most ATS optimization advice on the internet stops at "use keywords from the job description". That's about 10 percent of the picture. The other 90 percent is what this post is about.
I run the engineering on Resuma, which means I've watched a few hundred thousand resumes get parsed, scored, and rewritten through our pipeline. The patterns that separate the resumes that score well from the resumes that don't are remarkably consistent, and most of them are not what people think they are.
This is the 9-step playbook. Each step is something a careful recruiter or a real ATS parser actually checks, and each one moves the score in measurable ways. If your resume isn't landing interviews, work through this list in order. The earlier steps have bigger impact than the later ones, so don't skip ahead.
Step 1: Read the JD before you touch the resume
The first step in optimization is not editing the resume. It's reading the job description carefully and identifying what the role actually wants.
Three things to extract from any JD:
The heavy keywords (the specific tools, frameworks, qualifications named in the must-have section).
The seniority signal (junior, mid, senior, staff — and the experience range that backs it up).
The responsibilities the role exists for (the two or three things this person will spend most of their time doing).
If you can't write those three things down on paper for the JD in front of you, you don't understand the role well enough to optimize for it yet. Read the JD again.
Step 2: Sort the keywords into tiers
Not all keywords carry equal weight. A keyword that appears in the job title plus the requirements section plus a bullet is a Tier 1 keyword. A keyword that appears once in the "nice to have" section is a Tier 3 keyword.
Tier 1 keywords have to appear on your resume in a meaningful sentence, not in a skills-section dump. A Tier 1 keyword in a skills list is weak evidence; the same keyword inside a bullet describing what you did with it is strong evidence.
Tier 2 keywords should appear at least once. Skills section is fine.
Tier 3 keywords are optional. Include them only if they fit naturally; never force them.
The reason this tiered approach matters: modern ATS parsers weight keywords differently based on where they appear in your resume *and* where they appeared in the JD. A Tier 1 keyword landed in a Tier 1 location is worth several Tier 3 mentions. The mirror trick post walks through how to integrate heavy keywords into existing bullets without rewriting from scratch.
Step 3: Audit parsing-safety before anything else
This is the boring step that wins the most points.
Open your resume in plain-text view (most word processors have this option, usually under "File > Save As > Plain Text" or similar). Read it top to bottom in that view. What you see is what the parser sees.
Specifically check:
Sections appear in the right order. The parser reads top-down; if your experience is buried below a sidebar of skills, the parser may not weight it correctly.
Bullets are actual bullets (the • or - character, not images or icons). Icon bullets often don't extract.
Dates are aligned with the role they belong to. If "May 2023 — Present" appears two paragraphs away from the role title because of column layout, the parser may not associate them.
Headers are real headers ("Experience", "Education", "Skills"), not creative names ("My Journey", "What I Bring"). Parsers look for standard section labels.
If your resume looks like a mess in plain-text view, no amount of keyword optimization will save it. Fix the structure first. The 7 formatting mistakes post covers the specific issues that break parsing most often.
Step 4: Strengthen the recency window
The most recent role on your resume is the highest-leverage real estate in the document. Both human recruiters and parsers weight recent experience much more heavily than older roles, because it's the best evidence of what you can do right now.
For your current or most recent role, the first three bullets are the ones that matter most. Each of those three bullets should:
Map to one of the responsibilities you extracted from the JD in Step 1.
Be an outcome, not a responsibility. "Restructured the support team's escalation flow, cutting average resolution time from 14 hours to 3" is an outcome. "Responsible for managing the support team" is a responsibility. Outcomes score; responsibilities don't.
Include a number. Time saved, revenue moved, users gained, errors reduced, time to ship. The number anchors the claim and signals that you measured your own work.
If the first three bullets of your most recent role pass these three tests, you've done the highest-leverage editing on the entire resume. If they don't, fix them before you touch anything else.
Step 5: Rewrite bullets from responsibility to outcome
This is Step 4 extended to the rest of the document.
A bullet that describes what you were assigned to do is a responsibility. A bullet that describes what you delivered is an outcome. Outcomes score much higher in both human and parser reads.
The shift usually requires you to remember the actual impact of work you did. That's the hard part — many people don't track their own outcomes well enough to remember the numbers six months later. If you're sitting down to optimize a resume cold, the work of digging up old numbers is real. It's also worth doing; a resume with 12 outcome bullets across the two most recent roles beats one with 30 responsibility bullets.
The bullet point guide walks through the responsibility-to-outcome rewrite in depth, with before/after examples.
Step 6: Check role and seniority signals
Both human recruiters and parsers check whether your current role plausibly maps to the role being applied for. The check has two parts.
Title mapping. If you're a "Senior Software Engineer" applying for a "Staff Software Engineer" role, the title progression is one level up, which is plausible. If you're a "Marketing Coordinator" applying for a "VP of Marketing" role, the title gap is too large and the resume will fail this check regardless of how strong the rest of it is.
Seniority years. If the JD says "5+ years of experience" and your total experience is 2 years, the parser flags this regardless of how good your work was during those 2 years.
When the title or seniority gap is real, the only place on the resume to bridge it is the summary section. Use the summary to say explicitly what makes you a fit for the level despite the title or year count. The career change resume guide walks through this kind of bridging in detail.
If the gap is too large to bridge honestly, the resume is the wrong tool. You need to either target a different role tier or find a referral that bypasses the screen.
Step 7: Integrate keywords without stuffing
Once you know which keywords to add and where to add them, the actual integration is a writing problem.
Done badly, keyword integration produces sentences like "Utilized React, TypeScript, AWS, Docker, Kubernetes, GraphQL, REST APIs, and PostgreSQL to deliver scalable solutions". A parser reads this and registers the keywords, but a human reader recognizes it as stuffing immediately, which damages your credibility for the rest of the screen.
Done well, keyword integration produces sentences that name tools in context. "Built a React + TypeScript dashboard for support reps that reduced their average ticket resolution time from 14 hours to 3, deployed on AWS with Docker for reproducible builds." Same keywords, evidence behind each one.
A useful test: if you remove a keyword from a bullet and the bullet still makes sense as a sentence, you probably stuffed. If the bullet collapses because the keyword was load-bearing, you integrated.
Step 8: Final formatting sanity check
Before you export, run a final pass on the boring stuff that breaks ATS parsing:
Single-column layout. Two-column resumes look fine to humans, but the parser may read them in the wrong order, mashing sidebar content into the wrong section.
No text boxes, tables for layout, or images for bullets. All of these can drop content from the parsed output entirely.
Standard section headers ("Experience", "Education", "Skills", "Projects" — not "My Story" or "What I Do").
Reverse-chronological ordering. The most recent role first, always.
PDF export, not Word, unless the JD specifically asks for .docx. PDFs preserve layout more reliably across systems.
Filename format: FirstName_LastName_Resume.pdf. Not Resume_Final_v3_USE_THIS_ONE.pdf.
These items individually don't move the score much, but failing any of them can cause the parser to mis-read your entire document. They're cheap to get right.
Step 9: Validate the match score before you submit
The last step is the one most candidates skip: actually checking your resume against the JD before sending it.
The manual version: do a Ctrl+F for every Tier 1 keyword from Step 2. If they all appear in meaningful sentences, you're done.
The automated version: paste both the resume and the JD into a JD checker (Resuma does this in about 60 seconds; the free tier covers 3 generations). The score it returns should be 75 or higher for the resume to be in the strong-match zone for that JD.
If the score is below 75, the breakdown will tell you which of the 9 steps above is dragging the score down. Usually it's Step 4 (weak recency window) or Step 7 (poor keyword integration). Re-do that step and re-run the check.
Three things this post didn't say
A few myths worth knocking down:
Resume length doesn't matter as much as people think. The one-page rule applies to freshers. Mid-career and senior resumes can run two pages comfortably as long as the content earns the space. A two-page resume full of outcomes beats a one-page resume full of responsibilities.
Fancy templates don't help. Most "ATS-friendly" templates you find online optimize for visual polish, not parsing safety. The most ATS-safe resume is a single-column document in a standard font. If you want to see what a clean ATS-safe document looks like, the seven-second test post has a worked example.
Tailoring every resume from scratch is not the answer. The right approach is to maintain a strong base resume and adjust it per JD. The tailor without starting over post covers the adjustment process specifically.
What this changes for you
If you've been applying without doing this audit, the score gain from running through it once is usually 15 to 25 points (in our internal data — that's based on resumes that came in below 65 and were re-scored after the user worked through this kind of optimization). That's the difference between getting screened out and getting screened in for most roles.
You don't need a tool to do any of this. The 9 steps above are auditable by hand. Tools like Resuma just compress the process from an hour to a minute and produce the rewritten output for you.
Run the audit on your own resume. If your score against your target JD is still below 75 after the 9 steps, paste it into Resuma — three full generations free, no card required. The Inside Resuma's ATS Score post walks through the 5 signals our scoring weighs, in case you want to understand the score before you trust it.