# Build and Automate Source: https://docs.sympana.com/automation-playbook Learn workflow structure, triggers, actions, functions, testing, and best practices for Sympana Connector.

Build

Build cleaner workflows before you scale them.

This section is the operating guide for building with Sympana Connector inside GoHighLevel. Use it to choose the right structure, place the right actions, configure functions correctly, and test before launch.

Start here if you want the right workflow structure before building anything else. Use this to decide which action belongs where and avoid messy automation logic. Review each action page for Place Call, Smart Selection, Call Completed, Fetch Call Analysis, Update Lead Timezone, and Wait Until Calling Window. Learn how functions fit into the calling experience and how to configure them well. ## Recommended order
  1. Recommended Workflow Architecture
  2. When To Use Each Trigger and Action
  3. Actions Reference
  4. Functions Overview
  5. Function setup guides
  6. Common Automation Recipes
  7. Testing Before You Go Live
  8. Best Practices
This section is designed to help you build reliable automations, reduce support headaches, and avoid scaling bad workflow structure. # Call Completed (Vapi) Source: https://docs.sympana.com/automation-triggers-actions-vapi/call-completed-vapi Use Call Completed to trigger a workflow after an AI call ends. Use **Call Completed** as a trigger to start a workflow after an AI call finishes. This is typically used to handle post-call logic such as updating the contact record, sending a follow-up message, or moving the lead to a new pipeline stage. ## Step 1. Add the trigger Create a new workflow and add **Call Completed** as the trigger. ## Step 2. Configure the trigger Select the connection or connections you want to listen for. When a call placed by one of those connections finishes, this workflow will fire. ## Step 3. Add your post-call actions After the trigger, add any actions you need. Common examples include: * Sending a follow-up SMS or email * Updating a custom field with the call result * Moving the lead to a new pipeline stage * Logging the call summary ## Best practice Keep your post-call logic in a separate workflow from your outbound call workflow. Use **Place Call** or **Place Call Smart Selection** to initiate the call, and **Call Completed** in a different workflow to handle what happens after. If something is not working the way you expect, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Fetch Call Analysis (Vapi) Source: https://docs.sympana.com/automation-triggers-actions-vapi/fetch-call-analysis-vapi Retrieve call analysis data after a call completes. Use **Fetch Call Analysis** to retrieve detailed analysis data from a completed call. This action pulls information such as the call transcript, call duration, call summary, and any custom analysis fields configured in your voice platform. ## Step 1. Add the action Add **Fetch Call Analysis** as an action in your post-call workflow, after the **Call Completed** trigger. ## Step 2. Configure the action Select which data fields you want to retrieve. Sympana Connector will fetch the analysis from your voice provider and make the data available as workflow variables. ## Step 3. Use the data After fetching, you can use the call analysis data in subsequent workflow actions such as: * Storing the transcript in a custom field * Sending the call summary via email or SMS * Using the analysis to route the lead to the right team ## Best practice Always place **Fetch Call Analysis** after a **Call Completed** trigger to ensure the call data is available. If you place it too early, the analysis may not be ready yet. If something is not working the way you expect, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Place Call Smart Selection (Vapi) Source: https://docs.sympana.com/automation-triggers-actions-vapi/place-call-smart-selection-vapi How to place a call with automatic smart connection selection. Use **Place Call Smart Selection** when you want Sympana Connector to choose the best available connection for the call automatically. This is useful when you do not want to hard-code one connection for every lead. ## Step 1. Add the action Click the plus button to add an action, then search for **Place Call Smart Selection**. ## Step 2. Configure the action Select **Place Call Smart Selection**, then choose the settings you want to use for the call. This lets Sympana Connector evaluate the available options and choose the best connection for that lead. ## Step 3. Confirm the lead has a valid phone number Save the action and make sure the lead record includes a valid phone number. ## Step 4. Test the workflow Test the workflow and confirm the call is placed successfully. If the call does not go through, make sure your Retell or Vapi account is on a paid plan. If you still have issues, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. Use this Retell link. Sign up through this link. [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) Use this Vapi link. Sign up through this link. [Vapi.ai](https://vapi.ai/?aff=Emanuel) # Place Call (Vapi) Source: https://docs.sympana.com/automation-triggers-actions-vapi/place-call-vapi Use Place Call to trigger an outbound AI call from GoHighLevel. Use **Place Call** when you want GoHighLevel to trigger an outbound call through Sympana Connector. This action is commonly used when a lead reaches a certain pipeline stage, submits a form, replies to a campaign, or hits any automation point where you want the AI to call immediately. ## Before you use this action Make sure: * Your lead has a valid phone number * Your Retell or Vapi connection is already set up * Your voice platform account is on a paid plan If your Retell or Vapi account is still on a free trial, the call will fail. Use this Retell link. Sign up through this link. [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) Use this Vapi link. Sign up through this link. [Vapi.ai](https://vapi.ai/?aff=Emanuel) ## Step 1. Add the action Add a new action in your GoHighLevel workflow and search for **Place Call**. ## Step 2. Select the connection Choose the connection you want to call from, then save the action. ## Step 3. Confirm the lead phone number Make sure the contact record has the phone number you want to call. When the workflow reaches this action, Sympana Connector will place the call using the selected connection. ## Step 4. Confirm the provider account is paid Free trial Retell or Vapi accounts cannot place real calls through Sympana Connector. ## When to use Place Call Use **Place Call** when: * You already know which connection should place the call * You want a direct outbound call from a workflow * You do not need Sympana to choose between multiple possible calling connections If you need Sympana to choose the best connection automatically, use **Place Call Smart Selection** instead. ## Best practice Use **Place Call** in your outbound or operational workflow, then use **Call Completed** in a separate post-call workflow to handle the result. If something is not working the way you expect, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Update Lead Timezone (Vapi) Source: https://docs.sympana.com/automation-triggers-actions-vapi/update-lead-timezone-vapi Automatically update the lead timezone before placing a call. Use **Update Lead Timezone** to automatically detect and update the timezone for a lead based on their phone number. This ensures that your calling window logic works correctly and that you do not call leads outside of appropriate hours. ## Step 1. Add the action Add **Update Lead Timezone** as an action in your workflow before the **Place Call** or **Wait Until Calling Window** action. ## Step 2. Save the action No additional configuration is needed. Sympana Connector will use the lead phone number to determine the timezone and update the contact record. ## When to use this action Use **Update Lead Timezone** when: * You are calling leads across multiple timezones * You want to ensure calling window compliance * Your lead records do not already have timezone data ## Best practice Place this action early in your workflow, before any time-based logic like **Wait Until Calling Window**. If something is not working the way you expect, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Wait Until Calling Window (Vapi) Source: https://docs.sympana.com/automation-triggers-actions-vapi/wait-until-calling-window-vapi Pause the workflow until the lead is within an allowed calling window. Use **Wait Until Calling Window** to pause a workflow until the lead is within an allowed calling time. This prevents your AI from calling leads too early in the morning or too late at night based on their local timezone. ## Step 1. Add the action Add **Wait Until Calling Window** to your workflow before the **Place Call** action. ## Step 2. Configure the calling window Set the start and end times for your allowed calling hours. For example, 9:00 AM to 7:00 PM. ## Step 3. Ensure timezone is set Make sure the lead has a timezone on their contact record. Use **Update Lead Timezone** before this action if needed. ## How it works When the workflow reaches this action, it checks the current time in the lead local timezone. If the current time is within the calling window, the workflow continues immediately. If not, it waits until the next available window opens. ## Best practice Always pair this action with **Update Lead Timezone** to ensure accurate timezone data. Place both actions before your **Place Call** action in the workflow. If something is not working the way you expect, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Call Completed (Retell) Source: https://docs.sympana.com/automation-triggers-actions/call-completed Use Call Completed to send finished call data into your GoHighLevel workflows. # Call Completed Use **Call Completed** when you want your GoHighLevel workflow to run after a call has finished. This trigger gives you access to post-call data such as the call summary, transcript, recording URL, sentiment, outcome fields, timestamps, and other call details that you can map into GoHighLevel actions. This is usually the best trigger for your **post-call workflow**. ### Step 1. Add a new trigger Add a new trigger in your GoHighLevel workflow. ### Step 2. Select Call Completed Search for **Call Completed** and select it. ### Step 3. Save the trigger Once you save it, your workflow can run whenever a supported Sympana call finishes. ### Step 4. Filter by agent if needed If you only want data from one specific agent, click **Add Filter**, choose **Agent Name**, set the condition to **Contains Phrase**, then enter the exact agent name you want to match. ### Step 5. Use Call Completed values in later actions Pick an action that supports custom values, such as **Add Note**, then open the custom value picker, choose **Sympana Connector**, and select **Call Completed**. ### Step 6. Choose the fields you want to use Map values like the call summary, transcript, customer details, timestamps, and recording links into your workflow. ### What each value means | Value | Meaning | | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | Call ID | The Retell call ID. Use this to identify the call. | | Call Summary | Retell’s default call summary. | | Customer Name | The customer’s name. This is usually available when the call was placed through Sympana Connector. | | Customer Email | The customer’s email. This is usually available when the call was placed through Sympana Connector. | | Customer Phone | The customer’s phone number. This is usually available when the call was placed through Sympana Connector. | | Contact ID | The GoHighLevel contact ID tied to the call. This usually appears when the lead already exists in GoHighLevel or was created through the workflow. | | Call Transcript | The full transcript or call log. | | Call Duration | The length of the call. | | Call Status | The final call status, such as ended, error, or not connected. | | Sentiment | Retell’s sentiment result. Useful, but not a perfect quality score. | | Call Successful | Retell’s default success signal for whether the call achieved its goal. | | Recording URL | A downloadable link to the call recording. | | Call Log URL | A direct link to the full call log. | | Agent Name | The name of the agent that handled the call. | | Disconnection Reason | The reason the call ended or disconnected. | | Provider | The providers involved in the call. | | From Phone | The phone number the call came from. | | To Phone | The phone number the call was sent to. | | Completed At | The time the call finished. | | Direction | Whether the call was inbound or outbound. | | Custom Analysis Text | The post-call analysis text. | | User Spoke | A true or false value showing whether the AI connected with a person. | ### Best practice Use **Call Completed** in a separate post-call workflow. That keeps your outbound workflow clean and makes debugging much easier. If something is not working the way you expect, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Fetch Call Analysis (Retell) Source: https://docs.sympana.com/automation-triggers-actions/fetch-call-analysis How to pull call analysis into your workflow after a call ends. Use **Fetch Call Analysis** when you want to pull call analysis data into your GoHighLevel workflow after a call has finished. This is useful when you want to reference call outcomes, summaries, or analysis data in later workflow steps. ## Step 1. Add the action Click the plus button to add an action, then search for **Fetch Call Analysis**. ## Step 2. Place it after the call is complete Add the action after the part of your workflow where the call has already completed. This makes sure the analysis data is available before the action tries to retrieve it. ## Step 3. Use the returned values Save the action, then use the returned values in the next workflow steps. You can use this data for notes, follow-up automation, reporting, or lead updates. ## Step 4. Test the workflow Confirm the call analysis data appears in the next steps. If the data does not appear, make sure the call has completed and the workflow order is correct. If you still have issues, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Place Call (Retell) Source: https://docs.sympana.com/automation-triggers-actions/place-call Use Place Call to trigger an outbound AI call from GoHighLevel. # Place Call Use **Place Call** when you want GoHighLevel to trigger an outbound call through Sympana Connector. This action is commonly used when a lead reaches a certain pipeline stage, submits a form, replies to a campaign, or hits any automation point where you want the AI to call immediately. ### Before you use this action Make sure: * your lead has a valid phone number * your Retell or Vapi connection is already set up * your voice platform account is on a paid plan If your Retell or Vapi account is still on a free trial, the call will fail. Use this Retell link. Sign up through this link. [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) Use this Vapi link. Sign up through this link. [Vapi.ai](https://vapi.ai/?aff=Emanuel) ### Step 1. Add the action Add a new action in your GoHighLevel workflow and search for **Place Call**. ### Step 2. Select the connection Choose the connection you want to call from, then save the action. ### Step 3. Confirm the lead phone number Make sure the contact record has the phone number you want to call. When the workflow reaches this action, Sympana Connector will place the call using the selected connection. ### Step 4. Confirm the provider account is paid Free trial Retell or Vapi accounts cannot place real calls through Sympana Connector. ### When to use Place Call Use **Place Call** when: * you already know which connection should place the call * you want a direct outbound call from a workflow * you do not need Sympana to choose between multiple possible calling connections If you need Sympana to choose the best connection automatically, use **Place Call Smart Selection** instead. ### Best practice Use **Place Call** in your outbound or operational workflow, then use **Call Completed** in a separate post-call workflow to handle summaries, notes, tags, analysis, and follow-up logic. If something is not working the way you expect, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Place Call Smart Selection (Retell) Source: https://docs.sympana.com/automation-triggers-actions/place-call-smart-selection How to place a call with automatic smart connection selection. Use **Place Call Smart Selection** when you want Sympana Connector to choose the best available connection for the call automatically. This is useful when you do not want to hard-code one connection for every lead. ## Step 1. Add the action Click the plus button to add an action, then search for **Place Call Smart Selection**. ## Step 2. Configure the action Select **Place Call Smart Selection**, then choose the settings you want to use for the call. This lets Sympana Connector evaluate the available options and choose the best connection for that lead. ## Step 3. Confirm the lead has a valid phone number Save the action and make sure the lead record includes a valid phone number. ## Step 4. Test the workflow Test the workflow and confirm the call is placed successfully. If the call does not go through, make sure your Retell or Vapi account is on a paid plan. If you still have issues, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. Use this Retell link. Sign up through this link. [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) Use this Vapi link. Sign up through this link. [Vapi.ai](https://vapi.ai/?aff=Emanuel) # Update Lead Timezone (Retell) Source: https://docs.sympana.com/automation-triggers-actions/update-lead-timezone How to update a lead timezone before running time-sensitive workflow steps. Use **Update Lead Timezone** when you want to update the lead timezone inside your workflow so later steps can use the correct local time. This is useful when you want to route follow-up steps based on the lead timezone or prepare the workflow before using time-sensitive actions. ## Step 1. Add the action Click the plus button to add an action, then search for **Update Lead Timezone**. ## Step 2. Place it before timezone-dependent actions Select **Update Lead Timezone** and add it to the workflow where you want the timezone to be updated. Most users place this before timezone-dependent call steps. ## Step 3. Confirm the lead data is usable Save the action and make sure the lead record includes the information needed for timezone matching. ## Step 4. Test the workflow Confirm the lead timezone updates before your next call action runs. If the timezone does not update as expected, review the lead data and workflow order. If you still have issues, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Wait Until Calling Window (Retell) Source: https://docs.sympana.com/automation-triggers-actions/wait-until-calling-window Use Wait Until Calling Window to delay calls until the lead can be contacted at the right local time. # Wait Until Calling Window Use **Wait Until Calling Window** when you want Sympana Connector to delay the next step in your workflow until the lead can be contacted during the right calling hours. This action is more advanced than a normal wait step because it can use the **lead’s local timezone** instead of your account timezone. That helps you: * call leads during the right hours in their timezone * stay more aligned with compliance requirements * avoid off-hour calls * improve answer rates by calling at better times ### Why this action matters A normal wait step pauses your workflow based on your account settings. **Wait Until Calling Window** is built for outbound calling workflows where timing should follow the lead, not the account. ### Step 1. Add the action Add a new action in your GoHighLevel workflow and search for **Wait Until Calling Window**. ### Step 2. Choose the timing rules Choose the timing rules you want Sympana Connector to follow. You can choose settings such as: * standard business hours * the lead’s local timezone * holiday handling * custom calling windows ### Step 3. Save the action Once saved, the workflow will wait until the configured calling window is open before continuing. ### When to use this action Use **Wait Until Calling Window** when: * you are placing outbound calls across multiple timezones * you want to avoid calling too early or too late * you want more control than a normal GoHighLevel wait step can give you ### Best practice Place this action before **Place Call** or **Place Call Smart Selection** in your outbound workflow. If something is not working the way you expect, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Best Practices Source: https://docs.sympana.com/best-practices Keep your outbound workflow and post-call workflow separate when the setup starts to grow. This makes the system easier to debug and easier to maintain. Use Update Lead Timezone before any timezone-sensitive logic. Use Wait Until Calling Window before live outbound calling when local timing matters. Use Place Call when your routing is already decided. Use Place Call Smart Selection when you want Sympana Connector to choose the best option automatically. Keep your prompts clear and simple before you make them advanced. A smaller prompt with clean function instructions usually performs better than a large prompt full of extra rules. Test one workflow path at a time. Confirm the call works. Confirm the call data returns. Confirm the functions work. Then add more complexity. Use the documentation as a system, not as separate random pages. Install first, connect the platform, configure functions, build the workflow, test the flow, then go live. If something feels unclear, slow down and isolate the issue instead of changing five things at once. That is the fastest way to find the real problem. # Common Automation Recipes Source: https://docs.sympana.com/common-automation-recipes One common recipe is a new lead follow-up workflow. A lead enters the workflow after a form submission or trigger event. The workflow checks the lead data, updates the lead timezone if needed, waits until the allowed calling window, and then places the call. Another common recipe is a post-call follow-up workflow. The call ends, Call Completed starts a second workflow, and the workflow saves notes, updates fields, tags the contact, and starts the next follow-up action based on the result of the call. Another useful recipe is an appointment booking workflow. The AI agent uses contact functions and appointment functions during the call, checks available slots, books the appointment, and then the post-call workflow saves the result inside GoHighLevel. A fourth common recipe is a no-answer or failed-call workflow. The outbound workflow places the call, the post-call workflow checks the call result, and the system triggers a new branch for text follow-up, retry logic, or manual review. Start with one simple recipe and test it end to end before combining several ideas into a larger automation. # FAQs Source: https://docs.sympana.com/faqs Quick answers to common questions about pricing, setup, support, capabilities, and limits.

