Track container shipments in carrier portals that have no API
Twice a day we sign in to each carrier portal, check every open container, and lead your Slack update with the ones that were rolled, held, or delayed.
Twice every weekday, at 7am and 1pm, check the status of every open shipment sitting in carrier and forwarder portals that have no API. Use Steel, Google Sheets, and Slack. Run this on a cron trigger, because these portals are pull-only and never notify us when something changes.
Start by reading the open shipment list from Google Sheets with Get Values. Each row gives me the shipment reference, which may be a container number, a bill of lading, or a booking reference, plus the carrier or forwarder that reference belongs to, the last status we recorded, and the last ETA we recorded. Skip any row already marked delivered or closed.
Group the shipments by carrier so one browser handles every reference for that carrier rather than opening a new browser per shipment. For each carrier, use Steel Create Session with our saved browser profile, so the session arrives already logged in to that carrier's portal. The profile is set up once with the portal logins and reused on every run, so there is no sign-in step to automate here.
Inside the session, use Execute Computer Action to type each reference into the portal's tracking search and open the result, then use Scrape Webpage to read the milestone list, the current status, and the latest ETA from the result page. Every portal lays its tracking page out differently, so work from what is actually on the page instead of assuming a fixed structure.
Normalize the wildly different carrier wording into one shared vocabulary: gate in, loaded, discharged, customs hold, rolled, and delivered. Carriers describe the same milestone in their own language, so map the raw portal text onto these shared terms, and keep the carrier's original wording alongside the normalized value so a human can check the call.
Compare the normalized status and the ETA against the last recorded values for that row. Wherever something changed, write it back to that shipment's row with Update Values, stamping the new status, the new ETA, and the time of the check.
Release the browser with Release Session as soon as that carrier's shipments are done, so we are not billed for idle sessions. Release the session even when a lookup fails partway through, and carry on with the remaining carriers rather than abandoning the run.
Finish with a Slack message using Send a Message. Lead with genuine exceptions, meaning shipments that were rolled to a later vessel, held at customs, or whose ETA slipped by more than two days. For each exception give the reference, the carrier, what changed, and the new ETA. Follow that with a short count of everything that simply moved forward as expected, and finally name any reference that could not be found or checked, so nothing silently disappears from the list.
What does this prompt do?
- Reads your open shipment list from Google Sheets: the container, bill of lading, or booking reference, the carrier, and the status you last recorded.
- Signs in to each carrier and forwarder portal for you, searches every reference, and reads the milestone history, the current status, and the latest ETA.
- Translates each carrier's own wording into one shared vocabulary, so gate in, loaded, discharged, customs hold, and delivered mean the same thing no matter who shipped it.
- Writes every change back to the shipment's row with the time it was checked, so the sheet stays the single source of truth.
- Posts a Slack update that leads with real exceptions, rolled sailings, customs holds, and ETA slips over two days, then counts everything that simply moved forward as expected.
What do I need to use this?
- A Google Sheet of your open shipments, with a column for the reference, the carrier, and the last status you recorded
- A Steel account for the browsing, plus your usual login details for each carrier or forwarder portal you track
- A one-time setup where you sign in to each portal and save that signed-in state, so every run afterwards arrives already logged in
- A Slack workspace and a channel where the shipment update should land
How can I customize it?
- Change the timing: 7am and 1pm on weekdays suits most ops teams, but peak season often warrants hourly, and slower lanes are fine with one check a day.
- Tune what counts as an exception: the two day ETA slip is the default, so tighten it to one day for tight delivery windows or loosen it for long ocean legs.
- Adjust the status vocabulary to match the words your team already uses on the whiteboard, and add milestones like empty returned or customs cleared.
- Split the output: send exceptions to an urgent channel and the everything-moved-forward count to a quieter one.
FAQs
Will this work with carriers that do not offer any tracking feed?
Do I have to log in every time it runs?
What counts as an exception worth flagging?
What happens if a portal changes its layout or a reference cannot be found?
Can it track ocean, air, and forwarder shipments in the same run?
Will I be charged for browsers left running in the background?
Related templates
When your flight moves, your calendar times get corrected automatically and you get a Slack note naming the meetings you're about to miss.
Every 15 minutes, forwarded phishing reports get traced back to the server that really sent them, with a verdict in Slack and the worst senders reported.
Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.
Every weekday at 7am, sign in to the tender portals you track, filter new notices against your bid criteria, and open a deal for the ones worth chasing.
Every weekday at 4pm, spot the threads that went quiet, stage a ready-to-send nudge in your mailbox, and get a ranked Slack recap.
Every Monday, rank the week's matches by expected demand, put the big ones on your venue calendar, and post a rota-ready summary to Slack.
Stop checking carrier portals by hand.
Let this run twice a day and spend your attention only on the shipments that actually went wrong.