Pricing a freelance web development job using OmniPlan
Posted: November 10th, 2008 | Author: jonathan | Filed under: business | Tags: business, Examples, Freelance, How To, Mac, OmniPlan, software, Web development |
I like my prices to make sense. This usually means justifying the cost of a particular job by being able to demonstrate to the client the effort involved in a particular area. It’s also useful to know what particular features are expensive because they are difficult, and what ones are expensive because they’re valuable.
To do this, I use OmniPlan from The Omni Group. I love Omni’s software (OmniFocus runs my life, and OmniOutliner stores most of my most important notes), and OmniPlan is built with the same attention to detail as the rest of their apps.
Outlining the effort
The key thing for me is the fact that it uses an outline view for building up your project. Just like OmniOutliner, you can happily drill down deeper and deeper into each “node” in the outline. Each node has a number of attributes, the key one being “Effort”. The amount of effort assigned to each node then translates into a bar on a Gantt chart, and also an addition to the project cost, once you’ve told OmniPlan who’s working on that node, and how much they cost per hour.
Over the couple of years I’ve been doing this, I’ve developed a standard “web development” template that stubs out most of the tasks I carry out during a project. Just like any good outliner, the nesting facility means that I can group the project into discrete blocks, which is great for being able to produce a “top line” summary of what each area of the project will cost.

Where do all these top line numbers come from? Let’s expand out all the items in Core Development outline:

As you can see, the project timeline can now start to build itself from the bottom up. Every task starts out with one hour assigned to it. My first task at the start of a costing is to go through the default outline and prune what isn’t needed for this project, before adding in what *is* needed. I then go through and start to apply time estimates to each task based on previous experience and “best guess” work.
Bubbling up the costs
The great thing about OmniPlan is that it tends to remove the best guess factor from most tasks. Let’s say, for example, that in my first pass I reckon that I’ll need 4 wireframes:

I reckon each layout is going to take me half an hour to do, so in they go, and suddenly my Site Wireframes budget sits at 2 hours. If I realise I need more wireframes as I plan the project, in they go and bump up the cost in a fully justifiable way.
Let’s say, though, that I reckon one of those wireframes is particularly complex because there are lots of variations. I might not have a good handle on how long, say, a progressively enhanced “personal content aggregator” might take to wireframe. No worries - I can nest the various sub-tasks to come up with a proposal:

I now have a better feel for how easy or hard that’s going to be. This is all the kind of stuff you do when planning a project anyway, but the fact that you can make simple changes to subdivisions of tasks and have them percolate up your estimates automatically is a real boon for tracking complex projects.
Show me the money
Once I’ve gone through and assigned time estimates to each part of the project (practically writing the spec as I go, incidentally), I can then use OmniPlan to build timescale estimates and cost them up.
First I switch to the Resource view:

By selecting me (or creating a new resource) and viewing the inspector panel:

I can set hourly rates, and how “available” I am for the project. No, I don’t charge £100 per hour for development. I wish I did.
Back to the Task view, and I expand all tasks, select all, and choose Structure -> Assign Resource -> Jonathan. This hammers through all the hourly estimates and gives me a cost based on my hourly rate, as well as displaying a project total in the status bar at the bottom of the window. By selecting View -> View Options then enabling “Total Cost” in the Outline Columns pane, I can now see how my top line works out:

Awesomeness!
Time keeps on slippin’
Next up is to get a timescale plan. To the right of the outline we get a Gantt chart. The Gantt chart is smart enough to build up a timing plan automatically based on how many people you have working on the project, how available they are, and what dependencies you build into the project.
Since we’ve only got one person working on this full time, we can’t have any concurrency, so it’s all about the dependencies. As you can see, there are some black arrowed lines running from the end of each task group to the beginning of another:

Each one of these arrows represents a dependency, and we set those up quite simply by selecting the task which depends on another one, opening the dependency inspector, and dragging in that task’s pre-requisite and dependent tasks:

This ensures that our Gantt chart never schedules anything before its pre-requisites are completed.
Once all THAT’s done, we select all the tasks and choose Project -> Level Resources. This rebuilds the Gantt based on what we’ve said about the project, and gives us a good estimate of how long the project will take to complete.
All you do is write code, right?
The final super-smart thing about OmniPlan is the ability to restrict a Resource’s availability. Go into Calendar view, and select your resource. By default, that resource is made available to the project full time. Let’s say we only want to spend half of each day on this project, the rest of the time left for maintenance, admin, phone calls, email, and other freelance stuff. Simple - just make sure that the “Normal Work Week” for your resource is set from 8am to 12noon (just drag on the calendar like in iCal).

Now if we go back to the Task view and run Project -> Level Resources again, we’ll see that we now have a much longer looking Gantt chart:

Even better, we can see that the Duration of the project (see the status bar, and click on that to cycle through the various bits of info this can display) is over 2 weeks, but the actual effort involved only spans 4 days.
Now all we need to do is write up our proposal document based on these timings and specs, send to the client, and wait for approval so we can bill them their deposit.
You do charge your clients deposits, don’t you?
Thanks for writing this up. I didn’t know OmniPlan made it all so simple.
And thanks for making your template available. Now I have no excuse to wing it!
Awesome template, thanks! I’ve tweaked it slightly so that I get to factor in the time taken for the initial meetings with the client and developing a proposal because I don’t particularly want to have done that for free.
But yeah, most awesome!
It’s been a while since I’ve used OmniPlan and I never considered using it for small projects, nor for actually coming up with a justifiable cost, just for working out concurrencies in a team.
Thanks for the kind words. Small suggestion: you don’t have to create dependencies to prevent resource concurrency issues. You can use the ‘Level Resources…’ item in the Project menu. Of course, dependencies are still useful for things that have to happen in order, like building the website before making it live at the customer site.
@Lizard:
Cheers for the tip. You can of course use the “Level Resources…” item to pull your tasks into order without having dependencies set up, but I’ve often found that this falls down a little when I make lots of changes to tasks (moving them around, in and out of different groups etc) - the ordering gets knocked out a little.
If you’re not then using the Gantt chart to run your project, that is less important, but I like to be able to present the Gantt chart to clients as at least an indicator of the time likely to be spent, and if things are shuffled out of order, it tends to cause confusion.