The manual version takes an hour on Monday. Export the sales report from Shopify, paste it into the workbook, add last week's ad spend from the ads dashboards, drop in the cost per unit from a tab someone updated in March (nobody has checked it since), and send the summary to the founder and the head of ops.
To automate Shopify reports, the useful distinction is between the part Shopify can schedule on its own and the part that needs data from outside the store. Scheduled exports handle the first. The second is where the hour goes, and it is the reason the workbook still exists.
What Shopify can schedule on its own
For a single store, the built-in reporting is better than its reputation. Sales by product, by channel, by discount code, returning customer rate, and a scheduled export to email on a cadence you set: if the question lives entirely inside the store, use what you already pay for and stop reading here.
The limits are the same three every time. The store knows what it charged, not what the product cost you once inbound freight and co-packing are counted. It knows discount codes, not what you spent to acquire the order. And it knows one store, so a brand running a second Shopify storefront for a region or a subscription line has two sets of numbers that need adding up somewhere else.
The report that gets opened
The weekly report that gets opened has four things in it, and only one comes from Shopify.
| What the report shows | Where it comes from |
|---|---|
| Units and net revenue by product | Shopify, after discounts and returns |
| Contribution after cost and fees | ERP or accounting for landed cost, payment fees from the gateway |
| Acquisition cost against revenue | Ad platforms, matched to the same week |
| Total demand including wholesale | ERP shipments and retailer sell-through |
Once the report crosses the store boundary, the work is no longer scheduling. It is making a product in Shopify the same product as the one in the ERP and the one in the retailer file, and making a week mean one thing across four systems that each have an opinion about when a week ends.
The steps to automate Shopify reports, in order
Work in this sequence, because each step makes the next one cheap.
- Write down what the report answers and who reads it. A report with two audiences becomes two reports, and pretending otherwise is how it grows to eleven tabs.
- Connect the sources rather than exporting them: the store, the ERP or accounting system, the ad platforms, and the wholesale feeds. A scheduled export that someone still opens is not automation.
- Resolve the product. One record per product across Shopify variants, ERP SKUs, marketplace listings and retailer item numbers, with pack conversions stated.
- Define the measures once. Net revenue after discounts and returns, landed cost, contribution, and the week that everything converts into. These are the definitions the report stands on.
- Generate the report on a schedule, with the source rows reachable from every figure, so a question about a number does not become an investigation.
- Add the exceptions worth waking up for: a SKU below coverage, acquisition cost above a threshold, a feed that did not arrive.
Steps three and four are the ones teams skip, and skipping them is why the workbook is back within two months without anyone deciding to bring it back.
- Store data only
- Cost pasted in by hand
- Stops when someone is away
- Store, ERP, ads, wholesale
- Measures defined once
- Every figure traceable
Where we come in
This is the point the manual process fails, and it is the job we built Permute for. We connect Shopify, NetSuite or QuickBooks, Google Analytics, Klaviyo, the marketplaces and the rest of the systems we connect, then hold one record per product across all of them. Net revenue, landed cost, contribution and the reporting week are written once as explicit rules in the Ontology layer, so the weekly report, a dashboard and a plain-language question return the same figure rather than three that need reconciling. The report is generated on a schedule and delivered as an artefact people can forward, with every number traceable to the rows behind it: this order, this settlement, this cost version. When the ad platform lags, the report says so instead of showing a flattering acquisition cost.
The limits are the same ones we state everywhere. We read from Shopify and never write back into it, so a price or inventory change still happens in the store. We are not an accounting system and do not replace the close. And the judgement in the report, what to do about a product losing contribution in one channel, stays with the person who owns the outcome.
Generate next Monday's report instead of building it
Connect Shopify, your accounting system and one ad platform, then ask for last week's contribution by product.
What stays manual, and should
Two things are worth keeping in human hands. The commentary is one: a report that explains why a number moved is more useful than one that only shows the movement, and the explanation comes from someone who was in the promotion meeting.
The other is the definition change. When the team decides that shipping subsidy should come out of net revenue rather than sit below it, that is a decision with consequences for every prior week, and it should be made deliberately and dated rather than edited into a formula on a Friday afternoon.
For the neighbouring jobs, SKU-level margin analysis across channels covers the cost work behind contribution, and How to automate POS data analysis covers the wholesale half of demand when retailer feeds are involved. Consumer brands deciding between this and another analyst will want what it costs in front of them.
Bring last Monday's report
We will show which parts can be generated from your connected systems and which ones need a definition first.
Questions ecommerce teams ask about Shopify reporting
Can Shopify email a report on a schedule by itself?
Yes, for reports built from store data, and that covers a real share of what small teams need. The scheduled export is the right tool when the question does not leave the store.
The moment the report needs landed cost, ad spend or wholesale volume, the schedule stops being the hard part and the join becomes it.
What about two or more Shopify stores?
Each store reports on itself, so the combined view has to be assembled outside them. The work is a product mapping question first: the same physical product often exists as different variants with different SKUs in each store.
Once the product resolves to one record, a combined report is the same job as a single-store one.
How should ad spend be matched to revenue?
At the same grain and on the same week as the revenue, which usually means product or collection level rather than campaign level, and it needs one attribution rule stated in advance. Platform-reported conversions and store-reported orders will not agree, and picking one as the reporting basis is better than blending them.
Where the two are far apart, showing both with their sources named is more honest than publishing a single number nobody can defend.
Do we need a data warehouse first?
No. Where a brand already runs BigQuery or Snowflake we work on top of it, and where there is none we do not require one to be bought first.
The decision that matters is not the storage but who owns the definitions, because that is the part that decays without an owner.