{
  "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
          }
        ]
      ]
    }
  }
}