Revenue engine for container lines

Markets move daily. Your rates should too.

Every morning, TIDAL reads the bookings you already have and proposes one selling rate per port pair, per sailing — inside your guardrails, with a plain-language reason and a confidence score on every number. Your desk approves in one click.

reads your own booking system one rate per sailing, per port pair a reason on every number
The problem

A sailing is a perishable product. Pricing it by hand loses money in two directions.

Once a ship departs, an empty slot is worth nothing — forever. Yet most carriers price a whole lane with one number on a rate sheet, updated by hand every week or two, while every sailing on that lane is filling at its own pace and the market moves every day.

0–0%
of freight revenue leaks this way every year — tens of millions of dollars on a mid-size carrier's book, per industry and consulting evidence.

Selling out too early, too cheap

Bookings run ahead of the historical pace, the sheet rate doesn't move, and the sailing fills with early cargo at a rate lower than what late, urgent cargo would have paid. Money left on the table.

Holding a rate the market won't pay

Bookings lag the pace, the sheet stays high, and the vessel departs with empty slots. Volume left on the quay.

The lag

One rate for the whole lane, set by hand and refreshed every one to two weeks — so neither mistake is noticed until the ship has sailed and the revenue report lands.

The job, stated plainly: for every upcoming sailing and port pair, set the rate day by day so that the booking trajectory lands on the utilisation target at departure at the highest revenue — never below cost, never above what the market will bear, never moving faster than customers will tolerate — with the pricing desk keeping the final say.

The data

It runs on data you already have. Nothing new to capture.

TIDAL reads your booking system once a day, read-only. Six kinds of records, all of which exist in any carrier's operation today — and each one answers a specific question.

01

Sailing schedule & capacity

Every upcoming voyage, when it departs each port, and the slots on offer for each port pair. This is the target each sailing has to fill.

02

Bookings — and when they were made

Every confirmed booking with its date, port pair, TEUs and the rate paid. This is how each lane normally fills, and how today's sailings are filling against that.

03

Cancellations & rollovers

Which bookings dropped out and which rolled onto the next sailing. This is how much of a book actually sails — the engine prices the volume that will really be on board.

04

Rates actually paid

The realised all-in ocean rate per TEU on each lane, refreshed daily. This is the lane's true market level — the anchor for every floor and ceiling.

05

Rate requests — accepted and declined

Every quote your desk answered, and whether the cargo booked. This is how much demand you lose when you price above the market: price sensitivity measured from real decisions, not assumed.

06

Cost per slot

Voyage cost per TEU on your own vessels. This is a floor no suggestion ever goes below — cost plus a minimum margin.

What it doesn't need: competitor rates, an external index, a survey, or a data project. Every signal is your own book, which is also why every suggestion can be traced back to a booking your team can look up.

The model

One curve. One measured sensitivity. One rule. Every number explainable.

No black box. The engine is three transparent pieces that any pricing manager can reason about — and every suggestion shows which piece moved it.

1 · The booking curve — where should this sailing be today?

Every sailed voyage tells you how a lane fills: 10% booked three weeks out, 40% at ten days, full at departure. Pool a lane's own history and you get its normal filling rhythm, with a band for what counts as normal variation. The first question the engine asks each morning is simple: is this sailing ahead of its rhythm or behind it? Ahead means space is getting scarce; behind means volume needs defending.

2 · Price sensitivity — how much volume does a price move win or lose?

Every rate request your desk accepted or declined is a data point: how often did cargo book when you quoted above the going rate, and how often when you quoted below? A logistic regression on those real decisions gives each lane a measured elasticity — the percentage of volume gained or lost per percent of price — re-fitted every day and bounded so that a thin lane can never produce a wild number. Where a lane has too few requests, weekly volume-versus-rate history fills in.

3 · The rate — close the gap, no further

The engine works out how many TEUs the sailing still needs this week to stay on its curve, compares that with how many are expected to book at today's rate, and moves the price by exactly the amount the measured sensitivity says will close the gap. More demand coming than needed → the rate rises. Less → it eases. Never by more than the arithmetic justifies.

gap = target (92% × allocation) − already booked
need = this week's share of the gap, from the curve
D0 = TEUs expected to book this week at today's rate
new rate = current rate × (need ÷ D0)1/ε
ε = measured price sensitivity · guardrails: floor 0.70× and ceiling 1.60× the market level · never below cost + margin · max ±7% per day
04

Guardrails

Floors and ceilings against the lane's real market level, a cost-plus-margin floor on your own vessels, a maximum daily move so customers see steady pricing, and announced GRI dates layered on top. Your commercial team sets every one of them.

05

The revenue guard

If a lane's demand barely responds to price, a discount gives away margin on cargo that would have booked anyway. The engine will not cut into inelastic demand — it holds at the market level instead, and says so.

06

Reasons & confidence

Every suggestion names the signal that moved it — filling fast, demand short, at ceiling, hold — inelastic — in a sentence a trade manager can read, plus a confidence score from how much of the lane's own history stands behind the number.

07

Decide

The desk approves, overrides or rejects in one click. Yesterday's approved rate is today's baseline — approvals compound, and every override is logged with its reason.

People stay in charge. The system's job is to make the 200 routine rate decisions well, so your best people spend judgement on the 10 that matter.

Proof, not promises

Three numbers, on your data, recomputed every morning.

Utilisation vs target

Did the ships you priced sail full — without giving space away? Projected at sailing for every open voyage, realised after it closes.

Realised rate vs market

What you actually earned against the lane's market level, lane by lane, week by week.

Rolling backtest

Every morning the engine re-prices the sailings that just closed — day by day, with no hindsight — and shows what they would have earned. Per lane, on the first screen you see.

Read it honestly. The backtest is a counterfactual: it assumes volume responds to price by the measured sensitivity, and it says so on the screen. A live shadow period — the engine proposing, your desk deciding — is what turns it into an observed number.

For your engineers

Three deployables. Credentials never leave your network.

on-prem

Compute service

Headless API beside your database — read-only, one snapshot a day, all engine state in its own local store.

Python 3.13pandas · scipyread-only
any static host

Frontend

The app behind the button above — a static build, no runtime CDNs, pointed at whichever API you deploy.

~32 KB gzipViteno CDN calls
cloud, optional

Snapshot compute

Daily training and pricing can run in the cloud on governance-gated snapshots your own side pushes — the cloud never holds a database credential.

snapshots onlyno GPUsdaily cron
No GPUs. Daily retrain in seconds on ordinary CPUs.
Pennies a day in cloud costs — no data-science team on standby.
One day from database connection to first live rate suggestion — not a multi-week pilot.

See tomorrow's rates today.

See the suggested rates, the reasons behind them and the value they add, straight away.

Try it now→