Discord + Google Forms, product creatives done for you
You finally get the product details… then the real work starts. Turning a brief into on-brand images and a short video usually means chasing files, rewriting prompts, waiting on render jobs, and still ending up with “almost right” assets.
This product creatives automation hits e-commerce marketers hardest, but founders and creative ops folks feel it too. You need consistent creatives at speed, without adding another person to the loop or spending your evenings fixing prompts.
This workflow takes one Google Form submission and returns finished asset URLs (two images plus a short video), with Discord calling out errors immediately. You’ll see how it works, what you need, and where you can customize it.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Discord + Google Forms, product creatives done for you
flowchart LR
subgraph sg0["Form 1 - Alpha Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Nano Banana Image"]
n1@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", pos: "b", h: 48 }
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Upload to MediaUpload"]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract Image Url", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Convert to File1", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Upload to MediaUpload1"]
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract Image Url1", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Generate Model with Product"]
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get the Base64 String1", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get the Base64 String", pos: "b", h: 48 }
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/discord.svg' width='40' height='40' /></div><br/>Discord1"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request"]
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n15@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n16@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n17@{ icon: "mdi:robot", form: "rounded", label: "Product Prompt Agent", pos: "b", h: 48 }
n18@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n19@{ icon: "mdi:robot", form: "rounded", label: "Model Prompt Generator", pos: "b", h: 48 }
n20["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/html.dark.svg' width='40' height='40' /></div><br/>Generate Response"]
n21["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Generate Video"]
n22@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser2", pos: "b", h: 48 }
n23@{ icon: "mdi:brain", form: "rounded", label: "Model2", pos: "b", h: 48 }
n24@{ icon: "mdi:brain", form: "rounded", label: "Model1", pos: "b", h: 48 }
n25@{ icon: "mdi:brain", form: "rounded", label: "Model", pos: "b", h: 48 }
n26@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n27@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model1", pos: "b", h: 48 }
n28@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model2", pos: "b", h: 48 }
n29["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Upload to MediaUpload2"]
n30["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Download Video"]
n31["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>Form 1 - Alpha"]
n32@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get the Data", pos: "b", h: 48 }
n33@{ icon: "mdi:robot", form: "rounded", label: "Creative Visualiser", pos: "b", h: 48 }
n34@{ icon: "mdi:robot", form: "rounded", label: "Product Visualiser", pos: "b", h: 48 }
n35@{ icon: "mdi:play-circle", form: "rounded", label: "Only for Testing in n8n", pos: "b", h: 48 }
n36@{ icon: "mdi:robot", form: "rounded", label: "Creative Director", pos: "b", h: 48 }
n14 --> n15
n14 --> n30
n15 --> n13
n25 -.-> n17
n24 -.-> n19
n23 -.-> n36
n12 --> n20
n32 --> n17
n13 --> n14
n30 --> n29
n31 --> n32
n21 --> n13
n1 --> n2
n4 --> n5
n36 --> n21
n3 --> n34
n0 --> n9
n6 --> n12
n6 --> n33
n34 --> n19
n33 --> n36
n17 --> n0
n9 --> n1
n2 --> n3
n8 --> n4
n19 --> n7
n5 --> n6
n35 --> n17
n26 -.-> n36
n16 -.-> n17
n27 -.-> n19
n28 -.-> n17
n18 -.-> n19
n22 -.-> n36
n7 --> n8
end
subgraph sg1["Error Flow"]
direction LR
n10@{ icon: "mdi:play-circle", form: "rounded", label: "Error Trigger", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/discord.svg' width='40' height='40' /></div><br/>Send the Error"]
n10 --> n11
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n31,n35,n10 trigger
class n16,n17,n18,n19,n22,n33,n34,n36 ai
class n23,n24,n25,n26,n27,n28 aiModel
class n14 decision
class n0,n2,n5,n7,n13,n21,n29,n30 api
class n35 disabled
classDef customIcon fill:none,stroke:none
class n0,n2,n5,n7,n12,n13,n20,n21,n29,n30,n31,n11 customIcon
Why This Matters: Turning briefs into creatives is a bottleneck
In most teams, “make creatives” is a messy chain of tiny steps. Someone pastes specs into a doc. Someone else tries to write prompts. Images get generated, but the file format is wrong, or the background doesn’t match the brand, or the model looks off. Then you repeat the whole thing for video, which adds waiting, exporting, uploading, and another round of links. The worst part is the context switching. You lose the thread, and quality slips because you’re rushing.
It adds up fast. Here’s where it breaks down in real life:
- Creative requests come in half-structured, so you spend about 30 minutes just clarifying before anything gets made.
- Prompt quality varies by person, which means “consistent” assets are basically luck.
- Video generation introduces waiting and status checks, and someone still has to babysit the job.
- Asset links get scattered across chats and drives, so launching a campaign turns into another scavenger hunt.
What You’ll Build: Google Form in, image + video URLs out
You’ll set up an n8n workflow that starts with a simple product intake form and ends with ready-to-use URLs for your creatives. When a new form response comes in, the workflow maps the inputs (product details, style notes, creative direction) into a structured schema, then uses AI agents to turn that into strong, consistent prompts. It generates a first product image, uploads it to your hosting so it’s accessible by URL, then analyzes that image to create a second prompt that adds a model. After the model image is generated and uploaded, the workflow uses that visual to guide a short cinematic video prompt, kicks off a video generation job, polls for completion, fetches the finished video file, uploads it, and returns the links in a clean response. If something fails anywhere, Discord gets the alert right away, so you’re not guessing what broke.
The workflow begins at the form submission (or a chat-based test trigger if you want to prototype faster). From there, it goes prompt → generate → upload → analyze → prompt again, and then repeats that pattern for the video with a wait-and-check loop. Finally, it posts key outputs to Discord and returns a tidy HTML response with URLs you can hand off instantly.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you launch 10 products a week and you want two images plus a short video for each. Manually, even a “fast” process can be about 30 minutes per image and about 45 minutes for a simple video pass, so you’re looking at roughly 2 hours per product, or about 20 hours a week. With this workflow, the hands-on part is mostly the brief (about 5 minutes) and a quick review of outputs, while generation runs in the background. For most teams, that’s close to two full workdays back each week.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Forms to collect product briefs consistently.
- Discord for error alerts and output posts.
- OpenRouter account for AI agents and prompt generation.
- GOAPI account to generate the final video.
- Media hosting platform to upload assets and return URLs.
Skill level: Intermediate. You’ll connect a few accounts, paste API keys, and test the workflow end to end once.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A product brief comes in. A Google Form submission triggers the workflow, then n8n maps the fields into the exact structure the AI agents expect (so you’re not fighting messy input every time).
The workflow writes better prompts than most humans will. OpenRouter/Gemini chat models and agent nodes turn your plain-language description into a detailed image prompt, then parse the response into a predictable schema.
Images are generated, uploaded, and analyzed. n8n calls your image generation API, converts base64 into real files, uploads them to your media host, then uses visual analysis to create the next prompt (first product-only, then a model version).
A video task runs with built-in waiting. The workflow creates the video generation job, checks status on an interval, fetches the finished file once it’s ready, and uploads it for a final URL.
You can easily modify the creative style and output destinations to match your brand. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the intake form that starts the product image generation flow and optionally review the chat trigger used for testing.
- Open Product Intake Form and confirm the Form Title is set to
Image Generation Formand Form Description isForm for generating a product image. - Verify the form fields include A detailed description of the product. (required), Text to inlucde in Product (optional), and the dropdowns for E-commerce Product Options, Jewelry Product Options, Electronics Product Options, and Food Photography Options.
- Optional: Review Test Chat Trigger if you want a chat-based entry point; note that it is disabled in the workflow and should be enabled only for testing.
Step 2: Map Form Data into Prompt Inputs
Transform raw form responses into a consistent payload for the AI prompt builder.
- Open Map Form Inputs and confirm the assignments map fields to: description =
{{$json['A detailed description of the product.']}}, text ={{$json["Text to inlucde in Product (optional)"]}}. - Ensure productOptions concatenates all dropdown options using
{{$json["E-commerce Product Options"].toJsonString().replaceAll('"','')}}{{ $json['Jewelry Product Options'].toJsonString().replaceAll('"','') }}{{ $json['Electronics Product Options'].toJsonString().replaceAll('"','') }}{{ $json['Food Photography Options'].toJsonString().replaceAll('"','') }}. - Confirm the flow connects Product Intake Form → Map Form Inputs → Product Prompt Builder.
Step 3: Set Up Prompt Generation and Parsing (AI/LLM)
Configure the AI agents, language models, and output parsers that transform user input into structured prompts.
- In Product Prompt Builder, verify the prompt text is
=About Product : {{ $json.description }}and that Has Output Parser is enabled.
Text On Product: {{ $json.text }}
Description: {{ $json.productOptions }} - Open Parse Product Schema and keep the manual schema as provided. This is a parser sub-node; credentials should be added to the parent model node.
- Connect language models to Product Prompt Builder: OpenRouter Chat Model A and Gemini Chat Model A. Credential Required: Connect your openRouterApi credentials in OpenRouter Chat Model A. Credential Required: Connect your googlePalmApi credentials in Gemini Chat Model A.
- In Model Prompt Composer, confirm the prompt text is
=Here is the Product : {{ $json.content.parts[0].text }}. Please generate an image prompt.and keep Has Output Parser enabled. - Open Parse Model Schema and keep the manual schema as provided. This is a parser sub-node; credentials should be added to the parent model node.
- Connect language models to Model Prompt Composer: OpenRouter Chat Model B and Gemini Chat Model B. Credential Required: Connect your openRouterApi credentials in OpenRouter Chat Model B. Credential Required: Connect your googlePalmApi credentials in Gemini Chat Model B.
- For the creative video prompt, keep Creative Direction Agent configured with the system message and prompt text
=Image Details is given Below:. Parse Video Schema is a parser sub-node; add credentials to the parent model node.
```
{{ $json.content.parts[0].text }}
``` - Connect language models to Creative Direction Agent: OpenRouter Chat Model C and Gemini Chat Model C. Credential Required: Connect your openRouterApi credentials in OpenRouter Chat Model C. Credential Required: Connect your googlePalmApi credentials in Gemini Chat Model C.
Step 4: Configure Image Generation and Media Hosting
Set up the HTTP requests and file conversions that generate and host the images.
- Open Image Generation API and confirm the URL is
https://openrouter.ai/api/v1/chat/completionswith the JSON body using the product prompt fields. Credential Required: Connect your openRouterApi credentials. - In Extract Base64 Data, confirm image_string uses
{{$json.choices[0].message.images[0].image_url.url.split(',')[1]}}to extract base64 content. - In Binary File Converter, ensure Operation is
toBinaryand Source Property isimage_string. - In Media Upload Request, confirm the URL is
http://homelab-mediahosting.4m6m9w.easypanel.host/api/1/uploadwith Content Type set tomultipart-form-data. Credential Required: Connect your httpHeaderAuth credentials. - In Derive Image Link, set url to
{{$json.image.image.url.replaceAll('http', 'https')}}to force HTTPS. - Repeat the same pattern for the model image path: Model Image Generator → Extract Base64 Data B → Binary File Converter B → Media Upload Request B → Derive Image Link B. Credential Required: Connect your openRouterApi credentials in Model Image Generator and httpHeaderAuth in Media Upload Request B.
Step 5: Analyze Images and Create Creative Directions
Run visual analysis on hosted images and produce model and video prompts.
- In Product Visual Analyzer, keep Resource set to
imageand Image URLs set to{{$json.url}}. Credential Required: Connect your googlePalmApi credentials. - In Creative Visual Analyzer, keep Resource set to
imageand Image URLs set to{{$json.url}}. Credential Required: Connect your googlePalmApi credentials. - Ensure Derive Image Link B outputs to both Post Image to Discord and Creative Visual Analyzer in parallel to send the hosted link while also analyzing the image.
- Confirm Product Visual Analyzer feeds into Model Prompt Composer, and Creative Visual Analyzer feeds into Creative Direction Agent.
Step 6: Configure Video Task Creation and Polling
Set up the video generation request and the polling loop that waits for completion.
- In Video Task Creator, confirm the URL is
https://api.goapi.ai/api/v1/taskand the JSON body includes{{$json.output.video_prompt.replaceAll('"', '**').replaceAll('\n', '')}}and{{$('Derive Image Link B').item.json.url}}. Credential Required: Connect your httpHeaderAuth credentials. - In Status Check Request, set the URL to
=https://api.goapi.ai/api/v1/task/{{ $json.data.task_id }}. Credential Required: Connect your httpHeaderAuth credentials. - In Processing Check, ensure the conditions check
{{$json.data.status}}equalsprocessingorpending, then loop to Delay Interval when still running. - When the status is complete, allow the flow to continue to Fetch Video File and then Media Upload Request C. Credential Required: Connect your httpHeaderAuth credentials in Media Upload Request C.
Step 7: Configure Output Delivery
Publish the final media links to Discord and build the HTML response page.
- In Post Image to Discord, confirm the message is
=Product Image - {{ $('Derive Image Link').item.json.url }}. Credential Required: Connect your discordWebhookApi credentials.
Final Image - {{ $json.url }} - In Build HTML Response, keep the HTML template intact and ensure the image links reference
{{ $('Derive Image Link').item.json.url }}and{{ $('Derive Image Link B').item.json.url }}. - Verify that Post Image to Discord outputs to Build HTML Response as the final response step.
Step 8: Add Error Handling
Ensure failures are reported to Discord via the error trigger path.
- Open Error Catch Trigger and confirm it connects to Dispatch Error Alert.
- In Dispatch Error Alert, keep the content value
=Error Occured - {{ $json.execution.error.message }}. Credential Required: Connect your discordWebhookApi credentials.
Step 9: Test and Activate Your Workflow
Run an end-to-end test and then activate the workflow for production use.
- Click Execute Workflow, submit a test response through Product Intake Form, and watch the flow from Map Form Inputs through image generation and upload nodes.
- Confirm success by checking that Post Image to Discord posts both URLs and Build HTML Response renders a page with two images and download links.
- Trigger an error scenario (e.g., revoke a credential temporarily) and verify Dispatch Error Alert posts to your Discord webhook.
- Once validated, toggle the workflow to Active to run in production.
Troubleshooting Tips
- OpenRouter or Gemini credentials can expire or need specific permissions. If things break, check the credentials section in n8n and confirm the key still has access to the models you selected.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Discord posting can fail if the bot loses access to the channel. Re-check the Discord app permissions and verify the channel ID in the Discord node settings.
Quick Answers
About 30 minutes if your accounts and API keys are ready.
No. You’ll connect services, paste a few API keys, and test with one sample product brief.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenRouter/Gemini usage plus your image/video generation API costs.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you should. Swap the media destination by changing the “Media Upload Request” nodes to your own host (Google Drive works if it returns direct links). You can also adjust brand style by editing the agent prompts in “Product Prompt Builder” and “Creative Direction Agent,” and tighten quality control by changing what the schema parsers require in “Parse Product Schema” and “Parse Video Schema.”
Usually it’s permissions. Confirm the bot is in the server, has access to the target channel, and that the channel ID in the Discord nodes matches the channel you want. If it worked before and suddenly stopped, reconnect the Discord credential in n8n. Also check rate limits if you’re posting lots of images in a short burst.
If you self-host n8n there’s no execution limit (it mainly depends on your server and your AI/video providers). In practice, teams often run 20–50 product briefs a day with queueing, because video generation and status polling are the slowest part.
Often, yes, because this workflow needs branching, file handling (base64 to binary), and “wait then check status” logic that gets awkward and expensive in simpler tools. n8n also lets you keep everything in one place: form intake, AI prompting, image generation calls, uploads, and error routing to Discord. That said, if your flow is just “form → create a task → send a Slack message,” Zapier or Make is usually quicker to set up. This one is closer to a mini production line. If you’re on the fence, Talk to an automation expert and we’ll help you pick the right approach.
Set this up once, and the “make creatives” bottleneck stops running your week. The workflow handles the repetitive production loop so you can focus on launches, testing, and growth.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.