DEV Community

Cover image for How ATS Parses Your Resume Contact Header
Muhammad Ali Mughal
Muhammad Ali Mughal

Posted on

How ATS Parses Your Resume Contact Header

Your contact block is the only part of your resume that a parser must get 100% right. A recruiter can forgive a clumsy bullet. Nobody can call a phone number that was parsed as "+92 300 123", and a Workday location filter cannot match a city it never extracted. Yet most contact headers are designed for looks: icons, pipes, a two-column banner, or the whole block tucked into the Word header area. Each of those choices is a small bet that the parser reads the page the way you do.

I build Smart Resume Analyzer, so I spend a lot of time looking at what extraction actually returns. I wrote this with help from AI tools and checked every command and claim myself. Every output below comes from files I generated and ran on my own machine today.

How do ATS parsers read your contact information?

Direct answer: Parsers extract plain text, find your name near the top, then match email, phone, location and URLs with patterns. Text inside Word headers, text boxes or icon fonts can be skipped or polluted, and phone numbers without a country code may not normalize. Put them in plain body text at the top, with a country code on the phone.

The fields your contact block feeds

Each field feeds something a recruiter or form depends on:

Field Typical pattern the parser looks for What breaks it What it feeds downstream
Full name First large line of body text Name only in a page header, a logo image, or ALL CAPS with spacing ("S A R A") Candidate record title, duplicate detection
Email local@domain.tld Icon glyph glued to the address, line break inside the address Application login, every recruiter email
Phone Digits with an optional + country code Local format with no country, two numbers on one line Click-to-call, SMS scheduling tools
Location City, region, country Street address only, "Remote" with no base city, a map pin icon Location and commute-radius filters
Links linkedin.com/in/..., github.com/..., portfolio URL Hyperlinked words like "LinkedIn" with no visible URL Profile enrichment, recruiter click-through

The last row catches many developers. A PDF can keep the link target, but plenty of extractors only keep visible text. If the visible text is just "GitHub", the parser gets the word, not your profile.

What I saw when I ran the extractors

I built three small test files with Python (python-docx and reportlab) and ran them through common open-source extractors. These are not any vendor's parser. They show what a text extraction layer, which every parser starts with, can do to your header.

Test 1: contact details inside the Word header area. The DOCX has the full contact line in the page header and the job content in the body. Reading body paragraphs with python-docx, and exporting to plain text with LibreOffice (soffice --convert-to txt), both returned the same thing:

Senior Backend Engineer
EXPERIENCE
Acme Payments, Backend Engineer, Jan 2021 - Present
Enter fullscreen mode Exit fullscreen mode

The name, email, phone, city and LinkedIn URL are gone. Some commercial parsers do read header areas and some do not, and you cannot tell which one a given employer runs. Moving the block into the body removes the gamble.

Test 2: icons and a two-column banner in a PDF. Name on the left, contact details in a right-hand column with ✉, ☎ and ⌂ symbols. pdftotext -layout returned:

SARA KHAN                                             ‚úâ sara.khan@example.com
                                                      ‚òé +92 300 1234567
Senior Backend Engineer
                                                      ⌂ Karachi
                                                      in/sarakhan
Enter fullscreen mode Exit fullscreen mode

The job title is now wedged between the phone and the city, and every contact token carries a symbol prefix. Here the symbols came from a normal Unicode font, so they at least extract as characters. Icon fonts often map glyphs to Private Use Area code points, which extract as unreadable characters or nothing at all. And "in/sarakhan" is not a URL any pattern will recognize as LinkedIn.

Test 3: phone normalization. I ran the same numbers through Google's phonenumbers library (v9.0.42), the kind of normalization step many systems use to store E.164 numbers:

'0300-1234567'         region=None  -> ERROR (0) Missing or invalid default region.
'0300-1234567'         region=PK    -> +923001234567  valid=True
'+92 300 1234567'      region=None  -> +923001234567  valid=True
'(415) 555-0132'       region=None  -> ERROR (0) Missing or invalid default region.
'+1 415 555 0132'      region=None  -> +14155550132  valid=True
Enter fullscreen mode Exit fullscreen mode

A local number only works when the system guesses your country correctly. With the + country code it parses with no guess at all. If you apply across borders, which many engineers in Pakistan, India and the Gulf do, the country code is not optional.

A vintage rotary telephone beside a closed address book on a wooden desk, representing contact details a parser must read correctly
AI-generated image.

How each ATS uses what it extracts

Vendors do not publish parser internals, so this table sticks to what you can observe as an applicant:

