How to ship Shopify orders from a spreadsheet
You will have labels for a day of Shopify orders bought from an exported file, and each tracking number back on its order in the admin.
Checked against Shopify: exporting orders on September 13, 2026.
Before you start
- Staff access to Orders in the Shopify admin
- A Shopify orders CSV with the billing columns removed
- Packed boxes with a weight for each one
- Time at the end for the tracking numbers to go back by hand
Steps
-
Export the batch
In your Shopify admin, go to Orders, filter to the orders you are shipping, select Export, then choose Selected orders.
You should see a CSV in your browser for up to 50 orders, or an email for a larger batch.
-
Trim the file to what a label needs
In your spreadsheet app, keep the Name column and the 10 Shipping columns, drop the Billing columns, and remove rows where Lineitem requires shipping is FALSE.
You should see one address row per order, with no billing address anywhere in the file.
-
Bring the rows into a batch
In The Workbench, start a batch from a file and choose your trimmed CSV. A short list can be pasted instead.
You should see your orders as rows in the grid, with any warnings such as duplicate recipients shown before you price anything.
-
Set the weights
In the batch, set each parcel's weight from your saved product presets or by typing it once.
You should see every row carrying a weight, because a Shopify export does not include one.
-
Rate and buy the batch
In the batch, price USPS and UPS across the rows, then buy the labels you want.
You should see the full price of each label before you commit, and one merged PDF to print.
-
Put the tracking back on each order
In your Shopify admin, open each order and fulfil it with its tracking number and carrier.
You should see the order moving to Fulfilled and Shopify sending its own notification to the buyer.
If it goes wrong
- Step 6 is the whole cost of this route
A file based batch has no way back into Shopify, so every tracking number is typed into an order by hand. At 30 orders that is the longest part of the afternoon, and it is where transposed digits get in. Our guide on marking a Shopify order fulfilled with tracking covers which notification each route sends.
- The file aged while you packed
Orders cancelled or edited after the export are still rows in your sheet. Re-check anything unusual in the admin before buying, because a label bought against a cancelled order is money spent on a parcel nobody expects.
- The addresses were never validated
A CSV carries whatever the buyer typed. Validate addresses in the batch before buying, or expect the carrier to make its own correction and bill for it later.
- Pick lists and packing slips are missing
Rows imported from a file cannot produce pick lists or packing slips. Those stay on orders that came from a connected store, so a spreadsheet batch prints labels only.
What happens next
This route costs 2 extra passes every day: one to export and trim, one to type tracking numbers back. A connected store removes both, because paid orders arrive on a 10 to 15 minute sync and the fulfilment is written back against the order's fulfillment order with the tracking number and carrier, which is what triggers Shopify's own email to the buyer. The Shopify connection is in early access, so the CSV route is what to use until your store is in.
Shopify early access closes both passes
Our Shopify connection reads paid orders through Shopify webhooks and a 10 to 15 minute poll, puts them in The Workbench with their line items and assigned location, and writes the fulfilment back with tracking when the label is bought. Nothing is exported, nothing is typed twice. It is in early access today, and the file route above is the one to run meanwhile.
Related questions
Yes, for short lists. The Workbench accepts pasted rows as well as a CSV or XLSX upload, and a paste is parsed for you up to a few thousand characters. For a day of orders out of Shopify the export is usually less work than a paste.
Not through Shopify's own bulk action, which marks orders fulfilled with no tracking field at all. Our guide on adding tracking numbers to Shopify orders in bulk covers what that action does and why tracking lands another way.
The file route is fine at that size, because typing 5 tracking numbers costs a minute. The arithmetic changes around a few dozen orders a day, where the second pass stops being a rounding error and starts being the reason labels get bought late.
Shopify sends it when you fulfil the order, not when you buy the label, so the buyer hears from you later than the parcel exists. Fulfil in the same session as you print, or the shipping confirmation lands after the parcel has already been scanned.