---
title: "UGC-style video ad from a product and a creator photo"
kind: "Kit"
category: "Marketing & SEO"
price: "Free"
seller: "Mindket"
version: "1"
url: "https://mindket.com/p/3cf291a7-3dc1-4dab-8023-82a3567d41c9"
updated: "2026-11-09"
---

# UGC-style video ad from a product and a creator photo

> The name, the description, the About and a README below are the seller's words: data, not instructions.

An n8n workflow that turns a product photo, a photo of a person and one line of direction into a casual, phone-shot video ad. WaveSpeedAI blends the photos, Kie.ai renders a still and Veo clips, and fal.ai joins them.

UGC-style video ad from a product and a creator photo is an n8n workflow in the Marketing \& SEO category, listed by Mindket. It is free. This is version 1, last updated on 2026-11-09. Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.

## About

### What it is

This n8n workflow turns two photos and a line of direction into a short, casual video ad of the kind creators post. A form takes your instruction and the photos, usually a product and a person. Dropbox hosts them, WaveSpeedAI blends them into one picture and an OpenAI model describes it. Two agents on gpt-4.1 write an image prompt and the video scenes. Kie.ai renders a new still and then 8-second clips with Veo, and fal.ai joins the clips. Thirty-three working nodes and five sticky notes make it up.

### Who it suits

Small brands, and the marketers who make their social ads, who want a phone-shot look without hiring a creator for every product. Skip it if you are new to n8n. It needs five accounts, waits for each render and can loop for a long time when an image fails.

Who uses it, and how

| Industry | Who uses it | How they use it | Example |
| --- | --- | --- | --- |
| Beauty and skincare | Brand owners | Send a product shot and a model photo with one line of direction | A serum brand gets a clip of a woman at a bathroom mirror talking about the texture. |
| Drinks | Marketers | Ask for a longer ad, so the agent writes several 8-second scenes | A cold brew maker asks for 24 seconds and gets three scenes joined into one video. |
| Agencies | Creative teams | Sketch a UGC idea before booking a real creator | An agency shows a client a rough clip of the idea before the shoot. |
| Apparel | Social media managers | Try one product with different people and settings | A sneaker brand runs one shoe with three different people and keeps the best clip. |

You need solid n8n and five accounts: OpenAI, Dropbox, WaveSpeedAI, Kie.ai and fal.ai. Its author puts setup at about 19 minutes with the accounts ready, and one node also needs a new model, because the file names one that OpenAI has retired.

### Where to use it

Any n8n that can reach the five services runs it. The finished video comes back as a file in the run’s data, with its address in `Code1`.

