AutomationFlowsSlack & Telegram › Create On-model Shopify Product Photos with Dreem AI and Slack Approvals

Create On-model Shopify Product Photos with Dreem AI and Slack Approvals

ByKristian Jønsson @kristianj on n8n.io

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 webhook fires when a product is created. Products without a photo are skipped.…

Event trigger★★★★☆ complexity16 nodesShopify TriggerN8N Nodes DreemSlackShopify
Slack & Telegram Trigger: Event Nodes: 16 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #16958 — 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
{
  "id": "6dnlngyuIbGItMEL",
  "name": "Create on-model photos for new Shopify fashion products with Dreem.ai",
  "tags": [],
  "nodes": [
    {
      "id": "7dd9f048-5d41-47ea-8a16-fb57c2129031",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        0
      ],
      "parameters": {
        "width": 480,
        "height": 848,
        "content": "## Create on-model photos for new Shopify products with Dreem.ai virtual models\n\n### How it works\n\nThis workflow creates on-model photos for new Shopify products using Dreem.ai virtual models. It triggers when a Shopify product is created, confirms an input image is available, generates the model shot, and waits for completion. Completed images are sent to Slack for human approval before being published back to Shopify, while timed-out renders trigger a Slack alert.\n\n### Setup steps\n\n- Connect Shopify credentials for both the product trigger and the product update/publish node.\n- Connect Dreem AI credentials and configure the virtual model, generation settings, and source product image field.\n- Connect Slack credentials and configure the review channel, approval message, and timeout alert destination.\n- Set the wait duration and completion condition so the workflow correctly detects finished versus timed-out renders.\n- Map the approved Dreem image URL or file output to the correct Shopify product media field.\n\n### Customization\n\nYou can adjust the Dreem model style, Slack approval process, timeout duration, and Shopify publishing behavior to match your brand workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "b93eaf65-c710-4cb8-90c7-20baa7c9e2af",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 320,
        "content": "## Product intake check\n\nStarts when a new Shopify product is created and verifies that the product has an image before continuing to image generation."
      },
      "typeVersion": 1
    },
    {
      "id": "d0b1822a-14fe-456d-8baf-b931ffa94fcb",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        976,
        208
      ],
      "parameters": {
        "color": 7,
        "width": 640,
        "height": 336,
        "content": "## Generate and monitor render\n\nSends the product image to Dreem to create an on-model shot, waits for the render process, and checks whether the generation completed successfully."
      },
      "typeVersion": 1
    },
    {
      "id": "c8594fbb-b74f-4332-9d87-2249c32ff0c2",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1648,
        -16
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 480,
        "content": "## Slack review flow\n\nPosts the completed on-model shot to Slack, requests approval, and branches based on whether the reviewer approved the generated image."
      },
      "typeVersion": 1
    },
    {
      "id": "1911b0ad-7b98-4a30-b42c-aa7464c377b9",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2352,
        128
      ],
      "parameters": {
        "color": 7,
        "width": 304,
        "height": 352,
        "content": "## Publish approved image\n\nUpdates the Shopify product with the approved on-model image once the Slack review passes."
      },
      "typeVersion": 1
    },
    {
      "id": "ec6bd381-6c09-4f28-a328-40ce5dc46c82",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1760,
        512
      ],
      "parameters": {
        "color": 7,
        "height": 336,
        "content": "## Render timeout alert\n\nSends a Slack notification when the Dreem render does not complete in the expected time window."
      },
      "typeVersion": 1
    },
    {
      "id": "7bc6b863-fd35-415a-8e6e-09dbd761754c",
      "name": "When New Shopify Product Created",
      "type": "n8n-nodes-base.shopifyTrigger",
      "position": [
        608,
        432
      ],
      "parameters": {
        "topic": "products/create",
        "authentication": "accessToken"
      },
      "typeVersion": 1
    },
    {
      "id": "514952a5-7764-4fa6-9b83-c26a128cdeb9",
      "name": "Create On-Model Image",
      "type": "n8n-nodes-dreem.dreem",
      "position": [
        1024,
        432
      ],
      "parameters": {
        "talentId": "b2c80190-4a00-4718-9d3f-c531472d5984",
        "shotCodes": [
          "model_front_women"
        ],
        "callbackUrl": "={{ $execution.resumeUrl }}",
        "backImageUrl": "={{ $('When New Shopify Product Created').first().json.images?.[1]?.src ?? '' }}",
        "frontImageUrl": "={{ $('When New Shopify Product Created').first().json.images[0].src }}",
        "authentication": "apiKey"
      },
      "executeOnce": false,
      "typeVersion": 1
    },
    {
      "id": "c8a6fb49-39e0-4421-bc61-8d8955dee107",
      "name": "Wait for Model Render",
      "type": "n8n-nodes-base.wait",
      "position": [
        1248,
        448
      ],
      "parameters": {
        "resume": "webhook",
        "options": {},
        "httpMethod": "POST",
        "resumeUnit": "minutes",
        "resumeAmount": 20,
        "limitWaitTime": true
      },
      "typeVersion": 1.1
    },
    {
      "id": "a1250a80-a885-441d-8524-b25af4a191ab",
      "name": "Check If Render Complete",
      "type": "n8n-nodes-base.if",
      "position": [
        1472,
        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": "d14916a0-9d5a-4fc1-a55e-5c82ee53b6be",
      "name": "Request Approval in Slack",
      "type": "n8n-nodes-base.slack",
      "disabled": true,
      "position": [
        1936,
        304
      ],
      "parameters": {
        "select": "channel",
        "message": "=Approve the on-model shot above for *{{ $('When New Shopify Product Created').first().json.title }}*? *Approve & publish* adds it to the product; *Reject* skips it. (Link stays valid ~12 hours.)",
        "options": {
          "limitWaitTime": {
            "values": {
              "resumeAmount": 12
            }
          }
        },
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "operation": "sendAndWait",
        "authentication": "oAuth2",
        "approvalOptions": {
          "values": {
            "approvalType": "double",
            "approveLabel": "Approve & publish",
            "disapproveLabel": "Reject"
          }
        }
      },
      "typeVersion": 2.5
    },
    {
      "id": "c6850ee7-8587-4d65-a073-48a4fb18e167",
      "name": "Check Slack Approval",
      "type": "n8n-nodes-base.if",
      "disabled": true,
      "position": [
        2176,
        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": "c201a96b-88e2-4712-9cd6-655be9b8b8fd",
      "name": "Notify Timeout in Slack",
      "type": "n8n-nodes-base.slack",
      "disabled": true,
      "position": [
        1808,
        688
      ],
      "parameters": {
        "text": "=Dreem on-model render timed out for *{{ $('When New Shopify Product Created').first().json.title }}*. Nothing was published. Check the Dreem dashboard and retry.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.5
    },
    {
      "id": "6aa1dfcb-44e1-47eb-b120-dca22aece45b",
      "name": "Publish Product to Shopify",
      "type": "n8n-nodes-base.shopify",
      "position": [
        2400,
        304
      ],
      "parameters": {
        "resource": "product",
        "operation": "update",
        "productId": "={{ $('When New Shopify Product Created').first().json.id }}",
        "updateFields": {
          "images": "={{ ($('When New Shopify Product Created').first().json.images || []).map(i => ({ id: i.id })).concat([{ src: $('Wait for Model Render').first().json.body.outputs[0].files[0].url }]) }}"
        },
        "authentication": "accessToken"
      },
      "typeVersion": 1
    },
    {
      "id": "93111bb1-4c9c-4291-a0a4-caa0bd783e94",
      "name": "Verify Image Presence",
      "type": "n8n-nodes-base.if",
      "position": [
        800,
        432
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "has-image-1",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.images?.[0]?.src ?? '' }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "e8a0dfa2-9d6b-4a00-8e7b-21cf4c57a174",
      "name": "Send Render to Slack for Approval",
      "type": "n8n-nodes-base.slack",
      "disabled": true,
      "position": [
        1696,
        128
      ],
      "parameters": {
        "text": "=*New Dreem on-model shot* for *{{ $('When New Shopify Product Created').first().json.title }}*\n{{ $('Wait for Model Render').first().json.body?.outputs?.[0]?.files?.[0]?.url ?? $('Wait for Model Render').first().json.outputs?.[0]?.files?.[0]?.url }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.5
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "a9b89a3a-9d5e-4fe6-ac78-83de991c246d",
  "nodeGroups": [],
  "connections": {
    "Check Slack Approval": {
      "main": [
        [
          {
            "node": "Publish Product to Shopify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create On-Model Image": {
      "main": [
        [
          {
            "node": "Wait for Model Render",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify Image Presence": {
      "main": [
        [
          {
            "node": "Create On-Model Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for Model Render": {
      "main": [
        [
          {
            "node": "Check If Render Complete",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check If Render Complete": {
      "main": [
        [
          {
            "node": "Send Render to Slack for Approval",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Timeout in Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Request Approval in Slack": {
      "main": [
        [
          {
            "node": "Check Slack Approval",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When New Shopify Product Created": {
      "main": [
        [
          {
            "node": "Verify Image Presence",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Render to Slack for Approval": {
      "main": [
        [
          {
            "node": "Request Approval in Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

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

About this workflow

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 webhook fires when a product is created. Products without a photo are skipped.…

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

Shopify Trigger, N8N Nodes Dreem, Slack +2
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

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
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