- Home
- Apps
- SaaS Tools
- Contract Payment & Milestone Billing
Illustrative previewA build-to-order ERPNext app that links contracts to Sales Invoices and tracks milestone-based billing,
retention held and released, and payment progress against total contract value.
ECOSIRE scopes, builds, installs, and supports it for your team.
What is Contract Payment & Milestone Billing?
A build-to-order ERPNext app that links contracts to Sales Invoices and tracks milestone-based billing, retention held and released, and payment progress against total contract value. ECOSIRE scopes, builds, installs, and supports it for your team. Built to order by ECOSIRE for ERPNext v15, v16 — indicative price from $999.00 USD; request a quote for a scoped proposal.
Key Features
Built to order, done for you
No DIY setup — a working app, built, installed and supported by ECOSIRE.
- 1
You order
Start with a one-time build price. We scope it with you at kickoff.
- 2
We build & install
ECOSIRE builds, configures and installs it on your ERPNext.
- 3
Go live + support
You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.
Technical Specifications
- ERPNext Compatibility
- —
- License
- Licence confirmation required
- Python Requirement
- Python 3.10+
- Database
- MariaDB 10.6+
About this Product
Construction and project-services firms bill by milestone, not by delivery date: 20% on mobilisation, 30% at foundation, the balance across defined stages, with 5-10% retention held on every certificate until defects liability ends. ERPNext ships a Contract DocType and payment schedules on the Sales Invoice, but the two never talk to each other. There is no native ledger that says "this contract is worth 4.2M, we have certified 2.6M across five milestones, invoiced 2.4M, collected 2.1M, and are holding 210K in retention due for release in March." Finance teams end up rebuilding that picture in spreadsheets, and retention amounts silently fall through the cracks because nothing in ERPNext tracks a held amount as a distinct, releasable obligation.
We build a proper Frappe app that closes this gap. A new Contract Billing Plan DocType links to the standard Contract and holds a child table of milestones (description, planned value or percentage, planned date, status, retention percentage). A whitelisted server method generates a draft Sales Invoice from a milestone in one click, stamping the contract and milestone references onto the invoice, applying the retention deduction as a line against a configurable retention-receivable account, and writing the certified value back to the plan. hooks.py doc_events on Sales Invoice and Payment Entry (on_submit, on_cancel) keep certified, invoiced, paid, and retention-held figures in sync on the contract, so cancelling an invoice cleanly reverses the milestone status instead of leaving stale totals. A separate retention-release workflow (a Retention Release DocType with a Frappe Workflow: Draft to Reviewed to Approved) generates the final retention invoice or credit only when the release condition is approved, with role-gated approval.
On top of the data model we build the reports and controls finance actually asks for: an "Outstanding by Contract" query report (contract value, certified, invoiced, paid, retention held, balance to bill, overdue), a client script on the Sales Invoice that surfaces the linked contract and remaining billable balance inline, permission rules and a "Contract Billing" role profile so project managers can raise milestone invoices but only finance approves retention release, and a scheduler event that flags milestones whose planned date has passed without certification. Everything is exposed over the Frappe REST API and whitelisted methods so your project system or a client portal can read contract billing status programmatically. The app targets ERPNext v15 and is tested for the v16 line.
Because this is build-to-order, nothing is a black-box download. After a short scoping call we confirm your milestone and retention rules, chart-of-accounts mapping, and approval roles in a written scope, then build against your requirements. You get the installable app source for your version, install and configuration on your bench, UAT on a staging site with a rollback plan, and a post-go-live support window. Typical delivery is one working week from confirmed scope.
What you get
- Installable Frappe app source code for your ERPNext version (v15 or v16), version-pinned
- Installation and configuration on your bench, including retention account and role-profile setup
- Technical documentation: DocType schema, hooks, whitelisted methods, and REST endpoints
- End-user guide plus a live training session for finance and project staff
- UAT on a staging site with a documented rollback plan before production cut-over
- Post-go-live support window for defect fixes and configuration adjustments
- Git repository handover with full commit history and README
- Configuration workbook capturing your milestone, retention and approval rules as signed-off scope
Who this is for
Project Finance Lead
Owns billing against contract value across a portfolio of milestone-billed projects. Needs a single, reliable view of what has been certified, invoiced, collected and held as retention per contract, without maintaining parallel spreadsheets.
Contracts / Commercial Manager
Manages certificates, variations and retention terms for construction or services contracts. Needs milestone status, retention obligations and release timing tracked inside ERPNext with an auditable approval trail.
Finance Controller / CFO
Cares about cash forecasting and that retention receivable sits on its own ledger, not lost inside general debtors. Needs role-gated retention release and a clean outstanding-by-contract report for period close and audit.
ERP Administrator
Runs the ERPNext instance and needs a well-structured Frappe app with documented DocTypes, hooks and permissions that upgrades cleanly across v15/v16 and hands over with a git repo they can maintain.
How Contract Payment & Milestone Billing Compares
| Criterion | ECOSIRE | Custom Build | Competitor | ERPNext Native |
|---|---|---|---|---|
| Contract-to-invoice linkage | Built-in: milestones generate invoices stamped with contract references | Possible but you design and build the whole link yourself | Rarely models contract-to-milestone-to-invoice as one flow | Contract and Sales Invoice exist but are not linked |
| Retention tracking | Held on its own account, tracked and released per milestone | Achievable with sufficient dev effort and testing | Usually absent or a simple deduction with no release | No concept of retention held or released |
| Retention release approval | Role-gated Frappe Workflow, Draft to Reviewed to Approved | You build and maintain the workflow yourself | Typically none | None |
| Outstanding-by-contract report | Query report with certified, invoiced, paid, retention, balance | Bespoke report to spec and maintain | Generic AR only, not contract-scoped | AR aging, but not per contract with retention |
| Fit to your rules | Scoped to your milestone, retention and approval rules | Fully bespoke but you own all decisions and risk | Fixed feature set, adapt your process to the app | Manual configuration and spreadsheets |
| Version support (v15/v16) | Built and tested for your target version, clean upgrades | Depends on your team's Frappe expertise | Varies; may lag ERPNext releases | Core, but lacks the capability entirely |
| Source & ownership | Full source plus git repo handover | You own it, but also the entire build cost | Often closed or license-restricted | Core code, not the feature you need |
| Support & delivery | one working week build, install, UAT, post-go-live support | Timeline and support depend on hiring capacity | Instant install but self-serve support | None for this workflow |
Frequently Asked Questions about Contract Payment & Milestone Billing
How long does delivery take?
This is build-to-order, not an instant download. Typical delivery is one working week from confirmed scope. The clock starts once we have agreed your milestone and retention rules, chart-of-accounts mapping, and approval roles in a written scope after the initial call. Larger or heavily customised requirements are estimated during scoping.
Is this an existing app I can download from the Frappe marketplace?
No. ECOSIRE designs, builds, installs and supports this app specifically for your requirements. You receive the installable source code for your ERPNext version and a git repository handover, so you own and can maintain what we deliver.
What ERPNext and Frappe versions do you support?
We build and test against ERPNext/Frappe v15 as the primary target, with v16 compatibility. Tell us your exact version and whether you run Frappe Cloud, a self-hosted bench, or Docker during scoping and we build against that.
How do you handle support and future updates?
Every engagement includes a post-go-live support window for defect fixes and configuration adjustments. Beyond that we offer ongoing support and version-upgrade retainers. Because you hold the source in a git repo, you are never locked to us to keep the app running.
Will this conflict with ERPNext core or break on upgrade?
The app is a separate Frappe app using custom DocTypes, `hooks.py` doc events, client scripts and whitelisted methods rather than patching core files, so ERPNext upgrades stay clean. We validate against your target version on staging as part of UAT before production.
Can retention be released partially, and is the approval controlled?
Yes. Retention is tracked per milestone and can be released in stages through the `Retention Release` DocType, which runs a Frappe Workflow (Draft to Reviewed to Approved). Only users with the approval role can move a release to Approved, giving finance a role-gated, auditable control.
Can our project system or client portal read contract billing status?
Yes. Contract, milestone, invoice, payment and retention data is exposed over the standard Frappe REST API plus purpose-built whitelisted methods, so an external system or a customer portal can read billing progress and outstanding balances programmatically.
Related Modules

