How to Automate Meeting Follow-Ups Without Losing Your Mind
Last month, I found myself in the familiar, frustrating cycle of post-meeting chaos. We’d just wrapped a critical sprint planning session. Everyone agreed on action items, owners, and deadlines. Then, the meeting ended, and the collective memory of who was doing what started to evaporate. I knew I needed a better system for how to automate meeting follow-ups, because manually sifting through notes, drafting emails, and chasing people down was eating up hours I didn’t have.
I’ve built enough AI agents in production to know that the promise often outstrips the reality. Agents fail silently, they loop endlessly, and they can rack up API costs faster than you can say “hallucination.” So, when I set out to tackle meeting follow-ups, I wasn’t looking for a magic bullet. I wanted something practical, something that actually worked without requiring constant babysitting.
The Old Way: Why Manual Summaries and Basic Integrations Fall Short
For years, my approach was simple: take copious notes, then spend 30 minutes after the call typing up a summary and action items. It’s tedious, prone to human error, and frankly, a waste of my time. I tried basic calendar integrations that would just send a generic “Thanks for attending!” email, but those are useless. They don’t capture the nuance, the decisions, or the specific tasks assigned.
Some folks try to use simple Zapier or n8n flows. You might connect your calendar to a Google Doc, but that’s just moving the notes, not processing them. You still have to read through everything and extract the relevant bits. It’s a step, but it’s not automation. It’s just a different kind of manual labor.
The real problem isn’t just getting the words down; it’s understanding them. It’s identifying who said what, what constitutes an action item versus a general discussion point, and then formatting that into something actionable for everyone involved. That’s where the agent approach starts to make sense.
Building a Smarter Follow-Up System: My Agent-Based Approach
My goal was to create a system that could listen to a meeting, summarize it, pull out action items, assign them to the correct people, and draft a coherent follow-up email. Here’s the stack I ended up with:
- Transcription: This is non-negotiable. You need accurate text from your audio. I’ve used a few services, but Otter.ai is my go-to for this. It integrates with Zoom, Google Meet, and Teams, and its transcription quality is generally excellent. The free tier is enough for solo work, but for team meetings, you’ll want a paid plan. Their Business plan, at $20/user/month, is fair for the time it saves.
- Orchestration: I used n8n for connecting everything. It’s a self-hostable alternative to Zapier, giving me more control and often lower costs for high volumes. My n8n workflow triggers after a meeting recording is available from Otter.ai.
- Agent Framework: This is where the real work happens. I prototyped with Vercel AI SDK for quick iterations, but for production, I settled on a custom agent built with LangGraph. CrewAI is another solid option if you prefer a more declarative, role-based approach. I defined a series of states:
- Transcribe & Ingest: Pull the raw transcript from Otter.ai.
- Summarize: Generate a concise summary of the meeting’s key discussion points.
- Extract Action Items: This is the trickiest part. The agent needs to identify explicit tasks, implicit commitments, and the person responsible.
- Draft Follow-Up: Assemble the summary and action items into a professional email format.
- Review & Send (Human-in-the-Loop): This is critical. The agent drafts, but a human reviews before sending. I’ve seen too many agent-generated emails go out with embarrassing errors.
Here’s a simplified look at the core prompt I used for action item extraction within my LangGraph agent. It’s not just a single prompt; it’s part of a larger chain that refines the output:
You are an expert meeting assistant. Your task is to extract specific action items from the provided meeting transcript.For each action item, identify:1. **Action:** A clear, concise description of the task.2. **Owner:** The person responsible for completing the task. If uncertain, state "Unassigned".3. **Due Date (if mentioned):** The specific date or timeframe. If not mentioned, state "TBD".4. **Context:** A brief sentence explaining why this action is needed.Format your output as a JSON array of objects.Example:[ { "action": "Research new database migration tools", "owner": "Sarah", "due_date": "Next Friday", "context": "We need to evaluate options for moving off our legacy database." }]Transcript: [PASTE TRANSCRIPT HERE]
This structured prompting helps reduce hallucinations, but it doesn’t eliminate them entirely. You still need validation.