AutomationFlowsE-commerce › Shopify Order Fulfillment Automation

Shopify Order Fulfillment Automation

Original n8n title: Automatic Shopify Order Fulfillment Process

Bybangank36 @bangank36 on n8n.io

This workflow automates the action in Shopify for each order, ensuring a seamless fulfillment process without manual intervention.

Event trigger★★★★☆ complexity13 nodesHTTP RequestShopify
E-commerce Trigger: Event Nodes: 13 Complexity: ★★★★☆ Added:

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

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
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "30da4d86-83ef-4226-ad2e-d73f531bd4ed",
      "name": "When clicking \u2018Test workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        0,
        100
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "bd57625d-03f2-48b3-94b5-2653214682eb",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        700,
        -280
      ],
      "parameters": {
        "height": 440,
        "content": "## Filtering orders for fulfillment \ud83d\udc47\nFilter the valid orders for programatically fulfillments\n\n- you exclusively sell digital downloads or digital gift cards\n- you use fulfillment services for all your products\n"
      },
      "typeVersion": 1
    },
    {
      "id": "5928c16f-b842-42e3-9c81-ac9b796d22ff",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1060,
        0
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "4509fb4e-fed0-4424-94a2-55d1c56a5d5a",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1320,
        -180
      ],
      "parameters": {
        "height": 340,
        "content": "## Get fulfillment orders \ud83d\udc47\n[Retrieves a list of fulfillment orders for a specific order.](https://shopify.dev/docs/api/admin-rest/2025-01/resources/fulfillmentorder#get-orders-order-id-fulfillment-orders)\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "76e16b42-01a3-4c88-a64b-a408b4bb9f40",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        -160
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "1835c0d1-c7d3-4db6-b898-d604c8df7ad1",
      "name": "Filter Orders",
      "type": "n8n-nodes-base.filter",
      "position": [
        760,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "3fdde26b-82ef-42f1-ba36-d4fe667f8866",
              "operator": {
                "type": "number",
                "operation": "gt"
              },
              "leftValue": "={{ (new Date().getTime() - new Date($json.created_at).getTime()) / (1000 * 60 * 60) }}\n",
              "rightValue": 24
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "977c3b8d-e3a9-4146-bc4c-e06e67f26a9e",
      "name": "Get Fulfillment Orders",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1380,
        20
      ],
      "parameters": {
        "url": "=https://{{ $('Set Global').item.json['store-id'] }}.myshopify.com/admin/api/2025-01/orders/{{ $json.id }}/fulfillment_orders.json",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "shopifyAccessTokenApi"
      },
      "credentials": {
        "shopifyAccessTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "cf4c99c4-882c-4706-9cb9-8c154549545b",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        240,
        -180
      ],
      "parameters": {
        "width": 232,
        "height": 346,
        "content": "## Edit this node \ud83d\udc47\n\nGet your store ID and replace in the GET url"
      },
      "typeVersion": 1
    },
    {
      "id": "3a33e89b-ecf5-4be1-b3e4-9c20c00c7c1c",
      "name": "Set Global",
      "type": "n8n-nodes-base.set",
      "position": [
        300,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "78289fb1-8a1a-46a2-973e-f5f2a7309993",
              "name": "store-id",
              "type": "string",
              "value": "{store-id}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "68dffeba-705c-42b5-851e-893964a51176",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1680,
        -180
      ],
      "parameters": {
        "width": 232,
        "height": 346,
        "content": "## Create fulfillment  \ud83d\udc47\n\n[Creates a fulfillment for one or many fulfillment orders](https://shopify.dev/docs/api/admin-rest/2025-04/resources/fulfillment#post-fulfillments)\n- `notify_customer` to send notifications to customer"
      },
      "typeVersion": 1
    },
    {
      "id": "24137672-00d7-4fa0-9238-f2dca7900adf",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -440,
        -300
      ],
      "parameters": {
        "width": 372,
        "height": 546,
        "content": "## Shopify Fulfillment Automation with n8n\nShopify store owners who want to automate the fulfillment process, whether for entire orders or specific products (like personalization items). However, the challenge lies in retrieving the [Fulfillment Order ID](https://shopify.dev/docs/api/admin-rest/2025-01/resources/fulfillmentorder#get-orders-order-id-fulfillment-orders) (not [Order ID](https://shopify.dev/docs/api/admin-rest/2025-01/resources/order#get-orders-order-id?fields=id,line-items,name,total-price))\u2014a crucial piece needed to trigger fulfillment.\n\nThis n8n workflow can:\n\n- Get all unfulfilled orders from Shopify store.\n\n- Retrieve the Fulfillment Order ID (using the \"List Fulfillment Orders\" action).\n\n- Create a fulfillment request (using \"Mark fulfillment orders as fulfilled\").\n\n- Handle edge cases, like partially fulfilled orders or errors in API responses.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "bfb340f2-1fb6-4be7-823a-d24d6d8361be",
      "name": "Get all Unfulfilled orders",
      "type": "n8n-nodes-base.shopify",
      "position": [
        540,
        0
      ],
      "parameters": {
        "options": {
          "fulfillmentStatus": "unfulfilled"
        },
        "operation": "getAll",
        "returnAll": true,
        "authentication": "accessToken"
      },
      "credentials": {
        "shopifyAccessTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8350fcaf-1bf8-4af1-a716-816b19a4b892",
      "name": "Mark fulfillment orders as fulfilled",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1740,
        20
      ],
      "parameters": {
        "url": "=https://{{ $('Set Global').item.json['store-id'] }}.myshopify.com/admin/api/2025-01/fulfillments.json",
        "method": "POST",
        "options": {},
        "jsonBody": "={\"fulfillment\":{\"line_items_by_fulfillment_order\":[{\"fulfillment_order_id\":{{ $json.fulfillment_orders[0].id }}}],\"notify_customer\":true}}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "shopifyAccessTokenApi"
      },
      "credentials": {
        "shopifyAccessTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    }
  ],
  "connections": {
    "Set Global": {
      "main": [
        [
          {
            "node": "Get all Unfulfilled orders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Orders": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Get Fulfillment Orders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Set Global",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Fulfillment Orders": {
      "main": [
        [
          {
            "node": "Mark fulfillment orders as fulfilled",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get all Unfulfilled orders": {
      "main": [
        [
          {
            "node": "Filter Orders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Test workflow\u2019": {
      "main": [
        [
          {
            "node": "Set Global",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark fulfillment orders as fulfilled": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "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

This workflow automates the action in Shopify for each order, ensuring a seamless fulfillment process without manual intervention.

Source: https://n8n.io/workflows/3296/ — 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

Filter Schedule. Uses manualTrigger, stickyNote, splitInBatches, scheduleTrigger. Event-driven trigger; 13 nodes.

HTTP Request, Shopify
E-commerce

This n8n workflow integrates Shopify order management with Telegram, allowing you to query open orders and order details directly through Telegram chat commands. It provides an interactive way to moni

Telegram Trigger, Shopify, HTTP Request +1
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

The intention of this workflow is to integrate New Shopify Orders into MS Dynamics Business Central: Point-of-Sale (POS): POS orders will be created in Business Central as Sales Invoices given no fulf

HTTP Request, Shopify
E-commerce

This workflow automates the synchronization of product prices across Shopify and WooCommerce platforms to ensure retail consistency. It triggers when a price change is detected in either system, appli

Shopify Trigger, Woo Commerce Trigger, WooCommerce +3