Mariano Abdala

Fixed quotes

Most freelancers I talk to would prefer to work on fixed quote projects but are afraid of loosing money by underestimating the effort the project may imply. Working hourly instead, typically means less freedom and risk.

I’ve been working independently for quite a while and I’ve learnt a few lessons the hard way. Number one lesson is communicate in time what you are quoting for and what not.

There are a few things you can start doing on your next fixed quote to lower the risk without loosing the freedom that comes with this kind of contract1.

Getting in touch

Know who you’d be working for. Google them, LinkedIn them, ask around, the chances are someone you know worked with this guy.

Have your portfolio up to date, but most importantly have a list of apps you did or contributed to handy. iOS apps are all about users’ experiences, share those with your potential customer. Make sure the link works in all stores (not just U.S.). Include your links on your first email and give the potential customer time to play around with them.

Understand what they are trying to do. Making the right questions will impress anyone2, and you’ll need this to be able to write a quote they’ll be able to commit to.


Writing the quote

Set the mood. Explicitly clarify that all previous documents are just a guide to this document you’d be creating, this will prevent you from ever hearing “this was included on the design draft version 3” or “you told me [really hard feature] could be done” or “I said I wanted the app to work just like [million dollar app]”.

Write a brief. Two or three paragraph with the main idea behind the app, what’s the user expecting and what’s the customer expecting. A little why won’t hurt.

[re-]Write the project’s requirements. If you write them yourself you can’t miss. Requirements can include screens, the information they show, the input they take and they interaction they have with the server and third party APIs (including Apple’s3).

For example:

Locations screen
When the locations screen is shown, a list of available locations will be fetched from the server. When the list is fetched, all available locations will be shown. Each location will display the name, a preview image and the distance from the user’s present location.

If the user taps a location the location screen will be shown for that particular location.

Specify the targets. Which OS’s and devices will be covered, be realistic.

Specify all other aspects of the app such as: localization, accessibility, device orientation(s), local storage, security.

Get paid. Establish when and how you’ll be paid.

  1. Payment in advance. 30% is pretty standard. Be flexible to move this, but sure you don’t go below 10%. Many projects fail to start, if the customer wants to schedule your time he has to pay. Payment in advance normally implies commitment.

  2. Basic feature set payment. When the app does what it needs to do you can ask for another 50%. Try to exclude from this phase aesthetic or nice-to-have features, such as: apply custom design, settings screen, alternate screens (like portrait mode), third party connections (like posting to Twitter, Facebook, 4square). But make sure the app is almost ready.

  3. BEFORE submitting to the AppStore. Full payment.

  4. If everything goes wrong. Take note of every hour you spend on the project and specify the fee for that.

My terms. I’ve never heard a complain about these:

I’m not responsible for submitting this app to the AppStore or its approval if ever sent.

Meaning you’ll help them thru the process but they’ll have to be the publishers, and you can’t be held responsible if the app is rejected for non-technical reasons.

I’m not responsible for the distribution of the app.

If the AppStore goes down or the app doesn’t appear on the search, it’s not my fault.4

I’m not responsible for the development, maintenance or good functioning of the webservices (including the push notification service).

Unless you are.

The services will be subject to my requests.

The customer may have an API in place for their website. For performance reasons (among others) web and mobile API may not be the same.

I will solve free of charge all bugs caused by our development encountered *until* the app is sent to the AppStore. Bugs find on AppStore users will be subject to a maintenance fee.

This will force your customer to test. And if the app is a HUGE success you won’t be giving support to a million users.

Any changes requests will be quoted and sent to a future version.

You can be flexible here, but be sure you have a clause that allows you to say ‘no’ to a change request.

This quote is only valid for 15 days.

This will cover your back from people that come after two years asking you to build that one app.

If the project were to be cancelled, all development hours will be paid, plus 20% of the total project cost, never exceeding the 100% of the total project cost. Development hourly cost is [hourly fee].

Worst case scenario you get paid as if it were an hourly contract.

All payments will be done via [wire transfer|paypal|xoom] to a [country: based bank account].

Make sure you don’t have to go collect by getting a key to a locker with the money, on an airport, being watched by Interpol.

I’m entitled to add the application to my portfolio and claim authorship over its development, yet all the code generated during the project is own by the client.

Otherwise, charge more. See getting in touch > portfolio.

This quote doesn’t imply availability, the developer’s time will be reserved after the initial payment is met.

Keep your options open until you have the money on your pocket.

Do a helluva job.


  1. Some of these advices are specific to iOS, but most apply to all software contractor work. ↩︎

  2. Much more than being able to type the standard tableView:cellForRowAtIndexPath: method by heart. ↩︎

  3. InApp purchases, Push notifications, iPod’s library, Contacts, Media Library, etc. ↩︎

  4. No matter how silly it sounds to you, include this clause on your quotes. ↩︎

  1. marianoabdala posted this