Concept
Salary negotiation feels adversarial to a lot of engineers, which is exactly why so many leave real money on the table, the useful reframe is that a company extending an offer has already decided they want to hire you, meaning the negotiation happens from a position of real leverage (replacing a candidate deep in process is costly and slow for them), and a reasonable, well-justified counter almost never causes an offer to be rescinded. This topic covers the negotiation as a sequence of specific moments, the early salary-expectations question, the offer call itself, and the counter, each with its own concrete script, because vague advice like "just negotiate confidently" doesn't actually help in the moment when the recruiter is on the phone asking a pointed question.
The early "what's your expected salary" question
Recruiters often ask for salary expectations early in the process, sometimes on the very first screening call, before you have a role-specific offer, before you know the full compensation structure (base, bonus, equity, refresh grants), and before you have leverage from a competing offer. Answering with a specific low number anchors the entire rest of the negotiation around that number; answering with a specific high number risks getting screened out before you've had a chance to demonstrate value. The general best practice is deflecting to a range grounded in market research rather than a personal number, and redirecting toward getting more information first:
Recruiter: "What are your salary expectations for this role?"
WEAK: "I'm currently making $120k, so somewhere around there would
be great." (anchors the entire negotiation low, and reveals
information that doesn't help you)
BETTER: "I'd love to learn more about the full scope of the role and
the total compensation structure before landing on a specific
number, based on my research for similar roles at companies
this size, I'd expect total comp somewhere in the
$X-$Y range, but I'm flexible depending on the details."The "better" version does three things: it doesn't reveal current/past salary as an anchor, it demonstrates the candidate has done real market research (a credibility signal, not just a stalling tactic), and it gives a RANGE rather than a single number, which preserves room to negotiate upward once a real offer is on the table. If pushed for a single number, giving the top of a well-researched range, not the middle, is the better default, it's far easier to come down from a number stated with a range's flexibility than to go up from a single number already given.
Doing the market research before any of this matters
None of the scripts above work without real numbers behind them, a range pulled from nowhere is not credible and won't survive a recruiter's own market knowledge. Concrete sources worth checking before any salary conversation: public compensation-data aggregators for the specific role, level, and location (not just a generic "software engineer" average, which spans an enormous range across seniority); the company's own published bands if available (some companies now disclose these, especially where required by pay-transparency laws); and, if available, direct conversations with people in similar roles at similar companies, anecdotal but often more current and specific than aggregator data. The single most common research mistake is anchoring on a single aggregator's number without cross-checking it against at least one other source, since different aggregators sample very differently (self-reported vs. verified offer data) and can diverge substantially for the same role.
Negotiating an actual written offer
Once a real, written offer exists, the leverage situation changes completely, the company has invested significant time and made an internal decision to extend the offer, and a well-reasoned counter is now a normal, expected part of the process, not a confrontational move. The core negotiation script has a consistent shape: express genuine enthusiasm first (this isn't a formality, it removes any ambiguity about whether the counter is a genuine interest-driven ask vs. a sign the candidate might walk), state the ask specifically (a number or range, not vague language like "more"), and back it with a concrete reason (market data, a competing offer, or specific factors about the role/scope that weren't reflected in the initial number).
"Thank you so much for the offer, I'm genuinely excited about this
role and the team. Based on my research for [role] at [level] in
[location], and a competing offer I'm currently evaluating at $X, I
was hoping we could get the base closer to $Y. Is there room to work
with me on that?"This script works because it leads with genuine enthusiasm (removing the "are they even interested" ambiguity), states a specific number rather than an open-ended "can you do better," and grounds the ask in something concrete and legitimate (market data and/or a competing offer) rather than an unsupported personal need. Notably, it also asks a genuine, collaborative question at the end ("is there room to work with me on that") rather than issuing an ultimatum, this framing matters because it signals the candidate wants to find a workable outcome together, not that they're threatening to walk over a specific number.
Negotiating without a competing offer
A competing offer is the strongest form of leverage, but its absence doesn't mean there's no room to negotiate, market-data-grounded asks work on their own, just somewhat less forcefully. In the absence of a competing offer, leaning more heavily on specific, researched market data (and, where relevant, specific unique qualifications or scope that make this candidate a stronger fit than a "typical" candidate at this level) still gives a legitimate basis for a counter, the key is that the ask still needs to be grounded in something concrete, not just "I was hoping for more."
Negotiating beyond base salary
Base salary is often the least flexible part of an offer (frequently tied to internal bands the individual recruiter/hiring manager can't unilaterally exceed), while other components can have more room: signing bonus (a one-time payment that doesn't affect the ongoing internal band), equity/RSU refresh amount, start date, and remote/relocation terms. A candidate who hits a genuine hard ceiling on base salary should explicitly ask about these other levers rather than assuming the negotiation is over, "I understand there may not be room on the base given the band, is there flexibility on a signing bonus or the initial equity grant instead?" is a common and reasonable follow-up.
Try It
Here's a weak response to a recruiter's early salary-expectations question. Identify what's wrong with it before revealing the analysis.
Recruiter: "So, what salary are you looking for?" Candidate: "Honestly whatever you think is fair, I just really want this job and I'm flexible on the number."
Solution
This response feels agreeable and low-friction in the moment, but it gives away all of the candidate's leverage for no benefit: it provides zero information constraining the eventual offer to anything favorable to the candidate, and worse, it can read as a signal that the candidate either hasn't done any market research or doesn't value their own market worth, neither of which helps in a negotiation that (implicitly) still happens even when a candidate declines to state a number, since the company will simply anchor on whatever number is easiest for THEM, with no counter-pressure from a candidate-stated range.
A stronger version still shows flexibility and genuine interest in the role, that part of the impulse is reasonable, but pairs it with an actual researched range: "I'm really excited about this role, and I want to find something that works well for both of us. Based on my research for similar roles at this level, I'd expect somewhere in the $X-$Y range for total comp, though I'm open to discussing the details once I understand the full scope." This keeps the collaborative, flexible tone the weak version was going for, while still anchoring the conversation around a real, researched number instead of ceding that anchor entirely to the other side.
Implement It Yourself
Using the frameworks in this topic, draft your own negotiation scripts for the two key moments below.
MOMENT 1, Early "what are your salary expectations" question:
Market research range for your target role/level/location:
$ _______ to $ _______ (cite at least 2 sources: ___________, ___________)
Your deflection + range script (adapt the "BETTER" template from
Concept, filling in your own researched range):
_______________________________________________________
MOMENT 2, Countering a written offer:
The offer's base salary: $ _______
Your target counter: $ _______
Your concrete justification (choose at least one):
[ ] Competing offer: $ _______ at ___________
[ ] Market data: ___________________________
[ ] Specific scope/qualification not reflected in the initial number:
_______________________________________________________
Your counter script (adapt the enthusiasm + specific ask + concrete
reason + collaborative close template from Concept):
_______________________________________________________
Self-check:
[ ] Does your script lead with genuine enthusiasm before the ask?
[ ] Is the ask a specific number/range, not vague language like "more"?
[ ] Is the ask backed by something concrete (data or a competing offer),
not just a personal preference or need?There's no single correct answer since this depends on your real target role and research, but if the justification section is empty, that's the gap to close (do the market research) before using this script in a real negotiation.
Common Mistakes
1. Anchoring on current/past salary
Volunteering a current salary number early in the process anchors the entire negotiation around it, especially if it's below market for the new role/level/location, the new offer often gets built as an increment over that number rather than around what the new role is actually worth.
2. Giving a single number instead of a range
A single stated number becomes a hard ceiling in practice, recruiters rarely offer meaningfully above a number a candidate has explicitly stated as their expectation. A range preserves room to land higher once real offer details are known.
3. Countering with no concrete justification
"I was hoping for more" with no market data, competing offer, or specific reasoning attached is a weak ask that's easy for a recruiter to deflect with a generic "this is our standard band for the level", a concrete, specific justification is what actually moves a number.
4. Treating a reasonable counter as adversarial and skipping it entirely
Some candidates accept a first offer outright out of a (usually incorrect) fear that any counter risks the offer being rescinded, in reality, a well-reasoned counter on an already-extended written offer is normal and expected, and companies budget for some negotiation room in most offers.
5. Fabricating a competing offer
Inventing a fake competing offer as negotiation leverage is both an integrity risk (recruiters sometimes ask for specifics, like the company name or a copy of the offer letter, and vague or inconsistent answers under that pressure can backfire badly) and unnecessary, well-researched market data alone is legitimate leverage without needing to be dishonest.
Best Practices
- Do real market research (multiple sources) before any salary conversation, a range without real data behind it isn't credible and won't hold up against a recruiter's own knowledge of the market.
- Deflect the early salary-expectations question to a researched range, not a personal current-salary number, and try to get more role/scope information before committing to specifics.
- When pushed for a single number, give the top of your researched range, not the middle, it's easier to come down than to go up later.
- Lead a counter-offer with genuine enthusiasm, state a specific ask, and back it with concrete justification (market data and/or a competing offer), this combination is what makes a counter land as collaborative rather than adversarial.
- If base salary hits a real ceiling, ask explicitly about other levers (signing bonus, equity refresh, start date) rather than assuming the negotiation has fully ended.
Performance Tips
- Negotiate over a scheduled call or in writing, not reactively in the middle of an unrelated conversation, a moment to prepare your specific numbers and script improves outcomes more than in-the-moment improvisation.
- Get the final agreed terms in writing (an updated offer letter) before resigning from a current role or declining other opportunities, verbal negotiation agreements can and do sometimes not make it into the final paperwork exactly as discussed.
- Practice saying your specific ask number out loud before the actual call, for many people, the biggest practical barrier to negotiating well is simply the discomfort of saying a specific number, which rehearsal meaningfully reduces.
