How to prepare facilities and janitorial data for an audit

A concrete, numbered plan for pulling facilities and janitorial vendor data into shape before a contract compliance audit begins. Read the full guide.

Twitter LinkedIn WhatsApp
Ask AI: ChatGPT Claude Gemini Grok
How to prepare facilities and janitorial data for an audit

Margin drift is the gap between what a vendor contract says and what the invoice actually charges. Facilities and janitorial spend hides drift well: contracts are short, invoices are recurring, and nobody re-reads either after signing.

Before an audit starts, the data has to exist in one place, in a form a reviewer can actually check line by line. This guide walks through preparing that data, in order, so the audit itself starts on day one instead of week two.

Executive Summary

Facilities and janitorial audits stall for one reason more than any other: the data arrives scattered across property managers, a shared drive of PDFs, and an ERP that only holds the invoice total. A reviewer cannot match a charge to a contract term if the contract term is not typed anywhere machine-readable.

The fix is mechanical, not analytical. Before anyone tests a single invoice, someone has to assemble a vendor list, a contract library, an invoice extract, and a site or square-footage reference, and reconcile the four against each other. Each of those four steps has a specific, checkable output.

Done in order, this preparation turns a facilities audit from a document hunt into a matching exercise. Skipped or rushed, it turns the audit into weeks of chasing missing contracts while invoices keep paying against terms nobody can locate.

1. What data does a facilities and janitorial audit actually need?

A facilities and janitorial audit needs four datasets: a vendor master listing every active service provider and site, a contract library with rate, frequency and scope terms extracted into fields, an invoice extract covering the audit period at line-item detail, and a site reference showing square footage, headcount or service frequency by location. Without all four, a reviewer can see what was billed but not what should have been billed, which makes contract testing impossible rather than just slower.

A janitorial invoice usually shows a location, a service period, and a total. It rarely shows the rate per square foot, the contracted frequency, or which supplies are included versus billed separately. That information lives in the contract, not the invoice, and the contract is often a PDF nobody has opened since signing.

The vendor master matters because facilities spend runs through property managers, general contractors, and regional janitorial firms that get set up more than once under slightly different names. A reviewer testing against a duplicate vendor entry will miss that two invoices for the same site came from what is really one contract.

The site reference is the piece most often skipped. Janitorial rates are frequently priced per square foot or per visit. Without a current square footage or frequency figure per site, a reviewer has a rate and a total but no way to check that the two multiply correctly.

Collecting all four before testing starts means the audit spends its time comparing numbers, not locating them.

  1. Vendor master: Every active facilities and janitorial vendor, with site assignments and a check for near-duplicate names or tax IDs.
  2. Contract library: Every signed agreement for the period, with rate, frequency, scope and escalation terms pulled into fields, not left in prose.
  3. Invoice extract: Line-item detail for the audit period, not just invoice totals, pulled from the AP system.
  4. Site reference: Square footage, headcount or contracted visit frequency per location, current as of the audit period.

2. How do you build a clean vendor master for facilities spend?

Start from the AP vendor file, filter to facilities and janitorial spend categories, then check for the same vendor entered under a different name, address, or tax ID. Merge duplicates in a working copy, not the live ERP record, and note which merged entries billed the same site in the same month. That overlap is often where a duplicate payment or a double-billed month is sitting before testing even begins.

Property management and janitorial vendors are set up by whoever signs the contract locally, at the site level, which is exactly the condition that produces duplicate vendor records: same company, slightly different legal name, different remit-to address.

Run the AP vendor list against the facilities and janitorial spend category, sort by tax ID where available, and flag anything that shares an address or phone number with another entry. Cleaning the vendor master before testing is what makes duplicate vendor records visible instead of buried across two record IDs.

Do not correct the live ERP record as part of audit prep. Build a working crosswalk that maps every duplicate to one canonical vendor ID for the purpose of the audit, and pass the cleanup recommendation to AP separately once the audit is done.

A. What to flag

Same remit-to address under two vendor names. Same tax ID under two vendor names. A vendor with no address change but a different contact after a contract renewal, which sometimes indicates a subcontracted relationship rather than a true switch of provider.

3. How do you extract contract terms that an invoice can actually be checked against?

Pull five fields from every facilities and janitorial contract into a spreadsheet or table: rate basis, billing frequency, scope inclusions, escalation clause, and expiration or renewal date. Leave the contract PDF as the source of truth, but do not ask a reviewer to reopen it for every invoice. A field extracted once is checked many times against invoices; a clause left in prose gets checked against nothing.

