AutomationFlowsEmail & Gmail › Generate Product Demo Highlight Reels Using Wayinvideo Find Moments API

Generate Product Demo Highlight Reels Using Wayinvideo Find Moments API

ByIncrementors @incrementors on n8n.io

Fill in a simple form with your demo recording URL, your product name, and describe the moments you want to find in plain English — the workflow does the rest. WayinVideo AI scans your full recording and extracts the exact clips that match your search query. You receive a…

Event trigger★★★★☆ complexity14 nodesForm TriggerHTTP RequestGmail
Email & Gmail Trigger: Event Nodes: 14 Complexity: ★★★★☆ Added:

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

This workflow follows the Form Trigger → Gmail 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
{
  "nodes": [
    {
      "id": "10b72a9f-fcf7-4ca8-8456-1e8d4be00b1b",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2144,
        -336
      ],
      "parameters": {
        "width": 460,
        "height": 772,
        "content": "## Product Demo Highlight Reel Generator\n\nFor product marketers, sales teams, and content creators who want to extract the best moments from demo recordings without manual scrubbing. Submit a demo recording URL with a plain-English query describing what moments to find. WayinVideo AI scans the full recording, extracts matching clips, and sends a formatted review email with every clip title, timestamp, relevance score, description, and a download link.\n\n## How it works\n- **1. Form \u2014 Demo URL + Query + Email** collects the recording URL, product name, moment query, and recipient email\n- **2. WayinVideo \u2014 Submit Find Moments** sends the video and query to WayinVideo Find Moments API\n- **3. Wait \u2014 90 Seconds** pauses to allow WayinVideo time to start processing\n- **4. WayinVideo \u2014 Get Moments Result** polls the API for the completed result\n- **5. IF \u2014 Status SUCCEEDED?** checks if processing is done \u2014 retries every 30 seconds if not\n- **7. Gmail \u2014 Send Review Email** formats all clips into a clean HTML email and sends it\n\n## Set up steps\n1. In **2. WayinVideo \u2014 Submit Find Moments** \u2014 replace YOUR_WAYINVIDEO_API_KEY in the Authorization header\n2. In **4. WayinVideo \u2014 Get Moments Result** \u2014 replace YOUR_WAYINVIDEO_API_KEY in the Authorization header\n3. In **7. Gmail \u2014 Send Review Email** \u2014 connect your Gmail account via Google OAuth2\n4. Activate the workflow and open the Form URL to test"
      },
      "typeVersion": 1
    },
    {
      "id": "fb6b38b8-fad2-4785-97e4-b39ad215814f",
      "name": "Section \u2014 Form Input",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1648,
        -304
      ],
      "parameters": {
        "color": 5,
        "height": 340,
        "content": "## Form Input\nUser submits the demo recording URL, product name, moment query, and review email address. Submitting the form triggers the workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "4eff62d7-2199-4d60-b362-f99624fe9f65",
      "name": "Section \u2014 Moment Submission",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1392,
        -304
      ],
      "parameters": {
        "color": 6,
        "height": 340,
        "content": "## Moment Submission\nSends the video URL and search query to WayinVideo Find Moments API. Returns a task ID used to poll for results."
      },
      "typeVersion": 1
    },
    {
      "id": "23cd5e04-0aee-471b-ab0f-5d8c1c4f88be",
      "name": "Section \u2014 Processing and Poll",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1136,
        -304
      ],
      "parameters": {
        "color": 6,
        "width": 660,
        "height": 484,
        "content": "## Processing and Poll\nWaits 90 seconds then checks if WayinVideo has finished. If clips are not ready, waits 30 more seconds and checks again. Loops until status is SUCCEEDED."
      },
      "typeVersion": 1
    },
    {
      "id": "8ce1dc3a-98f9-41c6-97bd-6fde2109a891",
      "name": "Section \u2014 Review Email",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -448,
        -304
      ],
      "parameters": {
        "color": 4,
        "width": 336,
        "height": 324,
        "content": "## Review Email\nFormats all clip results into a clean HTML email with titles, timestamps, scores, descriptions, and download links. Sends via Gmail."
      },
      "typeVersion": 1
    },
    {
      "id": "e6116ad6-502f-4a09-affd-ba4d7a1f9e13",
      "name": "Note \u2014 Infinite Loop Risk",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1520,
        272
      ],
      "parameters": {
        "color": 3,
        "width": 444,
        "content": "## \u26a0\ufe0f Infinite Retry Loop Risk\nIf WayinVideo never returns SUCCEEDED \u2014 for example due to an invalid URL, private video, or API error \u2014 this workflow loops forever between nodes 4 and 6. Add a retry counter and a second IF node to stop after 10 attempts and send an error email instead."
      },
      "typeVersion": 1
    },
    {
      "id": "473c1155-7dcb-4b32-a900-a75160be085b",
      "name": "Note \u2014 Export Links Expire",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -704,
        288
      ],
      "parameters": {
        "color": 3,
        "width": 396,
        "content": "## \u26a0\ufe0f Download Links Expire in 24h\nThe export_link URLs inside the email are temporary and expire after 24 hours. Download clips immediately after receiving the email, or add a Google Drive upload step before the Gmail node to save clips permanently."
      },
      "typeVersion": 1
    },
    {
      "id": "33dfff70-1a97-4c8b-ade8-be920b714fbc",
      "name": "1. Form \u2014 Demo URL + Query + Email",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -1600,
        -144
      ],
      "parameters": {
        "options": {},
        "formTitle": "\ud83c\udfac Product Demo Highlight Reel Generator",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Demo Recording URL",
              "placeholder": "https://zoom.us/rec/xxxxxxx or YouTube link",
              "requiredField": true
            },
            {
              "fieldLabel": "Product / Brand Name",
              "placeholder": "e.g. Incrementors CRM, MyApp, SaaSProduct",
              "requiredField": true
            },
            {
              "fieldLabel": "What Moments To Find",
              "placeholder": "e.g. pricing and cost discussion",
              "requiredField": true
            },
            {
              "fieldLabel": "Send Review Email To",
              "placeholder": "user@example.com",
              "requiredField": true
            }
          ]
        },
        "formDescription": "Paste your product demo recording URL \u2014 AI will find exact moments you need and send clips to your email for review."
      },
      "typeVersion": 2.2
    },
    {
      "id": "1de987e8-ff93-498e-ae45-36562aa4e400",
      "name": "2. WayinVideo \u2014 Submit Find Moments",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1344,
        -144
      ],
      "parameters": {
        "url": "https://wayinvideo-api.wayin.ai/api/v2/clips/find-moments",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"video_url\": \"{{ $json['Demo Recording URL'] }}\",\n  \"query\": \"{{ $json['What Moments To Find'] }}\",\n  \"project_name\": \"{{ $json['Product / Brand Name'] }}\",\n  \"limit\": 5,\n  \"enable_export\": true,\n  \"resolution\": \"HD_720\",\n  \"enable_caption\": true,\n  \"caption_display\": \"original\",\n  \"cc_style_tpl\": \"temp-7\",\n  \"enable_ai_reframe\": false,\n  \"target_lang\": \"en\"\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            },
            {
              "name": "x-wayinvideo-api-version",
              "value": "v2"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "00533754-feab-4f6c-ae65-6d4ab53a0abf",
      "name": "3. Wait \u2014 90 Seconds",
      "type": "n8n-nodes-base.wait",
      "position": [
        -1088,
        -144
      ],
      "parameters": {
        "amount": 90
      },
      "typeVersion": 1.1
    },
    {
      "id": "5866fbc2-b14f-4523-99ae-2e6cd8f8d25a",
      "name": "4. WayinVideo \u2014 Get Moments Result",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -880,
        -144
      ],
      "parameters": {
        "url": "=https://wayinvideo-api.wayin.ai/api/v2/clips/find-moments/results/{{ $('2. WayinVideo \u2014 Submit Find Moments').item.json.data.id }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            },
            {
              "name": "x-wayinvideo-api-version",
              "value": "v2"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "b0311624-a1c0-47cd-a1b9-2c88f991c84f",
      "name": "5. IF \u2014 Status SUCCEEDED?",
      "type": "n8n-nodes-base.if",
      "position": [
        -640,
        -144
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "cond-status-check",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.data.status }}",
              "rightValue": "SUCCEEDED"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "a90e937d-9975-4d6a-be4a-30083d6e30a7",
      "name": "6. Wait \u2014 30 Seconds Retry",
      "type": "n8n-nodes-base.wait",
      "position": [
        -640,
        64
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "8f78ffa9-ad44-48eb-bf75-b8753f7a2115",
      "name": "7. Gmail \u2014 Send Review Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -336,
        -160
      ],
      "parameters": {
        "sendTo": "={{ $('1. Form \u2014 Demo URL + Query + Email').item.json['Send Review Email To'] }}",
        "message": "=<div style=\"font-family:Arial,sans-serif;max-width:600px;margin:0 auto;color:#222;\">\n\n<div style=\"background:#1a1a1a;padding:24px;text-align:center;\">\n  <h1 style=\"color:#fff;font-size:22px;margin:0;\">\ud83c\udfac Demo Highlight Clips Ready</h1>\n  <p style=\"color:#aaa;font-size:13px;margin:8px 0 0;\">{{ $('1. Form \u2014 Demo URL + Query + Email').item.json['Product / Brand Name'] }}</p>\n</div>\n\n<div style=\"padding:24px;\">\n  <p style=\"font-size:15px;\">Hi,</p>\n  <p>Your demo highlight clips are ready for review.</p>\n  <p><strong>Query Used:</strong> {{ $('1. Form \u2014 Demo URL + Query + Email').item.json['What Moments To Find'] }}</p>\n  <p><strong>Full Recording:</strong> <a href=\"{{ $('1. Form \u2014 Demo URL + Query + Email').item.json['Demo Recording URL'] }}\" style=\"color:#1a1a1a;\">View Full Demo</a></p>\n  <p style=\"font-size:13px;color:#888;\">Total Clips Found: {{ $('4. WayinVideo \u2014 Get Moments Result').item.json.data.clips.length }}</p>\n</div>\n\n<hr style=\"border:none;border-top:1px solid #eee;margin:0 24px;\"/>\n\n{{ $('4. WayinVideo \u2014 Get Moments Result').item.json.data.clips.map((c, i) => `\n<div style=\"padding:20px 24px;border-bottom:1px solid #f0f0f0;\">\n  <h3 style=\"margin:0 0 8px;font-size:15px;color:#1a1a1a;\">Clip ${i+1}: ${c.title}</h3>\n  <table style=\"font-size:12px;color:#666;margin-bottom:8px;\">\n    <tr>\n      <td style=\"padding-right:16px;\">\u23f1 <strong>Timestamp:</strong> ${Math.floor(c.begin_ms/1000)}s \u2014 ${Math.floor(c.end_ms/1000)}s</td>\n      <td>\ud83d\udd25 <strong>Relevance Score:</strong> ${c.score}/100</td>\n    </tr>\n  </table>\n  <p style=\"margin:6px 0;font-size:13px;color:#444;\">${c.desc}</p>\n  <p style=\"margin:4px 0;font-size:12px;color:#aaa;\">${c.tags.join(' ')}</p>\n  <a href=\"${c.export_link}\" style=\"display:inline-block;margin-top:10px;padding:8px 16px;background:#1a1a1a;color:#fff;text-decoration:none;border-radius:4px;font-size:12px;font-weight:bold;\">\u2b07 Download Clip</a>\n</div>\n`).join('') }}\n\n<div style=\"padding:24px;background:#f9f9f9;\">\n  <p style=\"font-size:12px;color:#999;margin:0;\">\u26a0\ufe0f Download links expire in <strong>24 hours</strong>. Please download your clips promptly.</p>\n  <p style=\"font-size:12px;color:#999;margin:8px 0 0;\">Powered by WayinVideo Find Moments API</p>\n</div>\n\n</div>",
        "options": {},
        "subject": "=\ud83c\udfac Demo Highlight Clips Ready \u2014 {{ $('1. Form \u2014 Demo URL + Query + Email').item.json['Product / Brand Name'] }}"
      },
      "typeVersion": 2.1
    }
  ],
  "connections": {
    "3. Wait \u2014 90 Seconds": {
      "main": [
        [
          {
            "node": "4. WayinVideo \u2014 Get Moments Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5. IF \u2014 Status SUCCEEDED?": {
      "main": [
        [
          {
            "node": "7. Gmail \u2014 Send Review Email",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "6. Wait \u2014 30 Seconds Retry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6. Wait \u2014 30 Seconds Retry": {
      "main": [
        [
          {
            "node": "4. WayinVideo \u2014 Get Moments Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1. Form \u2014 Demo URL + Query + Email": {
      "main": [
        [
          {
            "node": "2. WayinVideo \u2014 Submit Find Moments",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4. WayinVideo \u2014 Get Moments Result": {
      "main": [
        [
          {
            "node": "5. IF \u2014 Status SUCCEEDED?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2. WayinVideo \u2014 Submit Find Moments": {
      "main": [
        [
          {
            "node": "3. Wait \u2014 90 Seconds",
            "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

Fill in a simple form with your demo recording URL, your product name, and describe the moments you want to find in plain English — the workflow does the rest. WayinVideo AI scans your full recording and extracts the exact clips that match your search query. You receive a…

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

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

Echo Brand Voice Analysis (Processor) - TASK-074 Dec 10 Fix. Uses formTrigger, httpRequest, executeWorkflowTrigger, moveBinaryData. Event-driven trigger; 40 nodes.

Form Trigger, HTTP Request, Execute Workflow Trigger +2
Email & Gmail

Streamline your content pipeline by bridging Notion and Instagram with a professional "review-before-publish" safeguard. This workflow allows team members to submit content via a simple form, generate

Form Trigger, HTTP Request, N8N Nodes Uploadtourl +1
Email & Gmail

🎥 Analyze YouTube Video for Summaries, Transcripts & Content + Google Gemini AI. Uses stickyNote, httpRequest, googleDrive, gmail. Event-driven trigger; 33 nodes.

HTTP Request, Google Drive, Gmail +2
Email & Gmail

This n8n template automates PDF translation into 1 or 2 target languages while maintaining professional formatting. Users submit PDFs via web form and receive translated documents via email with prese

Google Translate, HTTP Request, Form Trigger +2
Email & Gmail

Submit any YouTube, Vimeo, or Zoom webinar URL using a simple form and the workflow handles everything from there. It runs a two-phase pipeline: first identifying the top viral moments in your video w

Form Trigger, HTTP Request, Google Sheets +1