FAQs

Short answers to the questions people ask most.

Use this page for quick product answers. If your issue is more specific, go to Troubleshooting, Support, or Implementation by Sympana.

Currently you cannot use your GHL phone number with Sympana Connector. Retell AI does not support GHL-issued numbers on the voice side because GHL does not support Elastic SIPs. Sympana Connector is free for most triggers and actions. Paid actions are Place Call, Place Call Smart Selection, and Wait Until Calling Window. These cost \$0.005 per execution. That is fine. If you want hands-on help getting everything set up correctly, Sympana can help implement it with you. Yes. If you want help setting up Sympana Connector, configuring workflows, or getting everything production-ready, book implementation help with Sympana. Yes. Sympana Connector is designed specifically to connect voice AI platforms like Retell and Vapi directly into GoHighLevel. For AI call workflows, yes. It connects your calling workflow directly inside GoHighLevel without needing extra middleware. Yes. You can place outbound calls, update leads, sync call data, and automate follow-up inside GoHighLevel. Yes. Free trial accounts cannot place real calls. You must be on a paid plan for calls to go through. Yes. You can map agent data into custom fields, tags, notes, or pipeline stages. Start with Troubleshooting, Support, or Help and Support. If you want hands-on help, book implementation support. If you still need help after checking these pages, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Functions Overview Source: https://docs.sympana.com/functions-overview Understand what functions do, when to use them, and how they fit into Retell and Vapi setups.

Functions

Functions let your AI agent do real work during a live call.

With Sympana Connector, functions help your Retell or Vapi agent interact with GoHighLevel data and scheduling actions instead of only talking.

Use functions to look up contacts, create new leads, or update lead data when the agent needs to confirm or save information. Use functions to retrieve slots, create bookings, review appointments, and reschedule when the call needs to complete a real scheduling task.

What matters most

