Shopify orders export to dashboard

Your Shopify export, one row per line item and all.

Export orders from the Shopify admin, drop the CSV here, and the dashboard reads it the way Shopify writes it: one row for every line item, with Subtotal, Shipping, Taxes and Total filled in only on the first row of each order. Those order-level values are carried down internally so nothing gets counted twice, and product performance is built from the Lineitem columns.

Prefer the full explorer? Open the app, or start from the generic dashboard builder.

Line items understood
Order-level columns are read once per order, never once per row.
Product mix from Lineitem
Lineitem name and quantity drive the product panels, at the level they belong to.
Read in your browser
Shipping addresses and order names never leave the tab.
No signup
No account, no trial, no card. Reload and it is gone.

The file has two shapes stacked on top of each other

A Shopify orders export is really two tables interleaved. There is an order table, with Name, Created at, Financial Status, Subtotal, Shipping, Taxes and Total, and there is a line item table, with Lineitem name, Lineitem quantity and Lineitem price. Shopify writes both into one flat CSV by giving each line item its own row and filling the order-level columns on the first row of the order only. Every row after that has a value like #1042 in Name and blanks where the money should be.

This is fine until somebody sums the Total column. If an order has three line items, Total appears once and the blanks contribute nothing, so a plain SUM is actually right for once. Then someone forward-fills the blanks to make the file tidy, sums again, and the same order gets counted three times. I have seen a store report triple its revenue this way and only catch it because the number was implausible. This page keeps the two tables separate in its head and tells you which panels are order-level and which are item-level.

How to export from Shopify

  1. Open Orders in the Shopify admin Sign in at admin.shopify.com and pick Orders in the left sidebar. If you run several stores, check the store name at the top left first, because the export follows the store you are currently in and nothing in the filename will remind you.
  2. Filter before you export Whatever filter is on the order list is what gets exported. Set a date range wide enough to be interesting, a full quarter rather than the default recent window, and clear any status filter unless you specifically want to exclude cancelled orders.
  3. Click Export and pick your scope Shopify offers the current page, all orders matching the filter, or a custom date range. Choose Orders rather than Orders with transactions unless you need the gateway detail, because the transaction version repeats rows again for every payment event.
  4. Take the plain CSV The dialog offers CSV for Excel and plain CSV. Take plain CSV. The Excel flavor is the same data with a byte order mark in front, which some readers show as stray characters on the very first column name.
  5. Collect the file and drop it here Small stores get an immediate download; anything large is emailed to the staff account that ran the export. Drop the file on this page and the product breakdown appears before you have finished reading the confirmation email.

The same export can be produced from Analytics, then Reports, then Sales by product, but that version is pre-aggregated and loses the per-order structure. Use the Orders export if you want to slice it yourself.

Try with sample Shopify data (the same columns, 104 rows, no upload needed).

What the dashboard shows

Every panel below is built from a column that is actually in the export, named the way Shopify names it.

  • Orders and revenue over time. Created at is the axis. Revenue comes from the order-level Total, counted once per distinct Name, so the multi-item orders do not inflate the line.
  • Top products by units and value. Lineitem name ranked by summed Lineitem quantity, and separately by quantity times Lineitem price, which reorder the list more often than you would expect.
  • Financial and Fulfillment Status. Paid, pending, refunded and partially_refunded against fulfilled, unfulfilled and blank, as a two-way split you can click through.
  • Discount code performance. Discount Code grouped against order value, so you can see whether the free shipping code was pulling its weight.
  • Shipping revenue against shipping country. Shipping summed per Shipping Country, which is the fastest way to notice you are subsidizing one region.
  • Billing against shipping geography. Two country columns on one map, and the rows where they disagree are usually gifts, resellers or fraud worth a second look.
Sample header row
Name,Created at,Financial Status,Fulfillment Status,Currency,Subtotal,Shipping,Taxes,Total,Discount Code,Lineitem quantity,Lineitem name,Lineitem price,Billing Country,Shipping Country

Six things the Shopify orders CSV does that surprise people

  • One row per line item. An order with four products is four rows. Counting rows counts items, not orders. The distinct count of Name is your order count, and it is often twenty to forty percent lower than the row count.
  • Order columns are blank on continuation rows. Subtotal, Shipping, Taxes, Total, Financial Status and Fulfillment Status appear only on the first row of each order. They are not missing data and they must not be forward-filled before totaling.
  • Name is the order number. It looks like a customer field and it is not. It is the storefront order name, usually a hash followed by digits, and it is the only reliable key for grouping rows back into orders.
  • Lineitem price is per unit. Not the extended amount. The line value is Lineitem price times Lineitem quantity, and a store with a lot of multi-quantity carts will badly understate product revenue if it forgets to multiply.
  • Total already includes tax and shipping. Subtotal plus Shipping plus Taxes should reconcile to Total, less any discount. Adding Shipping to Total to get what the customer paid charges them for postage twice.
  • Created at carries a store offset. It is an ISO timestamp with the store timezone appended rather than UTC. Move the store timezone and old rows keep the old offset, so a long export can contain two different offsets in one column.

Group by Name before you total anything, multiply Lineitem price by quantity before you rank anything, and the file behaves. The structure is deliberate on Shopify's part, since a flat CSV has to encode a parent and child relationship somehow, and this is the least bad way to do it.

Frequently asked questions

Why does my Shopify export have more rows than orders?

Because each line item gets a row. An order containing a shirt, a hat and a sticker is three rows in the file, with the order number repeated in the Name column and the money columns filled in only on the first of the three. Count distinct values of Name for a true order count. Row count answers a different question, which is how many items you shipped.

Why are Subtotal and Total blank on most rows?

They are order-level values and Shopify writes them once, on the first row belonging to each order. Blank means the value already appeared above, not that it is missing. The danger comes from tidying up: fill those blanks downward and then sum, and a three-item order contributes its total three times. This page holds the order and line item views separately so that cannot happen.

How do I get revenue by product from this file?

Use the line item columns, not the order columns. Multiply Lineitem price by Lineitem quantity for each row, then group by Lineitem name. That gives item revenue before order-level discounts and shipping, which is the right basis for comparing products against each other. The order Total cannot be attributed to a single product when the order contained several.

Does the export include refunded and cancelled orders?

It includes whatever your filter included. Financial Status shows refunded and partially_refunded, and cancelled orders appear unless you filtered them out. There is no separate negative refund row and no refund amount column in the standard orders export, so a partially refunded order still shows its original Total. Group by Financial Status early so you know how much of the quarter is affected.

Should I choose CSV or CSV for Excel?

Plain CSV. The Excel variant is identical data with a byte order mark prepended so that Excel opens it in UTF-8 without mangling accented product names. Tools that do not expect that marker show it as three odd characters glued to the front of the first column name, which then fails to match anything. This page strips it either way, but plain CSV saves the confusion elsewhere.

Is my customer and address data uploaded?

No. The CSV is parsed by JavaScript in the tab you have open and the charts are drawn from memory. A Shopify orders export carries order names and both billing and shipping countries, and depending on which columns you kept it can carry a great deal more. There is no upload endpoint here, so there is nowhere for it to go even accidentally.

Load a Shopify export shaped like a real one

104 rows covering a quarter of orders, multi-item carts with blank continuation rows, discount codes and a couple of refunds. Exactly the file that breaks a naive SUM.

Open the sample Shopify dashboard