Automation · Playbook 03

Archive unmapped call transcripts to general folder.

When a call transcript can't be matched to a specific company, it still gets archived in a shared catch-all folder for review.

Pure Operations

Reference build

Save a copy of every recorded call into one shared folder — no company resolution, no routing, no LLM. Whether the meeting is tied to a portfolio company, a fresh deal, an LP, or no record at all, the transcript lands in the same place. It's the safety net under the company-folder automation: if routing fails, the file still exists somewhere you can grep.

Why bother? A complete transcript archive is a long-term data asset. Once every call sits in one drive, you can layer search, embeddings, a chat-with-your-history app, or quarterly review tooling on top of it later. The cheapest version of "we have institutional memory" is a folder of text files.

Flow
01 · Trigger
Meeting recording ready (webhook from CRM / notetaker)
Fires with meeting_id + call_recording_id
02 · Settle delay
Wait 3 minutes
Gives the notetaker time to finish writing transcript pages before we start fetching
03 · Fetch meeting
GET /meetings/{meeting_id}
Pulls the title used for the file name
04 · Probe transcript
GET /call_recordings/{id}/transcript (first page)
Quick existence + cursor check
05 · Parse first page
Inline JS — capture raw_transcript and next_cursor
Normalizes the response so the paginator has a stable shape
06 · Fetch full transcript
Paginate every page, concatenate
Cursor-walk all pages, join with a space, insert a newline before each [hh:mm:ss] speaker turn
07 · Sanitize file name
Strip title to [a-zA-Z0-9 ], collapse whitespace, trim
SharePoint will silently reject filenames with / : * ? " < > |
08 · Upload to shared folder
Upload transcript file to the single 'all transcripts' folder
Fixed site + drive + directory. conflictBehavior = rename so duplicate titles don't overwrite.

Fields produced along the way

Deliberately small payload — this automation is one input, one output, no branching.

FieldWhat it holds
meeting_idFrom the webhook payload — used to fetch the meeting record and recording
call_recording_idFrom the webhook payload — used to walk the transcript pages
meeting_titleTitle from the meeting record — becomes the file name after sanitization
full_transcriptPaginated transcript, concatenated with a newline before each [hh:mm:ss] speaker turn
clean_titleTitle stripped to letters / numbers / single spaces — safe for SharePoint
site_id / drive_id / folder_idHardcoded pointers to the single 'all transcripts' folder

Gotchas

  • 01Settle delay matters: notetakers stamp the recording as 'ready' before the transcript pages are actually written. The 3-minute delay before the first fetch dramatically cuts empty-transcript runs.
  • 02Pagination is non-optional: the transcript endpoint cursors through pages. Without walking the cursor you silently truncate every long call to its first page.
  • 03Filename sanitization: SharePoint rejects `/ \ : * ? " < > |` and trims trailing dots. Strip to `[a-zA-Z0-9 ]+`, collapse whitespace. Without this, ~5% of uploads silently fail.
  • 04conflictBehavior = rename: two meetings with the same title don't overwrite. SharePoint appends a numeric suffix so the archive stays append-only.
  • 05Fixed destination on purpose: no company resolver, no folder search, no LLM call. This is the dumb-but-reliable sibling of the company-folder automation. Run both — this one is the safety net.
  • 06Privacy gate (if needed): if any meetings are confidential, gate this on a meeting tag or a participant-domain check before uploading. The default is 'archive everything.'

Swap matrix

Every layer is replaceable. The point is the archive, not the vendor.