If you are setting up functions in Retell or Vapi, stay inside the matching platform section instead of mixing both instruction paths. # How Data Moves Through Sympana Source: https://docs.sympana.com/guides/how-data-moves Understand exactly where data comes from, where it goes, and what field paths to use inside GHL workflows — for both voice calls and messaging. 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 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 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 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) 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. 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 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 path | What it contains | Example value | | ----------------------------------------------- | -------------------------------------------------- | ------------------------------------------------- | | `triggerData.call_summary` | AI summary of the call | "Customer confirmed interest in the premium plan" | | `triggerData.call_transcript` | Full word-for-word transcript | "Agent: Hi John..." | | `triggerData.sentiment` | Caller sentiment | "Positive", "Negative", "Neutral" | | `triggerData.call_successful` | Whether the call achieved its goal | true / false | | `triggerData.user_spoke` | Whether a real person answered (false = voicemail) | true / false | | `triggerData.call_duration` | Call length in seconds | 180 | | `triggerData.call_details.recording_url` | Link to the call recording | URL | | `triggerData.call_details.disconnection_reason` | Why the call ended | "customer\_hung\_up", "voicemail\_reached" | | `triggerData.call_details.direction` | Inbound or outbound | "outbound" | ### Contact fields | GHL field path | What it contains | | -------------------------------- | ---------------- | | `triggerData.contactId` | GHL contact ID | | `triggerData.customer_name` | Full name | | `triggerData.contact_first_name` | First name | | `triggerData.contact_last_name` | Last name | | `triggerData.phone` | Contact phone | | `triggerData.email` | Contact email | ### Custom analysis fields If your voice agent extracts structured data (configured in Retell post-call analysis), it appears in multiple formats: | GHL field path | Format | Best for | | ---------------------------------- | -------------------- | ----------------------------------------- | | `triggerData.custom_analysis_json` | JSON string | Storing in a custom field | | `triggerData.custom_analysis_text` | Human-readable text | Adding to notes or SMS | | `triggerData.custom_analysis_flat` | Flat key-value pairs | Branching with If/Else on specific values | | `triggerData.custom_analysis_data` | Original structure | Advanced processing | ### Agent and call metadata | GHL field path | What it contains | | --------------------------------------- | ------------------------------- | | `triggerData.call_id` | Unique call identifier | | `triggerData.agent_name` | Sympana connection name | | `triggerData.retell_agent_name` | Provider agent name | | `triggerData.call_analysis_json` | Full provider analysis as JSON | | `triggerData.call_details.provider` | "retell" or "vapi" | | `triggerData.call_details.from_phone` | Number the call was placed from | | `triggerData.call_details.to_phone` | Number that was called | | `triggerData.call_details.completed_at` | ISO timestamp of call end | | `triggerData.identity_status` | How the contact was matched | *** ## Messaging data flow ### Inbound message: Contact → GHL → Sympana → AI → GHL A contact sends a message through any channel (SMS, WhatsApp, Instagram, Facebook, Webchat, TikTok, Email) to your GHL number/account. The message appears in GHL Conversations. Sympana dispatches the trigger to GHL workflows with the message data. 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: 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 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 path | What it contains | Example | | -------------------------------- | ----------------------- | -------------------------------------------------------------- | | `triggerData.contactId` | GHL contact ID | "abc123" | | `triggerData.phone` | Contact phone number | "+15551234567" | | `triggerData.customer_name` | Contact full name | "John Doe" | | `triggerData.contact_first_name` | First name | "John" | | `triggerData.contact_last_name` | Last name | "Doe" | | `triggerData.channel` | Message channel | "sms", "whatsapp", "instagram", "facebook", "webchat", "email" | | `triggerData.message_body` | The message text | "I'd like to schedule an appointment" | | `triggerData.conversation_id` | GHL conversation ID | "conv\_xyz" | | `triggerData.message_id` | Message ID | "msg\_abc" | | `triggerData.connection_name` | Sympana connection name | "SMS Support Agent" | ### Handoff Requested trigger fields | GHL field path | What it contains | | ------------------------------------- | ---------------------------------- | | `triggerData.contactId` | GHL contact ID | | `triggerData.phone` | Contact phone | | `triggerData.customer_name` | Contact name | | `triggerData.channel` | Which channel | | `triggerData.handoff_reason` | Why handoff was triggered | | `triggerData.handoff_keyword_matched` | The keyword that matched | | `triggerData.last_message` | The message that triggered handoff | | `triggerData.conversation_id` | GHL conversation ID | | `triggerData.connection_name` | Sympana connection name | | `triggerData.message_count` | Total messages in the conversation | | `triggerData.ai_reply_count` | How 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 | Data | Where it lives | | ---------------- | ------------------------------------------------------------- | | Call recordings | Voice provider (Retell/Vapi) — access via `recording_url` | | Call transcripts | Passed through Call Completed trigger — not stored by Sympana | | Call metadata | Sympana `calls` table + voice provider dashboard | | GHL contact data | GoHighLevel — accessed through Get Contact function | | Appointments | GoHighLevel calendars — managed through appointment functions | | Message history | GHL Conversations — Sympana sends AI replies through GHL | | Trigger events | Sympana `ghl_trigger_events` table (for debugging) | | OAuth tokens | Sympana 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 Copy-paste workflows using these data fields. Step-by-step from install to go-live. # How to Set Up Functions in Retell Source: https://docs.sympana.com/guides/how-to-set-up-functions-in-retell Complete guide to enabling, configuring, and referencing Sympana Connector functions in your Retell AI agent — with exact prompt instructions for each function. ## Step 1: Connect Sympana to Retell Before setting up functions, make sure Sympana Connector is connected to your Retell AI account. Follow the [Connect Retell guide](https://docs.sympana.com/sympana-connector-retell/how-to-connect-sympana-to-retell-ai) if you haven't done this yet. Need a Retell account? Use this Retell link. Sign up through this link. [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) ## Step 2: Enable functions on your connection 1. Open the Sympana dashboard inside GoHighLevel 2. Go to **Connections** and click on your Retell connection (or create a new one) 3. Scroll down to the **Functions** section 4. Click each function you want to enable — a blue checkmark appears when it's on 5. Click **Save** or **Update Connection** All 11 functions are available. You don't need to enable all of them — only enable the ones your agent actually needs for its use case. ## Step 3: Link a GHL calendar (for appointment functions) If you enabled any appointment functions (Book Appointment, Get Slots, List Appointments, Reschedule, Delete), you **must** link a GHL calendar: 1. In the same connection settings, find the **Calendar** section 2. Select the GHL calendar you want appointments booked on 3. Save the connection If you skip this step, appointment functions will fail with a "No calendar configured" error. *** ## All 11 functions — what they do and how to reference them Every function below shows the **exact name** your Retell agent sees, what the function does, what data the agent needs to collect from the caller, and **the exact prompt instructions to copy into your agent**. *** ### Book Appointment **Retell function name:** `create_appointment_tool` **What it does:** Creates a new appointment on your linked GHL calendar. Finds or creates the contact, checks the slot, and books it. **What the agent needs from the caller:** * What the appointment is for (the title) * Preferred date and time **What's auto-filled (agent does NOT need to ask):** * Contact name, phone, email (from baseline variables) * Calendar ID (from your connection config) * Timezone (from the contact's GHL record or defaults to Eastern) **Copy this into your Retell agent prompt:** ``` APPOINTMENT BOOKING: When the customer wants to schedule an appointment: 1. Ask what day and time works best for them 2. ALWAYS use the get_slots_tool FIRST to check availability — never guess 3. If the slot is available, use create_appointment_tool to book it 4. Tell the customer: "You're all set! I've booked your [title] for [date] at [time]." 5. If the slot is taken, read back 2-3 available times and ask which works ``` **Accepted date formats:** `2026-04-15`, `April 15, 2026`, `4/15/2026` **Accepted time formats:** `2:30 PM`, `14:30`, `2pm`, `2:30pm` **Accepted timezone formats:** `America/New_York`, `EST`, `Eastern`, `Pacific` *** ### Get Slots (Check Availability) **Retell function name:** `get_slots_tool` **What it does:** Returns available appointment times from your GHL calendar. Checks up to 7 days ahead automatically if the requested date has no slots. **What the agent needs from the caller:** * What date they want to check (optional — defaults to tomorrow) **Copy this into your Retell agent prompt:** ``` CHECKING AVAILABILITY: ALWAYS use get_slots_tool BEFORE offering or confirming any appointment time. Never assume a time is available. When the customer asks "do you have anything on Thursday?", use get_slots_tool with that date. Read back the nearest 3 available times and ask which one works best. ``` **Returns to the agent:** A list of available time slots formatted for voice (e.g., "Wednesday Apr 16 at 2:00 PM"), the slot duration, and the next available date if the requested date is fully booked. *** ### Get Appointment **Retell function name:** `get_appointment_tool` **What it does:** Retrieves details of a specific appointment by ID. **What the agent needs:** The appointment ID (usually from a List Appointments result). **Copy this into your Retell agent prompt:** ``` If the customer asks about a specific appointment, use get_appointment_tool to retrieve the details. If you don't have the appointment ID, use list_appointment_tool first to find it. ``` *** ### List Appointments **Retell function name:** `list_appointment_tool` **What it does:** Shows all upcoming appointments for the contact on the call. Uses the contact's phone number and name automatically. **What the agent needs from the caller:** Nothing — it uses baseline variables automatically. **Copy this into your Retell agent prompt:** ``` If the customer asks about their appointments or says "when is my appointment", use list_appointment_tool to find all their upcoming bookings. Read back the date, time, and title of each one. ``` *** ### Reschedule Appointment **Retell function name:** `reschedule_appointment_tool` **What it does:** Moves an existing appointment to a new date and time. **What the agent needs from the caller:** * Which appointment to reschedule (use List Appointments to find the ID) * New preferred date and time **Copy this into your Retell agent prompt:** ``` RESCHEDULING: If the customer wants to reschedule: 1. Use list_appointment_tool to find the appointment 2. Ask what new date and time they prefer 3. Use get_slots_tool to check the new time is available 4. Use reschedule_appointment_tool with the appointment ID and new time 5. Confirm: "I've moved your appointment to [new date] at [new time]." ``` *** ### Delete Appointment **Retell function name:** `delete_appointment_tool` **What it does:** Cancels an existing appointment. **What the agent needs from the caller:** * Confirmation they want to cancel * Which appointment (use List Appointments to find the ID) **Copy this into your Retell agent prompt:** ``` CANCELING: If the customer wants to cancel an appointment: 1. Use list_appointment_tool to find the appointment 2. Confirm with the customer: "Are you sure you'd like to cancel your [title] on [date]?" 3. Only after they confirm, use delete_appointment_tool 4. Say: "Your appointment has been canceled." ``` *** ### Get Contact **Retell function name:** `get_contact_tool` **What it does:** Retrieves the full contact profile from GHL — name, email, phone, tags, timezone, custom fields, and more. **What the agent needs:** Nothing — uses the contact ID from baseline variables. Can also search by phone or email. **Copy this into your Retell agent prompt:** ``` If you need to look up the customer's information (email, tags, account details), use get_contact_tool. The contact is identified automatically from the call. ``` *** ### Create Contact **Retell function name:** `create_contact_tool` **What it does:** Creates a new contact in GHL. Useful for inbound calls where the caller is not yet in your CRM. **What the agent needs from the caller:** * First name (required) * Last name (required) * Phone number (required) * Email (optional) **Copy this into your Retell agent prompt:** ``` If the caller is not in the system (for example, a new inquiry), collect their first name, last name, phone number, and email. Then use create_contact_tool to add them to the system. ``` *** ### Update Contact Data **Retell function name:** `update_contact_data_tool` **What it does:** Updates any field on the contact record in GHL — standard fields (email, name, phone) or custom fields. **What the agent needs from the caller:** * The information to update **Standard GHL fields you can update:** `email`, `firstName`, `lastName`, `phone`, `companyName`, `address1`, `city`, `state`, `postalCode`, `country`, `website`, `timezone` **Custom fields:** Use the exact field key from GHL Settings → Custom Fields. **Copy this into your Retell agent prompt:** ``` If the customer provides new or updated information (email address, phone number, mailing address, name change), use update_contact_data_tool to save it immediately. After updating, confirm: "I've updated your [field] to [new value]." ``` *** ### Get Opportunity **Retell function name:** `get_opportunity_tool` **What it does:** Retrieves sales pipeline and deal data for the contact — deal stage, value, pipeline name. **What the agent needs:** Nothing — uses baseline variables automatically. **Copy this into your Retell agent prompt:** ``` If you need to reference the customer's account status, deal stage, or pipeline information, use get_opportunity_tool. ``` *** ### Timezone Resolver **Retell function name:** `timezone_resolver_tool` **What it does:** Determines the caller's timezone from their phone number area code, or from city/state information they provide. **What the agent needs from the caller:** Nothing (uses phone automatically), or city/state if asked. **Copy this into your Retell agent prompt:** ``` If you need to know the customer's timezone (for scheduling in the right time zone), use timezone_resolver_tool. It automatically checks their phone number's area code. If that doesn't work, ask for their city and state. ``` **Common results:** `America/New_York` (Eastern), `America/Chicago` (Central), `America/Denver` (Mountain), `America/Los_Angeles` (Pacific) *** ## Step 4: Write your prompt Your Retell agent prompt must tell the agent **when** and **how** to use each function. Copy the relevant prompt sections from above into your Retell agent prompt. **The #1 mistake:** Writing "help the customer book an appointment" without mentioning the function name. This makes the agent TALK ABOUT booking instead of ACTUALLY USING the function to book. Always say "use create\_appointment\_tool" or "use get\_slots\_tool" explicitly. ### Complete prompt example Here is a full Retell prompt that combines appointment booking and contact management: ``` You are Sarah, a friendly appointment coordinator at {{company_name}}. ## Your personality - Warm, professional, and efficient - Keep responses short and natural — this is a phone call, not an essay - Always confirm important details back to the customer ## Available tools You have access to the following functions. Use them when the situation calls for it: ### Scheduling - ALWAYS use get_slots_tool BEFORE offering any appointment time - Use create_appointment_tool to book after confirming availability - Use list_appointment_tool when a customer asks about existing appointments - Use reschedule_appointment_tool to move an appointment - Use delete_appointment_tool to cancel (always confirm with customer first) ### Contact Management - Use get_contact_tool if you need to look up customer details - Use update_contact_data_tool if the customer provides new information - Use create_contact_tool if the caller is new and not in the system ## Conversation flow 1. Greet the customer: "Hi {{contact_first_name}}, this is Sarah from {{company_name}}." 2. Ask how you can help 3. If they want to book: ask for preferred day and time, check availability, then book 4. If they want to reschedule: find their appointment, ask for new time, check, then move it 5. If they want to cancel: find the appointment, confirm, then cancel 6. Always end with: "Is there anything else I can help you with?" ## Rules - NEVER say a time is available without checking with get_slots_tool first - NEVER cancel without explicit confirmation from the customer - If a function returns an error, apologize and try again or suggest alternatives - Keep the call under 3 minutes when possible ``` ## Step 5: Test your functions 1. Create a test contact in GHL with your own phone number 2. Trigger a test call from a GHL workflow 3. During the call, test each function: * Ask "What times do you have available tomorrow?" → get\_slots\_tool should fire * Say "Book me for 2 PM" → create\_appointment\_tool should fire * Say "What appointments do I have?" → list\_appointment\_tool should fire 4. After the call, verify in GHL that the appointment was created Test one function at a time. Start with get\_contact\_tool (simplest) and work up to create\_appointment\_tool (most complex). If functions don't fire, check: 1. Is the function enabled on your connection? (blue checkmark in Sympana) 2. Does your prompt mention the function by name? 3. Is the webhook URL correct on your Retell agent? 4. Is the calendar linked (for appointment functions)? Still stuck? Join the [Sympana Discord server](https://discord.gg/QXk7ddhmZQ) for help. # How to Set Up Functions in Vapi Source: https://docs.sympana.com/guides/how-to-set-up-functions-in-vapi Complete guide to enabling, configuring, and referencing Sympana Connector functions in your Vapi assistant — with exact prompt instructions for each function. ## Step 1: Connect Sympana to Vapi Before setting up functions, make sure Sympana Connector is connected to your Vapi account. Follow the [Connect Vapi guide](https://docs.sympana.com/sympana-connector-vapi/how-to-connect-sympana-to-vapi) if you haven't done this yet. Need a Vapi account? Use this Vapi link. Sign up through this link. [Vapi.ai](https://vapi.ai/?aff=Emanuel) ## Step 2: Enable functions on your connection 1. Open the Sympana dashboard inside GoHighLevel 2. Go to **Connections** and click on your Vapi connection (or create a new one) 3. Scroll down to the **Functions** section 4. Click each function you want to enable — a blue checkmark appears when it's on 5. Click **Save** or **Update Connection** All 11 functions are available for Vapi. Only enable the ones your assistant actually needs. ## Step 3: Link a GHL calendar (for appointment functions) If you enabled any appointment functions (Book Appointment, Get Slots, List Appointments, Reschedule, Delete), you **must** link a GHL calendar: 1. In the same connection settings, find the **Calendar** section 2. Select the GHL calendar you want appointments booked on 3. Save the connection If you skip this step, appointment functions will fail with a "No calendar configured" error. *** ## All 11 functions — what they do and how to reference them Every function below shows what it does, what data the assistant needs to collect, and **the exact prompt instructions to copy into your Vapi assistant**. Vapi uses `assistantOverrides` to inject variables. Sympana handles this automatically — you just need to write clear prompt instructions. *** ### Book Appointment **What it does:** Creates a new appointment on your linked GHL calendar. **What the assistant needs from the caller:** * What the appointment is for (the title) * Preferred date and time **What's auto-filled:** Contact name, phone, email, calendar, timezone. **Copy this into your Vapi assistant prompt:** ``` APPOINTMENT BOOKING: When the customer wants to schedule an appointment: 1. Ask what day and time works best for them 2. ALWAYS check availability FIRST — never guess if a time is open 3. If the slot is available, book the appointment 4. Tell the customer: "You're all set! I've booked your [title] for [date] at [time]." 5. If the slot is taken, read back 2-3 available times and ask which works ``` *** ### Get Slots (Check Availability) **What it does:** Returns available appointment times from your GHL calendar. Checks up to 7 days ahead automatically. **Copy this into your Vapi assistant prompt:** ``` CHECKING AVAILABILITY: ALWAYS check available time slots BEFORE offering or confirming any appointment. Never assume a time is available. When the customer asks about a day, check availability for that date. Read back the nearest 3 available times. ``` *** ### Get Appointment **What it does:** Retrieves details of a specific appointment. **Copy this into your Vapi assistant prompt:** ``` If the customer asks about a specific appointment, retrieve the details. If you don't have the appointment ID, list their appointments first. ``` *** ### List Appointments **What it does:** Shows all upcoming appointments for the caller. Uses their contact info automatically. **Copy this into your Vapi assistant prompt:** ``` If the customer asks "when is my appointment" or "what appointments do I have", list all their upcoming bookings. Read back the date, time, and title of each. ``` *** ### Reschedule Appointment **What it does:** Moves an existing appointment to a new date and time. **Copy this into your Vapi assistant prompt:** ``` RESCHEDULING: 1. List the customer's appointments to find which one 2. Ask what new date and time they prefer 3. Check availability for the new time 4. Reschedule the appointment 5. Confirm: "I've moved your appointment to [new date] at [new time]." ``` *** ### Delete Appointment **What it does:** Cancels an existing appointment. **Copy this into your Vapi assistant prompt:** ``` CANCELING: 1. List the customer's appointments to find which one 2. Confirm: "Are you sure you'd like to cancel your [title] on [date]?" 3. Only after they confirm, cancel the appointment 4. Say: "Your appointment has been canceled." ``` *** ### Get Contact **What it does:** Retrieves the full contact profile from GHL. **Copy this into your Vapi assistant prompt:** ``` If you need to look up the customer's information, use the contact lookup. The contact is identified automatically from the call. ``` *** ### Create Contact **What it does:** Creates a new contact in GHL. **Copy this into your Vapi assistant prompt:** ``` If the caller is new and not in the system, collect their first name, last name, phone number, and email, then create a new contact. ``` *** ### Update Contact Data **What it does:** Updates fields on the GHL contact record. **Standard fields:** `email`, `firstName`, `lastName`, `phone`, `companyName`, `address1`, `city`, `state`, `postalCode`, `country`, `website`, `timezone` **Copy this into your Vapi assistant prompt:** ``` If the customer provides new or updated information (email, phone, address, name), save it immediately. Confirm: "I've updated your [field] to [new value]." ``` *** ### Get Opportunity **What it does:** Retrieves sales pipeline and deal data for the contact. **Copy this into your Vapi assistant prompt:** ``` If you need to reference the customer's account status or deal information, retrieve their opportunity data. ``` *** ### Timezone Resolver **What it does:** Determines the caller's timezone from their phone number area code. **Copy this into your Vapi assistant prompt:** ``` If you need to know the customer's timezone for scheduling, resolve it from their phone number. If that doesn't work, ask for their city and state. ``` *** ## Step 4: Write your prompt Your Vapi assistant prompt must tell the assistant **when** and **how** to use each function. **The #1 mistake:** Writing "help the customer book an appointment" without specifying to use the booking function. The assistant will TALK ABOUT booking instead of ACTUALLY booking. Always give explicit instructions to use each function. ### Complete prompt example ``` You are Alex, a friendly appointment coordinator at {{company_name}}. ## Your personality - Warm, professional, and efficient - Keep responses short — this is a phone call, not an essay - Always confirm important details back to the customer ## Scheduling - ALWAYS check available time slots BEFORE offering any appointment time - After confirming a time is open, book the appointment - If a time is taken, read back 2-3 alternatives from the availability check - For rescheduling: find the appointment, ask for new time, check, then move it - For canceling: find the appointment, confirm with customer, then cancel ## Contact Management - Look up customer details if needed - Save any new information the customer provides (email, phone, address) - Create a new contact if the caller is not in the system ## Conversation flow 1. Greet: "Hi {{contact_first_name}}, this is Alex from {{company_name}}." 2. Ask how you can help 3. Handle their request using the appropriate functions 4. End with: "Is there anything else I can help you with?" ## Rules - NEVER say a time is available without checking first - NEVER cancel without explicit confirmation - If something goes wrong, apologize and try again - Keep the call under 3 minutes ``` ## Step 5: Test your functions 1. Create a test contact in GHL with your phone number 2. Trigger a test call from a GHL workflow 3. Test each function during the call 4. Verify actions were taken in GHL after the call Unlike Retell test calls, Vapi test calls are real calls and may incur charges on your Vapi account. Still stuck? Join the [Sympana Discord server](https://discord.gg/QXk7ddhmZQ) for help. # Messaging Connection Setup Source: https://docs.sympana.com/guides/messaging-connection-setup Create a messaging AI connection in Sympana Connector to let your Retell or Vapi agent respond to inbound messages in GoHighLevel. ## What is a messaging connection? A messaging connection links a **messaging AI agent** (Retell or Vapi) to your GHL location. When an inbound message arrives (SMS, WhatsApp, Instagram, etc.), a GHL workflow can route it to your messaging connection, and the AI reads the message, generates a response, and sends it back through GHL Conversations. Messaging connections are separate from voice connections. A voice connection handles phone calls. A messaging connection handles text-based conversations. Create one of each if your AI handles both. *** ## Create a messaging connection In the Sympana dashboard, open the **Retell** or **Vapi** page. Click the **Messaging** tab at the top of the page (next to Voice). Click the button to create a new messaging connection. Give it a clear name like "SMS Support Agent" or "WhatsApp Sales Bot." Choose the Retell or Vapi agent that will handle messages. This should be an agent configured for text conversations, not voice. Only needed if the messaging agent uses appointment functions (Book Appointment, Get Slots, etc.). Skip this if the agent only handles general conversations. Set up who the AI is allowed to message. See [Contact Access](#contact-access) below. Choose which functions the messaging agent can use — same 11 functions as voice connections (Book Appointment, Get Contact, Update Contact Data, etc.). Add variables the agent needs in its prompt — contact name, email, custom fields, etc. Set up keywords and rules for when the AI should stop and hand off to a human. See [Human Handoff](#human-handoff) below. Click **Save** or **Create Connection**. The connection is now available for use in GHL workflows. *** ## Contact Access Contact Access controls **who** the messaging AI is allowed to talk to. This prevents your AI from responding to contacts it shouldn't. | Setting | What it does | | -------------------- | ----------------------------------------------------------------------------------------------------- | | **Allowed Tags** | If set, only contacts with at least one of these tags receive AI replies. Everyone else is skipped. | | **Blocked Tags** | Contacts with any of these tags are skipped — AI will not respond. | | **Handoff Tags** | Contacts with these tags are treated as "handed off to a human" — AI stops replying. | | **Opt-out Keywords** | Words like `stop`, `unsubscribe`, `wrong number`. If a contact sends one of these, AI stops replying. | ### Recommended setup for outbound messaging If you are sending outbound messages to contacts and want AI to handle replies: 1. Add a tag like `ai_msg_enabled` to the contacts you want AI to respond to 2. In the **Message Received** workflow, only call **Send AI Message** if the contact has the `ai_msg_enabled` tag 3. If a contact opts out, apply `ai_msg_blocked` and remove `ai_msg_enabled` 4. If a contact asks for a human, apply `ai_msg_handoff` to stop AI replies Contact Access is your safety net. It ensures the AI only talks to people you've explicitly approved, preventing unwanted automated responses. *** ## Human Handoff Human handoff pauses AI responses when a contact asks for a real person or when a human team member manually replies. ### How it works The contact sends something like "I want to talk to a person" or "Can I speak to someone?" Sympana checks the message against your configured handoff keywords. The conversation is marked as handed off. The AI stops replying to this contact. Sympana fires the **Handoff Requested** trigger into GHL so your workflow can take action. A team member replies manually inside GHL Conversations. ### Recommended handoff workflow Build this GHL workflow to handle handoffs: ``` Trigger: Handoff Requested (Sympana) → Action: Add Tag "ai_msg_handoff" → Action: Assign contact to team member → Action: Send internal notification (SMS/email to your team) → Optional: Create Task "Follow up with {{contact_first_name}}" ``` *** ## Messaging workflow After creating a messaging connection, build a GHL workflow to use it: In GHL, go to **Automation → Workflows** and create a new workflow. Search for **Message Received** under Sympana Connector. Filter by channel if you only want to handle specific message types: SMS, WhatsApp, Instagram, Facebook, Webchat, TikTok, or Email. If no channel filter is applied, the workflow responds to ALL inbound message channels. Channel filtering belongs in the GHL trigger, not in the messaging connection itself. Add an If/Else condition to check for the `ai_msg_enabled` tag before sending to AI. Search for **Send AI Message** under Sympana Connector. Select your messaging connection. Publish the workflow and send a test message to verify the AI responds. ### Complete messaging workflow example ``` Trigger: Message Received (Sympana) → Filter: Channel = SMS → If/Else: Contact has tag "ai_msg_enabled" → Yes: Action: Send AI Message (Sympana — SMS Support Agent) → No: Do nothing (or notify team) ``` *** ## Next steps See every Sympana action and trigger available in GHL. Set up the functions your messaging agent can use. # Setup Checklist Source: https://docs.sympana.com/guides/setup-checklist Step-by-step checklist to get Sympana Connector fully set up — from install to your first live call and message. Use this checklist to set up Sympana Connector from scratch. Complete each step in order. *** ## Phase 1: Install Go to **Settings → Integrations → Marketplace** in GoHighLevel. Search for **Sympana Connector** and install it on your sub-account/location. Approve all requested permissions. After installing, open the Sympana Connector app from your GHL sidebar or custom menu link. If you see "Installation Required," click the install/reconnect button. You should see the Sympana dashboard with options for Retell, Vapi, or AnyReach. If the page loads, you're installed. *** ## Phase 2: Connect your voice provider If you do not have a provider account yet, sign up first: **Retell:** Use this Retell link. Sign up through this link: [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) **Vapi:** Use this Vapi link. Sign up through this link: [Vapi.ai](https://vapi.ai/?aff=Emanuel) Click **Retell** or **Vapi** in the Sympana dashboard. Enter your voice provider API key and save. If you still need a provider account, use the matching signup link above before you paste an API key. After saving the API key, your available agents/assistants should appear in the dropdown. If they don't, check that the API key is correct. *** ## Phase 3: Create a voice connection Click **Add Voice Connection**. Fill in: * **Connection name** (e.g., "Sales Outbound Agent") * **Agent** — select your voice AI agent * **Phone number** — select the number to call from Select a GHL calendar. Required for Book Appointment, Get Slots, and other appointment functions. Click the functions your agent needs (Book Appointment, Get Contact, Update Contact Data, etc.). Blue checkmark = enabled. Add variables if your agent prompt needs GHL contact data (name, email, custom fields). Save the connection. Make sure the status shows **Active**. *** ## Phase 4: Create a messaging connection (optional) In the Sympana dashboard, switch to the **Messaging** tab. Click **Add Messaging Connection**. Select your messaging AI agent, configure Contact Access rules, and enable functions. Set up handoff keywords so the AI knows when to stop and pass to a human. Save and activate the messaging connection. See the full guide: [Messaging Connection Setup](https://docs.sympana.com/guides/messaging-connection-setup) *** ## Phase 5: Build GHL workflows ### Voice workflow Go to **Automation → Workflows → Create Workflow**. Choose what starts the workflow (Contact Created, Tag Added, Form Submitted, etc.). Search for **Place Call** under Sympana Connector. Select your voice connection. If calls should only happen during business hours, add this action BEFORE Place Call. Publish the workflow. ### Post-call workflow Create a new workflow for handling call results. Search for **Call Completed** under Sympana Connector. Use the call data to: send SMS, update contact, add tags, move pipeline stages, create tasks. Publish the workflow. ### Messaging workflow Create a new workflow. Search for **Message Received** under Sympana Connector. Add channel filters if needed. Select your messaging connection. Publish the workflow. *** ## Phase 6: Test Create a test contact with your phone number. Trigger the workflow. Verify: * Call connects and agent responds * Functions work (ask to book an appointment) * Call Completed trigger fires (check second workflow) Send a test inbound message to your GHL number. Verify: * Message Received trigger fires * AI responds through GHL Conversations * Handoff works when you say a handoff keyword Once tests pass, you're ready to run real contacts through your workflows. *** ## Quick reference | Step | What to check | | -------------------- | --------------------------------------------------- | | Install | Sympana dashboard loads without errors | | API key | Agents appear in the dropdown | | Voice connection | Status shows Active, functions have blue checkmarks | | Messaging connection | Status shows Active, Contact Access configured | | Voice workflow | Call connects, functions work, Call Completed fires | | Messaging workflow | AI responds to inbound messages | | Handoff | AI stops when handoff keyword is sent | If any step fails, check the [Troubleshooting](https://docs.sympana.com/troubleshooting) page before continuing to the next step. # Workflow Recipes Source: https://docs.sympana.com/guides/workflow-recipes Copy-paste workflow configurations for the most common Sympana Connector use cases — voice calls, messaging, handoff, opt-out, and follow-up. Ready-to-use workflow recipes. Each one shows the exact trigger, actions, and configuration. *** ## Voice Recipes ### 1. Outbound voice call The simplest voice workflow — call new leads automatically. ``` Trigger: Contact Created (or Tag Added, Form Submitted, etc.) → Wait: 2 minutes → Action: Place Call (Sympana) — select your voice connection → Action: Add Tag "ai-called" ``` *** ### 2. Business hours calling Only call during safe hours in the contact's timezone. ``` Trigger: Tag Added "ready-to-call" → Action: Wait Until Calling Window (9 AM - 5 PM) → Action: Place Call Smart Selection (Sympana) ``` Wait Until Calling Window automatically pauses until the window opens. If it's already within the window, the workflow continues immediately. *** ### 3. Call completed → add note with summary Log every call's summary and transcript as a GHL contact note. ``` Trigger: Call Completed (Sympana) → Action: Add Note Body: "AI Call Summary:\n{{call_summary}}\n\nSentiment: {{sentiment}}\n\nTranscript:\n{{call_transcript}}" ``` *** ### 4. Call completed → update pipeline Move contacts through your pipeline based on call sentiment. ``` Trigger: Call Completed (Sympana) → If/Else: sentiment = "Positive" → Yes: Move to pipeline stage "Qualified" → No: → If/Else: user_spoke = false → Yes: Add Tag "voicemail" → Schedule retry in 4 hours → No: Move to pipeline stage "Needs Nurture" ``` *** ### 5. Call completed → create opportunity Create a deal in your pipeline after a successful call. ``` Trigger: Call Completed (Sympana) → If/Else: call_successful = true → Yes: Create Opportunity Pipeline: "Sales Pipeline" Stage: "Discovery Call Completed" Name: "{{contact_first_name}} {{contact_last_name}}" → No: Add Tag "no-deal" ``` *** ### 6. Missed call → AI follow-up message When a call goes to voicemail, send a follow-up text automatically. ``` Trigger: Call Completed (Sympana) → If/Else: user_spoke = false → Yes (voicemail): → Wait: 5 minutes → Send SMS: "Hi {{contact_first_name}}, we tried reaching you. Reply to this message anytime and we'll get back to you!" ``` *** ### 7. Retry unanswered calls Retry contacts who didn't answer, up to 3 attempts. ``` Trigger: Call Completed (Sympana) → If/Else: user_spoke = false AND contact does NOT have tag "call-attempt-3" → Yes: → If contact has tag "call-attempt-2": Add Tag "call-attempt-3" → Stop → If contact has tag "call-attempt-1": Remove tag, Add Tag "call-attempt-2" → Else: Add Tag "call-attempt-1" → Wait: 4 hours → Action: Place Call (Sympana) ``` *** ## Messaging Recipes ### 8. Inbound SMS → AI reply The simplest messaging workflow — AI responds to every inbound SMS. ``` Trigger: Message Received (Sympana) → Filter: Channel = SMS → Action: Send AI Message (Sympana) — select your messaging connection ``` *** ### 9. AI reply only for tagged leads Only let AI respond to contacts you've explicitly approved. ``` Trigger: Message Received (Sympana) → If/Else: Contact has tag "ai_msg_enabled" → Yes: Action: Send AI Message (Sympana) → No: Do nothing (message goes to human inbox) ``` This is the recommended pattern for outbound messaging campaigns. Only tag the contacts you intentionally outbounded with `ai_msg_enabled`. *** ### 10. Opt-out handling When a contact says "stop" or "unsubscribe", block AI and notify the team. ``` Trigger: Message Received (Sympana) → If/Else: Message body contains "stop" OR "unsubscribe" OR "remove me" → Yes: → Add Tag "ai_msg_blocked" → Remove Tag "ai_msg_enabled" → Send SMS: "You've been removed from automated messages. A team member can still reach out if needed." → No: [continue to Send AI Message] ``` *** ### 11. Human handoff notification When the AI can't help and requests a handoff, alert your team. ``` Trigger: Handoff Requested (Sympana) → Action: Add Tag "ai_msg_handoff" → Action: Assign contact to team member → Action: Send Internal Notification To: Team lead phone/email Body: "{{contact_first_name}} needs human help. Last message: {{message_body}}" → Action: Create Task Title: "Follow up with {{contact_first_name}}" Due: Today → Action: Send SMS to contact Body: "I'm connecting you with a team member now. They'll be with you shortly." ``` *** ### 12. Multi-channel AI (SMS + WhatsApp + Instagram) Handle all inbound channels with one workflow, or separate workflows per channel. **Option A: One workflow for all channels** ``` Trigger: Message Received (Sympana) — no channel filter → If/Else: Contact has tag "ai_msg_enabled" → Yes: Send AI Message → No: Do nothing ``` **Option B: Separate workflows per channel** ``` Workflow 1: Trigger: Message Received → Filter: SMS → Send AI Message (SMS messaging connection) Workflow 2: Trigger: Message Received → Filter: WhatsApp → Send AI Message (WhatsApp messaging connection) Workflow 3: Trigger: Message Received → Filter: Instagram → Send AI Message (Instagram messaging connection) ``` Channel filtering belongs in the GHL trigger, not in the Sympana messaging connection. The connection itself is provider-agnostic. *** ## Combined Recipes ### 13. Full outbound campaign with follow-up Complete campaign: call during business hours, follow up based on results, retry no-answers. ``` Workflow 1 — Place the call: Trigger: Tag Added "campaign-q2" → Action: Wait Until Calling Window (9 AM - 5 PM) → Action: Place Call Smart Selection (Sympana) Workflow 2 — Handle results: Trigger: Call Completed (Sympana) → If/Else: user_spoke = true → Yes: → If/Else: sentiment = "Positive" → Yes: Move to "Qualified" → Send SMS "Great talking with you!" → No: Add Tag "needs-nurture" → Create Task → No (voicemail): → Wait: 4 hours → Send SMS "We tried calling — reply anytime!" → Wait: 1 day → Action: Place Call (retry) Workflow 3 — Handle inbound replies: Trigger: Message Received (Sympana) → If/Else: Contact has tag "campaign-q2" → Yes: Send AI Message (Sympana) → No: Do nothing ``` *** ## Tag strategy reference | Tag | Purpose | When to apply | | ----------------- | ---------------------------------------------- | -------------------------------------------------- | | `ai_msg_enabled` | Allow AI to respond to this contact's messages | When you outbound to a contact or opt them in | | `ai_msg_blocked` | Block AI from responding | When contact opts out (stop, unsubscribe) | | `ai_msg_handoff` | AI paused, human is handling | When handoff is triggered | | `ai-called` | Track that AI made a voice call | After Place Call action | | `voicemail` | Call went to voicemail | When Call Completed fires with user\_spoke = false | | `campaign-{name}` | Track campaign membership | When enrolling in a campaign | *** ## Next steps Step-by-step setup from install to go-live. Reference for every Sympana action and trigger. # Help and Support Source: https://docs.sympana.com/help-and-support Troubleshooting, self-serve help, official support resources, implementation help, and FAQs for Sympana Connector.

