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.
Venafi Presentation - Watch Video
Automatically detects missed Zoom demos booked via Calendly and triggers AI-powered follow-up sequences.
AI-Powered Fake Review Detection Workflow Using n8n & Airtable. Uses httpRequest, airtable, openAi, slack. Webhook trigger; 27 nodes.
This workflow automates the end-to-end process of scheduling technical or behavioral interviews. It captures interview data via Webhook, creates a Google Calendar event with an integrated Google Meet
This workflow automatically scores and categorizes new GoHighLevel contacts using AI (GPT-4), then tags and assigns them to the appropriate team member based on their score. Hot leads also trigger a S