# How do you audit contract labor in SAP B1

> How to audit contract labor and staffing spend in SAP Business One: where the rate card lives outside the ERP and what a line-by-line check needs.

Source: https://valuexpa.com/insights/how-do-you-audit-contract-labor-and-staffing-spend-in-sap
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 contract labor and staffing, that gap opens in the fields SAP Business One was never built to hold: bill rate tiers, overtime multipliers, markup caps, and not-to-exceed ceilings that live in a staffing agency's master services agreement, not in the item master.

SAP Business One matches a purchase order to a receipt and an invoice. It does not know that a rate card specifies one hourly rate for a general laborer and a higher rate for a certified welder, or that the agreement caps markup at a stated percentage. Auditing this category means building that check somewhere else and running it against what B1 already has.

## Executive Summary

Contract labor is a hard indirect spend category to control inside SAP Business One because the thing being billed, a person's time at a negotiated rate, has no native object in the system. A purchase order line says "staffing services, $X," and the invoice matches it. Neither field tests whether $X is the rate the contract actually specifies for that role, that shift, or that tenure milestone.

The mechanism is structural, not a data-entry failure. B1's three-way match validates quantity and a PO price against a receipt. It was not built to hold a rate card with role tiers, shift differentials, overtime multipliers, and a markup cap, so the standard match does not test an invoice against those terms. The rate card sits in a PDF or an email attachment, outside the ERP entirely.

What changes it is treating the staffing agreement as a structured reference table and checking every invoice line against that table on a cadence the AP team can sustain. That does not require replacing B1. It requires exporting AP invoice detail regularly and reconciling it against the contract terms in a separate step, whether that step is a spreadsheet, a diagnostic engagement, or a forward control layered on top of the ERP.

## 1. Why doesn't SAP Business One catch a wrong bill rate on its own?

**SAP Business One's three-way match compares a purchase order line, a goods receipt or service confirmation, and the invoice. It checks that the invoice reflects the PO price and quantity the requester approved. It does not hold a rate card with role tiers, shift differentials, or a markup cap, so an invoice priced correctly against its own PO can still violate the underlying staffing agreement. The match tests internal consistency between B1's own documents, not external consistency against the contract.**

The three-way match exists to stop a vendor from billing more than what was ordered. It does that job well. But the PO line itself is only as accurate as whoever created it, and staffing agreements often carry rate schedules with a dozen role and shift combinations that nobody re-keys into the PO each time a new worker starts.

When a general laborer role and a skilled trade role share one generic PO line item, called something like "contract labor services," the system has no way to know which rate applies to which invoice. It checks the number against the PO, not the number against the contract.

This is why a rate error can persist across many invoices before anyone notices. Three-way matching checks the invoice against the PO and receipt; it does not test whether the underlying rate itself still matches the agreement it was drawn from.

## 2. What does a staffing agency invoice actually need to be checked against?

**A staffing invoice needs to be checked against the master services agreement's rate schedule, any overtime or shift-differential multiplier defined there, the markup percentage if the agency bills cost-plus, and any not-to-exceed ceiling on total spend for the engagement. None of these terms live inside SAP Business One as structured data by default. They exist as prose and tables in a contract document, which means the check has to pull the invoice line detail out of B1 and compare it.**

Building that reference means reading the master services agreement once and turning its terms into rows a spreadsheet or rule engine can hold: a role name, a bill rate, an effective date, and any conditions attached to it.

### A. Rate schedule and role mapping

The rate schedule lists a bill rate per role, and sometimes per tenure milestone, since some agreements step the rate down after a worker passes 90 days on assignment. The audit has to map each invoice line's job title to the correct row in that schedule, which is manual unless the role names on the invoice match the contract exactly.

### B. Overtime and shift multipliers

Agreements frequently specify a 1.5x multiplier past 40 hours a week and a separate differential for second or third shift. An invoice that applies straight time to hours that should carry a multiplier understates nothing, it overstates the agency's margin at the client's expense, and it is invisible unless someone reconstructs the hours from timesheets.

### C. Markup cap on cost-plus billing

Where the agreement bills pay rate plus a capped markup, the audit needs the worker's underlying pay rate to verify the markup percentage was not exceeded. Agencies do not always disclose pay rate voluntarily, so this check depends on what the contract actually entitles the client to request.

