For years, we did what every agency does: estimate every project as a pile of effort units. "This feature is small. That integration is large. The whole thing is several months." Then we'd track activity and have the same conversation every month: why did it take longer than estimated?
The problem isn't that estimates are inaccurate. The problem is that activity-based pricing rewards the wrong incentives. When effort is the commercial unit, speed is punished. Efficiency means less revenue. Taking longer means more. That's a perverse incentive that haunts the entire agency model.
We switched to fixed-scope, milestone-based pricing three years ago. Here is what changed.
Incentives aligned with outcomes
Now, when we finish a milestone early, everyone wins. The client pays the same fixed price but gets their feature sooner. We reclaim the surplus time to invest in architecture, testing, or starting the next milestone ahead of schedule. Nobody is padding estimates because the commercial model is tied to shipped outcomes.
The key was splitting projects into milestones small enough (2–4 weeks) that risk is bounded. If a milestone takes longer than expected, we absorb it, but the next milestone still starts on time. The client never pays more. That discipline forced us to get good at scoping.
How we estimate now
We still estimate, but in relative terms. A feature is Small, Medium, Large, or X-Large, anchored to past work of similar complexity. A Small is a milestone we can ship in a sprint. An X-Large might take two sprints and gets broken down before we start. The unit is always what can we deliver in two weeks, not how much activity can we report.
This shifted the conversation from tracking activity to tracking outcomes. Clients stopped asking for effort reports and started asking what shipped this week. That is a much healthier dynamic.
The hidden cost of activity-based pricing
The biggest cost isn't financial. It's cognitive. When every minute is monitored, developers think about reporting instead of thinking about problems. The best code I have ever seen was written by engineers who forgot the clock existed. Activity tracking creates a low-hum anxiety that erodes the very focus you are paying for.
Fixed-price milestones let our team do deep work without the timer running in their peripheral vision. The quality difference in the output is night and day.
When it doesn't work
To be fair: pure discovery work (R&D, early-stage prototyping) is hard to scope this way. For those engagements, we use sprint blocks: a senior team, a clear budget envelope, and a broad scope that gets refined week by week. The principle is the same: predictable costs and outcome-focused delivery.
The model works because we staff every project with senior engineers who can accurately judge complexity. If you staff juniors and hope for the best, activity-based billing hides your estimation errors. We stopped hiding.