Support

Get unstuck fast, then choose the right kind of help.

Use this section when something is broken, when you need official resources, or when you want implementation help without wasting time guessing.

Start here if something is broken, behaving unexpectedly, or failing during setup. Use Sympana GPT or the Claude skill if you want fast self-serve guidance. Work with Sympana directly if you want hands-on setup or done-with-you help. Quick answers to the most common product questions.

Best route based on what is happening

If you still need help after checking these pages, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Implementation by Sympana Source: https://docs.sympana.com/implementation-by-sympana Book hands-on setup help if you want Sympana to help build or review your production workflow.

Hands-on help

Work with Sympana directly if you want a faster path to production.

Use this page if you want help setting up Sympana Connector, building the right workflow, and making sure the whole system is configured correctly.

Request implementation help directly with Sympana. You want help with platform setup, workflow design, functions, prompts, automation logic, or a cleaner production rollout. This is not meant for general support questions, free troubleshooting, or casual exploration.

Before you book

  1. Know what you want to build.
  2. Have access to your GoHighLevel account.
  3. Have a Retell or Vapi account if you already chose your platform.
  4. Be ready to invest in hands-on implementation help if your setup needs it.

Use this Retell link. Sign up through this link. RetellAI.com

Use this Vapi link. Sign up through this link. Vapi.ai