## 3. Can a PPI or wage index tell you if a labor rate increase is justified?

**An index shows whether input costs for a category are moving, but it does not tell you whether a specific rate increase on your invoice was contractually authorized. Per the US Bureau of Labor Statistics Producer Price Index for the Employment services industry group, not seasonally adjusted, the index stood at 174.047 in August 2026, up 3.5% year over year (read September 25, 2026). That movement is context for whether a rate increase is plausible. It is not.**

A staffing agency raising its bill rate mid-contract is not automatically wrong. Labor costs move, and most agreements include an escalation mechanism tied to a review date, a minimum wage change, or an index. The Employment services PPI gives a directional read on whether wage pressure in that segment is real.

What the index cannot do is confirm the increase your agency applied matches what your contract's escalation clause actually permits. Some clauses require written notice before a rate change takes effect. Some cap the increase to a specific percentage regardless of what the broader market is doing. Some allow no escalation at all during the contract term.

The audit step is contract-specific: locate the escalation clause, confirm notice was given if required, and confirm the increase applied does not exceed whatever cap the clause states. The index supports the conversation with the vendor. It does not close the check on its own.

## 4. How do you build this check without replacing SAP Business One?

**Export AP invoice line detail from SAP Business One on a recurring basis, including vendor, PO reference, role or item description, quantity, and unit price. Build a reference table from the staffing agreement's rate schedule, overtime terms, and markup cap. Reconcile the two outside the ERP, flagging any line where the invoiced rate does not match the contracted rate for that role and period. This is a retrospective check by design. It catches what already happened so the next PO.**

None of this requires new software as a precondition. A recurring export and a maintained rate table is enough to start, though the effort scales with how many roles, shifts, and agencies are in play, and with how often the underlying contract terms change.

Two ways to run this reconciliation, compared on what each requires.

| Approach
| What it requires
| What it catches

| Manual spreadsheet reconciliation
| AP export, a maintained rate table, staff time each cycle
| Rate mismatches found at the cadence the team can sustain

| Periodic diagnostic engagement
| A defined scope and a look-back period across 12 to 18 months of invoices
| Accumulated drift across the full look-back window, plus a roadmap

| Forward control layered on the ERP
| A rule engine configured against the current contract terms
| New invoices checked as they arrive, once configured correctly

## 5. What happens if you only rely on B1's approval workflow?

**SAP Business One's approval workflow routes an invoice to a manager based on amount thresholds or document type. It asks a human to look at a number, not to independently verify that number against a rate schedule the approver has usually never seen. An approver checking that a $14,000 staffing invoice looks roughly consistent with last month's is not the same control as checking each line against the contract's rate table, and the workflow does not distinguish between the.**

Approval routing is a control against unauthorized spend, not against mispriced spend. It confirms someone with authority reviewed the invoice before it was paid. It does not confirm the reviewer had the rate schedule in front of them, or the time to check a dozen line items against it during a routine approval pass.

In practice, the person approving a staffing invoice is usually the requesting manager, not someone with access to the underlying contract. They can tell if a number looks unusually high. They generally cannot tell if a general laborer rate crept from one figure to a slightly higher one over several invoices, because each individual increase looks small next to the total.

This is not a criticism of the workflow, it does what it is designed to do. The gap is that no step in the standard B1 process is designed to hold a contract's rate terms as a comparison point, so a small, sustained overcharge in this category can move through approval routing indefinitely without tripping it.

## 6. Should you check every contract labor invoice or sample them?

**The right answer depends on invoice volume and role complexity, not a fixed rule. A single agency billing a handful of stable roles is easier to check in full than a fluctuating roster across multiple agencies and shifts. Where full coverage is not sustainable given AP team capacity, a sample still needs to be structured around risk: new roles, rate changes, and overtime-heavy periods, rather than a random pull, because those are where a rate schedule mismatch is most likely.**

Full-population checking is the more reliable control when it is achievable, since a sample by definition leaves some errors unfound. The constraint is usually AP team time, not willingness.

Where sampling is the realistic option, weight it toward the invoice lines most likely to carry an error: any role that appears on an invoice for the first time, any period following a rate change or contract renewal, and any week with overtime hours, since multiplier errors concentrate there. A random sample across routine, unchanged invoice lines finds less per hour spent than a sample built around where terms actually change.