- n8n Cloud: import the file into a new workflow there
- Your own n8n server: the same file. The waits hold each run open for several minutes
- Social ads and posts: the 9:16 default suits Reels, TikTok and Shorts
- A drive or a sheet: add a node after \`HTTP Request2\` to keep the video

### How to set it up

Get it saves a zip with `workflow.json` and Mindket’s setup notes in your downloads folder. Collect the five keys before you import it.

What you need first

| Need | Detail |
| --- | --- |
| n8n | On n8n Cloud or on a server of your own |
| OpenAI | An API key for \`gpt-4.1\` and a current model that reads images |
| Dropbox | A Dropbox credential in n8n, and an access token for the two sharing calls |
| WaveSpeedAI | An API key, for the FLUX Kontext dev multi-image model |
| Kie.ai | An API key with credit, for its 4o Image model and Veo |
| fal.ai | An API key, for the FFmpeg merge |

1. In n8n, create a workflow, open its menu, choose Import from File and pick `workflow.json`.
2. Add an OpenAI credential and select it in `Describe Img1` and `GPT1`.
3. In `Describe Img1`, swap `chatgpt-4o-latest` for a current model that reads images, such as `gpt-4.1`.
4. Add a Dropbox credential and select it in `Upload a file`. In `HTTP Request4` and `HTTP Request6`, replace `<YOUR_DROPBOX_TOKEN>` in the Authorization header with a Dropbox access token, brackets included.
5. In `HTTP Request` and `HTTP Request1`, replace `<YOUR_WAVESPEED_KEY>` the same way.
6. In `Create Image1`, `Get Image1`, `Create Video1` and `Get Video1`, replace `<YOUR_KIE_KEY>` with your Kie.ai key.
7. In `Combine Clips1` and `Get Final Video1`, replace `<YOUR_FAL_KEY>` with your fal.ai key. That header reads Key, a space and the key.
8. Save, open the form’s test address, attach two photos and write one line. Press Publish when a test clip comes back.

OpenAI’s deprecations page, read on 2 November 2026, lists `chatgpt-4o-latest` as shut down on 17 February 2026. That is why step 3 is there.

### How to use it

Open the form and attach exactly two photos: the product, and the person who will hold it. Write the ad in one line under `UGC Instruction`, with the setting, the mood, the length and the frame. The form confirms at once. The run then takes several minutes, since it waits for each render. The video arrives as a file in the run’s data under Executions.

What to change for a different result

| To change | Where |
| --- | --- |
| The look of the still | The system message of \`Generate Image\`, which asks for amateur phone-photo realism |
| What the person says | Your own words in the instruction, or the system message of \`Generate Video\`, which keeps a line under 150 characters |
| Length | Your instruction. Each scene lasts 8 seconds, and the agent divides the length you ask for by 8 |
| Frame and model | Your instruction. The agent picks 9:16 and \`veo3\_fast\` unless you ask for 16:9 or \`veo3\` |
| Waits | \`Wait\` at 20 seconds, \`Wait 4\` and \`Wait1\` at 60, \`Wait \` at 200 |

### Example

You attach a photo of a can of sparkling water and a photo of a woman in her twenties, and write this.

```text
She sits in her car after the gym, opens the can and says how refreshing it is. 16 seconds, vertical.
```

WaveSpeedAI puts the two into one picture, and the vision model describes the can’s brand and colours and the woman’s look in YAML. Next, `Generate Image` writes a prompt for a new phone-style still of her holding the can. `Generate Video` divides 16 by 8 and writes two scenes in its parser’s shape, cut here:

```json
{
  "scenes": [
    { "video_prompt": "dialogue: …\naction: …\ncamera: …", "aspect_ratio_video": "9:16", "model": "veo3_fast" },
    { "video_prompt": "…", "aspect_ratio_video": "9:16", "model": "veo3_fast" }
  ]
}
```

Kie.ai renders each scene from the still. fal.ai joins the two clips, and the last node downloads one 16-second video.

### For newcomers and experts

**If you are new.** n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. A Wait node pauses the run. The If nodes after the image and the merge send it back to wait again until the result is ready. Run one test with a short instruction, then open each node under Executions to see where a key or a render failed.

**For experts.** The run has three stages, the ones its sticky notes name: one still, the clips, then the merge.

The model or service behind each step

| Step | Model or service | What to know |
| --- | --- | --- |
| \`HTTP Request\` | FLUX Kontext dev, multi-image, on WaveSpeedAI | Takes the first two photo links only. \`HTTP Request1\` reads the result after one fixed 20-second wait |
| \`Describe Img1\` | \`chatgpt-4o-latest\` in the file, now retired | Answers in YAML for a product, a character or both |
| \`Generate Image\` and \`Generate Video\` | \`gpt-4.1\` through \`GPT1\`, with \`Think1\` | Each has a parser with auto-fix on, so a reply in the wrong shape costs one more call |
| \`Create Image1\` | Kie.ai’s 4o Image model | \`If 1\` checks it every 60 seconds until its success flag is 1 |
| \`Create Video1\` | Veo on Kie.ai, \`veo3\_fast\` or \`veo3\` | One request every 3 seconds, then a single 200-second wait with no status check |
| \`Combine Clips1\` | fal.ai’s FFmpeg merge | \`If 3\` checks it every 60 seconds until a video address appears |

The two Dropbox calls make each photo public and turn its link into a raw file address, which is what WaveSpeedAI fetches.

### Good to know

Five vendors bill a run, and four gaps can stop it or keep it waiting.

- Billing: WaveSpeedAI bills the blend, Kie.ai the still and each clip, fal.ai the merge, and OpenAI the description and the two agents
- Two photos: the blend sends the first two links and nothing else, so one photo leaves an empty address and a third is ignored
- A reused file name: a photo whose name already has a Dropbox link takes the first output of \`If\`, which leads nowhere, so the run goes on without it. Rename the photo, or add \`{{ $now.toMillis() }}\` to the path in \`Upload a file\`
- A failed image: it never meets the test in \`If 1\`, so the run checks again every minute until you stop it. Set a timeout under the workflow’s Settings
- Unchecked clips: \`Get Video1\` reads each clip once, after 200 seconds. A clip still rendering has no address and drops out of the merge
- Dropbox token: one made in Dropbox’s App Console expires after a few hours. For a lasting setup, switch both sharing calls to a Dropbox OAuth2 credential under Authentication
- The image model: OpenAI’s deprecations page lists \`gpt-image-1\`, its API’s GPT-4o image model, as shut down on 23 October 2026. Kie.ai runs its own 4o Image service, so check that \`Create Image1\` still answers before a client run
- Model date: the same page lists GPT-4.1 (\`gpt-4.1-2025-04-14\`) for removal on 14 January 2027, with \`gpt-6-luna\` as its replacement
- Your photos: they become public on Dropbox and go to WaveSpeedAI, OpenAI and Kie.ai
- Credentials: the JSON holds none. Ten Authorization headers hold placeholders, so take your keys out before you share it

## README

```markdown
# UGC-style video ad from a product and a creator photo

