New to Freelancing? How to get your First Freelance Clients

Happy New Year!

It’s a new year, so to celebrate the occasion I decided to write a blog post that wasn’t technical for a change.  This post is a step by step guide to acquiring clients, based on my experiences when I first started out.  It’s by no means definitive, and it’s certainly not the only way of doing it:  this is simply a personal account of how I started my freelance business; along with the rationale for some of the decisions I made, and couple of hints and tips thrown in for good measure.  Enjoy 🙂

Starting Out

Every so often, I get an email from a young developer, asking me how I go about getting clients. Sometimes, the email is from an experienced, but employed developer, asking how I made the leap from full time employment to striking out on my own.

The story of how I started freelancing really isn’t that exciting, so I won’t bore you with the details. However, I’ve been freelancing for a few years now, and I’d like to think that I’ve had some degree of success in acquiring (and retaining!) clients; so I’m going to tell you how I did it.

Before we get started, I’m going to make a brief point on the importance of having a portfolio; then we’ll get into the interesting stuff about how to track down and contact prospective clients.


You need a portfolio. I’d like to think that this is common sense – no one is going to hire you if you can’t prove that you can do what you say you can do.

What should you feature on your portfolio? Preferably, your best pieces of work, with a description of what you did, and what value this provided to the client. It’s okay if you don’t have many projects to show off, you just need to cover them in a little more depth.

Looking at my portfolio, you might be thinking that this is a case of ‘do as I say, not as I do’. In the past, my portfolio had much more in the way of explanation about the services I provided, and what was achieved for each particular client. However, I’ve had to sign so many NDAs now, that it’s just easier for me to briefly list each one than try to remember who said I could publicly show what.

I’m not actively searching for new clients, but if you are – especially if you’re just starting out, you need to make sure that your portfolio leaves a good impression.

Types of Client

I’m not going to factor sites like Elance or oDesk into this account, because, quite simply, that’s not how I got my first clients. Freelancing sites might work for you, and they might not; but I’m not going to discuss them here because I can’t speak with authority on something that I don’t have any experience of. When I started out, I targeted local businesses, and then expanded outwards. I did this for a couple of reasons: it’s easier to get a sense of whether they can afford to pay you or not; and it’s possible to pay them a visit if they don’t. 😉

First Steps: Build a List

Go to Google Maps and type in your postcode. Now type in the type of business that you’d like to freelance for. Are you a visual designer? Look for web design agencies. A Writer? Give marketing agencies a go. Search within a large enough radius that you can list twenty or thirty agencies, and then put the name and url of each into a spreadsheet.

If there isn’t an over-abundance of digital agencies in your area, feel free to expand the scope of your search a little bit. Marketing agencies will often need WordPress experts. Print agencies will sometimes get a little bit of web design work that they don’t have the skills to complete themselves. The corollary of this however, is that you could expand your search a little too widely. It would be very easy to blanket spam every digital related agency within a hundred mile radius. You might get lucky and find a gem of a job in an unrelated business, but more than likely you’ll end up with a lot of rejections and a deflated ego. Take a moment to think about what value you could bring to *this* agency. As with everything else, a little bit of common sense here will save you effort later.

Now you have a list of contacts that, prima facie, look like the type of businesses a) you’d like to work for, and b) you could conceivably provide business value to. Not all of them will be a good fit though, so at this point I like to whittle the list down a bit.


Now it’s time to do little more research on each prospective partner. I would do two things: firstly, I make sure that the business is what it says it is, and secondly, I try to intuit what the business would be like to work for.

Pull up the business’s website and have a poke around. Sometime’s Google will miscategorise a business – if this is the case, then remove it from the list. Take a look at the contact page – if there are no contact details, strike it from the list. Similarly, if the contact page lists what looks like a residential address, this would put me on alert and I’d have to do a bit more digging – individuals don’t (generally) make good clients! Try to get a feel for what they do, and use your intuition. If something looks out of place, or downright wrong, there’s probably a reason for it.

The Email

