What an ATS parser actually does to your CV file
Your CV is a layout. The system that receives it wants a database row. Everything on this page happens in the gap between those two things. A parser opens your file, pulls out one linear stream of text, and then tries to work out which part of that stream is your name, which part is an employer, which is a job title, which are dates and which are skills. Meaning that lives in the visual arrangement rather than in the order of the text can be reordered, glued onto the wrong field, or dropped before a person ever opens it. I want to say the important thing first: none of that is your mistake. "We couldn't read your file" is a report about software, not a judgement on your career.
"We couldn't read your file", and what that sentence is actually reporting
You spend an evening on a CV. It is clean, it fits on two pages, the spacing is right, and you are, for once, a little proud of it. You upload it and either nothing happens for three weeks or you get a line back saying the file could not be read. There is no diagnostic, no highlighted section, no hint at which part failed. That silence is the whole problem, because the thing that went wrong is completely knowable and nobody tells you.
A parser does not read your CV the way you see it. It extracts a linear text stream from the file and tries to map that stream onto database fields, so anything whose meaning lives in the layout rather than in the text order can be reordered, merged into a neighbouring field, or dropped.
The literal error message is narrower than people assume. It covers a short list of causes, all of them in the file itself: a scanned or image-only PDF with an empty text layer, a document that is password-protected or export-restricted, a file whose extension does not match what is inside it, or something the upload form simply does not accept. It is a read failure at the level of bytes. It has not looked at your experience and found it wanting.
One boundary before we go further, because two different questions get mixed together constantly. This page is about how the file itself breaks on the way in. Whether an automated system then filters you out on the content is a separate argument, and I made it in the piece on whether an ATS auto-rejects CVs. I am not going to restate it here.
And the concession, up front rather than buried at the end, because it is the strongest objection to the entire page. You should not have to design your CV around software that cannot read a two-column layout. That is an engineering failure on the vendor side, not a candidate failure. Someone who lost a callback to a reading-order bug did nothing wrong, and nobody should have to learn document internals to apply for a job. I am writing the page anyway, for one narrow reason: knowing costs you nothing, and the rejection email is never going to tell you.
Your CV is a picture. The parser wants a database row.
A PDF stores glyphs at coordinates, not structure. That single sentence explains most of what follows, so here is what it means in plain terms. A PDF page is a set of drawing instructions: put this character, in this font, at this x and y position on the page. It does not say "this is a heading", "this is a table cell", "this block is the sidebar". Unless the file carries an accessibility tag tree, which most CVs exported from a design tool do not, that information exists only in your eyes.
So an extractor has to reconstruct it by inference. It groups glyphs into words by looking at the gaps between them, groups words into lines by their shared baseline, and groups lines into blocks by proximity. Each of those steps is a guess that is right most of the time. Every failure further down this page is one of those guesses going wrong on a layout that made the guess hard.
A DOCX is a different animal. Underneath, it is a zip of XML in which a paragraph is a paragraph element, a table is a table element, and a heading carries a named style. The structure is stated rather than inferred. That does not mean you should always send Word. Plenty of parsers handle PDF perfectly well, a PDF looks the same on every machine and a Word file does not, and quite a few employers accept only one of the two. Follow the posting's instruction first, always. What is true is narrower: a DOCX hands the parser structure it would otherwise have to guess at.
The other half of the job is mapping. Once there is a text stream, the system tries to fill in fields. These are the ones that matter, and every failure mode below is a failure of one of them.
- Name
- Contact details: email, phone, location
- Employer, per role
- Job title, per role
- Start date and end date, per role
- Skills
- Education and qualifications
You have already seen the output of this mapping without being told that is what it was. When an application form makes you upload the file and then re-type the same three jobs into boxes, the boxes that arrived pre-filled are the mapping showing its work, and the boxes that arrived wrong are it failing in front of you. Whether that step means a human is checking anything is a different question, and I answered it in the piece on uploading your CV and then filling out the form anyway.
"The sidebar gets read in the middle of your work history"
That line is from a practitioner posting on r/resumes who said they parse CVs professionally and described what broke across a sample of 3,835 files they had processed. I will come back to how much weight that figure can carry. The sentence itself needs no sample to stand up, because it follows directly from how reading order gets reconstructed, and it is the single most expensive failure on this page.
Picture the layout almost every modern template ships: a narrow left column with skills and languages, a wide right column with your work history. On screen the two columns are obviously separate. In the file they are just glyphs at coordinates, and glyphs in the left column sit on the same horizontal baselines as glyphs in the right column. An extractor that groups by line, rather than detecting the column boundary first, will emit them together.
Read the second block as a machine would. The line that should carry your job title now reads "Python Financial Controller". A field mapper looking for a title on that line gets a title with a programming language welded to the front of it. Your skills are no longer a list, they are the first word of four unrelated lines. And if the extractor instead groups by block and drops the sidebar in wherever proximity suggests, the skills column can land between two jobs, so the dates that follow it attach to the wrong role. That is the mechanism behind a CV that shows the right ten years of experience on screen and the wrong ones in the database.
What it feels like
They read my CV and decided I was not good enough.
What may have happened
A column boundary was not detected, so the title field for your most recent role arrived with a skill glued to the front and your dates attached to the job below it.
Same file, same experience, same evening spent on it. Only one of these two versions tells you what to change.
The honest caveat: plenty of parsers do detect columns correctly, and I cannot tell you in advance which one is on the other end of any given upload. So the advice is not "two columns will destroy you". It is narrower and more defensible. A single-column layout removes the ambiguity instead of betting on it being resolved well. You lose nothing that a recruiter values, because nobody has ever been hired for a sidebar.
Flattened tables, skill blobs, and damage at the character level
The second reported failure from that same thread was a skills section flattened into one blob, and tables are usually the cause. A table gives the reader meaning through the grid: this cell pairs with that cell. In an extracted stream the cell boundaries are gone, and what is left is a run of words in whatever order the cells were walked.
Every pairing is now guesswork, and it gets worse downstream. Skill matching generally works by looking for known terms in the text. A term that has been fused into a longer string, or split across what the extractor thinks is a line break, may simply not be found. You had the skill on the page. The lookup did not see it, and nothing anywhere reports that.
Then there is the character level, which is the part almost nobody writes about. Custom bullet glyphs from an icon font often come out as an unmapped character or as nothing at all. Ligatures are the sharpest example, and I know this one first-hand because it cost me a week on careerify's own PDF extractor. A ligature is one glyph that draws two characters at once, the way many fonts draw fi as a single shape. In one common Windows font, our extractor handed that glyph back as a null character, so the word arrived with a hole in the middle. On screen the CV was flawless. In the extracted stream a word was broken, and nothing in the file announced it.
Almost everything on this page is invisible from your side. The file looks correct because you are looking at the drawing. The parser is looking at the instructions.
The parts of your CV the parser may never see
Reading order and tables scramble what is there. This section is about content that does not make it into the stream at all, which is worse, because a scrambled field can still be found by a human skimming and a missing one cannot.
| What is on the page | What the parser gets | What removes the ambiguity |
|---|---|---|
| Name and contact details in the page header or footer | Header and footer content is a common drop point. It sits outside the main text flow, and some extractors skip it deliberately because on other document types it is repeated furniture. | Put your name, email and phone number in the body of the first page, above everything else. |
| Text inside a logo, an icon, a photo, or a skill rating bar | Nothing. An image is pixels. There is no text to extract, and no parser recovers it without running character recognition, which most do not. | Write every claim as real text. Rating bars and star ratings carry no verifiable information anyway. |
| A floating text box or a drawing shape | It depends entirely on the export. The content may land at the very start, at the very end, or nowhere. | Keep the content in ordinary paragraphs in the main flow. |
| A section heading like "My Journey" or "Where I have been" | Section recognisers match against expected heading vocabulary. A heading they do not know can leave the whole section under it unclassified. | Use the plain words: Experience, Education, Skills. Be original in the sentences, not in the labels. |
| Dates written as 23 to 25, Summer 2024, or a bare year | An ambiguous range is harder to attach to the right role, and a date the parser cannot resolve can attach to the neighbouring one instead. | Write the month and the full year, in the same format every time: Jan 2023 - Mar 2025. |
| A scanned page, a photographed page, or a CV exported as an image | An empty text layer. It leaves the extractor with nothing at all, which is why it is the first thing to rule out when a file will not read. | Always export from the source document rather than scanning or screenshotting it. |
Dates deserve one extra line because they are the quietest of the six. Your career history is a sequence of ranges, and the parser has to work out where each range begins, where it ends, and which employer it belongs to. Give it a month and a four-digit year, use the same format for every role, and use the same separator throughout. It reads as fussy. It is the cheapest fix on this page.
The mirror image of everything here is text that is present in the file but invisible on the page, which is exactly what the white-text keyword trick relies on. It is a bad idea for reasons that have nothing to do with parsing, and I set them out in the piece on the invisible prompt hack. Everything I recommend on this page changes the container, never the claims.
Different systems, different parsers, and how much the numbers can carry
Workday, Greenhouse, Taleo and Lever are distinct products with distinct parsers, and here is where I have to disappoint anyone who came looking for a table of vendor behaviour. I cannot tell you what any of them does internally. I have not tested them, their behaviour changes between versions and between customer configurations, and every confident public claim about a specific vendor's parser I have chased turned out to have no method behind it. Anyone selling you a per-vendor rulebook is guessing. What is safe to say is what makes them the same kind of product: each one has to turn a CV file into a stored record, which means extracting text and mapping it onto fields. How well any of them handles the hard cases described above, I cannot tell you.
That is also the honest answer to "which format is safest". There is no format, template or layout that guarantees a clean parse anywhere. There are only choices that leave less to be inferred. I would rather give you that than a rule I cannot defend.
Now the 3,835 figure, handled with the care it deserves. It is one person on Reddit, describing their own reported sample, in a thread where several commenters doubted the number was real. I am not going to launder it into "research shows", and I would rather you discounted it entirely than trusted it more than it can bear. Notice that nothing in the mechanism sections above depends on it. Reading order, flattened tables, empty text layers and unrecognised headings follow from how PDF and DOCX are built, and they would be exactly as true if that thread had never been posted. The sample tells you these failures are common. The file formats tell you why they happen.
One more thing worth stating rather than hiding, because it explains why the situation persists. From the employer side, a screening process that loses some good candidates is often treated as an acceptable cost of handling the volume. I am not going to be outraged about it here; I am telling you because it sets your expectations correctly. The fix is not going to arrive from the vendor in time to help your next application, which is why it has to happen on your file for now.
The product paragraph, once, so you can weigh it against everything above. careerify has a free check at the link below: no account, no card, three checks per IP address in 24 hours. It parses your real uploaded PDF or DOCX the way any other system would have to, then compares what it got against the advert you paste in, and shows you which of the advert's terms came through from your file and which did not. That is an inspection, not a fix. If a term you know is on page one comes back as missing, you have found one of the failures on this page. The rest of what careerify does, tailoring a stored master CV to a specific advert, is bounded by facts you entered yourself and cannot invent a role, an employer or a number you did not give it.
The short answer
If you quote one paragraph from this page, quote this one:
An ATS parser does not read your CV the way you see it. It extracts a linear text stream from the file, then tries to map that stream onto database fields: name, contact details, employer, job title, dates, skills. Anything whose meaning lives in the visual layout rather than in the text order can be reordered, merged into a neighbouring field, or dropped before a human ever opens it. A two-column sidebar can be read into the middle of your work history, so dates attach to the wrong role. A skills table can arrive as one unbroken string. A name in a page header can be missed entirely. Text inside an image is not extracted unless the system runs character recognition, and most do not. Behaviour differs by vendor and by version, so no format or template guarantees a clean parse. A single-column layout, plain section headings and unambiguous dates remove the ambiguity rather than fixing a guaranteed failure.
Questions people actually ask about this
What does an ATS parser actually do to my CV file?
It extracts a linear stream of text from the file and then tries to map that stream onto database fields: name, contact details, employer, job title, start and end dates, skills, education. Meaning that lives in the visual layout rather than in the order of the text can be reordered, merged into a neighbouring field, or lost on the way in. Every failure people describe, from a skills list landing inside a job entry to a missing phone number, is one of those field mappings going wrong.
Why did I get "we couldn't read your file"?
Because the extractor could not get usable text out of the file. The cause to rule out first is a scanned or image-only PDF with an empty text layer. Others are a password-protected or export-restricted document, a file whose extension does not match its actual contents, or a format the upload form does not accept. It is a read failure at the level of the file. Nothing in that message is a judgement on your experience, and re-exporting from the original document usually resolves it.
Does an ATS read two-column CVs?
Some parsers reconstruct columns correctly and some interleave them, which is how a sidebar skills list ends up inside a job entry with the wrong dates attached to it. The behaviour differs by vendor and by version, and you cannot see which one is on the other end of an upload. So a single column does not fix a guaranteed failure, it removes the ambiguity. That is a smaller claim than most advice makes, and it is the one I can defend.
PDF or Word for an ATS?
A DOCX carries explicit structure: paragraphs, tables and headings exist as named objects in the markup. A PDF stores glyphs at coordinates, so reading order has to be reconstructed by inference. That is a real difference, but it does not mean always send Word. Many parsers handle PDF perfectly well, a PDF looks identical on every machine, and some employers accept only one of the two. Follow the posting's instruction first. If there is no instruction and your layout is complicated, DOCX leaves less to be guessed at.
Will my name and contact details in the page header get read?
Sometimes, and that is the problem. Header and footer content sits outside the main text flow and is a common drop point, partly because on other document types it is repeated furniture that extractors are built to skip. If your name, email and phone number exist only in the header, you are betting your contact details on that behaviour. Put them in the body of the first page instead. It costs you nothing visually.
How can I see what a parser gets from my CV?
Do it yourself first, for free: open your CV, save or export it as plain text, and read the result. Everything that survives is roughly what an extractor has to work with, and the order in which it appears is the order the fields get guessed from. Copying the file into a plain text editor works nearly as well. If you also want to know whether a specific advert's terms came through, careerify runs a free check against a job ad without an account, three checks per IP address in 24 hours, and shows which of the advert's terms it found in your file and which it did not.
Read next
- Does an ATS auto-reject CVs, or is that the wrong question
- Why you upload your CV and then fill out the same form anyway
- How to judge an ATS CV checker, and what the scores mean
If you want to know whether your file survived the trip, take the advert you were about to apply to and check which of its terms came through from your CV and which did not. If something you know is on page one comes back missing, you have found one of the failures on this page. No account, three checks per IP address in 24 hours. Check your CV against a job advert.