Skip to content
Automation Squad
ShGSGMade to order

Reporting & dashboards

Shopify daily sales vs target → Google Sheets + morning Gmail report

Yesterday's Shopify sales against the month's target, emailed before the shop opens.

At 06:30 each morning the workflow pulls yesterday's paid orders from Shopify and turns them into net sales, order count and average order value. One row goes to a Google Sheet. Month-to-date is compared with the figure in the sheet's Targets tab, and the result reaches you by Gmail. Store owners see the same three numbers each day without opening Shopify, and a slow month shows up in its first week rather than on its last day.

How it works

  1. Sh

    Trigger

    Daily at 06:30 in the shop's timezone (n8n Schedule Trigger), then an orders pull for the previous calendar day

    Shopify

  2. Sh

    Step 1

    Pull yesterday's orders

    Shopify's order list covers 00:00 to 23:59 the previous day, with status set to any so cancelled orders come back too; each order carries financial status, cancelled_at, the test flag, current subtotal and discounts.

  3. if

    Step 2

    Work out net sales, order count and average order value

    A Code node drops cancelled and test orders, sums current_subtotal_price across paid and partially refunded orders, counts them, and divides for the average.

  4. GS

    Step 3

    Read the month's target and the days already logged

    This month's figure comes from the Targets tab, together with every Daily row for the current month, so month-to-date is a sum of real days rather than an estimate.

  5. if

    Step 4

    Compare month-to-date with the prorated target

    Month-to-date is set against the target prorated by days elapsed. Ahead or behind is stamped on the day, with the gap in the shop's currency.

  6. GS

    Step 5

    Append yesterday's row to the Daily tab

    Date, net sales, orders, average order value, month-to-date and gap to target land as one row, skipped if that date is already present. A chart on the Dashboard tab reads the Daily tab directly.

  7. G

    Step 6

    Email the morning report

    One short HTML email from your own Gmail address: yesterday's three numbers, month-to-date against target and a link to the sheet. It lands within minutes of 06:30.

What changes once it runs

  • Net sales, orders and average order value for yesterday arrive by email each morning, weekends included.
  • Month-to-date against the prorated target, in the shop's currency, sits in the same email.
  • Day by day the Daily tab becomes a full sales log, and the Dashboard chart draws from it without anyone opening Shopify's reports.
  • Targets live in a sheet tab you edit yourself. Change a month's number and the next morning's email uses it.

What you get

  • n8n workflow export with the Shopify pull, both Code nodes, the sheet reads and writes, and the Gmail send
  • Make blueprint for the same flow
  • Google Sheet template: Daily, Targets and Dashboard tabs with the month-to-date chart already built
  • Setup guide covering the custom app scopes, the timezone setting and exactly how net sales is calculated
  • Screen recording of the first morning run
  • The same orders pull written as a GraphQL query for the HTTP Request node, for stores that prefer Shopify's GraphQL Admin API

Before you start

  • Shopify on any plan, with a custom app created in the admin that has the read_orders scope and an Admin API access token.
  • A Google account with edit access to the sheet and the right to send from the Gmail address, connected to n8n through Google OAuth.
  • n8n Cloud on any plan, or self-hosted n8n 1.x, with its timezone set to match the shop.

Built for

Questions before you buy

How is net sales calculated, and can I change it?
Net sales is the sum of current_subtotal_price on paid or partially refunded orders that were not cancelled and are not test orders. Discounts and refunds are already out; shipping and tax are not counted. Comments in the Code node explain each line. Adding shipping or switching to gross is a one-line edit the guide points to.
Can it report to Slack instead of email?
Yes. Replace the Gmail node with a Slack node and paste the same message body; the guide includes the Slack version. Both can run from one workflow if you want the owner emailed and the team pinged.
Does it handle more than one currency, or more than one store?
Figures are reported in the shop's currency exactly as Shopify returns them. For a second store, duplicate the workflow with that store's credential and give it its own sheet tabs; the guide walks through it.
Shopify calls the REST Admin API legacy now. Will this keep working?
Shopify marked REST legacy in October 2024 and points new apps at GraphQL. As of this spec's review date, custom apps created in the admin can still call the REST endpoints the n8n Shopify node uses. Also in the package: the same pull as a GraphQL query for the HTTP Request node, so if REST access changes you swap one node rather than rebuild.
What if a morning run fails?
n8n stops the run and logs the node that failed. Re-run it from the executions list, or enable the included error workflow to email you the failure the same morning. Because the Daily tab is keyed by date and the workflow checks for an existing row before appending, a re-run never double counts.

Nearby on the shelf

Whole catalog