Once you’ve filtered your list, find the contact name and email address of the person that would be most likely to have influence on any hiring decisions, and add it to your spreadsheet. In a small company, this would be the owner. In a larger company, this responsibility may be delegated to someone else – try to find out who this might be from the website, or call up the business and ask.

Compose and email to your contact, introducing yourself, explaining what your skills are, and how you could use these skills to benefit the business. Send the email, and indicate on your spreadsheet that you’ve sent the email, along with the date. Then, you wait.

If you receive a reply to your email, great! You have a lead. Otherwise, wait around a week, and then follow up on your email with a phone call.

The Phone Call

If you’re an extroverted type, you might be tempted to forgo the email, diving straight in with a phone call. I don’t do that, for the following reason.

At one of the agencies I worked at (as a developer!) I also acted as receptionist. I prided myself on being a stone-cold bitch. No one was getting through to the management without good reason. If you’ve already sent an email, you have a legitimate reason for calling – following up on that email. The receptionist will be more likely to put you through to your prospect without any further questioning if you have – what they deem to be – a good reason for calling. If you’re cold calling to ask for work, it’s their job to ascertain whether you’re someone that their boss would be interested in speaking to. A prior email obviates the need for that assessment.

Once you’re through to your contact, briefly introduce yourself, and explain that you’re calling to ask whether s/he received your email. More often than not, they received your email, but either outright didn’t read it, or they didn’t bother replying. In either case, if they haven’t shot you down right away, now would be a good time to reiterate what it is that you do, and that you’d like to visit them to discuss the possibility of working together.

One of three things will happen here:

  1. Your contact will indicate that they’re not interested – perhaps they have a roster of freelancers that they already work with. Try not to take this personally and move on to the next potential client.
  2. Your contact will say that, they have no need for your services right now, but perhaps they will have some work for you in a few months time. Make a note of this in your spreadsheet and set a follow up date three months down the line.
  3. Your contact has need of your skills, and would like to meet. Congratulations, you have a lead!

It would be very easy to simply send an email, and leave it at that, whether you receive a reply or not. The key is persistence. Speaking to someone over the phone, and to a greater degree, meeting them in person, solidifies the relationship, and makes them much more likely to give you work or recommend you to others.

The Meeting

When I used to go out to meet clients, these meetings were always quite varied. Sometimes they were very informal chats, and sometimes the clients wanted to see a more extensive portfolio, and had a couple of developers on hand to grill me. Be prepared for anything. It can be annoying to carry your MacBook Pro around London all day for a series of loose conversations; but it’s better than turning up empty handed.

The best case scenario is that you secure some immediate work; but if that is not to be the case, they’ll remember you in future. In the meantime, repeat the steps above to improve your chances of finding work.


Congratulations on your new freelance career 🙂  Try not to spend every day in your pyjamas, don’t eat lunch at your desk, and be sure to go outside occasionally, lest you succumb to cabin fever. Most importantly, try to enjoy it!

If you have any thoughts, comments, or tips, please share them in the comments below.

Terminal Productivity Tips for Web Developers

When I’m working, the three applications I’m guaranteed to have open are Chrome, Textmate and Terminal. Terminal can look pretty intimidating at first, but once you’ve picked up some of the core commands (cd, ls, mv, cp, mkdir, touch, grep, etc.) you begin to wonder how you ever lived without it. Today I’m going to share with you a few of my favourite Terminal commands and shortcuts.

I’ve split this article into two parts: the first section is an introduction to aliases and functions. It also contains instructions on how to find and edit your bash profile. The second discusses a few of the commands I use on a daily basis, in addition to some commands I use less frequently, but are otherwise useful to know. If you’re already comfortable with aliases and functions, feel free to skip ahead to part two.

Part One: Aliases, Functions, and your Bash Profile


Aliases are fantastic time-savers – they are shortcuts used to avoid typing lengthy commands. To create an alias, you need to edit your bash profile.

What’s a Bash Profile?

A bash profile is a file that runs when you start up Terminal – it loads user-created aliases and functions. It’s located in your home directory, and is usually called .bash_profile or .profile. The filename starts with a dot, so it’s hidden by default.  To find hidden files in Terminal, use the ls command with the -a option (ls -a).  Once you’ve found your profile, open .profile will open the file in your default editor.  mate .profile will open the file in Textmate if you have it installed.

