Compare carrier rates and batch print labels before pickup

By General Input

Your fulfillment team opens one screen each afternoon, picks the best rate on every order, prints all the labels at once, and books the pickup.

Integrations

  • EasyPost
  • Shopify
  • Google Sheets

Type

App

Categories

  • Operations

Build me a rate shopping and batch label station that my fulfillment team opens every afternoon before the carrier pickup. It takes a stack of unfulfilled Shopify orders through one linear flow: confirm the parcel, verify the address, compare live carrier rates, buy the labels as a batch, print, book the pickup, and write tracking back to Shopify. The point is that nothing gets retyped and nobody buys a label without seeing what the alternatives cost.

The main view is today's ship queue. Load orders with Shopify List Orders filtered to unfulfilled and to today, with an adjustable date window since the team sometimes works a backlog. Pull per order detail with Get Order, and use List Fulfillment Orders to get the fulfillment order and line item ids needed later to fulfill from the right location. Each row shows order number, customer, destination city and state, item count, the promised or expected delivery date if the order carries one, and a status chip for where it sits in the flow: needs parcel, address blocked, rate selected, bought, fulfilled.

Parcel step. Store box presets in the app as persistent records: preset name, length, width, height, and empty box weight. The team defines them once and picks from a dropdown per order instead of typing dimensions. Choosing a preset fills the three dimensions and leaves only the final weight to type, and the app should remember the last preset used for a given order shape or SKU mix and preselect it next time. Presets can be added, edited and archived from a small settings view.

Address verification is a hard gate, not a warning. Before any rate call, run every destination through EasyPost Create and Verify Address. If verification fails or the address comes back undeliverable, the order is blocked: show the failure reason, let the team edit the address inline and re-verify, and keep the buy controls disabled until it passes. Blocked orders stay pinned at the top of the queue so they get resolved rather than quietly skipped, and a blocked order must never enter the batch. When EasyPost returns a corrected version of the address, show it next to what the customer typed so the team can accept the correction.

Rate shopping. For each order with a parcel and a verified address, call EasyPost Create Shipment to pull live rates from every connected carrier account. Present the results as three highlighted options side by side, cheapest, fastest, and a recommended pick, each with carrier, service, price, estimated delivery days, and the difference against the others spelled out in dollars and days, for example "saves $4.10, arrives 1 day later". Show the full rate list underneath for anyone who wants it. If the parcel is edited after rates were pulled, call Regenerate Shipment Rates rather than starting the order over. Use Retrieve Shipment SmartRates where a tighter time in transit estimate makes the promised date rule more trustworthy.

The team can select a rate per order by hand, or apply a rule across every selected order at once. Ship at least three rules: always cheapest, always fastest, and cheapest service that still arrives by the promised date, which compares each rate's estimated delivery against the delivery date on the Shopify order and falls back to the fastest available service when nothing makes the date. Applying a rule fills a selection on every eligible row and leaves manual overrides intact, and it should be visually obvious which rows a rule set and which a person picked.

Buying. Once selections are made, create a batch with EasyPost Create Batch, add the selected shipments with Add Shipments to Batch, and purchase with Buy Batch. Give the team a way to pull an order back out before purchase using Remove Shipments from Batch. After the batch is bought, generate the consolidated label document with Create Batch Label and show it as one printable PDF, and generate the carrier manifest with Create Batch Scan Form. Support Convert Shipment Label Format for anyone who needs a single label in a different size or format for a thermal printer. Also allow one rush order to be bought on its own with Buy Shipment, outside the batch, with the same logging and writeback.

Pickup. From the same screen, schedule the carrier collection with EasyPost Create Pickup for the bought batch using the warehouse address and a pickup window the team chooses, show the returned pickup rates, and confirm with Buy Pickup. Display the confirmed window and confirmation number on screen so the team knows the truck is booked.

Shopify writeback. Every purchased label writes tracking back to the order so the customer gets notified. Use Create Fulfillment against the order's fulfillment orders with the carrier, tracking number and tracking url from the bought shipment, and use Update Fulfillment Tracking when a label is replaced or a tracking number changes. Show writeback status per row, and let the team retry a failed writeback without rebuying the label.

Logging. Append one row per shipment to a Google Sheets log using Append Values: date, order number, customer, destination, carrier, service, rate paid, the rate of the default service for that same parcel, the savings against that default, estimated delivery days, tracking number, batch id, and who bought it. This log is the record that proves the rate shopping pays for itself.

At the top of the app, show a running "saved this session" total that sums the difference between each purchased rate and the default service rate for that parcel, alongside a count of labels bought. Persist a rolling total too, so the team can see savings for the week and the month rather than only the current sitting. Box presets, the default service setting, the warehouse address, the pickup window, and the savings totals all persist in the app between sessions.

Design it for a packing bench: dense, keyboard friendly, and readable from a step back. Orders already fulfilled drop out of the queue on refresh. Show clear per row errors when a rate call or a purchase fails so one bad order does not stall the whole afternoon, and never mark an order done in the app unless the label was actually bought and the tracking actually landed in Shopify.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet 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 boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads