Din pipeline för annonskreativitet havererar troligen på samma tråkiga ställe varje gång. Någon uppdaterar ett Google Sheet, någon annan genererar material, sedan klistras länkar runt i Slack och de ”slutgiltiga” filerna hamnar utspridda i Drive-mappar.
Den här UGC ads automation slår hårdast mot performance marketers, men byråägare och interna e-handelsansvariga känner av den också. Utfallet är enkelt: du gör om varje rad i ett kalkylark till en annonsbild (och valfritt en kort video på 5–8 sekunder), och Drive-länkar skrivs tillbaka automatiskt.
Nedan ser du hur flödet går från kalkylarksrad till delningsbar Drive-tillgång, var tidsvinsterna faktiskt kommer ifrån och vad du behöver för att köra det stabilt.
Så här fungerar automationen
Hela n8n-workflowen, från trigger till slutresultat:
n8n Workflow Template: Google sheets till Google drive: UGC-annonser klara
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n9["<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"]
n10@{ icon: "mdi:cog", form: "rounded", label: "uploadImagetoGdrive1", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "updateVideoURL", pos: "b", h: 48 }
n13@{ icon: "mdi:robot", form: "rounded", label: "Analyze image", pos: "b", h: 48 }
n14["<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/>Get the image"]
n15@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n17["<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/>Get image status"]
n18["<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/>Call Fal.ai API (nannoBanana)"]
n19@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n20@{ icon: "mdi:database", form: "rounded", label: "Get Data", pos: "b", h: 48 }
n21@{ icon: "mdi:robot", form: "rounded", label: "Describe Each Scene for Video", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n23["<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/>Get the video"]
n24@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Video status", pos: "b", h: 48 }
n25["<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/>Get the video status"]
n26@{ icon: "mdi:cog", form: "rounded", label: "Wait for the video", pos: "b", h: 48 }
n27@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser2", pos: "b", h: 48 }
n28@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", 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/>Veo3"]
n16 --> n14
n16 --> n15
n29 --> n22
n15 --> n17
n20 --> n19
n19 --> n18
n9 --> n10
n24 --> n23
n24 --> n26
n13 --> n21
n14 --> n13
n23 --> n22
n22 --> n9
n22 --> n26
n17 --> n16
n28 -.-> n27
n28 -.-> n21
n26 --> n25
n25 --> n24
n10 --> n11
n27 -.-> n21
n18 --> n17
n21 --> n29
n0 --> n20
end
subgraph sg1["Flow 2"]
direction LR
n1@{ icon: "mdi:database", form: "rounded", label: "Get Data1", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "setImgeURL", pos: "b", h: 48 }
n4["<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/>CreateImagebyOpernRouter (ge.."]
n5@{ icon: "mdi:cog", form: "rounded", label: "wait20sec", pos: "b", h: 48 }
n6["<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/code.svg' width='40' height='40' /></div><br/>setBase64data"]
n7@{ icon: "mdi:cog", form: "rounded", label: "uploadImagetoGdrive", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "updateImageURL", pos: "b", h: 48 }
n1 --> n3
n5 --> n6
n3 --> n4
n6 --> n2
n2 --> n7
n7 --> n8
n4 --> n5
end
subgraph sg2["Flow 3"]
direction LR
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Call Fal.ai API (WAN2.2)"]
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 n0 trigger
class n13,n21,n27 ai
class n28 aiModel
class n16,n24 decision
class n11,n20,n1,n8 database
class n9,n14,n17,n18,n23,n25,n29,n4,n12 api
class n6 code
class n12 disabled
classDef customIcon fill:none,stroke:none
class n9,n14,n17,n18,n23,n25,n29,n4,n6,n12 customIcon
Problemet: UGC-variationer tar för lång tid att producera
UGC-annonser fungerar bara när du kan testa många variationer. Olika hooks, olika ”presentatörer”, olika produktvinklar, olika overlays. Men sättet de flesta team tar fram variationer på är en kedja av små manuella steg: kopiera en produktlänk från ett ark, generera en bild någonstans, ladda ner den, ladda upp den till Drive, göra den publik, klistra tillbaka länken och sedan göra om allt för video. En missad behörighetsinställning och allt faller på sämsta möjliga tidspunkt. Den mentala belastningen är påtaglig eftersom du hela tiden dubbelkollar länkar, filnamn och vilken version som godkändes.
Det växer snabbt. Här är var det brister.
- Varje ny SKU eller idé innebär att du upprepar samma 8–10 mikrouppgifter bara för att få ut en delningsbar tillgång.
- Drive-länkar är ofta inte ”direkta”, så bild-/video-API:er kan inte hämta dem och du fastnar med att felsöka behörigheter i stället för att testa kreativa varianter.
- Manuell kopiering av bild- och video-URL:er tillbaka till Sheets skapar misstag, och de misstagen saboterar spårningen utan att det märks direkt.
- När du vill ha 20 variationer skalar inte arbetsflödet, så du nöjer dig med 5 och hoppas på det bästa.
Lösningen: gör om varje kalkylarksrad till Drive-klara UGC-tillgångar
Det här flödet använder n8n för att behandla ditt Google Sheet som en produktionskö för kreativa. Du lägger till rader med en produktlänk och en prompt (plus valfria fält som ”presenter”), och automationen genererar en annonsbild, laddar upp den till Google Drive och skriver tillbaka den resulterande länken i samma rad. Om du aktiverar videozonerna går den längre: den analyserar den genererade bilden, skapar strukturerade scenbeskrivningar, renderar ett kort klipp på 5–8 sekunder (Veo3 och valfritt WAN2.2), laddar upp MP4:an till Drive och skriver även video-URL:en tillbaka till arket. Slutresultatet är ett kalkylark som blir en levande katalog av delningsbara tillgångar, inte en att-göra-lista som måste jagas ikapp.
Flödet startar från en manuell körning i n8n (så du styr när batchar produceras). Google Sheets står för indata, HTTP-anrop hanterar AI-jobben och Google Drive blir den enda sanningskällan för filer. Till sist uppdateras Google Sheets så att teamet alltid har de senaste länkarna utan att behöva leta.
Det här får du: automation vs. resultat
| Vad det här flödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut i praktiken
Säg att du vill testa 10 UGC-bildvariationer för en produkt. Manuellt kan du lägga cirka 10 minuter per variation på att generera bilden, ladda ner den, ladda upp till Drive, fixa delningsbehörigheter och klistra tillbaka länken, vilket blir ungefär 1,5–2 timmar. Med det här flödet lägger du in 10 rader i ditt Sheet, kör automationen en gång och väntar på bearbetning (ofta under en timme totalt beroende på modellkön). Din ”mänskliga tid” sjunker till cirka 10 minuter för uppsättning och snabb granskning, och sedan dyker Drive-länkarna upp direkt i arket.
Det här behöver du
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger fungerar bra)
- Google Sheets för att lagra prompter, produktlänkar och resultat.
- Google Drive för att lagra tillgångar och dela länkar.
- Fal.ai API-nyckel (hämta den från Fal.ai och spara som env FAL_KEY).
Kunskapsnivå: Medel. Du kopplar OAuth-credentials, lägger in en API-nyckel och är bekväm med att testa en zon i taget.
Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Du triggar en körning från n8n. Flödet börjar med en manuell start, vilket är användbart när du vill ha kontrollerad batchgenerering för en specifik kampanj eller ett visst SKU-set.
Rader hämtas från Google Sheets och städas upp. Det läser från fliken du satt upp (till exempel ”Gemini” för enbart bild eller ”nanoBanana” för bild-till-video). Sedan konverterar det Drive-länkar till direkta ”uc?export=view&id=”-URL:er, vilket är det de flesta genereringstjänster faktiskt kan hämta.
Bilder (och videor) genereras via API-anrop. För bilder kan flödet anropa OpenRouter/Gemini och konvertera base64 till en riktig fil, eller använda Fal.ai nano-banana och polla tills jobbet är klart. För video skapar det scenbeskrivningar, tvingar fram strukturerad JSON, skickar ett bild-till-video-jobb (Veo3 och valfritt WAN2.2) och loopar tills MP4:an är redo.
Filer hamnar i Google Drive och arket blir din dashboard. n8n laddar upp bilden/videon till Drive och skriver direkt tillbaka img_url och video_url i samma rad. På så sätt har du alltid ”källa + output” på ett ställe.
Du kan enkelt ändra videons bildformat för att matcha TikTok, Reels eller YouTube Shorts utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: Konfigurera den manuella triggern
Det här arbetsflödet startar manuellt så att ni kan validera bild- och videopipelinen från början till slut innan ni aktiverar den.
- Lägg till noden Manual Start Trigger som arbetsflödets trigger.
- Lämna standardinställningarna för Manual Start Trigger (inga parametrar krävs).
- Koppla Manual Start Trigger till Fetch Video Sheet Row för att starta flödet.
Steg 2: Anslut Google Sheets
Dessa noder hämtar källraderna för bild-/videogenerering och uppdaterar länkar efter att resurserna har skapats.
- Öppna Fetch Video Sheet Row och välj ert kalkylark i Document (ersätt
[YOUR_ID]), och välj Sheet Name-värdetnanoBanana. - Öppna Utility: Fetch Image Sheet Row och välj kalkylarket i Document (ersätt
[YOUR_ID]) och Sheet Name-värdetGemini. - Öppna Utility: Update Image Link och bekräfta att Operation är satt till
appendOrUpdate. - Öppna Update Video Link och bekräfta att Operation är satt till
appendOrUpdate. - Inloggningsuppgifter krävs: Anslut era
googleSheetsOAuth2Api-inloggningsuppgifter till Fetch Video Sheet Row, Utility: Fetch Image Sheet Row, Utility: Update Image Link och Update Video Link.
Steg 3: Sätt upp bildgenerering och lagring
Den här vägen transformerar URL:er, genererar en bild med OpenRouter, konverterar den till en fil och laddar upp till Drive innan den skriver tillbaka till Sheets.
- I Utility: Map Image URLs, behåll Include Other Fields aktiverat och behåll uttrycken som omvandlar Drive-länkar till URL:er för direktvisning.
- I Utility: Generate Image via OpenRouter, ställ in URL till
https://openrouter.ai/api/v1/chat/completionsoch behåll JSON Body som={ ... "text": "{{ $json.prompt }}" ... "url": "{{ $json.product }}" ... }. - Ställ in Utility: Delay 10 Seconds Amount till
10för att låta bildgenereringen bli klar. - I Utility: Extract Base64 Payload, behåll JavaScript-koden som extraherar
data,mimeTypeochfileNamefrån OpenRouter-svaret. - I Utility: Convert Data to File, ställ in Operation till
toBinaryoch Source Property tilldata, med File Name={{ $json.fileName }}och Mime Type={{ $json.mimeType }}. - I Utility: Upload Image to Drive, välj er mål-Folder (ersätt
[YOUR_ID]) och behåll Name somoutput.png. - I Utility: Update Image Link, behåll mappningen så att img_url är
={{ $json.webViewLink }}och product är={{ $('Utility: Fetch Image Sheet Row').item.json.product }}. - Inloggningsuppgifter krävs: Anslut era
httpHeaderAuth-inloggningsuppgifter till Utility: Generate Image via OpenRouter. - Inloggningsuppgifter krävs: Anslut era
googleDriveOAuth2Api-inloggningsuppgifter till Utility: Upload Image to Drive.
⚠️ Vanlig fallgrop: Om Utility: Extract Base64 Payload misslyckas, verifiera att OpenRouter-svaret innehåller choices[0].message.images[0].image_url.url och att er API-nyckel har åtkomst till bildgenerering.
Steg 4: Sätt upp AI-analys och videopromptning
Den här delen analyserar den renderade bilden, tar fram strukturerade scenbeskrivningar och förbereder promptar för videogenerering.
- I Inspect Image Content, bekräfta att Resource är
imageoch behåll uttrycket för Image URLs som normaliserar Google Drive-länkar till URL:er för direktnedladdning. - I Compose Scene Descriptions, behåll prompttexten och säkerställ att Prompt Type är
definemed hasOutputParser aktiverat. - I Parse Structured Output, behåll Schema Type som
manualoch lämna JSON-schemat som det är angivet. - Bekräfta att OpenAI Chat Engine är ansluten som språkmodell för Compose Scene Descriptions och Parse Structured Output (inloggningsuppgifter måste läggas till i OpenAI Chat Engine).
- Inloggningsuppgifter krävs: Anslut era
openAiApi-inloggningsuppgifter till Inspect Image Content och OpenAI Chat Engine.
⚠️ Vanlig fallgrop: Lägg inte till inloggningsuppgifter i Parse Structured Output—det är en subnod och använder modellens inloggningsuppgifter från OpenAI Chat Engine.
Steg 5: Konfigurera videogenerering, polling och leverans
Den här delen skapar videor, pollar deras status, laddar ner den färdiga filen, laddar upp till Drive och uppdaterar ert kalkylark.
- I Request NanoBanana Edit, ställ in URL till
=https://queue.fal.run/fal-ai/{{ $('Fetch Video Sheet Row').item.json.model }}/editoch behåll JSON Body-fältenpromptochimage_urlssom visat. - I Retrieve Image Status, behåll URL satt till
={{ $json.status_url }}, och bekräfta sedan att Check Image Status jämför={{ $json.status }}medCOMPLETED. - I Fetch Rendered Image, ställ in URL till
=https://queue.fal.run/fal-ai/nano-banana/requests/{{ $json.request_id }}. - I Request Veo3 Video, behåll JSON Body där prompt är satt till
={{ $json.output.characters[0].description }}{{ $json.output.scene_description }}{{ $json.output.camera_movement }}{{ $json.output.object_movements }}{{ $json.output.sound_effects }}och image_url till={{ $('Fetch Rendered Image').item.json.images[0].url }}. - Använd Iterate Video Jobs för att loopa igenom jobb, och bekräfta att Delay Video Poll matar in i Retrieve Video Status för polling.
- I Route Video Status, behåll de tre statusreglerna
COMPLETED,IN_PROGRESSochIN_QUEUEför att styra polling-loopen. - I Download Video File, behåll URL som
={{ $json.video.url }}, och ladda sedan upp via Upload Video to Drive med Name={{ $json.video.url }}. - I Update Video Link, behåll mappningar så att product är
={{ $('Fetch Video Sheet Row').item.json.product }}och video_url är={{ $json.webViewLink }}. - Inloggningsuppgifter krävs: Anslut era
httpHeaderAuth-inloggningsuppgifter till alla HTTP request-noder som används för rendering och video (t.ex. Request NanoBanana Edit, Retrieve Image Status, Fetch Rendered Image, Request Veo3 Video, Retrieve Video Status, Fetch Completed Video, Download Video File). - Inloggningsuppgifter krävs: Anslut era
googleDriveOAuth2Api-inloggningsuppgifter till Upload Video to Drive.
⚠️ Vanlig fallgrop: Säkerställ att statusendpoints returnerar status_url och response_url; saknade värden kommer att slå sönder Retrieve Video Status och Fetch Completed Video.
Steg 6: Testa och aktivera ert arbetsflöde
Kör ett fullständigt test för att bekräfta att bildgenerering, analys och videoleverans slutförs korrekt.
- Klicka på Execute Workflow på Manual Start Trigger för att köra ett test.
- Verifiera att Utility: Update Image Link skriver en Drive-URL till
img_urloch att Update Video Link skriver en Drive-URL tillvideo_urli era Sheets. - Bekräfta att Upload Video to Drive och Utility: Upload Image to Drive skapade filer i förväntad mapp.
- Efter ett lyckat test, växla arbetsflödet till Active för användning i produktion.
Vanliga fallgropar
- Delningsinställningar i Google Drive spelar större roll än många tror. Om filen inte är satt till ”Alla med länken → Visare” kan bild- och videogenererings-API:er ge 403-fel, så kontrollera filbehörigheterna i Drive först.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- Fal.ai-credentials och jobbendpoints är strikta med headers och JSON-form. Om körningar plötsligt misslyckas, kontrollera att Authorization-headern fortfarande matchar din FAL_KEY och att dina uttryck returnerar objekt (inte JSON-strängar).
Vanliga frågor
Cirka 30 minuter om dina inloggningar och credentials är klara.
Nej. Du kommer mest att koppla konton och ändra några fält i ditt Google Sheet.
Ja. n8n har ett gratisalternativ för egen hosting och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna in kostnader för Fal.ai och LLM-användning, som beror på hur många bilder och 5–8 sekunders videor du genererar.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärd och klarar n8n bra. Egen hosting ger obegränsade körningar men kräver grundläggande serverhantering.
Ja, men du vill göra det i delen som skickar videoförfrågan. Uppdatera prompten och parametrarna för bildförhållande i noden Veo3 (HTTP Request) och håll scenutdata konsekvent genom att justera agentprompten i ”Compose Scene Descriptions”. Vanliga justeringar är att byta 1:1 till 9:16, tvinga regler för text på skärmen och strama upp scenlängden så att klippet håller sig inom fönstret på 5–8 sekunder.
Oftast handlar det om OAuth-behörigheter eller en uppdaterad token som inte sparades. Återanslut Google Drive-credentialen i n8n och bekräfta sedan att mål-mappen är åtkomlig för det Google-kontot. Kontrollera också delningsinställningarna på källbilderna för produkten, eftersom en privat Drive-fil kan se ut som ett ”genereringsfel” när det i själva verket är ett hämtningsfel.
På en typisk n8n Cloud-plan kör de flesta team batchar på 20–100 rader utan problem, och skalar sedan upp när de validerat output och kötider. Om du kör egen hosting finns ingen exekveringsgräns, men du begränsas fortfarande av API rate limits, modellköer och din servers CPU/RAM när större MP4:or laddas ner. Rent praktiskt: börja smått. Få en körning som går igenom, och öka sedan batchstorleken med Split in Batches så att fel inte slår ut hela produktionskörningen.
Ofta, ja. Det här flödet bygger på att polla långkörande jobb, loopa genom batchar, hantera binära filer och tvinga fram strukturerad AI-output, vilket är där n8n brukar vara mer flexibelt och mer kostnadseffektivt. Zapier och Make kan göra delar av det, men videoproduktion i flera steg plus filhantering blir dyrt snabbt. Om ditt use case strikt är ”skapa en bild och ladda upp den” kan enklare verktyg räcka. Prata med en automationsexpert om du vill ha en snabb rekommendation baserat på dina volymer.
När detta väl rullar slutar ditt kalkylark vara en påminnelse och blir ett produktionssystem. Sätt upp det, generera i batchar och fortsätt testa utan länkkarusellen.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.