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 $399.00 USD; request a quote for a scoped proposal.

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.
ابھی کوئی ادائیگی نہیں۔ یہ ہماری ٹیم کو قیمت کی درخواست بھیجتا ہے — ہم قیمت اور اگلے اقدامات کے ساتھ ای میل کے ذریعے رابطہ کریں گے۔
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.
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
Dedicated `Retention Release` DocType driving a Frappe Workflow (Draft to Reviewed to Approved) that only issues the retention invoice/credit after role-gated approval
"Outstanding by Contract" query report: contract value, certified, invoiced, collected, retention held, balance-to-bill and overdue columns
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 2-4 weeks from confirmed scope.
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.
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.
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.
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.
Buy the license on ecosire.com and download the Contract Payment & Milestone Billing app ZIP from your account dashboard.
Extract the ZIP into your bench's apps folder, or run `bench get-app` with the path to the extracted app.
Run `bench --site SITE_NAME install-app APP_NAME` followed by `bench migrate` to install Contract Payment & Milestone Billing and apply its schema.
Open the ECOSIRE License settings on your site and activate your license key. Requires the free ecosire_connect and ecosire_license_client apps.
| Criterion | ECOSIRE | Custom Build | Competitor | Odoo 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 | |
| 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 | |
| Retention release approval | Role-gated Frappe Workflow, Draft to Reviewed to Approved | You build and maintain the workflow yourself | Typically 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 | |
| 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 | |
| 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 | |
| Source & ownership | Full source plus git repo handover | You own it, but also the entire build cost | Often closed or license-restricted | |
| Support & delivery | 2-4 weeks build, install, UAT, post-go-live support | Timeline and support depend on hiring capacity | Instant install but self-serve support |
This is build-to-order, not an instant download. Typical delivery is 2-4 weeks 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.
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.
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.
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.
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.
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.
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.
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.