Skip to content

Product · 9 min read

Software Project Milestones and Acceptance Criteria: How to Structure a Build

How to split an app and admin dashboard build into milestones with testable acceptance criteria, sign-off rules and payments tied to working software.

Zohaib KhalidZohaib KhalidCEO & Co-founder, Innovation InsightPublished
Team lead pointing at sticky notes on a whiteboard while colleagues with laptops plan the work

Short answer

Split the build into four to six milestones of two to six weeks, each ending in software you can use on a staging server, not a document. Give every milestone a short list of acceptance criteria written as checks a non-engineer can run (given this, when I do that, then I see this), a five-working-day review window, and a payment released only when the checks pass. Agree what counts as a defect and what counts as a change before the first invoice.

Why milestones go wrong

Most milestone disputes come from the same three gaps: a milestone defined as a stage of work ("backend complete") rather than something the client can try, acceptance criteria that say "works as expected", and no agreement on how long the client has to test or what happens if they never reply. Fix those three before you approve a build and most of the rest takes care of itself. This guide uses a common shape: a customer mobile app plus a web admin dashboard, built by an outside team.

Rule 1: every milestone ends in working software

A milestone should finish with something you can open on a staging server or a TestFlight or Play test build and click through yourself. "Database design", "API development" and "UI design" are activities, not milestones; you cannot check them and you cannot tell whether they are half done. Slice the work vertically instead, so each milestone delivers a thin but complete flow from the screen to the database.

MilestoneWhat you can use at the endTypical length
0. DiscoveryClickable prototype of the main flows, written scope, architecture note, a fixed estimate for milestones 1 to 51 to 3 weeks
1. Foundations and sign-inStaging app and admin you can log in to; roles created; deploy pipeline running; one screen with real data2 to 3 weeks
2. Core flowThe one journey the product exists for, end to end (for example browse, book and pay) on test payments3 to 6 weeks
3. Admin and operationsAdmin dashboard: users, orders or bookings, refunds, content, exports and an audit log2 to 4 weeks
4. Secondary featuresNotifications, profiles, search, reviews, settings: everything the launch scope lists beyond the core flow2 to 5 weeks
5. Hardening and launchPerformance and security fixes, analytics, store submissions, production deploy, handover documents2 to 3 weeks

Discovery is worth paying for separately ($3k to $8k with us) because it turns a wish list into the scope the later milestones are measured against. If a vendor will not estimate milestones 1 to 5 until discovery is done, that is a good sign, not a delay.

Rule 2: write acceptance criteria as checks, not adjectives

Acceptance criteria are the list you will tick when the milestone is delivered. Each one should be something you can do yourself, with an outcome you can see. The given-when-then format keeps them honest:

Vague (do not sign this)Testable
Users can registerGiven a new email address, when I sign up and click the link in the confirmation email, then I land on the home screen logged in; using the same email again shows "account already exists"
Payments workGiven a test card 4242 4242 4242 4242, when I book a slot, then I see a confirmation, receive a receipt email, and the booking appears in the admin with status Paid; a declined test card shows an error and creates no booking
Admin can manage usersGiven an admin account, when I search for a user by email, suspend them and they try to log in, then they see "account suspended" and the action appears in the audit log with my name and the time
App is fastHome screen shows content within 2 seconds on a mid-range Android phone on 4G for a list of 50 items; measured on the device named in the scope
SecureA customer account cannot open another customer's booking by changing the ID in the URL or API request; passwords are never shown or emailed; sessions expire after the agreed time

Five to fifteen criteria per milestone is about right. Fewer means the milestone is vague; many more usually means it is too big. Add the non-functional ones that matter to you (devices and browsers, accessibility level, performance, languages) to the milestone where they first apply, not to a separate list nobody checks until launch.

