Stop retyping your call notes into the CRM
Fire on a Gmail label where your notetaker already drops the transcript, so you never pay for transcription. Classify the call first so internal meetings never reach your CRM. Then produce records rather than prose: a filled row, a follow-up sitting in drafts, and one task per action item. Leave an unowned item unowned, and never invent a due date.
The summary is already written. What is left is the filing, and that is the part that gets skipped on a busy week.
The summary was never the problem
Meeting notetakers solved transcription years ago and they solved summarising shortly after. The complaint that keeps surfacing is not that the summary is bad. It is that the summary is where the automation stops.
After a call the work that remains is filing: open the CRM, find the opportunity, update the stage, write the follow-up, create the tasks, and remember who said they would do what. None of that is hard. All of it is tedious, and it is the first thing dropped when the next call starts in four minutes.
So the target output is not another document. It is four things that already exist in a shape something else can use:
- A CRM row with company, attendees, stage, amount and what was decided.
- A follow-up email in drafts, addressed to the people who were on the call.
- One task per action item, with the owner named and a date only if a date was agreed.
- An account log that grows over time, so the next call starts with the last one.
Fire on a label, and never touch audio
The reason most meeting automations are not worth running is cost: speech to text is a second paid service stacked on top of the model, and it is charged per minute of every call you have.
You almost certainly do not need it. Your notetaker already transcribed the call and can email you the result. Add a Gmail filter, apply a label, and watch the label:
Otter / Fireflies / Granola / Fathom / Zoom
-> emails you the transcript
-> Gmail filter applies the label "transcripts"
-> n8n Gmail Trigger watches that label
-> one paid credential in the whole workflowSet the trigger to download attachments and read the file directly. If your tool puts the transcript in the email body instead of attaching it, point the reader at the body. Either way the audio never enters the picture, and the running cost is one model call per customer call.
Classify before you file anything
Most meetings are internal. If every transcript creates a CRM row, your pipeline fills with standups and one to ones within a week and the data stops being worth reading.
One classification step in front of everything else fixes it. Two categories is enough:
customer call someone outside the company was present:
a prospect, customer, partner or candidate
internal a team meeting, standup, one to one,
or a recording with no external partyRoute internal calls to a no-op and stop. Nothing is written, no draft is created, and no task appears. The cost is one cheap call and it prevents the slow contamination that makes people abandon CRM automation entirely.
Strip the transcript before it reaches any of this. Notetakers prefix every line with a timestamp, which burns tokens and adds nothing. Keep the speaker names, because who committed to what is the entire point:
00:14:22 Jane Doe: we can get you a pilot
[00:14:22] Jane Doe: we can get you a pilot
-> Jane Doe: we can get you a pilotThe two rules that make the records trustworthy
An unowned action item stays unowned. When a transcript shows something needs doing but nobody claimed it, the tempting move is to assign it to whoever runs the workflow. That invents a commitment. Mark it unassigned and flag it, so the gap is visible rather than papered over.
A date that was not agreed is not a date. Calls are full of next week, soon and before the end of the month. None of those are deadlines the other side accepted. Store an exact date only when one was actually stated:
dueDate = "2026-08-12" -> real, keep it
dueDate = "next week" -> not a date, store empty
and note that none was agreedBoth rules point the same way. An automated record is only worth having if you can trust it without rewatching the call, and the fastest way to lose that trust is a task with a confident owner and a confident date that nobody remembers agreeing to.
A call where nothing was decided should say so. Empty decisions and no action items is a real and common outcome, and a system that manufactures progress on a quiet call is worse than one that reports the quiet.
Assume the JSON will be malformed
Everything downstream depends on the model returning the shape it was asked for, so parse defensively. In practice three things go wrong, in order of frequency:
1. wrapped in a code fence strip the fence
2. commentary before the JSON take the outermost { ... }
3. prose, no JSON at all throw, and put the first 200
characters in the errorThe third case matters most. If a parse failure returns an empty record instead of raising, a broken run looks exactly like a meeting where nothing happened, and you will not find out for weeks.
Who this is for, and what to change
Founder-led sales
The problem. The CRM is whatever the founder remembers, and it decays across a week of calls.
What to change. Keep Sheets as the CRM until the rows prove useful. A spreadsheet that is actually filled beats a real CRM that is not, and swapping the final node later is a ten minute job.
Small sales teams
The problem. Reps write the follow-up but skip the CRM, or fill the CRM and send the follow-up two days late.
What to change. Extend the classifier to your real call types, discovery, demo, renewal, and branch the follow-up tone on it. A renewal follow-up and a first demo follow-up should not read the same.
Consultants and agencies
The problem.The commitments made on a client call are the scope, and they live in nobody's notes until they turn into an argument.
What to change. Lean on the account log. An appended document per client turns into a defensible record of what was agreed and when, which is worth more than the CRM row.
Recruiters
The problem. Candidate calls produce the same filing work, but the fields are different.
What to change. Swap the extracted facts from deal stage and amount to role, notice period and salary expectation. The rest of the workflow is unchanged.
The shape of it
Gmail Trigger: new mail on the transcripts label
-> IF a transcript actually arrived
no -> stop
-> Extract From File: read the transcript
-> Code: strip timestamps, keep speakers, trim if huge
-> Text Classifier: customer call or internal
internal -> stop, file nothing
-> Information Extractor: company, attendees, stage, amount
-> AI: decisions, open questions, owned action items, draft email
-> Code: parse defensively, normalise, build the recap
|-> Sheets: append the CRM row
| -> Markdown -> Gmail: create the draft
| -> Docs: append to the account log
\-> Split Out: one item per action
-> Google Tasks: create it
-> AggregateSeventeen nodes and one paid credential. Note the two lanes hanging off the same step rather than running in sequence: a call with no action items still files its CRM row and its draft. This is a free n8n template you can import.
Post-meeting questions, straight answers.
Why not just use the summary my notetaker already writes?
Because a summary is not a record. It sits in the notetaker's own dashboard, and the CRM, the follow-up email and the task list all still need doing by hand. The useful output of a call is a filled opportunity, an email in drafts and dated action items with owners. Those are artifacts. A summary is a document about the call rather than the work that follows it.
Do you need a transcription service for this?
No, and avoiding one is the point. If your notetaker can email the transcript, a Gmail label is the trigger and you never touch audio. That keeps the whole workflow on a single paid credential. Adding speech to text would mean a second paid service on top of the model, which is what makes most meeting automations too expensive to be worth it.
How does the transcript get into the workflow?
Set your notetaker to email you the transcript, then add a Gmail filter that applies a label to those emails. The workflow watches that label. Otter, Fireflies, Granola, Fathom and Zoom can all email a transcript or notes, and most can send to a dedicated address. If yours attaches the transcript as a file, the file is read directly. If it puts the text in the body, point the reader at the body instead.
Should every meeting create a CRM row?
No. Most of a calendar is internal, and filing standups and one to ones into your CRM is how the data becomes untrustworthy. Classify the transcript first into a customer call or an internal one, and stop internal calls before any record is written. It costs one cheap model call and prevents a category of mess that is tedious to clean up later.
What happens to an action item nobody agreed to own?
It should stay unowned and be marked as such. The tempting behaviour is to assign it to whoever ran the workflow, which quietly invents a commitment that was never made. An unowned task you can see is useful. A wrongly owned one is worse than no task, because you will trust it.
What about due dates that were never actually agreed?
Only accept a real date. If the call said next week or soon, that is not a date, and turning it into one manufactures a deadline the other side never accepted. Store an exact date when one was agreed, leave it empty otherwise, and say on the task that no date was set. Vague is honest. Precise and wrong is not.
Should the follow-up email send automatically?
No. Create it as a draft. The follow-up after a real conversation is the most reputation-sensitive email you send that week, and a model that misreads one sentence of a transcript will send something confidently wrong to a customer. Drafting removes the typing without removing the judgement, which is the trade worth making.
What if the model returns something that is not valid JSON?
Assume it will, and handle it. Models wrap JSON in code fences, add a sentence of commentary before it, or occasionally return prose. Strip fences, fall back to extracting the outermost object, and if there is still nothing parseable, fail with the first part of the reply in the error so you can see what happened. A silent failure here looks identical to a quiet meeting.
How do you handle a very long call?
Keep the opening and the close. The agenda is set at the start and the commitments are made at the end, while the middle is usually the least dense part. Trimming to a character budget and marking the record as truncated is more honest than paying for the whole thing or silently cutting the last twenty minutes, which is where the action items live.
How current is your pipeline, really?
A community of builders shipping marketing and AI automations together.
Keep reading.
Find who is writing cheques now
Funding announcements name the investor, the stage and the amount every weekday, for free. Score each one against your thesis and draft an intro that opens on their deal.
Never walk into a call cold
One page on who you are meeting, thirty minutes before. Built from their own site and free news, with the rules that stop it inventing what it could not find.
The host's email is in the feed
Apple's catalogue needs no API key and the contact address sits in the show's RSS. Filter out shows that stopped publishing, then draft a pitch that quotes a real episode.
Build the next one with us.
A community of builders shipping marketing and AI automations together.
