AutomationFlowsAI & RAG › Post-meeting Follow-up

Post-meeting Follow-up

Post-Meeting Follow-Up. Uses httpRequest, openAi, slack. Webhook trigger; 10 nodes.

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

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 →

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

Pro

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 →

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

Venafi Presentation - Watch Video

Venafi Tls Protect Cloud, HTTP Request, OpenAI +1
AI & RAG

Automatically detects missed Zoom demos booked via Calendly and triggers AI-powered follow-up sequences.

HTTP Request, OpenAI, Email Send +3
AI & RAG

AI-Powered Fake Review Detection Workflow Using n8n & Airtable. Uses httpRequest, airtable, openAi, slack. Webhook trigger; 27 nodes.

HTTP Request, Airtable, OpenAI +1
AI & RAG

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

Google Calendar, OpenAI, Gmail +2
AI & RAG

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

HTTP Request, OpenAI, Slack