AutomationFlowsE-commerce › Summarize Daily Shopify Orders with Gemini, Google Sheets, Gmail and Slack

Summarize Daily Shopify Orders with Gemini, Google Sheets, Gmail and Slack

ByTricore Infotech Pvt Ltd @jinitp on n8n.io

E-commerce store management made easy. The workflow pulls your daily Shopify orders, calculates essential metrics like revenue and fulfillment rates, and categorizes them by status (shipped, returned, cancelled, or pending). Gemini AI then transforms this data into a polished…

Cron / scheduled trigger★★★★☆ complexityAI-powered22 nodesShopifyGoogle SheetsChain LlmGoogle Gemini ChatGmailSlackError Trigger
E-commerce Trigger: Cron / scheduled Nodes: 22 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #15693 — we link there as the canonical source.

This workflow follows the Chainllm → Gmail recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "DrWPJJfAGhghjLvK",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Shopify Daily Order Reporting: AI Summaries & Multichannel Alerts",
  "tags": [],
  "nodes": [
    {
      "id": "5612730a-f93d-4f8c-81e2-ce39b7a7084d",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1968,
        3040
      ],
      "parameters": {
        "color": 6,
        "width": 262,
        "height": 96,
        "content": "\u26a0\ufe0f **ACTION REQUIRED**\nOpen Slack node and select your Slack channel from the dropdown before activating the workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "5ef652b6-67c0-4254-bf08-ddc304de4470",
      "name": "Zone 5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        416,
        3008
      ],
      "parameters": {
        "color": 7,
        "width": 498,
        "height": 360,
        "content": "## 5. \ud83d\udea8 Global Error Handling\nCatches any workflow failures.\n\n**Action:**\n- Sends error trace to Slack for quick debugging."
      },
      "typeVersion": 1
    },
    {
      "id": "9e0705e6-8a79-46bf-9dc4-6fc345e065b6",
      "name": "Zone 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1600,
        2496
      ],
      "parameters": {
        "color": 2,
        "width": 766,
        "height": 708,
        "content": "## 4. \ud83d\udce4 Alerts & Pipeline Success\nDistributes the report to the team.\n\n**Actions:**\n- Sends email summary via Gmail.\n- Sends Slack notification.\n- Notifies if 0 orders found."
      },
      "typeVersion": 1
    },
    {
      "id": "04cfe3a1-f51b-4fe9-b555-c127921f84ba",
      "name": "Zone 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        944,
        2496
      ],
      "parameters": {
        "color": 5,
        "width": 630,
        "height": 628,
        "content": "## 3. \ud83e\udde0 AI Summary & Logging\nCreates report and stores historical data.\n\n**Logs:**\n- Adds daily metrics to Google Sheets.\n\n**AI Summary:**\n- Prompts Gemini to format a professional operations summary."
      },
      "typeVersion": 1
    },
    {
      "id": "e45bb44d-4d18-4f32-adc2-2fe0ccf2d74e",
      "name": "Zone 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        448,
        2496
      ],
      "parameters": {
        "color": 4,
        "width": 464,
        "height": 484,
        "content": "## 2. \ud83d\udce5 Ingestion & Logic\nRetrieves Shopify data and calculates totals.\n\n**Fetches:**\n- All orders from the current day\n\n**Calculates:**\n- Total orders, revenue, average order value\n- Categorizes: paid, shipped, refunded, cancelled, pending"
      },
      "typeVersion": 1
    },
    {
      "id": "1dc08a66-2105-4ce8-a35d-01683b8449e7",
      "name": "Zone 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        48,
        2496
      ],
      "parameters": {
        "color": 6,
        "width": 366,
        "height": 484,
        "content": "## 1. \u2699\ufe0f Trigger & Config\nSets schedule and recipient email.\n\n**Scheduled Flow**\n- Schedule Trigger: Auto-runs at 23:30 daily.\n- Config: Sets the `recipientMail` and `googleSheetUrl`."
      },
      "typeVersion": 1
    },
    {
      "id": "c0fa097b-36a1-4623-9daf-94d794d93dd7",
      "name": "Sticky Note - Google Sheets Setup",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        992,
        3040
      ],
      "parameters": {
        "color": 5,
        "width": 496,
        "height": 356,
        "content": "\ud83d\udccb **GOOGLE SHEET SETUP**\n\n**Create Your Sheet:**\n1. Go to sheets.google.com/create\n2. Create a blank Google Sheet\n\n**Add Headers to Row 1 (CASE-SENSITIVE):**\nDate | Total Orders | New Orders | Shipped | Refunded | Cancelled | Revenue | Avg Value | Fulfillment % | Timestamp\n\n**Copy & Paste URL:**\n1. Copy your sheet URL (format: docs.google.com/spreadsheets/d/[SHEET_ID]/edit)\n2. Open Configuration node\n3. Paste into googleSheetUrl field\n\n**That's it!** Your daily reports will auto-log here."
      },
      "typeVersion": 1
    },
    {
      "id": "ccc5e7a2-3c12-4ed9-9502-23d3542b9422",
      "name": "Sticky Note - Configure Node",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        80,
        2928
      ],
      "parameters": {
        "color": 6,
        "width": 316,
        "height": 372,
        "content": "\u2699\ufe0f **CONFIGURE BEFORE RUNNING**\n\nOpen \"Set Config\" node and fill in:\n1. **recipientMail** \u2192 Target email for the daily summary report.\n2. **googleSheetUrl** \u2192 Google sheet url for log orders.\n\n**Other Node Configs:**\n- Update `Log to Google Sheets` with your specific Document ID.\n- Update Slack nodes with your preferred channel/webhook IDs.\n\n\u26a0\ufe0f Ensure Shopify, Google, Slack, and Gemini credentials are connected!"
      },
      "typeVersion": 1
    },
    {
      "id": "99716150-fc54-4f3a-9e06-1a356e6ce627",
      "name": "Template Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        2496
      ],
      "parameters": {
        "width": 680,
        "height": 1030,
        "content": "## \ud83d\udecd\ufe0f Shopify Daily Order Reporting: AI Summaries & Multichannel Alerts\n\n### Who it's for\nE-commerce store owners and managers who want a hands-off daily brief on store performance.\n\n### What it does\nAutomatically fetches your daily Shopify orders, calculates key metrics (revenue, average order value, fulfillment rate), uses AI (Gemini) to write a clean summary, logs everything to Google Sheets, and sends the report to your inbox and Slack team channel.\n\n### How it works\n1. **Trigger** \u2014 Runs daily at 23:59 (in your timezone).\n2. **Fetch** \u2014 Grabs all orders from Shopify for the current day.\n3. **Calculate** \u2014 Sorts orders and computes metrics.\n4. **AI Summary** \u2014 Gemini translates numbers into readable text. (If 0 orders: Slack gets a \"no updates\" ping only, no email sent.)\n5. **Deliver** \u2014 Logs to Google Sheets, emails the summary, and posts to Slack.\n\n### How to set up\n1. **Authenticate** \u2014 Connect Shopify, Google Sheets, Gmail, Slack, and Gemini.\n2. **Configure** \u2014 Open Configuration node, enter your email and Sheet URL.\n3. **Create Sheet** \u2014 Add headers (Date, Total Orders, New Orders, Shipped, Refunded, Cancelled, Revenue, Avg Value, Fulfillment %, Timestamp).\n4. **Select Channels** \u2014 Pick Slack channels for reports and errors.\n5. **Set Timezone** \u2014 Workflow Settings (gear icon) \u2192 Timezone dropdown.\n6. **Activate** \u2014 Toggle ON in the top menu.\n\n### Requirements\n- **n8n Version:** 2.18+\n- **Shopify:** Store with active API credentials.\n- **Credentials:** Shopify API, Google Sheets OAuth2, Slack API, Gmail OAuth2, Google Gemini API.\n\n### How to customize\n- **Only paid orders?** Edit Calculate Order Metrics node to filter `financial_status = \"paid\"`.\n- **Change AI tone?** Open Generate AI Summary node and tell Gemini your preferred style.\n- **More recipients?** Duplicate the Gmail node or use a team distribution list.\n\n### \ud83d\udce6 Version Info\n- **Shopify API:** v1"
      },
      "typeVersion": 1
    },
    {
      "id": "769ccc8d-96c6-4a3e-bdc8-21a2c9c88031",
      "name": "Daily Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        96,
        2752
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 23,
              "triggerAtMinute": 59
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "523f7ae8-53e0-4530-bfbd-a7f15ee5af96",
      "name": "Set Config (Email & Sheet URL)",
      "type": "n8n-nodes-base.set",
      "position": [
        288,
        2752
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9ce76006-650b-4fed-af55-dfea9fff4886",
              "name": "recipientMail",
              "type": "string",
              "value": "PASTE_RECIPIENT_MAIL_HERE"
            },
            {
              "id": "57cd600d-6be2-4b2b-a916-54760c972b98",
              "name": "googleSheetUrl",
              "type": "string",
              "value": "PASTE_GOOGLE_SHEET_URL_HERE"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "70f707e1-418f-4222-988d-dac80750db7a",
      "name": "Fetch Today's Updated Orders",
      "type": "n8n-nodes-base.shopify",
      "onError": "continueRegularOutput",
      "position": [
        544,
        2752
      ],
      "parameters": {
        "limit": 1000,
        "options": {
          "status": "any",
          "updatedAtMax": "={{ $now.endOf(\"day\").toFormat(\"yyyy-MM-dd'T'HH:mm:ss\") }}",
          "updatedAtMin": "={{ $now.startOf(\"day\").toFormat(\"yyyy-MM-dd'T'HH:mm:ss\") }}",
          "financialStatus": "any",
          "fulfillmentStatus": "any"
        },
        "operation": "getAll",
        "authentication": "oAuth2"
      },
      "credentials": {
        "shopifyOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e964211b-e862-412f-bb8c-7b7f680b87bd",
      "name": "Calculate & Categorize Metrics",
      "type": "n8n-nodes-base.code",
      "position": [
        752,
        2752
      ],
      "parameters": {
        "jsCode": "let orders;\ntry {\n  orders = $input.all().map(item => item.json);\n\n  if (orders.length === 0) {\n    return [{\n      json: {\n        summary_data: {\n          status: \"no_orders\",\n          message: \"No orders were updated today.\",\n          timestamp: new Date().toISOString(),\n          metrics:{\n            total_orders: 0\n          }\n        }\n      }\n    }];\n  }\n\n  const todayStart = $now.startOf('day').toJSDate();\n\n  const summary = {\n    new_orders: [],\n    shipped: [],\n    returned_refunded: [],\n    cancelled: [],\n    other_pending: [],\n    metrics: {\n      total_orders: orders.length,\n      new_orders_count: 0,\n      updated_orders_count: 0,\n      total_revenue: 0,\n      new_orders_revenue: 0,\n      average_order_value: 0,\n      fulfillment_rate: 0,\n      cancellation_rate: 0,\n      refund_rate: 0\n    },\n    timestamp: new Date().toISOString(),\n    date: $now.toFormat('yyyy-MM-dd') \n  };\n\n  orders.forEach(order => {\n    if (!order.id || !order.order_number) {\n      console.log('Invalid order found:', order);\n      return {};\n    }\n\n    const isNewOrder = new Date(order.created_at) >= todayStart;\n\n    const details = {\n      order_number: order.order_number,\n      order_id: order.id,\n      total_price: parseFloat(order.current_total_price || 0),\n      currency: order.currency || 'USD',\n      created_at: order.created_at,\n      updated_at: order.updated_at,\n      customer_email: order.customer?.email || 'N/A',\n      is_new_order: isNewOrder\n    };\n\n    // Revenue\n    summary.metrics.total_revenue += details.total_price;\n    if (isNewOrder) {\n      summary.metrics.new_orders_revenue += details.total_price;\n      summary.new_orders.push(details);\n    }\n\n    // Categorization\n    if (order.cancelled_at !== null || order.cancel_reason) {\n      details.reason = order.cancel_reason || 'Not specified';\n      details.cancelled_at = order.cancelled_at;\n      summary.cancelled.push(details);\n    }\n    else if (order.financial_status === 'refunded' || order.financial_status === 'partially_refunded') {\n      details.financial_status = order.financial_status;\n      details.refund_count = order.refunds ? order.refunds.length : 0;\n      details.refund_amount = order.refunds?.reduce((sum, r) => sum + (r.amount || 0), 0) || 0;\n      summary.returned_refunded.push(details);\n    }\n    else if (order.fulfillment_status === 'fulfilled' && order.fulfillments?.length > 0) {\n      details.fulfillment_status = order.fulfillment_status;\n      details.fulfillment_count = order.fulfillments.length;\n      details.tracking_numbers = order.fulfillments.map(f => f.tracking_number || 'None');\n      details.estimated_delivery = order.fulfillments[0]?.estimated_delivery_date || 'Unknown';\n      summary.shipped.push(details);\n    }\n    else {\n      details.financial_status = order.financial_status || 'pending';\n      details.fulfillment_status = order.fulfillment_status || 'unfulfilled';\n      details.is_closed = order.closed_at !== null;\n      details.days_pending = Math.floor((new Date() - new Date(order.created_at)) / (1000 * 60 * 60 * 24));\n      summary.other_pending.push(details);\n    }\n  });\n\n  // Calculate metrics\n  summary.metrics.new_orders_count = summary.new_orders.length;\n  summary.metrics.updated_orders_count = orders.length - summary.new_orders.length;\n  summary.metrics.average_order_value = (summary.metrics.total_revenue / orders.length).toFixed(2);\n  summary.metrics.fulfillment_rate = ((summary.shipped.length / orders.length) * 100).toFixed(2) + '%';\n  summary.metrics.cancellation_rate = ((summary.cancelled.length / orders.length) * 100).toFixed(2) + '%';\n  summary.metrics.refund_rate = ((summary.returned_refunded.length / orders.length) * 100).toFixed(2) + '%';\n\n  return [{ json: { summary_data: summary } }];\n\n} catch (error) {\n  console.log(\"Error reading orders:\", error.message);\n  return [{\n    json: {\n      summary_data: {\n        status: \"error\",\n        message: \"Failed to read Shopify orders: \" + error.message,\n        timestamp: new Date().toISOString(),\n        metrics: {\n          total_orders: 0\n        }\n      }\n    }\n  }];\n}"
      },
      "typeVersion": 2
    },
    {
      "id": "6f863da7-91a3-4227-b591-65f509105b53",
      "name": "Log Daily Metrics to Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1184,
        2704
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $json.summary_data?.date }}",
            "Revenue": "={{ $json.summary_data?.metrics?.total_revenue || 0 }}",
            "Shipped": "={{ $json.summary_data?.shipped?.length || 0 }}",
            "Refunded": "={{ $json.summary_data?.returned_refunded?.length || 0 }}",
            "Avg Value": "={{ $json.summary_data?.metrics?.average_order_value || 0 }}",
            "Cancelled": "={{ $json.summary_data?.cancelled?.length || 0 }}",
            "Timestamp": "={{ new Date().toISOString() }}",
            "New Orders": "={{ $json.summary_data?.metrics?.new_orders_count || 0 }}",
            "Total Orders": "={{ $json.summary_data?.metrics?.total_orders || 0 }}",
            "Fulfillment %": "={{ $json.summary_data?.metrics?.fulfillment_rate || 0 }}"
          },
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "={{ $('Set Config (Email & Sheet URL)').item.json.googleSheetUrl }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "5a9d1167-f42f-4536-ae2f-4395763f845c",
      "name": "Generate Gemini AI Summary",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1328,
        2704
      ],
      "parameters": {
        "text": "={{ \"Here is the detailed Shopify order data for \" + $now.toFormat('yyyy-MM-dd') + \":\\n\\n\" +\nJSON.stringify($('Orders Available?').item.json.summary_data, null, 2) + \n\"\\n\\nPlease generate a professional daily operations summary with:\\n\\n\" +\n\"1. **HEADLINE METRICS** - Show today's key numbers:\\n\" +\n\"   - Total Orders Updated: [count]\\n\" +\n\"   - Total New Orders: [count]\\n\" +\n\"   - Total Revenue Generated: [amount]\\n\" +\n\"   - Average Order Value: [amount]\\n\\n\" +\n\n\"2. **CATEGORY BREAKDOWN** - Use this format:\\n\" +\n\"   \u2705 SHIPPED ([count] orders) - List order numbers\\n\" +\n\"   \u26a0\ufe0f RETURNED/REFUNDED ([count] orders) - List with refund amounts\\n\" +\n\"   \u274c CANCELLED ([count] orders) - List with reasons\\n\" +\n\"   \ud83d\udd04 PENDING ([count] orders) - Show oldest first\\n\\n\" +\n\n\"3. **ACTION ITEMS** - Highlight:\\n\" +\n\"   - Any orders pending for >3 days\\n\" +\n\"   - Unusually high refund rate (if >10%)\\n\" +\n\"   - Spike in cancellations (if >20%)\\n\\n\" +\n\n\"4. **TEAM NOTES** - Add brief context:\\n\" +\n\"   - Trends compared to typical day\\n\" +\n\"   - Recommended actions\\n\\n\" +\n\n\"Use emojis liberally for Slack readability. Keep it under 500 words. Format for both email and Slack.\" }}",
        "batching": {},
        "promptType": "define"
      },
      "typeVersion": 1.9
    },
    {
      "id": "8d24747b-73a1-4e15-bf67-34d7c6dbc308",
      "name": "Gemini LLM Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1328,
        2896
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-2.5-flash"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "dbf97185-f4d6-4824-b13c-c4adeefaaaff",
      "name": "Email Daily Report",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1728,
        2704
      ],
      "parameters": {
        "sendTo": "={{ $('Set Config (Email & Sheet URL)').item.json.recipientMail }}",
        "message": "={{ $json.text }}",
        "options": {},
        "subject": "={{ 'Shopify Daily Summary - ' + $now.toFormat('yyyy-MM-dd') }}",
        "emailType": "HTML"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "459e5f25-8e93-48b3-9a9e-1b45ab93a05d",
      "name": "Slack - Send Report",
      "type": "n8n-nodes-base.slack",
      "position": [
        1728,
        2880
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "1bf3186b-1bbc-4292-b69a-8e9880d2560c",
      "name": "Slack - No Orders Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        1728,
        3040
      ],
      "parameters": {
        "text": "=\u2139\ufe0f *Shopify Update:* No new orders or updates were found for {{ $now.toFormat('yyyy-MM-dd') }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "5102cbce-b70c-4718-a593-41ba6e9e97e2",
      "name": "Global Error Trigger",
      "type": "n8n-nodes-base.errorTrigger",
      "position": [
        480,
        3184
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "a55f043f-5222-48a7-bf18-00b733fd9795",
      "name": "Slack - Send Error Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        688,
        3184
      ],
      "parameters": {
        "text": "={{ '\ud83d\udea8 *Workflow Error Alert* \ud83d\udea8\\n\\n*Workflow:* ' + $workflow.name + '\\n*Failed Node:* ' + $json.execution.error.node.name + '\\n*Error Message:* ' + $json.execution.error.message }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d8282e21-cca8-4a0a-84c4-606f34284798",
      "name": "Orders Available?",
      "type": "n8n-nodes-base.if",
      "position": [
        976,
        2752
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "4abefeb0-f32d-4e74-a0ad-efa2eca6021b",
              "operator": {
                "type": "number",
                "operation": "gt"
              },
              "leftValue": "={{ $json.summary_data.metrics.total_orders }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2.3
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "d31f4d69-b42b-4ecb-8e91-2381ea818c29",
  "connections": {
    "Gemini LLM Model": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Gemini AI Summary",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Orders Available?": {
      "main": [
        [
          {
            "node": "Log Daily Metrics to Sheets",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Slack - No Orders Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Email Daily Report": {
      "main": [
        []
      ]
    },
    "Slack - Send Report": {
      "main": [
        []
      ]
    },
    "Global Error Trigger": {
      "main": [
        [
          {
            "node": "Slack - Send Error Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily Schedule Trigger": {
      "main": [
        [
          {
            "node": "Set Config (Email & Sheet URL)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Slack - No Orders Alert": {
      "main": [
        []
      ]
    },
    "Generate Gemini AI Summary": {
      "main": [
        [
          {
            "node": "Slack - Send Report",
            "type": "main",
            "index": 0
          },
          {
            "node": "Email Daily Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Daily Metrics to Sheets": {
      "main": [
        [
          {
            "node": "Generate Gemini AI Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Today's Updated Orders": {
      "main": [
        [
          {
            "node": "Calculate & Categorize Metrics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculate & Categorize Metrics": {
      "main": [
        [
          {
            "node": "Orders Available?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Config (Email & Sheet URL)": {
      "main": [
        [
          {
            "node": "Fetch Today's Updated Orders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

E-commerce store management made easy. The workflow pulls your daily Shopify orders, calculates essential metrics like revenue and fulfillment rates, and categorizes them by status (shipped, returned, cancelled, or pending). Gemini AI then transforms this data into a polished…

Source: https://n8n.io/workflows/15693/ — original creator credit. Request a take-down →

More E-commerce workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

E-commerce

This workflow automates inventory management and predictive reordering for Shopify stores. It integrates Shopify, Google Sheets, and Slack to monitor inventory levels, calculate dynamic reorder points

Shopify, Google Sheets, Gmail +2
E-commerce

E-commerce store owners and sales managers who want AI-powered insights from their Shopify data without manually crunching numbers every week.

Shopify, HTTP Request, Slack +2
E-commerce

Never miss a revenue-impacting failure. This n8n workflow monitors your Shopify store and triggers an alert if X minutes pass without a single new order. By automatically detecting unexpected drops in

Stop And Error, Slack, Gmail +1
E-commerce

A webhook or timer triggers the workflow to automatically fetch inventory data from multiple platforms. Stock levels are compared across stores to identify discrepancies, and any inconsistencies are u

HTTP Request, Google Sheets, Gmail
E-commerce

This workflow provides a robust, end-to-end automated pipeline for managing e-commerce orders. It bridges the gap between your storefront and your fulfillment team by handling inventory validation, mu

Gmail, Slack, Google Sheets