This is the step most facilities audits skip, and it is the one that determines whether the rest of the audit is possible. A rate card buried in paragraph four of a service agreement does not get compared to an invoice. A rate typed into a field does.

For janitorial contracts specifically, extract the rate basis (per square foot, per visit, flat monthly), the included scope (day porter, floor care, window washing, supplies), and anything billed as an add-on. Facilities contracts often bundle supplies into the base rate for the first year and then start billing them separately at renewal, which an invoice-only review will not catch.

Escalation and renewal dates matter because a facilities contract that auto-renewed at an escalated rate without a signed amendment is one of the more common places drift sits quietly. Extracting the expiration date lets a reviewer check whether the current invoice rate matches a contract that is still technically in force.

This extraction discipline mirrors what governs pricing data in other spend categories: a rate is only useful once it sits somewhere an invoice can be checked against it, not just somewhere it was once written down.

Contract fields to extract before testing begins, and what each one is checked against.

Field Extracted from Checked against
Rate basis Pricing schedule or exhibit Invoice unit rate
Billing frequency Service agreement body Invoice date and period
Scope inclusions Scope of work section Line items billed separately
Escalation clause Renewal or amendment section Rate change date on invoice
Expiration or renewal date Signature page or amendment log Current invoice date

4. How do you pull an invoice extract that supports line-by-line testing?

Export invoice line items for the audit period directly from the AP or ERP system, not the summarized general ledger view. Include vendor ID, site, service period, line description, quantity, unit rate and total for each line. A general ledger export that shows one posted amount per invoice cannot support a rate check, because the rate and the quantity that produced the total are not visible at that level of detail.

The general ledger records what was paid. It does not usually retain the line-item detail behind the total, especially once an invoice has been coded to a single expense account. Pulling from accounts payable, where the original invoice lines are still attached, is what makes a rate check possible.

For janitorial invoices, the fields that matter are the service period, the site or location code, the line description, and the unit rate if one is shown separately from the total. Where the invoice shows only a lump sum for a site, that itself is worth flagging: a contract priced per square foot or per visit should produce an invoice that shows the calculation, not just the answer.

Align the invoice extract to the same site codes used in the vendor master and the site reference. A mismatch in site naming between the three files is one of the most common reasons a reconciliation looks clean when it is not: the invoice for Plant 4 and the contract for Building 4 West never get compared because nothing links them.

  • Vendor and site ID: Match to the cleaned vendor master and the site reference, not the raw ERP labels.
  • Service period: The dates the invoice covers, not just the invoice date, since janitorial billing is often issued a month behind service.
  • Line-level rate and quantity: Whatever the invoice states separately from the total, even if incomplete.

5. How do you reconcile site square footage and service frequency before testing?

Pull a current square footage or headcount figure for every site from facilities management or real estate records, not from the original contract, since a lease can expand or contract a footprint years after signing. Match each figure to the site codes used in the invoice extract and the vendor master. Any site with no current reference figure gets flagged for confirmation before testing, rather than tested against a stale contract-era number.

Square footage is one of the few figures in a facilities audit that changes over time without anyone renegotiating the janitorial contract to match. A site that expanded by a wing years ago may still be billed, and still be reviewed, against the square footage stated in the original agreement.

Getting a current figure usually means going to whoever manages the real estate portfolio or lease administration, not the vendor. The vendor has no incentive to flag that a site got smaller.

Once collected, this reference sits alongside the invoice extract and the contract terms as the third leg of the check: rate times current square footage or frequency should equal, or closely approximate, the amount billed. Where it does not, the gap is either a stale contract, a stale square footage figure, or an invoice error, and the audit's job is to determine which.

A. Sites with no current figure

Flag these before testing starts rather than during it. Testing against an unconfirmed number produces a finding that will not survive review, and re-testing later costs more time than confirming the figure up front would have.

6. What should happen after the four datasets are reconciled?

Once the vendor master, contract library, invoice extract and site reference are reconciled, run a matching pass before deep testing: check every invoice line against its corresponding contract rate and site figure, and set aside anything that cannot be matched at all. Unmatched lines are usually a data gap, not a finding yet. Resolve the gap first, since testing a mismatched line produces a number that will not hold up.

