Track container shipments in carrier portals that have no API

By General Input

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.

Integrations

  • Steel
  • Google Sheets
  • Slack

Type

Agentic Task

Categories

  • Operations

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageWin back LiveChat visitors whose chats went unansweredLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardChat quality review board for LiveChat support leadsLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seats