# Auditing maintenance spend in Sage Intacct

> Answers page on auditing maintenance and repair spend inside Sage Intacct, covering PO matching, NTE caps, and the calibration overlap. Read the full guide.

Source: https://valuexpa.com/insights/how-do-you-audit-maintenance-and-repair-spend-in-sage
Publisher: ValueXPA (https://valuexpa.com)
Updated: 2026-10-22

---

Margin drift is the gap between what a vendor contract says and what the invoice actually charges. In maintenance and repair spend, that gap hides inside work orders that Sage Intacct treats as approved simply because a purchase order exists.

Sage Intacct records the transaction correctly every time. It has no field for a not-to-exceed cap buried in a service agreement, no field for a labor rate that steps up after the first contract year, and no way to flag a recurring repair on equipment still inside its warranty period.

## Executive Summary

Maintenance and repair invoices pass through Sage Intacct's purchasing module looking clean because three-way matching only checks quantity and price against a purchase order and receipt. It never checks the invoice against the underlying service contract, because that contract lives in a PDF, not in the ERP.

The mechanism that lets drift persist is simple: a technician's time and materials ticket gets entered as a PO, Intacct matches it against itself, and the invoice clears. Nobody re-reads the master service agreement to confirm the labor rate, the NTE cap, or the emergency call surcharge still apply as billed.

What changes this is treating the contract as the source of truth and testing every maintenance invoice against it separately from the PO match Intacct already performs. That means pulling rate schedules, NTE clauses, and preventive maintenance scope out of the contract folder and checking them line by line against what Sage Intacct actually paid.

## 1. How do you audit maintenance and repair spend in Sage Intacct?

**Auditing maintenance and repair spend in Sage Intacct means pulling every paid maintenance invoice for a period, matching each line against the vendor's service contract rather than just its purchase order, and testing four things separately: the labor rate charged, whether a not-to-exceed cap was respected, whether a preventive maintenance visit billed as extra was already covered under a service plan, and whether a warranty-period repair was billed at all. Intacct's own matching only confirms the invoice agrees with the.**

Start by exporting the maintenance vendor subledger from Sage Intacct for the audit period, then group it by vendor and equipment or asset tag where that data exists. Most maintenance spend in Intacct runs through either a recurring PO for scheduled service or a one-off PO cut against a work order, and each type needs a different check.

For recurring service contracts, pull the master agreement and confirm the billed rate matches the contracted rate, including any escalation clause tied to contract anniversary. For one-off repair work, confirm the invoice states labor hours and a rate that traces to a rate card, not just a lump sum.

The check Intacct cannot do on its own is the NTE cap. If the contract caps a repair at a stated dollar figure before requiring written approval to exceed it, that cap has to be tested against the actual invoice total, line by line, because Intacct has no field that stores it.

## 2. What does three-way matching actually catch in Sage Intacct?

**Three-way matching in Sage Intacct checks that the invoice quantity and price agree with the purchase order and that the purchase order agrees with a goods or service receipt. It confirms internal consistency between three documents Intacct already holds. It does not check any of those three documents against the vendor contract, because the contract is not a document Intacct stores or reads, so a PO cut at the wrong rate matches cleanly all the way through.**

The control exists to stop a narrow class of error: someone changes a price on an invoice after the PO was approved, or bills for a quantity that was never received. Both of those are caught reliably.

What it cannot catch is a PO that was entered correctly against a rate that is itself wrong. If a vendor's labor rate increased on invoice but the increase was never authorized under the contract's escalation clause, Intacct matches the PO, the receipt, and the invoice without complaint, because all three agree with each other.

The same is true of scope. If a technician bills a full replacement when the contract specifies repair-first, Intacct records the transaction the technician entered. It has no mechanism for testing billed scope against contracted scope, because that comparison requires reading the contract itself.

## 3. Which contract clauses cause maintenance drift most?

**Four clause types recur in maintenance and repair contracts and each fails silently in a different way inside an ERP: not-to-exceed caps that get overridden without written approval, labor rate schedules that step up on a date nobody re-checks, preventive maintenance scope that gets billed twice, and warranty exclusions that should have blocked a charge entirely. Sage Intacct enforces none of these because none of them are stored as ERP fields.**

Each clause type fails a different way. An NTE cap requires a comparison against a moving total across multiple invoices on the same work order, not a single line. A rate schedule requires knowing the contract's anniversary date, which Intacct has no field for. Preventive maintenance scope requires cross-referencing two separate invoices that may arrive weeks apart. Warranty exclusions require an asset-level installation date that most Intacct configurations never capture.

Contract clause types and how each fails inside Sage Intacct without a separate check.

| Clause
| What it should limit
| How it fails silently

| Not-to-exceed cap
| Total charge on a repair without written approval to exceed it
| PO is cut at the invoiced amount after the fact, so it always matches

| Labor rate schedule
| Hourly rate by trade, sometimes stepped by contract year
| Rate change on the invoice is treated as the new normal, not tested against the schedule

| Preventive maintenance scope
| What is already covered under a standing service plan
| A covered visit gets billed again as a one-off repair PO

| Warranty exclusion
| Charges that should be blocked while equipment is under warranty
| Intacct has no asset-level warranty field to check against

## 4. Should you build this check inside Sage Intacct or outside it?

**Sage Intacct's dimension structure can tag a transaction by vendor, department, and asset, which is useful for sorting maintenance spend for review. It cannot store a contract's NTE cap, rate schedule, or warranty term as a value it tests against, so the comparison has to happen outside the ERP, against the actual contract documents, however the transaction data itself is pulled from Intacct's reporting tools.**

Intacct's report writer and dimension tagging are genuinely useful for the first step: isolating every transaction coded to maintenance and repair accounts, by vendor and by location, for the period under review. That narrows a general ledger with thousands of lines to the set that actually needs contract-level review.

What Intacct cannot do is the comparison itself. A rate schedule, an NTE clause, and a warranty term are unstructured facts that live in a signed PDF. No amount of custom dimension configuration turns that into a field Intacct checks automatically at invoice entry.

That is the boundary. Use Intacct for what it stores and reports well: the transaction record. Do the contract comparison as a separate exercise, whether manually against a small vendor list or systematically across a full spend base.

## 5. Does the PPI for commercial machinery repair change how you read maintenance invoices?

**The Producer Price Index for commercial machinery repair and maintenance gives a reference point for whether a rate increase on an invoice is plausible or worth questioning. Per the US Bureau of Labor Statistics PPI industry data for series PCU8113--8113--, read September 25, 2026, the August 2026 index value was 237.468, up 8.8% year over year, which is a market-wide input cost signal, not a ceiling on any single vendor's rate.**

When a maintenance vendor invoice shows a rate increase, the question is whether the increase was authorized under the contract's escalation clause and whether the size of it is defensible. The PPI series gives a market baseline for the second question without answering the first.

An 8.8% year-over-year move in the index, per the BLS PPI data for series PCU8113--8113-- read September 25, 2026, means a vendor citing rising costs to justify a rate change is not inventing a trend. But the contract still governs whether that change needed written approval, a notice period, or a cap.

Use the index as context when a rate increase looks unusual, not as a substitute for checking the escalation clause itself. A rate move in line with the index can still be unauthorized under the contract, and a rate move far above it is worth a direct question to the vendor regardless of what the contract allows.

## 6. What should a maintenance audit checklist actually cover?

**A complete maintenance and repair audit checklist covers five items: rate schedule verification against the current contract, NTE cap testing on every repair above the vendor's standard PO threshold, preventive maintenance scope reconciliation against the standing service plan, warranty-period cross-checks against asset purchase and installation dates, and credit memo tracking for any overbilled amount already identified.**

None of these five checks depend on a specific software tool. They depend on having the contract on hand and the transaction history pulled from Sage Intacct in a format that can be sorted by vendor and date. A spreadsheet is enough to run all five for a vendor list of modest size.

The hardest of the five in practice is preventive maintenance scope reconciliation, because it requires matching two invoices that may be coded differently and arrive on different schedules. The others are more mechanical once the contract terms are extracted into a usable reference sheet.

- **Rate schedule verification:** Confirm every labor rate on a paid invoice traces to the current contract rate card, including any authorized escalation.

- **NTE cap testing:** Flag any repair invoice that exceeds a stated not-to-exceed cap without documented written approval to go over it.

- **PM scope reconciliation:** Check that a preventive maintenance visit billed as a one-off repair was not already covered under a standing service plan.

- **Warranty cross-check:** Compare repair dates against asset installation dates to catch charges that should have been covered under warranty.

- **Credit memo tracking:** Confirm any identified overbilling has an issued credit memo, not just a verbal agreement to adjust a future invoice.

## 7. Where does this fit against buying software instead?

**Buying enforcement software before the contract terms are documented means configuring rules against guesses, because nobody yet knows which rate schedules, NTE caps, and PM scopes are actually being violated. Running the contract comparison first, even manually, produces the rule set a software purchase would otherwise have to invent, which is why the sequence matters more than the tool choice.**

A maintenance and repair audit against Sage Intacct data is, at its core, a one-time exercise in extracting the rules buried in contract PDFs and testing them against what was actually paid. That extraction has value independent of whatever tool eventually enforces those rules going forward.

Software that watches invoices as they arrive can enforce a rate schedule or an NTE cap once that rule is defined in a system it can read. It cannot discover the rule from the contract on its own, and it cannot tell you which of last year's invoices already violated it.

The decision of whether to buy a forward-looking control at all, and when, is a separate question from whether to do the retrospective read of the contracts first. The two are not substitutes.

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

## 8. Frequently Asked Questions (People Also Ask)

### Does Sage Intacct track equipment warranty periods?

Sage Intacct does not have a native field that stores an asset's warranty expiration and tests a repair invoice against it. Some companies build a custom dimension or attach the warranty date as a note, but nothing in Intacct blocks or flags a charge automatically once the warranty date has passed.

### Can Sage Intacct's approval workflow catch an NTE overrun?

The approval workflow routes an invoice for sign-off above a dollar threshold you configure, which is useful for catching large invoices generally. It does not know a specific vendor's contracted not-to-exceed cap, so it cannot flag a repair that exceeds that vendor's specific limit unless the threshold happens to match.

### How far back should a maintenance spend audit go?

Per ValueXPA's diagnostic scope, leakage already embedded in 12 to 18 months of historical spend is the typical window worth reviewing, since that covers at least one full contract cycle for most maintenance agreements and captures any rate escalation that occurred during the period.

### What counts as a preventive maintenance scope conflict?

It is a case where a technician visit already covered under a standing service plan gets billed a second time as a separate repair PO. This happens most often when the PM plan and the repair work are invoiced by the same vendor under slightly different line item descriptions.

### Is a rate increase automatically a contract violation?

No. A rate increase is only a violation if the contract's escalation clause required notice, approval, or a cap that was not followed. A rate increase in line with published cost indices can still be improperly applied if it skipped the contract's own authorization steps.

### Can this audit be done inside Sage Intacct's reporting tools alone?

Intacct's reporting tools can isolate and sort the transaction data, but the comparison against contract terms happens outside the ERP because Intacct does not store rate schedules, NTE caps, or warranty terms as structured, checkable fields.

### What is the difference between this and a general AP audit?

A general AP audit checks for duplicate payments and basic coding errors across all spend. A maintenance and repair contract audit specifically tests invoices against the terms of service agreements and work orders, which requires reading contract documents a general AP review does not touch.

### Who should own this audit, AP or procurement?

Either can lead it, but the person doing the work needs access to both the Sage Intacct transaction history and the signed service contracts, which often sit in procurement or facilities files rather than the AP system itself.

### Is contract complexity quietly draining your operating margin?

A small systematic drift between your negotiated contracts and your actual vendor billing compounds quietly across a year of invoices. Stop guessing at your exposure and run a targeted audit.

**[Take the Free Screener → https://valuexpa.com/margin-drift-screener](https://valuexpa.com/margin-drift-screener)**

## Executive Summary

Maintenance and repair invoices pass through Sage Intacct's purchasing module looking clean because three-way matching only checks quantity and price against a purchase order and receipt. It never checks the invoice against the underlying service contract, because that contract lives in a PDF, not in the ERP. The mechanism that lets drift persist is simple: a technician's time and materials ticket gets entered as a PO, Intacct matches it against itself, and the invoice clears. Nobody re-reads the master service agreement to confirm the labor rate, the NTE cap, or the emergency call surcharge still apply as billed. What changes this is treating the contract as the source of truth and testing every maintenance invoice against it separately from the PO match Intacct already performs. That means pulling rate schedules, NTE clauses, and preventive maintenance scope out of the contract folder and checking them line by line against what Sage Intacct actually paid.

## 1. How do you audit maintenance and repair spend in Sage Intacct?

Auditing maintenance and repair spend in Sage Intacct means pulling every paid maintenance invoice for a period, matching each line against the vendor's service contract rather than just its purchase order, and testing four things separately: the labor rate charged, whether a not-to-exceed cap was respected, whether a preventive maintenance visit billed as extra was already covered under a service plan, and whether a warranty-period repair was billed at all. Intacct's own matching only confirms the invoice agrees with the. Start by exporting the maintenance vendor subledger from Sage Intacct for the audit period, then group it by vendor and equipment or asset tag where that data exists. Most maintenance spend in Intacct runs through either a recurring PO for scheduled service or a one-off PO cut against a work order, and each type needs a different check. For recurring service contracts, pull the master agreement and confirm the billed rate matches the contracted rate, including any escalation clause tied to contract anniversary. For one-off repair work, confirm the invoice states labor hours and a rate that traces to a rate card, not just a lump sum. The check Intacct cannot do on its own is the NTE cap. If the contract caps a repair at a stated dollar figure before requiring written approval to exceed it, that cap has to be tested against the actual invoice total, line by line, because Intacct has no field that stores it.

## 2. What does three-way matching actually catch in Sage Intacct?

Three-way matching in Sage Intacct checks that the invoice quantity and price agree with the purchase order and that the purchase order agrees with a goods or service receipt. It confirms internal consistency between three documents Intacct already holds. It does not check any of those three documents against the vendor contract, because the contract is not a document Intacct stores or reads, so a PO cut at the wrong rate matches cleanly all the way through. The control exists to stop a narrow class of error: someone changes a price on an invoice after the PO was approved, or bills for a quantity that was never received. Both of those are caught reliably. What it cannot catch is a PO that was entered correctly against a rate that is itself wrong. If a vendor's labor rate increased on invoice but the increase was never authorized under the contract's escalation clause, Intacct matches the PO, the receipt, and the invoice without complaint, because all three agree with each other. The same is true of scope. If a technician bills a full replacement when the contract specifies repair-first, Intacct records the transaction the technician entered. It has no mechanism for testing billed scope against contracted scope, because that comparison requires reading the contract itself.

## 3. Which contract clauses cause maintenance drift most?

Four clause types recur in maintenance and repair contracts and each fails silently in a different way inside an ERP: not-to-exceed caps that get overridden without written approval, labor rate schedules that step up on a date nobody re-checks, preventive maintenance scope that gets billed twice, and warranty exclusions that should have blocked a charge entirely. Sage Intacct enforces none of these because none of them are stored as ERP fields. Each clause type fails a different way. An NTE cap requires a comparison against a moving total across multiple invoices on the same work order, not a single line. A rate schedule requires knowing the contract's anniversary date, which Intacct has no field for. Preventive maintenance scope requires cross-referencing two separate invoices that may arrive weeks apart. Warranty exclusions require an asset-level installation date that most Intacct configurations never capture. Contract clause types and how each fails inside Sage Intacct without a separate check. | Clause | What it should limit | How it fails silently | | --- | --- | --- | | Not-to-exceed cap | Total charge on a repair without written approval to exceed it | PO is cut at the invoiced amount after the fact, so it always matches | | Labor rate schedule | Hourly rate by trade, sometimes stepped by contract year | Rate change on the invoice is treated as the new normal, not tested against the schedule | | Preventive maintenance scope | What is already covered under a standing service plan | A covered visit gets billed again as a one-off repair PO | | Warranty exclusion | Charges that should be blocked while equipment is under warranty | Intacct has no asset-level warranty field to check against |

## 4. Should you build this check inside Sage Intacct or outside it?

Sage Intacct's dimension structure can tag a transaction by vendor, department, and asset, which is useful for sorting maintenance spend for review. It cannot store a contract's NTE cap, rate schedule, or warranty term as a value it tests against, so the comparison has to happen outside the ERP, against the actual contract documents, however the transaction data itself is pulled from Intacct's reporting tools. Intacct's report writer and dimension tagging are genuinely useful for the first step: isolating every transaction coded to maintenance and repair accounts, by vendor and by location, for the period under review. That narrows a general ledger with thousands of lines to the set that actually needs contract-level review. What Intacct cannot do is the comparison itself. A rate schedule, an NTE clause, and a warranty term are unstructured facts that live in a signed PDF. No amount of custom dimension configuration turns that into a field Intacct checks automatically at invoice entry. That is the boundary. Use Intacct for what it stores and reports well: the transaction record. Do the contract comparison as a separate exercise, whether manually against a small vendor list or systematically across a full spend base.

## 5. Does the PPI for commercial machinery repair change how you read maintenance invoices?

The Producer Price Index for commercial machinery repair and maintenance gives a reference point for whether a rate increase on an invoice is plausible or worth questioning. Per the US Bureau of Labor Statistics PPI industry data for series PCU8113--8113--, read September 25, 2026, the August 2026 index value was 237.468, up 8.8% year over year, which is a market-wide input cost signal, not a ceiling on any single vendor's rate. When a maintenance vendor invoice shows a rate increase, the question is whether the increase was authorized under the contract's escalation clause and whether the size of it is defensible. The PPI series gives a market baseline for the second question without answering the first. An 8.8% year-over-year move in the index, per the BLS PPI data for series PCU8113--8113-- read September 25, 2026, means a vendor citing rising costs to justify a rate change is not inventing a trend. But the contract still governs whether that change needed written approval, a notice period, or a cap. Use the index as context when a rate increase looks unusual, not as a substitute for checking the escalation clause itself. A rate move in line with the index can still be unauthorized under the contract, and a rate move far above it is worth a direct question to the vendor regardless of what the contract allows.

## 6. What should a maintenance audit checklist actually cover?

A complete maintenance and repair audit checklist covers five items: rate schedule verification against the current contract, NTE cap testing on every repair above the vendor's standard PO threshold, preventive maintenance scope reconciliation against the standing service plan, warranty-period cross-checks against asset purchase and installation dates, and credit memo tracking for any overbilled amount already identified. None of these five checks depend on a specific software tool. They depend on having the contract on hand and the transaction history pulled from Sage Intacct in a format that can be sorted by vendor and date. A spreadsheet is enough to run all five for a vendor list of modest size. The hardest of the five in practice is preventive maintenance scope reconciliation, because it requires matching two invoices that may be coded differently and arrive on different schedules. The others are more mechanical once the contract terms are extracted into a usable reference sheet. 1. Rate schedule verification: Confirm every labor rate on a paid invoice traces to the current contract rate card, including any authorized escalation. 2. NTE cap testing: Flag any repair invoice that exceeds a stated not-to-exceed cap without documented written approval to go over it. 3. PM scope reconciliation: Check that a preventive maintenance visit billed as a one-off repair was not already covered under a standing service plan. 4. Warranty cross-check: Compare repair dates against asset installation dates to catch charges that should have been covered under warranty. 5. Credit memo tracking: Confirm any identified overbilling has an issued credit memo, not just a verbal agreement to adjust a future invoice.

## 7. Where does this fit against buying software instead?

Buying enforcement software before the contract terms are documented means configuring rules against guesses, because nobody yet knows which rate schedules, NTE caps, and PM scopes are actually being violated. Running the contract comparison first, even manually, produces the rule set a software purchase would otherwise have to invent, which is why the sequence matters more than the tool choice. A maintenance and repair audit against Sage Intacct data is, at its core, a one-time exercise in extracting the rules buried in contract PDFs and testing them against what was actually paid. That extraction has value independent of whatever tool eventually enforces those rules going forward. Software that watches invoices as they arrive can enforce a rate schedule or an NTE cap once that rule is defined in a system it can read. It cannot discover the rule from the contract on its own, and it cannot tell you which of last year's invoices already violated it. The decision of whether to buy a forward-looking control at all, and when, is a separate question from whether to do the retrospective read of the contracts first. The two are not substitutes. For the wider pattern this sits inside, start with the [margin drift](/insights/best-invoice-validation-software-smb) guide. See also [diagnostic or software: what to buy first](/insights/diagnostic-or-software-what-to-buy-first) and [build vs. buy: can you do contract-to-invoice matching in excel?](/insights/build-vs-buy-can-you-do-contract-to-invoice-matching-in).

## Common questions

### Does Sage Intacct track equipment warranty periods?

Sage Intacct does not have a native field that stores an asset's warranty expiration and tests a repair invoice against it. Some companies build a custom dimension or attach the warranty date as a note, but nothing in Intacct blocks or flags a charge automatically once the warranty date has passed.

### Can Sage Intacct's approval workflow catch an NTE overrun?

The approval workflow routes an invoice for sign-off above a dollar threshold you configure, which is useful for catching large invoices generally. It does not know a specific vendor's contracted not-to-exceed cap, so it cannot flag a repair that exceeds that vendor's specific limit unless the threshold happens to match.

### How far back should a maintenance spend audit go?

Per ValueXPA's diagnostic scope, leakage already embedded in 12 to 18 months of historical spend is the typical window worth reviewing, since that covers at least one full contract cycle for most maintenance agreements and captures any rate escalation that occurred during the period.

### What counts as a preventive maintenance scope conflict?

It is a case where a technician visit already covered under a standing service plan gets billed a second time as a separate repair PO. This happens most often when the PM plan and the repair work are invoiced by the same vendor under slightly different line item descriptions.

### Is a rate increase automatically a contract violation?

No. A rate increase is only a violation if the contract's escalation clause required notice, approval, or a cap that was not followed. A rate increase in line with published cost indices can still be improperly applied if it skipped the contract's own authorization steps.

---

ValueXPA runs a fixed-scope Margin Drift Diagnostic that validates every service vendor invoice against contract terms, for $100M+ US industrial manufacturers and distributors. Two to four weeks. The client retains 100% of recoveries. https://valuexpa.com/contact-us
