I get pulled into subcontractor compliance projects from both directions — GCs who need to enforce compliance against the subs they hire, and subcontractors themselves running Acumatica who need to manage their own compliance documents (insurance, licenses, bonding) for the GCs they work under. This post is the GC side, which is where most of the customization actually happens, because compliance tracking without enforcement is just a filing cabinet with extra steps.
Acumatica tracks compliance documents; enforcing them is a decision you build
Construction Edition stores and tracks insurance certificates, lien waivers, bonds, and similar compliance documents by vendor and project, with automated alerts before expiration. That is real and useful on its own — a compliance manager gets a dashboard of what is expiring this month instead of a shared spreadsheet. What is not automatic is stopping a payment or a commitment from proceeding when a document has lapsed; that enforcement is configurable, typically as a hold placed on the vendor or a validation on the AP release process, and it is the piece GCs actually need but often assume ships turned on.
protected virtual void POOrder_RowPersisting(PXCache cache, PXRowPersistingEventArgs e)
{
var order = (POOrder)e.Row;
if (order == null || order.Status != POOrderStatus.Open) return;
var vendor = Vendor.Select(Base, order.VendorID);
if (vendor != null && HasExpiredInsurance(vendor.BAccountID, Base.Accessinfo.BusinessDate))
{
cache.RaiseExceptionHandling<POOrder.vendorID>(order, order.VendorID,
new PXSetPropertyException("Certificate of insurance expired — PO release blocked until renewed.",
PXErrorLevel.Error));
}
}
New subcontractor onboarding is where compliance gets missed first
The most common gap is not an expired document on an existing sub — it is a brand-new subcontractor added mid-project without their compliance documents entered at all, because the field team needed them on-site today and paperwork followed later, if ever. I typically build a lightweight onboarding checklist requirement — the vendor record cannot move from "prospective" to "approved for commitment" status without the core documents (COI, W-9 equivalent, license if applicable) attached — enforced with a status-transition validation rather than trusting a procedure document.
Default expiration alert windows are often too generic for how insurance renewals actually work in practice — a 90-day warning on every one of 200 subs generates a wall of noise the compliance manager starts ignoring. I tune alert lead times per document type (30 days for COI, 60 for bonding, since bonding renewals take longer to process) and route them to the specific compliance owner rather than a shared inbox. An ignored alert is functionally the same as no alert.
Wrapping up
Compliance document tracking is a solid native feature; compliance enforcement is the customization a GC actually needs to make it worth anything, and it is usually a modest amount of validation logic on the PO/commitment and payment release graphs rather than a large build. Pair it with an onboarding gate so new subs cannot get on a job before the paperwork exists, and tune alerts so people actually read them.
Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.