Back to n8n Workflows

Generate Video Reactions To Your Reels

Rhys Fisher Rhys Fisher

Get your social media reels seen by AI personas to answer "how might our audience react to this?", remove uncertainty, and walk away with a ready‑to‑share compilation of 8‑second reactions from lifelike AI personas.

Generate Video Reactions To Your Reels n8n workflow diagram

Click to expand

Summarize in
OR

Overview

This workflow is a human reaction simulator that automatically generates video reel compilations of 8-second reaction clips. You set how many reactions you want to simulate, select an audience ID, then upload a reel so the workflow can run simulations with AskRally, propmt the veo3 reactions, and concatenate the results into ready-to-share video final sequence.

 

🎯 Pro Tips & Secret Sauce

The power of this reaction simulator is in how it runs simulations using AskRally because this gives you some control over which audience you test against. The responses are more realistic than using GPT out of the box since we work hard to give bots empathy and remove a lot of the safety guardrails than makes LLMs too nice. Pair this with a video generator like Veo3 and you have a recipe to view dozens of simulated reactions in minutes to reduce the risk of your next banger reel.  

📝 Step-by-Step Instructions

  1. Reel in
  2. Reaction Real out
  3. Share with your collegues and boss

📋 Requirements

  • Fal.ai API key and credits for /fal-ai/veo3 usage
  • AskRally API key and paid plan
  • Gdrive API Auth
  • FFmpeg running with your n8n instance

🚀 n8n Workflow Template

