Workflow: Fathom Transcript Poller
Automated polling workflow that fetches new Fathom transcripts on a schedule.
Chapter 6 — Workflow: Fathom Transcript Poller
Category: Workflows Reading time: 5 minutes
Purpose
Polls the Fathom API every 15 minutes for new meeting recordings. When a new recording is found, fetches the transcript, formats it as plain text, and saves it to the watch directory. If the matching chat log is already present, triggers the Merged Call Summarizer.
Workflow file: workflows/fathom-transcript-poller.json
n8n Workflow ID: 2
Node Flow
Schedule Trigger (every 15 min)
→ Code: Read Last Poll Time
→ HTTP Request: List Meetings (Fathom API)
→ Code: Check for New Recordings
→ HTTP Request: Fetch Transcript
→ Code: Format and Save Transcript
→ IF: Both Files Present
├── True → Execute Workflow (Merged Summarizer) → Update Poll Time
└── False → Update Poll Time
Key Nodes
Schedule Trigger
Fires every 15 minutes. This interval balances responsiveness (Fathom typically processes transcripts within 5-60 minutes) against API rate limits (60 requests/minute).
Code: Read Last Poll Time
Reads the last successful poll timestamp from /home/node/.n8n/fathom-last-poll.txt. If the file doesn’t exist (first run), defaults to 24 hours ago.
const fs = require('fs');
const pollFile = '/home/node/.n8n/fathom-last-poll.txt';
let lastPoll;
try {
lastPoll = fs.readFileSync(pollFile, 'utf8').trim();
} catch (e) {
const d = new Date();
d.setHours(d.getHours() - 24);
lastPoll = d.toISOString();
}
return { json: { lastPoll } };
HTTP Request: List Meetings
Calls GET https://api.fathom.ai/external/v1/meetings?created_after=<lastPoll>. Returns paginated results (default 10 items). Only new meetings since the last poll are returned.
Code: Check for New Recordings
Extracts the items array from the API response. Returns an empty array (stopping the workflow) if no new recordings exist. Otherwise, outputs one item per recording with recording_id, title, and timestamps.
Code: Format and Save Transcript
Transforms the Fathom transcript JSON into readable plain text:
[00:01:29] shakur: How's it going, Tom?
[00:01:30] Patrick Chouinard: Hey, hello.
Saves to /home/node/watch/YYYY-MM-DD-transcript.txt and checks if the matching chat log exists.
IF: Both Files Present
Branches based on whether both files are present. True branch triggers the summarizer via Execute Workflow. Both branches converge at the poll time update to ensure the timestamp is always updated, preventing reprocessing.
State Management
The poller persists a single piece of state: the last poll timestamp, stored as an ISO 8601 string in a plain text file. This survives container restarts (the file is in the mounted data volume).
Error Behavior
If the Fathom API is unreachable or returns an error, the workflow fails silently — the poll timestamp is not updated, so the next cycle will retry the same time range. No data is lost.