A matching pass is different from the substantive testing that follows it. Its purpose is only to confirm that every invoice line has a contract to check against and a site figure to check the rate with. Anything that fails to match gets set aside in its own list, with a reason: no contract on file, no current site figure, or a site code that does not appear in the vendor master.

This is also the point to decide the audit's cadence. A one-time reconciliation supports a single audit, but facilities and janitorial spend keeps drifting after the audit closes unless something checks new invoices against the same reference data going forward. Whether to run a periodic review or check every invoice as it arrives is a separate decision worth working through deliberately rather than defaulting into.

Once the matched population is confirmed, testing can proceed line by line with confidence that a flagged variance reflects an actual billing or contract issue, not a data gap that would have explained it away.

For the wider pattern this sits inside, start with the margin drift guide.

7. Frequently Asked Questions (People Also Ask)

How far back should the invoice extract go for a facilities audit?

Far enough to cover at least one full contract cycle, including any renewal or escalation date, so a rate change can be checked against the amendment that authorized it. A period that stops short of the last renewal will miss the point where a rate most often shifts without a corresponding contract update.

What if we cannot find a signed contract for a site?

Flag the site as unconfirmed and pull whatever governs the relationship: a purchase order, a statement of work, or email confirmation of terms. An invoice with no contract behind it cannot be tested against contract terms, only reviewed for internal consistency and reasonableness against comparable sites.

Do we need square footage for every site, or just the larger ones?

Every site billed on a per-square-foot or per-visit basis needs a current figure, regardless of size, because the check is a ratio, not an absolute dollar amount. A small site with a stale square footage figure can show the same percentage drift as a large one.

Should facilities and janitorial data be combined with other indirect spend categories in one file?

Keep the vendor master and site reference separate by category during preparation, since janitorial pricing logic, priced per square foot or per visit, differs from other facilities spend like maintenance or landscaping. They can be combined later for reporting once each category has been reconciled on its own terms.

What causes the longest delays in facilities audit prep?

Site naming mismatches across the vendor master, invoice extract and site reference are a frequent cause of delay, because they make automatic matching fail and force a manual review of every line to find its counterpart record.

Can this preparation work be done with a spreadsheet, or does it need software?

A spreadsheet can hold all four datasets and support the matching pass described here, provided site codes are standardized across every file first. The limitation is not the tool, it is keeping the reconciliation current after the audit closes, which is a separate, ongoing question.

Who should own pulling the contract terms into fields?

Whoever has access to the signed contracts, typically facilities management or procurement, should extract the fields, with AP or the audit team defining which fields are needed. The extraction is clerical but requires someone who can read a service agreement accurately.

How do we handle a janitorial vendor that services multiple sites under one contract?

List every site under that single contract in the vendor master and site reference, but keep the invoice extract at the site level if the vendor bills that way. A master contract with site-level billing still needs a site-level check, since a rate error at one location will not show up in a contract-level total.

Executive Summary

Facilities and janitorial audits stall for one reason more than any other: the data arrives scattered across property managers, a shared drive of PDFs, and an ERP that only holds the invoice total. A reviewer cannot match a charge to a contract term if the contract term is not typed anywhere machine-readable. The fix is mechanical, not analytical. Before anyone tests a single invoice, someone has to assemble a vendor list, a contract library, an invoice extract, and a site or square-footage reference, and reconcile the four against each other. Each of those four steps has a specific, checkable output. Done in order, this preparation turns a facilities audit from a document hunt into a matching exercise. Skipped or rushed, it turns the audit into weeks of chasing missing contracts while invoices keep paying against terms nobody can locate.

1. What data does a facilities and janitorial audit actually need?

A facilities and janitorial audit needs four datasets: a vendor master listing every active service provider and site, a contract library with rate, frequency and scope terms extracted into fields, an invoice extract covering the audit period at line-item detail, and a site reference showing square footage, headcount or service frequency by location. Without all four, a reviewer can see what was billed but not what should have been billed, which makes contract testing impossible rather than just slower. A janitorial invoice usually shows a location, a service period, and a total. It rarely shows the rate per square foot, the contracted frequency, or which supplies are included versus billed separately. That information lives in the contract, not the invoice, and the contract is often a PDF nobody has opened since signing. The vendor master matters because facilities spend runs through property managers, general contractors, and regional janitorial firms that get set up more than once under slightly different names. A reviewer testing against a duplicate vendor entry will miss that two invoices for the same site came from what is really one contract. The site reference is the piece most often skipped. Janitorial rates are frequently priced per square foot or per visit. Without a current square footage or frequency figure per site, a reviewer has a rate and a total but no way to check that the two multiply correctly. Collecting all four before testing starts means the audit spends its time comparing numbers, not locating them. 1. Vendor master: Every active facilities and janitorial vendor, with site assignments and a check for near-duplicate names or tax IDs. 2. Contract library: Every signed agreement for the period, with rate, frequency, scope and escalation terms pulled into fields, not left in prose. 3. Invoice extract: Line-item detail for the audit period, not just invoice totals, pulled from the AP system. 4. Site reference: Square footage, headcount or contracted visit frequency per location, current as of the audit period.

