How Do You Audit Freight and 3PL Spend in NetSuite?

NetSuite's three-way match checks price against the PO. It does not test a fuel surcharge clause, a minimum charge, or an accessorial fee. Here's what to check.

Twitter LinkedIn WhatsApp
Ask AI: ChatGPT Claude Gemini Grok
How Do You Audit Freight and 3PL Spend in NetSuite?

Margin drift is the gap between what a vendor contract says and what the invoice actually charges. In freight and 3PL spend, that gap opens quietly: a fuel surcharge table that never resets, an accessorial fee with no matching tariff line, a minimum charge applied to a shipment that cleared the threshold.

NetSuite records the bill. It does not read the carrier contract sitting in a PDF outside the ERP, and that is where a freight audit has to start.

Executive Summary

Freight invoices carry more negotiated terms per line than almost any other AP category: base rate, fuel surcharge, accessorials, minimum charges, volume tiers. NetSuite's bill entry and three-way match confirm that a vendor billed what a purchase order and receipt say it should. They do not confirm that the purchase order itself reflects the current rate card, or that a surcharge percentage still matches the index it was supposed to track.

The mechanism behind freight margin drift comes down to timing. A rate negotiation, a fuel index reset, or a tariff revision happens on the carrier's calendar. The billing system that pays the invoice runs on its own calendar, and nothing forces the two to reconcile automatically.

What changes it is comparing the invoice against the contract terms directly, line by line, on a schedule independent of whatever NetSuite already approved. That comparison is either a recurring internal process built against the actual rate card and fuel index, or a fixed-scope review that does it once across a defined lookback period.

1. How do you audit freight and 3PL spend in NetSuite?

You audit freight and 3PL spend in NetSuite by pulling every freight and carrier bill for a defined period, then checking each line against three things NetSuite does not store natively: the current carrier rate card, the fuel surcharge index the contract references, and the accessorial tariff schedule. NetSuite confirms the invoice matches the purchase order. It cannot confirm the purchase order itself still reflects the contract, so the audit has to bring the contract terms in from outside the.

Start by exporting freight vendor bills by carrier and lane for the period under review. Group them by rate type: base linehaul, fuel surcharge, accessorial, and minimum charge, since each drifts differently and needs a different reference document to check against.

Then bring in the actual contract or rate card for each carrier, the current fuel surcharge table it references, and the accessorial tariff it cites. Match each invoice line against the matching term, not against the purchase order NetSuite already approved. A PO built from a stale rate card will match its own invoice perfectly and still overcharge against the contract.

2. What does NetSuite check automatically on a freight invoice?

NetSuite's three-way match compares the vendor bill against the purchase order and the item receipt: same vendor, same quantity, same unit price as entered on the PO. That check confirms internal consistency. It does not test whether the unit price on the PO reflects the carrier's current rate card, whether a fuel surcharge percentage still matches the index it is supposed to track, or whether an accessorial fee appears in the carrier's own published tariff.

The control NetSuite runs is real and it does catch a class of errors: a bill entered against the wrong PO, a quantity that does not reconcile, a unit price typed incorrectly at entry. Those are data-entry failures, and three-way matching is built for exactly that.

A rate card violation is a different kind of error. The invoice can match its own purchase order precisely and still be wrong, because the PO was built from a rate that expired, or a surcharge formula that was never updated when the reference index moved. Three-way matching has no field that holds the carrier contract, so it has nothing to compare the rate against.

3. Where does freight margin drift hide inside a NetSuite bill record?

Freight margin drift hides in three places on a NetSuite bill record: the base rate line, which can carry a lane rate that predates the current contract; the fuel surcharge line, which can carry a fixed percentage instead of the indexed formula the contract specifies; and the accessorial lines, which can bill a fee the carrier's own tariff does not define for that shipment type. None of the three shows up as an exception inside NetSuite, because each one passes.

Each of these three drift points needs a different source document to check against: the rate card for the base rate, the surcharge formula and fuel index for the surcharge line, and the carrier's own tariff for accessorials. None of them is visible from the bill record alone.

A. Base rate

A lane rate negotiated a year ago can still be sitting in the item record NetSuite pulls onto every PO for that carrier and lane. Nothing in NetSuite flags a rate as stale; it only flags a rate as mismatched against the PO, and the PO was built from the same stale rate.

B. Fuel surcharge

Contracts typically define the fuel surcharge as a formula tied to a published fuel index, not as a flat percentage. When the carrier's billing system keeps applying last quarter's percentage after the index moves, the bill still balances against the PO because the PO carries the same outdated assumption.

C. Accessorials

Detention, liftgate, residential delivery, and reclassification fees each have a defined trigger in the carrier's tariff. An accessorial charged without the shipment meeting that trigger, or at a rate the tariff does not list, passes three-way match because NetSuite has no accessorial tariff table to check it against.

4. How does a fuel surcharge drift from the carrier's published schedule?

A fuel surcharge drifts when the percentage applied on the invoice stops tracking the fuel index the contract names as its reference. Diesel and gasoline prices move on their own schedule, and truck freight rates move on a separate one. A surcharge formula that is not rechecked against the current index keeps charging a past period's rate.

The contract sets the formula; only a line-by-line check against the current published index confirms the invoice is still applying it correctly.

These index series move at different rates over the same period, which is the point: a fuel surcharge clause references one specific index, not freight rates in general, and a formula that quietly substitutes a smoother or slower-moving figure will underbill or overbill against what the contract actually specifies.

