When we started building ToolbagCRM, we thought invoicing was the hard part. It wasn't. Invoicing is straightforward. Progress billing is where the data model gets weird and the UX gets opinionated.
Here's the problem. A contractor quotes a $40,000 kitchen remodel. The customer signs. Now what? You can't invoice $40k on day one, and you can't wait until month three to collect a dime. So you break it into milestones: deposit, rough-in complete, cabinets installed, final walkthrough. Each milestone has a dollar amount. Each one triggers an invoice.
Sounds simple. It isn't.
The data model problem
In a normal CRM, a quote becomes an invoice. One-to-one. Done. With progress billing, a quote becomes multiple invoices, each tied to a milestone, and the sum of all milestone invoices should equal the original quote total. But what if the customer adds a change order mid-project? Now you've got a modifier that needs to distribute across remaining milestones, or become its own milestone.






