Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.sympana.com/llms.txt

Use this file to discover all available pages before exploring further.

This page shows the complete data flow for every Sympana operation. If you’re unsure why a field is empty, which variable to use, or where data lives — start here.

Voice call data flow

Outbound call: GHL → Sympana → Voice Provider → GHL

GHL workflow reaches Place Call action

GHL sends Sympana the action data:
  • extras.locationId — which GHL location
  • extras.contactId — which contact to call
  • data.connection_id — which Sympana connection to use
  • data.contact_phone — the phone number to call
  • data.contact_name — the contact’s full name
  • data.contact_first_name, data.contact_last_name, data.contact_email

Sympana resolves everything

Sympana does the following:
  1. Finds the GHL installation for that location
  2. Loads the selected voice connection
  3. Verifies the connection is active
  4. Loads the Retell or Vapi API key
  5. Chooses the phone number (or uses Smart Selection rotation)
  6. Resolves dynamic variables (contact fields, custom fields, static values)
  7. Loads enabled functions for the connection

Sympana sends call to voice provider

Sympana sends a call request to Retell or Vapi with:
  • From number (your outbound number)
  • To number (contact’s phone)
  • Agent/assistant ID
  • Dynamic variables (injected into the agent prompt)
  • Function definitions (what tools the agent can use)
  • Webhook URL (where the provider sends results)

AI agent has the conversation

The AI agent talks to the contact. During the call, it can use functions — each function call goes: Agent → Voice Provider → Sympana → GHL → Sympana → Voice Provider → Agent.

Call ends, provider sends webhook

When the call finishes, the voice provider sends Sympana a webhook containing:
  • Call ID, status, direction
  • Full transcript
  • Recording URL
  • Call duration
  • Disconnection reason
  • Call summary and sentiment (AI-generated)
  • Custom analysis data (if post-call analysis is configured)

Sympana fires Call Completed trigger

Sympana builds the trigger payload and sends it to all subscribed GHL workflows. Your workflow receives the full call data under triggerData.

Where to find voice data in GHL workflows

After the Call Completed trigger fires, all data is available under triggerData. Here are the field paths you use in GHL workflow actions:

Most commonly used fields

GHL field pathWhat it containsExample value
triggerData.call_summaryAI summary of the call”Customer confirmed interest in the premium plan”
triggerData.call_transcriptFull word-for-word transcript”Agent: Hi John…”
triggerData.sentimentCaller sentiment”Positive”, “Negative”, “Neutral”
triggerData.call_successfulWhether the call achieved its goaltrue / false
triggerData.user_spokeWhether a real person answered (false = voicemail)true / false
triggerData.call_durationCall length in seconds180
triggerData.call_details.recording_urlLink to the call recordingURL
triggerData.call_details.disconnection_reasonWhy the call ended”customer_hung_up”, “voicemail_reached”
triggerData.call_details.directionInbound or outbound”outbound”

Contact fields

GHL field pathWhat it contains
triggerData.contactIdGHL contact ID
triggerData.customer_nameFull name
triggerData.contact_first_nameFirst name
triggerData.contact_last_nameLast name
triggerData.phoneContact phone
triggerData.emailContact email

Custom analysis fields

If your voice agent extracts structured data (configured in Retell post-call analysis), it appears in multiple formats:
GHL field pathFormatBest for
triggerData.custom_analysis_jsonJSON stringStoring in a custom field
triggerData.custom_analysis_textHuman-readable textAdding to notes or SMS
triggerData.custom_analysis_flatFlat key-value pairsBranching with If/Else on specific values
triggerData.custom_analysis_dataOriginal structureAdvanced processing

Agent and call metadata

GHL field pathWhat it contains
triggerData.call_idUnique call identifier
triggerData.agent_nameSympana connection name
triggerData.retell_agent_nameProvider agent name
triggerData.call_analysis_jsonFull provider analysis as JSON
triggerData.call_details.provider”retell” or “vapi”
triggerData.call_details.from_phoneNumber the call was placed from
triggerData.call_details.to_phoneNumber that was called
triggerData.call_details.completed_atISO timestamp of call end
triggerData.identity_statusHow the contact was matched

