The morning export ritual
Someone opens Shopify, filters unfulfilled orders, exports a CSV, deletes the columns nobody needs, sorts by product and emails it to the warehouse. Or they paste it into a shared Google Sheet with tabs for each supplier. Later, tracking numbers come back in another spreadsheet and someone copies them into Shopify one order at a time.
It works, in the sense that parcels go out. But it only works when that person is in, and it only works as fast as they can copy and paste. An order placed at ten past nine waits until tomorrow's export. A note from the customer saying "please leave with neighbour" gets lost when the column is deleted.
Why the spreadsheet never goes away
The spreadsheet is filling a gap between two systems that do not talk. The warehouse, the dropship supplier or the 3PL needs orders in a particular shape, and Shopify's export is not that shape, so a person reshapes it.
Over time the sheet picks up extra jobs: flagging priority orders, splitting orders across suppliers, spotting addresses that look wrong. Those rules live in one person's head and a few conditional formats. That is the real reason nobody dares replace it. It is not just an export, it is the business logic of fulfilment, written nowhere else.
What it costs in practice
| Where it hurts | What happens |
|---|---|
| Speed | Orders wait for the next export, so dispatch slips a day |
| Errors | A wrong row, a missed order, a quantity typed incorrectly |
| Customer notes | Delivery instructions and gift messages get dropped |
| Tracking | Copied back by hand, often late, so customers email to ask |
| Cover | When the person who does it is away, fulfilment stalls |
None of these is dramatic on its own. Together they add up to slower dispatch, more "where is my order" emails and a job that nobody wants to own.
How we replace the export
We write down the rules first. Which orders go where, what counts as a priority, how split orders are handled, which fields the other side needs. Then we build a small service that does exactly that, every time an order is paid.
- Listen for orders. A Shopify webhook fires when an order is paid, so there is no waiting for a batch.
- Apply your routing rules. Each line is sent to the right warehouse, supplier or 3PL based on product, location or stock.
- Validate before sending. Addresses are checked for missing postcodes or impossible combinations, and anything odd is held for a person instead of shipped.
- Send in the format the other side needs. That might be their API, an EDI file, an email with a formatted attachment, or a row in a sheet they already use.
- Bring tracking back. When the fulfilment side reports a shipment, we mark the order fulfilled in Shopify with the tracking number, which triggers the customer's shipping email.
- Show the exceptions. Held orders, failed sends and missing tracking appear in one list with the reason, so someone deals with the few problems instead of handling every order.
Tools like Zapier, Make or n8n can do parts of this for simple setups. Where the rules are involved, or volumes are high, we write the service directly against the Shopify Admin API so it is testable and easy to change.
After the spreadsheet
Orders reach the warehouse minutes after they are paid. Customer notes travel with them. Tracking appears in Shopify without anyone copying it. The person who used to run the export now looks at a short exceptions list and spends the rest of the time on things that need judgement.
The routing rules also stop being a secret. They are written down in the build, so adding a new supplier is a change to a rule rather than a new tab someone has to learn.
Is this happening in your business?
- Someone exports orders from Shopify at least once a day.
- Tracking numbers are typed or pasted back into Shopify.
- Orders go to more than one supplier or location and are split by hand.
- Customers email to ask where their order is because tracking arrives late.
- Fulfilment slows down when one particular person is off.