š LinkedIn Comment Keyword Auto-Responder | ConnectSafely.ai
Shared 12/8/2025
4 views
Visual Workflow
JSON Code
{
"meta": {
"instanceId": "d08b04dd82828441ef348efde572f33ff9c31c28b5ec044935581156de09542d"
},
"name": "š LinkedIn Comment Keyword Auto-Responder | ConnectSafely.ai",
"tags": [
{
"id": "8KeeA0P5VGUg3zgz",
"name": "LinkedIn Automation",
"createdAt": "2025-12-05T11:40:57.896Z",
"updatedAt": "2025-12-05T11:40:57.896Z"
},
{
"id": "vf7OwdxYXQqKUHBe",
"name": "ConnectSafely",
"createdAt": "2025-12-05T11:40:57.898Z",
"updatedAt": "2025-12-05T11:40:57.898Z"
},
{
"id": "M5q35yJpgdrXUsja",
"name": "Engagement Automation",
"createdAt": "2025-12-05T11:40:57.897Z",
"updatedAt": "2025-12-05T11:40:57.897Z"
},
{
"id": "ysNeNvCbRCwjVyED",
"name": "Lead Generation",
"createdAt": "2025-12-05T11:40:57.898Z",
"updatedAt": "2025-12-05T11:40:57.898Z"
},
{
"id": "7iRACZ6wXM1RkmIz",
"name": "Template",
"createdAt": "2025-12-05T11:40:57.903Z",
"updatedAt": "2025-12-05T11:40:57.903Z"
}
],
"nodes": [
{
"id": "460a212a-1d2f-4bfe-b4c0-c5e560999efc",
"name": "š Workflow Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
144,
-32
],
"parameters": {
"width": 688,
"height": 1176,
"content": "# š LinkedIn Comment Keyword Auto-Responder\n## By ConnectSafely.ai\n\n---\n\n### š What This Workflow Does\nAutomatically monitors your LinkedIn posts for specific keywords in comments and sends personalized DMs with your content link to those who request it.\n\n---\n\n### šÆ Perfect For:\n- š Sharing code examples, templates, or resources\n- š„ Lead magnets & content distribution\n- š¤ Building relationships through value-first engagement\n- ā” Scaling your LinkedIn content strategy\n\n---\n\n### ā
Requirements:\n1. **ConnectSafely.ai Account** - [Get Started](https://connectsafely.ai)\n2. **n8n Instance** - Self-hosted or cloud\n3. **LinkedIn Account** - Connected via ConnectSafely\n\n---\n\n### š„ Key Features:\n- ⨠Keyword-based comment detection\n- š Connection status verification\n- šØ Personalized DM delivery\n- ā±ļø Smart rate limiting (safety first!)\n- š Professional engagement\n\n---\n\n**Version:** 2.0 Enhanced\n**Last Updated:** December 2025"
},
"typeVersion": 1
},
{
"id": "354af27a-9dfa-42b0-970b-9395f6f0ae0a",
"name": "š ļø Setup Guide",
"type": "n8n-nodes-base.stickyNote",
"position": [
1200,
-272
],
"parameters": {
"color": 6,
"width": 492,
"height": 812,
"content": "## š ļø SETUP GUIDE\n\n---\n\n### Step 1: Configure ConnectSafely API\n1. Go to [app.connectsafely.ai](https://app.connectsafely.ai)\n2. Navigate to **Settings ā API Keys**\n3. Copy your API key\n4. In n8n: **Credentials ā Add Credential ā ConnectSafely API**\n5. Paste your API key\n\n---\n\n### Step 2: Connect Your LinkedIn\n1. In ConnectSafely dashboard, click **Connect LinkedIn**\n2. Follow the authorization flow\n3. Ensure your account shows as \"Connected\"\n\n---\n\n### Step 3: Test The Workflow\n1. Click **\"Test workflow\"** button\n2. Copy the form URL that appears\n3. Open form in new browser tab\n4. Fill in test data\n5. Submit and watch execution\n\n---\n\n### Step 4: Activate for Production\n1. Review all nodes are configured\n2. Toggle workflow to **Active**\n3. Share form URL or embed in your process\n\n---\n\nā ļø **Important:** Always test with your own posts first!"
},
"typeVersion": 1
},
{
"id": "3bb2a1e6-5c5e-4299-990a-ba87a4b34d86",
"name": "šØ Troubleshooting",
"type": "n8n-nodes-base.stickyNote",
"position": [
2880,
-480
],
"parameters": {
"color": 2,
"width": 414,
"height": 1020,
"content": "## šØ TROUBLESHOOTING\n\n### ā \"No comments found\"\n- ā
Verify post URL is correct\n- ā
Ensure post is public\n- ā
Check post actually has comments\n- ā
Confirm ConnectSafely API connected\n\n---\n\n### ā \"Cannot send message\"\n- ā
User must be 1st connection\n- ā
Check if user accepts messages\n- ā
Verify your messaging limits\n- ā
Consider connection request first\n\n---\n\n### ā \"API Error / 429\"\n- ā
You've hit rate limits\n- ā
Increase wait time between messages\n- ā
Check ConnectSafely quota\n- ā
Wait 24h and try again\n\n---\n\n### ā \"Keyword not detected\"\n- ā
Check keyword spelling\n- ā
Keywords are case-insensitive\n- ā
Try simpler keywords\n- ā
Check the actual comment text\n\n---\n\n### ā \"Workflow stops unexpectedly\"\n- ā
Check execution logs\n- ā
Verify all credentials active\n- ā
Check n8n memory/resources\n- ā
Review error messages\n\n---\n\n### š” Still stuck?\nContact: support@connectsafely.ai"
},
"typeVersion": 1
},
{
"id": "be9be1f7-93ac-4f3f-8a0e-71c9d8bc752d",
"name": "ā ļø LinkedIn Limits",
"type": "n8n-nodes-base.stickyNote",
"position": [
1952,
-384
],
"parameters": {
"color": 2,
"width": 604,
"height": 912,
"content": "## ā ļø LINKEDIN LIMITS & SAFETY\n\n---\n\n### šØ Daily Messaging Limits\n| Account Type | Daily Limit |\n|-------------|-------------|\n| Free Account | ~50-100 |\n| Premium | ~100-150 |\n| Sales Nav | ~150-200 |\n\n*Limits vary and LinkedIn doesn't publish exact numbers*\n\n---\n\n### š¦ Warning Signs\n- ā ļø \"Unusual activity\" alerts\n- ā ļø Temporary restrictions\n- ā ļø CAPTCHA challenges\n- ā ļø Message sending failures\n\n---\n\n### ā
Safe Practices\n- Stay under 80% of limits\n- Use random delays (built-in)\n- Don't run during off-hours only\n- Vary your message content\n- Take breaks between batches\n\n---\n\n### š Account Protection\n- Stop immediately if warnings\n- Wait 24-48h before resuming\n- Reduce volume after warnings\n- Contact support if restricted\n\n---\n\n### š Compliance Note\nThis workflow is designed for **authentic engagement** - responding to people who explicitly request content. Always ensure your usage aligns with LinkedIn's Terms of Service."
},
"typeVersion": 1
},
{
"id": "257f7ef9-7846-4cfe-a37f-5ba9db9f5af4",
"name": "1ļøā£ Form: Enter Post Details",
"type": "n8n-nodes-base.formTrigger",
"notes": "## š STEP 1: FORM TRIGGER\n\n---\n\n### ā
Purpose:\nCaptures the input needed to run the workflow.\n\n---\n\n### š„ Inputs Collected:\n| Field | Description | Example |\n|-------|-------------|----------|\n| Post URL | LinkedIn post to monitor | https://linkedin.com/posts/... |\n| Keyword | Word that triggers DM | \"code\" |\n| Content Link | URL to send in DM | https://example.com/resource |\n| Your Name | Signature for message | \"John\" |\n\n---\n\n### š§ To Test:\n1. Click **\"Test workflow\"**\n2. Copy the form URL shown\n3. Open in browser & submit\n\n---\n\n### š” Production Use:\n- Activate workflow\n- Share form URL\n- Or integrate via API",
"position": [
1120,
872
],
"webhookId": "linkedin-keyword-responder-v2",
"parameters": {
"options": {},
"formTitle": "š¤ LinkedIn Keyword Auto-Responder",
"formFields": {
"values": [
{
"fieldLabel": "LinkedIn Post URL",
"placeholder": "https://www.linkedin.com/posts/username_topic-activity-1234567890...",
"requiredField": true
},
{
"fieldLabel": "Trigger Keyword",
"placeholder": "code",
"requiredField": true
},
{
"fieldLabel": "Content Link to Send",
"placeholder": "https://your-link.com/resource",
"requiredField": true
},
{
"fieldLabel": "Your Name (for signature)",
"placeholder": "Your Name",
"requiredField": true
}
]
},
"formDescription": "## Send Automatic DMs to Comment Keywords\n\nThis workflow monitors your LinkedIn post for specific keywords and automatically sends a personalized DM with your content link.\n\n---\n\n### š How to Use:\n1. **Post URL** - Paste the full LinkedIn post URL\n2. **Keyword** - The word to trigger a DM (e.g., \"code\", \"example\")\n3. **Link** - The URL/content to send\n\n---\n\n### š” Tips:\n- Use unique keywords to avoid false positives\n- Make sure the post has comments\n- Only 1st connections will receive DMs\n\n---\n\n**Powered by ConnectSafely.ai**"
},
"typeVersion": 2.3
},
{
"id": "5767854f-e8a0-4e20-9460-88dd4807439c",
"name": "2ļøā£ Fetch All Comments",
"type": "n8n-nodes-connectsafely-ai.connectSafelyLinkedIn",
"notes": "## š STEP 2: FETCH COMMENTS\n\n---\n\n### ā
Purpose:\nRetrieves all comments from the specified LinkedIn post.\n\n---\n\n### š¤ Data Retrieved:\n| Field | Description |\n|-------|-------------|\n| `authorName` | Commenter's display name |\n| `commentText` | The comment content |\n| `publicIdentifier` | LinkedIn profile ID |\n| `profileUrn` | LinkedIn URN |\n\n---\n\n### ā ļø Requirements:\n- Valid LinkedIn post URL\n- Post must be publicly visible\n- ConnectSafely API credentials configured\n\n---\n\n### š§ Troubleshooting:\n- **No results?** Check URL format\n- **API error?** Verify credentials\n- **Empty array?** Post may have no comments",
"position": [
1344,
872
],
"parameters": {
"postUrl": "={{ $json['LinkedIn Post URL'] }}",
"operation": "getPostComments"
},
"typeVersion": 1
},
{
"id": "5c365d83-5335-4a72-9e03-8d6902d8327e",
"name": "3ļøā£ Split Comments Array",
"type": "n8n-nodes-base.splitOut",
"notes": "## š¤ STEP 3: SPLIT ARRAY\n\n---\n\n### ā
Purpose:\nConverts the comments array into individual items for processing.\n\n---\n\n### š§ Technical:\n```\nInput: {comments: [c1, c2, c3]}\nOutput: 3 separate items\n```\n\n---\n\n### š” Why This Matters:\nn8n processes items individually, so we need to split the array to handle each comment one at a time.",
"position": [
1568,
872
],
"parameters": {
"options": {},
"fieldToSplitOut": "comments"
},
"typeVersion": 1
},
{
"id": "b259d779-656b-4859-8eb3-4888c4ddc767",
"name": "4ļøā£ Loop: Process Each Comment",
"type": "n8n-nodes-base.splitInBatches",
"notes": "## š STEP 4: BATCH LOOP\n\n---\n\n### ā
Purpose:\nProcesses comments one at a time, returning here after each completion.\n\n---\n\n### āļø Settings:\n- **Batch Size:** 1 (one comment at a time)\n- **Reset:** FALSE (continue from where stopped)\n\n---\n\n### š Flow:\n```\nGet next comment ā Process ā Wait ā Return here\n```\n\n---\n\n### š Outputs:\n- **Output 1 (Done):** All comments processed\n- **Output 2 (Loop):** Current comment to process",
"position": [
1792,
872
],
"parameters": {
"options": {
"reset": false
}
},
"typeVersion": 3
},
{
"id": "8cb503ae-e743-4d2a-818b-2be2530a8aa5",
"name": "5ļøā£ Detect Keyword Match",
"type": "n8n-nodes-base.code",
"notes": "## š STEP 5: KEYWORD DETECTION\n\n---\n\n### ā
Purpose:\nAnalyzes comment text to find the trigger keyword.\n\n---\n\n### šÆ Current Logic:\n- Case-insensitive search\n- Partial match (keyword anywhere in comment)\n- Single keyword matching\n\n---\n\n### š¤ Output:\n| Field | Type | Description |\n|-------|------|-------------|\n| `isKeywordMatch` | boolean | True if keyword found |\n| `commentText` | string | Original comment |\n| `searchedKeyword` | string | Keyword searched for |\n| `matchDetails` | string | Human-readable result |\n\n---\n\n### š§ Customization Ideas:\n```javascript\n// Multiple keywords:\nconst keywords = ['code', 'example', 'sample'];\nconst found = keywords.some(k => \n comment.toLowerCase().includes(k));\n\n// Exact match only:\nconst words = comment.split(/\\s+/);\nconst found = words.some(w => \n w.toLowerCase() === keyword.toLowerCase());\n```",
"position": [
2016,
800
],
"parameters": {
"jsCode": "// =====================================================\n// š KEYWORD DETECTION ENGINE\n// =====================================================\n// This code checks if the comment contains the trigger keyword\n//\n// š CUSTOMIZATION:\n// - Modify this to check multiple keywords\n// - Add regex patterns for advanced matching\n// - Exclude certain phrases\n// =====================================================\n\n// Get the comment text from current item\nconst commentText = $input.first().json.commentText || \"\";\n\n// Get the keyword from the form submission\nconst keyword = $('1ļøā£ Form: Enter Post Details').first().json['Trigger Keyword'] || \"\";\n\n// =====================================================\n// šÆ MATCHING LOGIC\n// =====================================================\n// Case-insensitive matching\n// You can modify this for:\n// - Exact match: commentText.toLowerCase() === keyword.toLowerCase()\n// - Multiple keywords: keywords.some(k => commentText.includes(k))\n// - Regex: /pattern/.test(commentText)\n\nconst isMatch = commentText.toLowerCase().includes(keyword.toLowerCase());\n\n// =====================================================\n// š¤ OUTPUT\n// =====================================================\nreturn [\n {\n json: {\n isKeywordMatch: isMatch,\n commentText: commentText,\n searchedKeyword: keyword,\n matchDetails: isMatch ? `Found \"${keyword}\" in comment` : `No match for \"${keyword}\"`\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "484f60c1-3617-499b-9680-93b42a2d2bbc",
"name": "6ļøā£ If: Keyword Found?",
"type": "n8n-nodes-base.if",
"notes": "## ā STEP 6: KEYWORD ROUTING\n\n---\n\n### ā
Purpose:\nRoutes the workflow based on whether keyword was found.\n\n---\n\n### š Routing:\n\n**ā”ļø TRUE (Keyword Found):**\n- Comment contains trigger word\n- Proceed to connection check\n- Will attempt to send message\n\n**ā”ļø FALSE (No Match):**\n- Comment doesn't match\n- Skip to next comment\n- No message sent\n\n---\n\n### š” Examples:\n| Comment | Keyword | Result |\n|---------|---------|--------|\n| \"Send me the code!\" | code | ā
Match |\n| \"Great post!\" | code | ā No match |\n| \"Can I get an EXAMPLE?\" | example | ā
Match |",
"position": [
2240,
800
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "condition-keyword-match",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.isKeywordMatch }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "4460f762-9494-4ff3-a155-1d5096412175",
"name": "7ļøā£ Check Connection Status",
"type": "n8n-nodes-connectsafely-ai.connectSafelyLinkedIn",
"notes": "## š STEP 7: CONNECTION CHECK\n\n---\n\n### ā
Purpose:\nVerifies if you can send a direct message to this person.\n\n---\n\n### š Returns:\n| Field | Description |\n|-------|-------------|\n| `connected` | Boolean - are you 1st connections? |\n| `connectionDegree` | 1st, 2nd, or 3rd degree |\n\n---\n\n### ā ļø LinkedIn Rules:\n- **1st Connections:** Can DM directly\n- **2nd/3rd Connections:** Need connection request first (or InMail)\n\n---\n\n### š” Strategy:\n- Connected ā Send message immediately\n- Not connected ā Skip (or add connection request node)",
"position": [
2464,
728
],
"parameters": {
"operation": "checkRelationship",
"profileId": "={{ $('4ļøā£ Loop: Process Each Comment').item.json.publicIdentifier }}"
},
"typeVersion": 1
},
{
"id": "faaa78dc-1b7e-4c5b-8009-9e468ea8a017",
"name": "8ļøā£ If: Connected?",
"type": "n8n-nodes-base.if",
"notes": "## ā STEP 8: CONNECTION ROUTING\n\n---\n\n### ā
Purpose:\nDetermines messaging approach based on connection status.\n\n---\n\n### š Routing:\n\n**ā”ļø TRUE (Connected):**\n- You are 1st degree connections\n- Can send direct message\n- Proceed to Send DM node\n\n**ā”ļø FALSE (Not Connected):**\n- Cannot DM this person\n- Skip for now\n- (Optional: Add connection request)\n\n---\n\n### š” Enhancement Ideas:\nAdd a **\"Send Connection Request\"** node to the FALSE path to request connection with a message.",
"position": [
2688,
728
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "condition-connected",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.connected }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "676f567f-e7d4-442c-a6a2-9d5c9aa8b053",
"name": "9ļøā£ Send DM with Link",
"type": "n8n-nodes-connectsafely-ai.connectSafelyLinkedIn",
"notes": "## šØ STEP 9: SEND MESSAGE\n\n---\n\n### ā
Purpose:\nSends personalized direct message with your content link.\n\n---\n\n### š Message Template:\n```\nHey {name}! š\n\nThanks for your comment!\n\nHere's the link you requested:\nš {link}\n\nQuestions? Let me know!\n\nBest,\n{your_name}\n```\n\n---\n\n### š§ Customization:\nEdit the message field to:\n- Add more context\n- Include multiple links\n- Add PS or follow-up CTA\n- Adjust tone/formality\n\n---\n\n### ā ļø Best Practices:\n- Keep messages concise\n- Sound human, not automated\n- Provide clear value\n- Include a soft CTA\n\n---\n\n### ā
Success:\nMessage sent ā Proceed to rate limiting",
"position": [
2912,
680
],
"parameters": {
"message": "=Hey {{ $('4ļøā£ Loop: Process Each Comment').item.json.authorName }}! š\n\nThanks for your comment on my post!\n\nAs promised, here's the link you requested:\nš {{ $('1ļøā£ Form: Enter Post Details').item.json['Content Link to Send'] }}\n\nIf you have any questions or want more resources like this, just let me know!\n\nBest,\n{{ $('1ļøā£ Form: Enter Post Details').item.json['Your Name (for signature)'] }}",
"operation": "sendMessage",
"recipientProfileId": "={{ $('4ļøā£ Loop: Process Each Comment').item.json.publicIdentifier }}"
},
"typeVersion": 1
},
{
"id": "084ecbf3-3ab1-4374-8d4a-588537edcfc4",
"name": "š Wait: Rate Limiting",
"type": "n8n-nodes-base.wait",
"notes": "## ā±ļø STEP 10: RATE LIMITING\n\n---\n\n### ā
Purpose:\nAdds random delay between messages to avoid detection.\n\n---\n\n### ā±ļø Current Settings:\n- **Minimum:** 900 seconds (15 minutes)\n- **Maximum:** 1800 seconds (30 minutes)\n- **Selection:** Random within range\n\n---\n\n### š§ Adjustment Guide:\n| Risk Level | Wait Time | Formula |\n|------------|-----------|----------|\n| š¢ Safe | 30-60 min | 1800-3600 |\n| š” Moderate | 15-30 min | 900-1800 |\n| š“ Risky | 5-15 min | 300-900 |\n\n---\n\n### š¤ Why This Matters:\n- LinkedIn monitors message frequency\n- Consistent timing = bot detection\n- Random delays = human-like behavior\n- Protects your account\n\n---\n\n### š” Formula Explained:\n```javascript\nMath.floor(Math.random() * (max - min + 1)) + min\n// Generates random integer between min and max\n```",
"position": [
3136,
872
],
"webhookId": "rate-limit-wait",
"parameters": {
"amount": "={{ Math.floor(Math.random() * (1800 - 900 + 1)) + 900 }}"
},
"typeVersion": 1.1
},
{
"id": "476dae28-6d63-49e8-a219-83cc082f7b0a",
"name": "āļø Skip: No Match / Not Connected",
"type": "n8n-nodes-base.noOp",
"notes": "## āļø SKIP NODE\n\n---\n\n### ā
Purpose:\nHandles comments that don't trigger a message.\n\n---\n\n### š Triggers When:\n- Comment doesn't contain keyword\n- Commenter is not a 1st connection\n\n---\n\n### š Result:\n- No message sent\n- Returns to loop\n- Processes next comment\n\n---\n\n### š” Examples Skipped:\n- \"Great post!\" (no keyword)\n- \"Interesting!\" (no keyword)\n- \"Send code\" from 2nd connection",
"position": [
2912,
896
],
"parameters": {},
"typeVersion": 1
},
{
"id": "2487205f-842a-4650-991d-90236c16efd3",
"name": "ā
All Comments Processed",
"type": "n8n-nodes-base.noOp",
"notes": "## ā
COMPLETION NODE\n\n---\n\n### š Workflow Complete!\n\n---\n\n### š What Happened:\nā Fetched all comments from post\nā Checked each for keyword match\nā Verified connection status\nā Sent DMs to eligible users\nā Applied rate limiting\n\n---\n\n### š Check Results:\n1. **Execution Log** - See all processed items\n2. **LinkedIn Messages** - Verify sent messages\n3. **Error Panel** - Check for any failures\n\n---\n\n### šÆ Next Steps:\n- Monitor response rates\n- Adjust keywords if needed\n- Scale to more posts\n- Optimize message templates\n\n---\n\n### š Success Metrics:\n- Messages successfully sent\n- Response rate\n- Conversion rate\n- Engagement generated",
"position": [
2016,
608
],
"parameters": {},
"typeVersion": 1
},
{
"id": "a4755f73-2445-4405-b2ca-3b6b751e5b61",
"name": "Execution Zone",
"type": "n8n-nodes-base.stickyNote",
"position": [
876,
556
],
"parameters": {
"color": 7,
"width": 2456,
"height": 580,
"content": "## š EXECUTION ZONE\n\nThe main workflow nodes are in this section.\n\n**Tip:** Follow the numbered sequence (1ļøā£ ā 2ļøā£ ā 3ļøā£...)"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "",
"connections": {
"8ļøā£ If: Connected?": {
"main": [
[
{
"node": "9ļøā£ Send DM with Link",
"type": "main",
"index": 0
}
],
[
{
"node": "āļø Skip: No Match / Not Connected",
"type": "main",
"index": 0
}
]
]
},
"š Wait: Rate Limiting": {
"main": [
[
{
"node": "4ļøā£ Loop: Process Each Comment",
"type": "main",
"index": 0
}
]
]
},
"9ļøā£ Send DM with Link": {
"main": [
[
{
"node": "š Wait: Rate Limiting",
"type": "main",
"index": 0
}
]
]
},
"2ļøā£ Fetch All Comments": {
"main": [
[
{
"node": "3ļøā£ Split Comments Array",
"type": "main",
"index": 0
}
]
]
},
"6ļøā£ If: Keyword Found?": {
"main": [
[
{
"node": "7ļøā£ Check Connection Status",
"type": "main",
"index": 0
}
],
[
{
"node": "āļø Skip: No Match / Not Connected",
"type": "main",
"index": 0
}
]
]
},
"3ļøā£ Split Comments Array": {
"main": [
[
{
"node": "4ļøā£ Loop: Process Each Comment",
"type": "main",
"index": 0
}
]
]
},
"5ļøā£ Detect Keyword Match": {
"main": [
[
{
"node": "6ļøā£ If: Keyword Found?",
"type": "main",
"index": 0
}
]
]
},
"7ļøā£ Check Connection Status": {
"main": [
[
{
"node": "8ļøā£ If: Connected?",
"type": "main",
"index": 0
}
]
]
},
"1ļøā£ Form: Enter Post Details": {
"main": [
[
{
"node": "2ļøā£ Fetch All Comments",
"type": "main",
"index": 0
}
]
]
},
"4ļøā£ Loop: Process Each Comment": {
"main": [
[
{
"node": "ā
All Comments Processed",
"type": "main",
"index": 0
}
],
[
{
"node": "5ļøā£ Detect Keyword Match",
"type": "main",
"index": 0
}
]
]
},
"āļø Skip: No Match / Not Connected": {
"main": [
[
{
"node": "4ļøā£ Loop: Process Each Comment",
"type": "main",
"index": 0
}
]
]
}
}
}