Automation library

Automate a daily sales report from Shopify and Amazon to Slack or email

Updated · By Ecomsellertool editorial team

Short answer

To automate a daily sales report, run a scheduled job each morning once yesterday has closed in one agreed time zone. It pulls orders, revenue, units, refunds, ad spend and stock from Shopify, Amazon and your ad accounts through their APIs, computes each metric from a written spec, bolds lines that cross a threshold and posts the summary to Slack or email. AI only writes a short note.

  • Shopify's net sales are gross sales minus discounts and sales reversals; returns count on the day they are processed (checked October 3, 2026).
  • Amazon's Sales API returns ordered product sales, units and orders, with an IANA time zone setting the day boundary.
  • Amazon's Finances API notes that financial events might not include orders from the last 48 hours.
  • Rules compute every number; an AI model only writes a two-to-three-sentence note on what changed.

The step map: who runs each step

Trigger: A daily schedule, for example 8:00 a.m. in the reporting time zone, after yesterday has closed in every source.

Each step of the workflow in order, and whether a fixed rule, an AI model or a person runs it
StepWhat happensWho runs it
1At the scheduled time the job fixes yesterday's window: midnight to midnight in the one reporting time zone written in the spec, converted to each source's own time format.Rule
2It pulls Shopify sales through ShopifyQL, Amazon ordered product sales, units and orders through the Sales API, Amazon refunds through the Finances API, ad spend from each ad account's reports and FBA and warehouse stock.Rule
3Each source is checked before it is used: a source that failed, returned nothing on a normal trading day or is still inside its known delay is marked as missing, never shown as zero.Rule
4Every metric is computed from the report spec, with the same definition, source and rounding every day, and compared with the same weekday over the last four weeks.Rule
5Lines that cross an alert threshold in the spec are bolded, and SKUs below their days-of-cover minimum are listed under stock warnings.Rule
6An AI model reads the finished table and writes a two-to-three-sentence note on what changed and which line to look at first. It never adds or changes a number.AI model
7A rule checks that every number in the note appears in the table, then posts the summary to Slack through an incoming webhook or sends it by email; if the check fails, the summary goes out without the note.Rule
8The owner of each bold line reads the evidence, decides what to do and replies in the thread.Person

6 rule steps · 1 AI model step · 1 person step. A rule follows fixed logic you approve; an AI model handles messy input and its output is checked by rules; a person makes the calls listed below.

Person

What stays with a person

  • The report spec itself: which metrics, which definitions, which time zone and which thresholds, signed off once and changed on purpose
  • Every bold line: the report flags it, a named person decides what to do about it
  • Any change to ad budgets, prices or purchase orders that a bold line suggests
  • A day the numbers disagree with Shopify Analytics or Seller Central by more than the agreed tolerance
Tools

Which tools can run it

  • Shopify Flow's scheduled workflow with an internal email, for a small Shopify-only order count
  • Zapier, Make or n8n on a schedule writing to a sheet, for one store and one marketplace with a few metrics
  • Custom code on your accounts, for Shopify, Amazon and ad accounts together, a stored history and alert rules per SKU

Systems it connects

  • Shopify (Admin API, ShopifyQL)
  • Amazon SP-API: Sales, Finances, FBA Inventory
  • Amazon Ads API
  • Other ad accounts (optional)
  • Warehouse or 3PL stock feed
  • Slack incoming webhook or email

Build size: Medium

Pulling the numbers is quick; agreeing one definition, one time zone and one cut-off per metric is the real work.

Most daily sales reports die the same way. Someone builds them by hand, the numbers never quite match Shopify or Seller Central, and after a month nobody trusts them. The fix is not a prettier dashboard. It is a written spec: what each number means, where it comes from, which hours count as "yesterday" and when a line deserves attention. This recipe starts with that spec, then automates it: a job pulls the numbers each morning, rules compute them the same way every day, and a short summary lands in Slack or email. It is one page of our automation library.

What goes into a daily sales report spec?

One row per metric, each with an exact definition, one source and one rule that makes the line bold. Fill this in before anyone writes code. The thresholds below are illustrative starting points for a brand selling on Shopify and Amazon; set your own from a few normal weeks. "Baseline" means the average of the same weekday over the last four weeks, so a quiet Sunday is compared with other Sundays.

