Skip to main content
Reports for program execution monitoring and analytics.
Base path: /program-execution

Types


Get main program execution report with metrics

Error Responses:

Get paginated call history for the execution

Status Mapping: Error Responses:

Get event breakdown per attempt number

Error Responses:

Get node execution statistics

Important: This is NOT a traditional funnel. Call flows are directed graphs with:
  • Branches: DTMF nodes and condition nodes route to different paths
  • Cycles: Flows can loop back to previous nodes
We report uniqueCalls (calls that reached the node at least once) and totalExecutions (including loops), not drop-off rates.
Why uniqueCalls vs totalExecutions:
  • If a flow has a “retry menu” that loops back to the DTMF node, a single call might execute that node 3 times
  • uniqueCalls: 100 means 100 different calls reached this node
  • totalExecutions: 150 means those 100 calls executed the node 150 times total
Error Responses:

Get detailed billing report for the execution

Error Responses:

Export program execution summary as a downloadable XLSX o…

Contains 3 sheets (XLSX) or sections (CSV): Summary, Breakdown, Node Stats.
XLSX Sheets: Error Responses:

Export detailed call-level data as a downloadable XLSX or…

One row per call attempt. Columns are: fixed fields + custom attributes + dynamic node columns.
Column Layout:
Fixed Columns (18): Custom Attribute Columns (dynamic, per organization): One column per custom attribute defined for the organization (custom_attributes table), using displayName as the header. Values from contacts_custom_attributes for each contact. Empty if the contact has no value for that attribute. Dynamic Node Columns (per flow node): Columns generated from the flow graph. Skipped node types: answer, hangup.
  • Result: The execution path output (e.g. onAnswer, onComplete, branch_1)
  • Input: DTMF digits pressed by caller (from call_events)
  • Branch: Which DTMF branch was taken (from execution path)
  • Recording ID: Recording identifier (from call_recordings)
  • Transcription: Transcribed text of the recording (from call_recordings.transcriptionText)
  • Status: SMS delivery status (from sms_logs)
  • Message: Rendered SMS message body (from sms_logs.renderedMessage)
  • Parts: Number of SMS parts/segments (from sms_logs.smsParts)
  • Attribute: The contact attribute name being updated (from node.config.attributeName)
  • Current Value: Current value of the attribute for the contact (from contacts_custom_attributes)
  • Value: Final variable value (from flowExecutionData.finalVariables)
Sort Order: Contact last name ASC (nulls last), then attempt number ASC. Error Responses:

Notes

Effective Status Logic

Pause window check is computed at query time using the execution’s pauseWindows configuration. paused_no_credits and paused_threshold are stored directly in the DB and returned as-is.

Contact vs Call Metrics

Example: 1000 contacts with 2 retries = 1000 in ContactMetrics, up to 3000 in CallMetrics.

Node Stats vs Funnel

Traditional funnels assume linear flow:
Call flows are graphs with branches and cycles:
Therefore we report:
  • percentage: What % of total calls reached this node (not % of previous node)
  • totalExecutions: Includes loops (same call executing node multiple times)