Skip to main content

Command Palette

Search for a command to run...

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.

Published
14 min read
Building Our Own FedEx Fulfilment App for A Shopify Brand
N

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 Problem

At low order volumes, manual fulfillment is painful but survivable.

Someone opens Shopify. They find the order. They copy the address into FedEx Ship Manager. They guess the weight based on what they think is in the box. They print the label. They manually mark the order as fulfilled. Then they move to the next one.

Three to four minutes per order. Forty orders a day. Manageable, if barely.

Then volume scaled. Monday volumes hit 80–100 orders in a single shift. Thursday orders needed to ship alongside a backlog from the weekend. The team was doing five separate checking steps per order — packed, weighed, labeled, verified, crossed off a list — and still things were falling through the gaps.

The mistakes weren't from careless staff. They were built into the process itself.

Duplicate labels. The same order occasionally ended up with two FedEx shipments. Both got charged. One went in the box. The other was wasted — and FedEx doesn't waive the charge on an unused label unless you void it within the window.

Weights were guessed. The shipping weight of each order depends on what's in it. Staff had no reliable way to calculate this quickly under pressure, 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.

Nobody could see what was happening in real time. 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.

The ground team wasn't reading WhatsApp. This one is subtle but it's what finally made the old process unworkable at scale. The team responsible for physically packing and labeling orders is standing at a workstation. They're scanning barcodes. They're handling product. They're focused. Every operations update — order corrections, address holds, last-minute changes — was being sent to a WhatsApp group the team wasn't checking while they worked. The channel that management relied on to communicate urgency was invisible to the people who needed it most.


Why VAs Sending Lists Wasn't Working

Before we built this system, the workflow looked like this: every morning, a VA would compile the day's orders from Shopify into a master list and post it in a WhatsApp group. The fulfillment team would screenshot it, open Shopify manually to print order slips, write each order number on a paper sheet, and track packed / checked / labeled with their own initials.

That sheet was created fresh every day, by hand. It was accurate as of the moment the VA posted it — not a minute after. If an order came in after the list was sent, it wasn't on the sheet. If an address was flagged after the list was sent, the team had no way of knowing. If a VA made a formatting error or missed a row, an order shipped without anyone noticing.

We had a meeting where the fulfillment manager described exactly how their team works on the floor. She said it plainly: "They have their phone open to WhatsApp because if any problem surges they know they take a picture and send it to you guys. But they don't have time to go back and forth between what they're doing on the tablet."

That's the reality. A team doing physical fulfillment work isn't alt-tabbing between a chat app and a scanner workflow. They need one screen, one source of truth, and everything they need to know surfaced in that screen automatically.

The VA-driven list wasn't just inefficient. It created a false sense of control. The list looked complete. It wasn't. Not in real time.


Why We Didn't Use ShipStation, EasyPost, or Shippo

This comes up every time we describe the project.

The honest answer is that those platforms are built for a different problem. Multi-carrier rate shopping. Multi-warehouse routing. High-SKU catalog management with static weights per variant. None of that applied here.

Everything ships with a single carrier. Everything ships from one location. The catalog is small, but the shipping weight per order is dynamic — it changes based on what the customer ordered, and you can't pre-set it in a product catalog because the same SKU can ship at different weights depending on how orders are combined.

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.

And then there's cost. At 150 labels per day across a four-day week, a purpose-built system running on a small server using the brand's own negotiated carrier rates comfortably outperforms any SaaS per-label or per-seat pricing model.

ShipStation solves a different problem. We needed to solve this one.


What We Built

A private internal web app, protected behind Cloudflare Access, that handles the entire fulfillment workflow from scan to shipment. Thousands of orders have moved through it.

Here's how the team actually uses it — not the technical architecture, but the lived experience on the floor.


The Scanner Screen

Staff arrive at the packing station, open the app in Chrome, and see a single input field waiting for input. They pick up the order slip, point a barcode scanner at the QR code in the corner, and pull the trigger. The scanner types the order number into the field and submits.

Within seconds, the order details appear on screen. The correct box size and shipping weight are calculated automatically. The FedEx label prints on the thermal label printer. No clicks. No decisions. No manual entry.

A short countdown timer resets the screen for the next order.

The whole thing, from scan to label in hand, takes under ten seconds.

If an order has a note from the customer — a gift message, special instructions — a yellow alert appears on screen before the label generates. The team sees it. They act on it. Then they scan the next order.


The Fulfillment Queue

Before the app, the team worked off a list that was accurate as of whenever a VA posted it. Now they work off a live queue that reflects Shopify in real time.

The queue organises every unfulfilled order by when it needs to ship. Orders placed before 2pm on a weekday ship the same day. Orders placed after 2pm ship the next business day. Orders that came in Thursday after 2pm, or over the weekend, all roll to Monday. The queue shows this clearly — each group labelled Ships Today, Ships Tomorrow, or the specific day — so the team knows exactly what the day's work actually is.

If an order is overdue because something slipped through on a previous day, it appears at the top in red. The team can see it instantly. They don't need to be told.

If an order is blocked — unpaid, address flagged, on hold — it shows in the queue with the reason, so the team understands why it's there and knows not to try to generate a label for it.

Each row in the queue has three buttons: FedEx label, packing slip, and both at once. One click, and both the carrier label and the order slip print to their respective printers automatically. No Shopify tab. No copy-pasting. No choosing the wrong template.


The Printed Checklist

