How to export Shopify shipping charges
You will have what each buyer paid for shipping in one sheet, ready to sit beside what your postage cost for the same orders.
Checked against Shopify: exporting orders on September 13, 2026.
Before you start
- Staff access to Orders in the Shopify admin
- A date range you want to look at, with both ends closed
- Your own record of what each label cost
- A spreadsheet app that can look values up across sheets
Steps
-
Export the orders for the period
In your Shopify admin, go to Orders, select Export, choose Orders by date, then select Export orders.
You should see a message that the CSV is emailed to you and the store owner, because any export by date goes by email.
-
Find the charge the buyer paid
In the orders CSV, find Shipping alongside Subtotal, Taxes and Total.
You should see one shipping amount per order, on the first row of that order.
-
Reduce the sheet to one row per order
Sort by Name and keep only the first row of each order, because the additional line item rows leave the money columns empty.
You should see distinct order references, each with one shipping amount.
-
Export the payment side as well
Back on the Orders page, select Export, keep the same date range, then select Export transaction histories.
You should see a second file with Order, Name, Kind, Gateway, Created At, Status, Amount and Currency.
-
Join the two files on the order reference
In your spreadsheet app, look the transaction rows up against the order rows using Name.
You should see each order showing its shipping charge and the payments recorded against it.
-
Add your postage column
In the joined sheet, add one column for what the label cost and fill it from your own label records.
You should see three numbers per order: what the buyer paid to ship, what was collected, and what postage cost.
If it goes wrong
- The shipping amount is blank on most rows
Money lives on the order row, and Shopify writes additional line items on separate rows. Summing the Shipping column without collapsing to one row per order is safe, but reading it per row is not, and copying it down fills a batch with amounts nobody charged.
- The two files do not add up
They are different grains. The orders export is one order per line, the transaction histories export is one movement per line, so refunds and partial captures appear as extra rows. Join on Name and expect more transaction rows than orders.
- The export never appeared in your downloads
Shopify's rule is explicit: "If you select to export more than 51 orders or to export orders by date, then the CSV file is emailed to you and the store owner." Any reconciliation run is by date, so it always arrives by email.
- A discount hid the shipping charge
Free shipping promotions write a zero into Shipping while postage still cost you something. Read Discount Amount next to it so a zero reads as a decision rather than as missing data.
What happens next
You now hold 2 files on 2 grains joined by 1 column, covering a period you chose. Do the comparison per order rather than per month: a single oversized parcel moves a month's average more than a hundred ordinary ones, and it is the order level view that tells you which listing to reprice or repack.
What we do and do not carry across
Order money is not imported from Shopify, so the comparison above stays in your spreadsheet on purpose. What The Workbench does give you is the price of every label before you buy it, across USPS and UPS, for the whole batch at once. You see the full price before you buy, and the label price is the number to put beside Shopify's Shipping column.
Related questions
The orders export, in the Shipping column. Transaction histories records money movements, so it shows the total captured rather than the shipping portion. You need both files only when you are chasing refunds and partial captures.
Id is the safer key inside Shopify, because Name is a display reference such as #1001 that can be renumbered by prefix and suffix settings. Transaction histories exposes Name, so a join on Name is usually the practical route. Check that both files use the same format before trusting the lookup.
The order keeps the amount it was placed with, and the refund appears as its own transaction row. That is why the two files disagree on totals. Treat the transaction rows as the record of money that moved, and the order row as the record of what was agreed.
Yes, the postage you actually paid, plus anything a carrier billed afterwards for a wrong weight or size. Our guide on being charged extra after buying a label explains where those adjustments come from and why the original label price is not always the final number.