MetricExact definitionSourceBold when (illustrative)
Shopify net salesGross sales minus discounts minus sales reversals, as Shopify defines it; shipping and duties not includedShopify Admin API, ShopifyQL on the sales dataset20% or more below baseline
Amazon ordered product salesTotal ordered product sales for orders placed in the window, per marketplaceSP-API Sales API, totalSales20% or more below baseline
Orders and unitsOrders and units per channel in the window; Amazon from orderCount and unitCountShopifyQL; SP-API Sales API25% or more below baseline
RefundsShopify: returns on the day they are processed. Amazon: refunds posted in the window, reported two days lateShopifyQL; SP-API Finances APIAbove 2 times the baseline share of sales
Ad spendSpend per ad account for the window, in the report currencyAmazon Ads API reports; other ad accounts the same way30% above or below baseline
TACoSAd spend ÷ total sales (organic and ad-attributed) × 100, per channelComputed from the rows aboveAbove the target the team sets, for example 12%
Stock warningsSKUs whose days of cover is below supplier lead time plus a bufferFBA Inventory API, Shopify locations, 3PL feedAlways listed when any SKU qualifies
Data statusEach source: fresh, late or missingThe job's own checksAny source late or missing

Two lines on this sheet cause most arguments, so settle them in writing. First, which sales number. Shopify's sales report definitions separate gross sales, net sales and total sales, where total sales adds shipping, duties, fees and other charges on top (checked October 3, 2026). Amazon's ordered product sales is a different measure again. Pick one per channel, name it in the report and never add the two under a single label. Second, refunds. Shopify shows a return on the date it is processed, not the date of the order, so yesterday's refunds can belong to last month's sales. That is fine as long as everyone knows it.

Which time zone and cut-off should the report use?

One reporting time zone for every source, written at the top of the spec. Most brands use the time zone of their main store. Shopify's Shop object exposes the store's IANA time zone, so the job can read it instead of hard-coding it. "Yesterday" then means midnight to midnight in that zone, and nothing else.

Amazon's Sales API is built for this. Its getOrderMetrics model takes an interval whose first date is inclusive and second exclusive, and a granularityTimeZone in IANA form that sets the day boundary; it is required for daily or longer granularity (checked October 3, 2026). Pass the same zone you use for Shopify and the two channels count the same hours. For every other source, check which day boundary its reports use and note it in the spec. If a source cannot report in your zone, say so on the report line rather than mixing days quietly.

The cut-off has a second half: late data. Amazon's listTransactions reference warns that financial events might not include orders from the last 48 hours (checked October 3, 2026). So the spec reports Amazon refunds with a two-day lag, labelled as such, instead of showing a falsely low number for yesterday. Run the job late enough in the morning for every source to have closed the day, and have each line say "late" or "missing" when a source has not, never zero.

Where does each number come from?

From each system's own API, so nobody copies numbers by hand. Shopify's shopifyqlQuery runs a ShopifyQL query, such as total sales from the sales dataset, and returns a table. It needs the read_reports scope and level 2 access to protected customer data, which matters when you set up the app (checked October 3, 2026). Using Shopify's own reporting language keeps your report close to what the team sees in Shopify Analytics.

On Amazon, the Sales API returns totalSales (total ordered product sales), unitCount and orderCount, and can filter by B2B or B2C buyers and by Amazon or merchant fulfillment. Its rate limit is 0.5 requests per second with a burst of 15, which is plenty for one daily call per marketplace. The Sales and Traffic report adds ordered product sales, units ordered, page views and Buy Box percentage by day if you want traffic lines too. Stock comes from the FBA Inventory API, which returns fulfillable, inbound, reserved and unfulfillable units at the marketplace level (all checked October 3, 2026). All of these sit behind Amazon's Selling Partner API.

Ad spend comes from the Amazon Ads API, which Amazon describes as a way to report on advertising activity and build custom reporting dashboards (checked October 3, 2026); see our Amazon Ads API entry. Other ad accounts are added the same way, one row each. Amazon Ads defines ACOS as ad spend divided by ad revenue (checked October 3, 2026). The report uses TACoS instead, because it divides by all sales and so shows what advertising costs the whole business; our ACOS entry explains the difference.

What does the AI model do, and what does it never do?

It writes the note at the top. Nothing else. By the time the model sees the data, rules have computed every number, compared it with the baseline and bolded what crossed a threshold. The model gets that finished table and writes two or three plain sentences: what changed, the likely place to look and which bold line matters most. An illustrative example: "Amazon sales were 24% below a normal Tuesday while ad spend held steady, so TACoS rose to 15%. Two SKUs on the stock list are out at FBA, which may explain most of the drop."

The model never computes a metric, fills a gap or rounds a number. A rule reads the note before it goes out and checks that every figure in it appears in the table. If one does not, the summary is posted without the note. That keeps the useful part of AI, a quick read of what changed, without letting it invent a revenue figure the team then repeats in a meeting.

How should the report reach Slack or email?

Short, in a fixed order, the same every day. Channel totals first, then refunds, ad spend and TACoS, then stock warnings, then the data status line. Bold lines carry the name of the person who owns them. Slack's incoming webhooks give you a unique URL for one channel that accepts a JSON POST and supports markdown formatting and Block Kit. Slack warns that the URL contains a secret and revokes leaked ones, and a message posted through a webhook cannot be deleted (checked October 3, 2026), so test in a private channel first and store the URL like a password.

