Freight Audit Without the Guesswork: Verified Extraction for BOL, POD, and Carrier Invoices

Logistics teams don’t lose money because invoices exist—they lose money because disputes are slow. Extract shipment facts with citations, run match rules, and resolve exceptions fast.

Freight costs rarely blow up because of one big mistake. They bleed through thousands of small ones:

  • accessorial charges that don’t apply
  • incorrect weight or class
  • duplicate invoices
  • wrong lane or rate basis
  • “attempted delivery” vs actual delivery disputes
  • detention charges without supporting evidence

The frustrating part is that the data usually is in the documents.

The problem is proving it—quickly—when you’re staring at:

  • a Bill of Lading (BOL),
  • a Proof of Delivery (POD),
  • a rate confirmation,
  • and a carrier invoice that doesn’t match.

CiteLLM-style citation-backed extraction turns this from “hunt and argue” into “click and verify.”

The high-value document pack (what you should ingest together)

Freight audit becomes dramatically easier when you treat shipments as a packet, not a PDF.

Typical packet:

  • BOL (shipper-provided shipment facts)
  • Rate confirmation / contract rate (what was agreed)
  • POD (what happened at delivery)
  • Carrier invoice (what you were billed)

Optional (often valuable):

  • accessorial documentation (detention forms, lumper receipts)
  • appointment confirmations
  • email confirmations or portals exports

The fastest way to reduce disputes is to extract the same canonical fields from each document and compare them.

What to extract (and why citations matter)

Core shipment identifiers

  • BOL number
  • PRO number / shipment ID
  • pickup date/time
  • delivery date/time
  • shipper and consignee names/addresses
  • origin/destination (city/state/postal)

Why citations matter: These fields are the keys used to join documents. When they’re wrong, you match the wrong records—and the whole audit collapses.

Weight, pieces, and handling units

  • total weight
  • piece count
  • pallet count
  • NMFC / class (LTL)
  • “shipper load and count” indicators

Why citations matter: Weight and class disputes are common, and the cost impact is direct. Reviewers need to see the exact line.

Charges and accessorials

  • line-haul
  • fuel surcharge
  • detention
  • lumper
  • redelivery
  • liftgate, inside delivery, appointment fees

Why citations matter: Accessorials are where “it depends” lives. Evidence lets you confirm the trigger condition (appointment time, waiting time, signature timestamp, etc.).

Freight audit workflow that scales

Step 1: Extract shipment facts with evidence

For each document, you want:

  • data: the structured values
  • citations: page + region + snippet supporting each value

This turns every key value into a verifiable claim.

Step 2: Normalize and match

Normalize common variations:

  • address abbreviations
  • date formats
  • weight units (lb/kg)
  • carrier naming (“XYZ Logistics LLC” vs “XYZ”)

Then match:

  • invoice → BOL via BOL/PRO number
  • invoice → rate confirmation via lane + carrier + reference number
  • invoice → POD via delivery date + signature + consignee

Step 3: Run rules

Practical rules that pay off quickly:

  • Duplicate detection: same invoice number or same PRO billed twice
  • Rate check: invoice line-haul equals contracted rate
  • Fuel check: fuel surcharge matches schedule for invoice date
  • Delivery check: “redelivery” requires evidence of failed attempt
  • Detention check: detention requires documented arrival/departure timestamps

Step 4: Route only exceptions (with side-by-side proof)

When a rule fails, your exception view should show:

  • billed value + invoice citation
  • expected value + rate confirmation citation
  • any supporting/contradicting evidence from BOL/POD

This is how you cut dispute time: the evidence is already assembled.

A schema sketch you can start with

Keep it small and useful first (then expand to mode-specific fields):

{
  "schema": {
    "document_type": { "type": "string", "description": "One of: bol, pod, rate_confirmation, carrier_invoice" },
    "bol_number": { "type": "string", "description": "Bill of Lading number if present" },
    "pro_number": { "type": "string", "description": "Carrier PRO/shipment number" },
    "shipper_name": { "type": "string" },
    "consignee_name": { "type": "string" },
    "origin_city": { "type": "string" },
    "origin_state": { "type": "string" },
    "destination_city": { "type": "string" },
    "destination_state": { "type": "string" },
    "pickup_date": { "type": "date" },
    "delivery_date": { "type": "date" },
    "total_weight": { "type": "number", "description": "Total shipment weight" },
    "weight_unit": { "type": "string", "description": "lb or kg if stated" },
    "piece_count": { "type": "number" },
    "invoice_number": { "type": "string", "description": "Carrier invoice number (if doc is an invoice)" },
    "linehaul_amount": { "type": "number" },
    "fuel_surcharge_amount": { "type": "number" },
    "accessorials": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "accessorial_type": { "type": "string" },
          "amount": { "type": "number" }
        }
      }
    },
    "total_amount": { "type": "number" }
  },
  "options": { "confidence_threshold": 0.85 }
}

Pair it with evidence requirements for high-impact fields (weights, totals, accessorials).

Why this is a high-value use case

Freight audit is a compounding ROI problem:

  • every exception you resolve faster saves time,
  • every incorrect charge you catch saves money,
  • and every dispute you can prove reduces back-and-forth.

Citations make the process defensible and fast because disputes become:

“Here’s the billed line” ↔ “Here’s the agreed rate” ↔ “Here’s what happened at delivery.”

That’s how logistics teams win disputes without spending their lives in PDFs.