AutomationFlowsSlack & Telegram › Send Pre-meeting Slack Briefings Using Google Calendar, Notion, Github, and Jira

Send Pre-meeting Slack Briefings Using Google Calendar, Notion, Github, and Jira

ByIntuz @intuz on n8n.io

This n8n template from Intuz provides a complete and automated solution for preparing and delivering context-rich briefings directly to attendees before every meeting.

Event trigger★★★★☆ complexity28 nodesGoogle Calendar TriggerNotionGitHubJiraHTTP RequestSlack
Slack & Telegram Trigger: Event Nodes: 28 Complexity: ★★★★☆ Added:

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

This workflow follows the GitHub → 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
{
  "id": "0mHoUCxDP4DV8hMU",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Pre-Meeting Context Bot",
  "tags": [],
  "nodes": [
    {
      "id": "1af00621-8093-41a5-8abd-c86ac5793f58",
      "name": "Format Calenda Event Payload",
      "type": "n8n-nodes-base.code",
      "position": [
        -32,
        -16
      ],
      "parameters": {
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\n\n\nreturn {\n  eventStart: new Date($input.first().json.start?.date || $input.first().json.start.dateTime),\n  summary: $input.first().json.summary,\n  attendees: $input.first().json.attendees\n};\n"
      },
      "typeVersion": 2
    },
    {
      "id": "70086689-cb3a-4267-8bfb-a503130ecc6f",
      "name": "Add 15 minute Early Time",
      "type": "n8n-nodes-base.code",
      "position": [
        1216,
        -16
      ],
      "parameters": {
        "jsCode": "const start = new Date($input.first().json.eventStart);\nconst notifyAt = new Date(start.getTime() - 15 * 60 * 1000);\n\nreturn {\n  ...$input.first().json,\n  notifyAt\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "52bb6001-eb8a-4c06-a9ef-2e4ed470b0e5",
      "name": "Build Message for Slack",
      "type": "n8n-nodes-base.code",
      "position": [
        3696,
        -32
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// --------------------\n// 1. Read inputs safely\n// --------------------\nconst ticketsRaw = $json.tickets ?? [];\n\nconst previousNotes =\n  $('Normalize Calendar and Notion Payloads').first()?.json?.previousMeetingNotes ?? '';\n\nconst meetingTitle =\n  $('Format Calenda Event Payload').first()?.json?.summary ?? 'Meeting';\n\nconst eventStart =\n  $('Format Calenda Event Payload').first()?.json?.eventStart;\n\nconst start = eventStart ? new Date(eventStart) : null;\n\n// --------------------\n// 2. Format meeting time\n// --------------------\nconst meetingTime = start\n  ? start.toLocaleString('en-IN', {\n      weekday: 'short',\n      day: '2-digit',\n      month: 'short',\n      hour: '2-digit',\n      minute: '2-digit'\n    })\n  : '';\n\n// --------------------\n// 3. Clean & validate tickets\n// --------------------\nconst validTickets = ticketsRaw.filter(\n  t => t && t.source && t.id && t.title\n);\n\n// --------------------\n// 4. Build Topics section\n// --------------------\nconst ticketText = validTickets.length\n  ? validTickets\n      .map(t => `\u2022 *[${t.source}]* ${t.id} \u2014 ${t.title}`)\n      .join('\\n')\n  : '_No tickets or PRs found._';\n\n// --------------------\n// 5. Build Previous Notes section\n// --------------------\nconst notesText = previousNotes.trim()\n  ? previousNotes\n      .split('\\n')\n      .map(l => `\u2022 ${l.replace(/^[-\u2022]\\s*/, '')}`)\n      .join('\\n')\n  : '_No previous meeting notes found._';\n\n// --------------------\n// 6. Return Slack Blocks\n// --------------------\nreturn {\n  blocks: [\n    {\n      type: 'header',\n      text: {\n        type: 'plain_text',\n        text: '\ud83e\udde0 Pre-Meeting Context',\n        emoji: true\n      }\n    },\n    {\n      type: 'context',\n      elements: [\n        {\n          type: 'mrkdwn',\n          text: `\ud83d\udcc5 *${meetingTitle}*${meetingTime ? ` \u00b7 *${meetingTime}*` : ''}`\n        }\n      ]\n    },\n    { type: 'divider' },\n    {\n      type: 'section',\n      text: {\n        type: 'mrkdwn',\n        text: `*Topics for Today*\\n${ticketText}`\n      }\n    },\n    { type: 'divider' },\n    {\n      type: 'section',\n      text: {\n        type: 'mrkdwn',\n        text: `*Previous Meeting Summary*\\n${notesText}`\n      }\n    },\n    {\n      type: 'context',\n      elements: [\n        {\n          type: 'mrkdwn',\n          text: '_Please review before the meeting starts._'\n        }\n      ]\n    }\n  ]\n};\n"
      },
      "typeVersion": 2
    },
    {
      "id": "0c8a3201-4f13-451f-aee7-8a0715a491d4",
      "name": "Capture New Google Calendar Event",
      "type": "n8n-nodes-base.googleCalendarTrigger",
      "position": [
        -256,
        -16
      ],
      "parameters": {
        "options": {
          "matchTerm": ""
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "eventCreated",
        "calendarId": {
          "__rl": true,
          "mode": "list",
          "value": "user@example.com",
          "cachedResultName": "user@example.com"
        }
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": false
    },
    {
      "id": "d9d65695-2382-4d16-aa26-2cb332fb6ef6",
      "name": "Get Last Meeting Notes",
      "type": "n8n-nodes-base.notion",
      "position": [
        352,
        -16
      ],
      "parameters": {
        "limit": 1,
        "simple": false,
        "options": {
          "sort": {
            "sortValue": [
              {
                "key": "Meeting Date|date",
                "direction": "descending"
              }
            ]
          }
        },
        "resource": "databasePage",
        "operation": "getAll",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "2ee96c4b-07ff-809a-a90b-f69aafee1bd5",
          "cachedResultUrl": "https://www.notion.so/2ee96c4b07ff809aa90bf69aafee1bd5",
          "cachedResultName": "Meeting Notes"
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "3381d343-86ae-476f-9bd0-31822b6eace3",
      "name": "Is Previous Meeting",
      "type": "n8n-nodes-base.filter",
      "position": [
        560,
        -16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e6042a4c-041a-4743-b5f9-ee82e6c8f141",
              "operator": {
                "type": "dateTime",
                "operation": "before"
              },
              "leftValue": "={{$json.properties[\"Meeting Date\"].date.start }}",
              "rightValue": "={{ $('Format Calenda Event Payload').item.json.eventStart }}"
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.3
    },
    {
      "id": "a4f9b4ee-6c71-4747-941c-d95944262df0",
      "name": "Wait for Time to Come",
      "type": "n8n-nodes-base.wait",
      "position": [
        1456,
        -16
      ],
      "parameters": {
        "resume": "specificTime",
        "dateTime": "={{ $json.notifyAt }}"
      },
      "typeVersion": 1.1,
      "alwaysOutputData": true
    },
    {
      "id": "b92f9476-735a-4ddd-8e1d-7711dec75941",
      "name": "Get PRs from Repo",
      "type": "n8n-nodes-base.github",
      "position": [
        2272,
        -224
      ],
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "url",
          "value": ""
        },
        "resource": "repository",
        "repository": {
          "__rl": true,
          "mode": "list",
          "value": "TestRepo",
          "cachedResultUrl": "https://github.com/intuz4844-lgtm/TestRepo",
          "cachedResultName": "TestRepo"
        },
        "authentication": "oAuth2",
        "getRepositoryIssuesFilters": {}
      },
      "credentials": {
        "githubOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1,
      "alwaysOutputData": false
    },
    {
      "id": "21566834-55eb-4734-8cd9-6fad7e95e6b1",
      "name": "Get Jira Issues Related to Meeting",
      "type": "n8n-nodes-base.jira",
      "position": [
        2400,
        144
      ],
      "parameters": {
        "options": {
          "jql": "=text ~ \"{{ $json.meetingTitle }}\" ORDER BY updated DESC"
        },
        "operation": "getAll"
      },
      "credentials": {
        "jiraSoftwareCloudApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "42c73ce1-fc7f-4f4d-8091-b7b1f191a9f5",
      "name": "Filter PRs Related to Meeting",
      "type": "n8n-nodes-base.code",
      "position": [
        2496,
        -224
      ],
      "parameters": {
        "jsCode": "// --------------------\n// 1. Read meeting context (single values)\n// --------------------\nconst keywordsRaw =\n  $('Extract Meeting Keywords').first().json.keywords || '';\n\nconst keywords = keywordsRaw\n  .toLowerCase()\n  .split(' ')\n  .filter(Boolean);\n\nconst lastMeetingDateStr =\n  $('Normalize Calendar and Notion Payloads').first().json.previousMeetingDate || null;\n\nconst lastMeetingDate = lastMeetingDateStr\n  ? new Date(lastMeetingDateStr)\n  : null;\n\n// --------------------\n// 2. Read PR list (multiple items)\n// --------------------\nconst prs = $input.all();\n\n// --------------------\n// 3. Filter PRs\n// --------------------\nconst filteredPRs = prs.filter(item => {\n  const pr = item.json;\n\n  // --- Date filter ---\n  if (lastMeetingDate && pr.created_at) {\n    const prCreatedAt = new Date(pr.created_at);\n    if (prCreatedAt <= lastMeetingDate) {\n      return false;\n    }\n  }\n\n  // --- Keyword relevance ---\n  const text = `${pr.title || ''} ${pr.body || ''}`.toLowerCase();\n\n  const matchesKeyword = keywords.some(k => text.includes(k));\n\n  return matchesKeyword;\n});\n\n// --------------------\n// 4. Return filtered PRs\n// --------------------\nreturn filteredPRs;"
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "2fa4b205-fdd5-4d37-ae58-9bb89c4bebda",
      "name": "Merge Jira Tickets and Github PR",
      "type": "n8n-nodes-base.merge",
      "position": [
        3024,
        -32
      ],
      "parameters": {},
      "typeVersion": 3.2,
      "alwaysOutputData": true
    },
    {
      "id": "1f8aa403-1b33-4db2-a934-30769efc0287",
      "name": "Normalize Attendees and Slack Message",
      "type": "n8n-nodes-base.set",
      "position": [
        3904,
        -32
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "8a5490e3-14cf-41ca-b56e-05475e3d92a8",
              "name": "attendees",
              "type": "array",
              "value": "={{ $('Add 15 minute Early Time').first().json.attendees }}"
            },
            {
              "id": "a6bb5f56-eab0-47bd-ae48-f705904b75c1",
              "name": "message",
              "type": "object",
              "value": "={{ $json }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "b6b1c532-e757-44d1-83e1-a467179756d9",
      "name": "Get User Slack Info from Email",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4544,
        -32
      ],
      "parameters": {
        "url": "https://slack.com/api/users.lookupByEmail",
        "options": {},
        "sendQuery": true,
        "sendHeaders": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "email",
              "value": "={{ $json.email }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer {{ slack oauth token }}"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "9664db2d-54d7-47e5-b7f5-1488f08ef33d",
      "name": "Check Slack User Found",
      "type": "n8n-nodes-base.if",
      "position": [
        4736,
        -32
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "74c0ae69-46aa-4d21-8f8e-b0b8b902a83e",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.ok }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "bc1d3827-66a7-43b1-bad9-3e2eb9deb6f8",
      "name": "Send Meeting Context in Slack DM",
      "type": "n8n-nodes-base.slack",
      "position": [
        5024,
        -112
      ],
      "parameters": {
        "text": "=Meeting Related Context",
        "user": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.user.id }}"
        },
        "select": "user",
        "blocksUi": "={{ $('Fan Out Attendees').item.json.message }}",
        "messageType": "block",
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "e464edbb-db6e-42e5-bc35-68a6150202b9",
      "name": "Normalize Calendar and Notion Payloads",
      "type": "n8n-nodes-base.set",
      "position": [
        768,
        -16
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e16008af-f28f-4430-998f-a286632fbf23",
              "name": "previousMeetingNotes",
              "type": "string",
              "value": "={{$json.properties.Notes.rich_text[0].plain_text}}"
            },
            {
              "id": "4c6e7c45-69f7-47cf-b66a-6be3aa8bdc0f",
              "name": "eventStart",
              "type": "string",
              "value": "={{ $('Format Calenda Event Payload').item.json.eventStart }}"
            },
            {
              "id": "0e66c8bf-ff51-4a85-a1a1-cf5272f8d77f",
              "name": "summary",
              "type": "string",
              "value": "={{ $('Format Calenda Event Payload').item.json.summary }}"
            },
            {
              "id": "3039ba27-cc43-449b-8100-078554284ac5",
              "name": "attendees",
              "type": "array",
              "value": "={{ $('Format Calenda Event Payload').item.json.attendees }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "c3533f40-f9ac-4699-afee-47ba53bee757",
      "name": "Extract Meeting Keywords",
      "type": "n8n-nodes-base.code",
      "position": [
        1680,
        -16
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const title = ($json.summary || '').trim();\n\nconst keywords = title\n  .toLowerCase()\n  .replace(/[^a-z0-9\\s]/g, '') // remove symbols\n  .split(' ')\n  .filter(w => w.length > 2)   // drop short/noise words\n  .slice(0, 5)\n  .join(' ');\n\nreturn {\n  meetingTitle: title,\n  keywords\n};\n"
      },
      "typeVersion": 2
    },
    {
      "id": "5c25f9a8-5a19-40bf-b725-f6ca0756b1a9",
      "name": "Prepare PRs and Jira Ticket List",
      "type": "n8n-nodes-base.code",
      "position": [
        3248,
        -32
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\n\nif (!items.length) {\n  return [{ json: { tickets: [] } }];\n}\n\nconst tickets = items.map(i => {\n  const json = i.json;\n\n  // GitHub PR / Issue\n  if (json.html_url && json.number) {\n    return {\n      source: 'GitHub',\n      id: `PR-${json.number}`,\n      title: json.title,\n      url: json.html_url\n    };\n  }\n\n  // Jira Issue\n  if (json.key && json.fields) {\n    return {\n      source: 'Jira',\n      id: json.key,\n      title: json.fields.summary,\n      url: json.self\n    };\n  }\n\n  // Fallback (unknown shape)\n  return {};\n});\n\nreturn [\n  {\n    json: {\n      tickets\n    }\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "4bf9a9f9-b2e2-4b5f-abe4-9a0be4922f14",
      "name": "Fan Out Attendees",
      "type": "n8n-nodes-base.code",
      "position": [
        4096,
        -32
      ],
      "parameters": {
        "jsCode": "const attendees = $input.first().json.attendees;\n\nconst message =\n  $input.first().json.message;\n\nif (!attendees || attendees.length === 0) {\n  return [];\n}\n\n// Optional: filter declined attendees\nconst valid = attendees.filter(\n  a => a.responseStatus !== 'declined'\n);\n\nreturn valid.map(a => ({\n  json: {\n    email: a.email,\n    message\n  }\n}));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "bf412bd2-8058-4b1a-9f6b-a00ece243aa6",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -320,
        -272
      ],
      "parameters": {
        "color": 2,
        "width": 432,
        "height": 448,
        "content": "## The Trigger\n\n- Triggers when a new Google Calendar event is created  \n- Captures essential meeting details (title, start time, attendees)  \n- Formats the event data for downstream processing"
      },
      "typeVersion": 1
    },
    {
      "id": "5a0a23c2-bc87-487b-954f-661962bc4005",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        288,
        -272
      ],
      "parameters": {
        "color": 5,
        "width": 640,
        "height": 448,
        "content": "## Previous Meeting Context \n\n- Automatically pulls notes from the latest past meeting saved in Notion\n- Ensures only meetings that happened **before the current one** are considered \n- Cleans and organizes the information so it\u2019s clear, consistent, and ready to use in the workflow"
      },
      "typeVersion": 1
    },
    {
      "id": "40f21dab-accf-423d-b1be-868d761832f9",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        -272
      ],
      "parameters": {
        "color": 5,
        "width": 768,
        "height": 448,
        "content": "## Meeting Preparation Timing\n\nThis step makes sure the context is prepared at the right moment by:\n\n- Setting a variable which consist reminder time **15 minutes before the meeting starts**\n- Waiting until the correct time to continue the workflow\n- Extracting key words from the meeting title to understand what the meeting is about"
      },
      "typeVersion": 1
    },
    {
      "id": "476573a9-d028-450f-94bd-db6d27ba496b",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2160,
        -544
      ],
      "parameters": {
        "color": 4,
        "width": 528,
        "height": 288,
        "content": "## Find Relevant Pull Requests\n\nThis step gathers development work related to the meeting by:\n\n- Fetching recent pull requests from the connected GitHub repository  \n- Filtering only the pull requests that are relevant to the current meeting topic\n"
      },
      "typeVersion": 1
    },
    {
      "id": "a169d2a5-6a32-40bc-ad5d-f09fc152bde0",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2176,
        336
      ],
      "parameters": {
        "color": 4,
        "width": 544,
        "height": 208,
        "content": "## Find Relevant Jira Tickets\n\nThis step brings in task and issue context for the meeting by:\n\n- Fetching Jira tickets related to the meeting topic  \n- Ensuring only relevant work items are included in the meeting summary"
      },
      "typeVersion": 1
    },
    {
      "id": "dfc3ba31-7767-4cd4-ba40-924b12bdee53",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2944,
        -272
      ],
      "parameters": {
        "color": 5,
        "width": 480,
        "height": 416,
        "content": "## Prepare Meeting Work Items\n\nThis section builds the meeting agenda by:\n\n- Combining relevant GitHub pull requests and Jira tickets\n- Organizing them into a structured list for sharing"
      },
      "typeVersion": 1
    },
    {
      "id": "0aff6e86-76c3-486a-a39d-6a5da2b4ae49",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3616,
        -272
      ],
      "parameters": {
        "color": 5,
        "width": 656,
        "height": 416,
        "content": "## Prepare and Send Slack Messages\n\nThis section prepares the meeting context message and delivers it to all attendees:\n\n- Builds a structured Slack message containing meeting details, topics, and previous notes  \n- Aligns the message with the attendee list from the calendar event  \n- Splits attendees into individual recipients so each person can be messaged separately\n"
      },
      "typeVersion": 1
    },
    {
      "id": "6e4119b0-2967-4cb5-b1d2-152e7fc0d856",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4464,
        -384
      ],
      "parameters": {
        "color": 7,
        "width": 800,
        "height": 544,
        "content": "## Send Meeting Context via Slack DM\n\nThis step ensures the meeting context is delivered directly to each attendee on Slack:\n\n- Looks up the Slack user using the attendee\u2019s email address  \n- Verifies whether a matching Slack user exists  \n- Sends the meeting context as a direct message to the user if found  \n- Safely skips sending if no Slack user is available for the email\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7dcc8e5d-4fe6-4943-8f8c-7a70abef64c9",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -992,
        -1104
      ],
      "parameters": {
        "width": 912,
        "height": 624,
        "content": "# \ud83e\udde0 Pre-Meeting Context Automation\n\n## How it works\nThis workflow automatically prepares and sends relevant meeting context to attendees before a scheduled Google Calendar meeting.\nWhen a new meeting is created in Google Calendar, the workflow captures the event details such as the meeting title, start time, and attendees. It then checks Notion to find notes from the most recent previous meeting, ensuring continuity and context.\nNext, the workflow waits until 15 minutes before the meeting starts. At that time, it extracts keywords from the meeting title and uses them to find relevant GitHub pull requests and Jira issues related to the meeting topic. These items are combined into a single, clean list.\nA well-formatted Slack message is then built, containing:\n* The meeting name and time\n* Relevant GitHub PRs and Jira tickets\n* Notes from the previous meeting\n\nFinally, the workflow looks up each attendee on Slack using their email address and sends the meeting context as a direct message. If a Slack user is not found, the workflow safely skips that attendee and continues without failing.\n\n## Setup steps\n1. Connect your Google Calendar account to detect newly created meetings\n2. Connect Notion and select the database that stores meeting notes\n3. Connect your GitHub account and choose the repository to scan for PRs\n4. Connect Jira and ensure JQL access for fetching related issues\n5. Connect your Slack account with permission to look up users and send DMs\n6. Verify attendee emails in Calendar match their Slack email addresses\n7. Activate the workflow and create a new calendar meeting to test\n"
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "84f78caa-7a3d-48ba-8985-b6a9c715a2ab",
  "connections": {
    "Fan Out Attendees": {
      "main": [
        [
          {
            "node": "Get User Slack Info from Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get PRs from Repo": {
      "main": [
        [
          {
            "node": "Filter PRs Related to Meeting",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Previous Meeting": {
      "main": [
        [
          {
            "node": "Normalize Calendar and Notion Payloads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for Time to Come": {
      "main": [
        [
          {
            "node": "Extract Meeting Keywords",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Slack User Found": {
      "main": [
        [
          {
            "node": "Send Meeting Context in Slack DM",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Last Meeting Notes": {
      "main": [
        [
          {
            "node": "Is Previous Meeting",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Message for Slack": {
      "main": [
        [
          {
            "node": "Normalize Attendees and Slack Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add 15 minute Early Time": {
      "main": [
        [
          {
            "node": "Wait for Time to Come",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Meeting Keywords": {
      "main": [
        [
          {
            "node": "Get Jira Issues Related to Meeting",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get PRs from Repo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Calenda Event Payload": {
      "main": [
        [
          {
            "node": "Get Last Meeting Notes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter PRs Related to Meeting": {
      "main": [
        [
          {
            "node": "Merge Jira Tickets and Github PR",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get User Slack Info from Email": {
      "main": [
        [
          {
            "node": "Check Slack User Found",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Jira Tickets and Github PR": {
      "main": [
        [
          {
            "node": "Prepare PRs and Jira Ticket List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare PRs and Jira Ticket List": {
      "main": [
        [
          {
            "node": "Build Message for Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Capture New Google Calendar Event": {
      "main": [
        [
          {
            "node": "Format Calenda Event Payload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Jira Issues Related to Meeting": {
      "main": [
        [
          {
            "node": "Merge Jira Tickets and Github PR",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Normalize Attendees and Slack Message": {
      "main": [
        [
          {
            "node": "Fan Out Attendees",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Calendar and Notion Payloads": {
      "main": [
        [
          {
            "node": "Add 15 minute Early Time",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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

This n8n template from Intuz provides a complete and automated solution for preparing and delivering context-rich briefings directly to attendees before every meeting.

Source: https://n8n.io/workflows/13224/ — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

Are you tired of the repetitive dance between git push, creating a pull request in GitHub, updating the corresponding task in JIRA, and then manually notifying your team in Slack, or Notion?

HTTP Request, Stop And Error, Jira +2
Slack & Telegram

This workflow is an AI-powered roto matte generation and first-pass compositing pipeline designed for VFX production. It transforms structured roto requests into multiple high-precision matte passes u

HTTP Request, Slack, Error Trigger +4
Slack & Telegram

Back Up Your N8N Workflows To Github. Uses manualTrigger, stickyNote, executeWorkflowTrigger, n8n. Event-driven trigger; 26 nodes.

Execute Workflow Trigger, n8n, HTTP Request +2
Slack & Telegram

This workflow will backup your workflows to Github. It uses the public api to export all of the workflow data using the n8n node.

Execute Workflow Trigger, n8n, HTTP Request +2
Slack & Telegram

This template is ideal for DevOps engineers, automation specialists, and n8n users who manage multiple workflows and want a reliable version control system for backups. It’s especially useful for team

n8n, HTTP Request, GitHub +1