Platform Where contact data shows up What I observe What to do
Workday "My Information" step, autofilled after you upload a resume Name, email, phone and address fields are prefilled; country and phone code are separate dropdowns Check every prefilled field; fix the phone country code by hand
Greenhouse Name, email and phone are usually separate form fields; resume is attached The form fields, not the parse, become the candidate record Type them exactly as on the resume so search and dedupe agree
Lever Apply page can autofill from the uploaded resume Autofill quality tracks how clean the top of the document is Keep the first 5 lines plain text
iCIMS Parsed into a structured candidate profile Header and text-box content is often missing from the profile Never put contact details in headers or text boxes
Taleo Profile fields filled from the resume or entered by hand Older flows expect simple layouts; manual entry is common Keep a plain-text copy to paste into each field

To find out which platform a posting uses before you apply, see my guide on telling which ATS a job uses from the link.

Weak vs ATS-optimized contact headers

Rewrite 1: the designer banner

Weak:

[Header area] SARA KHAN  ‚úâ sara.khan@example.com | ‚òé 0300-1234567 | üìç Karachi | LinkedIn | GitHub
Enter fullscreen mode Exit fullscreen mode

ATS-optimized (in the body, first lines):

Sara Khan
Senior Backend Engineer
Karachi, Pakistan (open to remote)
+92 300 1234567 | sara.khan@example.com
linkedin.com/in/sarakhan | github.com/sarakhan
Enter fullscreen mode Exit fullscreen mode

Why it works: body text, no glyphs, a country code, a city and country, and visible URLs. The pipes are fine here because each side is a complete, recognizable token.

Rewrite 2: the remote-only location

Weak: Location: Remote

ATS-optimized: Lahore, Pakistan (open to remote, UTC+5)

Location filters need a place. "Remote" is a work arrangement, not a location, and a recruiter filtering on a country or time zone will skip a profile with no city.

Rewrite 3: the hidden links

Weak: Portfolio · GitHub · LinkedIn (each word hyperlinked)

ATS-optimized: sarakhan.dev | github.com/sarakhan | linkedin.com/in/sarakhan

If a human prints the PDF, or a parser keeps only visible text, the URLs survive.

Where the contact block should go

Placement Survives body-only extraction Readable in two-column layouts My verdict
First lines of the body, single column Yes Yes Use this
Word/Google Docs header area No, in my test Yes Avoid
Text box or shape Often not Unpredictable Avoid
Right-hand sidebar column Yes, but interleaved No Avoid for contact data
Image or logo with text No No Never

The 7-step contact header diagnostic

  1. Extract the text yourself. Run pdftotext -layout resume.pdf - (poppler-utils), or paste the PDF into a plain-text editor. If your name is not on line 1, a parser may not find it either.
  2. Check the header area. In Word, open the header. If anything important lives there, move it into the body.
  3. Search for odd characters. Look for boxes, question marks or blank gaps where icons were. Delete every icon.
  4. Normalize the phone. Write one number with a + country code. Remove second numbers unless the role demands it.
  5. Write the location as a filterable place. City, country, plus "open to remote" or "open to relocation" if true.
  6. Make every link visible. Use bare domains like github.com/you, and click each one to confirm it is public, not behind a login.
  7. Compare against the form. After a Workday or Lever autofill, compare each field with your resume before you click Next.

Then run the file through an ATS parser preview to see the fields as a parser splits them. If other sections also come out scrambled, start with resume formatting mistakes that break ATS parsing, then check how ATS parsers normalize your skills.

Frequently asked questions

Should I put my contact information in the header of my resume?

Not in the Word or Google Docs header area. In my test, body-only extraction dropped it completely. Put the contact block in the first lines of the body. It looks the same to a human and removes the risk.

Do icons for email and phone hurt ATS parsing?

They can. Symbols attach to the token next to them, and icon fonts often extract as unreadable characters. Labels are optional; plain values are usually clear enough on their own.

Should I include my full address on a resume?

No. City and country are enough for location filters and recruiter decisions. A full street address adds privacy risk with no screening benefit.

How should I write my phone number for international applications?

Use one number in international format, such as +92 300 1234567. Without a country code, a normalization library has to guess your region and may reject the number.

Should I list "Remote" as my location?

List a city and country first, then add "open to remote". Location filters and time-zone checks need a real place to match against.

Do I need to write out the full LinkedIn URL?

Yes, a short visible form like linkedin.com/in/yourname. A hyperlinked word may lose its target in plain-text extraction, and a visible URL also works on paper.


Follow & Connect

Top comments (0)