Google Sheets + OpenAI: shorts posted to TikTok
You sit down to “just post a short,” and suddenly you’re writing hooks, brainstorming ideas, chasing hashtags, and trying to remember what you posted last week. Then you still have to upload, caption, publish, and track it somewhere that isn’t a mess.
Social media managers feel it first. But solo creators and agency owners get boxed in by it too. This TikTok shorts automation takes you from idea to posted video and a clean Google Sheets trail, without living inside five tabs all day.
You’ll see what the workflow does, why it saves so much mental energy, and how to adapt it to your posting style once it’s running.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Google Sheets + OpenAI: shorts posted to TikTok
flowchart LR
subgraph sg0["Trigger: Start Daily Content Generation Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Trigger: Start Daily Content..", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "AI Agent: Generate Creative ..", pos: "b", h: 48 }
n2@{ icon: "mdi:wrench", form: "rounded", label: "Tool: Inject Creative Perspe..", pos: "b", h: 48 }
n3@{ icon: "mdi:brain", form: "rounded", label: "LLM: Generate Raw Idea (GPT-..", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "Parse AI Output (Idea, Envir..", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Save Idea & Metadata to Goog..", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "AI Agent: Generate Detailed ..", pos: "b", h: 48 }
n7@{ icon: "mdi:brain", form: "rounded", label: "LLM: Draft Video Prompt Deta..", pos: "b", h: 48 }
n8@{ icon: "mdi:wrench", form: "rounded", label: "Tool: Refine and Validate Pr..", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Parse Structured Video Promp..", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Parse Scene Prompts into Ind.."]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Generate Video Clips (Wavesp.."]
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/>Generate ASMR Sound (Fal AI)"]
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/code.svg' width='40' height='40' /></div><br/>Extract Video URL from Gener.."]
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 Clips into Final Video.."]
n15@{ icon: "mdi:cog", form: "rounded", label: "Wait for Video Processing (2..", pos: "b", h: 48 }
n16@{ icon: "mdi:database", form: "rounded", label: "Save Final Video URL to Sheets", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Configure Social Media Accou..", pos: "b", h: 48 }
n18@{ icon: "mdi:database", form: "rounded", label: "Retrieve Final Video Data", pos: "b", h: 48 }
n19["<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 Blotato"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Publish to Instagram"]
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/>Publish to TikTok"]
n22@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check if Video Generation Co..", pos: "b", h: 48 }
n23@{ icon: "mdi:cog", form: "rounded", label: "Wait for Video Generation (2..", pos: "b", h: 48 }
n24["<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/>Poll Video Generation Status"]
n25@{ icon: "mdi:swap-vertical", form: "rounded", label: "Build Video Status Check URL", pos: "b", h: 48 }
n26["<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/>Fetch Generated Video from F.."]
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/code.svg' width='40' height='40' /></div><br/>Fetch Final Merged Video fro.."]
n28@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check if Sound Generation Co..", pos: "b", h: 48 }
n29@{ icon: "mdi:cog", form: "rounded", label: "Wait for Sound Generation (2..", pos: "b", h: 48 }
n30@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check if Merge Complete", pos: "b", h: 48 }
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/>Poll Sound Generation Status"]
n32["<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/>Fetch Generated Audio from F.."]
n33["<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/>Poll Merge Status"]
n33 --> n30
n30 --> n27
n30 --> n15
n19 --> n20
n19 --> n21
n18 --> n17
n25 --> n26
n12 --> n28
n31 --> n28
n24 --> n22
n16 --> n18
n29 --> n31
n23 --> n24
n15 --> n33
n3 -.-> n1
n8 -.-> n6
n28 --> n32
n28 --> n29
n22 --> n25
n22 --> n23
n17 --> n19
n11 --> n22
n27 --> n16
n9 -.-> n6
n14 --> n30
n5 --> n6
n1 --> n5
n32 --> n14
n26 --> n13
n0 --> n1
n2 -.-> n1
n6 --> n10
n7 -.-> n6
n10 --> n11
n13 --> n12
n4 -.-> n1
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 n1,n4,n6,n9 ai
class n3,n7 aiModel
class n2,n8 ai
class n22,n28,n30 decision
class n5,n16,n18 database
class n11,n12,n14,n19,n20,n21,n24,n31,n33 api
class n10,n13,n26,n27,n32 code
classDef customIcon fill:none,stroke:none
class n10,n11,n12,n13,n14,n19,n20,n21,n24,n26,n27,n31,n32,n33 customIcon
The Challenge: Consistent TikTok Posting Without the Content Grind
Posting short-form content sounds simple until you do it consistently. Ideas dry up. Captions get repetitive. And even when you do publish, you can’t remember what you used for the hook, what hashtags you tried, or which version of the concept performed best. So you end up winging it, which usually means more time spent “getting ready to post” than actually posting. The worst part is the invisible tax: context switching and second-guessing that drains your creative energy before you even hit publish.
It adds up fast. Here’s where it breaks down in real life.
- You brainstorm in one place, draft captions in another, then lose track of what got approved and what never shipped.
- Manual uploads to TikTok take long enough that you start skipping days, especially when you’re busy with client work.
- When you “reuse” an idea, you accidentally repeat the same phrasing, which makes the content feel stale.
- No posting log means you can’t improve systematically because you’re guessing what worked.
The Fix: Google Sheets + OpenAI → Generated Shorts, Posted to TikTok
This workflow runs on a schedule and produces a complete, platform-ready short without you shepherding every step. It starts by using OpenAI (GPT-4.1 in the workflow) to generate a trend-aware ASMR-style concept plus a caption and hashtags. That idea is logged into a dedicated “Ideas” tab in Google Sheets, so you have a simple editorial trail. Next, the workflow expands the approved idea into three cinematic scene prompts, then sends those prompts to Fal.ai to generate video clips and a matching ASMR audio track. Once the assets are ready, it merges everything into a final vertical video, stores the final URL in a “Published” tab, and publishes to TikTok through Blotato.
The workflow starts with a daily trigger, then moves through ideation, scene prompting, video/audio generation, and merging. Finally, it uploads the finished asset to Blotato and publishes to TikTok (and Instagram too, if you keep that path enabled). Your Google Sheet becomes the source of truth, which means you can scale output without losing control.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you publish one TikTok short per day. Manually, you might spend about 20 minutes ideating and writing a caption, another 10 minutes generating or sourcing assets, then 10 minutes uploading and double-checking everything, which is roughly 40 minutes a day. With this workflow, the “work” is closer to 5 minutes to review what got logged in Google Sheets, then you wait for rendering and posting to finish in the background. That’s about 30 minutes back per day, and you still end up with a posting trail you can trust.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to log ideas and published URLs.
- OpenAI API for idea and prompt generation.
- Fal.ai to generate clips, audio, and final merges.
- Blotato to publish to TikTok (and Instagram).
- OpenAI API key (get it from the OpenAI dashboard).
Skill level: Intermediate. You won’t write “software,” but you will paste API keys, match Google Sheet column names exactly, and test a few runs.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A daily schedule trigger kicks things off. The workflow runs automatically (daily by default), so you’re not relying on willpower or reminders to stay consistent.
OpenAI generates an idea and stores it in Google Sheets. It drafts the concept, caption, hashtags, and a few structured fields (like environment and sound), then logs everything to an “Ideas” sheet to keep the pipeline organized.
Fal.ai creates the video clips, audio, then merges them. The workflow splits the idea into three scene prompts, requests video generation, polls until the clips are ready, generates a matching ASMR audio bed, and merges everything into a final short.
Blotato publishes to TikTok and the workflow writes back the results. The final output URL gets saved to a “Published” sheet, then Blotato uploads and posts to TikTok using the caption you generated earlier.
You can easily modify the prompts and the posting rules to match your niche, which means you’re not stuck making ASMR content forever. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set up the workflow to run on a schedule using the trigger node.
- Add or open Daily Content Scheduler.
- Configure the schedule options for your daily run cadence (e.g., every day at a specific time).
- Connect Daily Content Scheduler to Creative Idea Agent as the starting node.
Step 2: Connect Google Sheets
Configure Sheets nodes to log and retrieve idea and final video metadata.
- Open Log Idea to Sheets and select the target spreadsheet and worksheet.
- Open Store Final Video URL and point it to the same or a dedicated worksheet for output URLs.
- Open Fetch Final Video Data and configure the read range and lookup logic for the final video record.
- Credential Required: Connect your Google Sheets credentials to Log Idea to Sheets, Store Final Video URL, and Fetch Final Video Data.
Step 3: Set Up AI Idea and Prompt Generation
Configure the AI agents and their connected tools/parsers to generate and structure the content idea and detailed scene prompts.
- Open Creative Idea Agent and confirm it uses LLM Raw Idea Draft as the language model.
- Ensure Idea Perspective Tool and Parse Idea Output are connected to Creative Idea Agent as the tool and output parser.
- Open Prompt Detail Agent and confirm it uses LLM Prompt Detail Draft as the language model.
- Ensure Prompt Review Tool and Parse Prompt Structure are connected to Prompt Detail Agent.
- Credential Required: Connect your OpenAI credentials to LLM Raw Idea Draft and LLM Prompt Detail Draft. The tools/parsers (Idea Perspective Tool, Parse Idea Output, Prompt Review Tool, Parse Prompt Structure) inherit credentials from their parent agents.
Step 4: Configure Scene Splitting and Video Clip Generation
Split scene prompts into individual clips and trigger video generation.
- Open Split Scene Prompts and ensure the code outputs a list of scene prompts for the video API.
- Configure Create Video Clips with the video generation API endpoint and authentication headers.
- In Verify Video Generation, define the condition that determines if generation is complete or needs a retry.
- Set the wait duration in Delay Video Check for the polling interval.
- Configure Query Video Status to request the clip status, and map its response in Assemble Video Status URL and Get Video Queue Result.
{{YOUR_WEBHOOK_ID}} must be replaced or the node set to a time delay method.Step 5: Create Audio, Merge Clips, and Retrieve Final Video
Generate ASMR audio, merge clips into a final video, and retrieve the final asset URL.
- In Extract Video Link, ensure the code extracts the video clip URLs needed for audio and merge steps.
- Configure Create ASMR Audio with your audio generation API endpoint and auth headers.
- Set the completion logic in Verify Sound Generation and the polling interval in Delay Sound Check before Query Sound Status.
- Map the finalized audio data in Get Audio Queue Result and send it to Merge Clips to Final Video.
- Define merge status logic in Verify Merge Completion, configure Query Merge Status, and set the retry interval in Delay Merge Processing.
- Use Retrieve Merged Video to extract the final video URL before saving it in Store Final Video URL.
Step 6: Configure Posting and Parallel Social Publishing
Fetch the final video data, assign social account IDs, upload the video, and post to social channels in parallel.
- Ensure Fetch Final Video Data retrieves the right row and fields needed for social posting.
- In Assign Social Account IDs, set the IDs or tokens for the social destinations.
- Configure Upload Video Asset to upload the final asset to your social publishing API.
- Upload Video Asset outputs to both Post to Instagram and Post to TikTok in parallel.
- Set each posting request in Post to Instagram and Post to TikTok with the required captions, media IDs, and access tokens.
Step 7: Test and Activate Your Workflow
Run a manual test to verify all stages from idea generation to publishing, then activate the scheduler.
- Click Execute Workflow and monitor each node from Daily Content Scheduler through Post to Instagram and Post to TikTok.
- Confirm successful execution by checking: logged idea rows in Log Idea to Sheets, final URL in Store Final Video URL, and published posts on both social channels.
- If any node fails, inspect the HTTP response in the execution data for API errors and adjust headers or payloads.
- Once verified, turn on Active to run the workflow on schedule.
Watch Out For
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials screen and Google OAuth access first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Common Questions
About 60–90 minutes if your accounts and API keys are ready.
Yes, but you’ll want one detail-oriented owner. No coding is required, though you must match the Google Sheets columns exactly and paste API keys correctly.
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 OpenAI API costs and Fal.ai generation costs, which vary based on how many videos you render.
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.
Start by changing the two OpenAI prompt stages: the idea generator and the scene prompt drafter. If you want a different content style (product demos, tips, founder stories), update the prompt text there and keep the Google Sheets logging the same. You can also swap Fal.ai video generation settings like duration and aspect ratio, then adjust the “Publish to TikTok” request to match your caption rules and privacy defaults.
Usually it’s an expired Google OAuth connection or the wrong spreadsheet permissions. Reconnect the Google Sheets credential in n8n, then confirm the spreadsheet ID is correct and the sheet tabs are named exactly “Ideas” and “Published.” If columns were added or renamed, writes can fail silently or land in the wrong place. Honestly, this is the most common “it worked yesterday” issue.
If you self-host, there’s no execution limit (it mostly depends on your server and API rate limits).
For AI-heavy content pipelines, n8n is usually the better fit because it handles branching logic, looping/polling, and multi-step processing without turning into an expensive “task” bill. This workflow relies on waits and polling for Fal.ai jobs, plus structured parsing and merges, and that’s where Zapier often gets clunky. Make can do it, but scenarios like this can become fragile once you add retries and error paths. If you only need “take a row in Sheets and post it,” a simpler tool might be fine. Talk to an automation expert if you want an unbiased recommendation based on volume and budget.
Once this is running, your content engine doesn’t disappear when you get busy. The workflow handles the repetitive parts, and you get to focus on improving what you publish.
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.