Enterprise case studyAnonymized client project

A carrier portal automation bot that files and follows parcel claims

A Dutch 3PL fulfilment company files parcel investigations and claims through a carrier partner's customer portal built on Freshdesk. The portal has no API, so every ticket was opened, checked and answered by hand. This bot does that work through a real browser and exposes it as a small HTTP API.

In short

The carrier portal bot is a browser automation (RPA) service for a Dutch 3PL. It logs in to a carrier partner's Freshdesk customer portal, which has no API, and opens claim tickets with the carrier, reason and invoice attached. It also reads replies, adds comments and closes tickets. The 3PL's investigation platform calls it like any other API.

API endpoints
7
Ticket list read
~0.5s over HTTP
Browser sessions
1 at a time
Portal languages
Dutch, English
Carrier Portal Bot | Claims & Ticket Automation main project interface

01 / The problem

Why the carrier portal automation bot was needed

When a parcel goes missing or arrives damaged, the 3PL opens an investigation with the carrier. For one carrier partner, that means a ticket in a Freshdesk customer portal: choose the carrier, choose the claim reason, attach the sales invoice and fill in a non-receipt declaration. There is no API for any of it.

Following up was the larger cost. Each open investigation had to be checked for new replies, and answers had to be posted back with attachments. The 3PL's investigation platform needed this data automatically, but the only way in was the same web portal a person uses.

A first browser version worked but was slow and heavy. Every check launched Firefox, and nine open investigations on a 15-minute cycle meant about 960 browser launches a day, most of them re-reading tickets that had not changed.

02 / The build

How I approached the build

The bot is a Python FastAPI service that drives the portal with Playwright through Camoufox, a hardened Firefox build. It fills the claim form, including the Choices.js dropdowns for carrier and claim reason, uploads files, and returns the new ticket ID. If the portal redirects to the ticket list instead of the new ticket, the bot finds the ticket by its subject.

Session cookies are saved after login and reused, so most requests skip the login screen. An expired session is detected by the redirect to the login page and healed with a fresh login. A single global lock allows one browser at a time, because parallel sessions overwhelmed the portal's single sign-on.

Reads take a faster path. The portal renders tickets as plain HTML, so the ticket list and a change fingerprint (status, comment count, newest comment time) are fetched over HTTP with the saved cookies in about half a second instead of 20 to 30 seconds. The browser starts only when something changed. The Docker image installs only the libraries Firefox needs, not the full Playwright browser set of about 2 GB.

03 / Capabilities

What the carrier portal automation bot does

01

Claim ticket creation

Fills the carrier, claim reason, invoice and declaration fields, attaches files and returns the new ticket ID.

02

Reply and comment posting

Posts follow-up comments with attachments, using button labels in both Dutch and English.

03

Ticket closing

Closes resolved tickets, and treats a ticket that is already closed as done instead of an error.

04

Change fingerprinting

Checks status, comment count and newest timestamp over HTTP to tell whether a ticket needs a full read.

05

Ticket lookup fallbacks

Finds a ticket from the first list page, a direct URL or scored search suggestions.

06

Session persistence

Reuses saved cookies and logs in again only when the portal redirects to its login page.

07

Error evidence

Captures on-screen validation errors and a full-page screenshot when a form step fails.

04 / Workflow

How it works, step by step

  1. 01

    Receive the request

    The investigation platform calls an endpoint such as submit, fetch, comment or close.

  2. 02

    Try the fast path

    List and change checks run over HTTP with saved cookies, without starting a browser.

  3. 03

    Drive the portal

    When a write or full read is needed, Camoufox opens the portal under the single-browser lock.

  4. 04

    Return structured data

    The bot returns ticket IDs, status and conversation as JSON for the platform to store.

05 / Product screens

Product screens

Select a screen to inspect the interface, workflow and operational details more closely.

01 / 02
Carrier Portal Bot | Claims & Ticket Automation: Feature map

Feature map

06 / What changed

The practical result

  • Claim tickets in the carrier portal are opened, followed up and closed from the 3PL's investigation platform, without staff logging in to the portal.
  • Ticket list reads dropped from 20 to 30 seconds of browser time to about half a second over HTTP, and unchanged tickets no longer start a browser.
  • Failures are visible and recoverable: expired sessions heal themselves, and form errors come back with the portal's own messages and a screenshot.

Common questions

Questions about building a similar carrier portal automation bot

Yes, a browser automation bot can use the portal the same way a person does. This bot logs in to a Freshdesk customer portal, fills in claim forms, uploads invoices, reads replies and closes tickets. It exposes those actions as a small HTTP API, so other systems can call it without knowing a browser is involved.

The bot logs in again and saves the new session automatically. It detects expiry when the portal redirects to its login page, then stores fresh cookies for the next request. The fast HTTP read path fails soft in the same case and falls back to the browser, which refreshes the session on its way through.

The bot reports the portal's own error messages instead of failing silently. When the form reloads with validation errors, it collects the visible error text and saves a full-page screenshot. When the portal sends it to the ticket list instead of the new ticket, it finds the new ticket by its subject line.

It tries three routes in order until one opens the right ticket. First it checks the first page of the ticket list, then the direct ticket URL, then the portal's search suggestions. Suggestions are scored on ticket ID, link and subject text, and the bot confirms the opened page is the requested ticket before reading it.

Parallel sessions overwhelmed the portal's single sign-on, so the bot runs one browser at a time. A global lock queues write and full-read requests. Ticket list reads and change checks run over plain HTTP outside the lock, so the regular status cycle never waits behind a slow form submission.

The bot checks whether a ticket changed before reading it in full. A fingerprint of status, comment count and newest comment time is compared with the last one. Reply text is still read through the browser so the platform's stored reply fingerprints match exactly, which stops an old reply from being imported again as new.

Work with me

Stuck with a carrier portal that has no API?

I build browser automation that files claims, follows tickets and feeds the results into your own systems. Send me the portal workflow your team repeats every day.

Discuss your project

Keep exploring