Checking this means finding the exact index named in the contract, pulling its current value with a date attached, and running the invoice's surcharge percentage back through the formula the contract states. Anything else is a guess dressed up as an audit.

Recent movement in the indices a freight fuel surcharge clause typically references, per the US Bureau of Labor Statistics Producer Price Index, read September 25, 2026.

Recent movement in indices a freight fuel surcharge clause typically references, per the US Bureau of Labor Statistics Producer Price Index, read September 25, 2026.

Series August 2026 index value Year-over-year change
Truck transportation of freight (WPU3012) 177.458 up 14.3%
General freight trucking, long-distance TL (PCU484121484121) 207.644 up 13.9%
Gasoline (WPU0571) 319.584 up 46.5%

5. What data do you need that NetSuite does not store?

A freight audit needs four documents NetSuite has no field for: the signed carrier contract or rate card, the current fuel surcharge formula and its referenced index, the carrier's accessorial tariff schedule, and any volume tier or minimum commitment clause. All four typically exist as PDFs or spreadsheets held outside the ERP by procurement or the carrier relationship owner, and none of them is visible to the three-way match running inside NetSuite at bill entry.

Getting these four documents into one place is most of the audit's actual work. NetSuite bill data is already clean and exportable; the contract terms are the part that has to be gathered from wherever procurement or the carrier relationship owner kept them last.

Once the four are assembled, the comparison against invoice history is mechanical: line up each bill's rate, surcharge, and accessorial against the matching clause and flag anything that does not reconcile.

  • Signed carrier rate card: The base linehaul rate by lane, and its effective date range, so a stale rate on a purchase order can be identified.
  • Fuel surcharge formula: The exact index it references and the calculation method, so the invoiced percentage can be recalculated and checked.
  • Accessorial tariff schedule: The carrier's own published list of fees and the conditions that trigger each one.
  • Volume tier and minimum clauses: Any clause that changes the rate once a volume threshold is crossed, or that sets a floor charge regardless of shipment size.

6. Should you build this audit in-house or bring in a fixed-scope review?

Build it in-house when your AP or procurement team already holds the carrier contracts, has time to reconcile them against invoice history, and can repeat the check on a schedule. Bring in a fixed-scope review when the contracts are scattered across owners, the lookback period runs into years of invoice history, or the team that would run the check is the same team already consumed processing the invoices being audited. Neither answer is right in general; the right one depends.

A periodic audit and a forward control answer different questions. The audit tests what already happened across months or years of invoice history. A forward control, once configured against the correct rate card, tests the next invoice as it arrives.

Building the forward control against contract terms nobody has yet verified means encoding whatever assumption was guessed, not what the contract states.

That is the sequencing question worth answering before either path: which one you need first depends on whether you can currently name, with confidence, which carrier contracts your NetSuite purchase orders are still built against.

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? Every check still has to be run against a signed carrier rate card, since that document is what defines whether a lane rate is current or stale.

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 NetSuite's three-way match catch freight overbilling?

It catches mismatches against the purchase order and receipt already inside NetSuite: wrong vendor, wrong quantity, a unit price that differs from the PO. It does not catch a PO built from a stale rate card or a surcharge formula that no longer matches the fuel index, because neither document lives in NetSuite.

Can a NetSuite saved search flag a bad fuel surcharge?

A saved search can flag a surcharge percentage that looks unusual against past invoices from the same carrier, which is useful for spotting a sudden jump. It cannot tell you whether the percentage is correct, because that requires the fuel index and formula named in the contract, neither of which NetSuite stores.

Where do carrier rate cards usually live if not in NetSuite?

Carrier rate cards and tariff schedules are typically held as PDFs or spreadsheets by procurement or whoever owns the carrier relationship, outside the ERP. Getting them into one place before comparing against invoices is usually the largest share of the audit's actual work.

What is a minimum charge violation in freight billing?

A minimum charge violation happens when a carrier applies its minimum or floor charge to a shipment that already cleared the contract's volume or weight threshold for a standard rate. The invoice looks ordinary against the PO; it only looks wrong next to the contract's threshold clause.

How far back should a freight invoice audit look?

The lookback period should match how far your carrier contracts and rate cards have gone unchanged, since a check only needs to cover invoices billed under the version of the contract you are comparing against. Beyond that, older invoices add volume without adding a different kind of finding.

Can NetSuite's approval workflow substitute for a contract check?

No. An approval workflow routes a bill to a person for sign-off based on amount or department; it does not compare the bill to a rate card or tariff. Unless the approver independently checks the contract, the workflow only confirms someone looked at the number, not that the number is correct.

Does a NetSuite integration with a carrier's billing system fix this?

An integration that pulls invoice data automatically into NetSuite speeds up entry and reduces manual keying errors. It still imports whatever the carrier billed, correct or not, so it does not test the invoice against the contract unless the integration is built to also import and check against the rate card.

What counts as an accessorial fee in a freight contract?

An accessorial fee is any charge beyond the base linehaul rate, such as detention, liftgate service, residential delivery, or freight reclassification. Each has a defined trigger condition in the carrier's tariff, and a fee charged without that trigger being met is a contract mismatch even if it matches the PO.

Should freight audits be run by AP or by procurement?

Either can run it, provided the team has access to the signed carrier contracts and the time to reconcile them against invoice history independent of day-to-day bill processing. The determining factor is access to the contract documents and available time, not which department owns the task.

Margin Drift Resources