Shopify Order Export: One Usable Row per Line Item

Shopify's order CSV puts multi-item orders on several half-empty rows. What the export contains, how to fill the gaps safely, and when an app or custom export fits.

In this guide
  1. What Shopify’s order export contains
  2. Why “one row per line item” is what most teams want
  3. Option 1: Fill the gaps in your spreadsheet
  4. Option 2: Use an export app
  5. Option 3: Build a custom export
  6. Pitfalls that affect every option
  7. Putting it into a weekly routine
  8. Where StoreFleet: Order Export fits
  9. FAQ

You export your orders from Shopify, open the file in Excel or Google Sheets, and filter by SKU. Half the rows have no customer, no address and no order date. Sort by product and the problem gets worse, because now you cannot tell which order each item came from.

This is how Shopify’s order export is designed, not a bug. This guide explains what the file contains, how to turn it into one complete row per line item without breaking your totals, and when it makes sense to use an app or a custom export instead.

What Shopify’s order export contains

You export from Orders in the Shopify admin: filter or sort the list, click Export, and choose what to export. According to Shopify’s help page on exporting orders, small exports download straight away, while larger exports and exports by date are emailed to you as a CSV file.

The file has one block of columns for the order and one for the item. A shortened view:

Group Example columns
Order Name, Email, Financial Status, Fulfillment Status, Created at, Currency
Money Subtotal, Shipping, Taxes, Total, Discount Amount, Refunded Amount
Line item Lineitem quantity, Lineitem name, Lineitem price, Lineitem SKU, Lineitem fulfillment status, Vendor
Addresses Billing Name, Billing City, Shipping Name, Shipping Address1, Shipping Zip, Shipping Country
Other Notes, Note Attributes, Tags, Payment Method, Source, Id

Shopify’s help page lists every column. Two parts of it matter here.

Multi-item orders span several rows

Shopify states that orders with several line items show the extra items on separate lines, and that many fields are left blank to show that the items were bought on the same order. In practice, the first row of an order carries the order details, and each following row carries mainly the item columns.

Here is what a two-item order looks like, simplified:

Name Email Total Lineitem name Lineitem SKU Shipping City
#1042 anna@example.com 64.00 Oak cutting board - Large CB-L Lyon
#1042 Engraving gift box GB-01

That layout is fine for reading one order. It falls apart as soon as you sort, filter or build a pivot table on the item rows, because the second row no longer knows who it ships to.

Some columns are not there at all

Compare the column list with what your team asks for and you will usually find gaps. The standard order export has no columns for:

  • Line-item properties, such as engraving text, gift messages or upload links. We cover these in detail in how to export Shopify orders with line-item properties.
  • Tracking numbers for each fulfillment.
  • Product details beyond the line itself, such as product type, barcode or product and variant metafields.
  • Customer details beyond name, email and phone, such as customer tags.

Order-level custom fields (cart attributes) end up together in the single Note Attributes column, so you still have to split that text yourself.

Why “one row per line item” is what most teams want

Most jobs downstream of Shopify work at the item level:

  • A production or packing team needs one row per item to make, pick or pack, with the ship-to name next to it.
  • A warehouse or 3PL imports items, not orders.
  • Accounting often wants revenue by SKU or vendor.
  • Reporting in a pivot table needs every row to be complete, or the blanks fall into an “(empty)” bucket.

So the usable shape is: each line item gets its own row, and every row repeats the order details it belongs to. The one exception is money, which we come back to below because it is where most homemade fixes go wrong.

Option 1: Fill the gaps in your spreadsheet

If you export now and then, you can repair the file yourself. The idea is “fill down”: copy each blank order-level cell from the row above, but only within the same order.

Excel

  1. Open the CSV and save it as an .xlsx workbook, so your formulas survive.
  2. Select the order-level columns you want repeated, for example Email, Created at and the Shipping address columns. Do not select the money columns.
  3. Press F5, click Special, choose Blanks and click OK. Excel selects only the empty cells.
  4. Type = and press the up arrow, so the formula points to the cell above, then press Ctrl+Enter to fill every selected cell.
  5. Copy the columns and paste them back as values, so the cells no longer depend on their neighbours when you sort.

Power Query in Excel also has a Fill Down command, which is easier to repeat if you do this every week.

Google Sheets

Add an empty helper column next to each column you want filled. Say Email is in column C, the helper is column D and your data starts in row 2. Put this formula in D2 and copy it down to the last row:

=IF(C2="", D1, C2)

Each row takes its own email if it has one, and the value from the row above if it does not. Then copy column D, paste it over column C as values, and delete the helper.

Watch out for money and order counts

Do not fill down Subtotal, Shipping, Taxes, Total, Discount Amount or Refunded Amount. Those belong to the whole order. If an order has three items and you copy its total onto all three rows, a SUM of the Total column triples that order. The same happens if you count rows to get the number of orders.