Either way, the check needs the rate schedule as a live reference, not a one-time lookup. Contracts get amended, roles get added, and a check built against last year's rate table will pass invoices that should fail against this year's.

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).

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

### Does SAP Business One have a built-in field for staffing rate cards?

No. SAP Business One's item and price list structures are built for goods and standard services, not for a role-based rate schedule with shift differentials, overtime multipliers, and markup caps. Staffing agreements are typically stored as attached documents rather than structured data, so the rate terms have to be extracted and maintained separately from the ERP for any systematic check to work.

### What is the difference between a duplicate payment and a rate schedule violation in this category?

A duplicate payment is the same invoice or the same hours paid twice, usually a data-entry or process failure. A rate schedule violation is a correctly processed, non-duplicate invoice that bills a rate, multiplier, or markup the contract does not actually authorize. Both cause leakage, but they require different checks: one compares invoices to each other, the other compares an invoice to the contract.

### Can three-way matching in SAP Business One catch an overtime multiplier error?

Three-way matching checks the invoice against the purchase order and receipt for quantity and PO price. It does not evaluate whether hours billed at straight time should have carried an overtime or shift multiplier under the staffing agreement, since that comparison requires the contract's multiplier terms, which the match does not hold.

### How far back should a contract labor audit look?

Per the diagnostic model, a look-back of 12 to 18 months of historical spend is used to surface accumulated drift, across ValueXPA diagnostics. That window is long enough to catch a rate error that persisted through several billing cycles before anyone noticed, while staying within what invoice-level detail is typically still readily retrievable from the ERP.

### Does a rising Employment services PPI mean our staffing agency's rate increase was justified?

It means wage costs in that industry segment were moving in that direction as of the reading. It does not confirm your specific contract's escalation clause was followed correctly, whether required notice was given, or whether the increase stayed under any cap the clause states. Those require checking the contract, not just the index.

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

The mechanics, pulling invoice detail and comparing it to a rate table, sit naturally with AP, since they process the invoices. But the rate schedule and contract terms usually sit with whoever negotiated the staffing agreement, often procurement or the hiring manager. The check works best when those two groups share the reference table rather than each holding half of it.

### Is a markup cap enforceable if the agency won't disclose pay rates?

It depends entirely on what the signed agreement actually entitles the client to request. Some agreements grant audit rights over pay rate documentation for cost-plus billing; others do not. This is a contractual question, and this answer is general information, not legal advice. Review the specific agreement's audit rights clause before assuming pay rate disclosure can be compelled.

### What counts as a not-to-exceed overrun in a staffing engagement?

It is invoiced spend that crosses a ceiling the contract set for a defined scope of work, project, or time period. It shows up as a cumulative total across several invoices rather than a single line-item error, which is why it is easy to miss when invoices are checked one at a time rather than tracked against the running total for that engagement.

### Does this audit approach also apply to freight or MRO contracts?

The mechanism is the same, an invoice checked against contract terms the ERP does not natively hold, but the specific reference data differs by category. Freight uses lane rates and accessorial schedules; MRO uses item-level pricing and volume tiers. Each category needs its own reference table built from its own contract documents.

### 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

Contract labor is a hard indirect spend category to control inside SAP Business One because the thing being billed, a person's time at a negotiated rate, has no native object in the system. A purchase order line says "staffing services, $X," and the invoice matches it. Neither field tests whether $X is the rate the contract actually specifies for that role, that shift, or that tenure milestone. The mechanism is structural, not a data-entry failure. B1's three-way match validates quantity and a PO price against a receipt. It was not built to hold a rate card with role tiers, shift differentials, overtime multipliers, and a markup cap, so the standard match does not test an invoice against those terms. The rate card sits in a PDF or an email attachment, outside the ERP entirely. What changes it is treating the staffing agreement as a structured reference table and checking every invoice line against that table on a cadence the AP team can sustain. That does not require replacing B1. It requires exporting AP invoice detail regularly and reconciling it against the contract terms in a separate step, whether that step is a spreadsheet, a diagnostic engagement, or a forward control layered on top of the ERP.

## 1. Why doesn't SAP Business One catch a wrong bill rate on its own?