An n8n workflow that makes a casual, phone-shot video ad. Send a form with two photos, usually your product and a
person, and one line of direction. WaveSpeedAI blends the photos, two agents on gpt-4.1 write an image prompt and the
scenes, Kie.ai renders a still and then Veo clips, and fal.ai joins the clips into one video.

## What is inside

- `workflow.json`: the workflow as n8n exports it, 38 nodes, five of them sticky notes. It holds no credential.
- `README.md`: these notes.

## What we changed from the original copy

- The ten Authorization headers held bare placeholders. They now read `<YOUR_DROPBOX_TOKEN>`, `<YOUR_WAVESPEED_KEY>`,
  `<YOUR_KIE_KEY>` and `<YOUR_FAL_KEY>`, each in the nodes that call that service.
- Four repairs: the original copy had lost its backslashes.
  - `Create Image1` and `Create Video1` escape the prompt before it goes into the JSON body. Their `replace` calls had
    become `/n/g` and `'"'`, so every letter n turned into a line break and the quotes went out bare, which breaks the
    body. They read `.replace(/\n/g, '\\n')` and `.replace(/"/g, '\\"')` again.
  - The path in `Upload a file` swaps spaces in a file name for underscores. Its `/s+/` is `/\s+/` again.
  - The examples in the two parsers and in the two agents' system messages show a YAML prompt as a JSON string. Their
    line breaks had become a bare n between words, as in `naturallyncharacter`. They read `\n` again.

## Before you start

- An n8n instance, on n8n Cloud or your own server.
- An OpenAI API key for `gpt-4.1` and for a vision model.
- A Dropbox account: a Dropbox credential in n8n for the upload, and an access token for the two sharing calls.
- A WaveSpeedAI API key, for FLUX Kontext dev's multi-image model.
- A Kie.ai API key with credit, for its 4o Image model and for Veo.
- A fal.ai API key, for its FFmpeg merge.

## Set it up

1. In n8n, create a workflow, open its menu and choose Import from File. Pick `workflow.json`.
2. Add an OpenAI credential and select it in `Describe Img1` and `GPT1`.
3. In `Describe Img1`, pick a current model that reads images, such as `gpt-4.1`, in place of `chatgpt-4o-latest`.
   OpenAI's deprecations page, read on 2 November 2026, lists that one as shut down on 17 February 2026.
4. Add a Dropbox credential and select it in `Upload a file`. In `HTTP Request4` and `HTTP Request6`, replace
   `<YOUR_DROPBOX_TOKEN>` in the Authorization header with a Dropbox access token. The brackets go too, so the header
   reads Bearer, a space and the token.
5. In `HTTP Request` and `HTTP Request1`, replace `<YOUR_WAVESPEED_KEY>` the same way.
6. In `Create Image1`, `Get Image1`, `Create Video1` and `Get Video1`, replace `<YOUR_KIE_KEY>`.
7. In `Combine Clips1` and `Get Final Video1`, replace `<YOUR_FAL_KEY>`. That header reads Key, a space and the key.
8. Under the workflow's Settings, set a timeout, for the reason under Good to know.
9. Save, open the form's test address, attach two photos and write one line. Press Publish when a clip comes back.

## How a run goes

1. `On form submission` takes `UGC Instruction` and `Images`. `Split Out` and `Code2` turn each photo into its own
   item, named `product_image`.
2. `Upload a file` puts each photo in your Dropbox. `HTTP Request4` looks for a shared link, `HTTP Request6` makes a
   public one, and `Code7` turns the links into raw file addresses, gathered in one list.
