12 min read
Offers land low when the comp band was set before your interview, your anchor was missing or too low, or the role level in the system sits below the title you discussed. That's the pattern. The rest of this page shows how to tell which cause is yours and what to send back instead of a venting email.
You didn't misread the posting. You got a number that doesn't match the conversations you had, and now you're wondering whether you're being lowballed or whether the process never had room to move. Before you draft a counter, check your resume for free against the same req. You're confirming whether your file imported at the level you think you interviewed for, not chasing a magic salary phrase.
Job searching while bills stack up is brutal. A disappointing offer isn't proof you're worth less. It's usually a system default you can challenge once you know which field locked the number. I've screened offers in Workday where the candidate discussed a senior title while the profile still read mid-level from an old upload.
Below you'll see the symptom recruiters react to, three causes behind it, how to spot yours, and the fix for each. When you're packaging your ask, generate a cover letter that uses the same title string as your resume so nothing contradicts the level you're negotiating.
Quick Wins
- Ask the band ceiling before your final round, not after the offer arrives.
- State your target range in writing right after the recruiter screen.
- Match resume title and scope to the req level before you interview.
- Counter once with a fact, a number, and a copy-paste script below.
The symptom: the offer reads like a different job
Recruiters see the same disappointed reply in the inbox every week. The candidate loved the conversations. The offer base sits at the bottom of the range they assumed, or below a number they mentioned in passing three weeks ago.
The offer letter title and the Workday job code often tell the real story before base pay does. You discussed Senior Product Analyst. The PDF says Product Analyst II. The base pay matches Analyst II, not Senior. That gap feels personal. It's usually a level field that never updated after your resume imported.
Another version: you never gave a number, so the system defaulted to your application field or your current pay from an earlier form. Recruiters aren't guessing your worth from vibes. They're pulling the anchor already sitting in the req.
A third version: finance approved a band for the role in Q1. Headcount opened in Q3 with the same band even though the market shifted. The recruiter can nudge inside the band. They can't invent a new band without a reason the approver accepts.
Why salary offers come in lower than expected is rarely one villain. It's which of those defaults fired on your file. Fix the default, then send the counter. Pep talks don't move Workday fields.
For how parsed files get scored before anyone discusses pay, read how hiring software detects resume fit . Level and scope in the text set the band more often than interview charm.
Three causes, how to spot yours, and the fix for each
Cause 1: The comp band locked before you interviewed
How to tell: the recruiter mentions the band is set, or they say they need VP approval for anything above a narrow range. The req posted months ago with a salary range that already looks stale.
Before: You wait for the offer, then email "I was expecting more based on my experience" with no new fact attached.
After: You reply with a competing written offer, a level correction, or a scope change documented in writing. "The req lists Senior Operations Analyst. The offer letter says Operations Analyst II at base X. My background matches the Senior scope we discussed on [date]. Please confirm the job code before I respond to base pay."
The fix: give the recruiter a reason the system can log. Competing offers, corrected level, added scope, or sign-on budget are the usual keys. Ask what documentation they need before you name your number.
Cause 2: Your anchor was missing or too low
How to tell: the application asked for current pay and you filled it in. Or you said "flexible" on the recruiter screen and never followed with a range. The offer hugs that anchor even when the role scope grew in later interviews.
Before: A mid-level marketing coordinator whose application listed current pay at fifty-two thousand. Offer arrives at fifty-four thousand. No competing anchor on file.
After: Same candidate sends: "Based on the scope we covered (owning paid social budget and vendor contracts), my target for this level is sixty-two to sixty-six thousand. I'm open to structuring part as performance bonus if base is constrained."
The fix: set your range in writing after the screen, not only in your head. Tie the number to scope from the job, not to frustration. If you already lowballed yourself on the form, address it directly with market scope language rather than pretending the field was blank.
Cause 3: Role level in the system is below the title you discussed
How to tell: interviewers used a senior title verbally, but your resume headline still says the old level. Workday shows Analyst while the hiring manager said Senior Analyst on the call.
Before: Software engineer resume headline "Developer" while applying to Senior Software Engineer. Offer imports at mid-level band.
After: Headline "Senior Software Engineer" with a first bullet proving scope: "Owned checkout service for twelve engineers across three squads." Level field and band move with the title when recruiters reclassify the req.
The fix: align title, headline, and first bullet to the req before the final interview. Ask the recruiter which job code they are using. For title mismatches that cap level, see how recruiters interpret job titles .
Copy-paste block: counter-offer email script
{`Subject: [Job Title] offer – [Your Name] – comp discussion
Hi [Recruiter Name],
Thank you for the offer for [Job Title] on [date]. I'm excited about the team and the scope we discussed on [interview date].
I want to align on level before I respond to base pay. The offer letter lists [title on letter] at [base offer]. The posting and our conversations referenced [title discussed]. My background includes [one proof line from your resume].
Based on that scope, my target base is [your number]. [Optional: I have a written offer at [X] from [Company] if true.]
I'm ready to sign this week if we can close the gap on [base or sign-on]. What documentation do you need from me to take this to approvers?
Best,
[Your Name]`}
Send once during business hours. One thread. One ask. If they need a day to check comp partners, give them the day. A second follow-up a week later is fine. Four emails in forty-eight hours close the exception path.
Edge case: internal transfers sometimes inherit the old band until promotion paperwork clears. Ask whether you are on a new req or a conversion code. The counter language differs.
Edge case: contract-to-hire offers often sit below direct-hire bands on purpose. Clarify conversion salary triggers in writing before you accept the contract rate as "normal."
Edge cases that still cap the offer
Even with the right script, some walls don't move. Knowing which wall you're hitting saves a week of false hope.
Public sector or union steps. The grade is the grade. You can sometimes negotiate start step with specialized experience documented. You cannot negotiate outside the published scale because a private-sector counter exists.
Equity-heavy startup packages. Cash base may be fixed while option grants flex. Ask for the grant size and refresh policy in writing instead of hammering base alone.
Geo pay tiers on remote roles. If the offer cites a location band you don't live in, fix the work location field before you argue numbers. A remote band tied to a low-cost state caps pay until HR updates your profile.
Sign-on budget already spent on the prior hire. Teams get one sign-on line per quarter sometimes. A recruiter who cannot move base may still move start date, bonus, or title when sign-on is gone.
This won't fix applying to roles where your scope genuinely reads below the level. It stops a qualified candidate from accepting Analyst pay on a Senior file because the code never updated.
Before: Operations lead accepts Analyst II pay because the letter arrived on Friday and they feared losing the slot.
After: Same lead sends the script Monday morning, documents team size they would manage, and gets reclassified to Senior Operations Analyst with a new base before signing.
Recruiters are not offended by one clean counter. They're stuck when the counter has no fact they can paste into the approval form. Give them the paste.
If you already accepted verbally, you can still ask once in writing before signature. After signature, changes need a new approval cycle and goodwill you may not have.
Keep benefits questions separate from base in the first counter. Mixing fifteen topics in one email slows comp approval. Nail level and base first. Then discuss bonus, remote stipend, or start date in the same thread only if they invite it.
When a recruiter says "this is our best and final" quickly, ask what would have changed the outcome. You learn whether the band, the anchor, or the level was the blocker for the next req.
A low offer on a role you don't want is still data. You can decline without burning the bridge. Thank them, state the gap briefly, and leave the door open for future reqs at the right level.
Match level before you counter
Upload your resume and the posting to HireFlow's free ATS resume checker . Confirm your headline title, years of scope, and must-have keywords imported on the same lines recruiters see in Workday preview.
Then run score your job match on the same req. A low match score before you counter means the file still reads below the level you're negotiating. Fix the resume proof first so your number matches the story in the system.
Do this now: Check the offer letter title against your resume headline, run the match score, then send the counter script with one proof line from bullet one.
What to do now
Why salary offers come in lower than expected comes down to three system defaults: locked bands, missing anchors, and level codes below the title you discussed. Diagnose which one applies, then send one fact-based counter instead of debating your worth over the phone.
- Compare offer letter title to posting and resume headline tonight.
- Ask which job code the offer uses before you argue base pay.
- Send the copy-paste counter with one scope proof line.
- Run ATS check and job match on the same req.
- Wait one week for a second follow-up if needed, not four emails in two days.
Open the req you are negotiating. Run a free ATS check , fix any level mismatch in the file, and send the counter from a position the system can actually approve.
Read more
Frequently asked questions
Sometimes, but only with a documented reason the system accepts. A higher competing offer, a level change, or a sign-on budget line often unlocks movement. Asking for more money with no new fact usually hits a hard stop. Bring the fact first, then ask for the number.
When the form requires it, answer honestly or use the legal range field if your state allows. When it is optional, leave it blank and state your target range in the recruiter screen instead. A low current number imported into Workday becomes the anchor recruiters defend even when the market moved.
Treat it as a level mismatch, not a personality conflict. Ask which job code the offer ties to and what separates that level from the title on the req. A Senior Analyst offer on an Analyst code needs a level correction before you argue base pay. Fixing the code often moves the band automatically.
Yes, once, with a written counter tied to a fact. Silence reads as acceptance and closes the exception path. If they cannot move after one structured counter, you have a clean data point to walk or wait. Multiple emotional emails rarely unlock budget that a single documented ask could not.
It changes the level the file imports at, which sets the band. A resume that reads mid-level when you are senior caps the offer before anyone picks up the phone. Title alignment and scope in bullet one affect Workday level fields more than a salary paragraph ever will.
