Two years ago in February 2016, frustrated and not feeling motivated by the 9 to 5, I quit my job. But, living in the Bay area is expensive, so I started freelancing. It’s been a life changing experience – I have control of my schedule, I have way less stress, and coding is fun again. It’s definitely not for everyone. If you don’t mind a little uncertainty and less choice on what you work on, the benefits far outweigh the downsides.
By the numbers
- 24 months of freelancing
- 6 clients
- ~1700 billable hours over 2 years
- Busiest month: 155 hours.
- Least busy month: 2 hours ;-)
As is hopefully obvious, I work far less than full time. In the winter I usually work 25-35 in the week. In the summer I usually work 20-30 hours every other week.
I’ve been lucky to have a fairly continuous stream of work with only 3-4 weeks in the last two years where I wanted to be working but didn’t have work to do. Here’s a few things I’ve learned about getting work.
Finding Potential Leads
Getting work can be tricky, especially when you’re just getting started. For me, reaching out to people I knew from school and past jobs has been the most effective source of work.
- I got 5 out of 6 gigs through people I know from tech. The other was a chance meeting with someone I met paragliding.
- Half of my gigs have been from reaching out to a friend, the other half were from friends reaching out to me, usually looking for full-time work. I reply to every email people send me looking for fulltime work saying that I can’t do that I can but I can freelance.
- Word of mouth / people knowing that you’re a freelancer is important. Two of my gigs were friends-of-friends who introduced me because they knew I freelanced.
In all but one of my gigs, I knew at least one person at the company personally. For someone like me without a large public persona, an internal champion who can serve as a reference is key. This is especially true if the client is on the fence about hiring a contractor or hasn’t hired contractors before.
Not everything I’ve tried has worked. A few things that have yet to pan out:
- Blogging – I started blogging more frequently in 2018. Although I’ve gotten some leads, it hasn’t converted to booked work. It’s probably worth noting that I’m mostly just blogging for fun and not optimizing for leads.
- Replying to recruiters on LinkedIn. When I started freelancing, I stopped ignoring recruiters and now reply to almost all of them. I’ve had some conversations about freelancing, but this has never materialized into any opportunities. This isn’t too surprising because recruiters are trying to fill a specific, full-time, role.
Picking potential projects
One of the reasons I’ve been able to stay consistently booked is that I’m willing and able to work on basically anything. Being a polyglot and unafraid about picking up new languages and technologies will help you say yes to a lot more opportunities. At least for me, I don’t have so many incoming gigs that I can afford to disqualify them based on tech / projects. Not having control of what you work on, and not working on / owning big projects is one of the biggest downsides to freelancing. For me, that’s a tradeoff I’m willing to make.
Setting expectations early
From top of funnel (some communication, email etc.) to booked work is about 5% for me. It’s important to remove unqualified leads as quickly as possible to protect your time. I try to set expectations around the most likely deal-breakers as early as possible. In rough order of occurrence, the most common reasons for my gigs falling through:
- People thinking that they will convince you to join their amazing company full-time even though you explicitly said you were only looking for contract work: I’ve gone through the interview phase with multiple clients only to have them end with a pitch call trying to convince me to join full-time followed by them politely telling me that they realized they’re actually not looking for contractors.
Hourly rate: Almost all my clients fall into these categories:
- My rate is way more than they were expecting to pay. It’s important to find this out as quickly as possible to save both parties time.
- My rate is less or inline with what they expected to pay and they accept it without negotiation.
Maximum / Minimum length of engagement: Some clients are looking for really long term commitments (12 months+). Personally, I prefer to mix it up, so I stick to commitments in the 3-6 month range.
Hours per day / hours per week expected
I made a mistake a couple of times early on: I would spend an hour or more interviewing with the client, only to find that something was a deal breaker. Since then, I don’t move from a quick email or phone call without nailing down all of the above parameters. It can feel a little awkward, especially bringing up hourly rate this early in the conversation, but it saves both parties a lot of time.
Doing / Keeping Work
Working as a freelancer is significantly different from working full-time. The best part for me is that I’m almost never in meetings and enjoy lots of head down coding time. Another huge plus for me is avoiding the stress of being on-call.
Knowing your own style
I didn’t know this when I started, but remote work, especially long-term remote work, really doesn’t suit me. This is a personal preference and I know a lot of people who enjoy it. It’s really easy to go the whole day without interacting with another human being. A few days of this and I go a bit stir crazy and lose motivation for working. I would much rather work in an office, even if that means I spend some time commuting. Now that I know that, I try to always have at least one local client. I enjoy being able to go into an office and collaborate with people, in person.
Working with multiple concurrent clients
Over the past two years, I’ve had between one and three concurrent clients. I think two is probably the sweet spot. Most of my clients don’t actually have enough work to fill all of my time, so keeping two means I’m always busy if I want to be. I also enjoy having more than 1 client because I enjoy being able to switch back and forth between multiple projects. When I’ve had three clients, I’ve been too frazzled, there is just too much context switching, and I can’t get stuff out the door quickly enough to satisfy my clients.
This section is about the nitty gritty, the actual nuts and bolts of being a freelance engineer.
I (and most other freelancers I know) use Toggl. It’s simple, works well, and can easily generate reports.
Pro tip: Toggl has excellent desktop apps. I find them especially useful because they can detect (and remove) idle time and notify you if you appear to be working but aren’t tracking anything.
Bookkeeping / Invoicing
I’ve been using Xero for invoicing, bookkeeping and payroll (paying myself) since I started and it’s worked quite well. I use it in conjunction with auto-invoice, a small Python CLI app I wrote to generate invoices from Toggl, create them in Xero, and send them to clients.
Keeping Multiple Clients On the Same Computer
Working for multiple companies at the same time on the same computer can be a hassle. I haven’t found a great solution to this yet, but my current strategy is having one user on my computer per client. This isn’t without gotchas though – for example,
brew doesn’t work well out of the box with multiple users.
When I first started contracting, I figured I’d use it as a way to try out potential employers before choosing one I liked. As weeks turned to months, I realized it would be really hard to go back to the full-time lifestyle. Freelancing is just too much fun :-)
Want to get emailed about new blog posts?
I post about once a week on topics like
, language internals
Do you want to hire me? I’m available for engagements from 1 week to a few months. Hire me!