Auditing maintenance spend in Business Central

How to audit maintenance and repair spend in Dynamics 365 Business Central: what the ERP checks, what it does not, and where drift hides. Read the full guide.

Twitter LinkedIn WhatsApp
Ask AI: ChatGPT Claude Gemini Grok
Auditing maintenance spend in Business Central

Margin drift is the gap between what a vendor contract says and what the invoice actually charges. In maintenance and repair spend, that gap survives inside Dynamics 365 Business Central because the system posts approved transactions, it does not test them against a service contract.

Business Central matches a purchase order, a receipt, and an invoice. It has no field for a preventive maintenance rate schedule, a not-to-exceed cap on emergency labor, or a warranty exclusion window. Auditing this category means building the check the ERP does not run, using data the ERP already holds.

Executive Summary

Dynamics 365 Business Central controls maintenance spend the way it controls any purchase: three-way matching against a purchase order and a receipt. That match confirms a vendor billed what they were ordered to bill. It says nothing about whether the order reflects the contract, and maintenance contracts carry terms three-way matching was never built to read: labor rate tiers, travel and trip charge caps, parts markup ceilings, warranty exclusion periods, and emergency call premiums.

The mechanism behind the drift is structural, not a lapse by one team. The contract lives as a PDF outside Business Central. The purchase order is keyed by a buyer working from memory or a spreadsheet.

The invoice is coded and paid against the PO, not against the contract clause the PO was supposed to encode. Every step in that chain is defensible on its own terms and still produces a paid invoice that beats its own contract.

What changes it is treating the contract, not the PO, as the source of truth, and testing invoices against it directly. That means pulling vendor ledger and purchase line data out of Business Central, structuring the contract terms into a checkable table, and reconciling the two on a recurring basis rather than once a year.

1. What does Business Central actually check on a maintenance invoice?

Business Central checks that an invoice matches its purchase order and, where receiving is configured, a service or item receipt: same vendor, same line items, same quantities, within a tolerance on unit price. That confirms internal consistency between three documents already inside the system. It does not check the purchase order itself against a contract rate schedule, a labor tier, a travel cap, or a warranty period, because none of those terms exist as data anywhere in Business Central.

The match runs at the line level. A technician's labor line, a parts line, and a trip charge line each get compared to what the PO authorized. If the PO was keyed correctly and the invoice matches it, the transaction posts without exception.

That is the entire boundary of the control. Business Central has no native object representing a maintenance contract's rate card, its escalation clause, or its exclusion list for warranty-covered equipment. Those terms exist only in the document the vendor sent when the contract was signed.

This is not a configuration gap you can close with a setup change. It is a scope boundary: the ERP was built to move approved transactions through the ledger, not to encode the commercial terms behind them. An audit has to supply that layer separately.

2. Where does a not-to-exceed cap actually get lost?

A not-to-exceed cap gets lost between the maintenance contract and the purchase order, not between the PO and the invoice. The buyer who keys the PO is working from a blanket agreement or a verbal understanding, not from the clause itself. Once the PO carries no cap, three-way matching has nothing to test the invoice against, and an emergency repair invoice can clear the full approval chain at a rate the contract never authorized.

A not-to-exceed clause typically caps a single emergency call, a single repair, or a monthly total. It exists to protect against exactly the situation maintenance work creates: equipment down, a technician on site, and no time to negotiate.

Business Central's approval workflow can enforce a dollar threshold on the purchase requisition itself. That threshold is set by the buyer or the AP policy, not read from the contract file. If the two numbers happen to match, the control works. If the contract was renegotiated and the PO template was not updated, they diverge silently.

The fix is not a Business Central setting. It is keeping the contract's cap values in a table that gets checked against invoices directly, independent of what the PO says the cap should be.

3. How do labor rate tiers create drift that matching cannot catch?

Labor rate tiers assign different hourly rates to regular time, overtime, weekend, and emergency call-outs, often with different rates again for a technician versus a senior technician or supervisor. Three-way matching validates that the invoiced rate matches the PO's rate field. It cannot validate that the PO's rate field, or the invoice's own labor classification, corresponds to the day, hour, and technician tier the contract actually specifies.

A vendor invoice for a Saturday repair coded as regular-time labor will match a PO that was keyed with a regular-time rate. Both documents agree with each other. Neither reflects the contract's weekend tier.

This works because the classification decision, regular versus overtime versus emergency, is made once, by the vendor or by whoever enters the PO, and never independently verified against the work order timestamp or the contract's tier definitions.

An audit reconstructs the tier the invoice should have used from the service date and time on the work order, then compares that to the rate actually billed. That comparison has to happen outside Business Central, because the system stores the billed rate but not the contract's tier table.

A. Labor classification checks

Pull the work order timestamp, not the invoice date, and compare it against the contract's definition of regular, overtime, weekend, and emergency hours. The invoice date often reflects when the vendor submitted billing, not when the technician was on site, so it cannot be used to test tier eligibility.

B. Rate table reconciliation

Build a standing table of the contract's rate tiers by technician level and time window, then match every labor line against it by service date rather than by trusting the PO's rate field, which was set once and rarely revisited when the contract renewed.

4. What role does the vendor ledger play in a maintenance audit?

The vendor ledger in Business Central holds the transaction history an audit actually needs: every posted invoice, credit memo, and payment by vendor and by date, with the underlying purchase line detail available through drill-down. It is the data source for the audit, not a control in itself. Extracting twelve to eighteen months of maintenance vendor activity from the ledger is the starting point for testing invoices against contract terms rather than against the PO alone.

