Set up project milestones and invoice per milestone

Last updated: Aug 24, 2026

A project's payment schedule breaks the contract into milestones — deposit, stages, final — and each milestone becomes its own invoice with one click. The schedule lives at the top of the project page under Payment schedule, and as the header says, "nothing is ever sent automatically": creating a milestone invoice makes a draft that you review and send yourself.

Before you start

  • Create the project first. If you attached an estimate, its line items are waiting as one-click schedule suggestions.
  • Creating invoices from milestones requires invoice permission — an owner or admin can grant it. Without it you can still build the schedule; the invoice buttons just won't appear.

Step 1 — Add milestones

Open the project (from Projects in the sidebar or from the customer's page) and use either path:

  • From the estimate — if estimates are attached, a collapsible strip offers their line items: "click to schedule". Click a line and it becomes a milestone with that line's amount; use the group's Add all button to schedule every remaining line at once. Added lines turn green with a check, and the strip disappears once everything is scheduled.
  • By hand — click Add milestone (or Build schedule in the empty state). Type the Milestone name, then enter either an Amount in dollars or a % of the contract value — filling one clears the other. Click Add.

Adding from estimate lines confirms with a "Milestone added" toast (or a count when you add several at once); a by-hand Add simply appends the row to the schedule.

Step 2 — Check the schedule against the contract

The schedule header compares the milestone total to the contract value:

  • A green check pill means the schedule equals the contract.
  • An amber pill shows both figures when they differ, so you can spot a missing stage or a typo.

If you scheduled every estimate line and a gap remains, that's usually the estimate's tax or a document-level discount — those sit on the estimate's total, not on individual lines. Add a final milestone by hand to cover the difference if you want the schedule to match exactly.

Use the up/down arrows on each row to reorder the schedule, and the pencil to edit a milestone's name, note, or (until it's invoiced) amount.

Step 3 — Invoice a milestone

Each milestone row shows its state and the matching action:

StateWhat it meansAction on the row
UpcomingNot billed yetCreate invoice — makes a draft invoice for the milestone amount
DraftInvoice created, not sentOpen invoice — review and send it
SentInvoice sent, unpaidRecord payment
PartialPartly paidRecord payment — the row shows paid vs remaining
PaidFully paidView
CancelledIts invoice was cancelledRe-invoice — creates a fresh draft

Clicking Create invoice builds a draft invoice and opens it so you can review, adjust, and send it — see sending an invoice pay link. The milestone's state updates automatically as the invoice moves from draft to sent to paid; you never set milestone status by hand.

Step 4 — Track collection

Once milestones exist, a progress bar under the header shows three figures at a glance: Paid (green), Invoiced (open invoices), and Remaining (not yet billed). These figures are measured against the schedule total (the sum of your milestones). Project-wide money — all revenue and costs — lives in project P&L.

What your customer sees

If you share the customer portal link, the customer's portal shows the project with a Payment schedule section: each milestone's name and amount with a plain status — Upcoming, Invoiced, Partially paid, or Paid — plus a link to each milestone's invoice. They also see the contract total, what has been invoiced, what they've paid, and what remains. Your costs, expenses, and profit are never shown to the customer.

Troubleshooting

  • "Already on the schedule" — the estimate line you clicked was already added (usually a double-click or a second browser tab). No duplicate is created.
  • An estimate-line chip says "no amount" — the line has a zero amount. You can still add it, then set the amount before invoicing.
  • A chip is disabled with a discount warning — that line's discount exceeds its price, so it can't become a milestone. Fix the line on the estimate first.
  • The amount box is greyed out when editing — an invoice already exists for that milestone, so the amount is locked. Cancel the invoice to change what's billed, then Re-invoice.
  • You can't delete a milestone — only Upcoming milestones show the delete button. A milestone with an invoice follows its invoice instead.
  • No Create invoice buttons anywhere — your login doesn't have invoice permission. An owner or admin can grant it under roles and permissions.

FAQ

Does Dispatch Bros send milestone invoices to the customer automatically?

No — never. Clicking Create invoice on a milestone makes a DRAFT invoice. You review it and send it yourself, so the customer never gets a surprise bill.

Can I change a milestone's amount after I invoiced it?

No — the amount is locked once its invoice exists. You can still rename it. To change what's billed, cancel that invoice first, then re-invoice the milestone.

Do the milestones have to add up to the contract value?

They don't have to, but the schedule header warns you when they don't match. A green check appears when the schedule equals the contract.

What happens when my customer pays a deposit on an estimate that's in a project?

If the schedule is still empty, Dispatch Bros creates the first milestone for that deposit and bills the deposit through its own invoice — the full estimate is never converted into one big invoice.

Related articles