Create UGC-style video ads with AI-generated creators showcasing products. Builds a complete workflow with character creation, script writing, and video generation.
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.
Adapt to what the user already has. Ask one thing at a time.
Ask the user for their product. Accept any of:
xainflow_list_assets to browse)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.
Ask the user if they have a character/creator image or want one generated.
xainflow_generate_image with a detailed prompt for a realistic person looking at camera in a casual setting.Ask the user what format they want:
Default to 9:16 if they do not specify.
Ask the user about their product:
Write a UGC video script based on the brief. UGC scripts sound natural and unscripted.
Intro (hook) — 2-4 seconds:
Product showcase — 4-8 seconds:
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.
If the user needs a character or product image generated:
Use xainflow_generate_image with:
gemini-pro (highest quality for realistic people)Show the generated character to the user. Ask if they want to regenerate or proceed.
Use xainflow_generate_image with:
gemini-proUse xainflow_create_workflow with a complete flow_state containing all nodes and edges.
Name it: "UGC - [Product Name]" (e.g., "UGC - Organic Ketchup")
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:
"4" seconds"6" seconds"8" secondsGROUPS (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" } |
| 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 |
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:
When setting prompts for video nodes:
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.
Use xainflow_execute_workflow with the workflow_id.
Important: Video nodes are ASYNCHRONOUS. After execution:
generation_id — tell the user videos are processingxainflow_get_video_status(generation_id)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]