>soren hale — frontend developer
// Writing
Estimates that hold
Why I quote in ranges, what goes in the gap, and how often I have been wrong.
- to read
- 2 min
- published
- 2026-03-21
- filed under
- Career

I have kept a spreadsheet of every estimate I have given since 2019, next to what the work really took. Sixty three rows. On average I was 22% under. I have not been under since I changed three things.
Ranges, not numbers
Four to six weeks tells a client what I know and what I do not. Five weeks only pretends. The width of the range is information: a narrow one means I have built this before, a wide one means we should spend two days finding out before anyone signs.
Name the unknowns
Every quote lists the two or three things that could move it. If one of them happens, nobody is surprised, and the conversation is about the thing rather than about me.
Checkout rebuild 4 to 6 weeks
Moves the range:
- the payment provider's sandbox is as slow as last time +1 week
- address lookup needs a second supplier for two countries +3 days
- design for the error states arrives after week 2 +1 week
Clients read that block more carefully than anything else I send.
Ship in week one
Something real, deployed, however small. It is the cheapest way to find out what the estimate missed: the build takes nine minutes, the staging data is two years old, the login needs a ticket to another team.
What the spreadsheet says now
- Work I had done before: within 10% every time.
- Work with one unknown: the top of the range, almost always.
- Work with three unknowns: I should have sold a discovery week instead.
The last line is the one that changed my business. A paid week of finding out is easier to sell than it sounds, and it has never once made the real quote larger than the guess would have been wrong.
// Writing
Estimates that hold
Why I quote in ranges, what goes in the gap, and how often I have been wrong.
- to read
- 2 min
- published
- 2026-03-21
- filed under
- Career

I have kept a spreadsheet of every estimate I have given since 2019, next to what the work really took. Sixty three rows. On average I was 22% under. I have not been under since I changed three things.
Ranges, not numbers
Four to six weeks tells a client what I know and what I do not. Five weeks only pretends. The width of the range is information: a narrow one means I have built this before, a wide one means we should spend two days finding out before anyone signs.
Name the unknowns
Every quote lists the two or three things that could move it. If one of them happens, nobody is surprised, and the conversation is about the thing rather than about me.
Checkout rebuild 4 to 6 weeks
Moves the range:
- the payment provider's sandbox is as slow as last time +1 week
- address lookup needs a second supplier for two countries +3 days
- design for the error states arrives after week 2 +1 week
Clients read that block more carefully than anything else I send.
Ship in week one
Something real, deployed, however small. It is the cheapest way to find out what the estimate missed: the build takes nine minutes, the staging data is two years old, the login needs a ticket to another team.
What the spreadsheet says now
- Work I had done before: within 10% every time.
- Work with one unknown: the top of the range, almost always.
- Work with three unknowns: I should have sold a discovery week instead.
The last line is the one that changed my business. A paid week of finding out is easier to sell than it sounds, and it has never once made the real quote larger than the guess would have been wrong.
// Writing
Estimates that hold
Why I quote in ranges, what goes in the gap, and how often I have been wrong.
- to read
- 2 min
- published
- 2026-03-21
- filed under
- Career

I have kept a spreadsheet of every estimate I have given since 2019, next to what the work really took. Sixty three rows. On average I was 22% under. I have not been under since I changed three things.
Ranges, not numbers
Four to six weeks tells a client what I know and what I do not. Five weeks only pretends. The width of the range is information: a narrow one means I have built this before, a wide one means we should spend two days finding out before anyone signs.
Name the unknowns
Every quote lists the two or three things that could move it. If one of them happens, nobody is surprised, and the conversation is about the thing rather than about me.
Checkout rebuild 4 to 6 weeks
Moves the range:
- the payment provider's sandbox is as slow as last time +1 week
- address lookup needs a second supplier for two countries +3 days
- design for the error states arrives after week 2 +1 week
Clients read that block more carefully than anything else I send.
Ship in week one
Something real, deployed, however small. It is the cheapest way to find out what the estimate missed: the build takes nine minutes, the staging data is two years old, the login needs a ticket to another team.
What the spreadsheet says now
- Work I had done before: within 10% every time.
- Work with one unknown: the top of the range, almost always.
- Work with three unknowns: I should have sold a discovery week instead.
The last line is the one that changed my business. A paid week of finding out is easier to sell than it sounds, and it has never once made the real quote larger than the guess would have been wrong.
// Start a project
Tell me what you are building.
Three quick picks so the first reply is useful. You finish the message on the contact page.
// Start a project
Tell me what you are building.
Three quick picks so the first reply is useful. You finish the message on the contact page.
// Start a project
Tell me what you are building.
Three quick picks so the first reply is useful. You finish the message on the contact page.