Most job descriptions never reach a human recruiter. They get scored, ranked, and filtered by an applicant tracking system (ATS) before anyone reads a word you wrote. A bad score doesn't just mean fewer applications — it means the candidates who would have been your best hires never see the listing.
This guide explains exactly how ATS platforms score job descriptions, which criteria matter most, and how to fix a JD that's losing candidates at the algorithm level.
What Is ATS and Why It Matters for Your JD
An applicant tracking system is software that manages the hiring pipeline — from posting a job to receiving applications. The big players among mid-size companies (100-400 employees) are Greenhouse, Lever, Workday, iCIMS, and BambooHR.
When a candidate applies, the ATS doesn't just store their resume. It parses it, extracts structured data (name, email, employment history, skills), and assigns a match score against the job description. Recruiters then use this score to filter — often setting a threshold where anything below 60% gets archived without review.
A 2025 LinkedIn survey found that 75% of recruiters say ATS keyword matching is the primary filter for initial resume screening — and over half of hiring managers admit they never adjust the system's default scoring thresholds after setup.
How ATS Scoring Models Work
Every ATS scores JDs differently, but they share a common architecture: weighted criteria across four to six dimensions. The exact weights vary by platform, but this is the typical breakdown across the most common systems:
| Scoring Dimension | Weight | What the ATS Looks For |
|---|---|---|
| Keyword Match | 30–40% | Exact and semantic matches of required skills, tools, certifications, and role-specific terms in the JD text. |
| Section Structure | 15–20% | Presence of standard sections: Job Summary, Responsibilities, Requirements, Qualifications, About the Company. |
| Format Integrity | 10–15% | Plain text parsing success rate — how much of the JD can be read correctly. Tables, headers in unexpected places, and non-ASCII characters reduce this score. |
| Title Relevance | 10–15% | Job title match to industry-standard titles. Unusual or internally-created titles score poorly against candidates who used standard titles in their resume. |
| Completeness | 5–10% | Length check (too short = low effort, too long = keyword stuffing suspicion), presence of salary range, location, employment type. |
| Readability | 5–10% | Flesch-Kincaid grade level (aim for 8–12), sentence length variance, bullet point ratio. JDs written at grade 16+ tend to score lower. |
The candidate's resume gets scored against the same dimensions. The ATS then calculates a match percentage. If you're writing JDs that score low on these criteria, the pool of qualified candidates who match well starts shrinking before the job ever gets seen by a human.
Keyword Density: The Right Range
Keyword scoring is the highest-weight dimension, and it's also the most misunderstood. Recruiters often assume "more is better" — but the research and ATS parsing behavior say the opposite.
The optimal keyword density for ATS scoring is 2–5% for primary terms. Here's why:
- Under 1%: The term is essentially ignored. A candidate with "Python" in their resume but "Python (3+ years)" at 0.8% density in the JD won't flag as a strong match.
- 1–3%: Solid. The term registers clearly as relevant without appearing forced.
- 3–5%: Strong. Multiple natural mentions across summary, responsibilities, and qualifications signal genuine priority.
- 5–8%: Borderline. Starts looking like a checklist rather than a real job description.
- Over 8%: Most modern ATS systems flag this as potential keyword stuffing. Scores get penalized, not boosted.
To calculate your keyword density: take the number of times a term appears, divide by total word count, multiply by 100. A 500-word JD with "Python" appearing 12 times is at 2.4% — right in the sweet spot.
Our free JD generator automatically balances keyword density across required skills, preferred qualifications, and nice-to-have terms — so your description hits the 2–5% range for every primary keyword without manual counting.
Format Scoring: What Passes and What Fails
ATS systems parse text using Optical Character Recognition (OCR) on uploaded documents, and HTML parsing on web-based postings. Both have known failure modes that quietly tank your score.
What works
- Plain paragraphs for summaries and descriptions
- Standard bullet lists using hyphens ( - ) or asterisks ( * )
- Plain text headings: Responsibilities, Requirements, Qualifications, About the Company
- Standard headers at H1/H2 level (for web-based JDs)
- Numbered lists for step-based qualifications
What fails
- Multi-column table layouts — the ATS reads rows left-to-right, destroying paragraph meaning
- Text boxes, callout boxes, or graphics embedded in the body text
- Non-standard section names ("The Role", "What You'll Do", "Role Requirements" — variations that don't match the ATS taxonomy)
- Special characters like checkmarks (✓), arrows, or emoji in the main body text
- All-caps headings ( ATS parses them as body text, not section markers)
- Headers placed inside table cells
Requirements:
✓ 3+ years Python
✓ AWS certified
✓ React.js experience
Checkmarks and emoji fail OCR parsing. Multi-column formatting breaks meaning.
Requirements
- Minimum 3 years of professional Python development experience
- AWS certification (Solutions Architect Associate or higher preferred)
- 2+ years of React.js development experience in production environments
7 Mistakes That Kill Your ATS Score
1. Writing for humans and ignoring the parser
Your JD may read beautifully but score at 45% because the ATS couldn't parse the formatting. Creative, visually rich job descriptions are great for human readers — but most applications come through the ATS, and the parser doesn't see what your eyes see.
2. Using your internal job title verbatim
Internal titles like "Growth Unicorn" or "Revenue Architect" don't match candidate resume keywords. ATS systems map against standardized job title taxonomies (ONET, LinkedIn job titles). Use the standard title in the JD, add the internal nickname in parentheses if needed.
3. Burying required skills in a wall of text
ATS scoring weights keyword position. If "Kubernetes" appears only in paragraph 8 of a 12-paragraph Responsibilities section, it registers as less relevant than if it appears in the Requirements section as a named bullet point. A well-structured template ensures required skills appear in the highest-weighted sections.
4. Posting a JD that's too short
JDs under 300 words signal low effort to the ATS. The system interprets brevity as incompleteness and may lower your completeness score. Aim for 500–800 words minimum, even for entry-level roles.
5. Including every possible requirement to avoid filtering
Listing 15 "required" skills when only 5 are truly required widens your applicant pool but destroys your match rate. ATS match scores are calculated against candidate resumes — if candidates have 8 of 15 skills, they score 53%, and many recruiters auto-reject anything below 60%.
6. Using jargon that candidates won't search for
Your team says "Full-Stack Generalist" but candidates search "Full Stack Developer." That gap means candidates with the right background filter themselves out before applying. Use the language your ideal candidates actually search — check LinkedIn job listings for your role to find the common terms.
7. Forgetting the About the Company section
Many ATS systems assign points for the presence of an "About the Company" section. This is also where culture-related keywords ("fast-paced", "mission-driven", "collaborative") can live without cluttering the Requirements section. Removing it loses easy points.
How to Fix a Low-Scoring Job Description
If you've already posted a job and aren't getting the right candidates, here's a step-by-step fix process:
ATS JD Repair Checklist
- Count your primary keywords (top 5 required skills). Calculate their individual density. Target 2–5% for each.
- Move all required skills into a dedicated "Requirements" or "Required Qualifications" section with bullet points.
- Replace any checkmarks, emojis, or special characters in the body with plain text.
- Convert any table-based requirement lists to plain bullet points.
- Add a salary range (even a wide one like "$90,000–$120,000") — adds a concrete data point the ATS parses easily.
- Add an "About the Company" section if one doesn't exist. 100–150 words on company size, industry, and culture.
- Run the JD through a free ATS scan tool (see below) before re-posting.
- If the role is still underperforming after 2 weeks, A/B test a revised version with different keyword ordering.
Inclusive job descriptions tend to score well on ATS too — not because of the topic, but because inclusive language tends to use simpler sentence structures, standard section headings, and shorter paragraphs, all of which aid parsing and improve readability scores.
Free Tools to Test Your JD Before Posting
Before you re-post a job description, run it through one of these to catch scoring issues:
- Jobscan.co — Compares your JD against the top 5 competing job postings on LinkedIn. Shows keyword match percentage, format score, and section completeness. Free tier covers 5 scans/month.
- Resumeworded.com — ATS analysis with match score breakdown by dimension. Good for understanding which section scoring criteria need the most attention.
- Ziprecruiter's JD Optimizer — Free, simple. Paste your JD and get a readability and structure score plus suggested keywords to add.
- Enrise ATS Score — Open-source tool that parses your HTML and returns format integrity and keyword density scores.
These tools are useful, but the most effective fix is writing a well-structured JD from the start. JD Generator produces ATS-optimized descriptions automatically — structured sections, keyword density in the 2–5% range, standard section headers, and no special characters. Start with a strong foundation rather than trying to fix a broken one.
Generate an ATS-optimized JD in 60 seconds
Built-in keyword balancing, standard section structure, and format compliance — without manual optimization work.
Create your job description →