DEV Community

Alex Kane
Alex Kane

Posted on

5 n8n Automations Every Shopify Store Needs (Save 10+ Hours/Week)

Running a Shopify store is 20% selling and 80% repetitive operations. Every order triggers the same sequence: update the spreadsheet, notify the team, check stock, follow up with the customer. You do it manually, every day.

n8n connects to Shopify's API and webhooks out of the box — no coding required. Here are 5 automations that replace the busywork entirely.

1. Low-Stock Alert System

The problem: You don't notice a product hit 2 units until it's already sold out and you're getting angry customer messages.

What this workflow does:

  • Runs every hour via Schedule trigger
  • Calls the Shopify API to check all product inventory levels
  • Filters for items below your threshold (e.g., < 5 units)
  • Sends a Slack message or email with the product name and current stock count
  • Logs to Google Sheets for trend tracking

Nodes: Schedule Trigger → HTTP Request (Shopify Products API) → Filter → Slack/Gmail → Google Sheets

Time saved: ~30 min/week of manual inventory checking

{"name":"Low Stock Alert","nodes":[{"parameters":{"rule":{"interval":[{"field":"hours","minutesInterval":1}]}},"id":"s1","name":"Every Hour","type":"n8n-nodes-base.scheduleTrigger","typeVersion":1,"position":[240,300]},{"parameters":{"url":"https://YOUR_STORE.myshopify.com/admin/api/2024-01/products.json?limit=250","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","options":{}},"id":"s2","name":"Get Products","type":"n8n-nodes-base.httpRequest","typeVersion":4,"position":[460,300]},{"parameters":{"conditions":{"number":[{"value1":"={{ $json.variants[0].inventory_quantity }}","operation":"smaller","value2":5}]}},"id":"s3","name":"Low Stock Filter","type":"n8n-nodes-base.filter","typeVersion":1,"position":[680,300]},{"parameters":{"channel":"#inventory","text":"=⚠️ Low Stock: {{ $json.title }} — {{ $json.variants[0].inventory_quantity }} units left","otherOptions":{}},"id":"s4","name":"Alert","type":"n8n-nodes-base.slack","typeVersion":2,"position":[900,300]}],"connections":{"Every Hour":{"main":[[{"node":"Get Products","type":"main","index":0}]]},"Get Products":{"main":[[{"node":"Low Stock Filter","type":"main","index":0}]]},"Low Stock Filter":{"main":[[{"node":"Alert","type":"main","index":0}]]}}}
Enter fullscreen mode Exit fullscreen mode

Import: Workflows → New → ⋯ → Import from JSON → paste above. Replace YOUR_STORE with your Shopify subdomain.


2. New Order → Google Sheets + Team Notification

The problem: Every order needs to go into your spreadsheet and your fulfillment team needs to know — but Shopify doesn't send it there automatically.

What this workflow does:

  • Triggers on every new Shopify order via webhook
  • Appends the order to a Google Sheet (order ID, customer name, email, items, total, shipping address)
  • Posts a summary to your Slack #orders channel
  • Optionally sends the customer a personalized confirmation email

Nodes: Shopify Trigger → Google Sheets (Append) → Slack → Gmail

Time saved: ~1 hour/week on manual data entry and team communication

{"name":"New Order to Sheets","nodes":[{"parameters":{"topic":"orders/create"},"id":"o1","name":"Shopify Order","type":"n8n-nodes-base.shopifyTrigger","typeVersion":1,"position":[240,300]},{"parameters":{"operation":"append","documentId":{"value":"YOUR_SHEET_ID"},"sheetName":"Orders","columns":{"mappingMode":"defineBelow","value":{"Order ID":"={{ $json.id }}","Customer":"={{ $json.customer.first_name }} {{ $json.customer.last_name }}","Email":"={{ $json.email }}","Total":"={{ $json.total_price }}","Items":"={{ $json.line_items.map(i => i.name).join(', ') }}","Date":"={{ $json.created_at }}"}},"options":{}},"id":"o2","name":"Log to Sheets","type":"n8n-nodes-base.googleSheets","typeVersion":4,"position":[460,300]},{"parameters":{"channel":"#orders","text":"=🛍️ New order #{{ $json.id }} from {{ $json.customer.first_name }} {{ $json.customer.last_name }} — ${{ $json.total_price }}","otherOptions":{}},"id":"o3","name":"Notify Slack","type":"n8n-nodes-base.slack","typeVersion":2,"position":[460,480]}],"connections":{"Shopify Order":{"main":[[{"node":"Log to Sheets","type":"main","index":0},{"node":"Notify Slack","type":"main","index":0}]]}}}
Enter fullscreen mode Exit fullscreen mode

3. Competitor Price Monitor

The problem: Your main competitor drops their price by 20% and you're the last to know. By the time you notice, you've lost sales for three days.

What this workflow does:

  • Runs daily at 8 AM
  • Fetches competitor product pages (or uses a pricing API)
  • Compares prices against your stored baseline in Google Sheets
  • Triggers an email/Slack alert when a competitor price changes by more than 5%
  • Updates the price history log automatically

Nodes: Schedule → HTTP Request (competitor pages) → Code (parse + compare) → IF (price changed?) → Gmail/Slack → Google Sheets

Time saved: Replaces hours of manual competitor research every week. More importantly, it catches changes within hours instead of days.

This is one of the highest-ROI automations for e-commerce. I've built a complete ready-made version with setup guide at https://stripeai.gumroad.com.


4. Daily Sales Report to Email