Example: Directory Aliases

My development server is on a NAS box. If I had to navigate to it from my home directory each time I wanted to work on a project, that would involve a reasonable amount of typing. This is the alias I use to navigate to my web server’s directory:

alias ws='cd /Volumes/Nikki/WebServer/'

Any time I need to get to my web server, all I have to type is ws – this saves me a huge amount of time over the course of the day.  You can use this as a template for your own aliases.


Aliases are great for simple string substitution, but if you need something a bit more complex – if you need to use conditional logic, or pass arguments, for example – you can use a function.

Example: Start Web Browser/Run Local HTML Files in Browser

It can be a bit of a pain to navigate to my applications directory and open my browser, so I created a shortcut with a couple of options.  I can either open the application using wb, or I can pass in the name of a file and open that in the browser (wb file.html).

function wb() {
    if [ -z '$1' ]
        open /Applications/Google
        open -a /Applications/Google $1

(Just using open on file.html would open the file your default program – in my case, Textmate).

Part Two: Tips and Tricks

Quitting Applications

Quitting an application from Terminal is slightly more long-winded than opening one:

osascript -e 'tell app "Firefox" to quit'

That’s a fair amount to type every time you want to quit an application. Creating a function in your ~/.bash_profile will make this quicker, and you can pass in the name of the application you want to quit as a variable.

function quit() { osascript -e "tell app "$1" to quit"; }

Pop that pre into your bash profile, and you can close any open application by typing

quit appname

into Terminal. If the name of the application you need to close has a space in it, you need to remember to escape that space with a backslash, otherwise it won’t work.

Quick Web Server

Sometimes when I’m out and about with my MBP, I might temporarily need the use of a http server. Type the following command into terminal, and the contents of your current working directory will be served over http at https://localhost:8000.

python -m SimpleHTTPServer 8000

Even better, create an alias –

alias pyserve='python -m SimpleHTTPServer 8000'

Note: you need Python installed on your machine for this to work. OSX should have Python installed by default.

Zipping files

To zip a single file:

zip file.txt

Using the -r flag

zip -r directory

will zip an entire directory.

Concatenating files

Concatenating several files together is as simple as –

cat file1 file2 file3 > newfilename

Minifying files

Grab a copy of YUI Compressor. The only file you need is the .jar file located in the build directory. Rename this file to yui.jar and put it into your main development directory (not your project folders). To minify a JavaScript file, use:

java -jar yui.jar filenamein.js -o filenameout.min.js

A new, minified version of your file will be created. This will also work for css files – obviously it won’t tokenize anything, but it will strip out all the comments and whitespace.

Exporting a MySQL database

This is useful when you need to migrate a local WordPress installation to a live website:

mysqldump -h remotehostip -u username -p databasename > db_name.sql

New Project Template

Most web developers have some sort of base template that they use for each new project. For front-end developer like myself, this template will usually consist of some HTML boilerplate, CSS/SASS templates, a CSS reset, a directory for JavaScript files, maybe a JavaScript library and/or a framework, a directory for images, and a directory for project assets.

Browsing to the template folder, copying it to a new location on my web server, and renaming it to the name of the new project can at best be considered a minor inconvenience; but it’s an inconvenience we can optimise:

function new() {
    cp -R /Volumes/Nikki/WebServer/Template `pwd`;
    mv Template $1;


One final tip – not strictly a Terminal tip, but it certainly helps me in terms of productivity. On my work machines, I block access to Twitter, Hacker News, Google News – anything I catch myself reading when I’m procrastinating rather than working. I do this by using the well known trick of redirecting any outgoing requests for these sites to my local machine.  If you want to do the same, open your hosts file:

sudo mate /etc/hosts

And add a new entry underneath the entry for localhost:

It’s a minor annoyance to unblock it, but it’s enough of an annoyance that I don’t use Twitter on my work machines any more 🙂

What are your favourite Terminal productivity tips?