Every product in this category binds the hold to a contract term. We bind it to a cash decision. A release group is created by a person, links the customer invoices that fund the work to the vendor bills held against them, and lets go when those invoices are collected. That one move is what the rest of the design falls out of, and it is why this works for the roughly half of holds that have no pay-when-paid clause behind them at all.
The mechanism is NetSuite's own. Group membership drives the native payment hold, a check on the vendor payment record refuses the save on every route including imports, and a nightly sweep does the routine releasing so nobody is waiting on someone's attention. The workbench below exists for the exceptions: the afternoon a controller learns the customer paid this morning and wants the bill in today's check run.
This prototype is live. Every filter, chip, sort, checkbox and button works, groups really get created and released, and toasts name the records NetSuite would actually write. The seed data is built out of the awkward cases rather than the tidy ones.
The prototype above is the workbench, and it is the part that has been designed and reviewed. Five things remain, and only two are new design work. One is this same workbench redeployed onto the project record, one is a small modal, and one is a single sentence in a NetSuite error banner. Listing them at their real size matters more than making the set look impressive.
The same list, mounted as a sub-tab on a BlueCollar project with its project filter locked and the app bar suppressed. Same code, same actions, one filter pinned.
It exists for a project manager taking a call from a vendor about an unpaid bill, who wants to see that the customer has not paid us yet and answer with a fact.
A small panel on the native vendor bill answering one question: why will this not pay, and what clears it. Group, reason, collection, held since.
It carries the only in-context action in the product: release this bill. That exists for the afternoon someone learns the customer paid this morning and wants the bill in today's check run rather than tonight's sweep.
Read only. On the invoice, it names the groups this receipt funds and how much is held against them. Before payment it states the consequence: collecting this releases $80,050 in held bills.
No release action here. The person applying a receipt is often not the person who pays suppliers, so it informs and links out.
Three numbers and two lists: how much grace a held bill gets past its due date, how long to wait on a bill that has no due date at all, the bill count above which a release runs in the background, and who may create or release.
Not a route. Calling it a peer of the workbench was overcounting.
The hold is enforced in four layers, and the third is the real guarantee: a check on the vendor payment record that refuses to save when any applied bill is held. It fires on every route, including imports and the Electronic Payments SuiteApp.
It renders in NetSuite's own error banner, which cannot be styled. The only design surface is the sentence: Bill 8871 from Acme Supply is on payment hold under release group RG-00042. Release it before paying.
Design prototype for BlueCollar Pay-When-Paid. Data is fabricated. Amounts, vendors, projects and customers are invented for illustration and do not represent any real company or transaction. Built against the BlueCollar design language, and intended to be read alongside the approved UI decisions document.