{
  "name": "Shopify New Order Slack Alert",
  "nodes": [
    {
      "parameters": {
        "content": "## Shopify New Order Alerts in Slack\n\nFeel every sale as it happens - a clean cha-ching message in Slack with the order details, no email digging, no dashboard refreshing.\n\n**Setup time:** 10 minutes  ·  **Level:** Beginner\n\n**You'll need accounts/credentials for:** Shopify, Slack\n\n**Replace these before running:**\n- `REPLACE_WITH_CHANNEL`\n\n**Setup steps:**\n1. Connect your Shopify account in the trigger node (Admin API access token from a custom app).\n2. Connect Slack and choose your #sales channel.\n3. Activate the workflow, then place a test order (or use Shopify's webhook test) to see the alert.\n\nFree templates and updates: navkhan103.github.io",
        "height": 574,
        "width": 400,
        "color": 4
      },
      "id": "sticky-setup",
      "name": "Setup — read me first",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -440,
        -40
      ]
    },
    {
      "parameters": {
        "content": "### How it runs\n\nStarts from **New Shopify Order**.\n\n1. A Shopify Trigger subscribes to the orders/create webhook on your store.\n2. A Code node formats the line items into a readable list.\n3. A Slack node posts the order summary - customer name, items, total, and order number - to your channel.",
        "height": 322,
        "width": 400,
        "color": 7
      },
      "id": "sticky-how",
      "name": "How it runs",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -440,
        574
      ]
    },
    {
      "parameters": {
        "content": "### If something breaks\n\nThe read and AI nodes here **retry 3× automatically** (5s apart), which absorbs rate limits and brief timeouts.\n\nNodes that **send or write deliberately do not retry** — a send that reached the far end but lost its response would otherwise fire twice, so you'd get duplicate messages or duplicate rows.\n\nTo be told when one of those fails, build a workflow starting with an **Error Trigger** node that posts to Slack or email, then set it under **three-dot menu > Settings > Error Workflow**. Do it once and point every workflow at it.",
        "height": 400,
        "width": 400,
        "color": 3
      },
      "id": "sticky-fail",
      "name": "If something breaks",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -440,
        936
      ]
    },
    {
      "parameters": {
        "topic": "orders/create"
      },
      "id": "c9d0e1f2-0001-4000-8000-000000000001",
      "name": "New Shopify Order",
      "type": "n8n-nodes-base.shopifyTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "const o = $input.first().json;\nconst items = (o.line_items || []).map(li => `- ${li.quantity}x ${li.title}`).join('\\n');\nconst name = o.customer ? `${o.customer.first_name || ''} ${o.customer.last_name || ''}`.trim() : 'Guest';\nreturn [{ json: { orderNumber: o.name, customer: name, items, total: `${o.total_price} ${o.currency}` } }];"
      },
      "id": "c9d0e1f2-0002-4000-8000-000000000002",
      "name": "Format Order",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        220,
        0
      ]
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "REPLACE_WITH_CHANNEL"
        },
        "text": "=:moneybag: *New order {{ $json.orderNumber }}* - {{ $json.total }}\nCustomer: {{ $json.customer }}\n{{ $json.items }}",
        "otherOptions": {}
      },
      "id": "c9d0e1f2-0003-4000-8000-000000000003",
      "name": "Post to Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.3,
      "position": [
        440,
        0
      ]
    }
  ],
  "connections": {
    "New Shopify Order": {
      "main": [
        [
          {
            "node": "Format Order",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Order": {
      "main": [
        [
          {
            "node": "Post to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}