You’ve spent hours filming, editing, and posting a killer TikTok video. Your creator account is gaining traction. But here’s the thing—you’re leaving money on the table if that video only lives on TikTok. YouTube Shorts has a completely different audience, different monetization rules, and different growth potential. The problem? Manually downloading from TikTok, re-uploading to YouTube, writing metadata, and repeating this process for every video is a soul-crushing grind that pulls you away from creating.
What if you could automate the entire repurposing pipeline? Post to TikTok once, and within minutes, your video automatically appears on YouTube Shorts with optimized metadata, proper formatting, and zero manual intervention. That’s exactly what we’re building today with n8n.
Save hours each week by automating your cross-platform distribution. Grab the ready-made template and skip the setup headaches.
What You’ll Build
By the end of this guide, you’ll have a fully automated workflow that handles every step of repurposing TikTok content to YouTube Shorts. Here’s what your system will do:
- Monitor your TikTok profile — Every 6 hours, the workflow automatically checks your TikTok account for new videos using the RapidAPI TikTok Scraper.
- Detect fresh uploads — A filtering system identifies videos you haven’t already repurposed, preventing duplicates and wasted resources.
- Download video files — Your videos are fetched directly from TikTok in YouTube-compatible formats.
- Generate YouTube metadata — The system automatically creates optimized titles, descriptions, and tags based on your TikTok content.
- Upload to YouTube Shorts — Videos are submitted via YouTube’s Data API v3 with proper resumable session handling for reliability.
- Log everything to Google Sheets — You get a growing inventory of what’s been repurposed, timestamps, and upload status.
- Trigger alerts via Telegram — You’re notified the moment a video hits YouTube, plus you can manually trigger reposts via a Telegram command.
How It Works—The Big Picture
This workflow operates on a dual-trigger model. It can run on a schedule (every 6 hours) or be triggered manually through Telegram. Let’s map out the flow:
┌─────────────────────────────────────────────────────────────┐ │ TWO ENTRY POINTS │ ├─────────────────────────────────────────────────────────────┤ │ │ │ Trigger A: Schedule (Every 6 Hours) Trigger B: Telegram │ │ │ │ │ │ └──────────────────┬──────────────────┬─┘ │ │ │ │ │ │ Set TikTok Username Parse Telegram │ │ │ │ /repost @username │ │ └──────────────────┘ │ │ │ │ │ Fetch TikTok Videos │ │ (HTTP: RapidAPI Scraper) │ │ │ │ │ Filter New Videos Only │ │ (Code: Parse Response) │ │ │ │ │ ┌─────────────┴─────────────┐ │ │ │ │ │ │ Log to Google Sheets Prepare YouTube Metadata │ │ │ │ │ │ └─────────────┬─────────────┘ │ │ │ │ │ Create YouTube Upload Session │ │ (YouTube API v3: Resumable) │ │ │ │ │ Download TikTok Video (Temp) │ │ │ │ │ Upload Video to YouTube Shorts │ │ (YouTube API v3) │ │ │ │ │ Send Telegram Notification │ │ (Success Alert) │ │ │ └─────────────────────────────────────────────────────────────┘
What You’ll Need
Before we build, make sure you have these pieces in place. The entire setup takes about 30–45 minutes.
- n8n account (free tier works, but Pro is recommended for multiple simultaneous workflows)
- RapidAPI account with an active TikTok Scraper subscription ($10–30/month depending on request volume)
- YouTube Data API v3 enabled in Google Cloud Console with OAuth 2.0 credentials
- Google Sheets API enabled in the same GCP project
- Telegram Bot Token from BotFather (free, takes 2 minutes)
- Google Account with OAuth access for YouTube and Sheets
- Creator account on both TikTok and YouTube (with YouTube Studio access)
- Minimum 2GB free storage on n8n for temporary video files
Step 1: Create the Schedule Trigger
1 Schedule Trigger Node
Start with n8n’s built-in Schedule node. This will kick off your workflow every 6 hours, allowing you to check for new TikTok videos automatically.
Node Configuration:
- Set trigger to
Every 6 hours - Leave timezone as default (your account timezone)
- Check the box for “Activate node immediately on deployment”
The Schedule trigger feeds directly into a Set TikTok Username node, which we’ll cover next.
Step 2: Add Manual Trigger with Telegram
2 Telegram Bot Trigger
To give yourself on-demand control, add a Telegram trigger. This lets you manually request a repost without waiting for the 6-hour schedule.
Setup steps:
- Message @BotFather on Telegram and create a new bot (copy the token)
- In n8n, create a
Telegramtrigger node - Add your Bot Token (paste from BotFather)
- Set trigger to
New Message - Configure message filter:
Message starts with /repost
This trigger runs independently of the schedule, so you can trigger reposts manually anytime via Telegram.
Step 3: Set TikTok Username
3 Set Username Node (Code)
Both triggers converge here. This code node normalizes the TikTok username input—whether it came from the schedule default or a Telegram command.
Node configuration:
- Node type:
Code - Language: JavaScript
Code snippet:
// If triggered via Telegram, extract username from message
// Otherwise, use default username
if (items[0].json.message !== undefined) {
// Telegram trigger: extract username from /repost @username
const messageText = items[0].json.message;
const parts = messageText.split(' ');
const username = parts[1] ? parts[1].replace('@', '') : 'erinchen_creates';
return [{
json: {
tikTokUsername: username,
source: 'telegram'
}
}];
} else {
// Schedule trigger: use default
return [{
json: {
tikTokUsername: 'erinchen_creates',
source: 'schedule'
}
}];
}
This node creates a standardized output that the next nodes can reliably consume, regardless of trigger source.
Step 4: Fetch TikTok Videos via HTTP Request
4 HTTP Request Node (RapidAPI)
Now we actually fetch the TikTok video data. We’re using RapidAPI’s TikTok Scraper—a reliable, legal way to pull public TikTok metadata.
Node configuration:
- Method:
GET - URL:
https://tiktok-api.p.rapidapi.com/user/posts
Headers (add all three):
x-rapidapi-key: YOUR_RAPIDAPI_KEY
x-rapidapi-host: tiktok-api.p.rapidapi.com
Accept: application/json
Query parameters:
| Parameter | Value |
|---|---|
username |
{{ $node["Set TikTok Username"].json.tikTokUsername }} |
limit |
10 |
sort |
newest |
The response includes video ID, caption, duration, engagement metrics, and download URL. You’ll parse this in the next step.
Pro tip: RapidAPI requests are rate-limited based on your subscription. Start with a 6-hour schedule and adjust frequency based on your usage tier to avoid overages.
Step 5: Filter New Videos with Code
5 Filter Code Node
The RapidAPI response might include videos you’ve already repurposed. This code node filters the response, comparing against your Google Sheets log of uploaded videos.
Node configuration:
- Node type:
Code - Language: JavaScript
Code snippet:
// Parse TikTok API response
const videos = items[0].json.data || [];
// Get list of already-uploaded video IDs from Sheets context
const uploadedIds = items[1]?.json?.uploadedVideoIds || [];
// Filter to only new videos
const newVideos = videos.filter(video => {
return !uploadedIds.includes(video.id);
});
// Return filtered array (will create one item per video)
return newVideos.map(video => {
return {
json: {
videoId: video.id,
caption: video.desc,
downloadUrl: video.downloadUrl,
duration: video.duration,
likes: video.stats?.likes || 0,
shares: video.stats?.shares || 0,
comments: video.stats?.comments || 0,
createTime: video.createTime
}
};
});
The output is now one item per new video, ready to fan out across parallel processing.
Step 6: Log to Google Sheets
6 Google Sheets Append Node
Keep a permanent record of every repurposed video. This becomes your audit log and prevents duplicate uploads.
Setup:
- Create a new Google Sheet named “TikTok Reposts” (or similar)
- Create columns:
TikTok Video ID,Caption,Duration,Likes,Date Posted,YouTube Link,Upload Status,Timestamp - In n8n, add a
Google Sheetsnode - Authenticate with your Google account (OAuth 2.0)
Node configuration:
- Operation:
Append - Spreadsheet: Select “TikTok Reposts”
- Sheet: Select your data sheet
- Map columns to video data from the filter node
Column mappings:
| Sheet Column | Source Data |
|---|---|
| TikTok Video ID | {{ $node["Filter Code"].json.videoId }} |
| Caption | {{ $node["Filter Code"].json.caption }} |
| Duration | {{ $node["Filter Code"].json.duration }} |
| Upload Status | Pending |
| Timestamp | {{ new Date().toISOString() }} |
This node executes in parallel with the YouTube upload process—we’re logging first, then processing.
Step 7: Prepare YouTube Metadata
7 Prepare Metadata (Code Node)
YouTube has strict requirements for title, description, and tags. This node transforms your TikTok caption into YouTube-optimized metadata.
Code snippet:
// Transform TikTok caption to YouTube metadata
const tiktokCaption = items[0].json.caption || '';
const videoId = items[0].json.videoId;
// Generate YouTube title (max 100 chars)
let youtubeTitle = tiktokCaption.substring(0, 100);
if (tiktokCaption.length > 100) {
youtubeTitle += '...';
}
// Generate YouTube description
const description = `Originally posted on TikTok. Subscribe for more shorts!\n\n${tiktokCaption}\n\n#Shorts #TikTok #YouTubeShorts`;
// Extract hashtags from caption for YouTube tags
const hashtags = tiktokCaption.match(/#\w+/g) || [];
const tags = [...hashtags, 'shorts', 'tiktok', 'video'].slice(0, 30); // YouTube max 30 tags
return [{
json: {
title: youtubeTitle,
description: description,
tags: tags,
privacyStatus: 'public',
categoryId: '24', // Entertainment category
duration: items[0].json.duration,
downloadUrl: items[0].json.downloadUrl,
videoId: videoId
}
}];
This ensures your YouTube content is discoverable and follows platform best practices.
Step 8: Create YouTube Upload Session
8 YouTube API: Create Resumable Session
YouTube requires a two-step upload process: first create a resumable session, then upload the file. This prevents re-uploads if the connection drops.
Node type: HTTP Request
Method: POST
URL:
https://www.googleapis.com/youtube/v3/videos?uploadType=resumable&part=snippet,status
Headers:
| Header | Value |
|---|---|
Authorization |
Bearer {{ $env.YOUTUBE_TOKEN }} |
Content-Type |
application/json |
X-Goog-Upload-Protocol |
resumable |
Body (JSON):
{
"snippet": {
"title": "{{ $node['Prepare Metadata'].json.title }}",
"description": "{{ $node['Prepare Metadata'].json.description }}",
"tags": {{ JSON.stringify($node['Prepare Metadata'].json.tags) }},
"categoryId": "24"
},
"status": {
"privacyStatus": "public",
"selfDeclaredMadeForKids": false
}
}
YouTube responds with a resumable session URL in the Location header. Store this for the next step.
Step 9: Download TikTok Video
9 HTTP Request: Download Video
Fetch the actual video file from TikTok. n8n will store this temporarily in memory.
Node type: HTTP Request
Method: GET
URL:
{{ $node["Filter Code"].json.downloadUrl }}
Options:
- Set “Response Format” to
File - Add header
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) - Set timeout to 60 seconds
The downloaded file is automatically staged for upload in the next step.
Important: n8n’s free tier has memory limits. Videos larger than 256MB may fail. For larger files, consider using n8n’s S3 integration to stage files in cloud storage first.
Step 10: Upload Video to YouTube
10 YouTube API: Upload Video Chunk
Now upload the downloaded video file to YouTube using the resumable session created in Step 8.
Node type: HTTP Request
Method: PUT
URL:
{{ $node["Create Upload Session"].headers.location }}
Headers:
| Header | Value |
|---|---|
Content-Type |
video/mp4 |
Content-Length |
{{ $node["Download Video"].data.fileSize }} |
Body: Set to Binary and map the file from the Download Video node.
Upon success, YouTube returns a 200 response with video metadata including the id field (your new YouTube video ID).
Step 11: Send Telegram Notification
11 Telegram Bot Send Message
Celebrate the successful upload. Send yourself a Telegram notification with the YouTube link.
Node type: Telegram
Configuration:
- Operation:
Send Message - Bot Token: (same as Step 2)
- Chat ID: Your personal Telegram user ID
Message text:
✅ Video Uploaded to YouTube!
Title: {{ $node['Prepare Metadata'].json.title }}
YouTube URL: https://youtube.com/shorts/{{ $node['Upload Video'].json.id }}
Duration: {{ $node['Filter Code'].json.duration }}s
Likes: {{ $node['Filter Code'].json.likes }}
Check it out and update the sheet when ready.
This becomes your real-time alert system—you’ll know instantly when each video goes live.
The Data Structure
Your Google Sheets log is the backbone of the system. Here’s what your tracking sheet should look like:
| TikTok Video ID | Caption | Duration | Likes | Date Posted | YouTube Video ID | Upload Status | Timestamp |
|---|---|---|---|---|---|---|---|
| 7261849372941234567 | Morning coffee thoughts #coffee #viral | 59 | 12,340 | 2026-04-13 | dQw4w9WgXcQ | Success | 2026-04-13 09:42:17 |
| 7261847295837265100 | New fitness routine! #gym #fitnessmotivation | 45 | 8,920 | 2026-04-12 | jNQXAC9IVRw | Success | 2026-04-12 18:15:03 |
Each row represents one repurposed video. Over time, this sheet becomes your content inventory—searchable, sortable, and exportable for analytics.
Full System Flow
Here’s the complete, end-to-end picture of your automated workflow:
┌──────────────────────────────────────────────────────────────┐ │ START: DUAL TRIGGERS │ ├──────────────────────────────────────────────────────────────┤ │ │ │ Schedule: Every 6 hours Telegram: /repost cmd │ │ (Morning, Noon, Evening, Night) (Manual on-demand) │ │ │ │ └──────────────────────┬──────────────────────┘ │ │ │ │ │ [Set TikTok Username] │ │ Extract or use default username │ │ │ │ │ [HTTP: Fetch TikTok Videos via RapidAPI] │ │ Get latest 10 videos, newest first │ │ │ │ │ [Code: Filter New Videos Only] │ │ Compare against Sheets log, skip already-uploaded │ │ │ │ │ ┌───────────┴───────────┐ │ │ │ (Loop: Per New Video) │ │ │ └───────────┬───────────┘ │ │ │ │ │ ┌────────────────┴────────────────┐ │ │ │ │ │ │ [Google Sheets] [Code: Prepare YouTube │ │ Append Row Metadata & Tags] │ │ - Video ID - Title (max 100 chars) │ │ - Caption - Description + Hashtags │ │ - Duration - Category: Entertainment │ │ - Likes/Shares - Privacy: Public │ │ - Status: Pending - Tags: 30 max │ │ │ │ │ │ └────────────────┬────────────────┘ │ │ │ │ │ [YouTube API: Create Resumable Session] │ │ POST to /videos?uploadType=resumable │ │ Receive: X-Goog-Upload-Protocol Location │ │ │ │ │ [HTTP: Download TikTok Video File] │ │ Temporary storage in n8n memory/disk │ │ │ │ │ [YouTube API: Upload Video File (PUT)] │ │ Send binary file to resumable session URL │ │ │ │ │ [Code: Extract YouTube Video ID] │ │ Parse response, get youtu.be ID │ │ │ │ │ [Google Sheets: Update Row] │ │ - YouTube Video ID column │ │ - Status: Success │ │ - Timestamp: Upload completion time │ │ │ │ │ [Telegram: Send Notification] │ │ "✅ Video uploaded: [title] [youtube.com/shorts/ID]" │ │ │ │ │ [Workflow End for This Video] │ │ (Loop continues for next new video if exists) │ │ │ │ │ ┌────────────────┴────────────────┐ │ │ [All videos processed?] │ │ Yes ↓ No ↓ │ │ [Workflow Done] [Continue loop] │ │ │ └──────────────────────────────────────────────────────────────┘
Testing Your Workflow
Before activating on the real 6-hour schedule, test everything in isolation. Here’s a systematic approach:
Test Plan
- Test TikTok Fetch (Step 4)
- Run just the HTTP RapidAPI node with a username you know has videos
- Check that the response contains video objects with
id,desc,downloadUrl - Verify API rate limit isn’t exceeded (check RapidAPI dashboard)
- Test Filter Logic (Step 5)
- Mock the RapidAPI response with sample video data
- Verify the filter code correctly identifies new vs. already-uploaded videos
- Use a small test Sheets with 1-2 pre-existing IDs to confirm filtering works
- Test YouTube OAuth (Step 8)
- Create a test n8n YouTube node and authenticate
- Verify your token is valid and has
youtube.uploadscope - Try creating a resumable session (you can discard it—don’t upload yet)
- Test End-to-End with a Real Video
- Use the workflow’s “Test” button to run from the Schedule trigger
- Upload one real video to YouTube to verify the full pipeline
- Check the YouTube Studio to confirm the video appears with correct metadata
- Verify Telegram notification was sent
- Verify Google Sheets row was created and updated
Troubleshooting Guide
| Error | Likely Cause | Solution |
|---|---|---|
| “Invalid API key” from RapidAPI | Wrong or expired RapidAPI key | Check x-rapidapi-key header, regenerate key if needed |
| “403 Forbidden” from YouTube API | YouTube OAuth token expired or missing scopes | Disconnect and re-authenticate YouTube in n8n; verify youtube.upload scope |
| Video file too large, upload fails | TikTok video exceeds n8n memory limit | Use n8n S3 integration to stage files; OR upgrade n8n plan |
| “Telegram message not sent” | Bot token invalid or wrong chat ID | Verify Bot Token from BotFather; get chat ID via telegram.me/IDBot |
| Duplicate videos uploaded (filter not working) | Sheets lookup returning empty list | Check Google Sheets read node before filter; ensure column names match |
| YouTube metadata missing/incomplete | Prepare Metadata code node failed silently | Check TikTok caption contains valid data; add error handling to code node |
Frequently Asked Questions
Can I upload to multiple YouTube channels?
Yes, but you’ll need separate YouTube OAuth credentials for each channel. Add a “Select Channel” node before the upload, and loop through each channel’s upload session. Alternatively, use YouTube’s channel switching feature if all channels are on one Google account.
What happens if a video upload fails halfway through?
YouTube’s resumable upload protocol is designed for this. If the connection drops, the next upload attempt resumes from where it stopped (within 24 hours). n8n will retry failed HTTP requests if you enable “Retry on Fail” in the upload node. Always check your YouTube Studio for duplicate uploads after failures.
Can I customize the YouTube description and tags automatically?
Absolutely. The “Prepare Metadata” code node (Step 7) extracts hashtags from your TikTok caption. You can extend it to pull from a lookup table, add timestamps, or include affiliate links. Just be careful to follow YouTube’s community guidelines on self-promotion.
How do I handle videos that are too short or too long for YouTube Shorts?
YouTube Shorts accepts videos 15 seconds to 10 minutes. Add a duration check in the Filter node (Step 5): skip videos under 15 seconds, and split videos over 60 seconds into multiple Shorts. For splitting, you’d need to integrate a video processing tool like FFmpeg via n8n’s SSH or webhook triggers.
Can I monetize the YouTube videos once they’re uploaded?
YouTube’s Partner Program requires 1,000 subscribers and 4,000 watch hours. The workflow doesn’t affect eligibility, but note that repurposed content may have different monetization rules. Check YouTube’s policies on content reuse. Once you’re monetized, ensure the original TikTok and YouTube videos aren’t flagged as duplicates—different timestamps and metadata help.
Ready to automate your content pipeline?
Stop spending hours on manual uploads. The ready-made n8n template handles every step—from TikTok fetching to YouTube scheduling to Telegram alerts. All the nodes are pre-configured; you just add your API keys.
Includes full documentation, test data, and 30-day email support
What’s Next?
Once your core workflow is humming, consider these extensions:
- Instagram Reels Integration — Add Instagram Data API to cross-post to Reels with the same metadata pipeline. Instagram and YouTube have slightly different format requirements, so you’d branch the metadata preparation.
- Analytics Tracking — Pull daily YouTube Analytics API data for each uploaded video and log performance metrics (views, watch time, CTR) back to your Sheets. Identify which TikToks perform best on YouTube.
- Smart Scheduling — Use n8n’s AI nodes to analyze your audience timezone and schedule uploads when your audience is most active. YouTube Shorts have different peak times than TikTok.
- Content Moderation — Add a screening step using OpenAI’s moderation API to flag videos with potentially problematic content before they go live on YouTube.
- Thumbnail Generation — Automatically extract a frame from each TikTok and use an image-to-text API to generate optimized YouTube thumbnail text overlays.
- Multi-Platform Dashboard — Build a custom UI with Webflow or Bubble that displays your reposts, engagement metrics, and upload history—no more spreadsheet hunting.
The modular nature of n8n means each extension is just a few new nodes. Start simple, and scale as your workflow matures.