Giuseppe runs Alibra Shipping, a shipbroker that publishes a weekly time charter rates report to the trade press. Every week, a PDF and an Excel version went out to a list that includes a commodities desk at LSEG, outlets like TradeWinds and Hellenic Shipping News, and a handful of named industry contacts. For years, one person built that report by hand in Microsoft Publisher, laid out an Excel version alongside it, and sent everything out manually. When the cost of keeping her on stopped making sense, Giuseppe let her go, and only then discovered that nobody, himself included, knew how any of it actually worked.
He’s the first to admit process automation isn’t his department. The brief he gave me was really one question: how do I keep doing this at all, without her, and without hiring a replacement just to run a weekly mail merge.
The rate sheet
The report itself is two dense tables: dry bulk time charter estimates split Atlantic and Pacific across 4 to 6 month, 1 year and 2 year periods for four vessel sizes, and a tanker table running Handy through VLCC across 1, 2, 3 and 5 year columns. I rebuilt both as a single Google Sheet formatted to match the old Publisher layout almost cell for cell, including the small up, down and flat triangle markers next to each rate, driven by conditional formatting against the previous week’s figures rather than typed in by hand.
A separate Buttons sheet holds the two inputs the whole system keys off, a week number and a date, plus three large buttons wired to Apps Script functions through Google Sheets’ native “assign script” feature. No code editor, no separate app. Giuseppe opens a spreadsheet he already understands and clicks a button.
One click, several destinations
Each button triggers a small chain of scripted steps. Archive Rates and
Rates to Refinitiv both call a shared writeRates() function that copies the
current week’s figures into a separate spreadsheet: one holds a rolling
archive with every past week appended as a new row, the other holds a
single current snapshot formatted for a specific commodities feed. Both get
the same week number and date stamped alongside the numbers, so a year of
archive rows reads as a clean time series rather than a pile of disconnected
exports.
Send PDF Rates is the one doing the most work. It exports the sheet as a PDF
through Google’s spreadsheet export endpoint, then sends it to each
recipient with a personalised greeting built from a shared HTML template
that reproduces Alibra’s signature and legal footer. The first version of
this fetched a fresh PDF export per recipient, which meant six back to back
calls to Google’s export endpoint and a reliable HTTP 429 partway through
the run. The fix was simple once it was obvious: fetch the PDF once, reuse
the same blob for every send. A LockService lock around the whole function
stops a second click mid-run from sending everything twice, and two test
functions let a run go to a single inbox first, useful when the actual
recipients are journalists rather than colleagues.
The public dashboard
The archive spreadsheet that Archive Rates fills in also feeds alibrashipping.com/data, a dashboard built entirely on published CSV feeds. Each relevant sheet is published to the web as a CSV, and a page of vanilla JavaScript pulls it in with PapaParse and renders it, styled tables with the same up and down markers, Chart.js line charts for the annual trend by ocean and vessel type, and a set of forward curve charts comparing a calculated forward time charter equivalent against Alibra’s own physical benchmark rate. No server, no database, no API Giuseppe has to pay for or maintain. The same Wednesday button click that sends the report also drops a new point onto a chart on his own website, days later, without either system knowing the other exists.
Two years on
This is still running unchanged. The sheet in front of Giuseppe every week is the same one, the buttons are the same three buttons, and the dashboard still reads off the same archive. He still doesn’t know what an HTTP 429 is, and he shouldn’t need to. He clicks a button, and the emails go out.