The most common reason people don't negotiate: "I don't have anything else lined up, I have no leverage." This is wrong in two ways.
First, you DO have leverage. The company has spent 4-8 weeks interviewing you, ranking you against other candidates, and getting your offer approved through finance. The cost of you walking away is real, they go back to the pool, lose 4-6 weeks, and potentially the role's headcount budget. They want you to accept.
Second, you don't need a competing offer to anchor a number. Other anchors that work: Levels.fyi / Glassdoor data: "Based on public data for this role and level at companies of similar size, the median total comp is $X. Your offer is at $Y. Can we close the gap?" Your current TC (calculated honestly): "My current base + last bonus + unvested equity I'd be walking away from totals $X. I'd need to see at least $Y to make the switch make sense." Cost-of-change: "I'd be moving from [city A] to [city B], which is a $25K higher cost of living. Can the offer reflect that?" Specialization premium: "The role specifically calls for [scarce skill]. The market for that skill is currently $X."
The script: pick the anchor that's most defensible for your specific situation, name a specific number you want, and give the recruiter ONE thing to take back to the team. Don't pile up 5 asks. One clean ask gets answered. Five asks get evaluated as "high-maintenance candidate."
Yes, this works without a competing offer. Most negotiation rounds in tech happen without one.