If you only need basic support, start with Troubleshooting, Support, or FAQs first. # Source: https://docs.sympana.com/introduction
Sympana Connector Docs

Install and launch Sympana Connector.

Install, configure, and run AI calling workflows.

Start in the GoHighLevel Marketplace and install Sympana Connector in your account. Follow the full Retell setup path from connection through functions, variables, webhook setup, and examples. Follow the full Vapi setup path from connection through functions, variables, webhook setup, and examples.
Learn the right architecture, action order, testing flow, and best practices before you scale. Learn how functions work and how to configure them without introducing brittle behavior. Work with Sympana directly if you want hands-on help getting your system live faster.

Recommended path

The fastest clean route to launch

  1. Install Sympana Connector in GoHighLevel.
  2. Choose Retell or Vapi and stay on that path.
  3. Complete the platform setup guides.
  4. Configure functions only where your workflow actually needs them.
  5. Build using the recommended workflow architecture.
  6. Test before you go live.

If you are stuck

Know where to go next

Need a quick product overview?

Start with What Sympana Connector Can Do.

Need to understand the limits?

Read What Sympana Connector Cannot Do.

Need fast self-serve help?

Use Ask AI for quick guidance alongside the docs.

Need human help?

Go to Help and Support or contact support at [support@sympana.com](mailto:support@sympana.com).

Use Sympana GPT or the Claude skill if you want the fastest self-serve help. Go here for troubleshooting, official resources, FAQs, and escalation paths.
# Platform Setup Source: https://docs.sympana.com/platform-setup Choose the right Sympana Connector platform path across Retell, Vapi, AnyReach, Smallest.ai, SigmaMind, ElevenLabs, Grok, and Bland.

Setup console

Choose your AI platform and keep the setup path clean.

Sympana Connector now supports eight platform tiles in the app console: Retell, Vapi, AnyReach, Smallest.ai, SigmaMind, ElevenLabs, Grok, and Bland. Pick the platform you are connecting, add its API key, then finish the connection, tools, variables, and webhook checks for that platform.

## Live platform roster Voice and messaging setup with full Retell walkthroughs, functions, variables, webhook setup, and examples. Voice and messaging setup with full Vapi walkthroughs, functions, variables, webhook setup, and examples. Voice and messaging agents, routing, tools, and workflow automation from the in-app provider console. Voice agent connections, phone numbers, calendars, and tool configuration from the platform picker. Voice and messaging agents, phone numbers, calendars, and tools from the platform picker. Voice agent connections, phone numbers, calendars, and tools from the platform picker. Grok voice-agent setup is available in the connector with key validation and provider routing. Voice and messaging setup is available in the connector, including Bland pathway chat support. The detailed public step-by-step documentation is currently deepest for Retell and Vapi. The app console still exposes the full eight-platform picker, provider pages, favorites, and back-to-picker navigation. ## Provider signup links **Need a Retell account?** Use this Retell link. Sign up through this link. [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) **Need a Vapi account?** Use this Vapi link. Sign up through this link. [Vapi.ai](https://vapi.ai/?aff=Emanuel) ## Recommended order

For any platform

  1. Open the platform tile from the picker.
  2. Add and validate the platform API key.
  3. Create the actual connection, not just the key.
  4. Configure calendars, phone numbers, tools, and variables.
  5. Confirm webhook and messaging behavior before going live.

What this section covers

  • Platform selection across all eight supported providers.
  • Connection setup for Retell and Vapi.
  • Function tool setup, dynamic variables, and webhook behavior.
  • Messaging setup and example scripts where available.
  • Operator notes for newly added providers.
If you only use one platform, ignore the other platform sections entirely and keep your path simple. # Recommended Workflow Architecture Source: https://docs.sympana.com/recommended-workflow-architecture Use a cleaner two-workflow structure so your Sympana Connector automations are easier to build and debug.

Architecture

Use two workflows before your automation turns into soup.

The cleanest Sympana Connector setups usually split outbound logic from post-call logic. That makes the system easier to understand, test, and debug.

Decide when a call should happen, whether the lead timezone should be updated, whether the workflow should wait for the local calling window, and whether to use Place Call or Place Call Smart Selection. Start from Call Completed and handle notes, summaries, custom fields, tags, routing, reporting, and any follow-up logic after the call ends.

Why this works better

  • If a call is not being placed, you check the outbound workflow.
  • If the call happened but the data did not flow later, you check the post-call workflow.
  • Your automation stays easier to change as the system grows.
