DANNY YANG

about me · blog · projects · hire me

1 Year of Data Visualization Freelancing

29 Dec 2023 - 1943 words - 9 minute read - RSS

This post describes my experience doing part-time data visualization freelancing on Upwork in 2023. I’m not sure how representative it is or how much of it applies to full-time freelancing, but I hope my learnings here are useful for anyone who is curious about freelancing.

Introduction #

After I finished writing my book in December 2022, I decided to use my newfound free time to dabble in freelancing. I had been working in Big Tech™ ever since I graduated, so I thought it would be a good opportunity to experience another part of the sector.

upwork profile

Getting Started & Goals #

To be clear: I did not quit my job to do full-time contracting. I kept my day job throughout all this, so the freelancing thing would just be a form of supplemental income. To avoid compromising my work-life balance too much, I limited my maximum commitment to 10 hours in any given week.

I had the following goals throughout 2023:

  1. Get experience bidding for jobs and working directly with clients
  2. See how much extra income I could earn on the side
  3. Practice using technologies/skills that I don’t get to use at my day job

Getting permission from my employer to do contracting was surprisingly easy, I just had to promise what I was working on had nothing to do with what I normally do at work and to not take contracts from competitors.

With that out of the way, I made a few accounts on online platforms (specifics later) and jumped right into the world of freelancing.

Deciding What Service To Offer #

I was initially hopeful that I could learn some new technologies through contracting, but after talking with some friends I decided it wasn’t realistic. Clients mostly hire people who already know what they’re doing, who can deliver a quality product quickly. Why would they hire someone with no experience in technology X to build something using technology X?

Therefore, I decided to only offer services in designing and developing data visualizations (interactive charts, dashboards, maps, etc) using D3.js. My reasoning is as follows:

  1. I’m pretty experienced in this domain, which meant I had a portfolio of open source work and tutorials I could share with clients as part of my bids.
  2. This is a very niche service - although there would be fewer clients compared to something like writing Python scripts, I reasoned that more specialized contractors could command higher rates.
  3. The product is relatively self-contained, which meant that I could do smaller contracts. I figured I would target contracts that were a few weeks long at most, and do 5-10 hours of billable work a week.
  4. This had nothing to do with my day job, so I was itching to put these skills to use.

Although I initially set out offering only data visualization services, I ended up taking a few contracts related to geospatial data processing, which I think is somewhat adjacent.

Picking a Platform #

Initially, I was mostly looking for contracts that were more like 1-4 weeks of work, 5-10 hrs per week. I tried various platforms for a bit - Toptal, Gun.io, Upwork, etc. and in the end Upwork seemed like the right balance.

The other ones were more selective, which in theory meant developers could command high rates, but the available contracts were few and rarely matched what I wanted. From casual observation, the higher end of software contracting seems to blur with a full-time job: 30+ hours a week of commitment for multiple months, though unlike a full-time job there’s no stock options and health insurance.

On the opposite end of the spectrum was Fiverr, where I was surprised to find quite a few people offering their services making D3 charts. One look at the rates of the most popular ones and I knew I couldn’t compete, so I didn’t even bother signing up.

Anyhow, once I made my account I filled out my profile, added a few portfolio links, and started bidding.

Bidding and Rates #

On Upwork, clients could set their budget for total project cost or per-hour, which really helped me select which contracts to bid for.

For my first couple of contracts, I targeted low-budget contracts (like $50 or $100 for the whole project) so that I could accumulate good reviews. Since the projects were pretty small and I was getting good practice, it wasn’t a total waste of time.

After getting some successful jobs under my belt, I started being more selective with my bidding and rates. My base rate was set at $100/hour (completely arbitrary), and the amount I was willing to negotiate depended on my appetite for new work at the time. As a hard rule, I tried to avoid anything that paid less than $50/hour after the first few contracts. This felt like a fair rate, though if I was relying on this to pay the bills I would have charged significantly more.

That said, nothing stops other freelancers from bidding under the client’s budget, and I probably lost a lot of contracts due to being undercut on rates.

Somewhere along the way, I got some badges on Upwork. Starting with “Rising Talent”, then “Top Rated”, and finally “Top Rated Plus”, which I guess gets awarded if I have a certain number of satisfied clients & earned a certain amount of money. I’m not sure it does anything material, but I have noticed people finding my profile and messaging me occasionally, despite my availability badge being off.