The problem: You want to know how yesterday went before you start your day — without logging into Shopify, navigating to Analytics, adjusting the date filter, and waiting for it to load.

What this workflow does:

  • Fires at 7:00 AM every day
  • Pulls all orders from the past 24 hours via Shopify API
  • Calculates: total revenue, order count, average order value, top-selling product
  • Sends a clean 6-line summary to your inbox (or Slack)

Nodes: Schedule → HTTP Request (Shopify Orders API with date filter) → Code (aggregate) → Gmail

Time saved: 10 min/day — small but it compounds to 60+ hours/year

{"name":"Daily Sales Report","nodes":[{"parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"0 7 * * *"}]}},"id":"d1","name":"7am Daily","type":"n8n-nodes-base.scheduleTrigger","typeVersion":1,"position":[240,300]},{"parameters":{"jsCode":"const yesterday=new Date();yesterday.setDate(yesterday.getDate()-1);const start=new Date(yesterday);start.setHours(0,0,0,0);const end=new Date(yesterday);end.setHours(23,59,59,999);return[{json:{start:start.toISOString(),end:end.toISOString()}}];"},"id":"d2","name":"Set Date","type":"n8n-nodes-base.code","typeVersion":2,"position":[460,300]},{"parameters":{"url":"=https://YOUR_STORE.myshopify.com/admin/api/2024-01/orders.json?created_at_min={{ $json.start }}&created_at_max={{ $json.end }}&status=any&limit=250","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","options":{}},"id":"d3","name":"Get Orders","type":"n8n-nodes-base.httpRequest","typeVersion":4,"position":[680,300]},{"parameters":{"jsCode":"const ords=items[0].json.orders||[];const rev=ords.reduce((s,o)=>s+parseFloat(o.total_price||0),0);const aov=ords.length?rev/ords.length:0;const prod={};ords.forEach(o=>(o.line_items||[]).forEach(i=>{prod[i.title]=(prod[i.title]||0)+i.quantity;}));const top=Object.entries(prod).sort((a,b)=>b[1]-a[1])[0];return[{json:{count:ords.length,revenue:rev.toFixed(2),aov:aov.toFixed(2),top:top?top[0]+' ('+top[1]+' units)':'none'}}];"},"id":"d4","name":"Aggregate","type":"n8n-nodes-base.code","typeVersion":2,"position":[900,300]},{"parameters":{"sendTo":"YOUR_EMAIL","subject":"Daily Sales Report","message":"=Yesterday:\n\nOrders: {{ $json.count }}\nRevenue: ${{ $json.revenue }}\nAvg Order: ${{ $json.aov }}\nTop Product: {{ $json.top }}","options":{}},"id":"d5","name":"Email Report","type":"n8n-nodes-base.gmail","typeVersion":2,"position":[1120,300]}],"connections":{"7am Daily":{"main":[[{"node":"Set Date","type":"main","index":0}]]},"Set Date":{"main":[[{"node":"Get Orders","type":"main","index":0}]]},"Get Orders":{"main":[[{"node":"Aggregate","type":"main","index":0}]]},"Aggregate":{"main":[[{"node":"Email Report","type":"main","index":0}]]}}}
Enter fullscreen mode Exit fullscreen mode

5. Abandoned Cart Recovery

The problem: 70%+ of carts get abandoned. Shopify's built-in recovery emails are generic. A personalized follow-up sent at the right time converts significantly better.

What this workflow does:

  • Triggers on checkouts/create Shopify webhook
  • Waits 1 hour (using n8n's Wait node)
  • Calls Shopify API to check if the checkout was completed
  • If still abandoned: sends a personalized email listing the exact cart items + a discount code
  • Logs recovery attempts and outcomes to Google Sheets

Nodes: Shopify Trigger (checkouts/create) → Wait (1hr) → HTTP Request (check status) → IF (still abandoned?) → Gmail (personalized) → Google Sheets

Impact: Typically recovers 5-15% of abandoned carts. This is a direct revenue generator.

The Wait node is what makes this work — it pauses the workflow without blocking anything else, then resumes automatically. No cron jobs, no external queue needed.


How to Get Started

1. Install n8n (free)

npx n8n
Enter fullscreen mode Exit fullscreen mode

Or use n8n Cloud for a managed version. Self-hosted is free forever.

2. Connect Shopify

In n8n: Settings → Credentials → New → Shopify. You'll need your store domain and an API access token (Shopify Admin → Apps → Private apps → Create a private app).

3. Import any workflow above

Workflows → New → click the ⋯ menu → Import from JSON → paste the JSON.

4. Activate

Toggle the workflow to Active. Done.


Common Gotchas

Rate limits: Shopify's REST API allows 2 requests/second on the Basic plan. For the low-stock workflow checking 250+ products hourly, add a small delay between requests using n8n's Wait node if you hit 429 errors.

Webhook reliability: Shopify webhooks occasionally miss events (~0.1% rate). For critical workflows (order logging), also run a scheduled polling backup that catches anything missed.

Currency: Shopify returns prices as strings ("19.99"), not numbers. Use parseFloat() in Code nodes before doing math.


Get the Pre-Built Versions

Building these from scratch takes time — especially the competitor price monitor and abandoned cart recovery, which have more complex logic.

I've packaged ready-made versions of all of these (with setup guides, error handling, and Slack + email variants) at https://stripeai.gumroad.com. The price monitor and daily sales report are there individually, plus a full automation bundle.


Running n8n with Shopify already? Drop a question in the comments — happy to help with specific use cases.

Top comments (0)