Capture call transcripts into CRM company records.
Every call your team takes lands on the right company record, fully transcribed and summarized, without a partner copying notes.
Helper code snippet
Reusable code that powers a step inside this automation — loop bodies, parsers, routers, and other glue.
- Call Transcript → CRM Note (Zapier glue) →JavaScript · call_transcript_notes.js
Five Zapier 'Run JavaScript' steps that turn a finished call recording into a clean, attendee-tagged note posted back to the CRM — transcript pagination, recording URL, and an externals-first participant block.
Reference build
A working reference build that runs in production. The moment a recorded call finishes and the transcript lands in the meetings system, the orchestrator pulls the full paginated transcript, resolves attendees, drafts structured internal call notes via LLM, gates them through a substance filter, and writes the same note onto every company in the CRM that was linked to the meeting — fan-out included. No partner copy-paste, no "did anyone write that up?".
Vendors below are our choices. The flow is roles-not-vendors; every layer swaps cleanly.
Fields produced along the way
Stable intermediate shape — every step downstream knows what to expect, even when the call had zero substance and the run terminates early.
| Field | What it holds |
|---|---|
| meeting_title | Title of the meeting from the calendar / transcript source |
| participants | Full attendee list (emails) pulled from the meeting record |
| workspace_emails | Subset of participants on the firm's own email domain |
| external_attendees | Name + email + LinkedIn for non-firm attendees (used in the notes header) |
| linked_companies | Company record IDs already linked to the meeting in CRM — the fan-out targets |
| raw_transcript | Full transcript, paginated and concatenated, with newline before each [hh:mm:ss] speaker turn |
| recording_web_url | Shareable link to the call recording, embedded into the note |
| internal_call_notes | Structured HTML notes: Key Insights · Diligence Notes · Decisions & Agreements · Next Steps |
| substance_gate | Yes/No flag from a small LLM — 'No' kills the run before any write happens |
Gotchas
The things you only learn by running this in anger across a year of calls.
- 01Pagination is non-optional: the transcript endpoint cursors through pages. A naive one-call fetch silently truncates long calls — diligence calls are the ones most likely to overflow and the ones you most need complete.
- 02Substance gate before write: a small/cheap LLM judges whether the notes are real ('Yes'/'No'). Filters out 3-minute mis-recordings, bots-only rooms, and 'sorry, wrong link' starts. Without it, the company record gets polluted with junk notes the partners learn to ignore.
- 03Workspace-vs-external split: filter participants by firm domain so the notes only profile the OTHER side of the table. Internal attendees and internal scheduling chatter are explicitly excluded from the LLM output.
- 04Participants enrichment loop: each external email is resolved to a People record, then to LinkedIn via attribute-values, with name-normalized dedup. Avoids 'Jane Smith' and 'jane smith' both showing up in the header.
- 05Output contract is HTML, not Markdown: notes are written as <b>, <br>, <ul>, <li> only — the CRM note field renders HTML but mangles Markdown. A final pass strips any stray Markdown the model leaked.
- 06Fan-out via loop step: one transcript can map to multiple linked companies (joint diligence, follow-on, partner intros). The loop creates the same note on each one — single source of truth, multiple homes.
- 07Iteration cap = 500: hard guard against runaway loops on a malformed linked_records payload.
Swap matrix
Every layer is replaceable. The orchestrator owns the wiring so the notetaker, the CRM, and the LLM all move independently.