HeyGen + TikTok: turn any link into Shorts fast
Turning a good article into a short video sounds simple until you actually do it. You read, summarize, write a hook, find visuals, record (or fake it), edit, export, re-upload, rewrite captions, and then repeat the whole thing for the next link.
This is where HeyGen TikTok automation helps. Content marketers trying to stay consistent feel the grind first, but agency owners and newsletter teams get buried by it too. You drop a URL and get a platform-ready vertical video that you can publish after a quick review.
This workflow turns “link → short” into a repeatable system. You’ll see what it does, what you need, and how the moving parts fit together so you can ship more without living in editing tools.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: HeyGen + TikTok: turn any link into Shorts fast
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "Wait", 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/>Get Avatar Video"]
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Video Done", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "Social Media Agent", pos: "b", h: 48 }
n5@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n6@{ icon: "mdi:web", form: "rounded", label: "HTTP Request1", pos: "b", h: 48 }
n7@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n8@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model1", pos: "b", h: 48 }
n9@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Create video avatar with bac.."]
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/>Create video avatar with spl.."]
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/>Get video url"]
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/>Get background video"]
n14@{ icon: "mdi:cog", form: "rounded", label: "Wait to approve by user1", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If approved publish1", pos: "b", h: 48 }
n16@{ icon: "mdi:cog", form: "rounded", label: "Upload video to all social n..", 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 background photo"]
n18@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If1", 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/>Create video avatar with bac.."]
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/>Create video avatar with spl.."]
n21@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Input Vars", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-horizontal", form: "rounded", label: "video or photo", 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/>upload to heygen"]
n24@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n0 --> n10
n0 --> n11
n18 --> n19
n18 --> n20
n1 --> n2
n24 --> n1
n12 --> n14
n6 -.-> n4
n3 --> n12
n3 --> n1
n21 --> n4
n22 --> n13
n22 --> n17
n2 --> n3
n23 --> n0
n4 --> n22
n17 --> n18
n13 --> n23
n15 --> n16
n5 -.-> n4
n7 -.-> n4
n14 --> n15
n8 -.-> n7
n9 --> n21
n10 --> n24
n19 --> n24
n11 --> n24
n20 --> n24
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 n9 trigger
class n4,n7 ai
class n5,n8 aiModel
class n0,n3,n15,n18,n22 decision
class n2,n6,n10,n11,n12,n13,n17,n19,n20,n23 api
classDef customIcon fill:none,stroke:none
class n2,n10,n11,n12,n13,n17,n19,n20,n23 customIcon
The Problem: Link-Based Shorts Are Weirdly Time-Consuming
You already have the raw material (a great link), but getting it into a short-video format is where things fall apart. Summaries get fluffy. Hooks miss the point. Captions are inconsistent across TikTok, Reels, and Shorts, so performance is unpredictable. And even when you finally have an MP4, you’re still stuck doing the boring parts: downloading, renaming files, re-uploading, copy-pasting descriptions, and checking that the “final” is actually final. One small mistake and you’re re-rendering a video you’ve already mentally moved on from.
It adds up fast. Here’s where it breaks down in real teams.
- You spend about 45 minutes turning one URL into something you’d actually post.
- When captions are written on the fly, your voice shifts post to post, and it shows.
- Rendering becomes a waiting game, so someone ends up “babysitting” a tool instead of doing marketing work.
- Posting to TikTok, Reels, and Shorts turns into three separate mini-projects.
The Solution: URL → Script → HeyGen Video → TikTok Post
This n8n workflow takes a single URL (a news story, blog post, product launch, even an n8n workflow page) and turns it into a vertical short with an AI avatar explaining it. It starts by fetching the source page, then has an AI agent (Google Gemini) extract the key points and write a tight, hook-led monologue designed for a 30–45 second delivery. Next, it generates a matching background by capturing the page as either an animated scroll video or a static image. That background is sent to HeyGen, which renders your avatar video in either free split-screen mode or a cleaner paid cut-out mode. Finally, the workflow waits for rendering to finish, optionally pauses for human approval, and then publishes via Upload-Post to TikTok (and also Instagram Reels and YouTube Shorts if you want).
The workflow starts when you launch it (manually, or from a message if you extend it with Telegram). From there, Gemini writes the script and per-platform descriptions, ScreenshotOne produces the visuals, and HeyGen renders the final MP4. Upload-Post handles distribution so you don’t repeat the same upload three times.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 5 link-based shorts a week and you post to 3 platforms. Manually, if scripting and captions take about 25 minutes per video and uploading takes maybe 10 minutes per platform, you’re looking at roughly 4 hours a week (and that’s if nothing needs re-rendering). With this workflow, the “work” is mostly dropping the URL and reviewing the draft: about 5 minutes per video, plus render time in the background. You still stay in control, but you stop doing the repetitive parts.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- HeyGen to render the avatar video.
- Google Gemini to generate scripts and descriptions.
- ScreenshotOne API key (get it from your ScreenshotOne dashboard).
Skill level: Intermediate. You’ll connect a few APIs, set variables, and run a test render end-to-end.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
You trigger it with a URL. The workflow is designed to run on demand (a manual launch), and it starts by loading the page you want to turn into a short. That can be a news link, a blog post, or even documentation you want to explain.
The content gets summarized into a real script. A Gemini-powered agent reads the page and produces a hook-led monologue designed to land in about 30–45 seconds. In the same pass, it generates platform-optimized descriptions so TikTok, Reels, and Shorts aren’t getting the same generic caption.
The visuals are created from the page itself. You choose between an animated scroll capture (video background) or a static image background. ScreenshotOne generates the asset, and n8n sends it to HeyGen so the avatar render matches what the viewer is hearing.
The final MP4 is rendered, reviewed, and published. HeyGen renders either a free split-screen layout or a paid cut-out style with background removal. n8n polls for completion, grabs the final video URL, waits for optional human approval, and then hands it off to Upload-Post for publishing to your selected platforms.
You can easily modify the background style and the review step to match your process. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Launch Trigger
Start the workflow with a manual trigger so you can test the end-to-end pipeline on demand.
- Add the Manual Launch Trigger node as your workflow trigger.
- Connect Manual Launch Trigger to Initialize Input Variables to pass control to your configuration node.
Step 2: Connect HeyGen and ScreenshotOne
Define the URL to analyze, background settings, and API keys for media capture and HeyGen generation.
- Open Initialize Input Variables and set workflow_url to a target page URL, for example
https://www.xataka.com/empresas-y-economia/openai-acaba-mover-ficha-su-separacion-bienes-microsoft-ha-firmado-acuerdo-amazon-38-000-millones-dolares. - Set screenshotone.comAPI_KEY and heygen_api_key to your API keys (both are currently blank and must be filled).
- Set avatar_id and voice_id with your HeyGen avatar and voice IDs.
- Set background_removal to
trueand background_type tovideoto match the current branching logic. - Confirm Initialize Input Variables connects to Content Strategy Agent as the next node.
Step 3: Set Up Content Strategy Agent
Generate the short-form script, captions, and titles from the source URL using Gemini and structured parsing.
- Open Content Strategy Agent and keep the detailed prompt text as-is to enforce the JSON output format and 30-second script structure.
- Ensure the agent references the URL with
{{ $json.workflow_url }}inside the prompt (already embedded in the text). - Attach Gemini Chat Engine as the language model. Credential Required: Connect your
googlePalmApicredentials. - Attach Structured JSON Parser as the output parser. It uses autoFix set to
truewith the provided JSON schema example. - Attach Gemini Parser Model to Structured JSON Parser. Credential Required: Connect your
googlePalmApicredentials. - Confirm Fetch Source Page is connected as the AI tool and uses
{{ /*n8n-auto-generated-fromAI-override*/ $fromAI('URL', ``, 'string') }}. Credentials should be added to the parent node (Content Strategy Agent), not the tool.
Step 4: Configure Background Capture and Upload
Choose between scrolling video or static image backgrounds, then upload the captured asset to HeyGen.
- In Select Background Type, keep the condition checking
{{ $('Initialize Input Variables').item.json.background_type }}equalsvideo. - For the video path, configure Capture Scrolling Background with the full URL string:
https://api.screenshotone.com/animate?access_key={{ $('Initialize Input Variables').item.json.screenshotone.comAPI_KEY }}&url={{ $('Initialize Input Variables').item.json.workflow_url }}&format=mp4&viewport_width=1080&viewport_height=1920&viewport_mobile=true&block_ads=true&storage_return_location=true&block_cookie_banners=true&block_banners_by_heuristics=false&block_trackers=true&delay=10&timeout=60&scenario=scroll&duration=30&scroll_delay=5000&scroll_duration=200&scroll_by=400&scroll_start_immediately=true&scroll_start_delay=5000&scroll_back=true&scroll_complete=true&scroll_easing=ease_in_out_quint&scroll_try_navigate=false. - For the image path, configure Capture Static Background with the URL:
https://api.screenshotone.com/take?access_key={{ $('Initialize Input Variables').item.json.screenshotone.comAPI_KEY }}&url={{ $('Initialize Input Variables').item.json.workflow_url }}&viewport_width=1080&viewport_height=1920&viewport_mobile=false&format=jpg&block_ads=true&block_cookie_banners=true&block_banners_by_heuristics=false&block_trackers=true&delay=10&timeout=60&response_type=json&image_quality=80. - In Upload Asset to HeyGen, set URL to
https://upload.heygen.com/v1/asset, Method toPOST, and Content Type tobinaryData. - Add header X-Api-Key with value
{{ $('Initialize Input Variables').item.json.heygen_api_key }}and Content-Type set tovideo/mp4.
Step 5: Configure HeyGen Generation Branches
Create avatar videos or images based on the background type and removal flags, then map the resulting video ID.
- In Evaluate Removal Flag, keep the boolean check on
{{ $('Initialize Input Variables').item.json.background_removal }}to route to either Generate Avatar Overlay Video or Generate Split Screen Video. - In Check Photo Removal, keep the boolean check on
{{ $json.background_removal }}to route to either Generate Avatar Overlay Image or Generate Split Screen Image. - Verify each HeyGen request uses the script from Content Strategy Agent with
{{ $('Content Strategy Agent').item.json.output[0].guion }}and voice settings from Initialize Input Variables. - Ensure background URLs use
{{ $('Upload Asset to HeyGen').item.json.data.url }}for video and{{ $('Capture Static Background').item.json.screenshot_url }}(or{{ $('Capture Static Background').item.json.screenshot }}) for images. - In Map Video Identifier, map video_id to
{{ $json.data.video_id }}for status polling.
Step 6: Configure Rendering Polling and Human Review
Poll HeyGen until the render is complete, then prompt a human approval step before publishing.
- In Delay Retry, keep Unit set to
minutesand Amount to1to throttle polling. - In Fetch Avatar Status, set query parameter video_id to
{{ $('Map Video Identifier').item.json.video_id }}and header X-Api-Key to{{ $('Initialize Input Variables').item.json.heygen_api_key }}. - In Check Render Status, keep the condition that
{{ $('Fetch Avatar Status').item.json.data.status }}equalscompleted. If not completed, it loops back to Delay Retry. - In Retrieve Final Video URL, set query parameter video_id to
{{ $json.data.id }}and keep the HeyGen API key header. - In Await Human Review, keep formTitle as
Review the postsand formDescription as{{ $json.data.video_url }}, with the decision dropdown.
completed, the workflow will loop between Delay Retry and Fetch Avatar Status. Monitor render timeouts in HeyGen.Step 7: Configure Publishing to Social Platforms
Only approved videos are distributed to social platforms using UploadPost.
- In Verify Approval Decision, keep the condition that
{{ $('Await Human Review').item.json.decision }}equalsapprove. - Open Distribute Video to Platforms and set user to your UploadPost user ID, replacing
[YOUR_ID]. - Set video to
{{ $('Retrieve Final Video URL').item.json.data.video_url }}and keep operation asuploadVideo. - Map titles from Content Strategy Agent: tiktokTitle to
{{ $('Content Strategy Agent').item.json.output[0].descripcion }}, instagramTitle to{{ $('Content Strategy Agent').item.json.output[1].descripcion }}, and youtubeTitle to{{ $('Content Strategy Agent').item.json.output[2].descripcion }}. - Set instagramMediaType to
REELS. - Credential Required: Connect your
uploadPostApicredentials.
Step 8: Test and Activate Your Workflow
Run a manual test, verify the generated video, approve it, and then activate the workflow for production use.
- Click Execute Workflow from Manual Launch Trigger to run a test.
- Confirm the Content Strategy Agent outputs structured JSON and the HeyGen generation nodes return a
video_id. - Wait for Await Human Review to display the
video_url, then choose approve to continue to Distribute Video to Platforms. - Verify that posts are uploaded for TikTok, Instagram Reels, and YouTube Shorts with the generated captions.
- Toggle the workflow Active once the test succeeds.
Common Gotchas
- HeyGen credentials can expire or need specific permissions. If things break, check the HeyGen API key header (X-Api-Key) and confirm your avatar_id and voice_id still exist in your HeyGen account.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Upload-Post will fail quietly if the connected social account loses authorization. If publishing stops, open Upload-Post and re-connect TikTok (and any other platforms) before you touch the workflow.
Frequently Asked Questions
About an hour if you already have the API keys and a HeyGen avatar ready.
No. You’ll paste in keys, pick options like background type, and test a run.
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 Gemini, ScreenshotOne, HeyGen, and Upload-Post usage (most have free trials, and then you pay based on how many videos you generate).
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 it’s already designed for it. You’ll keep the same URL-to-video pipeline, then change your platform selections in the Upload-Post publishing node to include TikTok, Instagram Reels, and YouTube Shorts. Common tweaks include switching background_type between video and photo, turning background_removal on or off, and editing the Gemini prompt so the hook matches your brand voice.
Usually it’s an invalid or expired X-Api-Key, or the workflow is referencing an avatar_id or voice_id that no longer exists. Update the key in the HeyGen request node, then confirm the avatar and voice are still available in your HeyGen workspace. If it fails only on some runs, it can also be rate limits or a temporary render outage, so retrying after a short wait often resolves it.
On n8n Cloud Starter you’re capped by monthly executions, so think in terms of how many runs you trigger per month, not “videos per day.” If you self-host, there’s no execution limit, and throughput mostly depends on render time in HeyGen and how quickly ScreenshotOne returns assets. Practically, most teams run a handful a day at first, then scale once prompts and review are dialed in. If you want high volume, keep the human review step but make it lightweight so it doesn’t become the new bottleneck.
Often, yes, because this workflow needs branching logic (split-screen vs cut-out, photo vs scroll video), polling/waits while HeyGen renders, and clean handling of structured AI output. n8n is comfortable with those “real workflow” patterns, and you can self-host for unlimited executions if posting volume grows. Zapier or Make can still work, but you may end up fighting the wait/polling pieces or paying more once the scenario gets beyond a couple of steps. Also, n8n makes it easier to add a true approval gate so a human can reject a bad script before it hits TikTok. If you’re unsure which route fits your team’s tolerance for setup, Talk to an automation expert.
Once this is running, a new link isn’t a “content project” anymore. It’s just input, review, publish, done.
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.