The situation
An integrator bills installation projects as work progresses. Its contracts often allow different percentages of labour and of equipment to be billed at each stage, while standard NetSuite progress billing applies one percentage to the whole project. Project managers worked out each invoice in a spreadsheet and handed it to billing. At the other end, large customers with many open project and service invoices asked for one document they could pay against.
What we built
Billing requests. A Project Billing Request custom record, with lines by cost-code group. For each group, the project manager sees the billable amount and what has already been billed, and enters either the percentage or the amount to bill now. The record calculates the other. Each group carries its own percentage, so labour and equipment can be billed at different rates on the same project. Approvers approve or reject the request from buttons on the record, and the record keeps the approver's name. On approval it posts an invoice on the project invoice form, or a credit memo when the net amount is negative, so the same process corrects an over-billing.
Consolidated invoices. A Suitelet lets billing staff filter by customer, see that customer's open invoices, and select the ones to combine. The selection becomes a consolidated invoice record with a line per included invoice. A print Suitelet renders one branded PDF from an Advanced PDF template, and a button on the consolidated record reprints it at any time.
What it does now
Project managers raise billing requests and approvers approve them. Billing no longer rebuilds each invoice in a spreadsheet, and every invoice traces back to its request, its cost-code group and the percentages behind it.
The billing request has since moved into the integrator's project operations app, which works on the same custom record. The original NetSuite screens now open the app, so the history of every request carried over without a migration. Consolidated invoices remain available for customers who ask for them.
Under the hood
- Percentages are held per cost-code group, next to billable and previously billed amounts, so the arithmetic is visible on the record.
- A negative amount produces a credit memo instead of a negative invoice.
- The consolidated invoice is a record with lines as well as a PDF, so it can be reprinted and audited.
- The PDF comes from a template fed by a data object, so a layout change needs no script change.
- The later React module reused the same record, so the new screens needed no data migration.