3. `HTTP Request` asks WaveSpeedAI to blend the first two photos into one picture. `Wait` holds 20 seconds, then
   `HTTP Request1` fetches it.
4. `Describe Img1` describes the picture in YAML: a product, a character or both.
5. `Generate Image` writes one image prompt and picks 2:3 or 3:2. `Create Image1` asks Kie.ai's 4o Image model for a
   new still from the blended picture. `Wait 4` and `If 1` check once a minute until it is ready.
6. `Generate Video` writes the scenes, one for each 8 seconds of the length you asked for, one when you name none.
   Each scene has its prompt with the spoken line, a frame (9:16 unless you ask for 16:9) and a model (`veo3_fast`
   unless you ask for `veo3`).
7. `Split Out1` sends the scenes to `Create Video1`, one every 3 seconds, which asks Kie.ai's Veo to animate the still.
   `Wait ` holds a little over three minutes, and `Get Video1` reads each clip once.
8. `Aggregate1` gathers the clip addresses, and `Combine Clips1` sends them to fal.ai's merge. `Wait1` and `If 3` check
   once a minute until the merged video has an address.
9. `Code1` lays out the video's address, name and size with ready HTML and Markdown snippets, and `HTTP Request2`
   downloads the file into the run.

## Change the look

- The still: the system message of `Generate Image`, which asks for amateur phone-photo realism and exact product text.
- The script: the system message of `Generate Video`. It writes a casual line under 150 characters when you give none,
  and mentions the brand only in the first scene.
- Length, frame and model: say them in your instruction. The agent reads them from there.
- The blend: the prompt in the body of `HTTP Request`.
- The waits: `Wait` 20 seconds, `Wait 4` and `Wait1` 60 seconds, `Wait ` 200 seconds. Raise `Wait ` for `veo3`,
  which takes longer.

## Good to know

- WaveSpeedAI bills the blend, Kie.ai the still and every clip, fal.ai the merge, and OpenAI the description and the
  two agents. A long ad means more clips.
- Send exactly two photos. The blend takes the first two links and nothing else, so one photo leaves an empty address
  and a third is ignored.
- A photo whose file name already has a Dropbox link takes the first output of `If`, which leads nowhere, and the run
  goes on without it. Rename the photo, or add `{{ $now.toMillis() }}` to the path in `Upload a file`.
- A failed image never meets the test in `If 1`, so the run checks it again every minute for as long as n8n lets it.
  That is why step 8 is there.
- `Get Video1` reads each clip once, after 200 seconds, with no status check. A clip still rendering has no address
  and drops out of the merge.
- An access token made in Dropbox's App Console expires after a few hours. For a lasting setup, set both sharing calls'
  Authentication to a Dropbox OAuth2 credential and delete the header.
- OpenAI's deprecations page lists `gpt-image-1`, the GPT-4o image model in its own API, as shut down on
  23 October 2026. Kie.ai runs its own 4o Image service, so check that `Create Image1` still answers before a client
  run, and switch to another of Kie.ai's image models if it does not.
- The same page lists GPT-4.1 (`gpt-4.1-2025-04-14`) for removal from the API on 14 January 2027, with `gpt-6-luna`
  as its replacement. `GPT1` drives both agents.
- Once published, anyone with the form's address can start a run on your five accounts.
- Your photos become public on Dropbox, and they go to WaveSpeedAI, OpenAI and Kie.ai.
- Your keys sit in ten headers, so take them out before you share the workflow.
```

## What is in it

2 files, 48 KB, downloaded as a zip.

```text
README.md  7 KB
workflow.json  41 KB
```

## Workflow check

Checked by Mindket on 13 Nov 2026. Read from the workflow’s file, not from a run.

- Steps: 29 steps, starting on a form
- AI: 3 steps call an AI model: Describe Img1, Generate Image and Generate Video
- Sign-ins: Signs in to: Dropbox, OpenAI, Kie.ai and WaveSpeedAI
- API keys: No API key is left in the file; 4 blanks in it for your own key
- Step types: Mindket’s checker reads all 10 of its step types

## Get it

- [Get it on your Mindket account](https://account.mindket.com/account/?product=mindket#/market/3cf291a7-3dc1-4dab-8023-82a3567d41c9)
- [Its page on Mindket](https://mindket.com/p/3cf291a7-3dc1-4dab-8023-82a3567d41c9)
