AutomationFlowsAI & RAG › Loom Auto-doc to Slack

Loom Auto-doc to Slack

14 - Loom Auto-Doc to Slack. Uses httpRequest, anthropic, slack. Webhook trigger; 7 nodes.

Webhook trigger★★★★☆ complexityAI-powered7 nodesHTTP RequestAnthropicSlack
AI & RAG Trigger: Webhook Nodes: 7 Complexity: ★★★★☆ AI nodes: yes Added:

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 →

Download .json
{
  "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.

Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Auto-Fix Production Errors with Claude. Uses anthropic, httpRequest, slack, emailSend. Webhook trigger; 10 nodes.

Anthropic, HTTP Request, Slack +1
AI & RAG

02 - Inbound Form AI Qualifier. Uses httpRequest, anthropic, hubspot, slack. Webhook trigger; 9 nodes.

HTTP Request, Anthropic, HubSpot +2
AI & RAG

10 - FAQ -> schema -> WP REST inject. Uses httpRequest, anthropic, slack. Webhook trigger; 8 nodes.

HTTP Request, Anthropic, Slack
AI & RAG

08 - YouTube transcript -> 9 assets. Uses httpRequest, anthropic, googleDocs, notion. Webhook trigger; 7 nodes.

HTTP Request, Anthropic, Google Docs +2
AI & RAG

12 - Meeting to Action Items to ClickUp. Uses anthropic, httpRequest, slack. Webhook trigger; 7 nodes.

Anthropic, HTTP Request, Slack