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.

← back to blog index