Shopify exports to CSV in two clicks, so this looks solved. It is, right up until you want last month's numbers again without repeating the two clicks.
Shopify's admin exports orders, products and customers to CSV directly. For a one-off — reconciling a month, handing a list to an accountant — that's genuinely the right answer, and no tool needs to be involved.
The problem is repetition. The export arrives by email as a file, so a monthly report means someone doing the same clicks, dropping the file in the same place, and re-pointing the same pivot at a new range. It drifts: two people export slightly different date ranges or statuses, and the totals disagree.
The second problem is shape. The orders CSV has one row per line item, with the order-level fields only filled in on the first row of each order. Sum the total column naively and you'll be roughly right by accident on single-item orders and wrong on everything else. It's the single most common way a Shopify spreadsheet is quietly incorrect.
And the ceiling is real: Sheets caps a spreadsheet at 10 million cells, which a busy store's line-item export reaches faster than you'd think.
All three end in a spreadsheet. They differ in who repeats the work each month.
Orders → Export, pick a range, receive a CSV by email and import it into Sheets.
A marketplace add-on that connects to your store and refreshes chosen reports into tabs on a schedule.
Apps Script calling the Shopify Admin API with a scoped custom-app token, writing results into the sheet on a trigger.
For MySQL stores we clone the database and publish saved queries as links a sheet refreshes by itself. Shopify needs an API connector, which is in development.
Genuinely worth thirty seconds. If it's one-off, the admin export is the answer and you're done — nothing below is needed.
Orders → Export for a file, or install an add-on and pick the report if this has to refresh on its own. Whichever you choose, fix the date range and the order statuses in writing so next month's version means the same thing.
In the orders CSV, order-level values appear only on the first row of each order. Before you build anything, either aggregate line items per order id, or work strictly at line-item level. Deciding this once prevents the totals disagreeing later.
Pivot to the summary you actually want — revenue by month, units by product, customers by cohort — and build charts on the summary rather than on the raw export. The raw tab is your source; nobody should be reading it.
For a lot of Shopify reporting, yes — the export is right there. The line where it stops being true is fairly clear.
Almost always the line-item shape. In the orders CSV each line item is its own row, and order-level fields like total and shipping only appear on the first row of each order — so summing the column double-counts nothing but misses most of it, or inflates it if you fill the values down. Aggregate per order id first, and agree which financial statuses count.
Not for Shopify yet. That feature exists today for stores we can clone — PrestaShop, WooCommerce and Magento — where you publish a saved query as a CSV link and Sheets refetches it hourly. Shopify needs the API connector we're building first. Until then, a Sheets add-on is the closest equivalent.
Google Sheets caps a spreadsheet at 10 million cells across all tabs. With a 20-column export that's roughly 500,000 rows, and it becomes sluggish well before the hard limit. Aggregated summaries are never a problem; raw line items from a busy store are.
BeQuery works today on stores with a MySQL database — PrestaShop, WooCommerce and Magento. Shopify is API-only, so it needs a dedicated connector, and that's in development. Put your email down and we'll tell you the day it opens.