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
- Sh
Trigger
Daily at 06:30 in the shop's timezone (n8n Schedule Trigger), then an orders pull for the previous calendar day
Shopify
- 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.
- 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.
- 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.
- 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.
- 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.
- 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- HGSSMade to order
HubSpot pipeline snapshot → Google Sheets trend + Monday Slack summary
Every Monday at 07:00, open pipeline by stage and owner, in Slack and on a trend sheet.
Reporting & dashboards$99 - CaGSGMade to order
Calendly interview booked → Google Sheets tracker + Gmail interviewer pack
Interviewers get the candidate's file the moment the slot is booked, not the morning of.
Hiring, onboarding & HR$99 - GSGMade to order
Google Sheets employee roster → Gmail probation and review reminders
Managers hear a week before each probation end and review date, from the roster sheet.
Hiring, onboarding & HR$49
