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.
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?
What happens if a shipping address looks wrong?
Do customers still get their shipping notification?
Can I print one urgent label without waiting for the batch?
How do I know the rate shopping is actually saving money?
Related templates
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.
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.
Pick a repricing rule, send an assistant out to check competitor pages, then approve the new prices that clear your margin floor.
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.
Pick any date range and see what each device in your home actually cost to run, not just how many kilowatt-hours it used.
Search three months of global coverage on your topic, rank the outlets actually writing about it, and draft a tailored pitch for each one.
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.