AutomationFlowsAI & RAG › Calendly Dossier (li + Twitter + Company)

Calendly Dossier (li + Twitter + Company)

13 - Calendly Dossier (LI + Twitter + Company). Uses httpRequest, anthropic, gmail. Webhook trigger; 10 nodes.

Webhook trigger★★★★☆ complexityAI-powered10 nodesHTTP RequestAnthropicGmail
AI & RAG Trigger: Webhook Nodes: 10 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #skynetlabs-13 — we link there as the canonical source.

This workflow follows the Gmail → HTTP Request 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": "13 - Calendly Dossier (LI + Twitter + Company)",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "calendly-booked",
        "responseMode": "lastNode",
        "options": {}
      },
      "id": "trigger-calendly",
      "name": "Calendly invitee.created",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        200,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "const body = $input.first().json.body || $input.first().json;\nconst payload = body.payload || body;\nconst invitee = payload.invitee || payload;\nconst event = payload.event || {};\nconst answers = (invitee.questions_and_answers || []).reduce((a, q) => { a[q.question] = q.answer; return a; }, {});\nconst email = invitee.email;\nconst name = invitee.name;\nconst domain = (email || '').split('@')[1] || '';\nconst start = event.start_time || payload.scheduled_event?.start_time || new Date(Date.now() + 3600000).toISOString();\nreturn [{ json: { name, email, domain, start_time: start, company_hint: answers['Company'] || answers['company'] || '', li_hint: answers['LinkedIn'] || answers['linkedin'] || '', meeting_url: event.uri || '' } }];"
      },
      "id": "parse-booking",
      "name": "Parse booking",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        420,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.apify.com/v2/acts/dev_fusion~linkedin-profile-scraper/run-sync-get-dataset-items",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"queries\": [\"{{ $json.name }} {{ $json.company_hint || $json.domain }}\"],\n  \"maxItems\": 1\n}",
        "options": {
          "timeout": 60000
        }
      },
      "id": "scrape-linkedin",
      "name": "Scrape LinkedIn",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        640,
        200
      ],
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "continueOnFail": true
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.apify.com/v2/acts/apidojo~twitter-scraper/run-sync-get-dataset-items",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"searchTerms\": [\"from:{{ $('Parse booking').first().json.name.split(' ')[0].toLowerCase() }} {{ $('Parse booking').first().json.company_hint }}\"],\n  \"maxItems\": 10\n}",
        "options": {
          "timeout": 60000
        }
      },
      "id": "scrape-twitter",
      "name": "Scrape X / Twitter",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        640,
        300
      ],
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "continueOnFail": true
    },
    {
      "parameters": {
        "url": "=https://{{ $('Parse booking').first().json.domain }}",
        "options": {
          "timeout": 15000,
          "response": {
            "response": {
              "responseFormat": "text"
            }
          }
        }
      },
      "id": "scrape-site",
      "name": "Fetch company homepage",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        640,
        400
      ],
      "continueOnFail": true
    },
    {
      "parameters": {
        "jsCode": "const booking = $('Parse booking').first().json;\nconst li = $('Scrape LinkedIn').first()?.json?.[0] || {};\nconst tw = $('Scrape X / Twitter').first()?.json || [];\nconst site = String($('Fetch company homepage').first()?.json?.data || '').slice(0, 8000);\nconst siteText = site.replace(/<script[\\s\\S]*?<\\/script>/g, '').replace(/<style[\\s\\S]*?<\\/style>/g, '').replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').slice(0, 3500);\nreturn [{ json: { booking, linkedin: li, twitter_posts: tw.slice(0, 8), company_text: siteText } }];"
      },
      "id": "bundle",
      "name": "Bundle for Claude",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        860,
        300
      ]
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "claude-sonnet-4-6",
          "mode": "list"
        },
        "messages": {
          "values": [
            {
              "content": "=You write a pre-call dossier for a SkynetLabs sales call (automation + AEO agency). 1 page, scannable.\n\nINPUT:\n{{ JSON.stringify($json) }}\n\nWRITE markdown with these sections:\n\n**The person**\n- 3 bullets: role, tenure, anything notable\n\n**The company**\n- 3 bullets: what they do, rough size, recent signals\n\n**Likely pain (top 3)**\n- Map to: lead qualification, content ops, AI search visibility, internal automation\n\n**Top 3 discovery questions to ask**\n- Specific, not generic\n\n**Watch-outs**\n- Anything that suggests bad fit or budget mismatch\n\n**One-line opener**\n- A genuine observation to open the call with, NOT a flatter\n\nRules: no invented metrics. If a field is missing say 'not found'.",
              "role": "user"
            }
          ]
        },
        "options": {
          "temperature": 0.4,
          "maxTokens": 1500
        }
      },
      "id": "claude-dossier",
      "name": "Claude dossier",
      "type": "@n8n/n8n-nodes-langchain.anthropic",
      "typeVersion": 1.2,
      "position": [
        1080,
        300
      ],
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const dossier = $input.first().json.content?.[0]?.text || $input.first().json.text || '';\nconst booking = $('Parse booking').first().json;\nconst start = new Date(booking.start_time);\nconst sendAt = new Date(start.getTime() - 10 * 60 * 1000);\nreturn [{ json: { dossier_md: dossier, send_at: sendAt.toISOString(), prospect_name: booking.name, prospect_email: booking.email, meeting_start: booking.start_time } }];"
      },
      "id": "compute-send-time",
      "name": "Compute send time (T-10)",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1300,
        300
      ]
    },
    {
      "parameters": {
        "amount": "={{ Math.max(0, Math.floor((new Date($json.send_at).getTime() - Date.now()) / 1000)) }}",
        "unit": "seconds"
      },
      "id": "wait-until",
      "name": "Wait until T-10",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        1520,
        300
      ]
    },
    {
      "parameters": {
        "sendTo": "REPLACE_ME_FROM_EMAIL",
        "subject": "=Pre-call dossier \u2014 {{ $json.prospect_name }} ({{ $json.meeting_start }})",
        "emailType": "text",
        "message": "={{ $json.dossier_md }}",
        "options": {}
      },
      "id": "gmail-send",
      "name": "Email dossier",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1740,
        300
      ],
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Calendly invitee.created": {
      "main": [
        [
          {
            "node": "Parse booking",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse booking": {
      "main": [
        [
          {
            "node": "Scrape LinkedIn",
            "type": "main",
            "index": 0
          },
          {
            "node": "Scrape X / Twitter",
            "type": "main",
            "index": 0
          },
          {
            "node": "Fetch company homepage",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape LinkedIn": {
      "main": [
        [
          {
            "node": "Bundle for Claude",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape X / Twitter": {
      "main": [
        [
          {
            "node": "Bundle for Claude",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch company homepage": {
      "main": [
        [
          {
            "node": "Bundle for Claude",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Bundle for Claude": {
      "main": [
        [
          {
            "node": "Claude dossier",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude dossier": {
      "main": [
        [
          {
            "node": "Compute send time (T-10)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compute send time (T-10)": {
      "main": [
        [
          {
            "node": "Wait until T-10",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait until T-10": {
      "main": [
        [
          {
            "node": "Email dossier",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateId": "skynetlabs-13"
  },
  "tags": [
    {
      "name": "skynetlabs-pack"
    },
    {
      "name": "sales"
    },
    {
      "name": "calendly"
    }
  ]
}

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

13 - Calendly Dossier (LI + Twitter + Company). Uses httpRequest, anthropic, gmail. Webhook trigger; 10 nodes.

Source: https://github.com/waseemnasir2k26/skynet-automation-pack/blob/main/n8n/13-calendly-dossier-li-twitter-company.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

Eu Clara – Funil Kiwify Completo. Uses postgres, openAi, httpRequest, gmail. Webhook trigger; 70 nodes.

Postgres, OpenAI, HTTP Request +1
AI & RAG

This workflow bridges the gap between raw product data and revenue sales tools. It automates the entire Product Qualified Lead (PQL) lifecycle—from real-time intent routing to churn prevention—reducin

HTTP Request, Anthropic, OpenAI
AI & RAG

User Signup & Verification: The workflow starts when a user signs up. It generates a verification code and sends it via SMS using Twilio. Code Validation: The user replies with the code. The workflow

Postgres, HTTP Request, OpenAI +2
AI & RAG

Instantly map all internal URLs, perform AI-powered (ChatGPT) analysis, and deliver results in HTML via webhook, Google Sheets, or email. All from your own n8n instance!

OpenAI, HTTP Request, XML +3
AI & RAG

Watch on Youtube▶️

HTTP Request, Email Send, Google Sheets +3