2. How do you build a clean vendor master for facilities spend?

Start from the AP vendor file, filter to facilities and janitorial spend categories, then check for the same vendor entered under a different name, address, or tax ID. Merge duplicates in a working copy, not the live ERP record, and note which merged entries billed the same site in the same month. That overlap is often where a duplicate payment or a double-billed month is sitting before testing even begins. Property management and janitorial vendors are set up by whoever signs the contract locally, at the site level, which is exactly the condition that produces [duplicate vendor records](/guides/vendor-master-hygiene-and-the-duplicate-vendor-problem): same company, slightly different legal name, different remit-to address. Run the AP vendor list against the facilities and janitorial spend category, sort by tax ID where available, and flag anything that shares an address or phone number with another entry. Cleaning the vendor master before testing is what makes duplicate vendor records visible instead of buried across two record IDs. Do not correct the live ERP record as part of audit prep. Build a working crosswalk that maps every duplicate to one canonical vendor ID for the purpose of the audit, and pass the cleanup recommendation to AP separately once the audit is done. ### A. What to flag Same remit-to address under two vendor names. Same tax ID under two vendor names. A vendor with no address change but a different contact after a contract renewal, which sometimes indicates a subcontracted relationship rather than a true switch of provider.

3. How do you extract contract terms that an invoice can actually be checked against?

Pull five fields from every facilities and janitorial contract into a spreadsheet or table: rate basis, billing frequency, scope inclusions, escalation clause, and expiration or renewal date. Leave the contract PDF as the source of truth, but do not ask a reviewer to reopen it for every invoice. A field extracted once is checked many times against invoices; a clause left in prose gets checked against nothing. This is the step most facilities audits skip, and it is the one that determines whether the rest of the audit is possible. A rate card buried in paragraph four of a service agreement does not get compared to an invoice. A rate typed into a field does. For janitorial contracts specifically, extract the rate basis (per square foot, per visit, flat monthly), the included scope (day porter, floor care, window washing, supplies), and anything billed as an add-on. Facilities contracts often bundle supplies into the base rate for the first year and then start billing them separately at renewal, which an invoice-only review will not catch. Escalation and renewal dates matter because a facilities contract that auto-renewed at an escalated rate without a signed amendment is one of the more common places drift sits quietly. Extracting the expiration date lets a reviewer check whether the current invoice rate matches a contract that is still technically in force. This extraction discipline mirrors what governs [pricing data in other spend categories](/guides/price-file-governance-why-annual-uploads-create-twelve): a rate is only useful once it sits somewhere an invoice can be checked against it, not just somewhere it was once written down. Contract fields to extract before testing begins, and what each one is checked against. | Field | Extracted from | Checked against | | --- | --- | --- | | Rate basis | Pricing schedule or exhibit | Invoice unit rate | | Billing frequency | Service agreement body | Invoice date and period | | Scope inclusions | Scope of work section | Line items billed separately | | Escalation clause | Renewal or amendment section | Rate change date on invoice | | Expiration or renewal date | Signature page or amendment log | Current invoice date |

4. How do you pull an invoice extract that supports line-by-line testing?