Messaging data flow

Inbound message: Contact → GHL → Sympana → AI → GHL

Contact sends a message

A contact sends a message through any channel (SMS, WhatsApp, Instagram, Facebook, Webchat, TikTok, Email) to your GHL number/account.

GHL receives the message

The message appears in GHL Conversations.

Sympana fires Message Received trigger

Sympana dispatches the trigger to GHL workflows with the message data.

GHL workflow processes

Your workflow decides what to do:
  • Check channel filters (SMS only? WhatsApp only?)
  • Check contact tags (has ai_msg_enabled?)
  • If conditions pass → Send AI Message action

Sympana processes the AI message

Sympana:
  1. Loads the selected messaging connection
  2. Checks Contact Access rules (allowed/blocked/handoff tags)
  3. Checks if the conversation is paused or handed off
  4. Checks for opt-out keywords
  5. Calls Retell or Vapi chat with the message + dynamic variables
  6. Gets the AI response

AI response sent through GHL

Sympana sends the AI response back through GHL Conversations on the same channel the contact used.

Where to find messaging data in GHL workflows

Message Received trigger fields

GHL field pathWhat it containsExample
triggerData.contactIdGHL contact ID”abc123”
triggerData.phoneContact phone number”+15551234567”
triggerData.customer_nameContact full name”John Doe”
triggerData.contact_first_nameFirst name”John”
triggerData.contact_last_nameLast name”Doe”
triggerData.channelMessage channel”sms”, “whatsapp”, “instagram”, “facebook”, “webchat”, “email”
triggerData.message_bodyThe message text”I’d like to schedule an appointment”
triggerData.conversation_idGHL conversation ID”conv_xyz”
triggerData.message_idMessage ID”msg_abc”
triggerData.connection_nameSympana connection name”SMS Support Agent”

Handoff Requested trigger fields

GHL field pathWhat it contains
triggerData.contactIdGHL contact ID
triggerData.phoneContact phone
triggerData.customer_nameContact name
triggerData.channelWhich channel
triggerData.handoff_reasonWhy handoff was triggered
triggerData.handoff_keyword_matchedThe keyword that matched
triggerData.last_messageThe message that triggered handoff
triggerData.conversation_idGHL conversation ID
triggerData.connection_nameSympana connection name
triggerData.message_countTotal messages in the conversation
triggerData.ai_reply_countHow many AI replies were sent

Function data flow

When the AI agent uses a function during a call or message conversation:
AI Agent → "I need to book an appointment"

Voice Provider (Retell/Vapi) → sends function call to Sympana

Sympana → reads function parameters, loads GHL token

Sympana → calls GHL API (create appointment, get contact, etc.)

GHL → returns result (appointment ID, contact data, etc.)

Sympana → formats result and sends back to voice provider

AI Agent → "I've booked your appointment for Tuesday at 2 PM"
This happens in real time during the conversation — typically under 2 seconds per function call.

Where data is stored

DataWhere it lives
Call recordingsVoice provider (Retell/Vapi) — access via recording_url
Call transcriptsPassed through Call Completed trigger — not stored by Sympana
Call metadataSympana calls table + voice provider dashboard
GHL contact dataGoHighLevel — accessed through Get Contact function
AppointmentsGoHighLevel calendars — managed through appointment functions
Message historyGHL Conversations — Sympana sends AI replies through GHL
Trigger eventsSympana ghl_trigger_events table (for debugging)
OAuth tokensSympana vault (encrypted)

Common field path mistakes

The field is triggerData.call_transcript, not triggerData.transcript. If your GHL action shows an empty value, check the exact field path.
The field is triggerData.call_summary, not triggerData.summary.
Recording URL is nested: triggerData.call_details.recording_url, NOT triggerData.recording_url.
Custom analysis only appears if you configured post-call analysis in your Retell agent settings. If you haven’t set it up, all custom_analysis_* fields will be empty.
user_spoke = false means the call went to voicemail. The call still “completed” — the voicemail just played. Use user_spoke to distinguish real conversations from voicemails.

Next steps

Workflow Recipes

Copy-paste workflows using these data fields.

Setup Checklist

Step-by-step from install to go-live.