{
  "active": false,
  "connections": {
    "Completed?": {
      "main": [
        [
          {
            "index": 0,
            "node": "Get Url Video",
            "type": "main"
          }
        ],
        [
          {
            "index": 0,
            "node": "Wait 60 sec.",
            "type": "main"
          }
        ]
      ]
    },
    "Create Video1": {
      "main": [
        [
          {
            "index": 0,
            "node": "Wait 60 sec.",
            "type": "main"
          }
        ]
      ]
    },
    "Download Video": {
      "main": [
        [
          {
            "index": 0,
            "node": "Loop Over Items1",
            "type": "main"
          }
        ]
      ]
    },
    "Get File Video": {
      "main": [
        [
          {
            "index": 0,
            "node": "Upload Drive",
            "type": "main"
          }
        ]
      ]
    },
    "Get Personas": {
      "main": [
        [
          {
            "index": 0,
            "node": "Split Personas",
            "type": "main"
          }
        ]
      ]
    },
    "Get Url Video": {
      "main": [
        [
          {
            "index": 0,
            "node": "Get File Video",
            "type": "main"
          }
        ]
      ]
    },
    "Get status": {
      "main": [
        [
          {
            "index": 0,
            "node": "Completed?",
            "type": "main"
          }
        ]
      ]
    },
    "Loop Over Items1": {
      "main": [
        [
          {
            "index": 0,
            "node": "Write Files To Disk For FFmpeg",
            "type": "main"
          }
        ],
        [
          {
            "index": 0,
            "node": "Create Video1",
            "type": "main"
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "index": 0,
            "node": "veo3 prompt gen",
            "type": "main"
          }
        ]
      ]
    },
    "Merge Videos with FFmpeg": {
      "main": [
        [
          {
            "index": 0,
            "node": "Read/Write Files from Disk",
            "type": "main"
          }
        ]
      ]
    },
    "Pass to AskRally": {
      "main": [
        [
          {
            "index": 0,
            "node": "Simulate",
            "type": "main"
          }
        ]
      ]
    },
    "Prep File Concatenate": {
      "main": [
        [
          {
            "index": 0,
            "node": "Merge Videos with FFmpeg",
            "type": "main"
          }
        ]
      ]
    },
    "Read/Write Files from Disk": {
      "main": [
        [
          {
            "index": 0,
            "node": "Save Final Reaction Reel",
            "type": "main"
          }
        ]
      ]
    },
    "Select # of Responses": {
      "main": [
        [
          {
            "index": 0,
            "node": "Merge",
            "type": "main"
          }
        ]
      ]
    },
    "Simulate": {
      "main": [
        [
          {
            "index": 0,
            "node": "Split Reactions",
            "type": "main"
          },
          {
            "index": 0,
            "node": "Get Personas",
            "type": "main"
          }
        ]
      ]
    },
    "Split Personas": {
      "main": [
        [
          {
            "index": 1,
            "node": "Merge",
            "type": "main"
          }
        ]
      ]
    },
    "Split Reactions": {
      "main": [
        [
          {
            "index": 0,
            "node": "Select # of Responses",
            "type": "main"
          }
        ]
      ]
    },
    "Upload Drive": {
      "main": [
        [
          {
            "index": 0,
            "node": "Download Video",
            "type": "main"
          }
        ]
      ]
    },
    "Upload Reel": {
      "main": [
        [
          {
            "index": 0,
            "node": "Pass to AskRally",
            "type": "main"
          }
        ]
      ]
    },
    "Wait 60 sec.": {
      "main": [
        [
          {
            "index": 0,
            "node": "Get status",
            "type": "main"
          }
        ]
      ]
    },
    "Write Files To Disk For FFmpeg": {
      "main": [
        [
          {
            "index": 0,
            "node": "Prep File Concatenate",
            "type": "main"
          }
        ]
      ]
    },
    "veo3 prompt gen": {
      "main": [
        [
          {
            "index": 0,
            "node": "Loop Over Items1",
            "type": "main"
          }
        ]
      ]
    }
  },
  "id": "ZN6WuHkUgE03g97L",
  "meta": {
    "instanceId": "cdcbffd76a000b9f6e1104bd699ae3897b3683c556296c221e4bf9d5afa70e64",
    "templateCredsSetupCompleted": true
  },
  "name": "Simulate Video Reel Reactions",
  "nodes": [
    {
      "id": "6d17dc0e-4643-4f2b-bca1-ebeb7d5ca88f",
      "name": "Sticky Note1",
      "parameters": {
        "content": "# Simulate Reactions With AskRally",
        "height": 700,
        "width": 1732
      },
      "position": [
        -800,
        -736
      ],
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1
    },
    {
      "credentials": {
        "httpHeaderAuth": {
          "id": "Ee3p4v7f0FX4lMiE",
          "name": "Header Auth account"
        }
      },
      "id": "d619e9b9-bb22-47e5-8e91-7d3e58b1fb44",
      "name": "Get status",
      "parameters": {
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {},
        "url": "=https://queue.fal.run/fal-ai/veo3/requests/{{ $(\u0027Create Video1\u0027).item.json.request_id }}/status"
      },
      "position": [
        1744,
        -512
      ],
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2
    },
    {
      "id": "724904b5-97c1-4607-9a85-6195790714da",
      "name": "Wait 60 sec.",
      "parameters": {
        "amount": 60
      },
      "position": [
        1552,
        -512
      ],
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "webhookId": "490facb8-d0ae-402e-ab59-a87720cf0bdd"
    },
    {
      "id": "3de4cc0e-b309-4c08-9b22-458f085c84fd",
      "name": "Completed?",
      "parameters": {
        "conditions": {
          "combinator": "and",
          "conditions": [
            {
              "id": "383d112e-2cc6-4dd4-8985-f09ce0bd1781",
              "leftValue": "={{ $json.status }}",
              "operator": {
                "name": "filter.operator.equals",
                "operation": "equals",
                "type": "string"
              },
              "rightValue": "COMPLETED"
            }
          ],
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          }
        },
        "options": {}
      },
      "position": [
        1952,
        -512
      ],
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2
    },
    {
      "credentials": {
        "httpHeaderAuth": {
          "id": "Ee3p4v7f0FX4lMiE",
          "name": "Header Auth account"
        }
      },
      "id": "32a94354-3c7f-4408-b91b-102530c690bb",
      "name": "Get Url Video",
      "parameters": {
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {},
        "url": "=https://queue.fal.run/fal-ai/veo3/requests/{{ $node[\u0027Create Video1\u0027].json.request_id }}\n"
      },
      "position": [
        2176,
        -528
      ],
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2
    },
    {
      "id": "d8236677-4167-4dd1-b9a4-c6334b8ef2dd",
      "name": "Get File Video",
      "parameters": {
        "options": {},
        "url": "={{ $node[\"Get Url Video\"].json.video.url }}"
      },
      "position": [
        2368,
        -528
      ],
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2
    },
    {
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "jUO4EvfLl5QrzQbq",
          "name": "Google Drive account"
        }
      },
      "id": "40e6cebf-d53d-4dea-8c8c-4fd1b8e9ba38",
      "name": "Upload Drive",
      "parameters": {
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "mode": "url",
          "value": "https://drive.google.com/drive/folders/1UfQ3CY9RndqMqk7B581XyRr7JD9iHpkv"
        },
        "options": {}
      },
      "position": [
        2192,
        -240
      ],
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3
    },
    {
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "jUO4EvfLl5QrzQbq",
          "name": "Google Drive account"
        }
      },
      "id": "d90f330a-77cd-4126-8553-7bf0f6161d5d",
      "name": "Download Video",
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "operation": "download",
        "options": {}
      },
      "position": [
        2416,
        -240
      ],
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3
    },
    {
      "credentials": {
        "httpHeaderAuth": {
          "id": "Ee3p4v7f0FX4lMiE",
          "name": "Header Auth account"
        }
      },
      "id": "c9615767-1e24-4790-bf88-bd65bb040aaf",
      "name": "Create Video1",
      "parameters": {
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "prompt",
              "value": "={{$json.prompt}}"
            }
          ]
        },
        "genericAuthType": "httpHeaderAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "url": "https://queue.fal.run/fal-ai/veo3"
      },
      "position": [
        1344,
        -512
      ],
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2
    },
    {
      "id": "691f86fe-3887-4e67-af86-f01b2bfc14d1",
      "name": "Loop Over Items1",
      "parameters": {
        "options": {}
      },
      "position": [
        1120,
        -624
      ],
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3
    },
    {
      "id": "385554cd-d733-4e32-a60c-7272bf3e5725",
      "name": "Upload Reel",
      "parameters": {
        "formDescription": "Upload your video reel ad and minutes later, walk away with a ready\u2011to\u2011share reel of lifelike 8\u2011second AI\u2011persona reactions.",
        "formFields": {
          "values": [
            {
              "acceptFileTypes": "mp4",
              "fieldLabel": "File",
              "fieldType": "file",
              "requiredField": true
            }
          ]
        },
        "formTitle": "Video Reaction Simulator",
        "options": {}
      },
      "position": [
        -688,
        -624
      ],
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.2,
      "webhookId": "7a12ca94-ded9-442a-828b-f6f23005d933"
    },
    {
      "credentials": {
        "httpBearerAuth": {
          "id": "pUFIiaQYRoMnraTE",
          "name": "Bearer Auth account"
        }
      },
      "id": "25c4e140-2832-4939-9909-83724a2fddc7",
      "name": "Simulate",
      "parameters": {
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "jsonBody": "={\n  \"smart\": true,\n  \"provider\": \"google\",\n  \"audience_id\": \"g720z7hhts83ho4\",\n  \"query\": \"You\u0027re scrolling through social media reels when you see this video reel alone on your phone. No distractions. No one watching you. It struck a nerve\u2014but in what way exactly? What personal experience, belief, or fear did it tap into for you? And did it shift anything you thought you already knew?\",\n  \"files\": [\n    {\n      \"type\": \"video/mp4\",\n      \"url\": \"{{ $json.url }}\"\n    }\n  ],\n  \"mode\": \"normal\",\n  \"voting_mode\": false\n}\n",
        "jsonHeaders": "{\n  \"Content-Type\": \"application/json\",\n  \"Accept\":       \"application/json\"\n}",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "specifyHeaders": "json",
        "url": "https://api.askrally.com/api/v1/chat"
      },
      "position": [
        -208,
        -624
      ],
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2
    },
    {
      "id": "fec5ed4c-43d0-4766-8cb8-d8cebe639847",
      "name": "Split Reactions",
      "parameters": {
        "fieldToSplitOut": "responses",
        "options": {}
      },
      "position": [
        32,
        -624
      ],
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1
    },
    {
      "credentials": {
        "httpBearerAuth": {
          "id": "pUFIiaQYRoMnraTE",
          "name": "Bearer Auth account"
        }
      },
      "id": "a0063e04-53f7-4e28-8722-f8d351590c36",
      "name": "Pass to AskRally",
      "parameters": {
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "inputDataFieldName": "File",
              "name": "file",
              "parameterType": "formBinaryData"
            }
          ]
        },
        "contentType": "multipart-form-data",
        "genericAuthType": "httpBearerAuth",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "url": "https://api.askrally.com/api/v1/files/upload"
      },
      "position": [
        -464,
        -624
      ],
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2
    },
    {
      "id": "103b57cf-2970-4f80-87aa-be87c0208c6c",
      "name": "Select # of Responses",
      "parameters": {
        "jsCode": "// Only pass first N items (e.g., 3)\nconst limit = 2;\nreturn items.slice(0, limit);\n"
      },
      "position": [
        256,
        -624
      ],
      "type": "n8n-nodes-base.code",
      "typeVersion": 2
    },
    {
      "id": "892765d2-491b-4e91-957b-1ef8021adc07",
      "name": "Merge",
      "parameters": {
        "advanced": true,
        "mergeByFields": {
          "values": [
            {
              "field1": "persona_id",
              "field2": "id"
            }
          ]
        },
        "mode": "combine",
        "options": {}
      },
      "position": [
        496,
        -608
      ],
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2
    },
    {
      "credentials": {
        "httpBearerAuth": {
          "id": "pUFIiaQYRoMnraTE",
          "name": "Bearer Auth account"
        }
      },
      "id": "c4f69d9a-b5d5-4e58-b2ff-382dd1315b71",
      "name": "Get Personas",
      "parameters": {
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "options": {},
        "url": "https://api.askrally.com/api/v1/audiences/g720z7hhts83ho4"
      },
      "position": [
        32,
        -464
      ],
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2
    },
    {
      "id": "7486cc9f-e3eb-4448-9df3-207faf85df0c",
      "name": "Split Personas",
      "parameters": {
        "fieldToSplitOut": "personas",
        "options": {}
      },
      "position": [
        256,
        -464
      ],
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1
    },
    {
      "id": "a9a1f71c-3f0f-4b02-870f-4159fbe8c8bd",
      "name": "veo3 prompt gen",
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "fe9aebb2-6096-49ac-ad97-43c0ff8da47b",
              "name": "prompt",
              "type": "string",
              "value": "=A realistic vertical handheld phone video. The subject is {{ $json.name }}, a {{ $json.age }} year old {{ $json.gender }} from {{ $json.location }}. {{ $json.background }}. {{ $json.name }} is casually reacting to something on their phone. The setting looks authentic \u2014 maybe their bedroom, a car seat, walking outside, or with friends. The camera is slightly shaky, as if they\u2019re holding it themselves. They look directly into the phone camera and say something along the lines of: \"{{ $json.response }}\". The tone is candid, off-the-cuff, like a spontaneous reaction while scrolling social media. Natural lighting, ambient background noise, and unpolished delivery add to the unscripted vibe and realism."
            }
          ]
        },
        "options": {}
      },
      "position": [
        768,
        -608
      ],
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4
    },
    {
      "id": "1b77619a-d5a1-4f2b-b41e-716f0e4f77c5",
      "name": "Sticky Note2",
      "parameters": {
        "color": 3,
        "content": "# Reel Generation",
        "height": 700,
        "width": 1344
      },
      "position": [
        2656,
        -736
      ],
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1
    },
    {
      "id": "b2f7ebd2-f066-44fd-a307-3c08c4463a13",
      "name": "Sticky Note",
      "parameters": {
        "color": 4,
        "content": "# Generate Reaction Video Clips",
        "height": 700,
        "width": 1680
      },
      "position": [
        960,
        -736
      ],
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1
    },
    {
      "id": "83d50219-6e54-44a7-9469-0456416b8f3e",
      "name": "Merge Videos with FFmpeg",
      "parameters": {
        "command": "ffmpeg -f concat -safe 0 -i /tmp/n8n/videos.txt -c copy /tmp/n8n/final_output.mp4"
      },
      "position": [
        3248,
        -640
      ],
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1
    },
    {
      "id": "925eba3b-8b56-4885-80f5-4d8c01c38165",
      "name": "Prep File Concatenate",
      "parameters": {
        "command": "cd /tmp/n8n\nls *.mp4 | sort | awk \u0027{print \"file \\x27\" $0 \"\\x27\"}\u0027 \u003e videos.txt"
      },
      "position": [
        3008,
        -640
      ],
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1
    },
    {
      "id": "8ecb4479-7962-42b1-86f6-90ec1969bf85",
      "name": "Write Files To Disk For FFmpeg",
      "parameters": {
        "fileName": "=/tmp/n8n/{{ $binary.data.fileName }}",
        "operation": "write",
        "options": {}
      },
      "position": [
        2752,
        -640
      ],
      "type": "n8n-nodes-base.readWriteFile",
      "typeVersion": 1
    },
    {
      "id": "a1b14f0a-48c8-4e7c-a949-1755bb33177f",
      "name": "Read/Write Files from Disk",
      "parameters": {
        "fileSelector": "/tmp/n8n/final_output.mp4",
        "options": {}
      },
      "position": [
        3488,
        -640
      ],
      "type": "n8n-nodes-base.readWriteFile",
      "typeVersion": 1
    },
    {
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "jUO4EvfLl5QrzQbq",
          "name": "Google Drive account"
        }
      },
      "id": "2b1a6e8b-7405-4a0c-a9d5-4c406478dd59",
      "name": "Save Final Reaction Reel",
      "parameters": {
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "mode": "url",
          "value": "https://drive.google.com/drive/folders/1UfQ3CY9RndqMqk7B581XyRr7JD9iHpkv"
        },
        "options": {}
      },
      "position": [
        3776,
        -640
      ],
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3
    }
  ],
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "tags": [],
  "versionId": "f381f18e-7717-418b-9f4b-07c749711069"
}

About the Author

Rhys Fisher

Rhys Fisher

Rhys Fisher is the COO & Co-Founder of Rally. He previously co-founded a boutique analytics agency called Unvanity, crossed the Pyrenees coast-to-coast via paraglider, and now watches virtual crowds respond to memes. Follow him on Twitter @virtual_rf