A common flow looks like this: lead enters workflow, timezone is updated if needed, waiting logic runs if needed, the call is placed, then a second workflow starts from Call Completed and handles follow-up. Use a single workflow only when the setup is genuinely simple. Once the logic branches, split it. # Sympana Connector Build Report — July 2026 Source: https://docs.sympana.com/sympana-connector-build-report-2026-07-09 Reference report for the eight-platform provider expansion, picker rebuild, docs updates, Mission Control alignment, and SSO guard. # Sympana Connector Build Report — July 2026 A reference handoff for the provider expansion, picker rebuild, documentation pass, Mission Control alignment, and SSO guard. ## At a glance | Area | Status | Notes | | ------------------ | ------------ | ----------------------------------------------------------------------------------------------------------------------------- | | Platform roster | Live in app | Retell, Vapi, AnyReach, Smallest.ai, SigmaMind, ElevenLabs, Grok, and Bland are represented in the provider console. | | Provider expansion | Shipped | Grok was added as the seventh provider and Bland as the eighth provider. Bland also has messaging via pathway chat. | | Picker rebuild | Shipped | Search clear button, centered leftover rows, normal single-result sizing, favorites, and universal back-to-picker navigation. | | Docs pass | Updated | Public docs now show branded signup links and a full eight-platform setup roster. | | Mission Control | Updated | Admin analytics now uses a canonical eight-provider catalog so zero-traffic platforms still appear instead of disappearing. | | Security | Monitor mode | SSO guard is deployed in monitor mode. Flip enforcement only after telemetry is clean. | ## Provider model Every provider follows the same connector spine: 1. **Service class** — validates keys, lists agents, places calls, and runs chat where the vendor supports it. 2. **Backend wiring** — routes, dispatch, webhook handling, hosted tools, branding, and messaging orchestration. 3. **Database migration** — provider type constraints and persistence fields accept the new key. 4. **Frontend page set** — picker card, provider dashboard, add/edit connection pages, conversations pages, and switcher navigation. The shared rule is that API-key validation must hit a vendor endpoint that is confirmed to exist. Grok uses the xAI models endpoint for auth validation. Bland uses Bland's account endpoint and handles Bland's raw authorization-header format. ## Platform deliverables ### 1. Starred provider favorites Users can star multiple providers and the provider switcher only shows the starred set plus the current page. The minimum-one rule prevents the switcher from becoming empty, and preferences persist locally plus server-side in `ui_preferences.starred_providers`. Key files: * `frontend/src/lib/providerPreference.ts` * `backend/connections/api.py` * `backend/migrations/071_ui_preferences_starred.sql` ### 2. Grok (xAI) Grok was added as a voice provider with key validation, provider routing, and a full frontend page set. Public xAI surfaces are used where confirmed; any final outbound path that needs a real key is left explicit rather than guessed. Key files: * `backend/voice_providers/grok/service.py` * `frontend/src/app/grok/*` * `backend/migrations/072_allow_grok_provider_type.sql` ### 3. Bland AI voice Bland was added as a voice provider with API-key validation, pathways, phone numbers, outbound call wiring, inbound routing hooks, and an official logo treatment. Key files: * `backend/voice_providers/bland/service.py` * `frontend/src/app/bland/*` * `frontend/public/bland-logo.svg` * `backend/migrations/073_allow_bland_provider_type.sql` ### 4. Bland AI messaging Bland pathway chat is wired into the messaging orchestrator with chat creation, message turns, session persistence, stale-session retry, and frontend messaging pages. Key files: * `backend/voice_providers/bland/service.py` * `backend/messaging/orchestrator.py` * `frontend/src/app/bland/add-messaging/*` * `frontend/src/app/bland/edit-messaging/*` * `frontend/src/app/bland/conversations/*` ### 5. AnyReach messaging and picker coverage AnyReach appears as a first-class voice and messaging provider in the console and build output, including add-messaging, edit-messaging, and conversations routes. Key files: * `backend/voice_providers/anyreach/service.py` * `backend/tests/test_anyreach_messaging_service.py` * `frontend/src/app/anyreach/add-messaging/*` * `frontend/src/app/anyreach/edit-messaging/*` * `frontend/src/app/anyreach/conversations/*` ## Picker and navigation polish The provider picker now has: * centered two-card leftover rows when the platform count is uneven; * normal-width single search results; * a clear search button; * starred provider favorites; * a persistent back button on provider pages that preserves `sub_account_id` and returns to `?choose=platforms`. Main files: * `frontend/src/app/page.tsx` * `frontend/src/components/ProviderPageShell.tsx` * provider page folders under `frontend/src/app/*` ## Signup-link behavior Public docs and API-key surfaces use visible branded link labels for provider signup flows: * Retell: Use this Retell link. Sign up through this link. [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) * Vapi: Use this Vapi link. Sign up through this link. [Vapi.ai](https://vapi.ai/?aff=Emanuel) The rendered pages show the clean branded labels instead of exposing query parameters in the main text. ## Mission Control alignment The admin console uses a canonical provider catalog so the analytics pages represent the full provider set even when a provider has zero traffic in the selected window. Canonical providers: * Retell AI * Vapi * AnyReach * Smallest.ai * SigmaMind * ElevenLabs * Grok (xAI) * Bland AI Updated Mission Control surfaces: * Calls by provider * Messaging by provider * Function catalog grouping * Calls daily classification * Trigger success/failure/billing breakdown * Messaging received/sent charts Main files: * `backend/admin_portal/api.py` * `frontend/src/app/admin/components/ScaffoldSections.tsx` * `frontend/src/app/admin/hooks/useAdminStore.ts` * `frontend/src/app/admin/lib/types.ts` * `backend/tests/test_mission_trigger_denials.py` ## SSO guard The client-facing provider and connection APIs now have an SSO access guard in monitor mode. It validates the signed GoHighLevel SSO payload, compares the token location to the requested location, logs verdicts, and can be switched to enforcement after telemetry proves real traffic is clean. Main files: * `backend/auth/sso_guard.py` * `frontend/src/lib/apiAuth.ts` * `backend/app.py` * `frontend/src/lib/ghlSSO.ts` Open decision: flip `SSO_GUARD_ENFORCE=true` only after monitor telemetry shows legitimate iframe traffic is sending valid tokens with no location mismatches. ## Current verification gates The latest local verification covered: * Backend syntax compile for `backend/admin_portal/api.py`. * Targeted Mission Control tests: `backend/tests/test_mission_trigger_denials.py`. * Frontend typecheck: `npm exec tsc -- --noEmit`. * Frontend production build: `npm run build`. ## Operator follow-up checklist 1. Watch `/api/auth/health/sso-guard` before enabling enforcement. 2. Rotate any provider key that was ever pasted into chat or a non-secret channel. 3. Re-test Bland and Grok outbound calling with real provider keys where the vendor API requires live-account confirmation. 4. Keep the Mission Control provider catalog in sync whenever a ninth provider is added. 5. Keep public docs split cleanly: deep setup guides for providers with full walkthroughs, plus a platform roster page for all provider tiles. # Dynamic Variables (Retell) Source: https://docs.sympana.com/sympana-connector-retell/dynamic-variables-retell Reference for dynamic variables available in Retell integrations. ## Important Retell Dynamic Variables | Dynamic Variable | Description | | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `{{user_number}}` | This is the lead's current phone number, which is pulled directly from retell. If you ever get an inbound lead, this is the number of the lead you can reference with this dynamic variable. It will help you search for leads and book them into appointments. | | `{{direction}}` | Let the AI know whether the call is inbound or outbound, so you can have one agent trained for both types of calls. | *** ## Current Time This is how you tell the ai what the current time is, an example of how this dynamic variable will reflect back is going to be | Dynamic Variable For The Current Time | City | Example Output | | -------------------------------------- | ------------------------------------------------------- | -------------------------------------------- | | `{{current_time_/[timezone]}}` | Generic Example (If none of the listed timezones match) | Thursday, March 28, 2024 at 11:46:04 PM AEDT | | `{{current_time_America/Los_Angeles}}` | Los Angeles (California) | Friday, March 29, 2024 at 4:46:04 AM PDT | | `{{current_time_America/Chicago}}` | Chicago (Illinois) | Mon, October 20, 2025 at 6:46:04 AM CDT | | `{{current_time_America/New_York}}` | New York City (New York) | Thursday, March 28, 2024 at 7:46:04 AM EDT | | `{{current_time_Pacific/Honolulu}}` | Honolulu (Hawaii) | Thursday, March 28, 2024 at 1:46:04 AM HST | | `{{current_time_America/Anchorage}}` | Anchorage (Alaska) | Thursday, March 28, 2024 at 2:46:04 AM AKDT | # Example Scripts and Prompts (Retell) Source: https://docs.sympana.com/sympana-connector-retell/example-scripts-prompts-retell Reference examples for building Retell prompts with Sympana Connector. This page includes a sample prompt you can use as a starting point when building a Retell agent with Sympana Connector. Use these examples as **reference material**, not as a final copy-and-paste prompt. Every business has different calendars, workflows, compliance requirements, qualification rules, and data fields. Because of that, you should always adapt the examples to match your exact use case. ## How to use this page Use these examples to: * understand what each Sympana function is supposed to do * see how prompts can instruct an agent to call functions correctly * build a first draft faster Do **not** assume the examples are production-ready without editing. ## Script To Test Every Function Whenever you check the calendar for an available time, remember this is the current date and time: `current_time_America/Chicago`. If you cannot find anything available today, keep checking future dates until you find an available time. You cannot book same-day appointments and you cannot book weekends. Whenever you check the calendar for an available time, remember this is the current date and time: `current_time_America/Chicago`. If you cannot find anything available today, keep checking future dates until you find an available time. You cannot book same-day appointments and you cannot book weekends. ### Function reference **Create\_appointment-custom-retell** Books a new appointment directly into the GoHighLevel calendar using the lead's contact information. **Get\_appointment-custom-retell** Retrieves any existing appointments that the calling lead has previously booked in GoHighLevel. **List\_appointment-custom-retell** Displays a list of all appointments associated with the current lead or campaign for internal reference or scheduling checks. **Reschedule\_appointment-custom-retell** Allows the lead to reschedule an existing appointment by selecting a new date and time from available slots. **Get\_slots-custom-retell** Retrieves available appointment slots from the GoHighLevel calendar to recommend to the lead. You can customize how many slots are offered in the prompt. **Get\_contact-custom-retell** Looks up the contact in GoHighLevel based on the caller's phone number. If the contact does not exist, the Create\_contact-custom-retell function can be used. **Create\_contact-custom-retell** Creates a new contact in GoHighLevel when a lead does not already exist, using the provided name and phone number. **Update\_contact\_data-custom-retell** Updates existing contact information in GoHighLevel when the lead provides new or corrected details, such as name, email, or address. # How to Connect Sympana to Retell AI (Retell) Source: https://docs.sympana.com/sympana-connector-retell/how-to-connect-sympana-to-retell-ai How to connect Sympana Connector to Retell AI and create your first connection. # Retell Setup Use this guide to connect Sympana Connector to Retell AI inside GoHighLevel. Need a Retell account? Use this Retell link. Sign up through this link. [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) ## Before you start Make sure you have: * Sympana Connector installed in GoHighLevel * a Retell account * access to your Retell API key * a phone number connected to Retell * a calendar created in GoHighLevel ### Step 1. Open the Retell app After installing Sympana Connector in your GoHighLevel account, click on the Retell app. ### Step 2. Open the API key prompt A pop-up appears asking you to get your API key from Retell. ### Step 3. Go to the Retell dashboard Click the quick link labeled **Retell AI Dashboard + API Keys**. If you still need to create a Retell account first, use the **RetellAI.com** signup link at the top of this page, then return here for your API key. ### Step 4. Copy your Retell API key Once you click the link, you will land on the API key section in Retell. ### Step 5. Paste the API key into Sympana Connector Create a new API key or copy an existing one. Then return to GoHighLevel, open the Sympana Connector app, and paste the key into the API key field. ### Step 6. Add your first connection Once the account is connected, click **Add Your First Connection**. Before you do, make sure: * you have a phone number connected to Retell * you have a calendar created in GoHighLevel * your calendar does not require a form before booking ### Step 7. Name the connection Create your connection name. Most users use the name of the AI agent they are connecting. ### Step 8. Select the Retell agent Choose which Retell agent you want to connect. ### Step 9. Select the phone number Choose the phone number you want to use for the connection. ### Step 10. Select the calendar Choose the GoHighLevel calendar you want to connect. ### Step 11. Select functions and variables Choose the functions and global variables you want to use. Some global variables, such as phone number and contact ID, are required. Then click **Create Connection**. ### Step 12. Verify the connection Your first Retell connection should now be active. If something does not work during setup, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Messaging Setup (Retell) Source: https://docs.sympana.com/sympana-connector-retell/messaging-setup-retell Set up a Retell messaging connection in Sympana Connector to let your AI agent respond to inbound SMS, WhatsApp, Instagram, and other messages. ## Overview A messaging connection lets your Retell AI agent handle **text-based conversations** — inbound SMS, WhatsApp, Instagram DMs, Facebook messages, webchat, and more. The AI reads each message, generates a response, and sends it back through GHL Conversations. Need a Retell account? Use this Retell link. Sign up through this link. [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) Messaging connections are separate from voice connections. If your agent handles both calls and messages, create one voice connection and one messaging connection. *** ## Create a Retell messaging connection In the Sympana dashboard, click **Retell**. Click the **Messaging** tab at the top (next to Voice). Click the button to create a new messaging connection. Give it a clear name like "SMS Support Agent" or "Instagram Sales Bot." Choose the Retell agent that will handle messages. This should be an agent configured for text conversations. Only needed if the messaging agent uses appointment functions (Book Appointment, Get Slots, etc.). Control who the AI is allowed to message: | Setting | What it does | | -------------------- | ------------------------------------------------------------- | | **Allowed Tags** | Only contacts with these tags get AI replies | | **Blocked Tags** | Contacts with these tags are skipped | | **Handoff Tags** | Contacts with these tags are treated as handed-off to a human | | **Opt-out Keywords** | Words like "stop", "unsubscribe" — AI stops replying | Enable the functions your messaging agent needs — same 11 functions as voice (Book Appointment, Get Contact, Update Contact Data, etc.). Add variables the agent needs — contact name, email, custom fields, etc. Set up handoff keywords. When a contact says "talk to a person" or "human", the AI stops and fires the **Handoff Requested** trigger in GHL. Click **Save**. The connection is now available for GHL workflows. *** ## Build a messaging workflow After creating the connection, build a GHL workflow to use it: ``` Trigger: Message Received (Sympana) → Optional: Filter by channel (SMS, WhatsApp, Instagram, etc.) → Optional: If/Else — Contact has tag "ai_msg_enabled" → Action: Send AI Message (Sympana) — select your Retell messaging connection ``` Channel filtering belongs in the GHL trigger, not in the messaging connection. The connection is channel-agnostic — GHL decides which messages to route to AI. *** ## Build a handoff workflow ``` Trigger: Handoff Requested (Sympana) → Action: Add Tag "ai_msg_handoff" → Action: Assign contact to team member → Action: Send internal notification to your team → Optional: Create Task "Follow up with {{contact_first_name}}" ``` *** ## Recommended tag strategy | Tag | When to apply | | ---------------- | ----------------------------------------------------------- | | `ai_msg_enabled` | When you outbound a contact or opt them in for AI messaging | | `ai_msg_blocked` | When the contact opts out (says "stop", "unsubscribe") | | `ai_msg_handoff` | When handoff is triggered — AI pauses | *** ## Test your messaging connection 1. Make sure the messaging connection is active in Sympana 2. Publish the Message Received workflow in GHL 3. Send a test inbound message (SMS or other channel) to your GHL number 4. Verify the AI responds in GHL Conversations 5. Test handoff by sending a handoff keyword (e.g., "I want to talk to a person") 6. Verify the Handoff Requested workflow fires If the AI doesn't respond, check: Is the workflow published? Does the contact have the required tags? Is the connection active? Is the Retell API key valid? *** ## Next steps Full guide with Contact Access and Human Handoff details. Copy-paste messaging workflow configurations. # Sympana App Function Tools (Retell) Source: https://docs.sympana.com/sympana-connector-retell/sympana-app-function-tools-retell Complete reference for all 11 Sympana Connector functions available to Retell agents — names, parameters, what they return, and how to use them. ## All functions These are the 11 functions available when you create a Retell connection in Sympana. Click a function in the Sympana dashboard to enable or disable it. | Function | Retell Tool Name | What It Does | | -------------------------- | ----------------------------- | --------------------------------------------------------- | | **Book Appointment** | `create_appointment_tool` | Book a new appointment on the linked GHL calendar | | **Get Appointment** | `get_appointment_tool` | Retrieve details of a specific appointment by ID | | **List Appointments** | `list_appointment_tool` | Show all upcoming appointments for the caller | | **Reschedule Appointment** | `reschedule_appointment_tool` | Move an existing appointment to a new date/time | | **Delete Appointment** | `delete_appointment_tool` | Cancel an existing appointment | | **Get Slots** | `get_slots_tool` | Check available time slots on the GHL calendar | | **Get Contact** | `get_contact_tool` | Look up a contact in GHL by ID, phone, or email | | **Create Contact** | `create_contact_tool` | Create a new contact in GHL | | **Update Contact Data** | `update_contact_data_tool` | Update contact fields (email, name, phone, custom fields) | | **Get Opportunity** | `get_opportunity_tool` | Retrieve sales pipeline/deal data for the contact | | **Timezone Resolver** | `timezone_resolver_tool` | Resolve timezone from phone area code or city/state | *** ## Function parameters ### Book Appointment — `create_appointment_tool` | Parameter | Type | Required | Auto-filled? | Description | | ------------------ | ------- | -------- | ----------------------------------- | ------------------------------------------------------- | | `first_name` | string | Yes | Yes — from `{{contact_first_name}}` | Contact's first name | | `last_name` | string | Yes | Yes — from `{{contact_last_name}}` | Contact's last name | | `phone` | string | Yes | Yes — from `{{contact_phone}}` | Phone number (E.164) | | `title` | string | Yes | No — agent must ask | Purpose of the appointment | | `email` | string | No | Yes — from `{{contact_email}}` | Contact's email | | `preferred_date` | string | No | No — agent asks | Date in YYYY-MM-DD, or "April 15, 2026", or "4/15/2026" | | `preferred_time` | string | No | No — agent asks | Time: "2:30 PM", "14:30", "2pm" | | `timezone` | string | No | Yes — from contact | IANA timezone. Also accepts "EST", "Pacific", "Central" | | `duration_minutes` | integer | No | Yes — default 30 | Appointment length in minutes | **Returns:** Appointment ID, start time, end time, confirmation message. If the slot is full, returns alternative available times. ### Get Slots — `get_slots_tool` | Parameter | Type | Required | Description | | ---------- | ------ | -------- | ---------------------------------------------------------- | | `date` | string | No | Date to check (defaults to tomorrow). Any format accepted. | | `timezone` | string | No | Defaults to America/New\_York | **Returns:** Available time slots formatted for voice (e.g., "Wednesday Apr 16 at 2:00 PM"), slot duration, nearest available times. Automatically checks up to 7 days ahead if the requested date is fully booked. ### Get Contact — `get_contact_tool` No parameters needed — uses `contact_id` from baseline variables. Can also search by `phone` or `email`. **Returns:** `first_name`, `last_name`, `phone`, `email`, `timezone`, `tags`, `source`, and all custom fields. ### Update Contact Data — `update_contact_data_tool` | Parameter | Type | Required | Description | | -------------- | ------ | -------- | -------------------------------------------------- | | `field_name` | string | Yes | Which field to update (e.g., `email`, `firstName`) | | `field_value` | string | Yes | The new value | | `update_notes` | string | No | Why the update was made | **Updatable fields:** `email`, `firstName`, `lastName`, `phone`, `companyName`, `address1`, `city`, `state`, `postalCode`, `country`, `website`, `timezone`, plus any custom field by key. ### Create Contact — `create_contact_tool` | Parameter | Type | Required | | ------------ | ------ | -------- | | `first_name` | string | Yes | | `last_name` | string | Yes | | `phone` | string | Yes | | `email` | string | No | ### Reschedule Appointment — `reschedule_appointment_tool` | Parameter | Type | Required | | ---------------- | ------ | -------- | | `appointment_id` | string | Yes | | `new_date` | string | No | | `new_start_time` | string | No | | `new_end_time` | string | No | ### Delete Appointment — `delete_appointment_tool` | Parameter | Type | Required | | ---------------- | ------ | -------- | | `appointment_id` | string | Yes | ### List Appointments — `list_appointment_tool` No parameters needed — uses baseline contact variables automatically. ### Get Appointment — `get_appointment_tool` | Parameter | Type | Required | | ---------------- | ------ | -------- | | `appointment_id` | string | Yes | ### Get Opportunity — `get_opportunity_tool` No parameters needed — uses baseline contact variables. ### Timezone Resolver — `timezone_resolver_tool` | Parameter | Type | Required | | --------- | ------ | ------------------------------------- | | `phone` | string | No — uses call metadata | | `city` | string | No | | `state` | string | No — accepts "CA", "California", "NY" | *** ## How to enable or disable functions ### Enable a function Click the function once — a blue checkmark appears. Then click **Update Connection** to save. ### Disable a function Click the function again to remove the checkmark. Then click **Update Connection**. All functions are enabled by default when you create a new connection. ## How to view function variables Click on any enabled function to expand it. Click **prebuilt variables included (show)** to see the auto-configured variables for that function. For the full setup guide with prompt instructions, see [How to Set Up Functions in Retell](https://docs.sympana.com/guides/how-to-set-up-functions-in-retell). If you need help, join the [Sympana Discord server](https://discord.gg/QXk7ddhmZQ). # Webhook Get Call (Retell) Source: https://docs.sympana.com/sympana-connector-retell/webhook-get-call Webhook configuration for retrieving call data in Retell. # Webhook (Get Call) To get this working with Sympana Connector, make sure the app is installed in your GoHighLevel account and connected to your Retell account. Use this Retell link. Sign up through this link. [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) Once your connection is created, go to **Webhooks** inside your Retell agent settings and use this webhook URL: | Webhook | URL | | -------------- | -------------------------------------------- | | Retell webhook | `https://api.sympana.ai/api/webhooks/retell` | # Dynamic Variables (Vapi) Source: https://docs.sympana.com/sympana-connector-vapi/dynamic-variables-vapi Reference for dynamic variables available in Vapi integrations. ## Important Vapi Dynamic Variables | Dynamic Variable | Description | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `{{customer.number}}` | This is the lead's current phone number, which is pulled directly from Vapi. If you ever get an inbound lead, this is the number of the lead you can reference with this dynamic variable. It will help you search for leads and book them into appointments. | | `customer.number` | This is the lead's current phone number, which is pulled directly from Vapi. If you ever get an inbound lead, this is the number of the lead you can reference with this dynamic variable. It will help you search for leads and book them into appointments. | *** ## Current Time This is how you tell the ai what the current time is, an example of how this dynamic variable will reflect back is going to be | Dynamic Variable For The Current Time | City | Example Output | | --------------------------------------------------------------------- | ------------------------------------------------------- | -------------------------------------------- | | `{{"now" \| date: "%A, %B %d, %Y, %I:%M %p", "Country/City"}}` | Generic Example (If none of the listed timezones match) | Thursday, March 28, 2024 at 11:46:04 PM AEDT | | `{{"now" \| date: "%A, %B %d, %Y, %I:%M %p", "America/Los_Angeles"}}` | Los Angeles (California) | Monday, January 01, 2024, 03:45 PM PST | | `{{"now" \| date: "%A, %B %d, %Y, %I:%M %p", "America/Chicago"}}` | Chicago (Illinois) | Monday, October 20, 2025 at 6:46:04 AM CDT | | `{{"now" \| date: "%A, %B %d, %Y, %I:%M %p", "America/New_York"}}` | New York City (New York) | Thursday, March 28, 2024 at 7:46:04 AM EDT | | `{{"now" \| date: "%A, %B %d, %Y, %I:%M %p", "Pacific/Honolulu"}}` | Honolulu (Hawaii) | Thursday, March 28, 2024 at 1:46:04 AM HST | | `{{"now" \| date: "%A, %B %d, %Y, %I:%M %p", "America/Anchorage"}}` | Anchorage (Alaska) | Thursday, March 28, 2024 at 2:46:04 AM AKDT | *** ## Sympana Connector Dynamic Variables | Important Dynamic Variables | Description | | --------------------------- | --------------------------------------------------------------------- | | `{{contact_first_name}}` | This is how you address the lead only by their first name on the call | | `contact_first_name` | This is how you address the lead only by their first name on the call | # Example Scripts and Prompts (Vapi) Source: https://docs.sympana.com/sympana-connector-vapi/example-scripts-prompts-vapi Reference examples for building Vapi prompts with Sympana Connector. This page includes example prompts that show how a Vapi assistant can be structured when used with Sympana Connector. Use these examples as **reference material**, not as a final copy-and-paste prompt. Every business has different workflows, compliance rules, calendars, qualification logic, and data fields. Because of that, you should always review and adapt these examples before using them in production. ## Important note Some older examples may still reference Retell-style function names because they were originally written to demonstrate Sympana function behavior across voice-agent setups. If you are building for Vapi, make sure your function names, variables, and prompt instructions match your actual Vapi implementation before you go live. ## How to use this page Use these examples to: * understand how a full prompt can be structured * see how scheduling and contact workflows can be handled * speed up your first draft Do **not** assume the examples are production-ready without editing.
Real Estate – Outbound Example Script / Prompt (Trained to Use Sympana Connector) ```text theme={null} Rule Zero Do not speak any bracketed notes.\ Never say anything inside parentheses.\ When you see (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back), stop and wait silently.\ Minimal contractions. Use natural cadence, short lines, and brief pauses. — 1. Agent Identity Spoken name: Assistant\ Spoken role: I am an assistant from our team. If asked about AI status, speak:\ "Yes, I am an AI assistant, here to help schedule a quick call. If you prefer to speak with someone live, I can arrange that too."\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) — 2. System Variables & Integrations (Required Vars Only) Current time at call start: `current_time_America/Los_Angeles_`\ Lead phone (for booking/SMS): `contact_phone_`\ Lead first name: `contact_first_name_` Functions (example names shown in legacy draft): * Get_contact-custom-retell * Create_contact-custom-retell * Update_contact_data-custom-retell * Get_slots-custom-retell * Create_appointment-custom-retell * Get_appointment-custom-retell * List_appointment-custom-retell * Reschedule_appointment-custom-retell [DO NOT SPEAK: On call start, run Get_contact-custom-retell({ phone: `contact_phone_` }). If no record, run Create_contact-custom-retell({ name: `contact_first_name_`, phone: `contact_phone_` }).] — 3. Opening — Live Answer (Real Estate) You say:\ "Hi, is this `contact_first_name_`?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) "Great… I am an assistant from our team. You reached out recently about real estate options. I want to help you take the next step."\ "A short consult now can save you time later." — 4. Quick Qualify & Route "Are you thinking about moving forward soon… or just exploring?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) "What is your rough timeframe… next 30 days, 60 days, or later?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) "And what area are you focused on?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) If outside coverage:\ "Thank you for sharing that. At the moment, our team is focused on specific areas. We truly appreciate your time."\ [DO NOT SPEAK: End call and log outcome.] — 5. Book the Appointment (with Example Functions) [DO NOT SPEAK: Run Get_slots-custom-retell({ count: 3 }). Map to Option A/B/C.] You say:\ "Let us set up a quick consult. I have Option A, Option B, or Option C… which works better for you?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) If a different time is requested:\ "The calendar is fully booked at that time… but these three are open. Do any of them work for you?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) When a time is chosen:\ [DO NOT SPEAK: Create_appointment-custom-retell({ slot: chosen_option, phone: `contact_phone_` }).] You say:\ "Perfect… I will lock that in. You will receive a quick text confirmation with the details. We will call you at that time." "Thanks, `contact_first_name_`. We look forward to helping you get started. Talk to you soon." [DO NOT SPEAK: send SMS confirmation to `contact_phone_`.] — 6. Objection Handling Not ready yet:\ "Totally fine. A quick consult gives you clear options and next steps. Option A, Option B, or Option C?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) Already working with someone:\ "Understood. If you are still exploring, a quick second-opinion can help. Would Option A, Option B, or Option C work?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) Wants info by text first:\ "I can text a brief overview. The real value is the tailored consult. We can lock a time and I will still text a summary. Option A, Option B, or Option C?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) Busy right now:\ "No worries. Let us lock a time so it is off your plate. Option A, Option B, or Option C?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) Timeline unclear:\ "That is okay. The consult builds a simple plan for the next 30, 60, or 90 days. Option A, Option B, or Option C?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) Specific time not available:\ "I checked. That time is booked. The good news is these three are open: Option A, Option B, Option C. Do any of those work?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) — 7. Edge Cases Silence ≥ 3 seconds:\ "Sorry… are you still there?"\ (Pause For Lead To Respond, Wait And Don't Say Anything Until Lead Replies Back) Opt out / stop / unsubscribe:\ "Understood. I will remove your number right away. Thank you."\ [End call.] Unclear reply twice:\ "No worries… we can follow up by text. Thank you."\ [End call.] — 8. Voicemail Logic "Hi, this is the assistant with our team. I am calling about your recent real estate inquiry. A quick consult can give you clear next steps. You can reply to this text with a good time, or I can offer a few options when we connect. Thank you." [DO NOT SPEAK: Run Get_slots-custom-retell({ count: 3 }) and send three options by SMS to `contact_phone_`. If they text back, Create_appointment-custom-retell with the chosen slot and end call.] ```
Mortgage Agent – Outbound Qualification & Booking This legacy example is kept as reference material. Review every function name, variable, compliance line, and booking instruction before using it in production.
MedSpa Agent – Inbound Example Script / Prompt This legacy example is kept as reference material. Review every function name, variable, routing rule, and escalation path before using it in production.
If you want hands-on help building prompts or workflows, contact support at [support@sympana.com](mailto:support@sympana.com). # How to Connect Sympana to Vapi (Vapi) Source: https://docs.sympana.com/sympana-connector-vapi/how-to-connect-sympana-to-vapi How to connect Sympana Connector to Vapi and create your first connection. # Vapi Setup Use this guide to connect Sympana Connector to Vapi inside GoHighLevel. Need a Vapi account? Use this Vapi link. Sign up through this link. [Vapi.ai](https://vapi.ai/?aff=Emanuel) ## Before you start Make sure you have: * Sympana Connector installed in GoHighLevel * a Vapi account * access to your Vapi API key * a phone number connected to Vapi * a calendar created in GoHighLevel ### Step 1. Open the Vapi app After installing Sympana Connector in your GoHighLevel account, click on the Vapi app. ### Step 2. Open the API key prompt A pop-up appears asking you to get your API key from Vapi. ### Step 3. Go to the Vapi dashboard Click the quick link labeled **Vapi Dashboard → API Key**. If you still need to create a Vapi account first, use the **Vapi.ai** signup link at the top of this page, then return here for your API key. ### Step 4. Copy your Vapi API key Once you click the link, you will land on the API key section in Vapi. ### Step 5. Paste the API key into Sympana Connector Create a new API key or copy an existing one. Then return to GoHighLevel, open the Sympana Connector app, and paste the key into the API key field. ### Step 6. Add your first connection Once the account is connected, click **Add Your First Connection**. Before you do, make sure: * you have a phone number connected to Vapi * you have a calendar created in GoHighLevel * your calendar does not require a form before booking ### Step 7. Name the connection Create your connection name. Most users use the name of the AI agent they are connecting. ### Step 8. Select the Vapi agent Choose which Vapi agent you want to connect. ### Step 9. Select the phone number Choose the phone number you want to use for the connection. ### Step 10. Select the calendar Choose the GoHighLevel calendar you want to connect. ### Step 11. Select functions and variables Choose the functions and global variables you want to use. Some global variables, such as phone number and contact ID, are required. Then click **Create Connection**. ### Step 12. Verify the connection Your first Vapi connection should now be active. If something does not work during setup, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team. # Messaging Setup (Vapi) Source: https://docs.sympana.com/sympana-connector-vapi/messaging-setup-vapi Set up a Vapi messaging connection in Sympana Connector to let your AI assistant respond to inbound SMS, WhatsApp, Instagram, and other messages. ## Overview A messaging connection lets your Vapi AI assistant handle **text-based conversations** — inbound SMS, WhatsApp, Instagram DMs, Facebook messages, webchat, and more. The AI reads each message, generates a response, and sends it back through GHL Conversations. Need a Vapi account? Use this Vapi link. Sign up through this link. [Vapi.ai](https://vapi.ai/?aff=Emanuel) Messaging connections are separate from voice connections. If your assistant handles both calls and messages, create one voice connection and one messaging connection. *** ## Create a Vapi messaging connection In the Sympana dashboard, click **Vapi**. Click the **Messaging** tab at the top (next to Voice). Click the button to create a new messaging connection. Give it a clear name like "SMS Support Agent" or "WhatsApp Bot." Choose the Vapi assistant that will handle messages. This should be an assistant configured for text conversations. Only needed if the messaging assistant uses appointment functions. Control who the AI is allowed to message: | Setting | What it does | | -------------------- | ------------------------------------------------------------- | | **Allowed Tags** | Only contacts with these tags get AI replies | | **Blocked Tags** | Contacts with these tags are skipped | | **Handoff Tags** | Contacts with these tags are treated as handed-off to a human | | **Opt-out Keywords** | Words like "stop", "unsubscribe" — AI stops replying | Enable the functions your messaging assistant needs — same 11 functions as voice. Add variables the assistant needs — contact name, email, custom fields, etc. Set up handoff keywords. When a contact says "talk to a person" or "human", the AI stops and fires the **Handoff Requested** trigger in GHL. Click **Save**. The connection is now available for GHL workflows. *** ## Build a messaging workflow ``` Trigger: Message Received (Sympana) → Optional: Filter by channel (SMS, WhatsApp, Instagram, etc.) → Optional: If/Else — Contact has tag "ai_msg_enabled" → Action: Send AI Message (Sympana) — select your Vapi messaging connection ``` Channel filtering belongs in the GHL trigger, not in the messaging connection. *** ## Build a handoff workflow ``` Trigger: Handoff Requested (Sympana) → Action: Add Tag "ai_msg_handoff" → Action: Assign contact to team member → Action: Send internal notification to your team → Optional: Create Task "Follow up with {{contact_first_name}}" ``` *** ## Recommended tag strategy | Tag | When to apply | | ---------------- | ----------------------------------------------------------- | | `ai_msg_enabled` | When you outbound a contact or opt them in for AI messaging | | `ai_msg_blocked` | When the contact opts out | | `ai_msg_handoff` | When handoff is triggered | *** ## Test your messaging connection 1. Make sure the messaging connection is active 2. Publish the Message Received workflow 3. Send a test inbound message to your GHL number 4. Verify the AI responds in GHL Conversations 5. Test handoff with a keyword like "I want to talk to a person" Unlike Retell, Vapi messaging may incur charges on your Vapi account for each AI response generated. *** ## Next steps Full guide with Contact Access and Human Handoff details. Copy-paste messaging workflow configurations. # Sympana App Function Tools (Vapi) Source: https://docs.sympana.com/sympana-connector-vapi/sympana-app-function-tools-vapi Complete reference for all 11 Sympana Connector functions available to Vapi assistants — names, parameters, what they return, and how to use them. ## All functions These are the 11 functions available when you create a Vapi connection in Sympana. Click a function in the Sympana dashboard to enable or disable it. | Function | What It Does | | -------------------------- | --------------------------------------------------------- | | **Book Appointment** | Book a new appointment on the linked GHL calendar | | **Get Appointment** | Retrieve details of a specific appointment by ID | | **List Appointments** | Show all upcoming appointments for the caller | | **Reschedule Appointment** | Move an existing appointment to a new date/time | | **Delete Appointment** | Cancel an existing appointment | | **Get Slots** | Check available time slots on the GHL calendar | | **Get Contact** | Look up a contact in GHL by ID, phone, or email | | **Create Contact** | Create a new contact in GHL | | **Update Contact Data** | Update contact fields (email, name, phone, custom fields) | | **Get Opportunity** | Retrieve sales pipeline/deal data for the contact | | **Timezone Resolver** | Resolve timezone from phone area code or city/state | Vapi functions work the same way as Retell functions — the same 11 tools, same parameters, same behavior. The only difference is how Sympana registers them with each provider. You don't need to worry about this — Sympana handles it automatically. *** ## Function parameters ### Book Appointment | Parameter | Type | Required | Auto-filled? | Description | | ------------------ | ------- | -------- | ---------------- | --------------------------------- | | `first_name` | string | Yes | Yes | Contact's first name | | `last_name` | string | Yes | Yes | Contact's last name | | `phone` | string | Yes | Yes | Phone number | | `title` | string | Yes | No — agent asks | Purpose of the appointment | | `email` | string | No | Yes | Contact's email | | `preferred_date` | string | No | No — agent asks | Any date format accepted | | `preferred_time` | string | No | No — agent asks | "2:30 PM", "14:30", "2pm" | | `timezone` | string | No | Yes | IANA timezone or "EST", "Pacific" | | `duration_minutes` | integer | No | Yes — default 30 | Length in minutes | ### Get Slots (Check Availability) | Parameter | Type | Required | Description | | ---------- | ------ | -------- | ------------------------------------ | | `date` | string | No | Date to check (defaults to tomorrow) | | `timezone` | string | No | Defaults to America/New\_York | **Returns:** Available times, slot duration, nearest available slots. Auto-checks 7 days ahead. ### Get Contact No parameters needed — uses contact ID automatically. Can search by `phone` or `email`. **Returns:** Name, phone, email, timezone, tags, source, custom fields. ### Update Contact Data | Parameter | Type | Required | Description | | ------------- | ------ | -------- | --------------------- | | `field_name` | string | Yes | Which field to update | | `field_value` | string | Yes | New value | **Updatable fields:** `email`, `firstName`, `lastName`, `phone`, `companyName`, `address1`, `city`, `state`, `postalCode`, `country`, `website`, `timezone`, plus custom fields. ### Create Contact | Parameter | Type | Required | | ------------ | ------ | -------- | | `first_name` | string | Yes | | `last_name` | string | Yes | | `phone` | string | Yes | | `email` | string | No | ### Reschedule Appointment | Parameter | Type | Required | | ---------------- | ------ | -------- | | `appointment_id` | string | Yes | | `new_date` | string | No | | `new_start_time` | string | No | ### Delete Appointment | Parameter | Type | Required | | ---------------- | ------ | -------- | | `appointment_id` | string | Yes | ### List Appointments, Get Appointment, Get Opportunity Use baseline contact variables automatically. Get Appointment requires `appointment_id`. ### Timezone Resolver | Parameter | Type | Required | | --------- | ------ | ------------------- | | `phone` | string | No — auto from call | | `city` | string | No | | `state` | string | No | *** ## How to enable or disable functions Click a function to toggle it on (blue checkmark) or off. Click **Update Connection** to save. ## How to view function variables Click on any enabled function to expand it. Click **prebuilt variables included (show)** to see auto-configured variables. For the full setup guide with prompt instructions, see [How to Set Up Functions in Vapi](https://docs.sympana.com/guides/how-to-set-up-functions-in-vapi). If you need help, join the [Sympana Discord server](https://discord.gg/QXk7ddhmZQ). # Webhook (Get Call) Source: https://docs.sympana.com/sympana-connector-vapi/webhook-get-call Set up the Vapi webhook URL in your agent settings. # Webhook (Get Call) To get this working with Sympana Connector, make sure the app is installed in your GoHighLevel account and connected to your Vapi account. Use this Vapi link. Sign up through this link. [Vapi.ai](https://vapi.ai/?aff=Emanuel) Once your connection is created, go to **Webhooks** inside your Vapi agent settings and use this webhook URL: | Webhook | URL | | ------------ | ------------------------------------------ | | Vapi webhook | `https://api.sympana.ai/api/webhooks/vapi` | # Testing Before You Go Live Source: https://docs.sympana.com/testing-before-going-live Before you launch a workflow, test the full path from start to finish with a controlled lead record. First, make sure the app is installed correctly and the correct Retell or Vapi setup is connected. Then confirm that your lead record includes the fields your workflow depends on, especially the phone number and any information needed for timezone logic. Next, test the outbound flow itself. If your workflow places a call, make sure the call actually goes through. If your workflow depends on local calling windows, confirm that the wait logic behaves the way you expect. After that, test the post-call side. Confirm that Call Completed fires, that Fetch Call Analysis returns the data you need, and that your later workflow steps can use that data correctly. If your agent uses functions, run at least one live test that checks contact retrieval, contact updates, available slot retrieval, and booking or rescheduling behavior if those actions are part of your workflow. Do not scale the workflow until a full test passes. It is much easier to fix one test lead than a broken campaign. # Troubleshooting Source: https://docs.sympana.com/troubleshooting Work through the most common Sympana Connector setup and call issues in the right order.

