Building Our Own FedEx Fulfilment App for A Shopify Brand
A fast-growing perishable food brand in US was losing time and money to a manual fulfillment process. Here's how we fixed it - and what changed on the floor.

I’m Nikhil Sharma, an author and consultant helping DTC brands grow with eCommerce and paid ads. I’ve worked with Google Ads, Meta Ads, and email campaigns. Here, I write about Shopify, DTC strategies, email marketing, and running paid ads.
The Business Context
The brand ships premium perishable products direct-to-consumer across the US, operating Monday through Thursday in two overnight batches. Each batch is time-sensitive by nature -perishable goods have to move fast, and every delay or error downstream affects the customer experience directly.
At lower order volumes, the process worked. Staff would open Shopify, find the order, copy the shipping details into FedEx Ship Manager, print the label, and manually mark the order as fulfilled. It was tedious but manageable.
Then volume scaled. And what was tedious became dangerous.
What Was Actually Going Wrong
The mistakes weren't from careless staff. They were built into the process itself.
Duplicate labels were getting generated. With no system-level check preventing it, the same order would occasionally end up with two FedEx shipments created. Both got charged. One went in the box. The other was wasted but FedEx doesn't automatically waive the charge on a label you didn't use unless you void it within the window.
Weights were being guessed. The shipping weight of each order depends on what's in it. A 6-item box weighs differently from a 12-item box. Add a pack of add-ons and you're into multi-package territory. Staff had no reliable way to calculate this quickly, so they estimated. FedEx billed corrections after the fact.
Reprinting meant regenerating. If a label printed damaged or got torn, the only fix was to generate a new one - which meant creating a second FedEx shipment. The original label was still active, still billable. Most staff didn't know how to void it.
There was no record of what happened. At end of shift, management had no fast way to see how many orders shipped, which ones were still open, or whether the FedEx driver had picked everything up. Reconciliation happened manually, hours later.
Individually, each of these was annoying. Together, they represented a meaningful and recurring cost - in FedEx overcharges, in staff time, and in customer experience when something went wrong.
Why We Didn't Use Off-the-Shelf Fulfillment Software
This question comes up every time we describe the project. The honest answer is that platforms like ShipStation, EasyPost, and Shippo are built for a different kind of problem - multi-carrier rate shopping, multi-warehouse routing, high-SKU catalog management. None of that applied here.
Everything ships FedEx. Everything ships from one location. The product catalog is small but the weight per order is dynamic - it changes based on what the customer ordered and you can't pre-set it in a product catalog. Getting it right means reading the order at the moment of fulfillment and calculating from scratch.
Beyond that, the staff using this tool are fulfillment workers, not logistics coordinators. Onboarding someone onto a full shipping platform for a role that requires zero configuration decisions is the wrong tool for the job. The target experience had to be: open a URL, scan a barcode, label prints. Anything more complex creates friction and introduces error.
Finally, cost. At 150 labels per day, four days a week, a purpose-built system running on a $10/month server using the brand's own FedEx negotiated rates comfortably outperforms any SaaS per-label or per-seat pricing model.
What the System Does
We built a custom internal web app - accessible at a private URL, protected behind Cloudflare Access - that handles the entire fulfillment workflow from scan to shipment.
On the floor
Staff arrive at the packing station, open the app in Chrome, and see a single input field waiting for input. They pick up the packing slip, point the Tera D5100 2D barcode scanner at the QR code in the corner, and pull the trigger. The scanner types the order number directly into the field and submits.
Within seconds, the order details appear on screen, the correct box size and shipping weight are calculated automatically, and the FedEx label prints on the Rollo thermal printer - no clicks, no decisions, no manual entry. A short countdown timer then resets the screen for the next order.
The whole thing, from scan to label in hand, takes under 10 seconds.
What happens automatically
Every time an order is scanned and fulfilled, the system:
Looks up the order in Shopify and pulls the exact shipping address
Calculates the correct weight based on what's in the order - dynamically, not from a static catalog
Generates the FedEx label(s) via the FedEx REST API using the brand's own account
Sends the label PDF directly to the Rollo printer
Marks the order as fulfilled in Shopify with the FedEx tracking number, triggering the customer's shipping confirmation email automatically
Stores the label PDF in cloud storage for future reprints
Logs the shipment to the daily manifest and to a Google Sheet
None of this requires a single click from the staff member beyond the initial scan.
Multi-package orders
Some orders require two boxes - for example, when a customer orders both a cookie box and a separate add-on pack. The system detects this automatically from the line items, generates two FedEx labels in a single API call, sends both to the Rollo, and records both tracking numbers. The manifest clearly shows "2 Boxes · 6.75 lb · 2 labels" so staff know exactly what to expect.
The Problems That Got Solved
Duplicate labels - eliminated
Before generating any label, the system checks Shopify for an existing tracking number on that order. If one already exists, the generate button is disabled entirely. Staff see the existing tracking number and are directed to reprint, not regenerate. There is no way to accidentally create a second FedEx shipment for the same order.
Wrong weights - eliminated
The app reads the product titles from the Shopify order at the moment of fulfillment and calculates the exact weight. A 6-item order always ships at 2.25 lb. A 12-item order ships at 4.5 lb. A combined order ships at the correct combined weight, split correctly across packages. FedEx billing corrections stopped.
Reprinting - free and instant
Every label PDF is stored in Cloudflare R2 keyed to the order number. If a label prints badly, staff open the manifest, find the order, and click Reprint. The stored PDF is sent directly to the Rollo again - no new FedEx API call, no new shipment, no charge. Reprints are free.
Voiding - one click with a countdown
The manifest shows a live countdown timer on every row - 90 minutes from label generation, matching FedEx's free void window. Staff click Void, confirm, and the system cancels the shipment with FedEx and marks the order unfulfilled in Shopify automatically. After 90 minutes, the void option disappears and the timer shows Expired, so no one accidentally tries to void something that's already in transit.
Visibility - real time
The manifest page gives management a live view of the day's shipments - how many orders fulfilled, which batch they belong to, whether they've been picked up by the driver. Orders can be marked as Picked Up individually or in bulk when the FedEx driver arrives. Managers can print the manifest to the HP LaserJet in the office with one click, or export a CSV for reporting. Past dates are accessible via a date picker - nothing is lost on server restart.
The Scanner Shortcut Cards
One detail worth mentioning: three laminated QR code cards sit at the packing station alongside the packing slips. Staff scan them with the same Tera D5100 scanner:
Reprint Last - reprints the label for the most recently processed order without opening the manifest
Void Last - opens the void confirmation for the last order
Manifest - navigates directly to the manifest page
This keeps staff in the scanner workflow for common actions instead of reaching for the mouse. It sounds like a small thing. In practice it keeps the rhythm of the packing station unbroken.
The Numbers
| Metric | Before | After |
|---|---|---|
| Time per order | ~3–4 minutes | ~10 seconds |
| Duplicate labels | Recurring | Zero |
| Weight billing corrections | Monthly | Zero |
| Reprint cost | New FedEx charge | Free |
| End-of-shift visibility | Manual reconciliation | Real-time manifest |
| Daily capacity | Limited by manual speed | 150 orders, ~90 min shift |
What This Really Changed
The efficiency numbers are easy to quantify. What's harder to put a number on is what it meant for the team.
Fulfillment staff went from a stressful, error-prone process where a single mistake could mean a billing correction or a missed void to a workflow where the only job is picking up the packing slip and pulling the trigger. The system handles everything else. Errors that used to require management intervention to resolve simply don't happen anymore.
Management went from having no visibility into daily operations until end-of-day reconciliation to a live dashboard they can check at any point. They know exactly what shipped, when, in what configuration, and whether it was picked up - before the driver's truck leaves the building.
And the business went from a fulfillment process that was becoming a bottleneck at scale to one that handles peak Monday volumes of 80–100 orders in a single shift with time to spare.
That's what purpose-built software actually does. It doesn't add features. It removes friction.



