Skip to main content
Contract Payment & Milestone Billing — A build-to-order ERPNext app that links contracts to Sales Invoices and tracks milesto — 1/1Illustrative preview

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.

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

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
Client script on Sales Invoice surfacing the linked contract and remaining billable balance inline while raising an invoice
Payment tracking that reconciles submitted `Payment Entry` allocations back to the originating contract and milestone
"Contract Billing" role profile plus DocType permission rules so PMs raise milestone invoices while only finance approves retention release
Scheduler event that flags milestones past their planned date with no certification and notifies the assigned owner
Frappe REST API and whitelisted methods exposing contract billing status for portal or external-system integration
Server-side validation guarding against over-certification beyond total contract value and duplicate milestone invoicing
Configurable defaults (retention %, retention account, income account, approval role) via a single Settings DocType, no code edits per contract
Built and tested for ERPNext/Frappe v15 with v16 compatibility

Built to order, done for you

No DIY setup — a working app, built, installed and supported by ECOSIRE.

  1. 1

    You order

    Start with a one-time build price. We scope it with you at kickoff.

  2. 2

    We build & install

    ECOSIRE builds, configures and installs it on your ERPNext.

  3. 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

CriterionECOSIRECustom BuildCompetitorERPNext Native
Contract-to-invoice linkageBuilt-in: milestones generate invoices stamped with contract referencesPossible but you design and build the whole link yourselfRarely models contract-to-milestone-to-invoice as one flowContract and Sales Invoice exist but are not linked
Retention trackingHeld on its own account, tracked and released per milestoneAchievable with sufficient dev effort and testingUsually absent or a simple deduction with no releaseNo concept of retention held or released
Retention release approvalRole-gated Frappe Workflow, Draft to Reviewed to ApprovedYou build and maintain the workflow yourselfTypically noneNone
Outstanding-by-contract reportQuery report with certified, invoiced, paid, retention, balanceBespoke report to spec and maintainGeneric AR only, not contract-scopedAR aging, but not per contract with retention
Fit to your rulesScoped to your milestone, retention and approval rulesFully bespoke but you own all decisions and riskFixed feature set, adapt your process to the appManual configuration and spreadsheets
Version support (v15/v16)Built and tested for your target version, clean upgradesDepends on your team's Frappe expertiseVaries; may lag ERPNext releasesCore, but lacks the capability entirely
Source & ownershipFull source plus git repo handoverYou own it, but also the entire build costOften closed or license-restrictedCore code, not the feature you need
Support & deliveryone working week build, install, UAT, post-go-live supportTimeline and support depend on hiring capacityInstant install but self-serve supportNone 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.

Request a quote

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

Request a Quotation

Tell us about your Contract Payment & Milestone Billing requirements and we'll send pricing, licensing options and a tailored proposal — usually within one business day.

No payment now. This sends a quote request to our team — we'll follow up by email with pricing and next steps.