Skip to content
CheckMyFreightBill.com
Data, TMS and Integration

How to Export Freight Invoice Data From Your TMS

Four ways to export freight invoice data: TMS reports, carrier portals, EDI feeds, and your own inbox. What each path gives you, and what it leaves out.

By 11 min read

There are four places freight invoice data lives, and you can export freight invoice data from a TMS in about ten minutes if you know which report to run. The four sources are your TMS, each carrier’s billing portal, an EDI feed if you have one, and the inbox where PDFs land. Most operations have all four and audit from none of them, because the data arrives in four shapes that do not join.

The useful question is not “how do I get a CSV.” It is “what does an auditable record need to contain, and which of these four sources actually contains it.” A TMS export tells you what you expected to pay. A carrier invoice tells you what you were billed. Those are different numbers, and the gap between them is the entire job.

This post maps each path, names what it drops, and gives you a join strategy that survives a real carrier mix. It also makes the case that the low-tech path, forwarding email, is not the fallback people assume it is.

What an auditable invoice record has to contain

Before choosing an export, decide what fields you need. There is a published floor for this, which is convenient, because it means you are not inventing a spec.

Under 49 CFR 373.103, a motor carrier’s freight or expense bill must show the names of the consignor and consignee, the shipment date, origin and destination, the number of packages, a description of the freight, the weight or volume, the exact rates assessed, the total charges due with the nature and amount of each charge, the route and each participating carrier, transfer points, and the remittance address.

Read “the nature and amount of each charge” twice. That single phrase is the difference between an auditable export and a useless one. A row that says TOTAL 2,412.50 cannot be audited. A row set that says LINEHAUL 1,850.00 / FSC 462.50 / DETENTION 100.00 can be, because each line can be tested against a different document.

So the minimum field list for anything you export:

  • Carrier name and SCAC.
  • Invoice number, PRO or freight bill number, and the carrier’s own load or trip reference.
  • Your load ID, BOL number, and shipment reference.
  • Ship date and delivery date.
  • Origin and destination, at least to city and state, ideally full address.
  • Billed weight and piece count.
  • Every charge as its own line: code, description, quantity, rate, and extended amount.
  • Invoice total, invoice date, and the date you received it.
  • Payment terms and remit-to.

That last pair matters more than it looks. Receipt date is what starts most of the clocks in every freight billing deadline that can cost you money, including the 180-day contest window under 49 U.S.C. 13710. If your export does not carry a received date, you cannot prove you contested in time.

Path one: the TMS export

Start here, because it is the fastest and because you already own the data.

Nearly every TMS has some version of a shipment detail report, a carrier invoice report, or a settlement register. Run it for a full month, not a week, so you can see rebills and corrected bills land against earlier loads.

What the TMS is good at:

  • Your load identifiers, stop sequence, and appointment times.
  • The rate you booked, which is the number the invoice has to match.
  • Accessorials you approved in advance.
  • Carrier assignment and mode.

What the TMS quietly drops, and this is the part that burns people:

It often stores the expected charge, not the billed charge. Many TMS configurations write the tendered rate into the shipment record and never update it when the invoice arrives with a different number. Your export then shows a clean file that agrees with itself, because it is comparing the rate con to a copy of the rate con. That is the failure mode behind rate confirmation versus carrier invoice mismatch, and an export cannot catch it if only one side of the comparison was ever loaded.

Accessorials collapse. A very common pattern is one OTHER_CHARGES or ACCESSORIAL_TOTAL column holding the sum of every non-linehaul line. You lose the code, so you cannot tell a liftgate from a detention hour from a reconsignment. Before you accept a TMS export, check whether charge detail comes out one row per charge or one row per invoice. If it is one row per invoice, ask your admin for the charge-detail table specifically. It usually exists and is usually not on the default report.

Rebills overwrite. Some systems update the invoice record in place when a corrected bill arrives, so the original amount disappears. That makes duplicate and rebill detection nearly impossible from the TMS alone, which is one reason duplicate freight invoices hide behind new invoice numbers. If your TMS overwrites, the source of truth for “what was billed the first time” is the original document, not the record.

Ask for the export as CSV rather than PDF or XLSX with merged cells. If your TMS has an API, a paged JSON pull of invoices and charge lines is better still, but do not let an API project block you for a quarter when a CSV gets you auditing next week.

Path two: carrier billing portals

Every large carrier has a portal, and portals are where the actual billed data lives with the most detail. They are also the least practical source at scale.

The realistic assessment: portals are excellent for one carrier and miserable for twelve. Each has its own login, its own export format, its own date-range limits, and its own idea of what a charge code means. Some let you download a billing history CSV. Some give you PDFs only. Some cap the export at a rolling window, which quietly matters when you are working a claim months later.

Practical rules if you go this route:

  • Pull your top three to five carriers by spend and ignore the tail. The tail is a job for the inbox path.
  • Export monthly on a calendar reminder, because the rolling window will eventually cut you off from the month you need.
  • Save the PDF alongside the CSV. The CSV is what you audit; the PDF is what you attach to a dispute.
  • Note the portal’s charge-code legend if it publishes one. Carrier codes are not standardized, and your normalization table is only as good as the legend behind it.

On scraping: read the terms of use before you automate a portal login. Some carriers publish an API for it. Others prohibit automated retrieval outright. This is a contractual question, not a regulatory one.

Path three: an EDI 210 feed

If you have the volume and a trading partner willing to set it up, an EDI 210 invoice feed gives you structured, line-level charge data without anyone typing anything. It is the cleanest path when it exists.

