Compare carrier rates and batch print labels before pickup

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.

App
EasyPostShopifyGoogle SheetsOperationsData Sync
PromptCreate

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.

What does this prompt do?

  • Pulls today's unfulfilled store orders into one ship queue with saved box presets, so nobody retypes weights and dimensions order after order.
  • Checks every destination address first and blocks any order that comes back undeliverable, so a bad address can never turn into a bought label.
  • Shows cheapest, fastest and recommended rates side by side with the dollar and day difference spelled out, or applies your own rule in bulk, like cheapest option that still arrives by the promised date.
  • Buys the whole batch at once and hands back one printable label file plus a pickup manifest, books the carrier collection, writes tracking back to your store so customers get notified, and logs every shipment and its savings to a spreadsheet.

What do I need to use this?

  • A Shopify store with orders your team fulfills in house
  • An EasyPost account with your carrier accounts already connected, so real rates come back from the carriers you actually ship with
  • A Google Sheets spreadsheet to hold the shipment and savings log
  • Your warehouse pickup address and the time window your carrier collects
  • A label printer on the packing bench

How can I customize it?

  • Change the rule the team applies in bulk: always cheapest, always fastest, or cheapest service that still arrives by the promised date.
  • Edit your box presets so the sizes match the actual cartons on your packing bench.
  • Set which service counts as your default, since that is what the savings number is measured against.
  • Choose the pickup window and the spreadsheet the shipment log lands in.

FAQs

Which carriers will I see rates from?
Whichever carrier accounts are connected to your EasyPost account. The screen shows every rate that comes back for that parcel, so USPS, UPS, FedEx, DHL and any regional carrier you use all sit side by side and get compared the same way.
What happens if a shipping address looks wrong?
The order is blocked from being bought. You see the reason it failed, can fix the address right there, and re-check it. If a corrected version comes back, it is shown next to what the customer typed so you can accept it. Nothing is purchased until the address passes.
Do customers still get their shipping notification?
Yes. Every purchased label is written back to the order in your store as a fulfillment with the carrier and tracking number, which is what triggers the shipping email your store already sends.
Can I print one urgent label without waiting for the batch?
Yes. A single order can be bought on its own at any point, and it is still logged, still written back to your store, and still counted in the savings total.
How do I know the rate shopping is actually saving money?
A running saved this session total sits at the top of the screen, comparing every rate you bought against what your default service would have cost for the same parcel. Each shipment's saving is also appended to the spreadsheet log so you can add up a week or a month.

Related templates

Prospecting desk that builds account lists from the live web

Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.

Hyperbrowser
HubSpot
Google Sheets
App
Influencer campaign roster board with AI creator briefs

Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.

HypeAuditor
Google Sheets
Notion
App
Morning repricing console for Shopify with margin-safe rules

Pick a repricing rule, send an assistant out to check competitor pages, then approve the new prices that clear your margin floor.

Hyperbrowser
Shopify
Google Sheets
App
Pre-flight bounce check before you launch a cold email sequence

See the projected bounce rate for any outbound send before it goes out, and keep the launch button locked until the list is clean enough to be safe.

Hunter
Google Sheets
App
Per-device electricity cost explorer for your smart home

Pick any date range and see what each device in your home actually cost to run, not just how many kilowatt-hours it used.

Home Assistant
Google Sheets
App
Build a PR media list from real worldwide news coverage

Search three months of global coverage on your topic, rank the outlets actually writing about it, and draft a tailored pitch for each one.

GDELT
Google Sheets
Gmail
App

Stop overpaying for labels you buy one at a time.

Give your fulfillment team one screen that compares every carrier, prints the whole afternoon's labels in one pass, and books the pickup before the truck arrives.