A useful extract includes vendor name, invoice number, posting date, purchase line description, quantity, unit cost, and the PO number it was matched against. Business Central supports this through standard ledger entries and purchase line tables, exportable to a spreadsheet or a reporting tool.

The value of the extract is that it lets an auditor group invoices by vendor and by maintenance category, then apply the contract's terms as a set of rules run against every line, rather than sampling a handful of invoices and hoping the sample is representative.

Rebate and credit memo history matters here too. A maintenance contract with a volume rebate or a service-level credit needs its own line in the ledger to confirm the credit was actually issued, not just promised.

5. Can Business Central detect a warranty exclusion being billed anyway?

No. Business Central has no concept of equipment warranty status linked to a purchase order or invoice, so it cannot flag a repair invoice for equipment still under a manufacturer or vendor warranty. That check requires an asset register with warranty start and end dates, cross-referenced against the equipment identifier on the maintenance invoice, which is a comparison an auditor runs separately from the ERP's matching logic.

Maintenance contracts frequently exclude equipment still under warranty, either the original manufacturer warranty or an extended warranty purchased separately. A vendor invoice for a warrantied unit should never post, or should post as a warranty claim rather than a billable repair.

Business Central's fixed asset module can track an asset and its acquisition date, but linking that to warranty terms and then to a specific maintenance invoice is a manual reconciliation most teams do not build, because it spans three separate documents: the asset record, the warranty terms, and the repair invoice.

An audit pulls the equipment identifier from each maintenance invoice, checks it against an asset register with warranty dates, and flags any invoice for equipment still inside its warranty window as a candidate for vendor credit.

6. How does the PPI for commercial machinery repair affect what a fair invoice looks like?

The Producer Price Index for commercial machinery repair and maintenance moves the baseline for what a fair rate increase looks like on renewal or escalation. Per the US Bureau of Labor Statistics, the industry group index for commercial machinery repair and maintenance stood at 237.468 in August 2026, up 8.8% year over year, read September 25, 2026. A vendor rate increase should track that movement, not exceed it without a stated reason tied to the contract's escalation clause.

Many maintenance contracts include an escalation clause tied to an index or to vendor discretion within a stated cap. When a vendor raises rates at renewal, the increase should be traceable either to the contract's stated formula or to a documented cost driver.

An 8.8% year-over-year move in the underlying industry's producer price index, per the BLS reading above, gives an auditor a reference point for whether a proposed increase is in line with input cost movement in that industry or running ahead of it without support.

This is a benchmark for the conversation with the vendor, not proof of overbilling on its own. A rate increase above the index is a question to ask, tied to the contract's own escalation language, not an automatic finding.

For the wider pattern this sits inside, start with the margin drift guide. See also diagnostic or software: what to buy first and build vs. buy: can you do contract-to-invoice matching in excel?.

7. Frequently Asked Questions (People Also Ask)

Does Business Central have a module for service contract management?

Business Central does not include a dedicated service contract module comparable to a CMMS or a contract lifecycle management tool. Maintenance contracts are typically stored outside the ERP as documents, referenced manually when a purchase order is created, with no system link enforcing that the PO reflects current contract terms.

Can three-way matching in Business Central catch a duplicate maintenance invoice?

Three-way matching can catch a duplicate if the duplicate invoice references the same PO and receipt a second time, which Business Central will flag or block depending on configuration. It is less reliable against a duplicate submitted with a different invoice number or slightly altered line detail, which requires a separate vendor ledger review.

What data do I need to export from Business Central to start a maintenance audit?

Pull vendor ledger entries and purchase line detail for maintenance vendors over the past 12 to 18 months: invoice number, posting date, PO number, line description, quantity, unit cost, and any linked credit memos. This becomes the dataset tested against the contract's rate schedule and terms.

Is a not-to-exceed cap enforceable inside Business Central's approval workflow?

A dollar threshold can be set in the purchase approval workflow, but it has to be entered and maintained manually by whoever administers the workflow. It reflects whatever value was configured, not a value read from the contract, so it drifts out of sync whenever the contract's cap changes and the workflow is not updated.

How often should maintenance vendor invoices be checked against the contract?

The right cadence depends on invoice volume and contract complexity, but checking only at renewal means a year or more of invoices post unchecked. A recurring review, tied to when maintenance invoices are batched for payment, catches drift closer to when it starts rather than after it has accumulated.

Does a rate increase above the PPI for machinery repair automatically mean overbilling?

No. It means the increase is running ahead of the industry-wide input cost index published by the BLS, which is a reason to ask the vendor to justify the increase against the contract's escalation clause, not proof of a contract violation on its own.

Can I build this audit in Excel using data exported from Business Central?

Yes, for a single vendor or a short history. The work is structuring the contract's terms as rules and applying them consistently across every invoice line, which becomes harder to sustain in a spreadsheet as vendor count and invoice volume grow.

What is the difference between auditing the PO and auditing the contract?

Auditing the PO checks whether the invoice matches what was authorized internally. Auditing the contract checks whether what was authorized internally matches what the vendor agreement actually says. Business Central only performs the first check.

Should warranty status be checked before or after a maintenance invoice is approved for payment?

Before, if possible. Checking after payment turns the finding into a recovery claim against the vendor rather than a prevented cost, and recovering an already-paid invoice for warrantied work takes more effort than declining it at approval.

Margin Drift Resources