Skip to content

Resumap Research · 2026-07-19 · two runs

We uploaded 36 resume templates into Zoho Recruit — twice. Before and after fixing what its parser choked on.

Same resume, same words — 36 different layouts, imported through a real applicant tracking system and scored field-by-field against the source document. Run 1 caught real bugs in our templates: a city stored as "Austin, Rust", a current job that vanished, half a skill list gone. We fixed the PDF text layer — zero visual changes — and re-ran the identical content. 16 templates parsed 100% before; 23 after. This page publishes both runs, the raw exports, and both corpora so you can re-run everything yourself.

16 → 23
templates parsing 100% (all 22 checks), run 1 → run 2 of 36
9 → 0
templates losing the LinkedIn URL — fixed by printing the URL as text instead of a styled label
27/36
templates where all 8 primary skills of the job opening were extracted after fixes — the direct input to match scoring
73% → 82%
worst single template score, run 1 → run 2

The two runs used byte-identical resume content — only the templates' PDF text layer changed between them. Every fix is in Resumap's public commit history.

More in the series: we ran the same corpus through an ATS with AI candidate scoring (the Manatal AI match score test), through a third parser (the Workable parsing test), and through the enterprise OEM engine behind SuccessFactors and iCIMS (the Textkernel parsing test).

Methodology

  1. One fixture CV. A complete senior-engineer resume (3 jobs with dated bullet histories, education, 25+ skills, languages, certifications, LinkedIn) — the same fixture every Resumap gallery thumbnail is rendered from. It is fictional; the content is identical in every file.
  2. 36 PDFs, one per template. Every enabled template in the catalog, rendered by the same production pipeline users export with. Only the contact email (+suffix per template and run) and phone digits differ, to defeat the ATS's duplicate-merging — otherwise Zoho collapses all 36 files into one candidate (we verified: it did).
  3. A matched job opening. A "Senior Software Developer" opening whose 8 primary skills, experience requirement and description mirror the CV exactly — so template formatting is the only variable.
  4. Real import path.All PDFs went through Candidates → Import from Document — Zoho Recruit's resume parser (trial org, EU data center, 2026-07-19).
  5. Field-level scoring. Candidates exported with tabular records (Setup → Data Administration → Export) and scored on 22 checks: email, phone, LinkedIn, location, current role (title + employer + years), 3 work-history rows, 3 date ranges, education, and extraction of each of the 8 primary skills. The scoring script is deterministic and ships with the dataset.
  6. Fix and re-run.Run-1 failures were traced to the templates' PDF text layer (verified locally with the same extraction stack parsers use), fixed in the render code with no visual changes, and the corpus was regenerated and re-imported into a cleaned org as run 2. Both runs are published.

Full results — all 36 templates, both runs

Sorted by run-2 score. "Skills" is how many of the job opening's 8 primary skills the parser extracted (run 2).

#TemplateRun 1Run 2SkillsRemaining issues (run 2)
1Studio22/2222/228/8
2Sidebar Mono22/2222/228/8
3Quarto22/2222/228/8
4Portrait Premium21/2222/22 8/8
5Modern Minimalist22/2222/228/8
6Modern Professional21/2222/22 8/8
7Linen22/2222/228/8
8Gazette22/2222/228/8
9Codex22/2222/228/8
10Cobalt19/2222/22 8/8
11Classic Professional22/2222/228/8
12Chronicle22/2222/228/8
13Carbon22/2222/228/8
14Bulletin22/2222/228/8
15Boardroom22/2222/228/8
16Axis21/2222/22 8/8
17Atrium22/2222/228/8
18Atelier21/2222/22 8/8
19Lumen22/2222/228/8
20Vertex16/2222/22 8/8
21Beacon21/2222/22 8/8
22Folio22/2222/228/8
23Aurora22/2222/228/8
24Spine21/2221/228/8location: city="" prov="" country=""
25Compact Engineer20/2221/22 8/8job row off (marlowe & druid software): title="Software Engineer" company="Marlowe & Druid"
26Sovereign20/2221/22 8/8education off: "INSA Lyon" "COMPUTER, SCIENCE, DISTRIBUTED SYSTEMS" M.ENG
27Prism20/2221/22 7/8primary skills missing: Microservices
28Terminal21/2221/227/8primary skills missing: React
29Syntax21/2221/227/8primary skills missing: React
30Lattice21/2221/227/8primary skills missing: React
31Vellum21/2221/227/8primary skills missing: React
32Bloom21/2221/227/8primary skills missing: React
33Offset21/2221/227/8primary skills missing: React
34Herald20/2220/227/8education off: "INSA Lyon" "COMPUTER SCIENCE, DISTRIBUTED" M.ENG; primary skills missing: React
35Slate20/2220/227/8education off: "INSA" "COMPUTER SCIENCE, DISTRIBUTED SYSTEMS" M.ENG; primary skills missing: React
36Premium Editorial17/2218/22 8/8current employer: "Halcyon"; missing job row: halcyon networks

