Ecommerce Inventory Forecasting Workflow for ShipHero and Amazon

Ive been forecasting inventory for my ecommerce brand for over 12 years now using exports from Shopify & Amazon. This has been cumbersome, but more importantly the information has been in a silo. With the use of n8n, I would like to automate this using the following integrations:

  1. ShipHero: Real Time Inventory levels
  2. Shopify: Real Time Sales Numbers
  3. Amazon: Real Time Sales and Inventory Numbers
  4. Google Sheets: Reference Tables (SKU vs ASIN vs Product Attributes, etc)
  5. Gemini or ChatGPT: Analytics

The workflow should be able to support a large number of SKUs (over 2000)

Hey @AKE !

Welcome to n8n community!

What have you tried so far?

I think n8n has a Shopify node/trigger, for Amazon/Hero a HTTP node can do that, Gggl Sheet as well native n8n node.

This won’t be a problem :slight_smile:

Cheers!

Hey @Parintele_Damaskin - thank you! Currently I’m trying to connect to ShipHero instead of Shopify for more accurate inventory levels, but not having success in pulling the data. Trying to execute the following query based on ShipHero’s provided documentation: https://developer.shiphero.com/examples/#warehouseproducts

I’m using this Shiphero documentation for Authentication: https://developer.shiphero.com/getting-started/#authentication

However I keep getting the following error:
{
“errorMessage”: “Bad request - please check your parameters”,
“errorDescription”: “HTTP status 400”,
“errorDetails”: {
“rawErrorMessage”: [
“HTTP status 400”
],
“httpCode”: “400”
},
“n8nDetails”: {
“nodeName”: “HTTP Request”,
“nodeType”: “n8n-nodes-base.httpRequest”,
“nodeVersion”: 4.3,
“itemIndex”: 0,
“time”: “1/3/2026, 11:43:49 AM”,
“n8nVersion”: “2.1.5 (Cloud)”,
“binaryDataMode”: “filesystem”,
“stackTrace”: [
“NodeApiError: Bad request - please check your parameters”,
" at ExecuteContext.execute (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/n8n-nodes-base@file+packages+nodes-base_@[email protected]_asn1.js@5_8da18263ca0574b0db58d4fefd8173ce/node_modules/n8n-nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts:859:16)“,
" at processTicksAndRejections (node:internal/process/task_queues:105:5)”,
" at WorkflowExecute.executeNode (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/n8n-core@file+packages+core_@[email protected]_@[email protected]_ec37920eb95917b28efaa783206b20f3/node_modules/n8n-core/src/execution-engine/workflow-execute.ts:1045:8)“,
" at WorkflowExecute.runNode (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/n8n-core@file+packages+core_@[email protected]_@[email protected]_ec37920eb95917b28efaa783206b20f3/node_modules/n8n-core/src/execution-engine/workflow-execute.ts:1226:11)”,
" at /usr/local/lib/node_modules/n8n/node_modules/.pnpm/n8n-core@file+packages+core_@[email protected]_@[email protected]_ec37920eb95917b28efaa783206b20f3/node_modules/n8n-core/src/execution-engine/workflow-execute.ts:1662:27",
" at /usr/local/lib/node_modules/n8n/node_modules/.pnpm/n8n-core@file+packages+core_@[email protected]_@[email protected]_ec37920eb95917b28efaa783206b20f3/node_modules/n8n-core/src/execution-engine/workflow-execute.ts:2274:11"
]
}
}

Here’s the code block:

Hey @AKE !

Basically yyou can use in 2 ways.
With Credentials or use directly the acces_token in the header as Bearer.

Here are all 3 http nodes that supposed to deal with, login(only once to get the get the access-token and maybe save when expires the refresh for further operairon), then the actual fetch of products, then the node that will refresh when epired.

Cheeers!

@Parintele_Damaskin - you are a rockstar! This worked right away. The only part that needs to be adjusted is the JSON in the Fetch request. The code you provided pulls the first 10 orders, but I am looking data at the warehouse level seen here:

query {
  warehouse_products(warehouse_id: "V2FyZWhvdXNlOjgwNzU=") {
    request_id
    complexity
    data(first: 2) {
      edges {
        node {
          id
          account_id
          on_hand
          inventory_bin
          reserve_inventory
          reorder_amount
          reorder_level
          custom
          warehouse {
            id
            dynamic_slotting
            profile
          }
          product {
            id
            name
            sku
          }
        }
        cursor
      }
    }
  }
}

The warehouse ID is “125107”. Thank you so much!!

@Parintele_Damaskin - I was able to figure out the previous question I had :slight_smile: Thank you again for your help!!

1 Like