Methodology

How the score is calculated

No universal ATS score exists. Nobody outside Workday, Taleo or Greenhouse knows their thresholds, so this one measures something narrower and checkable: how much of your file a parser recovers. Every weight is below, with its source.

The shape of it

What the number is

How much of your file a parser recovers, and nothing else. Not a prediction, and not a percentage any vendor publishes. It tops out at 98. Every scored finding is listed below with its cost; the arithmetic that combines them is the one thing this page holds back.

01

The ceiling is 98

Not 100. No vendor publishes its parser rules, so a perfect score would be a claim about software nobody outside those companies can read.

02

Some findings zero it

A file nothing can be read out of scores nothing, and there is no special case that makes it so: no text layer, no text, or empty extracted text for any reason.

03

Blockers sit outside it

A file the portal will not accept never reaches a parser, so it is shown above the score rather than inside it. The score still computes: the advice survives a re-export.

04

The same file scores the same

No sampling, no model, no luck. The number is arithmetic over the findings below, so a file you have not changed cannot come back with a different score tomorrow.

Every weight

All 21 scored findings, heaviest first

The checker shows a severity label rather than a number, because a price list invites gaming the score instead of fixing the document. They are published here anyway: the code is open, so they are public either way.

FindingCostShown asRests on
Letter-spaced text (worst tier)
Runs of four or more single-letter tokens. A parser cannot rejoin the characters, so the text contributes no searchable terms.
45MajorGreenhouse Support, Unsuccessful resume parse
Column layout and reading order
Raised by the extractor when it finds this in the document.
28MajorLayout-Aware Parsing Meets Efficient LLMs, arXiv 2510.09722 (2025)
No work history section
No heading names a work history, so there is nothing to build a career timeline from and everything under the renamed heading is unmapped.
26MajorOur judgement, extending a documented Greenhouse failure mode
Unfilled template text
Greenhouse skips data it reads as placeholder. In practice it usually means a template nobody finished.
20MajorGreenhouse Support, Unsuccessful resume parse
Text box
Raised by the extractor when it finds this in the document.
18MajorGreenhouse Support, Unsuccessful resume parse
Missing email
No address found. Recruiters filter on exact criteria, and a profile with no contact route cannot be actioned even when it matches.
18MajorHidden Workers: Untapped Talent, Harvard Business School and Accenture (2021)
Page header
Raised by the extractor when it finds this in the document.
16MajorGreenhouse Support, Unsuccessful resume parse
Missing sections
No headings a parser recognizes. Greenhouse lists inconsistent section formatting as a parse failure, and renaming a standard heading is enough to drop the section it contains.
15ModerateGreenhouse Support, Unsuccessful resume parse
Missing name
No line reads as a name, so the record has nobody attached to it. Greenhouse names contact details in a header, footer or text box as a specific cause of this.
14ModerateGreenhouse Support, Unsuccessful resume parse
Entries with no dates
A position with no date range cannot be placed on a timeline. Charged per document, not per entry: the document-level date field still passes, which is the hole this closes.
14ModerateOur judgement, not a published weight
Table
Raised by the extractor when it finds this in the document.
13ModerateGreenhouse Support, Unsuccessful resume parse
Missing dates
No start and end dates found. Parsers read dates reliably when they are there, so this reads as missing from the document rather than lost in transit.
12ModerateLayout-Aware Parsing Meets Efficient LLMs, arXiv 2510.09722 (2025)
Entries with no employer
A row with a title and dates but no company. The company field is the one most recruiter searches filter on.
10ModerateOur judgement, not a published weight
Over 2.5MB
Greenhouse stops parsing above this size whatever the upload limit allows, so the file uploads and the record arrives empty.
10ModerateGreenhouse Support, supported formats and parse limits
Page footer
Raised by the extractor when it finds this in the document.
9MinorGreenhouse Support, Unsuccessful resume parse
Headings a parser will not map
A heading that names no section a parser knows. Everything underneath goes unmapped.
8MinorOur judgement, extending a documented Greenhouse failure mode
Missing phone
No phone number found in the text.
7MinorGreenhouse Support, Unsuccessful resume parse
Mixed date formats
Two date shapes in one document. Duration is computed by pairing endpoints, so the mixture is the fault rather than either format.
6MinorOur judgement, not a published weight
Ongoing role not marked Present
"Current", "Now", or a dash with nothing after it. An end a parser does not recognize is an end it does not record.
5MinorOur judgement, not a published weight
Missing links
No portfolio or profile URL.
3MinorLayout-Aware Parsing Meets Efficient LLMs, arXiv 2510.09722 (2025)
Picture
Raised by the extractor when it finds this in the document.
0MinorLayout-Aware Parsing Meets Efficient LLMs, arXiv 2510.09722 (2025)

