Load Meeting
Fetch meeting details, attendees, transcript, and insights
The Load Meeting node fetches comprehensive meeting data including details, attendees, call recording, transcript, and AI-generated insights. It transforms a meeting ID into rich, actionable data for your workflow.
Overview
| Property | Value |
|---|---|
| Category | Loader |
| Node ID | ds.loadMeeting.perItem.in1.success1.error1 |
| Input Ports | 1 |
| Success Outputs | 1 |
| Error Outputs | 1 |
| Execution Mode | Per-item |
Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
meeting_id | CEL Expression | Yes | The meeting plan ID to load |
Meeting ID Sources
The meeting ID typically comes from the trigger:
trigger.meetingPlanId
Or from upstream node output:
json.meetingId
Input Schema
This node expects to receive any data from upstream. The only requirement is that the meeting_id parameter can be resolved.
Output Schema
Success Output
{
"meeting": {
"id": "mp_abc123def456",
"title": "Q1 Planning Review",
"startTime": "2024-01-15T14:00:00Z",
"endTime": "2024-01-15T15:00:00Z",
"location": "https://zoom.us/j/123456789",
"attendees": [
{
"name": "John Smith",
"email": "john@example.com",
"response": "accepted"
},
{
"name": "Jane Doe",
"email": "jane@example.com",
"response": "accepted"
}
]
},
"callRecording": {
"id": "cr_xyz789",
"createdAt": "2024-01-15T15:05:00Z",
"duration": 3600,
"transcriptSummary": "The team discussed Q1 objectives, focusing on three main areas: revenue targets, product roadmap, and team expansion. Key decisions were made about prioritizing the enterprise segment.",
"transcript": "John: Welcome everyone to our Q1 planning review...",
"keyStatements": [
{
"speaker": "John Smith",
"text": "We need to focus on enterprise accounts this quarter",
"timestamp": "00:05:23",
"sentimentScore": 0.8,
"classification": "decision"
},
{
"speaker": "Jane Doe",
"text": "The timeline for the new feature is aggressive",
"timestamp": "00:12:45",
"sentimentScore": -0.2,
"classification": "concern"
}
],
"insights": {
"topics": ["Q1 planning", "revenue", "enterprise"],
"sentiment": "positive",
"actionItems": [
"Follow up with enterprise prospects",
"Schedule product roadmap review"
]
}
}
}
Output Fields
meeting Object
| Field | Type | Description |
|---|---|---|
id | string | Meeting plan ID |
title | string | Meeting title from calendar |
startTime | string (ISO 8601) | Scheduled start time |
endTime | string (ISO 8601) | Scheduled or actual end time |
location | string | Meeting location or join URL |
attendees | array | List of meeting attendees |
attendees Array Items
| Field | Type | Description |
|---|---|---|
name | string | Attendee's display name |
email | string | Attendee's email address |
response | string | Calendar response: "accepted", "declined", "tentative", "none" |
callRecording Object
| Field | Type | Description |
|---|---|---|
id | string | Recording ID |
createdAt | string (ISO 8601) | When recording was processed |
duration | number | Recording duration in seconds |
transcriptSummary | string | AI-generated summary of transcript |
transcript | string | Full transcript text |
keyStatements | array | Notable statements extracted by AI |
insights | object | AI-generated meeting insights |
keyStatements Array Items
| Field | Type | Description |
|---|---|---|
speaker | string | Who said it |
text | string | What was said |
timestamp | string | When in the recording (HH:MM:SS) |
sentimentScore | number | Sentiment (-1 to 1, positive = positive sentiment) |
classification | string | Type: "decision", "question", "concern", "action", etc. |
Error Output
{
"error": "MEETING_NOT_FOUND",
"message": "Meeting with ID mp_abc123 not found",
"meetingId": "mp_abc123"
}
| Error Code | Description |
|---|---|
MEETING_NOT_FOUND | No meeting exists with this ID |
NO_RECORDING | Meeting exists but has no recording yet |
PERMISSION_DENIED | User doesn't have access to this meeting |
TRANSCRIPT_PENDING | Recording exists but transcript is still processing |
Examples
Basic Example: Load After Trigger
Load meeting data immediately after trigger fires:
[Event Trigger: MEETING_ENDED]
ā
[Load Meeting]
meeting_id: trigger.meetingPlanId
Configuration:
- meeting_id:
trigger.meetingPlanId
Using Meeting Data
After loading, access meeting data in downstream nodes:
AI Prompt User Message:
Summarize this meeting:
Title: {{ json.meeting.title }}
Attendees: {% for a in json.meeting.attendees %}{{ a.name }}{% unless forloop.last %}, {% endunless %}{% endfor %}
Transcript:
{{ json.callRecording.transcript }}
Slack Message:
š *Meeting Recap: {{ json.meeting.title }}*
*Attendees:* {% for a in json.meeting.attendees %}{{ a.name }}{% unless forloop.last %}, {% endunless %}{% endfor %}
*Summary:*
{{ json.callRecording.transcriptSummary }}
*Key Decisions:*
{% for stmt in json.callRecording.keyStatements %}{% if stmt.classification == "decision" %}
⢠{{ stmt.text }} ({{ stmt.speaker }})
{% endif %}{% endfor %}
Advanced Example: Handle Missing Transcript
Some workflows need the transcript, which may not be immediately available:
[Event Trigger: MEETING_ENDED]
ā
[Wait: 5 minutes] ā Give time for transcript processing
ā
[Load Meeting]
ā ā
Success Error ā [Slack: "Transcript not ready"] ā [Sink]
ā
[AI Analysis]
ā
[Slack Post]
Example: Extract Specific Attendee
Get the first external attendee (non-company email):
AI Prompt:
{% assign external = nil %}
{% for a in json.meeting.attendees %}
{% unless a.email contains "@ourcompany.com" %}
{% assign external = a %}
{% break %}
{% endunless %}
{% endfor %}
{% if external %}
Contact name: {{ external.name }}
Contact email: {{ external.email }}
{% else %}
No external attendees found.
{% endif %}
Best Practices
1. Always Use Trigger's Meeting ID
For meeting-triggered workflows, always use the trigger's ID:
ā Correct:
trigger.meetingPlanId
ā Incorrect:
"mp_hardcoded123" // Never hardcode meeting IDs
2. Handle Error Output
Connect the error output for graceful handling:
[Load Meeting]
āā Success āā [Continue Processing]
āā Error āāāā [Log Error] ā [Sink]
3. Wait for Transcript When Needed
If your workflow depends on transcript content, add a brief wait:
[Trigger] ā [Wait: 2-5 min] ā [Load Meeting]
Transcript processing typically completes within minutes of meeting end.
4. Check for Missing Data
Not all fields are always populated:
{% if json.callRecording %}
Summary: {{ json.callRecording.transcriptSummary }}
{% else %}
No recording available for this meeting.
{% endif %}
Common Issues
"Meeting not found" error
Symptoms: Error output fires with MEETING_NOT_FOUND
Solutions:
- Verify the meeting ID is correct (
trigger.meetingPlanId) - Check the meeting exists in Decision Site
- Ensure the workflow's organization matches the meeting's organization
Empty transcript
Symptoms: callRecording.transcript is empty or null
Solutions:
- Add a Wait node before Load Meeting (2-5 minutes)
- Check if the meeting was recorded
- Verify transcription is enabled for your account
Missing attendees
Symptoms: attendees array is empty
Solutions:
- Check calendar event has attendees
- Verify calendar sync is working
- Attendees must be on the calendar invite
Stale data
Symptoms: Data doesn't reflect recent changes
Solutions:
- Load Meeting fetches fresh data each execution
- If data seems stale, check the source (calendar, recording system)
Related Nodes
- Event Trigger - Provides meeting ID
- AI Prompt - Process transcript with AI
- AI Agent - Complex analysis of meeting data
Technical Details
Data Sources
Load Meeting aggregates data from multiple sources:
- Meeting details: Calendar integration
- Attendees: Calendar event participants
- Recording: Decision Site recording system
- Transcript: Speech-to-text processing
- Insights: AI analysis pipeline
Processing Time
Typical availability after meeting ends:
- Meeting details: Immediate
- Attendees: Immediate
- Recording: 1-2 minutes
- Transcript: 2-5 minutes
- Insights: 3-5 minutes
Rate Limits
Load Meeting operations are subject to internal rate limits:
- Typical limit: Generous for normal usage
- If you see rate limit errors, add delays between loads