Du känner igen känslan: du skulle kunna publicera varje dag, men att förvandla ett citat till en bra Reel blir ett helt miniprojekt. Hitta citatet, skriva captions, generera en röst, rendera videon, ladda upp den tre gånger, och sedan hålla koll på vad som redan är publicerat så att du inte upprepar dig.
Content marketers stöter på det här när konsekvens är viktigare än “stora lanseringar”. En soloskapare känner av det ännu mer. Och om du driver en byrå och hanterar kunders kanaler är automatisering av citat-reels skillnaden mellan “vi postar när vi hinner” och en stabil produktion som faktiskt ger kumulativ effekt.
Det här flödet hämtar opublicerade citat från Google Sheets, gör varje citat till en 8 sekunder lång filmisk vertikal video och publicerar via Postiz till TikTok, Instagram Reels och YouTube Shorts. Du får lära dig vad som automatiseras, vad du behöver och hur du får det att rulla utan att sitta och passa renderingar.
Så fungerar automatiseringen
Här är hela workflowet du kommer att sätta upp:
n8n Workflow Template: Google Sheets + Postiz: citatreels publiceras åt dig
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:robot", form: "rounded", label: "Prompt Agent", pos: "b", h: 48 }
n1@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", 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 video to Postiz"]
n3["<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 Postiz integrations"]
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch1", 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/>Schedule YouTube"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Schedule TikTok"]
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/>Schedule Instagram"]
n8@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", 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/>Fetch Status"]
n10["<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 Video1"]
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/jwt.svg' width='40' height='40' /></div><br/>JWT"]
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n13@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", 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/>Merge - Creatomate"]
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If3", pos: "b", h: 48 }
n16["<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/>Creatomate HTTP Body"]
n17@{ icon: "mdi:cog", form: "rounded", label: "Convert text to speech", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Upload to GCS Audio", pos: "b", h: 48 }
n19@{ icon: "mdi:cog", form: "rounded", label: "Upload to GCS Video", pos: "b", h: 48 }
n20@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n21@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n22@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n23@{ icon: "mdi:cog", form: "rounded", label: "Limit", pos: "b", h: 48 }
n24@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Input Data", pos: "b", h: 48 }
n25@{ icon: "mdi:robot", form: "rounded", label: "Content writer", pos: "b", h: 48 }
n26@{ icon: "mdi:swap-vertical", form: "rounded", label: "SET Credentials", pos: "b", h: 48 }
n27["<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 Token"]
n28@{ icon: "mdi:cog", form: "rounded", label: "Wait for Video", pos: "b", h: 48 }
n29@{ icon: "mdi:cog", form: "rounded", label: "Wait for Rendering", pos: "b", h: 48 }
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/>Check status of render"]
n32@{ icon: "mdi:database", form: "rounded", label: "Mark Quota as Done", pos: "b", h: 48 }
n33@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n34["<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 file Cloudinary"]
n35["<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/>Make upscaled URL"]
n36["<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/>Send to Cloudianry"]
n15 --> n36
n15 --> n29
n11 --> n27
n23 --> n24
n12 --> n8
n12 --> n28
n4 --> n6
n4 --> n5
n4 --> n7
n27 --> n10
n9 --> n12
n0 --> n25
n25 --> n17
n24 --> n0
n28 --> n9
n8 --> n19
n10 --> n28
n26 --> n11
n33 --> n22
n35 --> n34
n21 -.-> n25
n14 --> n29
n7 --> n32
n36 --> n35
n29 --> n30
n22 --> n23
n19 --> n16
n16 --> n14
n18 --> n26
n30 --> n15
n17 --> n18
n2 --> n3
n3 --> n4
n34 --> n2
n13 -.-> n0
n20 -.-> n25
n1 --> n22
end
subgraph sg1["Flow 2"]
direction LR
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Download final video"]
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 n1,n33 trigger
class n0,n20,n25 ai
class n13,n21 aiModel
class n4,n12,n15 decision
class n22,n32 database
class n2,n3,n5,n6,n7,n9,n10,n14,n27,n30,n34,n36,n31 api
class n16,n35 code
classDef customIcon fill:none,stroke:none
class n2,n3,n5,n6,n7,n9,n10,n11,n14,n16,n27,n30,n34,n35,n36,n31 customIcon
Varför det här spelar roll: daglig publicering faller på “produktion”-steget
Att publicera citat-reels låter enkelt tills du gör det varje dag. Citatet är lätt. Resten är slitjobbet: du behöver vertikalt videoformat, en voice-over som inte låter robotisk, musik som matchar känslan, captions som fungerar på varje plattform och en slutrender som ser genomtänkt ut (inte som en mall du hittade i panik). Sedan ska du fortfarande ladda upp till TikTok, Reels och Shorts och föra logg så att samma citat inte dyker upp igen nästa vecka. Det är den ständiga kontextväxlingen som dödar momentum.
Det drar snabbt iväg. Här brukar det oftast falla isär.
- En “enkel” reel kan bli ungefär en timme av prompts, redigering, exporter och uppladdningar.
- När du spårar publicerade citat manuellt smyger dubbletter in och ditt bibliotek blir rörigt.
- Captions översätts inte rakt av mellan plattformar, så du skriver om samma idé tre gånger.
- Rendering misslyckas eller tar längre tid än väntat, och plötsligt felsöker du i stället för att publicera.
Vad du bygger: publicering från Sheets till video på autopilot
Det här workflowet gör ett Google Sheet till en daglig innehållskö. Det startar på ett schema (eller med en manuell körning), hämtar en opublicerad rad som innehåller ditt citat plus fält för “kreativ riktning” som ton, mood, stil och röst-ID, och skickar sedan den inputen till AI för att generera scener och plattformsanpassade captions. Därefter skapar det en voice-over med ElevenLabs, renderar en 8 sekunder lång vertikal video med Google VEO3 och en Creatomate-komposition, och skalar upp slutresultatet via Cloudinary. När videon är klar skickar n8n den till Postiz, som köar inlägg till TikTok, Instagram Reels och YouTube Shorts. Till sist markerar flödet raden som publicerad i Google Sheets så att workflowet aldrig återanvänder samma citat.
Workflowet börjar med “välj nästa citat”. Sedan kommer innehållsgenerering och rendering (röst, visuellt, klipp). Sist distribueras det via Postiz och ditt sheet uppdateras så att morgondagens körning startar med strukturerade, korrekta data.
Det här bygger du
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du vill publicera en citat-reel per dag på tre plattformar. Manuellt tar även en “snabb” process kanske 20 minuter att generera material, 20 minuter att sätta ihop/exportera och cirka 10 minuter per plattform för att ladda upp och skriva captions, alltså ungefär en och en halv timme per dag. Med det här workflowet kan ditt dagliga arbete vara så lite som 5 minuter för att lägga in några citat i Google Sheets, sedan väntar du på rendering och publiceringen sker via Postiz. Det är ungefär en timme tillbaka per dag, och konsekvensen hänger inte på ditt humör.
Innan du börjar
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Google Sheets för att lagra citat och publiceringsstatus.
- Postiz för att publicera till TikTok, Reels och Shorts.
- API-nycklar (Gemini, OpenAI, ElevenLabs, Cloudinary, plus Postiz-token från din Postiz-dashboard).
Svårighetsgrad: Medel. Du kopplar konton, lägger in API-nycklar och testar en render-/publiceringskörning från start till mål.
Vill du att någon bygger det åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
Ett dagligt schema (eller en manuell körning) drar igång allt. Workflowet kan köras via en planerad schematrigger för hands-off-publicering, och det innehåller även en manuell trigger för test eller batchkörningar.
Google Sheets levererar nästa “opublicerade” citat. n8n läser rader, begränsar posterna till ett enda objekt och mappar dina fält (citat, mood, stil, röst-ID) till en strukturerad input så att AI-prompter längre fram blir konsekventa.
AI skapar den kreativa briefen och orden som tittarna faktiskt läser. En prompt-orkestrerare använder Gemini plus GPT för att generera scener och plattformsanpassade captions, och sedan gör en strukturerad parser om outputen till pålitliga fält för rendering (så att du inte sitter och kopierar från ett chattfönster).
Rendering, uppskalning och publicering sker i bakgrunden. ElevenLabs syntetiserar röstspåret, media laddas upp, Creatomate bygger den slutliga kompositionen, Cloudinary skalar upp den och Postiz köar den till TikTok, Instagram och YouTube baserat på din publiceringsrutt. När den är köad uppdateras raden i sheetet till “Publicerad”.
Du kan enkelt ändra publiceringsdestinationer eller regler för kreativ stil utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: Konfigurera triggertypen
Ställ in hur arbetsflödet startar, antingen manuellt eller enligt ett schema, innan någon data hämtas eller bearbetas.
- Lägg till och behåll Manual Run Trigger för tester vid behov och backfills.
- Lägg till och konfigurera Planned Schedule Trigger för att köra ert automatiserade schema.
- Bekräfta att båda triggerna är kopplade till Retrieve Sheet Rows så att båda startmetoderna hämtar samma datakälla.
Steg 2: Anslut Google Sheets
Hämta er innehållsplan eller promptindata från kalkylarket och begränsa samt förbered fälten för efterföljande AI-steg och rendering.
- Öppna Retrieve Sheet Rows och anslut ert ark som innehåller indata för kortformatvideo.
- Autentiseringsuppgifter krävs: Anslut era Google Sheets-uppgifter för Retrieve Sheet Rows och Update Quota Complete.
- I Limit Records anger ni hur många rader som ska bearbetas per körning (t.ex. en liten batch för test).
- I Assign Input Fields mappar ni de kolumner ni behöver som standardiserade fält för AI-stegen.
Steg 3: Sätt upp AI-generering av manus
Generera strukturerade manus med agenten och LLM-kedjan innan ni producerar ljud.
- Öppna Prompt Orchestrator och säkerställ att den är ansluten till Gemini Chat Model som språkmodell.
- Autentiseringsuppgifter krävs: Anslut era Google Gemini-uppgifter i Gemini Chat Model.
- Konfigurera Compose Script Content att köras efter Prompt Orchestrator.
- Bekräfta att OpenAI Chat Engine är ansluten som språkmodell för Compose Script Content.
- Autentiseringsuppgifter krävs: Anslut era OpenAI-uppgifter i OpenAI Chat Engine.
- Säkerställ att Parse Structured Output är ansluten som output parser för Compose Script Content (autentiseringsuppgifter ska läggas till i överordnad LLM-nod, inte i den här parsern).
Steg 4: Generera och lagra röstljud
Skapa röstspåret från manuset och lagra det i Google Cloud Storage för rendering.
- Öppna Synthesize Voice Track och konfigurera röst- och modellinställningarna för ElevenLabs.
- Autentiseringsuppgifter krävs: Anslut era ElevenLabs-uppgifter i Synthesize Voice Track.
- Konfigurera Upload Audio to GCS för att ladda upp den resulterande ljudfilen.
- Autentiseringsuppgifter krävs: Anslut era Google Cloud Storage-uppgifter i Upload Audio to GCS och Upload Video to GCS.
- Säkerställ att Upload Audio to GCS går vidare till Assign API Credentials för efterföljande renderautentisering.
Steg 5: Konfigurera rendering och statuskontroller
Begär en rendering, pausa medan videon produceras och loopa genom statuskontroller tills en färdig tillgång finns tillgänglig.
- Sätt upp Assign API Credentials för att bygga de API-fält som krävs och som används av JWT Builder.
- Konfigurera JWT Builder och skicka dess token till Request Access Token.
- Säkerställ att Request Access Token går vidare till Initiate Video Render och därefter till Pause for Video.
- Verifiera statusloopen: Pause for Video → Retrieve Render Status → Branch on Render State.
- Bekräfta att Branch on Render State skickar färdiga renderingar till Transform to Media File och pågående objekt tillbaka till Pause for Video.
Steg 6: Renderingsbygge, Cloudinary och routning till sociala kanaler
Bygg videopayloaden, rendera och skala upp tillgången och distribuera sedan till era sociala plattformar samt uppdatera kvoter.
- Säkerställ att Transform to Media File går till Upload Video to GCS och därefter till Compose Creatomate Payload och Merge Creatomate Output.
- Bekräfta verifieringsloopen för rendering: Merge Creatomate Output → Hold for Rendering → Verify Render Status → Check Render Condition.
- Ställ in Check Render Condition så att färdiga renderingar routas till Send to Cloudinary och pågående objekt tillbaka till Hold for Rendering.
- Konfigurera Send to Cloudinary → Build Upscaled URL → Fetch Cloudinary File → Post Video to Postiz för tillgångspipelinen.
- Efter Post Video to Postiz, verifiera att Retrieve Postiz Integrations leder till Route Posting Options, som förgrenar till Queue TikTok Publish, Queue YouTube Publish eller Queue Instagram Publish.
- Säkerställ att Queue Instagram Publish avslutas med Update Quota Complete för att markera raden som bearbetad.
Steg 7: Testa och aktivera ert arbetsflöde
Kör ett kontrollerat test, bekräfta att varje steg slutförs och slå sedan på schemalagd automation.
- Klicka på Manual Run Trigger för att köra ett enskilt objekt från början till slut.
- Verifiera att en lyckad körning inkluderar: ett manus från Compose Script Content, en ljudfil i Upload Audio to GCS, en video i Upload Video to GCS och ett köat inlägg i någon av plattformarnas könoder.
- Kontrollera Update Quota Complete för att bekräfta att arkraden uppdaterades efter publicering.
- När ni är redo, aktivera arbetsflödet och förlita er på Planned Schedule Trigger för körningar i produktion.
Felsökningstips
- Åtkomst till Google Sheets kan fallera om du har ändrat behörigheter i kalkylbladet eller om OAuth-kopplingen har löpt ut. Kontrollera Google-kontokopplingen i n8n Credentials och bekräfta att sheetet är korrekt delat.
- Om du använder Wait-noder eller extern rendering varierar process-tiderna. Öka väntetiden om noder längre ned misslyckas på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in din varumärkesröst tidigt, annars kommer du att redigera output för alltid.
Snabba svar
Cirka en timme om du redan har alla API-nycklar och Postiz är anslutet.
Nej. Du klistrar mest in API-nycklar, kopplar konton och testar en körning. Det finns en kodnod i workflowet, men du behöver inte skriva kod för att använda det som det är.
Ja. n8n har ett gratis self-hosted-alternativ 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 med API-kostnader för Gemini/OpenAI, röstgenerering i ElevenLabs och tjänster som Creatomate/Cloudinary beroende på din användning.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och hanterar n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det är ärligt talat den roligaste delen. Du kan ändra vilka fält som hämtas från Google Sheets i “Assign Input Fields”, byta caption-strategi genom att justera prompterna i Gemini/GPT-noderna och styra publiceringen annorlunda i “Route Posting Options”. Vanliga tweaks är att använda olika röst-ID per varumärke, ändra videolängd/stil i Creatomate-payloaden eller att bara publicera till en plattform medan du kvalitetstestar.
Oftast är det en utgången eller felaktig Postiz API-token. Uppdatera token som används i HTTP Request-noderna (“Retrieve Postiz Integrations” och “Post Video to Postiz”) och bekräfta att integrationerna fortfarande är aktiva i Postiz. Om det bara misslyckas ibland kan du slå i rate limits eller skicka en ogiltig media-URL, så kontrollera Cloudinary-steget och den slutliga fil-URL:en som skickas in i Postiz.
På n8n Cloud beror din månatliga volym på planens exekveringsgräns, medan self-hosting inte har något fast tak (det beror på din server). I praktiken är flaskhalsen videorendering och externa API:er, inte n8n i sig, så de flesta team kör detta dagligen eller några gånger per dag snarare än att försöka generera hundratals i en batch.
För det här use caset är svaret oftast ja. Du behöver förgreningar i flera steg (polling av rendering, väntelägen, villkorskontroller, filhantering) och det blir snabbt krångligt och dyrt i Zapier eller Make när du går bortom enkla tvåstegs-zaps. n8n är också enklare att self-hosta, vilket spelar roll om du vill köra många flöden utan att hålla koll på task counts. En annan poäng: det här workflowet bygger på HTTP-requests och strukturerad AI-parsning, vilket n8n hanterar snyggt på en canvas. Om allt du vill ha är “ny rad i Sheets → posta text någonstans” kan Zapier/Make vara enklare. Prata med en automationsexpert om du vill ha en snabb rekommendation baserat på din publiceringsvolym.
Sätt upp det en gång och låt sedan ditt kalkylblad mata dina kanaler varje dag. Workflowet gör det repetitiva jobbet så att du kan fokusera på det som faktiskt driver varumärket framåt.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.