Two container-freight indices disagreed by $614 last month. This month the gap flipped sign
I keep a page that prints public spot freight rates for the Asia-outbound lanes. It has one rule: every number carries the date it was published, and I never compare two things that were measured differently without saying so.
This month's refresh produced a small result worth writing down, because it kills a shortcut I was tempted by.
The setup: two indices, one corridor
The Freightos Baltic Index (FBX) publishes weekly, as an average of that week's five business days, on Fridays. Drewry's World Container Index (WCI) is a Thursday assessment by analysts. Both price 40-foot containers. Both are free to read. On the Asia–US East Coast corridor they cover, they do not agree.
Last month, for the same corridor, FBX03 printed 9,606 and WCI Shanghai–New York printed 10,220. Freightos sat $614 below Drewry.
This month, reading the 6 November FBX series and Drewry's 5 November assessment: FBX03 is 9,708 and WCI is 9,303. Freightos now sits $405 above Drewry.
Same corridor, same two publishers, opposite direction, four weeks apart. So the tempting rule — "Drewry reads high, Freightos reads low" — is wrong. The spread is not a constant you can subtract to translate one index into the other. It is the product of at least six documented differences: destination scope (FBX01 includes Chicago, an inland rail leg), origin scope (FBX03 lists Houston alongside New York), unit (TEU versus FEU), surcharge treatment, method (reported to an exchange by a panel, computed from platform transactions, or assessed by analysts), and timing (Thursday assessment versus Friday average).
If you need one number, pick one index and stay inside it. If you need to compare two, compare the direction of movement, not the level.
What the refresh actually involves
The page has five rules I wrote after getting each of them wrong at least once:
- Every number gets its own as-of date in the cell. Never "this week". The two indices publish on different days, and one lane may lag a week behind its siblings.
- Never compare a Thursday assessment with a Friday average without saying so. In a week where the lane moves 5%, they cannot land on the same number.
- Check the unit. SCFI quotes USD per TEU on most routes and per FEU on the US lanes; FBX and WCI quote per 40-foot box. A headline rarely says which.
- Check surcharge notices dated after the index period before reading a falling index as a falling invoice. A peak-season surcharge alone can be 24% of a lane value.
- A composite move is not a lane move. Check that your lane is one of the eight or twelve the index covers.
The useful accident: the data is in the page, not the headline
The most transferable thing I learned this month is mechanical.
Freightos' per-lane pages show a big "Current FBX" number — $8,245.40 for FBX01 as I read it — with no date next to it. That is exactly the kind of figure that ends up quoted with the wrong vintage.
But the page also renders a chart, and the chart's data is embedded in a <script> block as JSON: twelve weekly entries per lane, each with a ticker, an indexDate and a value. A regex over the raw HTML gets the whole series:
import json, re html = open("fbx01.html").read() m = re.search(r"window\.frProductIntroChartData\[[^\]]+\]\s*=\s*(\[\{.*?\}\]);", html, re.S) series = json.loads(m.group(1)) print(series[-1]) # {'ticker': 'FBX01', 'indexDate': '2026-11-06', 'value': 8245.4} Three things fell out of that:
- Every lane got the same index date this month (6 November). Last month two of the four lane pages were still printing the previous week, which is why the old table carried a different date in each cell.
- The four-week change is computable without scraping an archive. FBX13, the Mediterranean lane, is up 14% over four weeks while the two transpacific lanes are essentially flat (+1% each) — a fact the "Current FBX" figure cannot show.
- The headline and the chart can be a day apart. Prices get revised into the series; the headline stat is a separate DOM node. If you cite the visible number, you have no way to know which vintage you got.
I now read the series and ignore the headline.
What I could not verify, and said so on the page
Two of the page's citations are about surcharges, and both now sit behind bot walls from my IP: the European Commission page on shipping's inclusion in the emissions trading system returns a CloudFront 403, and the reproduction of an MSC advisory returns a Vercel security checkpoint. Anonymous text-extraction proxies are blocked for the same reason.
The claims those pages support — the 50%/100% emissions coverage and the phase-in of allowance surrender at 40%, 70%, 100% — were verified when the page was first published and are unchanged. So the page keeps the citation and the "What I could not check" section says explicitly that the notices were read through reproductions and that one date is unconfirmed.
That is the honest version. A page that silently drops a link because a CDN blocked it this morning teaches the reader nothing about how solid the claim is.
The general lesson
If you publish measurements someone else will act on:
- Put the measurement date next to the number, in the number's own cell. It is the cheapest integrity check you can write.
- Prefer the machine-readable series over the display number, even when the display number is on the same page.
- When two well-built sources disagree, measure the disagreement over time. If you only look once, you will conclude the gap is structural when it is often just timing.
- Keep a "what I could not check" section, and write it for the reader who wants to know how much weight the claim carries.
Drafted with an AI assistant from my own reading of the primary documents; every clause number and link here was checked against the source.
If this is the kind of check you need run on your own numbers, I keep the readings and the method at notebookfield.com — and two related pages on what a freight quote contains, and on choosing a forwarder.