Export invoice line items for the audit period directly from the AP or ERP system, not the summarized general ledger view. Include vendor ID, site, service period, line description, quantity, unit rate and total for each line. A general ledger export that shows one posted amount per invoice cannot support a rate check, because the rate and the quantity that produced the total are not visible at that level of detail. The general ledger records what was paid. It does not usually retain the line-item detail behind the total, especially once an invoice has been coded to a single expense account. Pulling from accounts payable, where the original invoice lines are still attached, is what makes [a rate check possible](/guides/the-three-way-match-gap-what-your-erp-structurally-cannot). For janitorial invoices, the fields that matter are the service period, the site or location code, the line description, and the unit rate if one is shown separately from the total. Where the invoice shows only a lump sum for a site, that itself is worth flagging: a contract priced per square foot or per visit should produce an invoice that shows the calculation, not just the answer. Align the invoice extract to the same site codes used in the vendor master and the site reference. A mismatch in site naming between the three files is one of the most common reasons a reconciliation looks clean when it is not: the invoice for Plant 4 and the contract for Building 4 West never get compared because nothing links them. - Vendor and site ID: Match to the cleaned vendor master and the site reference, not the raw ERP labels. - Service period: The dates the invoice covers, not just the invoice date, since janitorial billing is often issued a month behind service. - Line-level rate and quantity: Whatever the invoice states separately from the total, even if incomplete.

5. How do you reconcile site square footage and service frequency before testing?

Pull a current square footage or headcount figure for every site from facilities management or real estate records, not from the original contract, since a lease can expand or contract a footprint years after signing. Match each figure to the site codes used in the invoice extract and the vendor master. Any site with no current reference figure gets flagged for confirmation before testing, rather than tested against a stale contract-era number. Square footage is one of the few figures in a facilities audit that changes over time without anyone renegotiating the janitorial contract to match. A site that expanded by a wing years ago may still be billed, and still be reviewed, against the square footage stated in the original agreement. Getting a current figure usually means going to whoever manages the real estate portfolio or lease administration, not the vendor. The vendor has no incentive to flag that a site got smaller. Once collected, this reference sits alongside the invoice extract and the contract terms as the third leg of the check: rate times current square footage or frequency should equal, or closely approximate, the amount billed. Where it does not, the gap is either a stale contract, a stale square footage figure, or an invoice error, and the audit's job is to determine which. ### A. Sites with no current figure Flag these before testing starts rather than during it. Testing against an unconfirmed number produces a finding that will not survive review, and re-testing later costs more time than confirming the figure up front would have.

6. What should happen after the four datasets are reconciled?

Once the vendor master, contract library, invoice extract and site reference are reconciled, run a matching pass before deep testing: check every invoice line against its corresponding contract rate and site figure, and set aside anything that cannot be matched at all. Unmatched lines are usually a data gap, not a finding yet. Resolve the gap first, since testing a mismatched line produces a number that will not hold up. A matching pass is different from the substantive testing that follows it. Its purpose is only to confirm that every invoice line has a contract to check against and a site figure to check the rate with. Anything that fails to match gets set aside in its own list, with a reason: no contract on file, no current site figure, or a site code that does not appear in the vendor master. This is also the point to decide the audit's cadence. A one-time reconciliation supports a single audit, but facilities and janitorial spend keeps drifting after the audit closes unless something checks new invoices against the same reference data going forward. Whether to run a periodic review or check every invoice as it arrives is a separate decision worth working through deliberately rather than defaulting into. Once the matched population is confirmed, testing can proceed line by line with confidence that a flagged variance reflects an actual billing or contract issue, not a data gap that would have explained it away. For the wider pattern this sits inside, start with the [margin drift](/guides/contract-compliance-controls-p2p) guide.

Questions & Answers

How far back should the invoice extract go for a facilities audit?

Far enough to cover at least one full contract cycle, including any renewal or escalation date, so a rate change can be checked against the amendment that authorized it. A period that stops short of the last renewal will miss the point where a rate most often shifts without a corresponding contract update.

What if we cannot find a signed contract for a site?

Flag the site as unconfirmed and pull whatever governs the relationship: a purchase order, a statement of work, or email confirmation of terms. An invoice with no contract behind it cannot be tested against contract terms, only reviewed for internal consistency and reasonableness against comparable sites.

Do we need square footage for every site, or just the larger ones?

Every site billed on a per-square-foot or per-visit basis needs a current figure, regardless of size, because the check is a ratio, not an absolute dollar amount. A small site with a stale square footage figure can show the same percentage drift as a large one.

Should facilities and janitorial data be combined with other indirect spend categories in one file?

Keep the vendor master and site reference separate by category during preparation, since janitorial pricing logic, priced per square foot or per visit, differs from other facilities spend like maintenance or landscaping. They can be combined later for reporting once each category has been reconciled on its own terms.

What causes the longest delays in facilities audit prep?

Site naming mismatches across the vendor master, invoice extract and site reference are a frequent cause of delay, because they make automatic matching fail and force a manual review of every line to find its counterpart record.

Margin Drift Resources