Why a resume can fail before a human ever opens it
Most job seekers picture an ATS (Applicant Tracking System) as a strict gatekeeper that either "passes" or "rejects" a resume. In practice it's closer to a database with a parser bolted on: the system tries to convert a PDF or Word file into structured fields — name, contact info, work history, skills — and if the parser guesses wrong, a recruiter searching for "5 years Python" or "B2B SaaS marketing" simply never finds you, even though the words are sitting right there on the page.
The failure almost always happens at parsing time, not scoring time. Here are the patterns that break parsers most often, in order of how often they show up in real resumes:
- Multi-column layouts. A two-column resume (skills sidebar + main content) often gets read left-to-right across both columns instead of down each one, scrambling a job title into the middle of a bullet point from the sidebar.
- Tables. Table cells are frequently skipped entirely or flattened into an unreadable single line, which is why "skills tables" — a popular resume-template feature — are one of the most common silent content losses.
- Headers and footers. Contact information (email, phone, LinkedIn URL) placed in a document header or footer is invisible to many parsers, because header/footer regions are a separate part of the file format from the body text.
- Graphics, icons, and logos used as content. A phone icon next to a phone number, or a skill bar rendered as a graphic instead of text, contributes zero parseable text — the parser sees an image, not a number.
- Text boxes. Content placed in a floating text box (common in "designer" resume templates) can be extracted out of reading order or dropped, especially in older parsing engines.
- Nonstandard section headers. "Where I've Made an Impact" instead of "Experience," or "The Toolkit" instead of "Skills," can prevent a parser from mapping content into the field a recruiter is actually searching.
- Fancy or embedded fonts and scanned/image-based PDFs. If a PDF is actually a photograph of text (a scanned document, or an export that flattens text into an image), there's no text layer to extract at all — the parser gets nothing.
- Dense abbreviations without the full term. Listing only "GCP" without ever writing "Google Cloud Platform" once means a keyword search for the spelled-out term won't match, even though a human would read them as identical.
None of this means "avoid all formatting." It means: keep the underlying document a single reading column, put contact details and section headers in the body text (not headers/footers or graphics), and use standard section names once even if you also use a creative label alongside it.
What "ATS score" tools like Jobscan actually check
Commercial ATS-optimization tools (Jobscan and similar products) generally combine two different checks into one score: a format-compliance check (did the parser likely choke on columns, tables, or headers?) and a keyword-match check (does the resume text contain the hard skills, tools, and phrases that appear in the job description?). The keyword-match half is the more actionable one for most job seekers — it's the difference between a resume that says "led backend development" and a job description that specifically asks for "Python," "PostgreSQL," and "distributed systems," none of which appear anywhere in the resume text.
What @vustCvBot's fit-check actually does — and what it doesn't
This is the part worth being precise about, because it's a genuinely different mechanism from a Jobscan-style resume-upload tool, not a clone of one.
@vustCvBot does not accept a resume file upload for this check. The job-match fit-check works off a public LinkedIn profile URL compared against a public LinkedIn job posting URL — both fetched live, not a document you attach. If your LinkedIn profile and your resume tell the same story (most serious candidates keep them close to in sync), the same keyword gaps that would show up in a resume-vs-JD comparison show up here too, expressed against your live profile instead of a file.
What comes back, concretely:
- fitScore — a 0–10 number for this specific job, not a generic profile-quality score.
- matchingStrengths — 3–4 evidence-backed points where your profile already lines up with the posting (e.g., "led migration work matching the 'distributed systems' requirement").
- missingQualifications — 3–4 gaps, explicitly split between things genuinely absent and things that are simply not visible on your public profile (the model is instructed not to claim you lack a skill just because your profile text is sparse).
- actionPlan — 3–4 prioritized next actions: what to fix on the profile first, what to lead with in an application, what to prepare as proof.
- interviewPrepAngles — 2–3 likely interview themes tied to the job's requirements and the weaker parts of your evidence.
This is a semantic, recruiter-lens keyword and positioning check for one specific job — not a simulation of any particular company's actual ATS software, and not a document-formatting scanner that inspects your PDF for tables, columns, or embedded fonts. If your resume has a parsing problem (see the eight patterns above), this check won't catch that directly, because it never touches the file. What it will catch is the keyword and positioning gap that survives even a perfectly-formatted resume.
How to run it
- Open @vustCvBot in Telegram (button below) and send your public LinkedIn profile URL.
- Send the public LinkedIn job posting URL you want to compare against.
- Confirm the job-match check. It costs 5✦ on the Free and Core plans, or is included at no extra charge on Pro.
- Read the fit score plus the four structured sections above. Re-reading the same result within 24 hours doesn't recharge.
A worked example
Say the job posting asks for "3+ years building and shipping backend services in Python, comfortable owning a service end-to-end, some exposure to distributed systems." A profile whose headline reads "Software Engineer" with an About section that never names a language or a system might come back with:
- matchingStrengths: "Two years of backend ownership at [Company] matches the 'own a service end-to-end' requirement."
- missingQualifications: "Python isn't named anywhere in the visible profile text, even if it's the actual day-to-day language" — flagged as not evidenced, not assumed absent.
- actionPlan: "Add 'Python' and the specific system (e.g., 'payments service') to the headline or top of the About section before applying — this is the single highest-leverage fix for this posting."
That last line is the practical payoff: a keyword gap check tells you exactly which word to add, and where, rather than a vague "improve your profile" verdict.
Fixing what the check finds
The fit-check identifies the gap; Profile Polish (a separate action inside the same bot) is the fix. It rewrites the headline, About section, and up to four recent experience entries, and separately returns skillsToAdd (3–8 concrete, evidence-warranted skills) and keywordOptimization.missingKeywords (4–8 role-relevant terms absent from the profile) — the same category of missing-keyword signal, turned into a specific to-do list. It also strictly bans filler language like "passionate," "results-driven," "team player," "detail-oriented," and "synergy" — words that add zero searchable signal and read as generic to both algorithms and human reviewers.
A pre-flight checklist before you apply
Before sending a resume into any application system, run through this in order — it takes about five minutes and catches the failures above before they cost you a callback:
- Copy-paste test. Select all the text in your PDF and paste it into a plain text editor. If sections are out of order, contact info is missing, or whole blocks vanish, a parser will likely see the same broken output.
- Single-column check. Open the document and trace your eye down the page in one straight column. If your eye has to jump between a sidebar and a main column, so does (unreliably) the parser.
- Header/footer check. Confirm your name, phone, email, and LinkedIn URL live in the main body of the first page, not in a page header or footer region.
- Section-name check. Confirm you have at least one instance of the standard labels — "Experience," "Education," "Skills" — even if you also use a more creative label somewhere else on the page.
- Acronym check. For every abbreviation in your Skills section, confirm the full term appears at least once somewhere on the page.
- File-type check. Save and re-open the exact file as a PDF, not a scanned image or a photo of a printed page — if you can't select individual words in the PDF viewer, there is no text layer to extract.
Common questions this raises
A frequent point of confusion is assuming a higher "ATS score" from any tool guarantees an interview. It doesn't — and no honest tool claims it does. A perfect keyword match still loses to a stronger candidate, and a company's specific ATS configuration (which fields it weighs, which knockout questions it applies) is never fully visible from the outside. What a keyword and formatting check reliably does is remove the avoidable losses — the resume that never got read because a column scrambled the parsing, or the application that never surfaced in a recruiter's search because the exact term from the job posting never appeared on the page. That's a real, measurable improvement in your odds, even though it's not a guarantee.
Where this fits next to a real company's ATS
No public tool — commercial or free — can tell you exactly what a specific employer's specific ATS software will do with your specific resume file, because each company configures its own parser, keyword weighting, and knockout questions. What every serious ATS-adjacent tool can honestly do is the two things covered here: name the formatting patterns that break parsers in general, and surface the keyword and positioning gaps between your public profile and one real job posting. Use the checklist above to keep your resume file parseable, and use the fit-check to make sure the words that matter for a specific role are actually present on the page a recruiter — or a search index — will read.