This workflow follows the HTTP Request → OpenAI 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": "Post-Meeting Follow-Up",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "meeting/followup",
"responseMode": "responseNode",
"options": {}
},
"id": "node-followup-webhook",
"name": "Notes Form Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
220,
300
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={ {\"status\": \"ok\", \"message\": \"Follow-up processed\"} }",
"options": {}
},
"id": "node-followup-respond",
"name": "Respond OK",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1,
"position": [
420,
500
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "condition-notes-submitted",
"leftValue": "={{ $json.type }}",
"rightValue": "meeting_notes_submitted",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "node-filter-notes",
"name": "Filter Notes Submitted",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
420,
300
]
},
{
"parameters": {
"method": "GET",
"url": "=https://services.leadconnectorhq.com/contacts/search",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Version",
"value": "2021-07-28"
}
]
},
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "email",
"value": "={{ $json.email }}"
},
{
"name": "locationId",
"value": "={{ $env.GHL_LOCATION_ID }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true
}
}
}
},
"id": "node-ghl-lookup",
"name": "GHL \u2013 Lookup Contact",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
640,
300
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"onError": "continueRegularOutput"
},
{
"parameters": {
"jsCode": "// Build context for follow-up email generation\nconst notes = $('Notes Form Webhook').first().json;\nlet contact = {};\n\ntry {\n const ghlResponse = $('GHL \u2013 Lookup Contact').first().json;\n if (ghlResponse && ghlResponse.contacts && ghlResponse.contacts.length > 0) {\n contact = ghlResponse.contacts[0];\n }\n} catch (e) {\n contact = {};\n}\n\nreturn [{\n json: {\n booking_uid: notes.booking_uid,\n email: notes.email,\n outcome: notes.outcome,\n deal_size_estimate: notes.deal_size_estimate || 'Not specified',\n call_notes: notes.notes,\n attendee_name: contact.firstName\n ? `${contact.firstName} ${contact.lastName || ''}`.trim()\n : notes.email,\n company_name: contact.companyName || 'their company',\n ghl_contact_id: contact.id || null\n }\n}];"
},
"id": "node-build-followup-context",
"name": "Build Follow-Up Context",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
860,
300
]
},
{
"parameters": {
"resource": "chat",
"model": "gpt-4.1-mini",
"messages": {
"values": [
{
"role": "system",
"content": "You are helping a consultant write a follow-up email after a discovery call.\nWrite a concise, friendly, and professional email in the consultant's voice.\nOutput only the email body (no extra commentary)."
},
{
"role": "user",
"content": "=Details:\n- Prospect name: {{ $json.attendee_name }}\n- Company: {{ $json.company_name }}\n- Outcome: {{ $json.outcome }}\n- Estimated deal size: {{ $json.deal_size_estimate }}\n- Call notes: {{ $json.call_notes }}\n\nIf the outcome indicates they are qualified and want a proposal, propose\nnext steps and a clear call-to-action. If they are not ready, suggest a\nlight nurture follow-up instead."
}
]
},
"options": {
"temperature": 0.7,
"maxTokens": 600
}
},
"id": "node-openai-followup",
"name": "OpenAI \u2013 Follow-Up Email",
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 1.4,
"position": [
1080,
300
],
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"onError": "continueRegularOutput"
},
{
"parameters": {
"jsCode": "// Determine pipeline stage based on meeting outcome\nconst context = $('Build Follow-Up Context').first().json;\nconst outcome = (context.outcome || '').toLowerCase();\n\nlet pipelineStage = 'Discovery Completed';\nlet sequenceType = 'nurture';\n\nif (outcome.includes('qualified') || outcome.includes('proposal')) {\n pipelineStage = 'Proposal Sent';\n sequenceType = 'proposal';\n} else if (outcome.includes('not ready') || outcome.includes('nurture')) {\n pipelineStage = 'Nurture';\n sequenceType = 'nurture';\n} else if (outcome.includes('disqualified') || outcome.includes('not a fit')) {\n pipelineStage = 'Closed Lost';\n sequenceType = 'none';\n}\n\nconst emailDraft = $('OpenAI \u2013 Follow-Up Email').first().json;\n\nreturn [{\n json: {\n ...context,\n pipeline_stage: pipelineStage,\n sequence_type: sequenceType,\n email_draft: emailDraft.message?.content || emailDraft.content || emailDraft.text || ''\n }\n}];"
},
"id": "node-determine-stage",
"name": "Determine Pipeline Stage",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1300,
300
]
},
{
"parameters": {
"method": "PUT",
"url": "=https://services.leadconnectorhq.com/contacts/{{ $json.ghl_contact_id }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Version",
"value": "2021-07-28"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"tags\": [\"discovery-completed\", \"{{ $json.sequence_type }}\"],\n \"customFields\": [\n {\"key\": \"meeting_outcome\", \"value\": \"{{ $json.outcome }}\"},\n {\"key\": \"deal_size_estimate\", \"value\": \"{{ $json.deal_size_estimate }}\"},\n {\"key\": \"call_notes\", \"value\": \"{{ $json.call_notes }}\"},\n {\"key\": \"followup_email_draft\", \"value\": \"{{ $json.email_draft }}\"}\n ]\n}",
"options": {
"response": {
"response": {
"fullResponse": true
}
}
}
},
"id": "node-ghl-update",
"name": "GHL \u2013 Update Contact",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1520,
300
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"onError": "continueRegularOutput"
},
{
"parameters": {
"method": "PUT",
"url": "=https://services.leadconnectorhq.com/opportunities/{{ $json.ghl_contact_id }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Version",
"value": "2021-07-28"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"pipelineId\": \"{{ $env.GHL_PIPELINE_ID }}\",\n \"pipelineStageId\": \"{{ $json.pipeline_stage }}\",\n \"status\": \"open\",\n \"locationId\": \"{{ $env.GHL_LOCATION_ID }}\"\n}",
"options": {}
},
"id": "node-ghl-pipeline",
"name": "GHL \u2013 Update Pipeline Stage",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1740,
300
],
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"onError": "continueRegularOutput"
},
{
"parameters": {
"resource": "message",
"channel": {
"__rl": true,
"mode": "id",
"value": "={{ $env.SLACK_CHANNEL_ID_DISCOVERY }}"
},
"text": "=:white_check_mark: *Follow-Up Processed*\n\n*Prospect:* {{ $('Build Follow-Up Context').item.json.attendee_name }} ({{ $('Build Follow-Up Context').item.json.email }})\n*Company:* {{ $('Build Follow-Up Context').item.json.company_name }}\n*Outcome:* {{ $('Determine Pipeline Stage').item.json.outcome }}\n*Pipeline Stage:* {{ $('Determine Pipeline Stage').item.json.pipeline_stage }}\n*Sequence:* {{ $('Determine Pipeline Stage').item.json.sequence_type }}\n*Deal Size:* {{ $('Determine Pipeline Stage').item.json.deal_size_estimate }}",
"otherOptions": {}
},
"id": "node-slack-followup",
"name": "Slack \u2013 Follow-Up Notification",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [
1960,
300
],
"credentials": {
"slackApi": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Notes Form Webhook": {
"main": [
[
{
"node": "Filter Notes Submitted",
"type": "main",
"index": 0
},
{
"node": "Respond OK",
"type": "main",
"index": 0
}
]
]
},
"Filter Notes Submitted": {
"main": [
[
{
"node": "GHL \u2013 Lookup Contact",
"type": "main",
"index": 0
}
],
[]
]
},
"GHL \u2013 Lookup Contact": {
"main": [
[
{
"node": "Build Follow-Up Context",
"type": "main",
"index": 0
}
]
]
},
"Build Follow-Up Context": {
"main": [
[
{
"node": "OpenAI \u2013 Follow-Up Email",
"type": "main",
"index": 0
}
]
]
},
"OpenAI \u2013 Follow-Up Email": {
"main": [
[
{
"node": "Determine Pipeline Stage",
"type": "main",
"index": 0
}
]
]
},
"Determine Pipeline Stage": {
"main": [
[
{
"node": "GHL \u2013 Update Contact",
"type": "main",
"index": 0
}
]
]
},
"GHL \u2013 Update Contact": {
"main": [
[
{
"node": "GHL \u2013 Update Pipeline Stage",
"type": "main",
"index": 0
}
]
]
},
"GHL \u2013 Update Pipeline Stage": {
"main": [
[
{
"node": "Slack \u2013 Follow-Up Notification",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"staticData": null,
"tags": [
{
"name": "cal-pipeline",
"id": "tag-cal-pipeline"
},
{
"name": "production",
"id": "tag-production"
}
],
"triggerCount": 1
}
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.
httpHeaderAuthopenAiApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Post-Meeting Follow-Up. Uses httpRequest, openAi, slack. Webhook trigger; 10 nodes.
Source: https://github.com/albincikaj/cal-appointment-pipeline/blob/411edfdb5d4b8dd6bc61a9be48b9280cd530f8f9/n8n-workflows/post-meeting-followup.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
Venafi Presentation - Watch Video
Automatically detects missed Zoom demos booked via Calendly and triggers AI-powered follow-up sequences.
This workflow accepts invoice documents via webhook, validates and de-duplicates them, extracts invoice data from PDFs with OpenAI, and either posts approved invoices to an ERP via HTTP or routes exce
AI-Powered Fake Review Detection Workflow Using n8n & Airtable. Uses httpRequest, airtable, openAi, slack. Webhook trigger; 27 nodes.