{
  "name": "Auto-create a content kit per new product: studio, on-model + video",
  "nodes": [
    {
      "parameters": {
        "authentication": "accessToken",
        "topic": "products/create"
      },
      "id": "8a7f91bc-74a1-4187-b458-16f32ffcbd02",
      "name": "New Shopify Product",
      "type": "n8n-nodes-base.shopifyTrigger",
      "typeVersion": 1,
      "position": [
        -224,
        0
      ]
    },
    {
      "parameters": {
        "authentication": "apiKey",
        "operation": "generateProductShots",
        "shotCodes": [
          "flat_lay_front",
          "invisible_mannequin_front"
        ],
        "frontImageUrl": "={{ $('New Shopify Product').item.json.images[0].src }}",
        "backImageUrl": "={{ $('New Shopify Product').item.json.images?.[1]?.src ?? '' }}",
        "outputFormat": "jpeg",
        "outputAspectRatio": 5,
        "callbackUrl": "={{ $execution.resumeUrl }}"
      },
      "id": "97dd0d96-eda4-460d-9604-2ca41ce5c68b",
      "name": "Generate Product Shots",
      "type": "n8n-nodes-dreem.dreem",
      "typeVersion": 1,
      "position": [
        240,
        0
      ]
    },
    {
      "parameters": {
        "resume": "webhook",
        "httpMethod": "POST",
        "limitWaitTime": true,
        "resumeAmount": 20,
        "resumeUnit": "minutes",
        "options": {}
      },
      "id": "cb51655f-0bc4-4c47-aa9c-95a400c7d85f",
      "name": "Wait Product Shots",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        464,
        0
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 1
          },
          "conditions": [
            {
              "leftValue": "={{ $json.body?.status ?? $json.status }}",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "rightValue": "completed"
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "072491da-aa20-4a59-a4a9-18a43b541011",
      "name": "Product Shots Done?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        688,
        0
      ]
    },
    {
      "parameters": {
        "authentication": "apiKey",
        "talentId": "b2c80190-4a00-4718-9d3f-c531472d5984",
        "shotCodes": [
          "model_front_women"
        ],
        "frontImageUrl": "={{ $('Wait Product Shots').item.json.body.outputs[0].files[0].url }}",
        "backImageUrl": "={{ $('New Shopify Product').item.json.images?.[1]?.src ?? '' }}",
        "outputFormat": "jpeg",
        "outputAspectRatio": 5,
        "callbackUrl": "={{ $execution.resumeUrl }}"
      },
      "id": "5415eca7-a03b-4d14-9bbf-074d0d007d0e",
      "name": "Generate On-Model",
      "type": "n8n-nodes-dreem.dreem",
      "typeVersion": 1,
      "position": [
        912,
        0
      ]
    },
    {
      "parameters": {
        "resume": "webhook",
        "httpMethod": "POST",
        "limitWaitTime": true,
        "resumeAmount": 20,
        "resumeUnit": "minutes",
        "options": {}
      },
      "id": "15ce3cc5-c7bc-46da-86c7-8266086ca4b8",
      "name": "Wait Model Shots",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        1120,
        0
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 1
          },
          "conditions": [
            {
              "leftValue": "={{ $json.body?.status ?? $json.status }}",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "rightValue": "completed"
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "c7c8ca84-8c0b-43c4-95bf-79067ca6413e",
      "name": "Model Shots Done?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1344,
        0
      ]
    },
    {
      "parameters": {
        "authentication": "apiKey",
        "operation": "generateVideo",
        "firstFrameUrl": "={{ $('Wait Model Shots').item.json.body.outputs[0].files[0].url }}",
        "duration": "5s",
        "promptId": "e9e92395-4f54-417d-94a3-01a72d9ca90b",
        "videoCallbackUrl": "={{ $execution.resumeUrl }}"
      },
      "id": "d40a35d2-3b88-4ffb-933f-750867ed15f7",
      "name": "Generate Video",
      "type": "n8n-nodes-dreem.dreem",
      "typeVersion": 1,
      "position": [
        1568,
        0
      ]
    },
    {
      "parameters": {
        "resume": "webhook",
        "httpMethod": "POST",
        "limitWaitTime": true,
        "resumeAmount": 20,
        "resumeUnit": "minutes",
        "options": {}
      },
      "id": "d5e12c6a-caf4-443e-9bb2-5317743ac522",
      "name": "Wait Video",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        1792,
        0
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 1
          },
          "conditions": [
            {
              "leftValue": "={{ $json.body?.status ?? $json.status }}",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "rightValue": "completed"
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "0c444771-e21a-4814-8b1a-b19a9713ad3a",
      "name": "Video Done?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        2000,
        0
      ]
    },
    {
      "parameters": {
        "authentication": "oAuth2",
        "operation": "sendAndWait",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('⚙️ Configure Kit').item.json.slack_channel_id }}"
        },
        "message": "=Approve the product shots above for *{{ $('New Shopify Product').item.json.title }}*? Approve - added to the product when the kit publishes.",
        "approvalOptions": {
          "values": {
            "approvalType": "double",
            "disapproveLabel": "Reject"
          }
        },
        "options": {
          "limitWaitTime": {
            "values": {
              "resumeAmount": 12,
              "resumeUnit": "hours"
            }
          }
        }
      },
      "id": "c2699cd2-d6cc-4e9f-a69d-1e4e21c233b5",
      "name": "Approve Product Shots",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.5,
      "position": [
        2416,
        0
      ]
    },
    {
      "parameters": {
        "authentication": "oAuth2",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('⚙️ Configure Kit').item.json.slack_channel_id }}"
        },
        "text": "=⚠️ A Dreem kit lane timed out for *{{ $('New Shopify Product').item.json.title }}*. Check the Dreem dashboard and retry.",
        "otherOptions": {}
      },
      "id": "46f260ff-6bcb-417b-ba0b-46b55a5e2870",
      "name": "Timed Out",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.5,
      "position": [
        1344,
        192
      ]
    },
    {
      "parameters": {
        "content": "## 🟡 Setup - start here\n\nEvery **new Shopify product** gets a content kit, generated as a chain:\n**1. Product shots** (from your product photos) → **2. On-model shot** (an AI model wearing your product, generated from the product shot) → **3. Video** (animates the model shot).\n\nYou approve each asset in Slack. Approved images are added to the product's photos; an approved video is uploaded to Product → Media.\n\n### Do this once\n1. **Credentials** (Settings → Credentials) - create + select: **Dreem API** (`dreem_pk_...`) on the three **Generate** nodes · **Shopify Access Token** (`read_products` + `write_products`) on **New Shopify Product**, **Publish to Shopify**, **Stage Shopify Upload** + **Attach Video to Product** · **Slack OAuth2** (on n8n Cloud just press *Connect*) on all seven Slack nodes — or a *Slack API* bot token + switch each Slack node's **Authentication** to *Access Token*.\n2. **Pick your creative** in the three Generate nodes (poses, model, video prompt) - see the note under each.\n3. **⚙️ Configure Kit** - set your Slack channel + store domain.\n4. Toggle **Active**.\n\n### Good to know\n- Each generation waits up to **20 min**; if one stalls you get a Slack alert instead of a kit.\n- After all 3 assets render, each is posted to Slack followed by its approval card: product shots → on-model → video.\n- **Approve** = published · **Reject** = skipped · no answer for **12h** = skipped.\n- Publishing is non-destructive: your existing product photos stay.",
        "height": 640,
        "width": 940,
        "color": 7
      },
      "id": "c9ec893d-a7be-4de3-ac27-addabd89d1a7",
      "name": "Setup — Start Here",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -64,
        -896
      ]
    },
    {
      "parameters": {
        "authentication": "accessToken",
        "resource": "product",
        "operation": "update",
        "productId": "={{ $('New Shopify Product').item.json.id }}",
        "updateFields": {
          "images": "={{ ($('New Shopify Product').item.json.images || []).map(i => ({ id: i.id })).concat($('Approve Product Shots').item.json.data?.approved ? ($('Wait Product Shots').item.json.body.outputs || []).map(o => ({ src: o.files[0].url })) : []).concat($('Approve On-Model').item.json.data?.approved ? [{ src: $('Wait Model Shots').item.json.body.outputs[0].files[0].url }] : []) }}"
        }
      },
      "id": "1af2e926-a4ff-4365-8d28-fd1d51021ae6",
      "name": "Publish to Shopify",
      "type": "n8n-nodes-base.shopify",
      "typeVersion": 1,
      "position": [
        3456,
        -16
      ]
    },
    {
      "parameters": {
        "url": "={{ $('Wait Video').item.json.body?.outputs?.[0]?.files?.[0]?.url ?? $('Wait Video').item.json.outputs?.[0]?.files?.[0]?.url }}",
        "options": {
          "response": {
            "response": {
              "fullResponse": true,
              "responseFormat": "file"
            }
          }
        }
      },
      "id": "f2a9c71a-1e22-473b-b195-f97bdaf6d25e",
      "name": "Download Video",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        3648,
        -16
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $('⚙️ Configure Kit').item.json.shopify_store_domain }}/admin/api/2024-07/graphql.json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "shopifyAccessTokenApi",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ query: 'mutation stagedUploadsCreate($input: [StagedUploadInput!]!) { stagedUploadsCreate(input: $input) { stagedTargets { url resourceUrl parameters { name value } } userErrors { field message } } }', variables: { input: [{ filename: 'dreem-' + $('New Shopify Product').item.json.id + '.mp4', mimeType: 'video/mp4', resource: 'VIDEO', fileSize: $json.headers['content-length'], httpMethod: 'POST' }] } }) }}",
        "options": {}
      },
      "id": "b03c9867-89eb-40fe-9d72-809d52a2bf99",
      "name": "Stage Shopify Upload",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        3840,
        -16
      ]
    },
    {
      "parameters": {
        "mode": "combine",
        "combineBy": "combineByPosition",
        "options": {}
      },
      "id": "76e52c1d-7e21-4c1f-8504-668836daaa89",
      "name": "Merge File + Target",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2,
      "position": [
        4048,
        -16
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $json.data.stagedUploadsCreate.stagedTargets[0].url }}",
        "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 }}"
            },
            {
              "parameterType": "formBinaryData",
              "name": "file",
              "inputDataFieldName": "data"
            }
          ]
        },
        "options": {}
      },
      "id": "ab64c61b-144b-4e4e-9b6f-59a4746a930d",
      "name": "Upload Video File",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        4240,
        -16
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $('⚙️ Configure Kit').item.json.shopify_store_domain }}/admin/api/2024-07/graphql.json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "shopifyAccessTokenApi",
        "sendBody": true,
        "specifyBody": "json",
        "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/' + $('New Shopify Product').item.json.id, media: [{ originalSource: $('Stage Shopify Upload').item.json.data.stagedUploadsCreate.stagedTargets[0].resourceUrl, mediaContentType: 'VIDEO', alt: 'Dreem video — ' + $('New Shopify Product').item.json.title }] } }) }}",
        "options": {}
      },
      "id": "5173830a-c3b1-492a-83d8-88697a2c3f4a",
      "name": "Attach Video to Product",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        4512,
        -16
      ]
    },
    {
      "parameters": {
        "content": "### 🎬 Video → Shopify media\nRuns only when the video was **approved**: downloads the file and attaches it to **Product → Media** (Shopify takes ~1 min to process it). Nothing to configure here - just select your **Shopify credential** on **Stage Shopify Upload** and **Attach Video to Product**.",
        "height": 220,
        "width": 1160,
        "color": 6
      },
      "id": "2644e2d5-f16c-4b4c-a322-523d0c1c6492",
      "name": "Note — Video Upload",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        3504,
        -576
      ]
    },
    {
      "parameters": {
        "authentication": "oAuth2",
        "operation": "sendAndWait",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('⚙️ Configure Kit').item.json.slack_channel_id }}"
        },
        "message": "=Approve the on-model shot above for *{{ $('New Shopify Product').item.json.title }}*? Approve - added to the product when the kit publishes.",
        "approvalOptions": {
          "values": {
            "approvalType": "double",
            "disapproveLabel": "Reject"
          }
        },
        "options": {
          "limitWaitTime": {
            "values": {
              "resumeAmount": 12,
              "resumeUnit": "hours"
            }
          }
        }
      },
      "id": "1fc4210b-fbd4-442b-acaa-9a7ff7b35489",
      "name": "Approve On-Model",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.5,
      "position": [
        2800,
        0
      ]
    },
    {
      "parameters": {
        "authentication": "oAuth2",
        "operation": "sendAndWait",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('⚙️ Configure Kit').item.json.slack_channel_id }}"
        },
        "message": "=Approve the video above for *{{ $('New Shopify Product').item.json.title }}*? Approve - uploaded to the product's media. After this click, everything approved gets published.",
        "approvalOptions": {
          "values": {
            "approvalType": "double",
            "disapproveLabel": "Reject"
          }
        },
        "options": {
          "limitWaitTime": {
            "values": {
              "resumeAmount": 12,
              "resumeUnit": "hours"
            }
          }
        }
      },
      "id": "9e5e8174-887d-423c-9088-2beccd63b150",
      "name": "Approve Video",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.5,
      "position": [
        3184,
        0
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "slack_channel_id",
              "value": "YOUR-SLACK-CHANNEL-ID",
              "type": "string"
            },
            {
              "id": "a2",
              "name": "shopify_store_domain",
              "value": "YOUR-STORE.myshopify.com",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "a624ee0a-465c-486d-8002-55fd84fd1cee",
      "name": "⚙️ Configure Kit",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "content": "### ⚙️ Configure Kit\nTwo fields only:\n- **slack_channel_id** - the channel that gets the approval cards (in Slack: right-click the channel → Copy link → the ID starts with `C`).\n- **shopify_store_domain** - your `*.myshopify.com` domain (only used for the video upload).\n\nEverything creative (poses, model, video prompt) is picked directly in the three Generate nodes →",
        "height": 388,
        "width": 396,
        "color": 4
      },
      "id": "1d0aaa93-6fd8-40b9-8723-5fb5d6b6a1bf",
      "name": "Note - Configure",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -192,
        224
      ]
    },
    {
      "parameters": {
        "content": "### 1️⃣ Product shots - pick in the node\nOpen **Generate Product Shots** and choose:\n- **Shot Codes** - the product-shot poses (e.g. flat lay, invisible mannequin). The **first one** is also the garment input for the on-model shot.\n- **Output Aspect Ratio** + **Format**\n\nThe front image is the product's first photo; the second photo (if any) is used as the back.\n\n👀 Browse all product-shot poses on your product in the Dreem app - [dreem.ai](https://dreem.ai).",
        "height": 380,
        "width": 476,
        "color": 4
      },
      "id": "f361ec2a-3072-4978-941a-e6fff94af221",
      "name": "Note - Product Shots",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        240,
        224
      ]
    },
    {
      "parameters": {
        "content": "### 2️⃣ On-model shot - pick in the node\nOpen **Generate On-Model** and choose:\n- **Talent** - the AI model wearing your product\n- **Shot Codes** - the pose(s). Match the talent's gender: codes end in `_women` / `_men`.\n- **Output Aspect Ratio** + **Format**\n\nThe garment input is the **generated product shot** (already wired). **Styling Image URLs** (optional): add garment URLs to style the look; leave empty and Dreem styles the outfit itself.\n\n👀 Browse talents and their poses on your product in the Dreem app - [dreem.ai](https://dreem.ai).",
        "height": 440,
        "width": 440,
        "color": 4
      },
      "id": "59006456-a401-4a13-89cb-aa341fe955d5",
      "name": "Note - On-Model",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        816,
        224
      ]
    },
    {
      "parameters": {
        "content": "### 3️⃣ Video - pick in the node\nOpen **Generate Video** and choose:\n- **Video Prompt** - the motion style\n- **Duration** - `5s` or `10s`\n\nThe first frame is the **generated on-model shot** (already wired), so you get on-model motion.\n\n👀 Browse all video prompts on your product in the Dreem app - [dreem.ai](https://dreem.ai).",
        "height": 340,
        "width": 440,
        "color": 4
      },
      "id": "73ea7422-d22f-4b6f-ba28-5d9f7af1e79b",
      "name": "Note - Video",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1568,
        224
      ]
    },
    {
      "parameters": {
        "authentication": "oAuth2",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('⚙️ Configure Kit').item.json.slack_channel_id }}"
        },
        "text": "=*Content kit 1/3 - Product shots* for *{{ $('New Shopify Product').item.json.title }}*\n{{ $('Wait Product Shots').item.json.body.outputs[0].files[0].url }}\n{{ $('Wait Product Shots').item.json.body.outputs?.[1]?.files?.[0]?.url ?? '' }}",
        "otherOptions": {}
      },
      "id": "8b8dcef6-a4ff-4aa2-86a5-b6011598f8d8",
      "name": "Post Product Shots",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.5,
      "position": [
        2224,
        0
      ]
    },
    {
      "parameters": {
        "authentication": "oAuth2",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('⚙️ Configure Kit').item.json.slack_channel_id }}"
        },
        "text": "=*Content kit 2/3 - On-model shot* for *{{ $('New Shopify Product').item.json.title }}*\n{{ $('Wait Model Shots').item.json.body.outputs[0].files[0].url }}",
        "otherOptions": {}
      },
      "id": "a84c16ac-5f9c-4ef2-be4a-2567dfbd6766",
      "name": "Post On-Model",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.5,
      "position": [
        2608,
        0
      ]
    },
    {
      "parameters": {
        "authentication": "oAuth2",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('⚙️ Configure Kit').item.json.slack_channel_id }}"
        },
        "text": "=*Content kit 3/3 - Video* for *{{ $('New Shopify Product').item.json.title }}*\n{{ $('Wait Video').item.json.body.outputs[0].files[0].url }}",
        "otherOptions": {}
      },
      "id": "f08a8494-cb25-4d02-8df6-6bce720d1608",
      "name": "Post Video",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.5,
      "position": [
        2992,
        0
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 1
          },
          "conditions": [
            {
              "leftValue": "={{ $('Approve Video').item.json.data?.approved ?? false }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "a9d48a8c-c26d-590b-902b-53d6ccf5e43d",
      "name": "Video Approved?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        3552,
        -176
      ]
    }
  ],
  "connections": {
    "Generate Video": {
      "main": [
        [
          {
            "node": "Wait Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Product Shots": {
      "main": [
        [
          {
            "node": "Wait Product Shots",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait Product Shots": {
      "main": [
        [
          {
            "node": "Product Shots Done?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Product Shots Done?": {
      "main": [
        [
          {
            "node": "Generate On-Model",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Timed Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait Model Shots": {
      "main": [
        [
          {
            "node": "Model Shots Done?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Model Shots Done?": {
      "main": [
        [
          {
            "node": "Generate Video",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Timed Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait Video": {
      "main": [
        [
          {
            "node": "Video Done?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Video Done?": {
      "main": [
        [
          {
            "node": "Post Product Shots",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Timed Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Video": {
      "main": [
        [
          {
            "node": "Stage Shopify Upload",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge File + Target",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Stage Shopify Upload": {
      "main": [
        [
          {
            "node": "Merge File + Target",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge File + Target": {
      "main": [
        [
          {
            "node": "Upload Video File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload Video File": {
      "main": [
        [
          {
            "node": "Attach Video to Product",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Approve Video": {
      "main": [
        [
          {
            "node": "Publish to Shopify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Publish to Shopify": {
      "main": [
        [
          {
            "node": "Video Approved?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate On-Model": {
      "main": [
        [
          {
            "node": "Wait Model Shots",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "New Shopify Product": {
      "main": [
        [
          {
            "node": "⚙️ Configure Kit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "⚙️ Configure Kit": {
      "main": [
        [
          {
            "node": "Generate Product Shots",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post Product Shots": {
      "main": [
        [
          {
            "node": "Approve Product Shots",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Approve Product Shots": {
      "main": [
        [
          {
            "node": "Post On-Model",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post On-Model": {
      "main": [
        [
          {
            "node": "Approve On-Model",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Approve On-Model": {
      "main": [
        [
          {
            "node": "Post Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post Video": {
      "main": [
        [
          {
            "node": "Approve Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Video Approved?": {
      "main": [
        [
          {
            "node": "Download Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate"
  }
}