This workflow corresponds to n8n.io template #skynetlabs-14 — we link there as the canonical source.
This workflow follows the HTTP Request → Slack 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 →
{
"name": "14 - Loom Auto-Doc to Slack",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "loom-recorded",
"responseMode": "lastNode",
"options": {}
},
"id": "trigger-loom",
"name": "Loom video.created",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
200,
300
]
},
{
"parameters": {
"jsCode": "const body = $input.first().json.body || $input.first().json;\nconst video = body.video || body;\nreturn [{ json: { video_id: video.id || video.video_id, share_url: video.share_url || video.url, title: video.name || video.title || 'Untitled Loom', owner_email: video.owner?.email || video.owner_email || '', folder_name: (video.folder?.name || '').toLowerCase() } }];"
},
"id": "parse-loom",
"name": "Parse Loom payload",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
420,
300
]
},
{
"parameters": {
"url": "=https://api.loom.com/v1/videos/{{ $json.video_id }}/transcript",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": {
"timeout": 30000
}
},
"id": "fetch-transcript",
"name": "Fetch transcript",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
640,
300
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "claude-sonnet-4-6",
"mode": "list"
},
"messages": {
"values": [
{
"content": "=You turn a Loom transcript into a clean SOP doc. Return ONLY valid JSON.\n\nLoom title: {{ $('Parse Loom payload').first().json.title }}\nTranscript:\n{{ JSON.stringify($json) }}\n\nReturn:\n{\n \"sop_title\": \"verb-noun, max 70 chars\",\n \"tldr\": \"2-sentence summary\",\n \"steps\": [\"step 1\", \"step 2\", \"...\"],\n \"checklist\": [\"checkbox item 1\", \"...\"],\n \"tags\": [\"onboarding|client|internal|engineering|sales|other\"],\n \"channel_route\": \"onboarding|clients|misc\",\n \"slack_markdown\": \"the formatted message body for Slack (use *bold* and bullet \u2022)\"\n}\n\nRules: keep slack_markdown under 2500 chars. Use Slack mrkdwn, not standard markdown. Steps are imperative.",
"role": "user"
}
]
},
"options": {
"temperature": 0.3,
"maxTokens": 1800
}
},
"id": "claude-sop",
"name": "Claude SOP rewrite",
"type": "@n8n/n8n-nodes-langchain.anthropic",
"typeVersion": 1.2,
"position": [
860,
300
],
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "const raw = $input.first().json.content?.[0]?.text || $input.first().json.text || '';\nconst match = raw.match(/\\{[\\s\\S]*\\}/);\nif (!match) throw new Error('No JSON in Claude reply');\nconst parsed = JSON.parse(match[0]);\nconst loom = $('Parse Loom payload').first().json;\nconst CHANNELS = {\n onboarding: 'C0000000001',\n clients: 'C0000000002',\n misc: 'C0000000003'\n};\nconst channel_id = CHANNELS[parsed.channel_route] || CHANNELS.misc;\nreturn [{ json: { ...parsed, channel_id, loom_url: loom.share_url, loom_owner: loom.owner_email, loom_id: loom.video_id, created_at: new Date().toISOString() } }];"
},
"id": "parse-and-route",
"name": "Parse + route channel",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1080,
300
]
},
{
"parameters": {
"channel": "={{ $json.channel_id }}",
"text": "=:movie_camera: *New SOP from Loom* \u2014 _{{ $json.sop_title }}_\n\n{{ $json.tldr }}\n\n{{ $json.slack_markdown }}\n\n<{{ $json.loom_url }}|Watch original Loom> \u00b7 by {{ $json.loom_owner }}",
"otherOptions": {}
},
"id": "slack-post",
"name": "Post to Slack",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [
1300,
200
],
"credentials": {
"slackApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://api.notion.com/v1/pages",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Notion-Version",
"value": "2022-06-28"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"parent\": { \"database_id\": \"REPLACE_ME_NOTION_DB_ID\" },\n \"properties\": {\n \"Title\": { \"title\": [{ \"text\": { \"content\": \"{{ $json.sop_title }}\" } }] },\n \"Owner\": { \"rich_text\": [{ \"text\": { \"content\": \"{{ $json.loom_owner }}\" } }] },\n \"Tags\": { \"multi_select\": [{{ ($json.tags||[]).map(t => '{\"name\":\"' + t + '\"}').join(',') }}] },\n \"Source URL\": { \"url\": \"{{ $json.loom_url }}\" },\n \"Status\": { \"select\": { \"name\": \"Draft\" } }\n },\n \"children\": [\n { \"object\": \"block\", \"type\": \"paragraph\", \"paragraph\": { \"rich_text\": [{ \"type\": \"text\", \"text\": { \"content\": \"{{ $json.tldr }}\" } }] } }\n ]\n}",
"options": {}
},
"id": "notion-mirror",
"name": "Mirror to Notion",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1300,
400
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Loom video.created": {
"main": [
[
{
"node": "Parse Loom payload",
"type": "main",
"index": 0
}
]
]
},
"Parse Loom payload": {
"main": [
[
{
"node": "Fetch transcript",
"type": "main",
"index": 0
}
]
]
},
"Fetch transcript": {
"main": [
[
{
"node": "Claude SOP rewrite",
"type": "main",
"index": 0
}
]
]
},
"Claude SOP rewrite": {
"main": [
[
{
"node": "Parse + route channel",
"type": "main",
"index": 0
}
]
]
},
"Parse + route channel": {
"main": [
[
{
"node": "Post to Slack",
"type": "main",
"index": 0
},
{
"node": "Mirror to Notion",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateId": "skynetlabs-14"
},
"tags": [
{
"name": "skynetlabs-pack"
},
{
"name": "loom"
},
{
"name": "sop"
}
]
}
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.
anthropicApihttpHeaderAuthslackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
14 - Loom Auto-Doc to Slack. Uses httpRequest, anthropic, slack. Webhook trigger; 7 nodes.
Source: https://github.com/waseemnasir2k26/skynet-automation-pack/blob/main/n8n/14-loom-auto-doc-slack.json — 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.
Auto-Fix Production Errors with Claude. Uses anthropic, httpRequest, slack, emailSend. Webhook trigger; 10 nodes.
02 - Inbound Form AI Qualifier. Uses httpRequest, anthropic, hubspot, slack. Webhook trigger; 9 nodes.
10 - FAQ -> schema -> WP REST inject. Uses httpRequest, anthropic, slack. Webhook trigger; 8 nodes.
08 - YouTube transcript -> 9 assets. Uses httpRequest, anthropic, googleDocs, notion. Webhook trigger; 7 nodes.
12 - Meeting to Action Items to ClickUp. Uses anthropic, httpRequest, slack. Webhook trigger; 7 nodes.