AutomationFlowsSlack & Telegram › Create Shopify Product Videos From Tagged Photos with Dreem.ai and Slack

Create Shopify Product Videos From Tagged Photos with Dreem.ai and Slack

ByKristian Jønsson @kristianj on n8n.io

This workflow turns a product photo into a short product video with Dreem AI. Tag a product dreem-video in Shopify and the finished clip arrives in Slack for approval, then lands in the product's media. The workflow fires when a product update carries the tag dreem-video. The…

Event trigger★★★★☆ complexity22 nodesShopify TriggerN8N Nodes DreemSlackShopifyHTTP Request
Slack & Telegram Trigger: Event Nodes: 22 Complexity: ★★★★☆ Added:

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

This workflow follows the HTTP Request → Slack 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": "90aZyi0LFHxuO7S3",
  "name": "Turn Shopify product photos into videos with Dreem.ai using a product tag",
  "tags": [],
  "nodes": [
    {
      "id": "ea4bb98c-9ef6-4929-ad6c-62da3390ad2a",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        0
      ],
      "parameters": {
        "width": 480,
        "height": 896,
        "content": "## Turn Shopify product photos into videos with Dreem.ai using a product tag\n\n### How it works\n\nThis workflow watches Shopify product updates and only proceeds when a product has the configured video-generation tag. It swaps the tag to prevent repeated triggering, generates a product video with Dreem.ai, waits for render completion, and routes the result to Slack for review. If approved, it downloads the rendered video, uploads it through Shopify staged uploads, and attaches it to the product; if rendering times out, it posts a Slack alert.\n\n### Setup steps\n\n- Connect Shopify credentials for both the product update trigger and Admin API requests.\n- Connect Dreem.ai credentials and configure the generation node with the desired product image/video settings.\n- Connect Slack credentials and select the channels/users used for render delivery, approval, and timeout notifications.\n- Replace placeholder Shopify URLs such as `https://YOUR-STORE.myshopify.com` with your store domain and verify Admin API scopes for product media and staged uploads.\n- Confirm the trigger tag, loop-safety replacement tag, wait/timeout settings, and approval interaction logic match your operating process.\n\n### Customization\n\nYou can change the Shopify tag that starts video generation, adjust the Dreem.ai video prompt/settings, modify the wait interval or timeout behavior, and route approvals or timeout alerts to different Slack channels."
      },
      "typeVersion": 1
    },
    {
      "id": "b26ffb12-0214-48d2-b51e-bb7984225b5e",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        272
      ],
      "parameters": {
        "color": 7,
        "width": 768,
        "height": 304,
        "content": "## Detect tagged products\n\nStarts when a Shopify product is updated, checks whether it has the `dreem-video` trigger tag, and swaps the tag so the workflow does not loop on its own product update."
      },
      "typeVersion": 1
    },
    {
      "id": "2fe140b0-95d1-4f60-a77b-8f5205f3498d",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1376,
        272
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 304,
        "content": "## Generate and monitor video\n\nSends the tagged product to Dreem.ai for video generation, waits for the render, and checks whether the render completed successfully or timed out."
      },
      "typeVersion": 1
    },
    {
      "id": "14eb9c84-01a3-4208-9915-72eeb720448e",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2096,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 480,
        "content": "## Slack review approval\n\nPosts the rendered video into Slack, delivers it for review, and branches based on whether the reviewer approves the video for publishing."
      },
      "typeVersion": 1
    },
    {
      "id": "1ecd660a-ac1e-4637-8829-5f3ec9a90636",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2800,
        384
      ],
      "parameters": {
        "color": 7,
        "height": 368,
        "content": "## Render timeout alert\n\nHandles the incomplete-render path by notifying Slack that the Dreem.ai render timed out or did not finish in the expected window."
      },
      "typeVersion": 1
    },
    {
      "id": "4acbdfd6-716e-4def-8f5d-d3f92d7086da",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2832,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 816,
        "height": 304,
        "content": "## Prepare Shopify upload\n\nDownloads the approved video, creates a Shopify staged upload target, and merges the downloaded file with the upload target details."
      },
      "typeVersion": 1
    },
    {
      "id": "584f8776-298e-436d-bc43-d839911a2d2b",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3680,
        96
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 320,
        "content": "## Publish video media\n\nUploads the video binary to the staged Shopify upload URL and then attaches the uploaded video as media on the original product."
      },
      "typeVersion": 1
    },
    {
      "id": "1f28cbad-a119-45d9-87f9-520496572635",
      "name": "Shopify Product Update Trigger",
      "type": "n8n-nodes-base.shopifyTrigger",
      "position": [
        608,
        448
      ],
      "parameters": {
        "topic": "products/update",
        "authentication": "accessToken"
      },
      "credentials": {
        "shopifyAccessTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "38c61b09-0eb4-4767-aa9d-9673eff3ca9c",
      "name": "Create Video with Dreem",
      "type": "n8n-nodes-dreem.dreem",
      "position": [
        1424,
        448
      ],
      "parameters": {
        "duration": "5s",
        "promptId": "e9e92395-4f54-417d-94a3-01a72d9ca90b",
        "operation": "generateVideo",
        "firstFrameUrl": "={{ $json.images[$json.images.length - 1].src }}",
        "authentication": "apiKey",
        "videoCallbackUrl": "={{ $execution.resumeUrl }}"
      },
      "credentials": {
        "dreemApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f501a5d3-629e-431a-95ad-8a466dcb2f96",
      "name": "Wait for Video Render",
      "type": "n8n-nodes-base.wait",
      "position": [
        1664,
        448
      ],
      "parameters": {
        "resume": "webhook",
        "options": {},
        "httpMethod": "POST",
        "resumeUnit": "minutes",
        "resumeAmount": 20,
        "limitWaitTime": true
      },
      "typeVersion": 1.1
    },
    {
      "id": "4d9c7b9c-ffa9-4e31-b515-d0abdacff9fe",
      "name": "Check Render Complete",
      "type": "n8n-nodes-base.if",
      "position": [
        1904,
        448
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.body?.status ?? $json.status }}",
              "rightValue": "completed"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "90c58c80-7ece-494c-93c0-bde14df90e18",
      "name": "Send & Approve Video on Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        2384,
        304
      ],
      "parameters": {
        "select": "channel",
        "message": "=Approve this video for *{{ $('Shopify Product Update Trigger').item.json.title }}*? *Upload to Shopify* adds it to the product's media. *Skip* = nothing is published \u2014 the link above stays valid for ~12 hours.",
        "options": {
          "limitWaitTime": {
            "values": {
              "resumeAmount": 12
            }
          }
        },
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "C0BEBLUUHNZ"
        },
        "operation": "sendAndWait",
        "authentication": "oAuth2",
        "approvalOptions": {
          "values": {
            "approvalType": "double",
            "approveLabel": "Upload to Shopify",
            "disapproveLabel": "Skip"
          }
        }
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.5
    },
    {
      "id": "7bf76044-ceac-4ad9-b6d8-217b889af2d3",
      "name": "Check Video Approval",
      "type": "n8n-nodes-base.if",
      "position": [
        2624,
        304
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.data.approved }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b805f87f-cc98-4573-9dcf-9de666e8c386",
      "name": "Notify Slack on Timeout",
      "type": "n8n-nodes-base.slack",
      "position": [
        2848,
        688
      ],
      "parameters": {
        "text": "=Dreem video render timed out for *{{ $('Shopify Product Update Trigger').item.json.title }}*. Nothing was delivered. Check the Dreem dashboard and retry.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "C0BEBLUUHNZ"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.5
    },
    {
      "id": "3013375d-5813-4dfa-befe-8aaddd36558a",
      "name": "Check Dreem-Video Tag",
      "type": "n8n-nodes-base.if",
      "position": [
        848,
        448
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ ($json.tags || '').split(',').map(t => t.trim()).includes('dreem-video') }}",
              "rightValue": ""
            },
            {
              "operator": {
                "type": "number",
                "operation": "gt"
              },
              "leftValue": "={{ ($json.images || []).length }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "702a4b9f-ff45-4b4e-b951-84a43cd61cf7",
      "name": "Modify Shopify Product Tag",
      "type": "n8n-nodes-base.shopify",
      "position": [
        1184,
        448
      ],
      "parameters": {
        "resource": "product",
        "operation": "update",
        "productId": "={{ $json.id }}",
        "updateFields": {
          "tags": "={{ $json.tags.split(',').map(t => t.trim()).filter(t => t !== 'dreem-video').concat('video-done').join(', ') }}"
        },
        "authentication": "accessToken"
      },
      "credentials": {
        "shopifyAccessTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ef12865d-2c0c-407b-ae23-af5cff338548",
      "name": "Fetch Rendered Video",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2880,
        176
      ],
      "parameters": {
        "url": "={{ $('Wait for Video Render').item.json.body?.outputs?.[0]?.files?.[0]?.url ?? $('Wait for Video Render').item.json.outputs?.[0]?.files?.[0]?.url }}",
        "options": {
          "response": {
            "response": {
              "fullResponse": true,
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "1e156926-f710-4461-aa8c-613cd6690007",
      "name": "Initiate Shopify Video Upload",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3168,
        176
      ],
      "parameters": {
        "url": "https://YOUR-STORE.myshopify.com/admin/api/2024-07/graphql.json",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ JSON.stringify({ query: 'mutation stagedUploadsCreate($input: [StagedUploadInput!]!) { stagedUploadsCreate(input: $input) { stagedTargets { url resourceUrl parameters { name value } } userErrors { field message } } }', variables: { input: [{ filename: 'dreem-' + $('Shopify Product Update Trigger').item.json.id + '.mp4', mimeType: 'video/mp4', resource: 'VIDEO', fileSize: $json.headers['content-length'], httpMethod: 'POST' }] } }) }}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "shopifyAccessTokenApi"
      },
      "credentials": {
        "shopifyAccessTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "b4c55b15-d9a4-4235-9483-5d90a9f85b77",
      "name": "Combine Video Data",
      "type": "n8n-nodes-base.merge",
      "position": [
        3504,
        176
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "87918429-dbf8-4593-ad43-740fb482d242",
      "name": "Upload Video to Shopify",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3728,
        304
      ],
      "parameters": {
        "url": "={{ $json.data.stagedUploadsCreate.stagedTargets[0].url }}",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "name": "GoogleAccessId",
              "value": "={{ $json.data.stagedUploadsCreate.stagedTargets[0].parameters.find(p => p.name === 'GoogleAccessId').value }}"
            },
            {
              "name": "key",
              "value": "={{ $json.data.stagedUploadsCreate.stagedTargets[0].parameters.find(p => p.name === 'key').value }}"
            },
            {
              "name": "policy",
              "value": "={{ $json.data.stagedUploadsCreate.stagedTargets[0].parameters.find(p => p.name === 'policy').value }}"
            },
            {
              "name": "signature",
              "value": "={{ $json.data.stagedUploadsCreate.stagedTargets[0].parameters.find(p => p.name === 'signature').value }}"
            },
            {
              "name": "file",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "data"
            }
          ]
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "01280328-3aab-4d80-ae23-4a0ded660f92",
      "name": "Link Video to Product",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3952,
        304
      ],
      "parameters": {
        "url": "https://YOUR-STORE.myshopify.com/admin/api/2024-07/graphql.json",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ JSON.stringify({ query: 'mutation productCreateMedia($productId: ID!, $media: [CreateMediaInput!]!) { productCreateMedia(productId: $productId, media: $media) { media { id status } mediaUserErrors { field message } } }', variables: { productId: 'gid://shopify/Product/' + $('Shopify Product Update Trigger').item.json.id, media: [{ originalSource: $('Initiate Shopify Video Upload').item.json.data.stagedUploadsCreate.stagedTargets[0].resourceUrl, mediaContentType: 'VIDEO', alt: 'Dreem video \u2014 ' + $('Shopify Product Update Trigger').item.json.title }] } }) }}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "shopifyAccessTokenApi"
      },
      "credentials": {
        "shopifyAccessTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "0cb76887-536a-4613-8e83-25f7e46b0b2a",
      "name": "Announce Video on Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        2144,
        128
      ],
      "parameters": {
        "text": "=*Dreem video ready* for *{{ $('Shopify Product Update Trigger').item.json.title }}*\n{{ $('Wait for Video Render').item.json.body?.outputs?.[0]?.files?.[0]?.url ?? $('Wait for Video Render').item.json.outputs?.[0]?.files?.[0]?.url }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "C0BEBLUUHNZ"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.5
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "353ed224-4b6d-43d6-b173-087e9749694c",
  "nodeGroups": [],
  "connections": {
    "Combine Video Data": {
      "main": [
        [
          {
            "node": "Upload Video to Shopify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Video Approval": {
      "main": [
        [
          {
            "node": "Fetch Rendered Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Rendered Video": {
      "main": [
        [
          {
            "node": "Initiate Shopify Video Upload",
            "type": "main",
            "index": 0
          },
          {
            "node": "Combine Video Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Check Dreem-Video Tag": {
      "main": [
        [
          {
            "node": "Modify Shopify Product Tag",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Render Complete": {
      "main": [
        [
          {
            "node": "Announce Video on Slack",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Slack on Timeout",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for Video Render": {
      "main": [
        [
          {
            "node": "Check Render Complete",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Announce Video on Slack": {
      "main": [
        [
          {
            "node": "Send & Approve Video on Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Video with Dreem": {
      "main": [
        [
          {
            "node": "Wait for Video Render",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload Video to Shopify": {
      "main": [
        [
          {
            "node": "Link Video to Product",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Modify Shopify Product Tag": {
      "main": [
        [
          {
            "node": "Create Video with Dreem",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Initiate Shopify Video Upload": {
      "main": [
        [
          {
            "node": "Combine Video Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send & Approve Video on Slack": {
      "main": [
        [
          {
            "node": "Check Video Approval",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shopify Product Update Trigger": {
      "main": [
        [
          {
            "node": "Check Dreem-Video Tag",
            "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 turns a product photo into a short product video with Dreem AI. Tag a product dreem-video in Shopify and the finished clip arrives in Slack for approval, then lands in the product's media. The workflow fires when a product update carries the tag dreem-video. The…

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

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

This workflow turns every new Shopify product into a complete photo set with Dreem.ai: studio product shots plus an on-model render, generated from one photo and added straight back to the listing. Op

Shopify Trigger, N8N Nodes Dreem, Shopify +1
Slack & Telegram

This workflow triggers on new Shopify products, generates studio-style product shots from one product image using Dreem.ai and appends the rendered images back to the Shopify product listing, with opt

Shopify Trigger, Slack, N8N Nodes Dreem +1
Slack & Telegram

This workflow fires when a new Shopify product is created, renders it on a virtual model with Dreem.ai, and appends the shot back to the product - with optional Slack posting and approval. A Shopify w

Shopify Trigger, N8N Nodes Dreem, Slack +1
Slack & Telegram

This workflow is essential for dropshippers, e-commerce store owners, and anyone looking to quickly import product catalogs from specific websites into their Shopify store.

Shopify, Slack, HTTP Request +2
Slack & Telegram

New products get attention; the back catalog doesn't. This workflow sweeps your Shopify catalog, finds every product that still has just one photo, and generates the missing studio product shots with

Shopify, Slack, N8N Nodes Dreem