SAP Business One's three-way match compares a purchase order line, a goods receipt or service confirmation, and the invoice. It checks that the invoice reflects the PO price and quantity the requester approved. It does not hold a rate card with role tiers, shift differentials, or a markup cap, so an invoice priced correctly against its own PO can still violate the underlying staffing agreement. The match tests internal consistency between B1's own documents, not external consistency against the contract. The three-way match exists to stop a vendor from billing more than what was ordered. It does that job well. But the PO line itself is only as accurate as whoever created it, and staffing agreements often carry rate schedules with a dozen role and shift combinations that nobody re-keys into the PO each time a new worker starts. When a general laborer role and a skilled trade role share one generic PO line item, called something like "contract labor services," the system has no way to know which rate applies to which invoice. It checks the number against the PO, not the number against the contract. This is why a rate error can persist across many invoices before anyone notices. Three-way matching checks the invoice against the PO and receipt; it does not test whether the underlying rate itself still matches the agreement it was drawn from.

## 2. What does a staffing agency invoice actually need to be checked against?

A staffing invoice needs to be checked against the master services agreement's rate schedule, any overtime or shift-differential multiplier defined there, the markup percentage if the agency bills cost-plus, and any not-to-exceed ceiling on total spend for the engagement. None of these terms live inside SAP Business One as structured data by default. They exist as prose and tables in a contract document, which means the check has to pull the invoice line detail out of B1 and compare it. Building that reference means reading the master services agreement once and turning its terms into rows a spreadsheet or rule engine can hold: a role name, a bill rate, an effective date, and any conditions attached to it. ### A. Rate schedule and role mapping The rate schedule lists a bill rate per role, and sometimes per tenure milestone, since some agreements step the rate down after a worker passes 90 days on assignment. The audit has to map each invoice line's job title to the correct row in that schedule, which is manual unless the role names on the invoice match the contract exactly. ### B. Overtime and shift multipliers Agreements frequently specify a 1.5x multiplier past 40 hours a week and a separate differential for second or third shift. An invoice that applies straight time to hours that should carry a multiplier understates nothing, it overstates the agency's margin at the client's expense, and it is invisible unless someone reconstructs the hours from timesheets. ### C. Markup cap on cost-plus billing Where the agreement bills pay rate plus a capped markup, the audit needs the worker's underlying pay rate to verify the markup percentage was not exceeded. Agencies do not always disclose pay rate voluntarily, so this check depends on what the contract actually entitles the client to request.

## 3. Can a PPI or wage index tell you if a labor rate increase is justified?

An index shows whether input costs for a category are moving, but it does not tell you whether a specific rate increase on your invoice was contractually authorized. Per the US Bureau of Labor Statistics Producer Price Index for the Employment services industry group, not seasonally adjusted, the index stood at 174.047 in August 2026, up 3.5% year over year (read September 25, 2026). That movement is context for whether a rate increase is plausible. It is not. A staffing agency raising its bill rate mid-contract is not automatically wrong. Labor costs move, and most agreements include an escalation mechanism tied to a review date, a minimum wage change, or an index. The Employment services PPI gives a directional read on whether wage pressure in that segment is real. What the index cannot do is confirm the increase your agency applied matches what your contract's escalation clause actually permits. Some clauses require written notice before a rate change takes effect. Some cap the increase to a specific percentage regardless of what the broader market is doing. Some allow no escalation at all during the contract term. The audit step is contract-specific: locate the escalation clause, confirm notice was given if required, and confirm the increase applied does not exceed whatever cap the clause states. The index supports the conversation with the vendor. It does not close the check on its own.

## 4. How do you build this check without replacing SAP Business One?

Export AP invoice line detail from SAP Business One on a recurring basis, including vendor, PO reference, role or item description, quantity, and unit price. Build a reference table from the staffing agreement's rate schedule, overtime terms, and markup cap. Reconcile the two outside the ERP, flagging any line where the invoiced rate does not match the contracted rate for that role and period. This is a retrospective check by design. It catches what already happened so the next PO. None of this requires new software as a precondition. A recurring export and a maintained rate table is enough to start, though the effort scales with how many roles, shifts, and agencies are in play, and with how often the underlying contract terms change. Two ways to run this reconciliation, compared on what each requires. | Approach | What it requires | What it catches | | --- | --- | --- | | Manual spreadsheet reconciliation | AP export, a maintained rate table, staff time each cycle | Rate mismatches found at the cadence the team can sustain | | Periodic diagnostic engagement | A defined scope and a look-back period across 12 to 18 months of invoices | Accumulated drift across the full look-back window, plus a roadmap | | Forward control layered on the ERP | A rule engine configured against the current contract terms | New invoices checked as they arrive, once configured correctly |