It also takes weeks to set up per carrier, requires a VAN or AS2 connection, and only covers carriers who agree to onboard you. That is why most operations under a few hundred loads a month never get one. What a 210 does and does not settle is worked through in EDI 210 freight invoice format versus a PDF in your inbox.

The short version for planning purposes: a 210 gives you machine-readable charge lines and a reliable reference structure. It does not give you the rate confirmation, the BOL, or the POD, and it does not tell you whether the charge was correct. Structure is not verification.

Path four: the inbox

Most freight invoices arrive as a PDF attached to an email, and most operations treat that as the primitive option. It is not, for three reasons.

It is complete. Every carrier can email an invoice. No onboarding, no VAN, no portal credential, no minimum volume. Your inbox already covers every carrier you use, which no other path here can claim.

It arrives with a timestamp you control. The email receipt date is your evidence of when the bill was presented. That is directly load-bearing under 49 CFR 377.205, which requires a carrier to present its freight bill within seven days of receiving a prepaid shipment or seven days from delivery on a collect shipment, and requires the bill to state the credit time limit and any late-payment or collection charge. It is also what anchors the 180-day contest window.

It carries the attachments the structured feeds do not. Rate cons, signed BOLs, POD images, lumper receipts, and scale tickets almost always travel by email. Those are the documents that decide disputes.

The practical setup is boring and works:

  1. Create one dedicated address that receives freight billing mail, and route it with a rule rather than relying on people to forward.
  2. Ask each carrier’s billing contact to send invoices to that address. Most will, because it improves their collection speed.
  3. Keep the original message, not just the extracted attachment. The headers are your receipt-date proof.
  4. Extract to a table with the field list from the first section of this post.

The extraction is the only hard part, and it is where OCR quality and human review both matter. Structured data extracted from a PDF is still an interpretation of that PDF, so keep the source document linked to every row.

Comparing the four paths

Source Charge-line detail Carrier coverage Setup effort Receipt-date evidence Carries rate con, BOL, POD
TMS export Varies; often collapsed to one total All carriers you tender through Low, report already exists Weak, often only invoice date Sometimes, if documents are attached to the load
Carrier portal Best available, native to the carrier One carrier at a time Medium, per carrier Portal posting date, not your receipt Rarely
EDI 210 Full, machine-readable Only onboarded carriers High, weeks per partner Interchange timestamp, good No
Inbox Depends on extraction quality Every carrier Low Strong, message headers Yes, usually in the same thread

Read the table as an argument for combining sources rather than choosing one. The TMS gives you what you agreed to pay. The invoice source gives you what you were billed. You need both, joined, or you are auditing an invoice against itself.

The join is the actual problem

Getting an export is easy. Making three exports line up is the work.

The join keys, in rough order of reliability:

  1. Carrier invoice number plus SCAC. Unique within a carrier, and the natural primary key for the billing side.
  2. PRO or freight bill number. Reliable for LTL, and usually printed on the BOL, which makes it your best bridge between the document set and the invoice.
  3. BOL number. Good, but shippers reuse and carriers retype, so expect collisions and transcription noise.
  4. Your load ID. Perfect on your side, absent or mangled on the carrier’s side unless it was on the rate con and the carrier echoes it back.
  5. Fuzzy match on origin, destination, date, and amount. The last resort, and how duplicates slip through: a duplicate differs on invoice number and matches on everything else.

Three habits make the join hold:

  • Put your load ID on the rate confirmation and require it back on the invoice. This is a one-line contract ask that pays for itself.
  • Normalize charge codes once, centrally. Build a mapping table from each carrier’s code to your own charge taxonomy. Your GL depends on it, which is the subject of syncing freight invoice exceptions into QuickBooks.
  • Never delete the original document. The export is derived data. When a dispute goes sideways, the carrier will want the bill, not your spreadsheet.

Keep the raw documents, and know how long

Retention is what makes the deadlines usable.

An overcharge claim under 49 CFR 378.4 has to be accompanied by the freight bill and the rate, classification, weight, or tariff authority you are relying on, plus payment information. The rule also says inadequate documentation alone cannot disqualify a claim, but you do not want to test that. Once the claim is written and filed, the processing carrier must pay, decline, or settle it within 60 days of receipt under 49 CFR 378.8, absent a written agreement to extend.

The outer bound is longer. Under 49 U.S.C. 14705, a carrier has 18 months from accrual to sue for freight charges, and a shipper generally has 18 months to sue for overcharges, with longer periods in specific circumstances. If your archive only goes back a year, you are unable to answer a suit about a bill that is still live.

Practical retention: keep the original invoice document, the rate confirmation, the BOL, and the POD together, keyed to the invoice number, for at least the longest limitation period that can touch the shipment. Storage is cheap. Reconstructing a two-year-old load from a collapsed TMS export is not.

A ten-minute starting checklist

  1. Run your TMS’s charge-detail report, not the summary report, for one full month.
  2. Check whether charges come out one row per charge or one row per invoice. If it is per invoice, find the charge-detail table.
  3. Confirm the export includes invoice number, PRO, ship date, billed weight, every charge line, and an invoice date.
  4. Add a received date. If the TMS has none, source it from the email header.
  5. Export the same month’s billing history from your top three carriers by spend.
  6. Join on invoice number plus SCAC, then on PRO, then look at what did not match. The unmatched set is where the money is.
  7. Route all carrier billing mail to one address and stop relying on individual forwards.
  8. Archive the source PDFs keyed to the invoice number before you touch the spreadsheet.

Do those eight and you have an auditable dataset without an integration project. Whether you then audit it yourself or buy the work out is a separate decision, and the honest comparison is in what freight audit actually costs across three pricing models. But the data question comes first, because no audit method of any price can check a charge line your export never carried.

Sources