Keep two simple rules:

You want Use
Revenue per order The order money columns, counted once per order (first row only)
Revenue per item or SKU Lineitem price × Lineitem quantity
Number of orders Count of unique values in Name
Number of items Sum of Lineitem quantity

When the spreadsheet route stops working

Filling down works, but you redo it on every export, and it does nothing for the columns that are missing. If someone on your team spends time each week on it, or the job needs line-item properties or tracking numbers, look at the next two options.

Option 2: Use an export app

Order export apps read your orders through Shopify’s API and write the file in the shape you choose. When you compare them, check these points on your own data, not on the app listing:

  1. Row mode. Can you choose between one row per order and one row per line item?
  2. Repeated order columns. In line-item mode, are the order number, date, customer and address on every row?
  3. Money handling. Are order totals repeated on every item row, or only on the first? Repeated totals look tidy but double count when summed.
  4. Line-item properties. Does each property get its own column, or are they all joined into one cell?
  5. Saved templates. Can you save a column layout per job, such as “production” and “accounting”, so nobody rebuilds it each time?
  6. Spreadsheet settings. Can you pick a semicolon delimiter and a date format? European Excel installations often expect semicolons.
  7. Date range and access. Shopify apps can read only recent orders unless they have been granted access to all orders, so check how far back you can export.
  8. Where your data goes. Ask whether order data is stored on the app’s servers, and for how long.

Option 3: Build a custom export

If the export feeds another system every day, a small custom integration can be the right tool. Developers use the Admin GraphQL API and, for large volumes, bulk operations. A bulk query returns a JSONL file in which each child record, such as a line item, sits on its own line with a __parentId pointing back to its order. Your code then joins each item to its order, which gives you one row per line item with whatever columns you need, including the line item’s customAttributes (its properties).

Building it is the easy part. Keeping it running is the work: API versions expire, webhooks get missed, and someone needs to notice when a nightly file is empty. Our checklist for Shopify integrations that don’t break covers what to plan for. If the export is a one-off or a weekly manual step, an app or a spreadsheet is usually enough.

Pitfalls that affect every option

  • Leading zeros. Excel turns SKU 00123 into 123 and some ZIP codes lose their first digit. Import the CSV with those columns set to Text instead of double-clicking the file.
  • Commas and line breaks inside text. Gift messages and notes can contain both. A proper CSV quotes those cells; if columns shift after import, the file or the import step is mishandling quotes.
  • Encoding. Shopify’s CSV is UTF-8. If names show as é instead of é, import the file with UTF-8 encoding.
  • Refunds and edits. An exported row shows the order as it was when you exported. Edited or refunded orders need a fresh export before you rely on the numbers.
  • Mixed jobs in one file. A production sheet and an accounting sheet need different columns and different row modes. Two saved layouts are easier than one file that tries to do both.

The same CSV habits apply to products. If you also move catalog data in and out of Shopify, see our guide to the Shopify product CSV, which uses the same “one item, several rows” structure for variants.

Putting it into a weekly routine

A routine that works for most small teams:

  1. Filter the Orders list to the batch you need, for example unfulfilled orders from the last two days.
  2. Export with the line-item layout your team uses for that job.
  3. Work from the file: make, pick or pack by SKU.
  4. Fulfil and tag the batch in Shopify so the next export does not pick it up again. Our guide to bulk fulfilling and tagging Shopify orders walks through that step.
  5. Save the file with the batch date, so you can check later what was sent to production.

Where StoreFleet: Order Export fits

We built StoreFleet: Order Export for this job. It exports to CSV or XLSX with a choice of one row per order or one row per line item. In line-item mode the order columns repeat on every row, while order money columns are written on the first row only, so sums stay correct. Each line-item property can be its own column, and the export runs in your browser. The app is in review for the Shopify App Store.

FAQ

Why are there empty rows in my Shopify order export?

They are not empty orders. When an order has several line items, Shopify puts each extra item on its own row and leaves many order-level fields blank to show that the items belong to the same order. The order number in the Name column ties them together.

Can Shopify export one row per line item with all order details filled in?

Not from the standard export. You can fill the blanks in a spreadsheet, use an export app with a line-item row mode, or build a custom export with the Admin API.

Does the Shopify order export include line-item properties?

No. The standard export has no column for line-item properties such as engraving text or upload links. You need an app or a custom export to get them into their own columns.

Why do my order totals look too high after filling down?

You probably copied order totals onto every item row. Totals belong to the order, so count them once per order, and use Lineitem price times Lineitem quantity for item-level revenue.

Sign in to your workspace

Each workspace has its own address: <workspace>.getstorefleet.com. Enter your workspace name, or paste its address, and we take you to its sign-in page.

You will go to

New to StoreFleet? Create a workspace