This replaced the VA-sent WhatsApp list entirely.

At the start of each shift, someone scans a QR code card at the packing station — or clicks one button on the queue page. A cross-checking sheet prints on the office printer: order numbers, item counts, whether the order has a note, and columns for packed, printed, placed in box, and checked by.

It looks exactly like the manual sheet the team was producing by hand every morning. Except it's generated from live Shopify data, at that exact moment, with every order that needs to ship today — including anything that came in overnight, anything that's overdue from a previous day, and a clear flag on any orders that are blocked or unpaid so the team knows to check with the VA team before processing them.

The ground team takes that sheet. They work through it. They don't need to look at their phone. They don't need to check WhatsApp. Everything they need to know is on the paper in their hands.


The Packing Slip

Every order gets a printed packing slip sent to the office printer automatically. The slip is generated from the order data in real time — customer name, shipping address, every item in the order, the flavour breakdown if it's a build-your-own order, and a QR code linking back to the order in the app.

It prints in the customer's language. If the order was placed through the Spanish-language storefront, the slip prints in Spanish. If it was placed in English, it prints in English. No one has to think about this. The system detects it automatically.

There's a small promotional section on each slip — a WhatsApp number and a message asking for a video review in exchange for a discount on the next order. That's a business decision baked into the template. It prints on every slip. It costs nothing beyond the paper.


The Manifest

At any point during the shift, a manager can open the manifest page and see exactly what's been processed: how many orders, which batch they belong to, the FedEx tracking number for each one, and whether they've been picked up by the driver.

When the FedEx driver arrives, the manager clicks one button. Every order gets marked as picked up. Or they click individual orders if there's a split pickup.

There's a 90-minute void window on every label, displayed as a live countdown. If something is wrong with an order after the label prints — wrong address, customer calls to cancel — the team can void it with one click. The system cancels the shipment with FedEx and marks the order unfulfilled in Shopify automatically. After 90 minutes, the void option disappears. The timer shows Expired. No one accidentally tries to void something that's already in transit.

If a label prints damaged, a manager clicks Reprint on the manifest. The stored label PDF is sent back to the printer. No new FedEx API call. No new shipment. No charge.


The Scanner Shortcut Cards

Three laminated QR code cards sit at the packing station alongside the order slips. The team scans them with the same scanner they use for orders.

  • 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

  • PRINT CHECKLIST — sends the cross-checking sheet to the printer instantly

This keeps staff in the scanner workflow for the actions they need most, without reaching for the mouse or navigating between pages. The rhythm of the packing station stays unbroken.


The Team Note

Time-sensitive information used to get posted to WhatsApp — where the ground team wasn't looking. Now, when management needs to surface something urgently (a specific order to prioritise, a customer request, anything that matters right now), they update the Team Note field in a Google Sheet. The app picks it up within a minute and displays it at the top of the scanner screen in a yellow card.

The team sees it when they look at the scanner. They can't miss it. They don't need to pick up their phone.


The Problems That Got Solved

Duplicate labels — eliminated. Before generating any label, the system checks Shopify for an existing tracking number. If one already exists, the generate button is disabled entirely. There is no way to accidentally create a second FedEx shipment for the same order.

Wrong weights — eliminated. The app reads the order at the moment of fulfillment and calculates the exact shipping weight. The same item configuration always produces the same weight. FedEx billing corrections stopped.

Reprinting — free and instant. Every label PDF is stored in cloud storage, keyed to the order number. Reprints send the stored file directly to the printer. No new shipment. No charge.

The VA list — replaced. The cross-checking sheet is now generated from live data, at the exact moment the team needs it, and it prints automatically. The VA team no longer compiles and posts a manual list. The ground team no longer works off information that's already out of date.

WhatsApp as the source of truth — retired. Urgent information now surfaces on the screen the team is already looking at. Orders that need attention are flagged in the queue. The Team Note card handles anything that doesn't fit neatly into a workflow. The team doesn't need to check their phone to do their job.


The Time

Metric Before After
Time per order ~3–4 minutes ~10 seconds
Checklist preparation 20–30 min / day (VA manual) Instant, printed on demand
Duplicate labels Recurring Zero since launch
Weight billing corrections Monthly Zero since launch
Reprint cost New FedEx charge Free
End-of-shift visibility Manual reconciliation Real-time, always
Daily capacity Limited by manual speed 150 orders in ~90 min
Orders fulfilled to date Thousands

At 3.5 minutes per order versus 10 seconds, each order saves roughly 3 minutes and 20 seconds. At 100 orders per shift, that's 333 minutes saved per day — over five and a half hours of fulfillment time given back to the team, every single day they operate.

That's not counting the VA time spent compiling lists, the management time spent reconciling end-of-day, the billing corrections filed with FedEx, or the customer service time spent handling shipments that went wrong because something fell through a gap in a manual process.

None of that overhead exists anymore.


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, a missed void window, or an order that didn't ship — to a workflow where the only job is picking up the order slip and pulling the trigger. The system handles everything else.

The VA team stopped spending the first part of every morning compiling and posting a list that was out of date by the time the ground team saw it. They spend that time on things that actually need human judgment.

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 truck leaves.

The business went from a fulfillment process that was becoming a bottleneck at scale to one that handles peak volumes in a single shift with time to spare, with a complete audit trail, and with zero recurring errors.

That's what purpose-built software actually does. It doesn't add features. It removes friction.