Full per-check data for both runs is in the CSV downloads below.

Run 1 failures, verbatim — and what happened after the fix

These strings are copied unedited from the run-1 Zoho candidate export (included in the downloads). This is what a recruiter's database would have contained.

The parser erased the current job

Vertex · run 1: 16/22 — worst result
City:              "Austin, Rust"
Current Employer:  "Quillvane Labs"   (should be: Halcyon Networks)
Current Job Title: "Software Engineer, II-III"
Experience:        6.00 years          (should be: 10)

The PDF text stream fed the parser the skills column mid-address — a stray “Rust” landed in the city field — and the most recent role never made it into the database. In a real pipeline this candidate looks unemployed since 2022 and four years more junior than they are.

After the fix (run 2): 22/22. The sidebar now starts below the header block and headings extract as words, not letters. City "Austin", employer "Halcyon Networks", 10 years, all 8 primary skills.

Email glued to the next section's heading

Sovereign · run 1: 20/22
Email: "[email protected]"

Wide-tracked display caps fragmented the SUMMARY heading into single letters in the text layer, and the sidebar email line merged straight into it — the parser stored a broken address. Automated outreach to this candidate bounces.

After the fix (run 2): 21/22. Email stored correctly. One cosmetic education artifact remains (a stray comma in the degree line) — still iterating.

Half the skill list vanished

Cobalt · run 1: 19/22
Skills parsed: 24 (best templates: 50)
Missing from the job's primary skills: Kubernetes, React, Microservices

Not a parser bug — the template's design rendered only a curated 'Top Skills' list of 6 and silently dropped the rest of the user's skills from the PDF entirely. In skill-based recruiter searches this candidate simply didn't appear.

After the fix (run 2): 22/22 with 50 skills parsed and 8/8 primary skills. The template now renders the full grouped skill list in the main column, LinkedIn-profile style.

Company names truncated, one job lost

Premium Editorial · run 1: 17/22
Current Employer: "Halcyon"            (should be: Halcyon Networks)
Company:          "Marlowe & Druid"    (should be: Marlowe & Druid Software)
Work history:     2 of 3 rows parsed

Decorative layout elements split company-name tokens across the text stream. Employer-name searches ('Halcyon Networks') miss this candidate, and a third of the work history is gone.

After the fix (run 2): 18/22 — improved (title, years and all 8 skills now correct) but NOT fully fixed: the employer still truncates to "Halcyon" and one row still drops. The single-line "Title · Company" layout needs deeper rework; honest status: in progress.

What we learned

1. Layout complexity is not the predictor — text-stream order is. Two-column and dark-sidebar templates (Sidebar Mono, Atrium, Boardroom, Studio) parsed at 100% in both runs. The run-1 failures came from templates whose visual polish reordered or fragmented the text stream — and reordering the stream (with zero visual change) fixed them. You cannot see this by looking at a resume; only by parsing it.

2. Letter-spacing wider than ~0.1em destroys extraction. PDF text extractors insert a space between glyphs once the gap passes roughly a tenth of the font size — tracked headings like SKILLS become "S K I L L S" and section detection dies. We measured the threshold empirically and capped every data-carrying style below it.

3. Styled link labels lose data; URL text doesn't. 9 of 36templates lost the LinkedIn URL in run 1 because they rendered a clickable label ("LinkedIn") — the annotation works for humans, but parsers only reliably store the text layer. After printing the URL as visible text: 0 losses.

