Search documentation

Search for pages in the documentation

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

PropertyValue
CategoryLoader
Node IDds.loadMeeting.perItem.in1.success1.error1
Input Ports1
Success Outputs1
Error Outputs1
Execution ModePer-item

Configuration

ParameterTypeRequiredDescription
meeting_idCEL ExpressionYesThe meeting plan ID to load

Meeting ID Sources

The meeting ID typically comes from the trigger:

cel
trigger.meetingPlanId

Or from upstream node output:

cel
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

json
{
  "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

FieldTypeDescription
idstringMeeting plan ID
titlestringMeeting title from calendar
startTimestring (ISO 8601)Scheduled start time
endTimestring (ISO 8601)Scheduled or actual end time
locationstringMeeting location or join URL
attendeesarrayList of meeting attendees

attendees Array Items

FieldTypeDescription
namestringAttendee's display name
emailstringAttendee's email address
responsestringCalendar response: "accepted", "declined", "tentative", "none"

callRecording Object

FieldTypeDescription
idstringRecording ID
createdAtstring (ISO 8601)When recording was processed
durationnumberRecording duration in seconds
transcriptSummarystringAI-generated summary of transcript
transcriptstringFull transcript text
keyStatementsarrayNotable statements extracted by AI
insightsobjectAI-generated meeting insights

keyStatements Array Items

FieldTypeDescription
speakerstringWho said it
textstringWhat was said
timestampstringWhen in the recording (HH:MM:SS)
sentimentScorenumberSentiment (-1 to 1, positive = positive sentiment)
classificationstringType: "decision", "question", "concern", "action", etc.

Error Output

json
{
  "error": "MEETING_NOT_FOUND",
  "message": "Meeting with ID mp_abc123 not found",
  "meetingId": "mp_abc123"
}
Error CodeDescription
MEETING_NOT_FOUNDNo meeting exists with this ID
NO_RECORDINGMeeting exists but has no recording yet
PERMISSION_DENIEDUser doesn't have access to this meeting
TRANSCRIPT_PENDINGRecording exists but transcript is still processing

Examples

Basic Example: Load After Trigger

Load meeting data immediately after trigger fires:

text
[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:

liquid
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:

liquid
šŸ“‹ *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:

text
[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:

liquid
{% 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:

cel
trigger.meetingPlanId

āŒ Incorrect:

cel
"mp_hardcoded123"  // Never hardcode meeting IDs

2. Handle Error Output

Connect the error output for graceful handling:

text
[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:

text
[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:

liquid
{% 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:

  1. Verify the meeting ID is correct (trigger.meetingPlanId)
  2. Check the meeting exists in Decision Site
  3. Ensure the workflow's organization matches the meeting's organization

Empty transcript

Symptoms: callRecording.transcript is empty or null

Solutions:

  1. Add a Wait node before Load Meeting (2-5 minutes)
  2. Check if the meeting was recorded
  3. Verify transcription is enabled for your account

Missing attendees

Symptoms: attendees array is empty

Solutions:

  1. Check calendar event has attendees
  2. Verify calendar sync is working
  3. 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)

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