How to Reconcile Carrier Freight Bills
in a Single Spreadsheet
An AFS Logistics audit of nearly 250,000 LTL invoices found billing errors in roughly 1 in every 22 freight bills, with accessorial charges accounting for over 40% of all discrepancies. For a logistics coordinator handling 50 carrier invoices a month across five or six different LTL carriers, that means two to three invoices every cycle arrive with freight charges that don't match contracted rates. But the real bottleneck isn't catching the error — it's getting the data out of the invoice and into a spreadsheet where you can catch it. Each carrier prints their invoice differently, and the differences accumulate fast.
Key Takeaways
- One in 22 LTL freight bills carries a billing error — but the real problem isn't catching the mistake, it's getting line-item data into a spreadsheet fast enough to check.
- Every new carrier you add needs its own OCR template, and when that carrier redesigns their invoice layout, the template breaks without warning — silently feeding you incomplete data.
- Define your column names once — Carrier, PRO#, Base Freight, Fuel Surcharge — and the same list pulls data from a FedEx PDF, an ODFL scan, and an XPO multi-page invoice without a single template.
Why Freight Invoices Resist Template-Based Extraction
A standard commercial invoice has a supplier name, an invoice number, a date, line items, and a total. Most template-based OCR tools handle that. A freight invoice has all of that, plus the line items that make logistics cost accounting distinct from general accounts payable: base freight, fuel surcharge (FSC), liftgate fees, detention charges, residential delivery, inside delivery, reweigh fees, and more. Even two shipments from the same carrier — same lane, same weight — can produce invoices with completely different line-item structures depending on what happened at pickup and delivery.
The format problem compounds across carriers:
- FedEx Freight presents charges in a multi-section layout with a "Transportation Charges" header, breaks out the fuel surcharge percentage separately, and lists accessorials under a "Special Services" section with abbreviated codes.
- Old Dominion Freight Line (ODFL) uses a standardized freight bill with PRO number as the primary reference, itemizes accessorials with full-text descriptions, and often includes a separate "C.O.D." or "Hazmat" fee line.
- XPO Logistics issues invoices that may span multiple pages for a single shipment, with line-item charges split across "LTL Freight," "Fuel Surcharge," and alphabetically-coded accessorial sections that differ between the US and Canadian billing formats.
- YRC Freight (now part of Yellow) historically used a format where fuel surcharge was calculated as a percentage of the net freight charge and displayed on a separate line beneath the subtotal — not embedded in the charge table.
- Estes, SAIA, ABF, R+L Carriers, TForce Freight — same story, same information, different page geometry every time.
A template-based OCR tool needs a separate template for each carrier's layout. Six carriers means six templates. When a carrier updates their invoice format — for rebranding, a system migration, or a new billing platform — the template breaks silently. You discover it when someone notices data isn't flowing. The fraud detection challenge here isn't malicious: it's that accessorial charges can add 20 to 40% to a base LTL rate, and when you can't extract the invoice data efficiently, you pay first and ask questions later — or never.
The National Motor Freight Traffic Association (NMFTA) maintains the NMFC classification system that underpins LTL pricing — a 13-tier density scale (effective July 2025) ranging from Class 50 to Class 500. A shipment misclassified by one tier can shift the rate significantly. But verifying classification on every invoice requires line-by-line comparison against the BOL — impossible at 50 invoices per month without structured data.
The core problem: freight invoices contain the same categories of information — who shipped what, from where to where, what it weighed, and what each charge component cost — but every carrier encodes that information differently. Template-based tools multiply the maintenance burden as carriers multiply. AI-based extraction handles any format because it reads by meaning, not by position.
The Fields Every Freight Cost Tracker Needs
Before you set up any extraction workflow, you need to decide what to extract. The list below covers standard LTL freight invoice fields. Not every carrier uses identical labels — ODFL says "Freight Charges," FedEx Freight says "Transportation Charges," XPO may say "LTL Freight" — but a semantic extraction system finds the value by its meaning, not its exact label. Define your column names once, and they work across every carrier.
| Column Name | What It Captures | Why It Matters in Cost Analysis |
|---|---|---|
| Carrier Name | FedEx Freight, ODFL, XPO, etc. | Group spend by carrier; identify which carriers drive the most accessorial charges |
| PRO Number | Carrier tracking reference | Link invoice to shipment records; key for VLOOKUP against contracts |
| BOL Number | Bill of lading reference | Cross-reference with warehouse receipt; verify shipment actually shipped |
| Ship Date | Date of pickup/shipment | Verify rate validity period; track shipping volume trends by week/month |
| Origin City / State | Pickup location | Calculate cost per lane; identify high-cost origin regions |
| Destination City / State | Delivery location | Cross-reference with customer delivery addresses; allocate freight costs to specific customers |
| Weight (lbs) | Shipment weight | Verify billable weight matches BOL; identify overweight penalties or reweigh charges |
| Freight Class | NMFC class (50-500) | Check classification accuracy; a Class 70 shipment billed at Class 85 inflates cost 15-20% |
| Base Freight Charge | Line-haul rate × weight/distance | Compare against contracted base rate per lane; largest single line item |
| Fuel Surcharge (FSC) | % of base freight, indexed to DOE diesel price | Verify correct DOE week applied; FSC rate discrepancy is the most common overcharge |
| Liftgate Fee | Hydraulic lift at pickup/delivery | $75-$200 per stop; cross-reference with BOL — was liftgate actually needed? |
| Residential Delivery | Delivery to non-commercial address | $50-$150; verify destination is actually residential — commercial addresses with docks should not trigger this |
| Detention Charges | Driver wait time beyond free allowance | Cross-reference with dock logs; disputed detention is a major source of recovered overcharges |
| Inside Delivery | Freight moved beyond threshold | Verify service was actually requested; often triggered when driver assumes dock isn't available |
| Invoice Total | Sum of all charges | Quick sanity check: does extracted total match carrier's stated total? |
These 15 columns cover the majority of LTL freight invoice data points. Beyond these, you may want to add custom fields for your operation: a Customer Code to allocate freight costs to specific accounts, a Cost Center or GL Code column for accounting, a Contract Rate column for VLOOKUP reference, or a Lane identifier (Origin-Destination pair). The important thing is that you define the columns that match your cost-tracking logic — not the field names the carrier chose to print. For a deeper dive on structuring data extraction across multiple document types in freight operations, our guide to freight document automation across formats covers the full document ecosystem.
How to Set Up a Freight Invoice Extraction Workflow
Here's the step-by-step process. The goal is to go from a folder of carrier invoice PDFs to a single Excel file you can use for cost analysis — in one session, without building a single carrier-specific template.
Drag and drop your PDF invoices — whether they're from FedEx Freight, ODFL, XPO, YRC, Estes, or a mix of all five. The AI reads each document independently, so carrier format is irrelevant. A logistics coordinator handling 50 invoices per month can upload the entire batch in one go. If you're just testing the workflow, start with 5–10 invoices from different carriers to see how one column list pulls data from all of them.
This is the key difference between semantic extraction and template-based OCR. Instead of drawing boxes around fields on each carrier's invoice, you type the column names you want — "Carrier Name," "PRO Number," "Base Freight Charge," "Fuel Surcharge," "Liftgate Fee," and so on. The AI locates each value by understanding what the field means, not where it sits on the page. A PRO Number in ODFL's format is labeled "PRO" in the top-right corner; in FedEx Freight's format, it might be "PRO/Tracking #" in a table header. Different positions, different labels — same column definition captures both. This is Custom Column Extraction: the column names you type become the headers of your output spreadsheet, and the AI fills the rows by finding matching values across any document layout.
The AI processes each invoice page in 5 to 10 seconds. A 2-page freight bill takes under 20 seconds to extract. Across 50 invoices, the total processing time is measured in minutes — not the hours it takes to manually key data. The output is a preview table with your defined columns as headers and each invoice as a row. If a field is missing or the AI flags low confidence, you see it immediately — you can correct it in the preview before downloading. For even larger volumes, batch invoice extraction handles hundreds of documents in one upload with the same column definitions.
Download as XLSX with every invoice as a row, every column as defined. The output is a single table where "Carrier Name" is the same column regardless of whether the source was a FedEx Freight PDF or an XPO scan. No merging of separate carrier-specific files. No manual stitching. Just one spreadsheet, ready for PivotTables, VLOOKUP, or import into your cost analysis workflow.
Files are processed securely and not stored.
Try uploading a few of your own freight invoices. Type the column names from the table above. Watch what the AI extracts from a FedEx Freight invoice versus an ODFL invoice — same columns, same output structure, no template per carrier.
From Extracted Data to Freight Cost Analysis
Once your freight invoice data lives in a structured Excel file, the spreadsheet itself becomes your cost control tool. Here are the analysis patterns that logistics teams use to turn extracted data into actionable insights.
Compare billed rates against your contracted rates. Add a column to your spreadsheet with the contracted base rate for each lane (Origin-Destination pair) and carrier. Use a VLOOKUP or INDEX-MATCH to pull the contract rate into each row, then calculate the variance: Billed Base Freight - Contract Base Rate. Sort descending by variance to see which invoices need a dispute filed. According to the Institute of Finance and Management's 2025 benchmarks, each billing error costs an average of $53.50 to resolve — and manual data entry error rates for freight bills spike well above standard invoices due to format inconsistency. Catching the error before payment eliminates that cost entirely.
Verify fuel surcharge calculations. The fuel surcharge is typically a percentage of the base freight charge, indexed to the U.S. Department of Energy's weekly diesel price report. Each carrier publishes an FSC table showing the percentage that applies at each fuel price point. Cross-reference the FSC percentage on your invoice against the DOE index for the shipment week. A 2% FSC discrepancy on a $1,200 base freight charge is $24 — across 50 invoices per month, that's potentially $1,200 per year from one error type.
Analyze accessorials by carrier. Create a PivotTable with Carrier as rows and each accessorial column as values. You'll quickly see which carriers trigger the most liftgate fees, residential surcharges, or detention charges. If one carrier accounts for 60% of your detention charges, that's a signal to check your dock operations at the facilities that carrier serves — or to renegotiate free time allowances in the contract.
Map freight costs to shipments, customers, and cost centers. Add a column for Customer, Cost Center, or GL Code to your spreadsheet. If you know which customer order corresponds to each PRO number, you can allocate freight costs directly to that customer for accurate landed cost calculations. For internal accounting, assigning each shipment a GL code (e.g., "Inbound Freight — Plant A" vs "Outbound Freight — Customer X") lets you track freight spend by business unit without running every invoice through AP first. Most shippers work at the directional and cost center level — inbound vs outbound, assigned to the appropriate facility — and that level of granularity is enough to transform freight from an opaque bucket expense into a traceable cost component.
Track freight spend trends over time. With Ship Date extracted as a column, a PivotTable grouped by month reveals seasonality in your freight costs, carrier rate increases that took effect mid-quarter, and shifts in your lane mix. One quarter of data is noise. Four quarters of extracted freight invoice data is a negotiation asset — you walk into a carrier QBR with exact spend by lane, exact accessorial breakdown, and exact variance from contracted rates.
Fifty freight invoices per month at 5 minutes of manual data entry each is just over 4 hours per month — about one full work-week per quarter — spent on transcription alone. Extraction at 10 seconds per page turns those 4 hours into roughly 8 minutes of processing time, with the remaining time available for the analysis that actually controls costs.
Connecting Freight Costs to Your General Ledger
Freight GL coding is the process of assigning every freight charge to the correct general ledger account, cost center, and sometimes customer or product line. Done right, it turns your transportation spend from a single opaque "Freight Expense" line into granular cost data that feeds product costing, customer profitability analysis, and budget variance reporting.
The challenge is that GL coding decisions depend on information that lives on the freight invoice — but not in a single predictable field. A shipment's coding might depend on:
- Direction: Inbound freight to raw materials inventory (Debit Inventory, Credit AP) vs outbound freight to customer (Debit Freight Expense, Credit AP)
- Product line: Freight for Product A ships from the Chicago DC, freight for Product B ships from Dallas — different cost centers
- Customer: Freight charges that will be passed through to a specific customer account
- Mode and carrier: LTL vs truckload, core carrier vs spot market
With extracted data in a spreadsheet, you can add a GL Code column and use IF formulas or a lookup table to assign codes based on direction, origin, destination, carrier, or any combination of extracted fields. A single formula like =IF(Origin="Chicago","CC-4200-INB",IF(Origin="Dallas","CC-5100-INB","CC-9000")) automates the coding decision. Once the coding is applied, the entire table can be imported into your ERP or accounting system with GL codes already assigned — no manual re-keying from PDF to AP module.
The American Productivity & Quality Center's (APQC) 2025 benchmarks report that top-performing organizations achieve a 99.1% first-time-right invoice processing rate. The gap between average and top performers is almost entirely attributable to automation at the data capture and coding stages — the exact two stages where freight invoice extraction and spreadsheet-based GL assignment eliminate manual work.
Semantic Extraction vs. Template OCR: Why Carrier Format Doesn't Matter
Traditional OCR tools convert an image of text into characters. They'll read a freight invoice and output a block of text that says "Freight Charge $847.32" — but they won't know it's a freight charge, not a fuel surcharge or a total. The output is the text equivalent of the PDF; you still have to find, identify, and type each value into the right column.
Template-based document processing tools go one step further: they let you define a template by drawing boxes around each field on a specific carrier's invoice. The next time you process an invoice from that carrier in that exact format, the tool automatically extracts those fields. The problem, as we covered, is that six carriers need six templates, and a carrier format change breaks the template.
Custom Column Extraction works differently. Instead of defining where a value sits on a specific page, you define what you're looking for — "Fuel Surcharge," "PRO Number," "Origin City." The AI reads the document semantically. It understands that "FSC: 28.5% of $1,042.00 = $296.97" on an ODFL invoice and "Fuel Surcharge — 28.5% — $296.97" on a FedEx Freight invoice both represent the same data point: a fuel surcharge of $296.97. It extracts the same column value from both because it reads by meaning, not by coordinates.
This distinction matters most in freight precisely because carrier format diversity is not a temporary condition that will be solved by industry standardization. The NMFTA's NMFC system standardizes commodity classification, and electronic BOL initiatives push toward digital data exchange, but the invoice — the document you pay against — remains carrier-designed and carrier-formatted. That's unlikely to change. The extraction approach that handles this reality is the one that decouples the information from its display.
FAQ
Does this work with scanned or handwritten freight invoices?
Yes. The AI reads scanned PDFs, photographed documents, and handwritten entries (such as a driver's handwritten PRO number or signature on a delivery receipt). Image quality matters — a clean flatbed scan produces more reliable results than a low-light phone photo — but the underlying vision model is designed to handle real-world document quality, not just pristine digital PDFs.
Can I extract freight charges in different currencies?
Yes. If your freight invoices include charges in USD, CAD, or other currencies, the AI reads the currency symbol or code as part of the amount. You can define columns per currency (e.g., "Freight Charge (CAD)" and "Freight Charge (USD)") if you need to track them separately, or let the AI extract whatever appears and standardize post-extraction in Excel.
What if a carrier changes their invoice format?
Nothing breaks. Because the AI extracts by meaning rather than by template position, a format change — whether it's a new logo, a rearranged table, or a different field label — doesn't affect extraction. The AI still finds "PRO Number" or "Fuel Surcharge" because it understands what those concepts represent, regardless of where they moved on the page. This is the single biggest operational difference between template-based and semantic extraction for freight teams that work with multiple carriers.
How do I connect extracted data to my TMS or ERP?
Download the extracted data as an Excel (XLSX) or CSV file and import it into your TMS or ERP using the standard data import function. Most systems — CargoWise, MercuryGate, SAP, NetSuite, QuickBooks Enterprise — accept CSV or Excel imports with field mapping. The column headers in your extraction output become the field names you map during import. If your TMS expects specific column names, configure those as your custom column names during extraction, and the output will match the import format without manual reformatting.
Can this handle hundreds of freight invoices at once?
Yes. Batch processing mode handles large volumes — hundreds of freight invoices uploaded in one session, processed with the same set of column definitions, producing one consolidated output file. The processing time scales roughly linearly with page count: 100 single-page freight invoices extract in a few minutes. For logistics operations processing more than 200 invoices per month, batch processing across carriers is the standard workflow, not a special case.
The AFS Logistics data shows 1 in 22 LTL invoices contains a billing error. At 50 invoices per month, that's roughly 27 overcharged line items per year that manual processing might never catch — each costing an average of $53.50 to resolve after the fact. An extraction workflow that takes 3 minutes per invoice down to 10 seconds doesn't just save time. It makes cost verification a routine step instead of an annual audit fire drill. Upload a batch of your own freight invoices and see what a single spreadsheet looks like when every carrier's charges are in the same columns.