4. Chip-style skill sections tokenize worse than comma-separated lists. In 8templates the parser still misses "React": their skills render as visual chips, which extract as space-separated words with no punctuation between skills — bare one-word skills get absorbed by neighbours. Distinctive tokens (Node.js, Next.js, PostgreSQL) survive. If you want to be found for a one-word skill, a plain comma-separated list is the safe format. Design trade-off we're keeping for now — documented, not hidden.

5. Re-running found one regression. Spineparsed its location in run 1 but not in run 2 (the longer URL text in its contact row displaced the address in the parser's field detection). Net score unchanged — and it's exactly why we publish every run instead of only the flattering one.

Data & reproduction

Everything needed to verify or re-run this test, both runs. CC BY 4.0 — cite this page.

Limitations — read before citing

  • One parser: Zoho Recruit's built-in "Import from Document", trial org, EU data center, both runs on 2026-07-19. Other ATS products use different parsers; results do not transfer 1:1.
  • One fixture CV (senior software engineer, English, Latin script). Different professions, languages or scripts may parse differently.
  • Zia Match Score is unavailable on trial accounts — we report primary-skill extraction (Zia's documented scoring input), not the score itself.
  • Single import per template per run. Parser behaviour may change as Zoho updates it; the test date is part of the dataset.
  • Resumap runs this test on its own templates — an obvious interest. That's why both corpora, both raw exports and the scoring script are downloadable: don't trust us, re-run it.

Questions this data answers

Do two-column resume templates break ATS parsing?

Not by themselves — well-built two-column and sidebar templates (Sidebar, Atrium, Studio, Boardroom) parsed at 100% in both runs. What breaks parsing is the ORDER of the PDF text stream: in run 1, one two-column template fed the parser its skills column mid-address (city stored as "Austin, Rust") and the current job vanished. After we fixed the stream order — with zero visual changes — the same template parsed 22/22. You can't see text-stream order by looking at a resume; you can only test it.

Does a photo on the resume break ATS parsing?

Not in this test. After run-2 fixes, photo templates parsed cleanly: Portrait scored 22/22 with all 8 primary skills. None of the parsed fields came FROM the photo though — a photo adds recruiter-facing polish at zero parsing benefit, so use one only where local hiring norms expect it.

Is it true that 75% of resumes are auto-rejected by ATS?

No. That statistic traces back to a 2012 marketing claim by Preptel, a company that no longer exists, and no ATS vendor has ever published data supporting it. ATS software parses and organizes resumes; humans decide rejections. What IS real — and what this test measures — is that bad parsing silently degrades how your resume appears in recruiter searches and match scores.

Why didn't you publish Zoho's Match % (Zia score)?

Zia Candidate Matching is not available on Zoho Recruit trial accounts (documented by Zoho). We published the next-closest measurable thing: how many of the job opening's 8 primary skills the parser extracted from each template — which is exactly the input Zia's match score is computed from. After fixes, 27 of 36 templates delivered a full 8/8.

What did you change between run 1 and run 2?

Only the template render layer — the resume content is byte-for-byte identical. Four classes of fixes: (1) letter-spacing on headings capped below the ~0.1em threshold where PDF text extractors start inserting spaces ('SKILLS' was extracting as 'S K I L L S'); (2) sidebar columns declared after the main column in the PDF text stream (visual layout unchanged); (3) LinkedIn/GitHub/portfolio links now print the URL as visible text instead of a styled label; (4) one template silently dropped every skill beyond its top-6 — it now renders the full list. The diff is public in the Resumap repo history.

Can I reproduce this test?

Yes. Download either corpus below (run 1 = pre-fix templates, run 2 = shipped fixes), create a free Zoho Recruit trial, import the PDFs via Candidates → Import from Document, then export Candidates with tabular records and compare against the ground truth. The scoring script is deterministic; a full run takes about an hour.

Does a good parse in Zoho Recruit guarantee a good parse in Workday or Greenhouse?

No — every ATS uses its own parser. But the failure modes this test surfaces (text-stream order, labels instead of URLs, contact lines glued to section headings) are parser-agnostic classes of problems: a PDF whose text layer reads cleanly top-to-bottom is the input every parser wants. We plan to repeat this corpus against other systems and publish each run.

Test your own resume, not just our templates

The templates above are free to use — including the 23 that now parse perfectly. And if you want to know how your existing resume matches a specific job description, the ATS Check reads both and tells you honestly.