Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save higanand/9296562df57fb8c2bfca1cec37dd0688 to your computer and use it in GitHub Desktop.
Save higanand/9296562df57fb8c2bfca1cec37dd0688 to your computer and use it in GitHub Desktop.
YouTube Content Researcher - n8n + TubeLab + Gemini + Claude
{
"name": "YouTube Content Researcher",
"nodes": [
{
"parameters": {
"sortFieldsUi": {
"sortField": [
{
"fieldName": "snippet.publishedAt",
"order": "descending"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.sort",
"typeVersion": 1,
"position": [
928,
704
],
"id": "4aad076f-c7e1-4eda-b8c7-59644e3fc918",
"name": "Sort"
},
{
"parameters": {
"mode": "combine",
"fieldsToMatchString": "id",
"options": {}
},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
1664,
688
],
"id": "55227453-cf86-40e4-a613-154dea62edc0",
"name": "Merge Transcript to Video"
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "google/gemini-2.5-flash",
"mode": "id"
},
"messages": {
"values": [
{
"content": "=You're a YouTube video analyser.\n\nYour goal is to extract the title formula, hook formula and core topics.\n\n<video>\nID: {{ $('Limit').itemMatching($itemIndex).json.id }}\nTitle: {{ $('Limit').itemMatching($itemIndex).json.snippet.title }}\n\nInitial transcript: {{ $json.transcript.slice(0, 500) }}...\n</video>\n\n<rules>\n- Return a response that respects the json schema\n- If no videos available return \"Unavailable\" and stop.\n</rules>\n\n<schema>\n{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"type\": \"object\",\n \"required\": [\"id\", hook\", \"title-formula\", \"hook-formula\", \"topic\"],\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"video id\"\n },\n \"hook\": {\n \"type\": \"string\",\n \"description\": \"Exact initial phrase or paragraph of the transcript that captures the audience attention. Only the HOOK (not all)\"\n },\n \"title-formula\": {\n \"type\": \"string\",\n \"description\": \"re-usable title formula\"\n },\n \"hook-formula\": {\n \"type\": \"string\",\n \"description\": \"re-usable hook formula, explained concisely, capture why it works from the viewer perspective\"\n },\n \"topic\": {\n \"type\": \"string\",\n \"description\": \"Core concept\"\n }\n }\n}\n</schema>\n\nAnalysis:"
}
]
},
"jsonOutput": true,
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 1.8,
"position": [
1872,
592
],
"id": "b1dfef7e-fb3d-4797-bf9a-d86f66d26703",
"name": "Analyse videos"
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "google/gemini-2.5-flash",
"mode": "id"
},
"messages": {
"values": [
{
"content": "=You're a YouTube channel analyser.\n\nYour goal is to extract title formulas, thumbnail styles, voice style (from titles) and audience profile from a YouTube channel.\n\n<channel>\nTitle: {{ $json.snippet.title }}\nVideos: {{ $json.videos.map(item => `${item.title} (${item.viewCount} views)`) }}\n\n</channel>\n\n<rules>\n- Return a response that respects the json schema\n- If no videos available return \"Unavailable\" and stop.\n- Be simple but exact\n- Keep it short\n- Minimum 2 to 3 audience profiles\n</rules>\n\n<schema>\n{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"type\": \"object\",\n \"required\": [\"audience\", \"angles\", \"titles\", \"formulas\", \"voice\"],\n \"properties\": {\n \"audience\": {\n \"type\": \"array\",\n \"description\": \"Who is this video aimed at? 2 to 3 words\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\"who\", \"objections\", \"transformation\", \"stake\"],\n \"properties\": {\n \"who\": {\n \"type\": \"string\",\n \"description\": \"Target audience demographic or persona\"\n },\n \"objections\": {\n \"type\": \"string\",\n \"description\": \"What objections do they have to watching this video?\"\n },\n \"transformation\": {\n \"type\": \"string\",\n \"description\": \"What transformation will they have experienced by the end?\"\n },\n \"stake\": {\n \"type\": \"string\",\n \"description\": \"What's at stake if they don't watch or take action?\"\n }\n }\n }\n },\n \"keywords\": {\n \"type\": \"array\",\n \"description\": \"Search terms for topic related to this channel. Used to find competition videos\",\n \"minItems\": 4,\n \"maxItems\": 4,\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"adjacent-keywords\": {\n \"type\": \"array\",\n \"description\": \"Search terms for adjacent topics that the same audience profile watches.\",\n \"minItems\": 4,\n \"maxItems\": 4,\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"titles\": {\n \"type\": \"array\",\n \"description\": \"Video titles from channel\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"formulas\": {\n \"type\": \"array\",\n \"description\": \"Reusable title templates extracted from channel videos\",\n \"items\": {\n \"type\": \"string\",\n \"description\": \"The title formula with placeholders in [UPPERCASE] brackets representing variables that can be swapped for different topics\"\n }\n },\n \"voice\": {\n \"type\": \"string\",\n \"description\": \"The tone of writing derived from title. With short sample examples.\"\n }\n }\n}\n</schema>\n\nAnalysis:"
}
]
},
"jsonOutput": true,
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 1.8,
"position": [
672,
144
],
"id": "0522cf74-4498-446b-88c5-d1729b91d27f",
"name": "Channel Analysis",
"credentials": {
"openAiApi": {
"id": "qXXb8dWXTJZhypOG",
"name": "OpenRouter"
}
}
},
{
"parameters": {
"mode": "combine",
"advanced": true,
"mergeByFields": {
"values": [
{
"field1": "message.content.id",
"field2": "id"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
2176,
672
],
"id": "db9f71bb-c514-4a78-9078-db96b496bde9",
"name": "Merge Analysis with Video Data"
},
{
"parameters": {
"amount": 1,
"unit": "minutes"
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
1216,
704
],
"id": "e21be470-d512-4c8c-8228-a8f17ef609ec",
"name": "Wait",
"webhookId": "789afdc1-a34a-4480-9574-a733d83751ae"
},
{
"parameters": {
"content": "### Rate-limit avoidance\n\nWaiting to avoid hitting rate-limit ",
"height": 272,
"width": 256
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1152,
576
],
"id": "bf4f78f0-0f89-477f-8d39-8c90df69695a",
"name": "Sticky Note"
},
{
"parameters": {
"authentication": "webhook",
"content": "={{ $json.item }}",
"options": {
"avatar_url": "https://cdn.tubelab.net/icon-128x128.png"
}
},
"type": "n8n-nodes-base.discord",
"typeVersion": 2,
"position": [
1312,
1168
],
"id": "72a9b2ec-1643-4b64-9f61-8998ef5a2b95",
"name": "Discord",
"webhookId": "12410652-4ac7-4aa4-bd46-c6eed3debb96"
},
{
"parameters": {
"jsCode": "function chunkMarkdown(markdown, maxChars = 2000) {\n const chunks = [];\n const lines = markdown.split('\\n');\n let currentChunk = '';\n let currentBlock = '';\n \n // Helper to determine if a line starts a new semantic block\n function isBlockStart(line) {\n return (\n line.startsWith('#') || // Headers\n line.startsWith('**') || // Bold items (often list items)\n line.match(/^\\d+\\.\\s/) || // Numbered lists\n line.startsWith('---') || // Horizontal rules\n line.trim() === '' // Empty lines (potential separators)\n );\n }\n \n // Helper to check if we can add content without exceeding limit\n function canAdd(content, addition) {\n return (content + addition).length <= maxChars;\n }\n \n // Helper to finalize current chunk\n function finalizeChunk() {\n if (currentChunk.trim()) {\n chunks.push(currentChunk.trim());\n currentChunk = '';\n }\n }\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineWithNewline = line + '\\n';\n \n // If this line starts a new block and we have accumulated content\n if (isBlockStart(line) && currentBlock.trim()) {\n // Try to add the completed block to current chunk\n if (canAdd(currentChunk, currentBlock)) {\n currentChunk += currentBlock;\n currentBlock = lineWithNewline;\n } else {\n // Block doesn't fit, finalize current chunk and start new one\n finalizeChunk();\n currentChunk = currentBlock;\n currentBlock = lineWithNewline;\n }\n } else {\n // Continue building current block\n currentBlock += lineWithNewline;\n }\n \n // Check if current block itself exceeds limit (handle long single blocks)\n if (currentBlock.length > maxChars) {\n // Add what we can to current chunk\n if (currentChunk.trim()) {\n finalizeChunk();\n }\n \n // Split the oversized block by sentences or lines\n const blockLines = currentBlock.split('\\n');\n let tempBlock = '';\n \n for (const blockLine of blockLines) {\n if (canAdd(tempBlock, blockLine + '\\n')) {\n tempBlock += blockLine + '\\n';\n } else {\n if (tempBlock.trim()) {\n chunks.push(tempBlock.trim());\n }\n tempBlock = blockLine + '\\n';\n }\n }\n \n currentBlock = tempBlock;\n }\n }\n \n // Add any remaining content\n if (currentBlock.trim()) {\n if (canAdd(currentChunk, currentBlock)) {\n currentChunk += currentBlock;\n } else {\n finalizeChunk();\n currentChunk = currentBlock;\n }\n }\n \n finalizeChunk();\n \n return chunks;\n}\n\nconst content = $('Create Competition Report').first().json.message.content + `\\n\n\n# :bulb: Video Ideas Based Research\n ${$input.first().json.item.map(item => `- **${item.title}**\\n ${item.description}\n \\`${item.hook}\\`\n `).join(`\\n`)}`\n\n\nreturn chunkMarkdown(content).map(item => ({item}))"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1104,
1168
],
"id": "ea905ba4-d482-4f80-b78e-2a95b231ef44",
"name": "Prepare for Discord",
"alwaysOutputData": false,
"executeOnce": true
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "anthropic/claude-sonnet-4.5",
"mode": "id"
},
"messages": {
"values": [
{
"content": "=You're a YouTube Channel Analyst. Your goal is to analyse a channel's competition and create an actionable report to so that the channel owner can apply it to get more views while respecting their channel's style.\n\nYou must deeply understand the channel from the <Channel /> content provided and study the winning patterns extracted from the competition <Competition />.\n\nThen you will create a comprehensive analysis that follows a clear template, that's valuable for the channel.\n\n<Channel>\n{{ $('Channel Analysis').all()[0].json.message.content.toJsonString() }}\n</Channel>\n\n<Competition>\n{{ $input.all().map(item => {\nconst data = item.json\nconst analysis = data.message.content\n\nreturn `# ${data.snippet.title}\n\n![](${data.snippet.thumbnails.medium.url})\n\n**URL**: https://youtu.be/${data.id}\n**Topic**: ${analysis.topic}\n**Title Formula**: ${analysis[\"title-formula\"]}\n**Hook**: ${analysis.hook}\n**Hook Formula**: ${analysis[\"hook-formula\"]}\n**Views**: ${data.statistics.viewCount}\n**Outlier Score**: ${Math.round(data.statistics.averageViewsRatio * 10) / 10}\n`\n}).join(\"\\n --- \\n\\n\") }}\n</Competition>\n\n\n<Template>\n# :fire: Trending Videos\n\n**[Video title](https://youtube.com/watch?v=[id])**\nViews: X (100K, 10K) | [Avg. Views To Subs Ratio]X Outlier\nHook: `[opening transcript that captures attention]`\nUrl:\nWhy it worked: brief insight\n\n(Minimum 5 videos [when available], max 10 - Exclude channels's own content)\n\n## :mag: Winning Patterns\n- **Topics**: Recurring themes\n- **Titles**: Title formulas that get views\n- **Hooks**: Opening structures that convert\n- **Triggers**: Emotional/psychological angles\n\n[End with a very short paragraph of unique learnings that I can use to capture more attention & views.]\n</Template>\n\n<Guidelines>\n# Aesthetic Guidelines\n- Leverage code blocks for formulas/examples\n- Apply italic for explanations and bold for emphasis\n- Structure with clear visual hierarchy\n\n# Success Metrics\nEnable users to:\n- Identify current winning content in their niche\n- Extract proven viral patterns (topics, titles, hooks)\n- Create optimized videos with higher view/retention potential\n\n# Optimization Rules\n- Prioritize highest-impact insights\n- Use concise, actionable language\n- Combine related points efficiently\n- Maintain visual appeal within character limits\n\n# Core Parameters\n## Response Format: Markdown only\n- Character Limit: 3800 characters maximum\n\n## Formatting Arsenal\n- *bold* | _italic_ | ~strikethrough~ | `code`\n- :emoji: for visual appeal\n- do not use dividers\n- avoid double \\n\\n within same topic header\n</Guidelines>\n\nAnalysis:"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 1.8,
"position": [
288,
1168
],
"id": "25ea3672-bc9e-4c1d-a8a8-4792582e5dc7",
"name": "Create Competition Report",
"executeOnce": true
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "anthropic/claude-sonnet-4.5",
"mode": "id"
},
"messages": {
"values": [
{
"content": "=You are an expert YouTube title writer with a remarkable talent for capturing and replicating the precise stylistic nuances of existing titles and hook formulas.\n\nYour mission is to use the analysis of the channel, competition and audience interests as the foundation to generate a set of YouTube titles and hooks that follow the exact same abstracted structure and appeal into new, highly engaging ideas.\n\nThe new titles MUST sound and feel as if they were written by the channel (study <channel> and <channel_titles/>) they must all be within the same style of content that the video produces within it's niche.\n\nThe new hooks MUST use the formulas & learnings from the <trends-report />.\n\nTry to come up with novel ideas, allow yourself to be extra creativite but respect the reference titles writing style.\n\n\n<channel>\n{{ $('Channel Analysis').all()[0].json.message.toJsonString()}}\n</channel>\n\n<channel_titles>\n{{ $('Channel Analysis').all()[0].json.message.content.titles.join('\\n')}}\n</channel_titles>\n\n<trends-report>\n{{ $json.message.content }}\n</trends-report>\n\n<competition_inspiration>\n{{ $('Search by niche').all().map(item => item.json.snippet.title).join('\\n') }}\n</competition_inspiration>\n\n\n<instructions>\nBefore you begin writing & ideating, immerse yourself in these reference titles and analysis. Read them multiple times. Get a feel for their common sentence structures, characteristic, and their overall tone that maximize curiosity.\n\nUnderstand the Core of the Raw Concept:\nFor each raw idea from make sure you grasp its fundamental unique premise or hook.\n\nCreatively rewrite each raw concept so that the new title organically reflects the style learned from the Reference Titles - do the same for the hooks and the respective hook formulas. It's not about fitting it into a predefined category. The connection should feel intuitive.\nAsk Yourself:\n“If this new title was mixed into the reference list, would it blend in seamlessly?”\n</instructions>\n\n<rules>\nKeep the titles within the channel niche (context)\nOnly use the adjacent topics as inspiration do not use them as a topic (if unrelated to the channel)\nClarity and Directness\nEnergy and Excitement\nIntrigue/Curiosity\nStrategic Use of ALL CAPS\nNO COLONS (:)\nStay within the realm of channel audience expectations\nProvide only a list of titles\nDo not include HASHTAGS or EMOJIS\nRespect the JSON schema answer format.\nOnly answer with JSON output, nothing else\n</rules>\n\n<schema>\n{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Title of video\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"Short and sweet description\"\n }\n \"hook\": {\n \"type\": \"string\",\n \"description\": \"Sample short hook based on the hook formulas\"\n }\n },\n \"required\": [\"title\", \"description\"],\n \"additionalProperties\": false\n },\n \"minItems\": 1,\n \"maxItems\": 10\n}\n</schema>\n\nAnswer:"
}
]
},
"jsonOutput": true,
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 1.8,
"position": [
592,
1168
],
"id": "c93f49c7-7395-46e2-bd63-d70e48fddc1c",
"name": "Generate ideas",
"executeOnce": true
},
{
"parameters": {
"jsCode": "function parseNestedJson(data) {\n // Try different patterns for code blocks\n let jsonMatch = data.match(/```json\\s*\\n([\\s\\S]*?)\\n?```/);\n \n if (!jsonMatch) {\n // Try without the json language identifier\n jsonMatch = data.match(/```\\s*\\n([\\s\\S]*?)\\n?```/);\n }\n \n if (!jsonMatch) {\n // Maybe the JSON is directly in the string without code blocks\n // Try to parse it directly\n try {\n return JSON.parse(data);\n } catch (e) {\n \n }\n }\n \n // Parse the extracted JSON string\n const jsonString = jsonMatch[1].trim();\n const parsedJson = JSON.parse(jsonString);\n \n return parsedJson;\n}\n\nconst ideas = parseNestedJson($input.first().json.message.content)\nreturn {\n item: ideas\n}"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
912,
1168
],
"id": "dc6729f8-f106-4b83-9dd9-6fcf62156374",
"name": "Cleanup"
},
{
"parameters": {
"sortFieldsUi": {
"sortField": [
{
"fieldName": "snippet.publishedAt",
"order": "descending"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.sort",
"typeVersion": 1,
"position": [
480,
704
],
"id": "8b36e5f6-2b8f-4daf-b340-da2df01f07e6",
"name": "Sort1"
},
{
"parameters": {
"maxItems": 10
},
"type": "n8n-nodes-base.limit",
"typeVersion": 1,
"position": [
688,
704
],
"id": "88c931d9-d0e8-4881-b166-ce3c1150896d",
"name": "Limit"
},
{
"parameters": {
"content": "## Phase 1 - Research\n\nFinding out what's trending\non YouTube based on your\nniche + audience interests",
"height": 464,
"width": 2384,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
0,
0
],
"id": "8df00f2c-3457-4d58-bc79-acae905c79f7",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Phase 2 - Analysis\n\nUnderstand viral patterns: \n- analysis title formulas\n- extracts transcripts\n- analysis hooks & trending topics",
"height": 464,
"width": 2384,
"color": 4
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-16,
496
],
"id": "292a2c17-7cb6-41b7-b626-91febef925ec",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Phase 3 - Report\n\nPrepares report and \nsends it to Discord",
"height": 464,
"width": 2384,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-16,
992
],
"id": "aceefbb9-7db9-4cc9-84cd-b6167a3be13b",
"name": "Sticky Note3"
},
{
"parameters": {
"jsCode": "\n\nconst merged = $input.all().map(i => i.json)\nconst clean = Array.from(new Map(merged.map(item => [item.id, item])).values())\n\nreturn clean"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
304,
704
],
"id": "671410f4-b36c-414c-979b-5b94900bab39",
"name": "Clean up"
},
{
"parameters": {},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
1376,
272
],
"id": "49e3dd65-54ba-44ff-b36a-e22b0497b92b",
"name": "Merge"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks"
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
336,
144
],
"id": "026b65a6-7a4b-48ad-b409-9862800c1209",
"name": "Schedule Trigger"
},
{
"parameters": {
"resource": "channel",
"channelId": "UChn5jutPQB_bRjnG80pzl5w",
"requestOptions": {}
},
"type": "n8n-nodes-tubelab.tubeLab",
"typeVersion": 1,
"position": [
496,
144
],
"id": "6f54b94f-f93c-4a86-8a51-b6774796ab43",
"name": "Get videos",
"credentials": {
"tubeLabApi": {
"id": "GKdo0gNFQ09H8MNp",
"name": "TubeLab account"
}
}
},
{
"parameters": {
"query": [
"={{ $json.message.content.keywords[0] }}",
"={{ $json.message.content.keywords[1] }}",
"={{ $json.message.content.keywords[2] }}",
"={{ $json.message.content.keywords[3] }}"
],
"filters": {
"type": "video",
"publishedAtFrom": "1month"
},
"requestOptions": {}
},
"type": "n8n-nodes-tubelab.tubeLab",
"typeVersion": 1,
"position": [
1040,
64
],
"id": "ae8856a7-bc68-44e5-a087-3a9950764367",
"name": "Search for outliers",
"credentials": {
"tubeLabApi": {
"id": "GKdo0gNFQ09H8MNp",
"name": "TubeLab account"
}
}
},
{
"parameters": {
"query": [
"={{ $json.message.content[\"adjacent-keywords\"][0] }}",
"={{ $json.message.content[\"adjacent-keywords\"][1] }}",
"={{ $json.message.content[\"adjacent-keywords\"][2] }}",
"={{ $json.message.content[\"adjacent-keywords\"][3] }}"
],
"filters": {
"type": "video",
"publishedAtFrom": ""
},
"requestOptions": {}
},
"type": "n8n-nodes-tubelab.tubeLab",
"typeVersion": 1,
"position": [
1040,
256
],
"id": "9392c54c-0ae8-4a04-b7a5-82c18ef3738c",
"name": "Search for outliers1",
"credentials": {
"tubeLabApi": {
"id": "GKdo0gNFQ09H8MNp",
"name": "TubeLab account"
}
}
},
{
"parameters": {
"resource": "video",
"requestOptions": {}
},
"type": "n8n-nodes-tubelab.tubeLab",
"typeVersion": 1,
"position": [
1440,
592
],
"id": "634fb04d-2827-40d6-b136-a7cb3b536cb2",
"name": "Get transcript",
"credentials": {
"tubeLabApi": {
"id": "GKdo0gNFQ09H8MNp",
"name": "TubeLab account"
}
}
}
],
"pinData": {
"Channel Analysis": [
{
"json": {
"logprobs": null,
"finish_reason": "stop",
"native_finish_reason": "STOP",
"index": 0,
"message": {
"role": "assistant",
"content": {
"audience": [
{
"who": "Aspiring YouTubers",
"objections": "Too hard, no ideas, takes too long",
"transformation": "Motivated, clear idea, actionable steps",
"stake": "Missed opportunity, stagnation, financial freedom"
},
{
"who": "Content creators",
"objections": "Existing methods work, too much effort, not effective",
"transformation": "Efficient strategies, increased views, optimized channel",
"stake": "Stagnant growth, wasted effort, falling behind competition"
},
{
"who": "Job seekers",
"objections": "Risky, unstable, not for me",
"transformation": "Entrepreneurial mindset, alternative income, financial independence",
"stake": "Unfulfilling job, financial instability, missed freedom"
}
],
"keywords": [
"YouTube growth",
"faceless YouTube channel",
"YouTube views increase",
"YouTube niche ideas"
],
"adjacent-keywords": [
"online business ideas",
"side hustle youtube",
"ai content creation",
"passive income strategies"
],
"titles": [
"10 Faceless Niches So Easy You'll Quit Your Job (2025)",
"5 Easy Methods To Get More Views (Backed By Science)",
"AI is destroying YouTube right now.",
"10 Easy Faceless Niches That Pay Better Than Your Job (2025)",
"How to find YouTube Niches in 2025 - YouTube Niche Finder Tutorial",
"Discover the Youtube Rank Tracker by TubeLab - Product Demo 2023"
],
"formulas": [
"[NUMBER] [ADJECTIVE] [TOPIC] So Easy You'll [ACTION] (YEAR)",
"[NUMBER] Easy Methods To Get [DESIRED OUTCOME] (Backed By [AUTHORITY])",
"AI is [IMPACT] YouTube right now.",
"[NUMBER] Easy [TOPIC] That Pay Better Than Your [CURRENT SITUATION] (YEAR)",
"How to find [TOPIC] in [YEAR] - [PRODUCT NAME] Tutorial",
"Discover the [PRODUCT NAME] by [COMPANY] - [TYPE] [YEAR]"
],
"voice": "Direct, slightly provocative, solution-oriented, and ambitious. Examples: 'AI is destroying YouTube right now.', 'You'll Quit Your Job', 'Pay Better Than Your Job'."
},
"refusal": null,
"reasoning": null
}
}
}
]
},
"connections": {
"Sort": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Merge Transcript to Video": {
"main": [
[
{
"node": "Analyse videos",
"type": "main",
"index": 0
},
{
"node": "Merge Analysis with Video Data",
"type": "main",
"index": 1
}
]
]
},
"Analyse videos": {
"main": [
[
{
"node": "Merge Analysis with Video Data",
"type": "main",
"index": 0
}
]
]
},
"Merge Analysis with Video Data": {
"main": [
[
{
"node": "Create Competition Report",
"type": "main",
"index": 0
}
]
]
},
"Prepare for Discord": {
"main": [
[
{
"node": "Discord",
"type": "main",
"index": 0
}
]
]
},
"Create Competition Report": {
"main": [
[
{
"node": "Generate ideas",
"type": "main",
"index": 0
}
]
]
},
"Generate ideas": {
"main": [
[
{
"node": "Cleanup",
"type": "main",
"index": 0
}
]
]
},
"Cleanup": {
"main": [
[
{
"node": "Prepare for Discord",
"type": "main",
"index": 0
}
]
]
},
"Sort1": {
"main": [
[
{
"node": "Limit",
"type": "main",
"index": 0
}
]
]
},
"Limit": {
"main": [
[
{
"node": "Sort",
"type": "main",
"index": 0
}
]
]
},
"Clean up": {
"main": [
[
{
"node": "Sort1",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Clean up",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Get videos",
"type": "main",
"index": 0
}
]
]
},
"Get videos": {
"main": [
[
{
"node": "Channel Analysis",
"type": "main",
"index": 0
}
]
]
},
"Channel Analysis": {
"main": [
[
{
"node": "Search for outliers",
"type": "main",
"index": 0
},
{
"node": "Search for outliers1",
"type": "main",
"index": 0
}
]
]
},
"Search for outliers": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Search for outliers1": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Wait": {
"main": [
[
{
"node": "Get transcript",
"type": "main",
"index": 0
},
{
"node": "Merge Transcript to Video",
"type": "main",
"index": 1
}
]
]
},
"Get transcript": {
"main": [
[
{
"node": "Merge Transcript to Video",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "b5f3d8c2-fd79-4b5a-b04f-071fa948ad77",
"meta": {
"instanceId": "6b8e3b2e55cb06bbceeafc3b3f360ddc1dcc8fbbc8bd162464a41d1bb0ff411c"
},
"id": "M1GvC0lzx3FX37vO",
"tags": []
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment