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.

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.
| Job No | Charge Code | Local Amount | Currency | Source | Posted? | Status |
|---|---|---|---|---|---|---|
| J-10234 | OFR | 1,850.00 | USD | Job Costing | Yes | Posted AP |
| J-10234 | DOC | 45.00 | USD | Job Costing | No | Accrued only |
| J-10234 | THC | — | USD | Job Costing | No | Missing value |
| J-10891 | OFR | 2,200.00 | EUR | Job Costing | Yes | Posted AP |
| J-10891 | FSC | 310.00 | EUR | Job Costing | Yes | Posted AR |
This is a fictional example, built to show structure, not a real client extract. Notice three things before any total gets calculated:
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.
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.
| KPI | What it needs | What breaks it |
|---|---|---|
| Cost variance (estimated vs actual) | Both job-costing estimate and the final posted AP amount, same charge code | Charge 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 window | Legitimate 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 date | Multi-leg or split jobs where "complete" isn't a single event |
| Margin by trade lane or branch | Posted AR minus posted AP, grouped by lane/branch, in one settled currency | Mixing 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.
Check these on the extracted data, not on the dashboard, before presenting a number:
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/.
Join freight forwarders saving hours every week with CargoMode.
Start for free