Your team finishes a meeting that lasted an hour. Someone mentions action items. Everyone nods. Three weeks later, a deadline passes and nobody remembers who was supposed to own it. The notes are somewhere in Slack, maybe Google Drive. This scenario repeats across dozens of teams every week, costing organisations thousands in lost productivity because the gap between "discussion" and "action" never closes. The problem isn't that your team doesn't care about follow-through. It's that action item extraction and calendar management require manual work that nobody has time for. Someone needs to read the transcript, identify what's actionable, figure out who owns it, estimate the effort, and then manually create calendar entries and reminders. That chain of manual steps is where most teams break down. What if that entire process happened automatically, triggered the moment a meeting ended? This workflow connects three tools to turn meeting recordings into tracked, assigned, calendar-blocked action items without any human retyping. For more on this, see Turning Meeting Notes Into Action: Tools for Automating P.... For more on this, see Meeting notes to action items to calendar automation.
The Automated Workflow
This setup uses Cogram to capture meeting notes and identify action items in real time, then feeds those items into a productivity app that creates reminders, and finally syncs deadlines into your calendar via an orchestration platform. The orchestration backbone is n8n, which is lightweight enough to run on your own infrastructure but powerful enough to handle conditional logic and multi-step workflows. We're using it because it has native connectors for both Slack and calendar systems, plus the ability to call custom APIs.
How the data flows:
Cogram attends your meeting and automatically generates notes with action items flagged. Once the meeting ends, Cogram sends a webhook notification to n8n. n8n parses the action items, extracts ownership and deadlines, creates entries in your productivity app with nested AI chats (for team collaboration), and finally blocks time on the calendar systems of everyone involved.
Step 1: Set up the Cogram webhook
In Cogram's settings, configure a webhook that fires when a meeting concludes:
POST https://your-n8n-instance.com/webhook/cogram-meeting-end
Content-Type: application/json { "meeting_id": "cogram_123", "title": "Q1 Planning Session", "attendees": ["alice@company.com", "bob@company.com"], "transcript": "...", "action_items": [ { "task": "Finalise budget spreadsheet", "owner": "Alice", "due_date": "2026-03-15", "priority": "high" } ], "summary": "Discussed Q1 goals..."
}
Cogram identifies action items automatically during the meeting, so you don't have to configure extraction rules yourself. The webhook fires immediately after the meeting recording uploads.
Step 2: n8n receives and parses the webhook
Your n8n workflow starts with a Webhook trigger node listening for POST requests from Cogram:
Webhook Trigger:
- Method: POST
- Path: /webhook/cogram-meeting-end
- Response Code: 200
Next, add a Set node to structure the data for downstream steps:
Set Variables:
- meeting_title = webhook.body.title
- action_items = webhook.body.action_items
- attendees = webhook.body.attendees
Step 3: Create productivity app tasks with AI context
Use the HTTP Request node to POST each action item to your productivity app's API. Most modern productivity apps support nested AI chats, which means the system can generate discussion threads automatically for each task.
POST /api/v1/tasks
Content-Type: application/json { "title": "{{ $node['Set Variables'].data.action_items[0].task }}", "description": "From meeting: {{ $node['Set Variables'].data.meeting_title }}", "assignee": "{{ $node['Set Variables'].data.action_items[0].owner }}", "due_date": "{{ $node['Set Variables'].data.action_items[0].due_date }}", "priority": "{{ $node['Set Variables'].data.action_items[0].priority }}", "create_ai_chat": true, "chat_prompt": "This task was identified during a meeting. What are the blockers we should discuss?"
}
The create_ai_chat: true parameter tells the productivity app to start a nested AI chat thread, which can be powered by Claude Opus 4.6 or Gemini 2.5 Flash to generate an initial prompt based on the task description. This gives your team a discussion anchor without needing to set it up manually.
Step 4: Extract owner email addresses and block calendar time
Before we sync to calendars, we need to map names to email addresses. Add a conditional node that looks up each task owner in your directory:
Conditional Logic:
IF action_item.owner exists in directory THEN - Set owner_email = directory.lookup(action_item.owner)
ELSE - Log error: owner not found - Skip calendar sync for this item
Then use an HTTP Request node to create calendar blocks. The exact endpoint depends on your calendar system, but most support the CalDAV or Microsoft Graph API:
POST /graph/v1.0/me/events
Content-Type: application/json { "subject": "ACTION: {{ task_title }}", "start": { "dateTime": "{{ $node['Set Variables'].data.action_items[0].due_date }}T09:00:00", "timeZone": "UTC" }, "end": { "dateTime": "{{ $node['Set Variables'].data.action_items[0].due_date }}T10:00:00", "timeZone": "UTC" }, "categories": ["action-item", "from-cogram"], "attendees": [ { "emailAddress": { "address": "{{ owner_email }}" }, "type": "required" } ], "isReminderOn": true, "reminderMinutesBeforeStart": 1440
}
Step 5: Summarise outcomes and post to Slack
Finally, after all tasks are created and calendar entries are blocked, send a confirmation message to Slack so the team knows what happened:
POST /api/v1/chat.postMessage
Content-Type: application/json { "channel": "#meetings", "text": "📋 Meeting notes processed: {{ meeting_title }}", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*{{ meeting_title }}*\n{{ $node['Summarise'].data.summary }}" } }, { "type": "section", "text": { "type": "mrkdwn", "text": "✅ {{ created_tasks_count }} action items created\n📅 {{ created_calendar_count }} calendar blocks created" } } ]
}
The entire workflow executes in under 30 seconds from the moment Cogram sends the webhook. By the time your meeting attendees check Slack, their tasks exist, their calendars are blocked, and the AI chat threads are ready for asynchronous discussion.
The Manual Alternative
If you want more control over how action items are interpreted, you can pause the workflow and have a human review Cogram's suggestions before they're committed to the productivity app. Replace the direct HTTP Request node with a Slack message asking for approval:
Slack: Send approval request
- Message: "Cogram found 3 action items. Review and approve before they're added to tasks?"
- Include action items as blocks with Approve/Reject buttons
Then use a Wait node to hold the workflow until someone clicks Approve. After approval, the workflow continues to create the tasks and calendar entries. This adds 5-10 minutes of overhead but gives you a safety net if Cogram misinterprets ownership or dates. Alternatively, you can route all action items to Smmry first to generate a condensed summary of the full meeting, which acts as a second check that nothing critical was missed:
POST https://api.smmry.com/summarise
- api_key: YOUR_API_KEY
- sm_api_input: {{ meeting_transcript }}
- sm_api_sm: 3
Use the summary output as context for the Slack approval message so reviewers have both the raw action items and the condensed context.
Pro Tips
1. Handle name variations in owner mapping.
Cogram might identify "Alex" while your directory lists "Alexander Chen". Use fuzzy matching in your conditional logic to score name similarity, then alert the team if confidence is below 80 per cent. Claude Opus 4.6 is good at this kind of fuzzy matching if you're running it in n8n.
2. Set conservative due date defaults.
If Cogram can't find an explicit deadline, don't guess. Instead, add 5 working days to the meeting date and tag the task with a "needs due date" label. This prevents tasks being silently lost because someone assumed they were due next week.
3. Respect rate limits on calendar APIs.
If you have 50+ attendees across multiple meetings per day, you'll hit Microsoft Graph API or Google Calendar rate limits. Batch calendar creation requests and spread them across 60 seconds using n8n's Loop Over Items node with built-in delays.
4. Log everything to a database.
Every time the workflow runs, insert a record into a simple SQLite or PostgreSQL table with the meeting ID, action items created, calendar entries, and any errors. This gives you an audit trail and lets you quickly recover if something fails partway through.
5. Exclude recurring calendar blocks.
If your team has "sprint planning" every Tuesday, you don't want action items from that recurring meeting to create duplicate calendar entries across multiple weeks. Add a tag to Cogram meetings that happen on recurring meeting slots, then skip calendar creation for those items (rely on the task in your productivity app instead).
Cost Breakdown
| Tool | Plan Needed | Monthly Cost | Notes |
|---|---|---|---|
| Cogram | Pro | £299 | Unlimited meeting recordings and action item extraction; includes webhook API |
| n8n Cloud | Starter | £29 | 5000 workflow runs per month; sufficient for up to 50 meetings per month |
| Productivity app | Standard | £12-25 | Most plans include task creation API and nested AI chat features |
| Calendar API | Included | £0 | Google Workspace or Microsoft 365 calendars use included quotas |
| Slack API | Included | £0 | Standard Slack workspace plan includes webhook and posting quotas |
| Optional: Claude API | Pay-as-you-go | £5-15 | Only if you run Claude Opus 4.6 for name matching or task summarisation |
| Total (minimal setup) | £340-365 | Enough for 50+ meetings monthly with no manual action item processing | |
| Total (with Claude) | £350-380 | Adds AI-powered fuzzy matching and task analysis |