Email works the same way for people who live in their inbox. Whichever you choose, keep a copy of each day's table in a database or sheet. Baselines need history, and when someone asks why last Tuesday looked odd, the answer should be one lookup away.

Which tool should run it?

The simplest one that reaches every source you report on.

LevelFits whenWhat to know
Shopify Flow, scheduledShopify only, small order countOur Shopify Flow guide covers the scheduled report and its limits; no Amazon or ad data
Zapier, Make or n8n on a scheduleOne store, one marketplace, a few metricsKeep the spec in the sheet; log each run so a silent failure shows up
Custom code on your accountsShopify, Amazon and ad accounts, history, per-SKU stock warningsCan run on Ecomsellertool Growth OS beside your other data flows

If you also want the money side, the payouts to QuickBooks or Xero recipe reconciles what actually landed in the bank, and the low-stock alerts and draft purchase orders recipe turns the stock warnings here into draft orders a buyer approves. Our guide to what to automate first explains why reports come after stock and order data are clean.

One account’s screen, from software we built
Lavley: Sales, units, expenses, refunds and net profit in one view
Lavley

Sales, units, expenses, refunds and net profit in one view

Read the Lavley case study ↗

Who builds this for ecommerce brands?

Ecomsellertool builds reporting workflows like this one on your own accounts. For Beezboard we built a seller dashboard that compares sales for today, yesterday, the last 7 and the last 30 days with the previous period, and charts ad spend, refund cost and organic and PPC sales. We write your spec first, then build the pulls, checks and posts. Send a project brief or read about our workflow automation service.

Related work we have shipped:

  • Ads and sales in one view. For Lavley we built sales analytics that combine Amazon sales, inventory and advertising reports, with ACOS and ROAS calculated from the advertising data and sales goals set by brand and product type.
  • Fresh order data. Beezboard's order updates run through an SQS queue, so the numbers on the dashboard follow order activity instead of waiting for a nightly batch.

Get this workflow built

Send us the report you want every morning

Describe the workflow you want automated. We reply with a written plan: scope, timeline and a fixed price.

A few sentences is enough: what happens today, who does it and how often.

Starts when you fill in the form

A quick private check that runs in your browser. No tracking, no puzzles.

A person reads every brief. You get a written plan within 2 business days; no obligation.

Frequently asked questions

How do I send a daily Shopify sales report to Slack?

Schedule a job each morning that queries yesterday's sales from Shopify's Admin API, for example with ShopifyQL, formats a short summary and posts it to a Slack incoming webhook, which is a unique URL for one channel. Keep the webhook URL secret. For a small Shopify-only store, a scheduled Shopify Flow workflow that emails the team may be enough.

Why does my report not match Shopify Analytics or Seller Central?

Usually because of definitions and day boundaries. Shopify's net sales subtract discounts and returns, and returns count on the day they are processed. Amazon's ordered product sales count orders when placed. If your report uses a different time zone, a different sales figure or counts refunds on the order date, the totals will differ. Write each definition down and use one time zone.

What metrics should a daily ecommerce report include?

Keep it short: revenue by channel, orders, units, refunds, ad spend and TACoS, plus a list of SKUs running low on stock. Each line needs a written definition and a source, and a threshold that makes it stand out. Anything nobody acts on in a normal week can move to a weekly report.

How do I calculate TACoS for a daily report?

Divide yesterday's total ad spend by yesterday's total sales for the same products and marketplace, and multiply by 100. Total sales covers organic and ad-attributed orders. On a single day the number is noisy, so compare it with the same weekday over the last four weeks before you act on it.

Can AI write the daily sales report?

It can write the note, not the numbers. In this recipe rules compute every metric and set every alert, and an AI model only writes two or three sentences on what changed. A rule then checks that every number in the note appears in the computed table; if one does not, the report goes out without the note.

Do I need a BI tool instead of a Slack report?

If people need to slice data by SKU, channel and period every day, a BI or analytics tool is the better choice. A daily Slack or email report does one job: tell the team at a glance whether yesterday was normal and which line needs a person. Many brands run both, from the same definitions.

Jaimin Dholakia, founder of Ecomsellertool
Jaimin Dholakia · Founder
Schedule a call

Get this workflow built on your own systems.

Prefer to talk the workflow through first? Schedule a free call with the engineers who would build it. Selling on Amazon? The free 24-hour diagnostic finds the operations gaps in your account: connect it with Login with Amazon, on Amazon’s own consent screen (we only read data; we never change listings, prices, stock or ads), and get a report within 24 hours of connecting, on business days.

Free · 30 minutes · Pick any open slot