I did the math the other day, and was surprised to realize that there was a three year period in my career during which I raised my rates by 467%. This period, during which I had several career strategy breakthroughs, was precipitated by meeting my now-wife.
The rate increases were intentional, but what surprised me is how fast they compounded. So naturally, I did what any good engineer would do and spent way too long making a graph of those three years, which you can see below (Google Sheets link).
Some tl;dr context:
I'm a contract React developer living in the northeast United States. I work 95% remotely. Over those three years, I worked for companies all over the US and in a few other countries as well. I commanded my highest rates in New York and Boston, and my lowest rates in the EU.
The conclusion I reach in this post is that I severely undervalued myself for years because I lacked the knowledge and context to negotiate properly. My goal in sharing this information is to help you negotiate your own rate better.
This story takes place within the last ten years, but exact dates are obscured. The rates mentioned in this article do not reflect my current rates.
Finally, this post is an early release chapter of a book I'm writing in public, working title of How To Make More Money As A Developer. If you're interested in following along for more prerelease chapters and other info, you can sign up for the newsletter below:
Thanks for sticking around. Let's dive in!
Let's have another look at that graph:
Not shown: a very straight, boring line on the left at $30/hr spanning another three years.
As you can see, I took a couple of breaks, one from May to October of Year One, and the other from August of Year Two to January of Year Three. These breaks are interesting, because you can see that both times I returned to work after a break, my new rate was significantly higher than my previous one.
Both breaks mark mindset and behavior changes. While I am fairly sure that this is correlation and not causation, they are watershed moments nonetheless and bear further inspection.
As mentioned, I took the first break because I quit a long-term contract to go full-time on a business idea after meeting my future wife. The contract I took upon returning from this break marked the beginning of my contracting proper and was accompanied by a 316% increase in rate.
The second break was because I got married and spent some time traveling around Europe. When I got back at the end of the year, I was determined to find higher paying work again (so as to have more time with my family, among other reasons). I didn’t find that work until the following February, but when I did, it was at an additional 183% increase in rate.
Throughout the rest of this article, I break down the contracts that I took and the strategies I used to find them.
$30/hr: inbound via Stack Overflow
Most people think of raises in terms of percentage point increases, not as independent, absolute values. The market does not think this way.
I entered into the web development world at seventeen. I had spent a couple of years before that writing some ~600 answers on Stack Overflow. A non-technical startup founder came across my answers and asked me if I'd be willing to contract for them. I was still in high school, so after consulting with my dad (who was himself an experienced freelancer, though at the time he was employed full-time), I named a number that seemed astronomically high: $30/hr. They agreed, and a new web developer was born.
Without my dad's advice, I wouldn't have had the confidence to name a number this high. I had been going to school and making minimum wage at the local library up until this point. This just goes to show that the amount of money you think you can make is typically dependent on the amount of money you are making.
- Most people think of raises in terms of percentage point increases, not as independent, absolute values. The market does not think this way. Nobody cares how much you were charging, only how much you're going to charge them (and how much you can make them).
- Work and learn in public (hat-tip to swyx and learninpublic.org). Publicly visible artifacts of your experience are very valuable.
- Having somebody else to advise you helps you break past your own conceptual limitations that might stem from a lack of information and/or experience.
$30/hr to $35/hr: referral
My next contract was a company in the UK that was referred to me by my previous client. I stayed with them for three years, from August of Year Negative One to May of Year One. I asked for and received a $5/hr raise towards the end of this period, which was trivial compared to the raises I could have gotten if I had moved around from job to job. But I lacked the experience and confidence to do that, so I try not to cry too much over this spilled milk in hindsight.
- Companies in the UK pay far less than companies in the US do. My understanding is that they are subsidized by public health care and other government programs that make this practical. This is fine if you're in the UK, but not if you're working remotely for a UK company from the US. So if you're in the US, keep your work in-country as a general rule.
$95/hr: inbound from Stack Overflow
You can almost certainly command a higher rate than you think possible, so you should always be looking for opportunities to try a higher rate on for size.
In March of Year One, I met my future wife, which drastically changed my thinking about what an acceptable income is. This was my trigger event. $30/hr isn't bad for a single nineteen year old living with his parents, but not so great for a married man supporting a family.
So, I decided I needed to make more money.
In May of that year, two months after I met my future wife (and no, if you're wondering, she hadn't agreed to date me yet), I quit my long-term contract to go full-time on a digital marketing side-business that I'd been growing for around a year on the side.
After a few months, I decided not to pursue that business. It turns out that I am a rather archetypal developer, and don't particularly enjoy cold-calling lawyers to offer them digital marketing services. I did learn basic sales tactics and gain a lot of confidence talking to folks on the phone from this venture, though, which proved to be very useful in the future.
Shortly after I decided to take up contract development work again, a large development agency reached out to me via Stack Overflow and offered me a contract on a very urgent basis.
Since I had only just begun looking for work, I figured I had little to lose. And they had reached out to me directly, so I was confident asking for more money. I named a range approximately three times higher than my previous rate, expecting to get the low end: $80 to $100/hr.
On Thursday, they offered me $95/hr — and asked that I fly out on Monday to meet with their client for a week (it turned out that they really needed a developer). I said yes, and packed my bags for the trip.
- You should change jobs frequently.
- This is easy to do as a contractor, but not as a full-time employee. The way a contractor is onboarded and the expectations of that contractor are very different from those of a full-time employee.
- Change jobs too frequently as a full-timer and you'll probably be labelled a job-hopper, which can hurt your employment chances in the future. Hiring an employee requires an often substantial monetary investment in terms of time, onboarding, and sourcing talent.
- If you repeatedly leave employers before generating a positive return on investment for them, you will become perceived as a liability rather than an asset, and this trend is visible on your resume.
- Behind the scenes, I'd also experienced a significant mindset shift that gave me the confidence, the need, the burning why, that led me to risk losing a potentially lucrative contract in order to secure a rate increase. It's easy to write about, but hard to do in practice.
- I've since learned not to offer basic ranges to clients. It's a convenient non-truth that manages to disappoint everybody involved: when you quote a range, you imagine the high end of the range and the client imagines the low end of the range, and neither of you get what you want. There are more advanced versions of offering ranges that work better, but that's getting into pricing tactics too much for right now.
$60/hr: social networking
Since my whole goal was to stop being cheap talent, I realized that me and startups were probably going to have to break up. It's not you, it's me — wait, no, actually it is you.
Shortly after I started that contract, somebody else in my network reached out with some work he wanted done for his startup at $60/hr. When it rains, it pours, I guess. I took that contract too, and worked with him at the same time as I was working the other contract. And yes, that was two full-time contracts at the same time, which led to some long weeks.
The work for them was great, but after a couple of months, they asked me to become a full employee with them at this rate. That didn't work out, as I was focused on working as a contractor even then.
After both of those contracts ended, I realized that my former success with waiting for people to randomly reach out to me on Stack Overflow was not duplicable, so I turned to my network for the first time.
I tweeted that I was available for hire:
Pop quiz: how many issues can you spot with this looking-for-work tweet? There are several.
From that tweet, somebody reached out from another startup. The rate that I negotiated was, again, $60/hr. I was happy to have work again, but was disappointed that it wasn't up to the $95/hr that I had been making before.
However, I let the startup make the first offer and it came in at $55/hr, which was lower than I was willing to work for. I pushed a little higher, but not too much higher — I was afraid of losing the opportunity, as I felt that I didn't have a truly duplicable strategy in place. I took their counteroffer at $60/hr.
I found that reaching out to my network was more repeatable than waiting for people to reach out to me, but it was still a problematic strategy for a couple of reasons.
At the stage I was at then, relying on my current contacts was a recipe for staying locked in at one rate. People that you've worked directly for in the past generally aren't happy when you raise your rates, or they can't afford you because the reason they worked with you in the past was because you fit their budget. They also tend to refer people in the same rate range they're in. I've experienced this multiple times, which is why I mention it. There's definitely a cluster effect at work here.
Also, I had my doubts that this was a truly duplicable strategy as well — my network wasn't large enough yet for me to fully rely on it.
- A key mindset shift that occurred at this point in time was that I decided to stop working for startups.
- As a rule, startups optimize for getting lots of work done quickly and with minimal expenditure. This means they're always looking for talented engineers that don't care about money (ping pong, free beer, and Changing the Way People [Blank] are a great way to attract these kinds of people). It's also why they claim it's so hard to hire engineers. Hint: it's not hard to hire engineers if you're willing to pay them a whole lot of money. Just ask Google or Facebook.
- Since my whole goal was to stop being cheap talent, I realized that me and startups were probably going to have to break up. It's not you, it's me — wait, no, actually it is you.
- Larger companies, on the other hand, optimize for getting solid work done without making mistakes, and aren't as worried about the amount of money they have to spend to do this. This was right in line with my motivations, so I decided to focus on more established companies from that point on.
$110/hr: I post my resume online. Recruiters start calling.
A week from when I'd uploaded my resume, I had four different offers on the table, all of which were fairly competitive at the same rate: $100/hr.
I ended that contract in August of Year Two, when I got married. We took a three month honeymoon abroad.
When we got back in November, I started looking for another contract via all the old methods.
I reached out to my network, waited for people to contact me on Stack Overflow and my blog, and even started a React meetup, where I gave some talks. I did have some friends refer work to me, but I didn't get a single solid offer.
I was determined to hit at least $100/hr again, but felt that there was something holding me back, though I didn't know what it was.
I did everything I could think of to break through, but for months, I wasn't able to find any work higher rate. I was getting frustrated and felt like I had hit a glass ceiling. I knew there were plenty of people making more than me out there, but I just didn't know how they were finding work.
I was getting ready to give up and just take a cheapo job as a code monkey. At this point, I had been a developer for over five years, had a decent network, and was basically doing everything right... except for one thing.
I had failed to post my resume online.
I had always felt that it would be better, more "professional" somehow, to stay within my contacts or have people reach out to me. It felt "sleazy" to post my resume online, so I avoided it as best I could. I think this attitude is partly because I happened into web development coincidently, and with people reaching out to me instead of the other way around, from the very beginning.
By February, I was desperate enough to post my resume anyway.
Not one to do things by halves, I uploaded it to every single site I could find: Monster, Dice, Hired.com, heck, even ZipRecruiter (I didn't know their reputation at the time — in retrospect, all I can say is that it's well deserved).
Nothing happened for a day or two, but then the calls started to flood in... from dozens of Indian recruiters. I didn't know anything about recruiters, so I talked to them. All of them. I'd get off the phone with one person, and minutes later it'd be ringing again. Many times I'd get two calls at once and have to put one on hold while I finished talking to the other.
By the time the Americans started calling, I had been on the phone for three days straight — my throat was sore and my voice was shot, and I hadn't gotten a single interview, or even anybody that was willing to offer more than $90/hr for that matter. The median with the Indian recruiters was probably $50/hr.
In other words, they generated an awful lot of smoke and absolutely no flame. I was getting pretty discouraged, and started to think maybe there wasn't anything to this online resume thing.
But then I started getting interviews with the American recruiters' clients... and then offers.
A week from when I'd uploaded my resume, I had four different offers on the table, all of which were fairly competitive at the same rate: $100/hr.
I was able to play the offers off of one another a little and negotiate a rate of $110/hr, which was a great contract that began in March of Year Three. It lasted until July of that year, when my son was born and I took some time off.
- Never accept the first offer you receive when starting a new job hunt. Instead, wait until you have multiple offers on the table and play them off of each other. This strategy leverages fear of missing out syndrome and the classic Traveling Salesman strategy in order to help you maximize your possible rate.
- When you post your resume, it seems to take at least a couple of days for native-English speakers to find it and start calling you, whereas I was getting calls by Indians within an hour of posting.
- I never did get a single technical interview from any of the scores of Indian recruiters I talked to. Most of them maxed out their rates at $50 to $70/hr, and the conversation ended there. I never felt it was worth my time.
For the next contract, I called up one of the recruiters that had had a client made an offer back in March of Year Three, and told them I was available again — but for $120/hr instead of the $110/hr that we'd been talking previously. At this point, I was confident I could find work through talking with recruiters, so I wanted to experiment a little and push the boundaries again. Worst case scenario, I'd spend an extra week or two looking for work.
Their client hired me right away, though, and I went back to work again — only to find out that this contract was actually not that great. Unfortunately, the experience was negative in many ways, so after a few months I decided not to stay with them and started looking for work again.
- It's worth reaching out to companies who have made an offer in the past to see if they'd be willing to work with you again in the future. You never know what they might say, even if you ask for a higher rate than before. It really depends on how well you handle yourself on the phone and what your level of confidence is.
[Your story] should be a coherent narrative that answers the questions an employer is likely to have: why are you available for work right now? Why should I hire you? How can you help the business?
Because I was looking for work while still employed, I was able to be rather aggressive about this search. I fielded calls from recruiters, throwing out different rates for several weeks before one bit at $150/hr. They put me through to the company, and the interviews went really well. I ended up being negotiated down to $140/hr., but was still happy with this rate, because it was still a significant increase over previous contracts.
An interesting story with this contract is that the initial rate I named — $150/hr — was way out of the client's budget, and this was made explicitly clear to me at the beginning of the negotiation process.
However, because I was still employed, I was comfortable pushing for it. Ultimately, the manager had to get approval from a VP at the client's company and the recruiting firm took a hit too, even going so far as to negotiate with the client to have them hire another person from the firm to cover the loss they took on hiring me out.
The negotiation also took an unusually long time for a contract negotiation — almost two weeks, from start to finish. Typically, they've last from two to four days for me.
- Develop a story, a positioning statement, that highlights a valuable, niche skillset that companies need and you have, and use it as leverage to negotiate higher rates. It should be a coherent narrative that answers the questions an employer is likely to have: why are you available for work right now? Why should I hire you? How can you help the business?
- A key factor in this hiring process was that my story and my skillset met their needs very closely. For a couple of years I had been trying to figure out how to position myself and what my specialties were. By the time this contract rolled around, I felt like I finally had a good grasp on my story and sufficient experience to back up my chosen niche. And this was exactly the area where they needed help.
- I'd worked on several web design tools earlier in my career, and I'd also worked on and/or built design systems and component libraries at several of my past jobs, so after a bunch of thought and experimentation, I decided that this was what I'd focus on when talking to recruiters. Whenever I had a conversation with one, I'd focus on this aspect of my skillset.
- It's important to note that this narrative was reductionist rather than an exaggeration. It took totally true aspects of my career as a developer, and removed the stuff that didn't help carry the story. I didn't have to make anything up. I simply took the most coherent aspects of my career, the ones that fit together over time and backed each other up, and forged them into a positioning statement that was appealing to managers and recruiters.
$175 to $225/hr: the one that got away (recruiter)
Shortly after I accepted that contract, I got a voicemail from a recruiter offering me $175 to $225/hr — yes, you read that right. And the gig was to work on a design system, too. Right up my alley. My jaw hit the floor when I heard those numbers. I'd just finally secured $140/hr and signed the contract literally the day before, and then along comes this guy throwing out these astronomical numbers like it's nothing. I texted to confirm, and he called back. I'd heard him correctly.
Unfortunately, I had to turn him down because I was unwilling to renege on the contract that I'd signed the day before. Call me stupid, but I've never reneged on a written contract and I hope I never will.
Still, if I'd known it was possible, I'd have shot for that number a while ago. But it's like I said at the beginning of the article: sometimes you just have to know it's possible in order to go for it. I didn't even think of trying for that rate until it walked up and slapped me on the face.
- There's always a bigger fish. If I'd known that somebody would value my skills that much earlier, I would have pushed for the higher number a lot harder.
- Ask yourself this question: what is the real value of your skillset?
- It's been estimated that each engineer at Google generates over a million dollars a year in value. How much value can you generate for a company? How much would be fair to charge in that light?
Conclusions and what's next
Of all the things I tried, posting my resume online was what helped me break through at that crucial point in time when I was pushing for higher rates, knowing they were out there, but not being able to find them.
It's worth pointing out that this wasn't the only reason I was able to raise my rate: I had been constantly pushing for a higher rate for years, so when I finally found the right strategy I was able to take advantage of it.
I've known plenty of other people who did the same thing as me, and for far longer, that are making a lot less still. It seems that posting your resume online isn't enough. Additionally, you have to:
- Have a story
- Be aware of how to negotiate
- Be comfortable and confident talking on the phone
- Know what other rates are out there so that you know how much to push for
- ...a number of other factors as well.
Finally, I want to mention that my goal has always been to stay at the individual contributor level. I have no interest in being a manager, although one could certainly make more money that way. It implies a lot more commitment (you've never heard of a contracting manager) because there's a lot more to learn at any given company to begin generating value, and also you don't really get to write code as a manager. I got into software development for the love of it, so I'm not going to give that up just to make more money.
I share these numbers with you not to boast, but because I believe it's important for other people to be informed. This information should be out there.
I also touched on a number of important concepts in this post that I'm going to continue to expand on in the future:
Future chapters to come, on:
- How to figure out how much YOU should be charging
- A step by step guide to figuring out your unique story and niche
- Whether you should be a contractor or an employee
- How (and, er, why) to talk to recruiters
- [your question here]
To receive notifications when I release chapters / posts on these topics, sign up for my newsletter:
Thanks for reading!