Catch freight cost creep before it becomes your new normal.
Ferro watches every lane week by week, flags cost rises that don't look justified, and explains each one in plain English, citing the exact evidence. It never guesses.
- ✓Right route
- ✗Right dates
- ✗Describes a cost rise
- ✗Big enough
Freight costs rarely jump. They creep.
Companies pay transporters by distance and weight. Over months, the price on some lanes drifts up, sometimes for a real reason (fuel, tolls, floods, festivals) and sometimes for no good reason at all. By the time anyone notices, the higher rate is the new baseline.
Spikes hide in thousands of invoices
A +35% week on one lane is invisible in a monthly spend report, and nobody has time to read every shipment.
Slow creep hides inside averages
When a rate rises a little every week, its own recent average rises with it. Compared with itself, the lane always looks "normal".
Every rise comes with a story
"Fuel went up." "There was a flood." Some stories are true, some are true but for different weeks, and some are just stories.
Mumbai-Pune got ~30% pricier in six months, and its own history barely noticed.
Against its own trailing 8-week average, the lane looked only +3–9% high each week. Against similar-length routes it was +20–39% high. Ferro compares every lane both ways, so creep can't hide.
One clear verdict per lane, per week. With the receipts.
The same four steps run for every route, every week. Every step is visible in the dashboard, so you can check the assistant's work instead of trusting it blindly.
Measure
Weekly cost per tonne-km for every lane: total freight bill ÷ (tonnes × km), Monday–Sunday.
Compare
Against the lane's own last 8 weeks and against similar-length lanes that same week.
Check the evidence
Searches the context notes (fuel, tolls, weather, festivals) and tests each one against four strict checks.
Explain
Plain-English reason with the cited note, or "unexplained, review it", plus a suggested next step.
A true story is not a free pass.
In February 2025 floods hit the Chennai-Bangalore highway. The note says the disruption ran Feb 24 – Mar 8. Costs stayed high for four weeks.
- Week of Feb 24: flood note covers it → justified, cites N001
- Week of Mar 3: still inside the window → justified, cites N001
- Week of Mar 10: roads reopened Mar 9; the window has closed → unexplained
- Week of Mar 17: the only nearby note says conditions "returned to normal" → unexplained
Most tools would wave the whole spike through as "flood-related". Ferro only accepts a reason when the route, the dates, the cost effect and the size all match.
See it in the dashboard →▲ unexplained · ✓ justified · click the chart to replay
Everything a reviewer needs, nothing they have to take on faith.
Review queue
Triage every alert: Open, Investigating, Resolved, False alarm. Keep notes and export the review log.
Route explorer
Cost vs own history vs similar routes, note windows shaded, flags marked. Step week by week with the arrow keys.
Shipment drill-down
Is it one carrier or the whole lane? See every shipment and transporter behind a flagged week.
Evidence trail
Every note, how it was read (route, dates, effect, size) and why it was accepted or rejected.
What-if lab
Move the thresholds and re-run the real pipeline live. See exactly which weeks would change.
Ask the assistant
"Why did Chennai-Bangalore get pricier in March?" Answers come only from the results, with citations.
Exports that match
results.csv in the exact contract format, flagged-only CSV, the current view, and the review log.
Trust & eval built in
Test suites, adversarial probes, a three-run identical-output proof and an honest cost log, all on screen.
Checked against known answers before every release.
Run python -m ferro eval and you get the same numbers.
From spreadsheet archaeology to a weekly answer.
Without Ferro
- Rate rises noticed at quarter-end, if at all
- "Fuel went up" accepted for every lane, every week
- Slow creep invisible against last month
- No record of who checked what
- AI summaries you can't verify
With Ferro
- Every lane checked every week, both ways
- A reason accepted only if route, dates, effect and size match
- Creep caught by comparing with similar lanes
- Review queue with statuses, notes and an export
- Deterministic verdicts; AI only rewords, and is validated
Questions people ask first.
Does it use AI? Can it make things up?
Retrieval (a small vector index over the context notes) finds candidate evidence. Deterministic code decides every verdict. An LLM is optional and only rewords explanations; a validator rejects any rewrite that adds a note id, a number, or flips the verdict. In tests a deliberately hallucinating model changed zero graded fields.
What data does it need?
A shipment file (origin, destination, route type, tonnes, km, cost, date) and a short list of context notes. Bad rows are quarantined with a reason, never silently dropped.
How much does it cost to run?
$0 by default: templates write the explanations. With an open-source model on Groq's free tier, a full run is about 19 calls and ≈ $0.0004, and repeat runs are served from cache for $0.
Will it give the same answer tomorrow?
Yes. Three untouched runs produce byte-identical output files. There's no randomness in the decision path, and the optional LLM runs at temperature 0 with a response cache.
Can we tune how sensitive it is?
Yes. Thresholds live in one config file, and the What-if lab shows exactly which weeks would change before you commit. The defaults (+15% vs own history, +20% vs similar routes) are stable across a wide band.
See this week's verdicts in under a minute.
Run it locally. No accounts, no cloud, no build step.
python -m ferro serve