This workflow corresponds to n8n.io template #12882 — we link there as the canonical source.
This workflow follows the Agent → Form Trigger recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "JuznRZw30HLVUYzg",
"name": "For Public (Loop over all keywords)",
"tags": [],
"nodes": [
{
"id": "fdb23425-59f8-4668-ab01-d769a4456476",
"name": "Structured Output Parser2",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1328,
816
],
"parameters": {
"jsonSchemaExample": "{\n \"keyword1\": \"keyword or phrase 1\",\n \"keyword2\": \"keyword or phrase 2\",\n \"keyword3\": \"keyword or phrase 3\",\n \"keyword4\": \"keyword or phrase 4\",\n \"keyword5\": \"keyword or phrase 5\",\n \"keyword6\": \"keyword or phrase 6\",\n \"keyword7\": \"keyword or phrase 7\",\n \"keyword8\": \"keyword or phrase 8\",\n \"keyword9\": \"keyword or phrase 9\",\n \"keyword10\": \"keyword or phrase 10\"\n}"
},
"typeVersion": 1.3
},
{
"id": "14e7e0df-be8d-432e-bb72-b9b93a70becf",
"name": "Aggregate1",
"type": "n8n-nodes-base.aggregate",
"position": [
2784,
720
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "subreddit"
},
{
"fieldToAggregate": "title"
},
{
"fieldToAggregate": "body"
},
{
"fieldToAggregate": "postUrl"
}
]
}
},
"typeVersion": 1
},
{
"id": "93c4c204-11f4-4e3c-80ae-d9805cc2615c",
"name": "Merge1",
"type": "n8n-nodes-base.merge",
"position": [
3008,
592
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineAll"
},
"typeVersion": 3.2
},
{
"id": "dd08eb2e-8495-41e0-b07e-76f8bb794f01",
"name": "Reddit Posts Keywords Generator1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1184,
592
],
"parameters": {
"text": "=Product landing Page Description: {{ $json.data.markdown }}",
"options": {
"systemMessage": "=# Reddit Keyword Extraction Agent\n\nYou are a specialized AI agent designed to analyze product landing pages and extract optimal keywords for Reddit lead generation.\n\n## Your Task\nAnalyze the provided markdown content from a landing page scrape and generate 10 highly targeted keywords that will help identify relevant Reddit threads where potential customers are discussing problems, needs, or topics related to this product.\n\n## Analysis Process\n\n1. **Identify the Core Product/Service**: Understand what the product does, who it's for, and what problems it solves.\n\n2. **Extract Key Elements**:\n - Primary pain points the product addresses\n - Target audience characteristics and personas\n - Industry or niche terminology\n - Use cases and applications\n - Competitor or alternative solution names\n - Problem statements customers express\n - Feature categories that indicate need\n\n3. **Consider Reddit Search Behavior**: Think about how real people describe their problems on Reddit before they know solutions exist.\n\n## Keyword Selection Criteria\n\n- **Problem-focused**: Keywords should reflect issues people actively discuss (e.g., \"struggling with project management\" rather than just \"project management software\")\n- **Natural language**: Use phrases people actually type in Reddit searches\n- **Varied specificity**: Mix broad industry terms with specific pain points\n- **Context-aware**: Include both technical and casual language variations\n- **Subreddit-friendly**: Keywords should match topics discussed in relevant subreddits\n\n## Output Format\n\nProvide ONLY a JSON object with 10 separate keyword fields. NO additional text, explanation, or markdown formatting.\n\n**Structure:**\n```json\n{\n \"keyword1\": \"keyword or phrase 1\",\n \"keyword2\": \"keyword or phrase 2\",\n \"keyword3\": \"keyword or phrase 3\",\n \"keyword4\": \"keyword or phrase 4\",\n \"keyword5\": \"keyword or phrase 5\",\n \"keyword6\": \"keyword or phrase 6\",\n \"keyword7\": \"keyword or phrase 7\",\n \"keyword8\": \"keyword or phrase 8\",\n \"keyword9\": \"keyword or phrase 9\",\n \"keyword10\": \"keyword or phrase 10\"\n}\n```\n\n**Example Output** (for a freelance time-tracking tool):\n```json\n{\n \"keyword1\": \"tracking billable hours freelance\",\n \"keyword2\": \"how to invoice clients accurately\",\n \"keyword3\": \"time management for consultants\",\n \"keyword4\": \"freelancer productivity tips\",\n \"keyword5\": \"tracking multiple client projects\",\n \"keyword6\": \"automated time tracking tools\",\n \"keyword7\": \"best way to log work hours\",\n \"keyword8\": \"freelance accounting software recommendations\",\n \"keyword9\": \"struggling with time estimates\",\n \"keyword10\": \"client billing disputes hours\"\n}\n```\n\n## Important Guidelines\n\n- Keep each keyword/phrase between 2-6 words for optimal Reddit search results\n- Avoid generic terms that would return too many irrelevant results\n- Include a mix of: problem statements, use cases, target roles/personas, and industry terms\n- Do NOT include the product name itself\n- Focus on discoverability: what would someone search before finding this solution?\n- Prioritize keywords that indicate buying intent or active problem-solving\n- Output MUST be valid JSON only - no markdown code blocks, no explanatory text\n\n## Example Comparison\n\nIf analyzing a landing page for a time-tracking tool for freelancers:\n- \u2705 GOOD: \"tracking billable hours\", \"freelance time management\", \"client invoicing struggles\"\n- \u274c BAD: \"productivity\", \"software\", \"business tools\"\n\nNow analyze the provided markdown content and generate the 10 optimal Reddit search keywords in the exact JSON format specified above."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "6f0c5e5d-595a-4035-9f6a-df63f3934590",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
336
],
"parameters": {
"color": 3,
"width": 2784,
"height": 640,
"content": "## Find Your First Reddit Users (Loop Over All 10 keywords)"
},
"typeVersion": 1
},
{
"id": "3ebe2566-7e5b-4e66-a07a-bf96b77d44dd",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
1536,
592
],
"parameters": {
"options": {},
"fieldToSplitOut": "output"
},
"typeVersion": 1
},
{
"id": "2f9784e8-3651-4edd-91e9-630d866f517c",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1760,
592
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "918197b0-57a7-47c9-9cd5-c92490186227",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
2384,
688
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "7ec273b2-262c-4a3a-acb6-3be86262a016",
"name": "OpenAI Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1200,
816
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "d93897ab-ac48-46b7-85fe-8728a40d15b3",
"name": "Posts Relevance Processing AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2432,
480
],
"parameters": {
"text": "=title: {{ $('Sanitize Results').item.json.title }}\nBody: {{ $('Sanitize Results').item.json.body }}",
"options": {
"systemMessage": "=The following is a post search result from reddit in previous n8n nodes for the keyword {{ $('Reddit Posts Keywords Generator1').item.json.output.keyword1 }},\n\nThe posts should be of themes related to the keyword so that I can engage in comments to promote my product \"{{ $('Scrape Product URL and get its content').item.json.data.metadata.ogTitle }}\", desccription \"{{ $('Scrape Product URL and get its content').item.json.data.metadata['og:description'][0] }}\"\n\nPlease Check if the post is relevant, if it is please add assement: relevant or irrelevant\n\n\n{\n\"assessment\": \"relevant/irrelevant\"\n}"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "aeec208a-6e3e-4f14-8e42-572c3dcf77e7",
"name": "Parse Qualified Posts Data",
"type": "n8n-nodes-base.code",
"position": [
3232,
672
],
"parameters": {
"jsCode": "// Get the first input item\nconst data = $input.first().json;\n\n// Prepare an array to hold only the relevant posts\nconst passed_post = [];\n\n// Loop through all assessments\nfor (let i = 0; i < data.assessment.length; i++) {\n if (data.assessment[i] === \"relevant\") {\n passed_post.push({\n subreddit: data.subreddit[i],\n title: data.title[i],\n body: data.body[i],\n postUrl: data.postUrl[i],\n assessment: data.assessment[i]\n });\n }\n}\n\n// Return the final filtered list\nreturn [\n {\n json: {\n passed_post\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "7e9cce81-36ea-4d77-a2bc-8a2b1aaecd81",
"name": "Sanitize Results",
"type": "n8n-nodes-base.code",
"position": [
2208,
592
],
"parameters": {
"jsCode": "// Loop through all incoming items and extract the required fields\nreturn $input.all().map(item => {\n return {\n json: {\n subreddit: item.json.subreddit,\n title: item.json.title,\n body: item.json.selftext,\n postUrl: item.json.url\n }\n };\n});\n"
},
"typeVersion": 2
},
{
"id": "ac13e6d2-e153-4568-b6af-a64ab11e65bc",
"name": "Search for Posts per Keyword/Phrase",
"type": "n8n-nodes-base.reddit",
"position": [
1984,
592
],
"parameters": {
"limit": 10,
"keyword": "={{ $json.output }}",
"location": "allReddit",
"operation": "search",
"additionalFields": {
"sort": "hot"
}
},
"credentials": {
"redditOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "a11332b1-ccfb-45a0-9eab-21d2c7eb15fc",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
2608,
688
],
"parameters": {
"jsonSchemaExample": "{\n\"assessment\": \"relevant/irrelevant\"\n}"
},
"typeVersion": 1.3
},
{
"id": "6488bc7f-85a1-44fb-891b-42004452ae84",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
2800,
464
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "output.assessment"
}
]
}
},
"typeVersion": 1
},
{
"id": "582c5a7b-5739-44ea-bb3a-39c7d60a57d4",
"name": "Aggregate All Qualified Conversations",
"type": "n8n-nodes-base.aggregate",
"position": [
1984,
368
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData"
},
"typeVersion": 1
},
{
"id": "ed383bf6-763d-4370-b441-6a14fe2fa264",
"name": "Scrape Product URL and get its content",
"type": "@mendable/n8n-nodes-firecrawl.firecrawl",
"position": [
960,
592
],
"parameters": {
"url": "={{ $json.URL }}",
"parsers": [
"pdf"
],
"operation": "scrape",
"scrapeOptions": {
"options": {
"formats": {
"format": [
{}
]
},
"headers": {}
}
},
"requestOptions": {}
},
"credentials": {
"firecrawlApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "00c62ac9-eace-4409-8f14-615ba9c4c8d6",
"name": "Enter Product URL",
"type": "n8n-nodes-base.formTrigger",
"position": [
736,
592
],
"parameters": {
"options": {},
"formTitle": "Domain URL",
"formFields": {
"values": [
{
"fieldLabel": "URL",
"requiredField": true
}
]
},
"formDescription": "Enter You Product URL"
},
"typeVersion": 2.2
},
{
"id": "f3e42e1d-1238-47ad-8c84-d6086ebb82ec",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
192,
336
],
"parameters": {
"color": 3,
"width": 432,
"height": 640,
"content": "\n## Basic Setup Guide\nYou can follow the n8n credential setup docs for reddit, openai to set them up. Then the workflow ends with an aggregate node, you can connect your desired data collection (google sheets, airtable) or notification (telegram, email) node\n\nYou can check the Medium article in the resources card below, or watch the Youtube tutorial to get more details."
},
"typeVersion": 1
},
{
"id": "4b688885-8208-4a2e-8849-24de0670d008",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
3472,
336
],
"parameters": {
"width": 368,
"height": 640,
"content": "## Resources\n\n1. [Youtube Tutorial](https://bit.ly/youtubetutorialredditworkflow)\n2. [Medium Article Guide](https://bit.ly/mediumarticleredditworkflow)\n3. [Frontend Integrated Version](https://bit.ly/frontendversionredditworkflow)\n\n## Contacts for Questions and Work\n\n**Website**: [Leadly Solutions](https://leadlysolutionns.com)\n**Email**: joseph@leadlysolutions.com\n**X/Twitter**: [@juppfy](https://x.com/juppfy)"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "1540a22f-44bf-46b6-bb10-61d873968b78",
"connections": {
"Merge1": {
"main": [
[
{
"node": "Parse Qualified Posts Data",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Aggregate1": {
"main": [
[
{
"node": "Merge1",
"type": "main",
"index": 1
}
]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "Aggregate All Qualified Conversations",
"type": "main",
"index": 0
}
],
[
{
"node": "Search for Posts per Keyword/Phrase",
"type": "main",
"index": 0
}
]
]
},
"Sanitize Results": {
"main": [
[
{
"node": "Aggregate1",
"type": "main",
"index": 0
},
{
"node": "Posts Relevance Processing AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Enter Product URL": {
"main": [
[
{
"node": "Scrape Product URL and get its content",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Posts Relevance Processing AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"OpenAI Chat Model1": {
"ai_languageModel": [
[
{
"node": "Reddit Posts Keywords Generator1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Posts Relevance Processing AI Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Structured Output Parser2": {
"ai_outputParser": [
[
{
"node": "Reddit Posts Keywords Generator1",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Parse Qualified Posts Data": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Reddit Posts Keywords Generator1": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"Posts Relevance Processing AI Agent": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Search for Posts per Keyword/Phrase": {
"main": [
[
{
"node": "Sanitize Results",
"type": "main",
"index": 0
}
]
]
},
"Scrape Product URL and get its content": {
"main": [
[
{
"node": "Reddit Posts Keywords Generator1",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
firecrawlApiopenAiApiredditOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automatically find potential customers on Reddit who are actively looking for solutions like your product. This workflow analyzes your product website, generates targeted keywords, searches Reddit for relevant conversations, and filters them using AI to give you only the most…
Source: https://n8n.io/workflows/12882/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Turn any product page into ready-to-run Meta ads—fast, consistent, and client-friendly.
This workflow turns Reddit pain points into emotionally-driven comic-style ads using AI. It takes in a product description, scrapes Reddit for real user pain points, filters relevant posts using AI, g
Before adding a new npm package as a dependency, you should know if it's actively maintained, widely used, and safe to build on. This workflow does that analysis automatically.
This workflow analyzes any npm package and delivers a data-driven recommendation using Firecrawl + APIs + AI reasoning.
🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.