Pipeline Stages
Every meeting, regardless of its source, passes through the same pipeline:1. Normalize
Raw data from each provider is mapped to a common meeting format:| Field | Description |
|---|---|
| Title | Meeting name |
| Transcript | Speaker-attributed text segments |
| Participants | Name, email, role (internal/external) |
| Duration | Meeting length |
| Platform | Source platform identifier |
| Platform Meeting ID | Provider-specific unique identifier |
| Summary | Provider-supplied summary (if available) |
| Action Items | Provider-supplied action items (if available) |
- Gong maps speaker IDs to participant names and categorizes them as internal/external
- Fathom preserves its own summaries and action items
- Fireflies groups sentence-level transcript data into speaker segments
- Attention flattens JSON transcript structures and computes duration from stream timestamps
- Granola lazy-fetches full transcripts for notes that don’t include them
2. Summarize
If the provider already supplied a summary (Fathom, Fireflies, Granola), it is preserved. Otherwise, the LLM generates a summary from the full transcript. The summarization prompt instructs the model to produce a concise overview of the meeting covering key discussion points, decisions, and outcomes.3. Extract Action Items
If the provider supplied action items, they are preserved. Otherwise, the LLM extracts them from the transcript. The extraction identifies:- Action text — What needs to be done
- Owner — Who is responsible (when identifiable from the conversation)
4. Coaching Analysis
Every meeting gets coaching analysis, regardless of source. This is computed from the transcript segments: Quantitative metrics:| Metric | Calculation |
|---|---|
| Talk ratio | Primary speaker’s total segment duration / total meeting duration |
| Filler word count | Regex detection of 12 filler words/phrases across primary speaker segments |
| Speaking speed (WPM) | Primary speaker’s total words / speaking duration in minutes |
| Interactivity score | Based on frequency of speaker transitions |
| Longest monologue | Duration of the primary speaker’s longest uninterrupted segment |
| Question count | Sentences ending with ? in primary speaker segments |
5. Store
The meeting is saved to the MySQL database with deduplication based on a composite key:{platform}:{platformMeetingId}. If a meeting with the same composite key already exists, it is not duplicated — re-syncing is safe.
Pipeline by Source
| Source | Trigger | Summary Source | Action Items Source |
|---|---|---|---|
| Desktop recording (Recall SDK) | sdk_upload.complete webhook | LLM-generated | LLM-extracted |
| Gong | Manual sync | LLM-generated | LLM-extracted |
| Fathom (sync) | Manual sync | Fathom-provided | Fathom-provided |
| Fathom (webhook) | meeting.content_ready webhook | Fathom-provided | Fathom-provided |
| Fireflies | Manual sync | Fireflies-provided (with LLM fallback) | Fireflies-provided (with LLM fallback) |
| Attention | Manual sync | LLM-generated | LLM-extracted |
| Granola | Manual sync | Granola-provided (with LLM fallback) | LLM-extracted |
LLM Configuration
The AI layer supports two providers:| Provider | Default Model | JSON Mode |
|---|---|---|
| OpenAI | gpt-4o | Native response_format: json_object |
| Anthropic | Configurable | Instruction-based JSON extraction |
LLM_PROVIDER and LLM_MODEL environment variables. A stub implementation is available for environments without LLM access.
Post-Pipeline Actions
After a meeting is fully processed, additional actions may be triggered:- Slack post-call briefing — If the user has Slack briefings enabled and their user is linked, a summary and action items are sent as a DM
- Meeting memory — Structured data (transcript segments, coaching data) is stored as “meeting memory” records for richer retrieval in the meeting detail view
