Shopify how-to

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.

Time
8 min
Difficulty
medium
Steps
6

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

With I'd Ship That

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.

Open The Workbench

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.