GeminiWorkPlanningAI score · 77/100AI-assisted edit · no obvious prompt-injection riskn8n.io

Automate Meeting Notes Summaries with Gemini AI and Slack Notifications

Scheduled trigger → fetch meetings from MeetGeek API → split and format → Gemini generates summary and action items → restructure to Slack Block Kit → send channel notification

Some experienceStepsWorkflowPromptTip
Who
Teams needing automated daily meeting briefs, project managers, remote or hybrid teams using Slack
You get
Automatically fetch meeting data daily, generate summaries and action items with Gemini AI, and push formatted Slack Block Kit notifications to a designated channel
You need
n8n · slack

Constraints

Prerequisites: n8n instance; credential types googlePalmApi (Gemini), slackOAuth2Api (Slack), httpBearerAuth (MeetGeek API). The source uses MeetGeek as an example note-taking tool; adapt by changing the HTTP Request node URL. The trigger runs on a schedule, adjustable in the Schedule Trigger node.

What they did

The n8n template author sayonetech created a workflow template demonstrating how to periodically fetch meeting data from a note-taking API (MeetGeek as example), generate structured summaries and action items via Gemini AI, and deliver formatted Slack Block Kit notifications. The template contains 16 nodes covering trigger, HTTP requests, data splitting and formatting, AI transform filtering, AI Agent invocation, code restructuring, and Slack delivery.

How it went

The author reports this template enables automated daily meeting briefs, reducing time spent reviewing long meeting notes. The template has 752 views on n8n.io. (Source: author_report)

Worth knowing

MeetGeek API is used as an example; adapt by changing the HTTP Request node URL. Trigger interval is adjustable in the Schedule Trigger node. Slack message formatting can be customized by editing the Code node. The AI Agent prompt supports style adjustments (short/long, formal/casual). This site has not imported or run the workflow; verify API connectivity and credential validity when building.

n8n workflow template

Structure checked · Not run-tested

Use “Import from File” in n8n, or copy the JSON and paste it into the editor. Connect your own accounts, then try test data. The template is inactive by default.

Setup and test checklist

Credentials to connect

  • Google Gemini Chat Model node: connect Google Gemini/PaLM API credentials.
  • Send a message node: connect Slack OAuth2 credentials.
  • summary node: connect HTTP Bearer Auth credentials.
  • Get meetings list node: connect HTTP Bearer Auth credentials.

Configuration to replace

  • Source template is n8n public workflow #8116 (~16 nodes). Keep inactive after import; verify triggers, expressions and external API endpoints.
  • Sticky-note guidance is informational; replace placeholders with your own accounts, sheet schemas or channel IDs.

Test input and expected output

  • Manually run the main path once in a test workspace and confirm credentialed nodes authenticate without errors.
  • Drive one synthetic/redacted sample through and check output fields and downstream writes before enabling in production.

Template changes

  • Author credential bindings, webhookId and execution data are removed; the workflow is inactive. Nodes, connections and original prompts are preserved. Not run-tested in n8n.
  • No business-logic edits; verify keys, quotas and privacy compliance before use.

Template retrieved: 2026-10-24

