# Courier performance dashboard for your carrier reviews

> Compare every carrier on on-time rate, transit time, and exceptions for any date range, then drill into the shipments behind each number.

- Workflow type: app
- Services: AfterShip, Google Sheets
- Categories: Operations
- Published: 2026-08-14

## What it does

- Pick any date range and see a scorecard of every courier you use: shipment volume, on-time delivery rate, average transit days, and exception rate side by side.
- Break the same numbers down by shipping lane, so you can spot which origin and destination pairs are dragging a carrier's average down.
- See promised delivery dates next to what actually happened, so you can tell a genuinely slow carrier from one that just quotes optimistically.
- Click any courier or lane to see the shipments behind the number and each one's checkpoint history, then export the current view to a fresh Google Sheet.

## What you'll need

- An AfterShip account where your shipments are already being tracked
- A Google account, so the export can create a spreadsheet in your Drive
- Shipments that carry origin and destination country details, which is what the lane view groups by

## Prompt

I want an internal dashboard I can open whenever I am deciding which courier to keep paying. It reads shipment data from AfterShip and turns it into a carrier scorecard I can slice by date range and by lane, drill into, and export.

At the top of the page, put a date range picker with presets such as last 30 days, last quarter, and a custom range. Everything below it reacts to the selected range. Directly underneath, show a scorecard table with one row per courier and these columns: shipment volume, on-time delivery rate, average transit days, and exception rate. Sort by volume by default, and let me sort by any column so I can rank carriers by whichever metric matters that day.

The metrics handler should page through AfterShip List Trackings for the selected dates using its cursor pagination: pass limit and cursor, then read data.pagination.next_cursor and data.pagination.has_next_page to decide whether to fetch again. Page in sequence rather than in parallel, because the account is capped at 10 requests per second. Resolve courier slugs into friendly carrier names with Get Couriers, and note that every AfterShip response is wrapped in a { meta, data } envelope. Cache the computed result per date range inside the handler so sorting, filtering, or drilling in does not refetch every page of shipments.

Compute shipment volume as the number of trackings in the range, on-time rate as the share of delivered shipments that arrived on or before their expected delivery date, average transit days as the mean number of days between pickup and delivery for delivered shipments, and exception rate as the share of shipments that hit an exception status. Show the underlying counts next to each rate, so a 100 percent on-time rate built on three shipments is not mistaken for a strong result.

Below the scorecard, add a lane view that breaks the same four metrics down by origin country and destination country pair. Let me group it either by lane across all carriers or by carrier within a lane, so I can see which routes are dragging a particular carrier's numbers down, and highlight lanes that are meaningfully worse than that carrier's own average.

Add a promised versus actual column to the lane view. Call AfterShip Batch Predict Estimated Delivery Date for the lanes currently on screen, since it accepts multiple shipment lanes in a single request, and compare the predicted delivery window against the real delivery dates for the shipments in that lane. Present it as the average gap in days plus a plain label such as on target, optimistic quoting, or genuinely slow, so I can tell whether a carrier is actually slow or just quoting dates it cannot hit.

Clicking any courier row or lane row drills into the underlying shipment list, filtered to that courier or lane within the selected date range. Each row shows tracking number, courier, origin, destination, ship date, promised date, actual delivery date, transit days, and current status. Clicking a shipment opens its checkpoint history from AfterShip Get Tracking by ID, rendered as a timeline of checkpoint messages with timestamps and locations. Fetch that checkpoint detail only when a shipment is opened, not for the whole list.

Put an Export button on the page that writes the current filtered view into a fresh spreadsheet using Google Sheets Create Spreadsheet, then fills it with Append Values. Name the spreadsheet after the selected date range, and give it one tab for the courier scorecard, one for the lane breakdown, and one for the shipment list behind the current filter. Show me the spreadsheet link when it finishes so I can drop it straight into our quarterly carrier review deck.

Remember my last selected date range so the dashboard reopens where I left it. While the first load for a range is running, show progress rather than a blank screen, since a wide range means paging through a lot of shipments. If a range has no shipments, or a carrier has too few shipments to judge fairly, say so plainly instead of showing a misleading percentage.

## How to customize

- Change the date range that loads by default when you open the dashboard, such as last 30 days or last quarter.
- Adjust what counts as on time, for example allowing a one day grace period against the promised date.
- Change how lanes are grouped, such as by state or city instead of country, or add your own columns to the scorecard.

## FAQ

### Do I need a paid analytics plan to use this?

No. The dashboard reads the shipment records already in your AfterShip account and calculates the scorecard itself, so the comparisons live in a view your team controls and can reshape.

### How far back can I look?

Any date range your AfterShip account still holds shipments for. A wide range takes a little longer to load the first time while it reads through the shipments, then stays quick as you sort and drill in.

### Where do the carrier names come from?

They are pulled from your AfterShip account, so the scorecard shows friendly names like FedEx or DHL Express rather than internal codes.

### What does the promised versus actual column actually tell me?

It compares the delivery date a carrier would normally quote for that lane against the date shipments really arrived. A carrier can look slow simply because it quotes optimistically, and this column separates the two.

### Can I share the results with people who do not open the dashboard?

Yes. The Export button writes whatever you are currently looking at into a new spreadsheet, with the scorecard, lane breakdown, and shipment list on their own tabs, ready to drop into a review deck.

Use this prompt in General Input: https://www.generalinput.com/prompts/courier-performance-dashboard-for-your-carrier-reviews