All Articles
Industry Insights

CargoWise Reporting: Shipment Costs, Missing Charges and Useful KPIs

A worked example of a trustworthy CargoWise shipment-cost report: separating job costs from posted accounts, tracking missing values and picking KPIs that hold up.

CargoWise Reporting: Shipment Costs, Missing Charges and Useful KPIs

Most CargoWise cost reports fail for a boring reason: they mix numbers that haven't settled yet with numbers that have. An operations lead pulls a shipment-cost view mid-month, sees a margin figure, and acts on it. Three weeks later the accrual is reversed, a credit note lands, and the margin was never real. Here's a report built to survive that.

Example report (illustrative, not live data)

Job NoCharge CodeLocal AmountCurrencySourcePosted?Status
J-10234OFR1,850.00USDJob CostingYesPosted AP
J-10234DOC45.00USDJob CostingNoAccrued only
J-10234THC—USDJob CostingNoMissing value
J-10891OFR2,200.00EURJob CostingYesPosted AP
J-10891FSC310.00EURJob CostingYesPosted AR

This is a fictional example, built to show structure, not a real client extract. Notice three things before any total gets calculated:

  1. Currency is kept per line, not converted on extraction. Converting early hides which rate was used and when. Convert once, downstream, with a stated rate date.
  2. Posted status is a column, not an assumption. A job costing line can exist long before the matching AP or AR invoice is posted. Reporting only posted lines understates cost; reporting only job costing lines can overstate it if an accrual is later reversed.
  3. A missing value is shown as missing, not zero. A blank THC charge might mean the charge genuinely doesn't apply, or it might mean the line hasn't been keyed yet. Those are different facts and a report that silently treats both as zero will understate cost on exactly the jobs someone should be chasing.

Job costs versus posted accounts: keep them in separate columns

CargoWise carries two layers of financial truth on a job: the operational job costing (estimates, accruals, work in progress) and the posted accounting transactions (AP invoices from vendors, AR invoices to customers, credit notes). They converge eventually. Mid-shipment, they rarely match.

A reporting view that merges them into one "cost" number is making a silent choice about which layer wins. Don't make that choice invisibly. Carry both:

job_no, charge_code, local_amount, currency,
source_layer (job_costing | posted_ap | posted_ar),
is_posted (true | false),
last_updated

Anyone reading the report can then decide: do I want the operational view (what we expect this job to cost, useful for ops decisions today) or the accounting view (what has actually been invoiced, useful for finance close)? Both are legitimate. Confusing them is what produces margin numbers nobody trusts.

A completeness checkpoint before anything else

Before you trust any total, check that the extraction actually got everything it should have. The simplest version: count jobs in the operational system for the period and count jobs that appear in your extracted report for the same period. If the extraction job skipped a page, hit a connector timeout, or filtered on the wrong date field, these two counts won't match and you'll never see it in the totals, because missing jobs don't show up as a wrong number. They show up as nothing.

expected_job_count = count(jobs where ETA in reporting period)
extracted_job_count = count(distinct job_no in report)

if extracted_job_count < expected_job_count:
    flag "incomplete extraction, do not report totals"

Run this check every time before the report goes anywhere near a margin dashboard. It costs almost nothing and it's the single most common way a CargoWise report quietly lies.

Four KPIs worth keeping, and what breaks them

KPIWhat it needsWhat breaks it
Cost variance (estimated vs actual)Both job-costing estimate and the final posted AP amount, same charge codeCharge codes re-mapped mid-job; partial invoices not yet all posted
Unbilled charges (cost posted, revenue not yet invoiced)AP posted flag true, matching AR line posted flag false, past a reasonable grace windowLegitimate timing lag mistaken for leakage if the window is too short
Days to invoice (job complete to AR posted)A reliable "job complete" date and the AR posted dateMulti-leg or split jobs where "complete" isn't a single event
Margin by trade lane or branchPosted AR minus posted AP, grouped by lane/branch, in one settled currencyMixing posted and accrued lines; converting at inconsistent FX dates

Run cost variance and unbilled charges as your first two. They're the ones that catch real money: a job quietly costing more than estimated, or a cost that's been paid out but never passed on to the customer. Margin by lane is useful for trend-watching but needs a longer settlement window before you trust it, since posted accounts on freight jobs often lag the operational close by weeks.

Before you act on any of these

Check these on the extracted data, not on the dashboard, before presenting a number:

  • Does the report state a currency and a conversion date, or is it silently mixing currencies?
  • Are posted and unposted lines labelled, or merged?
  • Did the completeness checkpoint pass for this run?
  • Is there a visible count of missing/null charge lines, separate from zero-value lines?
  • Has a human who knows the job looked at any outlier before it's reported upward?

That last one doesn't go away. Automated extraction gets you a trustworthy base; it doesn't replace someone who knows why job J-10234 is missing its THC line.

For the mechanics of pulling this data out of CargoWise reliably, including pagination, truncation and date-field behaviour you need to verify against current vendor references, see CargoWise data extraction. When you're ready to build the extraction layer properly, the detailed walkthrough is at /eadapter/data-extraction/.

Ready to automate your document processing?

Join freight forwarders saving hours every week with CargoMode.

Start for free