Steps

  1. Configure schedule trigger and meeting list API

    In the n8n workflow, add a Schedule Trigger node and set the run interval (e.g., daily). Then add an HTTP Request node (named Get meetings list in the workflow), set URL to https://api.meetgeek.ai/v1/meetings/, choose predefinedCredentialType with nodeCredentialType httpBearerAuth, and enter your MeetGeek API bearer token.

  2. Split meeting data and rename fields

    Use a Split Out node to split the meetings array into individual items. Then use an Edit Fields (Set) node to rename meeting_id to extract_meeting_id (value: {{ $json.meeting_id }}) for downstream reference. Use a Date & Time node to format timestamp_start_utc as yyyy-MM-dd while keeping other input fields.

  3. Filter meetings from the past 7 days

    Add an AI Transform node with the following auto-generated code to filter dates: read all input items, compute today and 7 days ago, keep only items where formattedDate falls within the range. The node instructions are "Filter the formatted Date in the past week upto today".

    Execution prompt · Source text。AI Transform node instructions field

    Filter the formatted Date in the past week upto today

    Execution prompt · Source text。AI Transform node jsCode field (auto-generated by n8n from instructions)

    const items = $input.all();
    const today = new Date();
    const oneWeekAgo = new Date();
    oneWeekAgo.setDate(today.getDate() - 7);
    
    const filteredItems = items.filter((item) => {
      const itemDate = new Date(item?.json?.formattedDate);
      return itemDate >= oneWeekAgo && itemDate <= today;
    });
    
    return filteredItems;
  4. Generate summary and action items with Gemini AI Agent

    Add an AI Agent node, set promptType to define, and paste the full prompt into the text field. Connect a Google Gemini Chat Model node as the language model for the AI Agent. Also add an HTTP Request Tool node (named summary in the workflow), set URL to =https://api.meetgeek.ai/v1/meetings/{{ $json.extract_meeting_id }}/summary/, authentication to httpBearerAuth, so the AI Agent can call it as a tool.

    Execution prompt · Source text。AI Agent node text field (full prompt when promptType=define)

    =# 📝 Meeting Notes Summarizer with Action Items
    
    You are an AI assistant that **summarizes meeting notes** and **extracts clear action items**.
    
    ---
    
    ## 🔹 Input Data
    - **meeting_id**: `{{ $json.extract_meeting_id }}`
    - **title**: `{{ $json.title }}`
    
    ---
    
    ## 🔹 Task Instructions
    1. Call the **Meeting Note Summary API** using the **HTTP Request node**, passing `meeting_id` as a path parameter.  
    2. For each API response, generate a summary for the corresponding meeting.  
    3. Provide a **concise summary** in **3–5 bullet points**.  
    4. Extract a structured **Action Items** list with:
       - **Task description**  
       - **Responsible person** (if mentioned, otherwise `Unassigned`)  
       - **Deadline** (if mentioned, otherwise `No deadline`)  
    5. Ensure each meeting summary **includes the meeting title** (`{{ $json.title }}`).  
    6. If the meeting notes are **empty or missing**, still return the JSON format but use:
       - `"summary": ["No summary available"]`  
       - `"action_items": []`  
    
    ---
    
    ## 🔹 Output Format (JSON)
    ```json
    {
      "title": "{{ $json.title }}",
      "summary": [
        "point 1",
        "point 2",
        "point 3"
      ],
      "action_items": [
        {
          "task": "Task description",
          "owner": "Person name / Unassigned",
          "deadline": "Date / No deadline"
        }
      ]
    }
  5. Restructure output to Slack Block Kit

    Add a Code node (named Restructure to slack block in the workflow), input is the array of AI Agent outputs. The node iterates over each note, cleans and parses the JSON, and builds a Slack Block Kit blocks array with header (meeting title), section (summary bullets), section (action items with task/owner/deadline), and divider. Falls back to default text if parsing fails.

    Execution prompt · Source text。Code node (Restructure to slack block) jsCode field

    // Input: array of note-taker outputs
    const notes = $input.all().map(item => item.json);
    
    // Slack blocks array
    let blocks = [];
    
    notes.forEach((note, index) => {
      // Clean and parse JSON inside code block
      const cleaned = note.output.replace(/```json|```/g, '').trim();
      let parsed;
    
      try {
        parsed = JSON.parse(cleaned);
      } catch (err) {
        parsed = { title: `Meeting ${index + 1}`, summary: ["Could not parse notes"], action_items: [] };
      }
    
      // Meeting header with title
      blocks.push({
        type: "header",
        text: {
          type: "plain_text",
          text: parsed.title || `Meeting ${index + 1}`
        }
      });
    
      // Summary section
      if (parsed.summary && parsed.summary.length > 0) {
        blocks.push({
          type: "section",
          text: {
            type: "mrkdwn",
            text: "*Summary:*\n" + parsed.summary.map(s => `• ${s}`).join("\n")
          }
        });
      }
    
      // Action items section
      if (parsed.action_items && parsed.action_items.length > 0) {
        blocks.push({
          type: "section",
          text: {
            type: "mrkdwn",
            text: "*Action Items:*"
          }
        });
    
        parsed.action_items.forEach(item => {
          blocks.push({
            type: "section",
            text: {
              type: "mrkdwn",
              text: `• *Task:* ${item.task || "N/A"}\n   *Owner:* ${item.owner || "Unassigned"}\n   *Deadline:* ${item.deadline || "No deadline"}`
            }
          });
        });
      } else {
        // If no action items
        blocks.push({
          type: "section",
          text: {
            type: "mrkdwn",
            text: "_No action items available_"
          }
        });
      }
    
      // Divider
      blocks.push({ type: "divider" });
    });
    
    return { blocks };
  6. Send Slack channel notification

    Add a Slack node (named Send a message in the workflow), set messageType to block, blocksUi to ={{ '{ "blocks": ' + JSON.stringify($json.blocks) + ' }' }}, channelId to your target channel (e.g., #meeting-notes), authentication to oAuth2 with Slack OAuth2 credentials. Set executeOnce to true to control send behavior. [First-test safety] Before the first test, point channelId at a test channel or a DM to yourself, or temporarily disconnect the Slack "Send a message" node; only reconnect the production channel after Block Kit output looks correct.

Prompt you can copy

Setup guidance · Editorial suggestion。Hand to setup assistant to confirm inputs and permissions first

This block is the prompt. Ads are never placed here.

You are building an n8n workflow: scheduled fetch of meeting list from MeetGeek API, Gemini AI-generated summary and action items, then push as Slack Block Kit to a channel. First confirm you have an n8n instance, MeetGeek API bearer token, Google Gemini (googlePalmApi) credentials, Slack OAuth2 credentials, and the target Slack channel ID.

Before building, prepare three credentials: MeetGeek API bearer token, Google Gemini googlePalmApi credential, and Slack OAuth2 credential.

Source

Automate meeting notes summaries with Gemini AI & Slack notifications · sayonetech · n8n.io · 2025-09-01

Comments & feedback

Tried this method? Share results, problems or improvements. Comments appear after moderation. Please avoid sensitive information.

Loading…

    Related