How to Scope and Price App Development Projects So You Stay Profitable
Breaking projects into milestones, choosing between fixed-price and time-and-materials, handling scope changes, and using discovery phases to de-risk your quotes
Early in my freelance iOS career, I lost money on a project I had quoted at $18,000. The client needed a fitness tracking app. I looked at the feature list, estimated how long each piece would take, added a small buffer, and sent the quote. It felt right.
Eight weeks later I was still building. The “simple” HealthKit integration turned into a two-week rabbit hole. The client wanted push notification workflows we had never discussed. A login flow I had assumed would use Apple Sign In became a custom email/password system with password recovery, account deletion, and two-factor authentication. I ended up working an extra six weeks beyond my estimate and effectively earned about $22 per hour on a project I had priced for $95.

That project taught me more about app development pricing than any business book. The problem was not that my hourly rate was too low. The problem was that I had no system for scoping the work, no structure for presenting the quote, and no mechanism for handling the inevitable changes that come with every app build.
Over the past eight years I have refined how I scope and price projects. These days, I rarely lose money on a build, and clients almost never push back on my quotes. The difference is not confidence. It is structure.
Breaking a Project into Milestones So the Quote Feels Transparent
The single biggest improvement I made to my pricing was to stop sending one-line quotes. A quote that says “Fitness Tracking App: $35,000” forces the client to evaluate a single large number with no context for what they are getting or when they are getting it. Their only negotiation lever is to push the total number down, which means you either eat the margin or cut scope in ways neither of you have thought through.
Instead, I break every project into milestones. Each milestone is a chunk of work that produces something the client can see, test, or use. And each milestone has its own price.
How I structure milestones for a typical app project
Here is a simplified example for a restaurant ordering app. The actual milestone document I send to clients has more detail, but the structure looks like this:
- Milestone 1: Core menu and ordering flow. The customer can browse the menu, customize items, and place an order. Estimated timeline: 3 weeks. Price: $12,000.
- Milestone 2: Payment integration. Stripe checkout, Apple Pay, order confirmation, and receipt generation. Estimated timeline: 2 weeks. Price: $8,000.
- Milestone 3: Restaurant dashboard. A simple web view where the restaurant owner sees incoming orders, marks them as in progress or complete, and adjusts menu availability. Estimated timeline: 2.5 weeks. Price: $9,000.
- Milestone 4: Push notifications and order tracking. Real-time order status updates for the customer, plus notification preferences. Estimated timeline: 1.5 weeks. Price: $6,000.
Total: $35,000 across four milestones. The client sees exactly what each phase delivers and what it costs. If their budget is $25,000, we can have a productive conversation about which milestone to defer rather than an uncomfortable negotiation where both sides are guessing.
Why milestones change the pricing conversation
- The client understands what drives the price. They can see that payment integration is $8,000 because it involves Stripe, Apple Pay, receipts, and error handling, not because you made up a number. Transparency builds trust, and trust is what gets quotes approved.
- You create natural decision points. After each milestone, the client reviews the deliverable and decides whether to proceed. This reduces risk for both sides. The client is never more than one milestone’s worth of investment away from a working piece of software.
- Budget conversations become productive. Instead of “can you do it for less,” the conversation becomes “can we move milestone 4 to a later phase?” That is a scope conversation, not a price negotiation. You keep your margins intact.
- You get paid as you deliver. Each milestone has its own invoice. You are never in a position where you have done four months of work and are waiting on a single payment at the end. Cash flow is one of the most common reasons freelance developers struggle, and milestone billing solves it.
How granular should milestones be?
I aim for milestones that are one to three weeks of work each. Shorter than a week and you are creating administrative overhead: too many invoices, too many review cycles. Longer than three weeks and you lose the transparency benefit. The client starts wondering what is happening in that long stretch between deliverables.
For larger projects (say, $80,000 or above), I typically have six to eight milestones. For smaller projects in the $15,000 to $25,000 range, three or four milestones usually cover it.
Fixed-Price vs Time-and-Materials: Choosing the Right Model
This is the question I get asked most by other freelance developers. Should you quote a fixed price, or bill hourly? The honest answer is that neither model is universally better. Each one fits certain types of engagements, and using the wrong model for the situation is where most pricing problems start.
When fixed-price works
Fixed-price is the right model when the scope is well-defined and unlikely to change significantly. In my experience, that means:
- The client has detailed wireframes or a design system. When a designer has already defined every screen, interaction, and edge case, the development scope is clear enough to price accurately. My estimate might be off by 10%, but it will not be off by 300%.
- You have built something similar before. If you have shipped three e-commerce apps and a client needs a fourth, you know where the complexity hides. Your estimate is based on experience, not guesswork.
- The project has a hard budget ceiling. Some clients, especially funded startups burning through a seed round, need to know the exact cost upfront. A fixed-price quote gives them that certainty.
When I quote fixed-price, I build in a margin of 15% to 25% above my honest time estimate. That margin is not padding. It is the cost of absorbing the uncertainty that comes with every software project. Debugging a strange iOS simulator issue, handling an App Store rejection you did not anticipate, accommodating a third-party SDK that behaves differently than its documentation claims. Those things happen on every project.
When time-and-materials works
Time-and-materials (T&M) billing, where you charge an hourly or daily rate for the time you spend, is the right model when scope is uncertain or expected to evolve:
- The project is exploratory. The client has an idea but no wireframes, no technical spec, and possibly no clear feature list. They need to figure out what to build as they go. Fixed-pricing this is a guaranteed way to lose money.
- The client wants ongoing iteration. Some projects are not a single build. They are a continuous process of shipping, testing with users, and iterating based on feedback. A weekly retainer or hourly rate makes more sense than a fixed quote for work that is deliberately open-ended.
- The technical complexity is genuinely unknown. If the project involves integrating with a legacy API you have never worked with, or building on top of an existing codebase you have not reviewed, the unknowns are too large for a responsible fixed-price estimate.
I usually set a weekly billing cap for T&M projects, so the client knows the maximum they will spend in any given week. Something like: “My rate is $125 per hour, capped at 35 hours per week, so your maximum weekly cost is $4,375.” The cap gives the client predictability without locking you into a fixed scope.
A quick comparison
| Factor | Fixed-Price | Time-and-Materials |
|---|---|---|
| Scope clarity | High, defined upfront | Low to medium, expected to evolve |
| Risk bearer | You (overruns come out of your margin) | Client (pays for actual hours) |
| Client budget certainty | Exact total known upfront | Estimated range with weekly cap |
| Best for | Well-scoped builds with clear deliverables | Exploratory work, iteration, unclear scope |
| Change handling | Change orders required | Absorbed naturally into weekly hours |
In practice, many of my projects use a hybrid. I will quote the first milestone or discovery phase at a fixed price, then switch to T&M for the build phase if the scope is still fluid. That gives the client a low-risk entry point and gives me the flexibility to adapt as the project evolves.
Handling Scope Changes Mid-Project Without Awkward Renegotiations
Scope changes are not a failure of planning. They are a normal part of building software. The client sees the first milestone running on their phone and realizes the user flow needs a step they had not thought of. They get feedback from their business partner who wants a feature added. A technical constraint forces a different approach than what was originally planned.
If you have been freelancing for more than a year, you know this is going to happen on every project. The question is not how to prevent scope changes. It is how to handle them in a way that keeps both sides happy and keeps you profitable.
The change order approach that actually works
When a client requests something that was not in the original scope, I follow a simple process:
- Acknowledge the request immediately. Never ignore or delay responding to a scope change. The client needs to know you heard them and are taking it seriously.
- Assess the impact. I take a day to figure out how the change affects the timeline and cost. Not a guess on the spot, an actual assessment. What does this feature require? What existing work does it affect? How much additional time does it add?
- Present the options. I send the client a brief note that looks like this: “Adding the saved-favorites feature would take about a week of additional development, roughly $5,000. We can add it to the current milestone (which extends delivery by a week), or we can add it as a separate milestone after launch. Which would you prefer?”
- Get written agreement before starting. The client confirms in writing (an email is fine) which option they want and that they understand the cost impact. Then I update the project timeline and proceed.
Why this works without creating friction
Notice that at no point in this process did I say no. I did not push back on the change, complain about scope creep, or make the client feel guilty for having a new idea. I just told them what it would take and let them decide.
Most scope change friction comes from one of two places: the developer feeling resentful about free work, or the client feeling blindsided by surprise costs. My approach eliminates both. The client knows exactly what the change costs before they commit, and I know I am getting paid for the work before I start it.
Small changes vs big changes
Not every change needs a formal change order. If a client asks me to adjust the color of a button, tweak some copy, or move an element on a screen, I just do it. Those are part of normal iteration and they take minutes, not days.
The line I draw is about effort. Anything that adds more than a few hours of work gets the change order treatment. Over time, you develop a feel for where that line is. The key is to be consistent. If you sometimes absorb large changes for free and sometimes charge for them, the client never knows what to expect, and that unpredictability creates more tension than the charges themselves.
Keeping a running scope log
I keep a simple shared document for each project that lists every agreed-upon change alongside the original scope. Nothing fancy, just a running list with the change description, cost, date agreed, and current status. This does two things: it gives the client visibility into how the project has evolved from the original plan, and it provides me with documentation if there is ever a question about what was agreed to.
Using Discovery Phases to De-risk Pricing
The discovery phase is the single most effective pricing tool I have found. It is a paid engagement (usually one to two weeks) where I work with the client to define the project scope before committing to a full build quote.
I started offering discovery phases about four years ago, and they have eliminated most of the pricing problems I used to have. Here is why they work.
What a discovery phase includes
My standard discovery engagement produces three deliverables:
- A feature map. Every feature the app needs, organized by screen or user flow, with notes on technical complexity. Not wireframes, just a structured list that makes it impossible to miss something in the estimate.
- A technical assessment. Notes on the key technical decisions: which third-party services to use, what the data model looks like, where the complexity hides (push notifications, background sync, payment processing, device hardware integration), and what I am uncertain about.
- A milestone-based quote for the full build. The actual price proposal, broken into milestones with timelines and costs. This quote is far more accurate than anything I could produce from a one-hour kickoff call, because I have spent one to two weeks understanding the project.
How I price the discovery phase
I charge a flat fee for discovery, usually between $2,500 and $5,000 depending on the project’s complexity. For a straightforward app, $2,500 covers it. For something with complex integrations, multiple user roles, or regulatory requirements, $5,000 is more appropriate.
Some freelancers offer the discovery phase for free to win the project. I do not recommend this. A paid discovery phase does two things: it filters out clients who are not serious (someone willing to pay $3,000 for a discovery phase has real budget and real intent), and it establishes from the start that your time and expertise have value. If the client wants free estimates, there are hundreds of developers on marketplaces who will give them one.
Why discovery phases de-risk pricing for both sides
- For you: The quote you produce after discovery is based on actual understanding of the project, not assumptions made during a sales call. You have mapped the features, identified the technical risks, and asked the questions that reveal hidden complexity. Your margin of error drops from 50% or more down to 10% to 15%.
- For the client: They get a detailed, transparent quote with milestones they can evaluate. They know exactly what they are paying for at each stage. And if they decide after the discovery phase that the project is too expensive or not the right timing, they walk away having spent $3,000 instead of committing to a $40,000 build that might not fit their budget. They also keep the deliverables (the feature map and technical assessment) which they can take to another developer if they choose.
Handling the “can you just give me a ballpark” request
Clients almost always want a rough number before committing to a discovery phase. That is reasonable. I give them a range: “Based on what you have described, projects like this typically land between $30,000 and $50,000. The discovery phase would give us both a specific number with a detailed breakdown. Want to start there?”
The range is intentionally wide enough to be honest. If the client’s budget is $10,000, the range tells them upfront that this might not be the right fit, and that saves both of you from wasting time on a discovery phase that leads to a quote they cannot afford.
The Numbers: What Good Scoping Does to Your Profitability
Let me share some before-and-after numbers from my own freelance practice. These are rough, but they illustrate the difference that structured scoping and pricing makes.
Before I used milestone-based scoping and discovery phases (my first three years freelancing):
- Average project size: $15,000 to $20,000
- Projects that went over estimate: about 60%
- Average overrun on those projects: 40% more hours than estimated
- Effective hourly rate after overruns: $35 to $55
- Quote approval rate: about 40%
After (the past five years):
- Average project size: $30,000 to $45,000 (higher because discovery surfaces the true scope)
- Projects that went over estimate: about 15%
- Average overrun on those projects: 10% more hours than estimated
- Effective hourly rate after overruns: $90 to $120
- Quote approval rate: about 75%
The higher approval rate surprises people. You would think that more detailed, higher-priced quotes would get rejected more often. The opposite is true. Clients approve milestone-based quotes more often because they can see exactly what they are paying for. A $35,000 quote with four clear milestones feels more manageable and trustworthy than a $25,000 quote that is just a number.
A Practical App Development Pricing Framework
Here is the framework I use for every new project inquiry. It works whether the project is $10,000 or $100,000.
- Initial conversation. Understand the client’s goals, budget range, and timeline. Give them a rough range if they ask. Determine whether the scope is clear enough for a fixed-price quote or whether it needs a discovery phase first.
- Discovery phase (if needed). A paid, one to two week engagement that produces a feature map, technical assessment, and milestone-based quote. Price: $2,500 to $5,000.
- Milestone-based quote. Break the project into milestones with individual prices and timelines. Choose fixed-price for well-scoped milestones, T&M for uncertain ones.
- Build with change management. As scope changes come in, assess the impact, present options with costs, and get written confirmation before starting the additional work.
- Milestone billing. Invoice at each milestone completion. Never do more than three weeks of work without getting paid.
This framework is not complicated. It is a series of small, sensible steps that protect your profitability while giving the client transparency and control. The clients who are worth working with appreciate this structure. The ones who resist it, who insist on a single fixed price with no discovery and no change process, are usually the ones who would have been difficult regardless.
Getting Started: Your First Steps
If you are a freelance app developer still sending one-line quotes and hoping for the best, here is what I would change this month:
- Take your next project inquiry and break it into milestones before you quote it. Even if you have never done this before, spend an extra hour mapping the work into three or four chunks with individual prices. See how the conversation changes when you present that to the client instead of a single number.
- Pick a pricing model that matches the scope clarity. If the client has detailed designs and a clear feature list, quote fixed-price. If they are still figuring out what they want, propose a paid discovery phase or a T&M arrangement. Do not force a fixed price onto an uncertain project.
- Write up a simple change order process. It does not need to be fancy. Just a one-paragraph description of how you handle scope changes: you assess the impact, present options with costs, and get written agreement before starting. Share it with the client at the start of the project.
- Track your effective hourly rate on your next project. Divide the total payment by the total hours worked. If that number is significantly lower than your target rate, you have a scoping or pricing problem. The steps above will fix it.
The developers who build sustainable freelance businesses are not the ones who charge the highest rates. They are the ones who scope accurately, price transparently, and manage change effectively. Those are skills you can learn, and they will do more for your profitability than any rate increase.
If you are building referral partnerships with designers, marketers, or other developers who send you project leads, having a clear scoping and pricing process makes those relationships stronger too. Your referral partners look good when the clients they send you have a smooth, professional experience from quote to delivery. If you want a simple way to manage those referral agreements and payments, take a look at what PureIntro offers for tech and digital professionals.
This post reflects one professional’s experience and is for informational purposes only. It is not business, legal, financial, or professional advice. Results described are individual and not guaranteed. Referral fee arrangements may be subject to state and local regulations. Consult a qualified professional for guidance specific to your situation. PureIntro facilitates referral tracking and payment processing but does not guarantee payments between users or any particular business outcome.