A while ago, Steve hired a programmer, who then contacted me about the job. See, it was his first freelance gig, and he didn’t know how to estimate the time to complete. Here’s what I sent him, minus the specifics of the job:

If you’ve never done an estimate of hours before, think in terms of HOW you work. For example, if you work 4 hours / night, and this will take 3 full nights to do, then it’s 12 hours. Most things are at least 1 hr; nothing is under 1/2 hour. Then double that number, and that’s what you should estimate. This will also double your time to complete the project, but never miss a deadline that you set. Spell out exactly what’s included – anything not written down is not included. Make this a bullet-list.

Then track your time and what you’re doing; again, anything beyond what you quoted is additional. When you bill, however, bill actual time, as long as it’s not over your quote. So if you quote 24 hours, but you do it in 14, bill 14. You’ll have happy clients that way.

I’d estimate this project like (everything within ()’s has been replaced with generic terms):

Research (some web 2.0 service) API – 1 hr
Research (another service) API – 1 hr
Database design – 1 hr
Import (set of data) & (other data) – 2 hr
(Data reader) – 1 hr
Cron to (do work) via (service) – 3 hr
(Output page) – 1 hr
Admin tool to manage (some data in the database) – 1.5 hr
Admin tool to manage (more data in the database) – 2 hr

This totals 13.5 hours, so my estimate would be 27 hours. When you’re asked to do something that’s above this estimate, tell the client you can do that, but its beyond the original estimate and would be an additional x hours. Even if it’s small (1/2 hr), bill them extra for it. They’ll respect you and won’t take advantage of asking for free things.

Depending on the size of the project, get 1/2 up front and 1/2 upon delivery. Some projects I do 1/3 1/3 and 1/3.

I used this method for years and always have more than enough work to do; if you’re good at what you do, and you’re fair about it, people will come back to you.

So if you’re just starting to take on freelance programming jobs, I hope this post helps you accurately quote your jobs, retain your current clients, and earn more from the referrals that’ll come in.

4 Comments » for How to Estimate a Programming Job
  1. Robert says:

    If this actually works and you have always been able to meet your delivery dates (both big ifs) then every programmer in the world needs to read this. So many programmers miss their deadlines it’s pathetic.

  2. grandpajim says:

    This is good advice for eny programmer – freelance or employed.

  3. PolarLava says:

    Very good Eric. I wish things worked out this well in my world. It’s getting better, but we all know it’s far from being an exact science and is more of a fine art. 🙂

  4. Eric Hall says:

    I have doing web design and development work in the Fort Wayne area (my home town) for almost 5 years now and have informally stumbled upon the practices you talk about. Great advice and served as a good reminder for me.

5 Pings/Trackbacks for "How to Estimate a Programming Job"
  1. […] is a must-read post by @esnagel (programmer extrordinaire) if you’re a programmer that is doing consulting, or […]

  2. Quoting Programming Work…

    So, this morning I was reading an article by Eric Nagel (via Steve Poland) about how to estimate the cost of a consulting gig for a client.  Mr. Nagel recommends figuring out about how much time you think it will take, then doubling it and providing t…

  3. […] this morning I was reading an article by Eric Nagel (via Steve Poland) about how to estimate the cost of a consulting gig for a client.  Mr. Nagel […]

  4. […] read of the day: How to estimate a programming job, when you have to quote for a […]

  5. […] presented in nearly 4 years… this time I’m quickly summarizing my thoughts on how to estimate a programming job. The audience should be mostly IT people, so hopefully this will help freelancers and 9-5ers alike. […]

Leave a Reply

Your email address will not be published. Required fields are marked *