Troubleshooting

Check the boring stuff first. It fails the most.

Use this page to narrow down whether the issue is your provider account, workflow structure, function setup, or timing logic.

If your Retell or Vapi account is still on a free trial, live calling can fail even when the workflow is set up correctly. Use this Retell link. Sign up through this link. [RetellAI.com](https://dashboard.retellai.com/?ref=EmanuelTemplates) Use this Vapi link. Sign up through this link. [Vapi.ai](https://vapi.ai/?aff=Emanuel) If the workflow runs but no call happens, confirm the lead has a valid phone number and that the correct action is being used in the correct place. If your timing is wrong, make sure Update Lead Timezone runs before Wait Until Calling Window. If the call happens but later data is missing, confirm you are using Call Completed and Fetch Call Analysis in the right order, usually in a separate post-call workflow. A function can exist in Retell or Vapi and still fail if the name is wrong, the webhook setup is wrong, or the prompt never tells the agent when to use it. *** ## Messaging Issues Check in this order: 1. Is the messaging connection active in Sympana? 2. Is the GHL workflow published with a **Message Received** trigger? 3. Does the contact have the required tags (if using Contact Access allowed tags)? 4. Is the contact in a handoff/paused state? Check for handoff tags. 5. Is the Retell/Vapi API key still valid? 6. Does the selected messaging agent still exist in the provider dashboard? 1. Confirm the GHL marketplace trigger subscription exists (re-publish the workflow). 2. Check that the workflow is published, not in draft. 3. If using channel filters, verify the inbound message matches the selected channel. 1. Check that you are creating a **messaging** connection, not a voice connection. 2. Verify the Retell/Vapi API key is entered and valid. 3. Refresh the agent list. 1. Check that handoff keywords are configured on the messaging connection. 2. Verify the **Handoff Requested** workflow is published. 3. Check that the contact does not already have a handoff tag blocking AI. The sub-account app install, SSO, or token is missing or invalid. Go to the GHL Marketplace and reinstall or reconnect Sympana Connector for that sub-account. *** ## Support Resources Use these links when you need the official Sympana community, product downloads, or the fastest route to the right support surface. Get setup help, troubleshooting help, workflow guidance, and community support. Download the public Claude skill package and use it alongside the docs when needed. Access the Sympana pre-built automation offer for faster rollout inside GoHighLevel. Work directly with Sympana if you want done-with-you or done-for-you help. If you still cannot find the issue, [join the Sympana Discord server](https://discord.gg/QXk7ddhmZQ) to get the fastest support from someone on the Sympana team and include what you were building, which platform you used, which workflow step failed, and what you already tested. # Video Tutorials Source: https://docs.sympana.com/video-tutorials Step-by-step video guides for setting up and using Sympana Connector. These video tutorials walk you through setting up Sympana Connector, connecting it to your CRM, building automations, and more. *** ## How To Connect Retell AI To GoHighLevel (No Code)