## 5. What happens if you only rely on B1's approval workflow?

SAP Business One's approval workflow routes an invoice to a manager based on amount thresholds or document type. It asks a human to look at a number, not to independently verify that number against a rate schedule the approver has usually never seen. An approver checking that a $14,000 staffing invoice looks roughly consistent with last month's is not the same control as checking each line against the contract's rate table, and the workflow does not distinguish between the. Approval routing is a control against unauthorized spend, not against mispriced spend. It confirms someone with authority reviewed the invoice before it was paid. It does not confirm the reviewer had the rate schedule in front of them, or the time to check a dozen line items against it during a routine approval pass. In practice, the person approving a staffing invoice is usually the requesting manager, not someone with access to the underlying contract. They can tell if a number looks unusually high. They generally cannot tell if a general laborer rate crept from one figure to a slightly higher one over several invoices, because each individual increase looks small next to the total. This is not a criticism of the workflow, it does what it is designed to do. The gap is that no step in the standard B1 process is designed to hold a contract's rate terms as a comparison point, so a small, sustained overcharge in this category can move through approval routing indefinitely without tripping it.

## 6. Should you check every contract labor invoice or sample them?

The right answer depends on invoice volume and role complexity, not a fixed rule. A single agency billing a handful of stable roles is easier to check in full than a fluctuating roster across multiple agencies and shifts. Where full coverage is not sustainable given AP team capacity, a sample still needs to be structured around risk: new roles, rate changes, and overtime-heavy periods, rather than a random pull, because those are where a rate schedule mismatch is most likely. Full-population checking is the more reliable control when it is achievable, since a sample by definition leaves some errors unfound. The constraint is usually AP team time, not willingness. Where sampling is the realistic option, weight it toward the invoice lines most likely to carry an error: any role that appears on an invoice for the first time, any period following a rate change or contract renewal, and any week with overtime hours, since multiplier errors concentrate there. A random sample across routine, unchanged invoice lines finds less per hour spent than a sample built around where terms actually change. Either way, the check needs the rate schedule as a live reference, not a one-time lookup. Contracts get amended, roles get added, and a check built against last year's rate table will pass invoices that should fail against this year's. 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 SAP Business One have a built-in field for staffing rate cards?

No. SAP Business One's item and price list structures are built for goods and standard services, not for a role-based rate schedule with shift differentials, overtime multipliers, and markup caps. Staffing agreements are typically stored as attached documents rather than structured data, so the rate terms have to be extracted and maintained separately from the ERP for any systematic check to work.

### What is the difference between a duplicate payment and a rate schedule violation in this category?

A duplicate payment is the same invoice or the same hours paid twice, usually a data-entry or process failure. A rate schedule violation is a correctly processed, non-duplicate invoice that bills a rate, multiplier, or markup the contract does not actually authorize. Both cause leakage, but they require different checks: one compares invoices to each other, the other compares an invoice to the contract.

### Can three-way matching in SAP Business One catch an overtime multiplier error?

Three-way matching checks the invoice against the purchase order and receipt for quantity and PO price. It does not evaluate whether hours billed at straight time should have carried an overtime or shift multiplier under the staffing agreement, since that comparison requires the contract's multiplier terms, which the match does not hold.

### How far back should a contract labor audit look?

Per the diagnostic model, a look-back of 12 to 18 months of historical spend is used to surface accumulated drift, across ValueXPA diagnostics. That window is long enough to catch a rate error that persisted through several billing cycles before anyone noticed, while staying within what invoice-level detail is typically still readily retrievable from the ERP.

### Does a rising Employment services PPI mean our staffing agency's rate increase was justified?

It means wage costs in that industry segment were moving in that direction as of the reading. It does not confirm your specific contract's escalation clause was followed correctly, whether required notice was given, or whether the increase stayed under any cap the clause states. Those require checking the contract, not just the index.

---

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