Letter-spaced text is tiered by how much of the document it covers (45 / 25 / 12), because a spaced-out heading and a spaced-out resume are not the same problem.

Reading the result

Bands, labels, and what is not scored

BandScore at or aboveVerdict shown
clean88Should come through intact.
minor70Will parse, with some detail lost.
risky40Expect fields to go missing.
broken0Most of this will not survive.
Severity labelCost at or above
Blocking100
Major16
Moderate10
Minor0
FormatNot scored
Layout formats (PDF, .docx, .odt)Nothing. Every check applies.
Markup (.rtf)Reading order, column layout, text layer
Plain text (.txt, .md)Reading order, column layout, text layer, tables

A check a format cannot fail is listed as not scored, never as passed. Plain text has no reading order to scramble, and crediting it would inflate the number for free.

Held separate

What never enters the score

Keyword coverage

Reported only when you paste a job posting, and never folded in: a resume is not worse for missing keywords from a job you have not applied to. The top 24 terms are ranked by how often the posting asks, filtered against 217 stopwords. Stuffing is flagged past 5 uses and 2× what the posting asks. Abbreviations show as near misses: an ATS matches literal text, so counting K8s as Kubernetes would promise a match it will not make.

Writing quality

Bullet length, weak verbs and missing metrics are reported for the human reader and kept out of the parse figure. Mixing “a machine can read this” with “this is well written” is what makes a single blended score meaningless.

Employment gaps

Surfaced to you, never scored and never framed as a defect. Gaps are normal, and a tool that marks people down for them is doing harm rather than analysis.

Photos

Detected and reported at zero cost. A photo is expected on a resume across much of Europe and Asia, so charging points would mark a document down for following local convention. The risk is information that exists only inside the image, and the finding says so.

Argue with these

Judgement calls, not citations

Every weight declares where it came from, which is a weaker promise than “every weight is cited” and the one the code actually keeps. These are ours. They are set out here so you can disagree with something specific.

  • The boundary between Major and Moderate (16 and 10).
  • 10 for an oversize file. Greenhouse stops parsing at 2.5MB but accepts uploads far larger, so the file attaches and a recruiter re-keys it by hand. Nobody is rejected. This was 30, which overstated it.
  • 28 for column layout and reading order, merged. They used to bill separately, 42 points for one defect.
  • 45 / 25 / 12 for the letter-spacing tiers, and the boundaries between them.
  • 20 for unfilled template text, priced as a lost employer name.
  • Every structural weight (26 / 14 / 10 / 8 / 6 / 5). Nobody publishes what an undated job or a renamed section costs.
  • The band boundaries (88 / 70 / 40). Set by what each band should mean, not measured. The only corpus is our own test fixtures, which were built to exercise detectors rather than to represent real resumes, so reading boundaries off their distribution would be measurement theater.

One thing is deliberately absent. On DOCX and ODT we read text box, header and footer contents into the main text, so a trapped email is found and “missing email” never fires alongside “text box”. PDF has no text-box detector yet. That is a real gap, and it is here rather than hidden.

Sources

What the cited weights rest on

Greenhouse Support, Unsuccessful resume parse

Greenhouse lists graphics, tables, headers and footers, contact details in a text box, multi-column layouts and inconsistent section formatting as causes of a failed or partial parse.

Hidden Workers: Untapped Talent, Harvard Business School and Accenture (2021)

88% of employers say qualified candidates are screened out because they do not match the exact criteria in the job description; over 90% use a recruiting system to make the first cut.

Layout-Aware Parsing Meets Efficient LLMs, arXiv 2510.09722 (2025)

Dates and named entities are extracted at F1 0.95 to 0.97 when present, so a missing date is a gap in the document rather than a parsing risk.

Greenhouse Support, supported formats and parse limits

Greenhouse cannot parse a resume larger than 2.5MB, and a resume uploaded as an image rather than a document will not parse at all.

Layout-Aware Parsing Meets Efficient LLMs, arXiv 2510.09722 (2025)

Around 20% of real resumes use a non-linear multi-column layout; removing layout-aware reordering costs 10+ accuracy points, and long descriptions fall to F1 0.55 without it.