Rule 3: agree the review window and what happens on silence

  • Review window: five working days from the delivery note is common. The vendor sends a short note listing each criterion with how to test it and any known issues.
  • Outcome: you either accept, or reject with a list of failed criteria. A rejection must point to a criterion; "I don't like it" is a change request, not a failure.
  • Fix and re-test: the vendor fixes failed criteria at its own cost and re-submits; you re-test only those items, within three working days.
  • Deemed acceptance: if you neither accept nor reject within the window, the milestone counts as accepted. Vendors ask for this so projects cannot stall; clients should make sure the window is long enough for them to test.
  • Live use: if you put a milestone into production use, it counts as accepted for the parts in use.

Rule 4: separate defects from changes before work starts

A defect is software that fails an agreed criterion or breaks something that used to work; fixing it is the vendor's cost. A change is anything new or different from the agreed scope; it is estimated and approved before work starts. Write both definitions into the statement of work and agree a simple change process: a one-paragraph request, an estimate in hours and days, your written approval, then the work. Most fixed-price projects that go over budget did not lack a change process; they lacked the discipline to use it for small things.

Our free statement of work template has milestone, acceptance and change-control clauses you can adapt, and the PRD template has a section for writing acceptance criteria per feature.

Rule 5: tie money to accepted milestones

Payment modelHow it worksGood for
Deposit plus milestones10 to 20 percent up front, the rest split across milestones and released on acceptanceFixed-price builds with a clear scope
Milestones plus retentionEach milestone paid at acceptance minus 10 percent, released after a 30-day warranty period at launchClients who want leverage for post-launch defects
Time and materials with milestone reviewsMonthly invoices for hours worked; milestones used to check progress, not to trigger paymentProducts where the scope will change as you learn

Whichever you choose, make the warranty explicit: how long after launch defects are fixed free (30 to 90 days is common), and what support costs after that. Our fixed price vs time and materials guide covers when each model fits, and ongoing support is priced on our maintenance and support page from $1,500 a month.

What you should get at each milestone

  • A staging URL and test builds you can use, with test accounts for each role.
  • A delivery note listing each acceptance criterion, how to test it, and known issues.
  • The code in your repository, not the vendor's, with the commits for the milestone.
  • A short demo call where the team walks you through the flow and you try it live.
  • An updated plan: what is next, any risks, and any change requests waiting for your decision.

A worked example: booking app and admin dashboard

Say the scope is a customer app for booking appointments at a chain of studios, plus an admin dashboard for staff. A typical build with us runs four to six months for $50k upwards depending on features; a lean first version can sit inside our MVP range of $15k to $45k. Milestone 2 (the core flow) might carry these criteria: a customer can pick a studio, see available slots for the next 14 days, book and pay with a test card, receive an email and push confirmation, and cancel up to 24 hours before for a full refund; staff see the booking in the admin within 5 seconds; a slot cannot be double-booked when two customers tap at the same time. Each line is something you can check on a phone in under five minutes.

If you are taking over a project that is already in trouble, start with a code and delivery audit before you write new milestones; our codebase takeover checklist covers what to look at first. And for a budget before any of this, the app development cost calculator gives an instant range by feature.

Sources

Need a number for your project?

Send a short brief and get a written estimate.

A senior engineer replies within one business day. No sales call required.

Zohaib Khalid, CEO & Co-founder, Innovation Insight

Zohaib Khalid

CEO & Co-founder, Innovation Insight

Zohaib leads strategy, client partnerships and delivery at Innovation Insight. He has spent a decade turning founder briefs into products that ship and still reviews every proposal that leaves the company.

LinkedIn
FAQ

Related questions.

How many milestones should a software project have?

Four to six for a build of three to six months, each two to six weeks long. Fewer means you see working software too late; many more creates review overhead without adding control.

Who writes the acceptance criteria?

The vendor drafts them during discovery and the client edits and approves them before the milestone starts. The client owns the final wording because they will be the one testing against it.

What if the software passes the criteria but I don't like it?

Then the criteria were met and the change is a change request: it is estimated and approved like any other new work. That is why it pays to review the prototype carefully in discovery.

Should I hold back a retention payment?

On fixed-price projects a 10 percent retention released after a 30-day warranty period is reasonable and common. On time-and-materials work it is unusual; agree a warranty period instead.