In the end, my main constraint was probably my self-imposed bandwidth/workload limit. I took full advantage of the flexibility offered by the freelancing model - there were a lot of weeks where I didn’t bid for any new contracts because my plate was full or I wanted to take a break between contracts.

Had I bid more aggressively every week or queued up new contracts to start whenever I was done with my current load, I probably could have comfortably gotten another 10 hours worth of work per week.

Billing and Fees #

Some platforms like Upwork take a percentage of your hourly fee, whereas others pay you the rate that you want and charge the client a higher number. Upwork’s fee was 20% when I started, but they’ve since reduced it to 10%. For contracts I got outside of Upwork, I handled billing via Paypal which was a ~3% fee + more if it’s a foreign transaction.

Advertising #

I didn’t really advertise these services except by putting a line in my Github README & my blog saying people could message me if they wanted to pay me to do something, but I don’t think anyone reached out to me through those channels.

I did get clients who found me on Upwork but reached out to me directly via email for whatever reason, but the bulk of my contracts were directly through Upwork.

Working With Clients #

Here are some useful things I learned through bidding, negotiating, and working with clients:

  1. Speed/responsiveness really matter - Projects can get dozens of bids within hours of being posted, and if a client reaches out to clarify something about a proposal responding even a few hours late can lead to you losing the bid to someone else who responds faster.
  2. Communicate as much as possible up front - After a few contracts where I had quite a lot of back and forth clarifications with clients, I decided that it was too much overhead since I wasn’t getting paid for this time. To save some time, I tried to provide as much information up front as possible and set expectations for communication. I made it clear that most of the work would be done in evenings and weekends, and that I would always give updates proactively and respond to emails/messages within 24 hours. Later on, I learned to give estimates on when I could start/finish the project, and listed the additional information I would need from the client before I could start working.
  3. It’s impossible to work fully asynchronously - I tried to avoid virtual interviews and meetings as much as possible to avoid conflicts with my day job, but entirely avoiding meetings is impossible. In the end, I made it clear that any live meetings had to be scheduled several days in advance.
  4. Web demos are great - I hosted live demos for some charts using Github pages (this feature requires a paid subscription for private repos). The demo would be automatically updated whenever I push to the repo, and it was easy to just message the client “hey, check out the updated demo”. This was especially helpful for non-technical clients.
  5. I don’t own the product - When I first started on Upwork, I put screenshots of my first few contracts on my profile. Some clients reached out to me to get it taken down - this was a good reminder that the work didn’t belong to me and I couldn’t just do whatever I want. After that, I ended up sticking with past open-sourced work for my portfolio.
  6. Having a library of reusable snippets is helpful - Having pre-written code for things like zooming, common animations, tooltips, automatic resizing, basic map and chart types helps speed up the implementation part of the project. I started building up a library of useful snippets throughout the year. Especially for people working with D3.js, having your own pre-built components is pretty important now that all the D3 examples got moved to Observable (and thus not easily useable) and most of the other examples are extremely outdated.

Results #

After around 1 year of on-and-off freelancing from Dec 2022 to Dec 2023, these were the results:

I completed around a dozen contracts, mostly for smaller/individual clients but also for some companies. I averaged somewhere around 4 billable hours a week and made around $20k before taxes and fees.

Below is a screenshot of my public Upwork profile, to show that I’m not making things up:

upwork profile 2

If I extrapolate this to full-time (with the unrealistic assumption that my plate is full all the time) I would have made $150-200k before taxes and fees for the year. Not too shabby, but it would be around a 50% pay cut from my current job and I wouldn’t have health insurance or free food at the office or employer 401k matching.

I think that if I actually relied on contracting to pay the bills, I would need to raise my rates and aim for longer contracts with higher commitments. The shorter/one-off contracts tend to pay less and have higher overhead with submitting proposals and negotiating with clients.

All the original goals I set for 2023 were met:

  1. Get experience bidding for jobs and working with clients - I certainly did
  2. See how much extra income I could earn on the side - I made enough to not feel bad about going on a trip once a month 🤷
  3. Practice using technologies/skills that I don’t get to use at my day job - I got to learn and problem solve much more than I thought I would, so I’m very satisfied on this front. I even got to apply Dijkstra’s shortest path algorithm to solve a problem for a client, which is something I never thought I had to use outside of Advent of Code puzzles.

Overall, I’m pretty happy with the whole experience and I plan to continue doing this in 2024, though maybe with more breaks and submitting fewer bids to make time for other things.



github · linkedin · email · rss