UGC Video Creator
Create an authentic UGC (User Generated Content) video ad workflow. UGC videos feature a creator naturally showcasing a product with casual, authentic energy — like a real person recommending something they love on TikTok or Instagram Reels.
Phase 1: Collect Inputs
Adapt to what the user already has. Ask one thing at a time.
Product
Ask the user for their product. Accept any of:
- An existing asset from their library (use
xainflow_list_assets to browse)
- A file path or URL to a product image
- A text description (you will generate the product image later)
If the user provides a text description only, note that you will need to generate a product image using xainflow_generate_image before building the workflow.
Character / Creator
Ask the user if they have a character/creator image or want one generated.
- If they have one: accept an existing asset, file path, or URL
- If they want one generated: ask for a brief description (age, gender, ethnicity, style, setting). You will generate it using
xainflow_generate_image with a detailed prompt for a realistic person looking at camera in a casual setting.
Orientation
Ask the user what format they want:
- 9:16 (vertical) — TikTok, Instagram Reels, YouTube Shorts (recommended for UGC)
- 16:9 (landscape) — YouTube, ads
- 1:1 (square) — Instagram feed
Default to 9:16 if they do not specify.
Brief
Ask the user about their product:
- Product name and what it is
- Key selling points (2-3 max)
- Target audience
- Tone: casual/fun, professional, excited, calm
- Any specific phrases or CTAs they want included
Phase 2: Script Generation
Write a UGC video script based on the brief. UGC scripts sound natural and unscripted.
Script Guidelines
Intro (hook) — 2-4 seconds:
- Start with a casual hook that grabs attention
- Examples: "Okay so I have to tell you about this...", "I just found the best [product category]...", "POV: you finally discover [benefit]..."
- Must feel spontaneous, not rehearsed
Product showcase — 4-8 seconds:
- Naturally introduce the product
- Show genuine enthusiasm, not salesy pitch
- Mention 1-2 key benefits conversationally
- Examples: "Look at this packaging though...", "And the best part is...", "I've been using it for a week and honestly..."
Present to User
Show the script to the user with clear labels:
INTRO: "[hook text]"
PRODUCT: "[product showcase text]"
Ask if they want to edit anything. Iterate until they approve.
Phase 3: Generate Missing Assets
If the user needs a character or product image generated:
Character Generation
Use xainflow_generate_image with:
- model:
gemini-pro (highest quality for realistic people)
- aspect_ratio: match the chosen orientation (9:16, 16:9, or 1:1)
- prompt: Detailed description of a real person. Include:
- Physical appearance (age, features, hair)
- Clothing style (casual, trendy — matches UGC aesthetic)
- Setting (home, kitchen, bathroom, outdoors — wherever product is used)
- Expression (genuine smile, excited, natural)
- Camera: medium close-up, looking at camera, natural lighting
- IMPORTANT: Do NOT mention any product in the character prompt
- save_to_gallery: true
Show the generated character to the user. Ask if they want to regenerate or proceed.
Product Generation (if needed)
Use xainflow_generate_image with:
- model:
gemini-pro
- aspect_ratio: 1:1 (product shots work best square)
- prompt: Clean product photo on simple background
- save_to_gallery: true
Phase 4: Build Workflow
Use xainflow_create_workflow with a complete flow_state containing all nodes and edges.
Workflow Name
Name it: "UGC - [Product Name]" (e.g., "UGC - Organic Ketchup")
Required Nodes
Build the workflow with these nodes. Positions assume 9:16 orientation — adjust group widths if landscape.
Use the user's chosen orientation for ratio (imageGenerator) and videoRatio (videoGenerator).
Use the user's chosen orientation to determine video duration:
- Short scripts (under 15 words):
"4" seconds
- Medium scripts (15-30 words):
"6" seconds
- Long scripts (30+ words):
"8" seconds
GROUPS (7 groups):
| ID |
Label |
Position |
Size (w x h) |
Color |
| group-characters |
Characters |
(470, 30) |
1650 x 550 |
cyan |
| group-input |
Input |
(150, 700) |
450 x 380 |
yellow |
| group-initial-video |
Initial Video |
(470, 700) |
1950 x 550 |
green |
| group-object |
Object |
(150, 1370) |
450 x 380 |
yellow |
| group-message-object |
Message Object |
(150, 1850) |
450 x 380 |
yellow |
| group-image-object |
Image Object |
(470, 1370) |
1650 x 550 |
blue |
| group-video-object |
Video Object |
(2250, 1370) |
700 x 550 |
green |
All groups: zIndex: -1, fontSize: "lg"
NODES inside groups:
| ID |
Type |
Parent Group |
Position (relative) |
Key Data |
| asset-character |
asset |
group-characters |
(40, 80) |
{ assetType: "character", selectedAsset: { file_url: "[CHARACTER_URL]" }, output: "[CHARACTER_URL]" } |
| prompt-char-desc |
promptGenerator |
group-characters |
(400, 80) |
{ prompt: "[DETAILED_CHARACTER_DESCRIPTION]", expandEnabled: true } |
| img-character |
imageGenerator |
group-characters |
(1000, 80) |
{ model: "gemini-3-pro-image-preview", ratio: "[ORIENTATION]", numberOfResults: 1, imageSize: "2K" } |
| prompt-intro |
promptGenerator |
group-input |
(40, 80) |
{ prompt: "[INTRO_SCRIPT]", expandEnabled: false } |
| comp-initial |
composition |
group-initial-video |
(40, 80) |
{ name: "Initial Video Composition" } |
| img-initial |
imageGenerator |
group-initial-video |
(500, 80) |
{ model: "gemini-3-pro-image-preview", ratio: "[ORIENTATION]", numberOfResults: 1, imageSize: "2K" } |
| vid-initial |
videoGenerator |
group-initial-video |
(1100, 80) |
{ videoModel: "seedance-1.5-pro", videoDuration: "[DURATION]", videoResolution: "720p", videoRatio: "[ORIENTATION]", audioEnabled: true, mode: "image-to-video" } |
| asset-product |
asset |
group-object |
(40, 80) |
{ assetType: "product", selectedAsset: { file_url: "[PRODUCT_URL]" }, output: "[PRODUCT_URL]" } |
| prompt-product |
promptGenerator |
group-message-object |
(40, 80) |
{ prompt: "[PRODUCT_SCRIPT]", expandEnabled: false } |
| comp-product |
composition |
group-image-object |
(40, 80) |
{ name: "Product Composition" } |
| img-product |
imageGenerator |
group-image-object |
(600, 80) |
{ model: "gemini-3-pro-image-preview", ratio: "[ORIENTATION]", numberOfResults: 1, imageSize: "2K" } |
| vid-product |
videoGenerator |
group-video-object |
(40, 80) |
{ videoModel: "seedance-1.5-pro", videoDuration: "[DURATION]", videoResolution: "720p", videoRatio: "[ORIENTATION]", audioEnabled: true, mode: "image-to-video" } |
Edges
| Source |
Source Handle |
Target |
Target Handle |
| asset-character |
asset-output |
comp-initial |
asset-input-slot-1 |
| prompt-char-desc |
prompt-output |
img-character |
prompt-input |
| asset-character |
asset-output |
img-character |
asset-input-slot-char |
| prompt-intro |
prompt-output |
comp-initial |
prompt-input |
| img-character |
image-output |
comp-initial |
asset-input-slot-2 |
| comp-initial |
composition-output |
img-initial |
composition-input |
| img-initial |
image-output |
vid-initial |
first-frame-input |
| prompt-intro |
prompt-output |
vid-initial |
prompt-input |
| asset-character |
asset-output |
comp-product |
asset-input-slot-3 |
| asset-product |
asset-output |
comp-product |
asset-input-slot-4 |
| prompt-product |
prompt-output |
comp-product |
prompt-input |
| comp-product |
composition-output |
img-product |
composition-input |
| img-product |
image-output |
vid-product |
first-frame-input |
| prompt-product |
prompt-output |
vid-product |
prompt-input |
Character Description Prompt
Write a detailed visual description of the character for the prompt-char-desc node. This prompt is used to generate a high-quality reference image. Include:
- Physical appearance matching the character asset
- Setting/environment where the UGC video takes place
- Clothing and styling
- Natural pose and expression
- Lighting (natural, warm, casual)
- DO NOT mention any product
Video Prompt Guidelines
When setting prompts for video nodes:
- Include explicit motion (action verbs with direction/tempo)
- Include camera movement (slow pan, dolly, tracking shot, steadicam)
- With first frame (image-to-video): DON'T re-describe what's visible. Focus on what MOVES and HOW
- Motion verbs: billows, flutters, sways, cascades, drifts, sweeps, blooms, ripples
- For 4-5s: 1 action + 1 camera move
- For 6-10s: 2 beats (start → change)
- No meta-language ("a video of"), no filler ("beautiful", "stunning")
- Include speech in quotes for audio-enabled videos
Phase 5: Summary & Execution
Show Summary
Before executing, show the user:
UGC Video Workflow Summary:
- Character: [description or asset name]
- Product: [product name]
- Script:
INTRO: "[intro text]"
PRODUCT: "[product text]"
- Format: [9:16 / 16:9 / 1:1]
- Video model: Seedance 1.5 Pro (720p, with audio)
- Estimated credits: ~300-500
The workflow will generate:
1. Character reference image (150 cr)
2. Character intro image (150 cr)
3. Intro video clip (~48-96 cr)
4. Character + product image (150 cr)
5. Product video clip (~48-96 cr)
Ask for confirmation before executing.
Execute
Use xainflow_execute_workflow with the workflow_id.
Important: Video nodes are ASYNCHRONOUS. After execution:
- Image nodes will complete immediately — report their results
- Video nodes will return
generation_id — tell the user videos are processing
- Wait ~60 seconds, then poll each video with
xainflow_get_video_status(generation_id)
- Keep polling every 30 seconds until all videos complete or fail
- Report final results with video URLs
Output
Save all generated assets to the output-folder ("UGC Videos"). Create the folder if it does not exist using xainflow_manage_folders.
Present final results:
UGC Video Complete!
Generated assets:
- Character image: [link]
- Intro video: [link] ([duration]s)
- Product composite image: [link]
- Product video: [link] ([duration]s)
Total credits used: [amount]
1---2name: ugc-video3description: Create UGC-style video ads with AI-generated creators showcasing products. Builds a complete workflow with character creation, script writing, and video generation.4---56# UGC Video Creator78Create an authentic UGC (User Generated Content) video ad workflow. UGC videos feature a creator naturally showcasing a product with casual, authentic energy — like a real person recommending something they love on TikTok or Instagram Reels.910## Phase 1: Collect Inputs1112Adapt to what the user already has. Ask one thing at a time.1314### Product1516Ask the user for their product. Accept any of:17- An existing asset from their library (use `xainflow_list_assets` to browse)18- A file path or URL to a product image19- A text description (you will generate the product image later)2021If the user provides a text description only, note that you will need to generate a product image using `xainflow_generate_image` before building the workflow.2223### Character / Creator2425Ask the user if they have a character/creator image or want one generated.26- If they have one: accept an existing asset, file path, or URL27- If they want one generated: ask for a brief description (age, gender, ethnicity, style, setting). You will generate it using `xainflow_generate_image` with a detailed prompt for a realistic person looking at camera in a casual setting.2829### Orientation3031Ask the user what format they want:32- **9:16** (vertical) — TikTok, Instagram Reels, YouTube Shorts (recommended for UGC)33- **16:9** (landscape) — YouTube, ads34- **1:1** (square) — Instagram feed3536Default to 9:16 if they do not specify.3738### Brief3940Ask the user about their product:41- Product name and what it is42- Key selling points (2-3 max)43- Target audience44- Tone: casual/fun, professional, excited, calm45- Any specific phrases or CTAs they want included4647## Phase 2: Script Generation4849Write a UGC video script based on the brief. UGC scripts sound natural and unscripted.5051### Script Guidelines5253**Intro (hook) — 2-4 seconds:**54- Start with a casual hook that grabs attention55- Examples: "Okay so I have to tell you about this...", "I just found the best [product category]...", "POV: you finally discover [benefit]..."56- Must feel spontaneous, not rehearsed5758**Product showcase — 4-8 seconds:**59- Naturally introduce the product60- Show genuine enthusiasm, not salesy pitch61- Mention 1-2 key benefits conversationally62- Examples: "Look at this packaging though...", "And the best part is...", "I've been using it for a week and honestly..."6364### Present to User6566Show the script to the user with clear labels:67```68INTRO: "[hook text]"69PRODUCT: "[product showcase text]"70```7172Ask if they want to edit anything. Iterate until they approve.7374## Phase 3: Generate Missing Assets7576If the user needs a character or product image generated:7778### Character Generation7980Use `xainflow_generate_image` with:81- model: `gemini-pro` (highest quality for realistic people)82- aspect_ratio: match the chosen orientation (9:16, 16:9, or 1:1)83- prompt: Detailed description of a real person. Include:84 - Physical appearance (age, features, hair)85 - Clothing style (casual, trendy — matches UGC aesthetic)86 - Setting (home, kitchen, bathroom, outdoors — wherever product is used)87 - Expression (genuine smile, excited, natural)88 - Camera: medium close-up, looking at camera, natural lighting89 - IMPORTANT: Do NOT mention any product in the character prompt90- save_to_gallery: true9192Show the generated character to the user. Ask if they want to regenerate or proceed.9394### Product Generation (if needed)9596Use `xainflow_generate_image` with:97- model: `gemini-pro`98- aspect_ratio: 1:1 (product shots work best square)99- prompt: Clean product photo on simple background100- save_to_gallery: true101102## Phase 4: Build Workflow103104Use `xainflow_create_workflow` with a complete `flow_state` containing all nodes and edges.105106### Workflow Name107108Name it: "UGC - [Product Name]" (e.g., "UGC - Organic Ketchup")109110### Required Nodes111112Build the workflow with these nodes. Positions assume 9:16 orientation — adjust group widths if landscape.113114Use the user's chosen orientation for `ratio` (imageGenerator) and `videoRatio` (videoGenerator).115116Use the user's chosen orientation to determine video duration:117- Short scripts (under 15 words): `"4"` seconds118- Medium scripts (15-30 words): `"6"` seconds119- Long scripts (30+ words): `"8"` seconds120121**GROUPS (7 groups):**122123| ID | Label | Position | Size (w x h) | Color |124|----|-------|----------|--------------|-------|125| group-characters | Characters | (470, 30) | 1650 x 550 | cyan |126| group-input | Input | (150, 700) | 450 x 380 | yellow |127| group-initial-video | Initial Video | (470, 700) | 1950 x 550 | green |128| group-object | Object | (150, 1370) | 450 x 380 | yellow |129| group-message-object | Message Object | (150, 1850) | 450 x 380 | yellow |130| group-image-object | Image Object | (470, 1370) | 1650 x 550 | blue |131| group-video-object | Video Object | (2250, 1370) | 700 x 550 | green |132133All groups: `zIndex: -1`, `fontSize: "lg"`134135**NODES inside groups:**136137| ID | Type | Parent Group | Position (relative) | Key Data |138|----|------|-------------|---------------------|----------|139| asset-character | asset | group-characters | (40, 80) | `{ assetType: "character", selectedAsset: { file_url: "[CHARACTER_URL]" }, output: "[CHARACTER_URL]" }` |140| prompt-char-desc | promptGenerator | group-characters | (400, 80) | `{ prompt: "[DETAILED_CHARACTER_DESCRIPTION]", expandEnabled: true }` |141| img-character | imageGenerator | group-characters | (1000, 80) | `{ model: "gemini-3-pro-image-preview", ratio: "[ORIENTATION]", numberOfResults: 1, imageSize: "2K" }` |142| prompt-intro | promptGenerator | group-input | (40, 80) | `{ prompt: "[INTRO_SCRIPT]", expandEnabled: false }` |143| comp-initial | composition | group-initial-video | (40, 80) | `{ name: "Initial Video Composition" }` |144| img-initial | imageGenerator | group-initial-video | (500, 80) | `{ model: "gemini-3-pro-image-preview", ratio: "[ORIENTATION]", numberOfResults: 1, imageSize: "2K" }` |145| vid-initial | videoGenerator | group-initial-video | (1100, 80) | `{ videoModel: "seedance-1.5-pro", videoDuration: "[DURATION]", videoResolution: "720p", videoRatio: "[ORIENTATION]", audioEnabled: true, mode: "image-to-video" }` |146| asset-product | asset | group-object | (40, 80) | `{ assetType: "product", selectedAsset: { file_url: "[PRODUCT_URL]" }, output: "[PRODUCT_URL]" }` |147| prompt-product | promptGenerator | group-message-object | (40, 80) | `{ prompt: "[PRODUCT_SCRIPT]", expandEnabled: false }` |148| comp-product | composition | group-image-object | (40, 80) | `{ name: "Product Composition" }` |149| img-product | imageGenerator | group-image-object | (600, 80) | `{ model: "gemini-3-pro-image-preview", ratio: "[ORIENTATION]", numberOfResults: 1, imageSize: "2K" }` |150| vid-product | videoGenerator | group-video-object | (40, 80) | `{ videoModel: "seedance-1.5-pro", videoDuration: "[DURATION]", videoResolution: "720p", videoRatio: "[ORIENTATION]", audioEnabled: true, mode: "image-to-video" }` |151152### Edges153154| Source | Source Handle | Target | Target Handle |155|--------|--------------|--------|---------------|156| asset-character | asset-output | comp-initial | asset-input-slot-1 |157| prompt-char-desc | prompt-output | img-character | prompt-input |158| asset-character | asset-output | img-character | asset-input-slot-char |159| prompt-intro | prompt-output | comp-initial | prompt-input |160| img-character | image-output | comp-initial | asset-input-slot-2 |161| comp-initial | composition-output | img-initial | composition-input |162| img-initial | image-output | vid-initial | first-frame-input |163| prompt-intro | prompt-output | vid-initial | prompt-input |164| asset-character | asset-output | comp-product | asset-input-slot-3 |165| asset-product | asset-output | comp-product | asset-input-slot-4 |166| prompt-product | prompt-output | comp-product | prompt-input |167| comp-product | composition-output | img-product | composition-input |168| img-product | image-output | vid-product | first-frame-input |169| prompt-product | prompt-output | vid-product | prompt-input |170171### Character Description Prompt172173Write a detailed visual description of the character for the `prompt-char-desc` node. This prompt is used to generate a high-quality reference image. Include:174- Physical appearance matching the character asset175- Setting/environment where the UGC video takes place176- Clothing and styling177- Natural pose and expression178- Lighting (natural, warm, casual)179- DO NOT mention any product180181### Video Prompt Guidelines182183When setting prompts for video nodes:184- Include explicit motion (action verbs with direction/tempo)185- Include camera movement (slow pan, dolly, tracking shot, steadicam)186- With first frame (image-to-video): DON'T re-describe what's visible. Focus on what MOVES and HOW187- Motion verbs: billows, flutters, sways, cascades, drifts, sweeps, blooms, ripples188- For 4-5s: 1 action + 1 camera move189- For 6-10s: 2 beats (start → change)190- No meta-language ("a video of"), no filler ("beautiful", "stunning")191- Include speech in quotes for audio-enabled videos192193## Phase 5: Summary & Execution194195### Show Summary196197Before executing, show the user:198```199UGC Video Workflow Summary:200- Character: [description or asset name]201- Product: [product name]202- Script:203 INTRO: "[intro text]"204 PRODUCT: "[product text]"205- Format: [9:16 / 16:9 / 1:1]206- Video model: Seedance 1.5 Pro (720p, with audio)207- Estimated credits: ~300-500208209The workflow will generate:2101. Character reference image (150 cr)2112. Character intro image (150 cr)2123. Intro video clip (~48-96 cr)2134. Character + product image (150 cr)2145. Product video clip (~48-96 cr)215```216217Ask for confirmation before executing.218219### Execute220221Use `xainflow_execute_workflow` with the workflow_id.222223**Important:** Video nodes are ASYNCHRONOUS. After execution:2241. Image nodes will complete immediately — report their results2252. Video nodes will return `generation_id` — tell the user videos are processing2263. Wait ~60 seconds, then poll each video with `xainflow_get_video_status(generation_id)`2274. Keep polling every 30 seconds until all videos complete or fail2285. Report final results with video URLs229230### Output231232Save all generated assets to the output-folder ("UGC Videos"). Create the folder if it does not exist using `xainflow_manage_folders`.233234Present final results:235```236UGC Video Complete!237238Generated assets:239- Character image: [link]240- Intro video: [link] ([duration]s)241- Product composite image: [link]242- Product video: [link] ([duration]s)243244Total credits used: [amount]245```