Cloud Backup Manager (S3/Drive/Dropbox/RClone)
A build-to-order Frappe/ERPNext app that runs scheduled, client-side-encrypted backups of your database and files to S3, Google Drive, Dropbox, Backblaze B2 or any RClone remote — with retention policies, one-click restore and automated restore-testing drills. ECOSIRE builds, installs and supports it for your bench.

Cloud Kitchen / Multi-Brand Ops for ERPNext
A build-to-order ERPNext application that runs several delivery-only brands from one physical kitchen, with brand-level menus and tax, aggregator order routing, shared inventory deduction, and true per-brand profitability. ECOSIRE builds, installs, and supports it to your confirmed scope.

Coupons, Discounts & Promotions Engine for ERPNext
A build-to-order Frappe app that adds coupons, BOGO, tiered discounts, gift cards and segment-specific offers on top of ERPNext sales and POS. ECOSIRE scopes, builds, installs and supports it for your instance.

Credit Control, Dunning & Collections
A build-to-order ERPNext app that automates accounts-receivable collections with credit-limit holds, multi-level dunning, reminder workflows, aging worklists and promise-to-pay tracking. ECOSIRE scopes, builds, installs and supports it — it is not an instant marketplace download.
Contract Payment & Milestone Billing
A build-to-order ERPNext app that links contracts to Sales Invoices and tracks milestone-based billing, retention held and released, and payment progress against total contract value. ECOSIRE scopes, builds, installs, and supports it for your team.
- New `Contract Billing Plan` DocType linked one-to-one to the standard ERPNext `Contract`, with a milestones child table (description, planned value/percentage, planned date, status, retention %)
- One-click draft `Sales Invoice` generation from a milestone via a whitelisted server method, stamping contract and milestone references onto the invoice
- Retention automatically deducted per milestone as a line posted to a configurable retention-receivable account, keeping held amounts on their own ledger
- `hooks.py` `doc_events` on Sales Invoice and Payment Entry (`on_submit`/`on_cancel`) that keep certified, invoiced, paid and retention-held totals in sync and reverse cleanly on cancellation