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 →
{
"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.
anthropicApigmailOAuth2httpHeaderAuth
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow captures new leads via webhook, enriches and scores them with Apollo and Google Gemini, logs everything in Google Sheets, and automates outreach, reply handling, follow-ups, meeting prep
Eu Clara – Funil Kiwify Completo. Uses postgres, openAi, httpRequest, gmail. Webhook trigger; 70 nodes.
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
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
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!