Getting Shopify data into Google Sheets

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.

The export is easy; keeping it current isn't

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.

Three ways to get there

All three end in a spreadsheet. They differ in who repeats the work each month.

The admin CSV export

Orders → Export, pick a range, receive a CSV by email and import it into Sheets.

  • Built in, free, no setup, available to anyone with admin access
  • Exactly right for a one-off reconciliation
  • Manual every time, and the file arrives by email
  • One row per line item, with order fields only on the first row
  • Nothing stops two people producing two different versions of the same month

A Sheets add-on or Shopify app

A marketplace add-on that connects to your store and refreshes chosen reports into tabs on a schedule.

  • Genuinely automatic — the tab updates without you
  • Usually ships pre-built report shapes worth having
  • Subscription, typically per store or per user
  • A third party holds a token to your shop and your data passes through it
  • You get its report definitions; custom questions hit a wall

A script on the Admin API

Apps Script calling the Shopify Admin API with a scoped custom-app token, writing results into the sheet on a trigger.

  • Any shape you want, including joins Shopify's exports won't give you
  • No third party in the middle — your token, your code
  • Free beyond the time it takes to write
  • Rate limits and pagination become your problem
  • Apps Script quotas bite on large pulls
  • It's code in a spreadsheet that only its author understands

A queryable copy from BeQuery

Not yet

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.

  • Would let you aggregate in SQL first, so the sheet holds answers instead of raw line items
  • Publish once, and Sheets keeps itself current with no add-on subscription
  • Not available for Shopify today — early-access list only
  • For now, the three columns above are the real options

The route that works today, step by step

  1. 1

    Decide whether this is one-off or recurring

    Genuinely worth thirty seconds. If it's one-off, the admin export is the answer and you're done — nothing below is needed.

  2. 2

    Export from the admin, or connect an add-on

    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.

  3. 3

    Fix the line-item shape immediately

    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.

  4. 4

    Aggregate, then chart

    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.

Is a spreadsheet the right home for this?

For a lot of Shopify reporting, yes — the export is right there. The line where it stops being true is fairly clear.

Yes — Sheets earns its place

  • You're modelling by hand: margins, targets, scenarios Shopify doesn't hold
  • Someone in finance or ops wants the numbers in a sheet, not a dashboard
  • The output is a summary a person reads

You've outgrown it — use a dashboard instead

  • The report is really a dashboard: several people open it and nobody edits a cell
  • You're exporting line items by the hundred thousand and pivoting in the sheet
  • Two exports of the same month have already disagreed

Common questions

Why don't my order totals match Shopify's reports?

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.

Can BeQuery publish a Shopify query as a self-refreshing link?

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.

How much data can a spreadsheet actually hold?

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.

We're building this for Shopify

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.