GigoDA
09/10/2026, 7:33 PMAI Evy
09/10/2026, 7:33 PMAI Evy
09/10/2026, 7:33 PMAI Evy
09/10/2026, 7:33 PM/v1/calls) with the availability data injected as variables so the agent can reference it during the conversation . After the call, Retell sends back booking confirmation data to a Make webhook, which then creates the appointment in GHL .
One important detail from that source: if GHL triggers the Retell call directly (instead of Make triggering it after fetching availability) , the call starts before the data exists in context, causing the agent to guess dates instead of using real availability . The fix documented is to always have the system that fetches the GHL data (Make) be the one that starts the Retell call, injecting the data as variables at call creation .
So compatibility exists, but it's achieved via Make as the integration layer between GHL and Retell, not a native GHL function inside the conversation flow builder .AI Evy
09/10/2026, 7:33 PMGigoDA
09/10/2026, 7:35 PMAI Evy
09/10/2026, 7:35 PMAI Evy
09/10/2026, 7:35 PMcalendars.readonly for Check Availability, calendars/events.write for Book/Reschedule/Cancel Appointment) .
- Availability checks are capped at 31 days per request .
So compared to the Make.com-based setup discussed earlier, the native GHL functions are built into the agent directly once the GoHighLevel connection is made [(1) ]() [(2) ]() .AI Evy
09/10/2026, 7:35 PMAI Evy
09/10/2026, 7:36 PMGigoDA
09/10/2026, 7:38 PMAI Evy
09/10/2026, 7:38 PMAI Evy
09/10/2026, 7:38 PMAI Evy
09/10/2026, 7:38 PMAI Evy
09/10/2026, 7:38 PMAI Evy
09/17/2026, 12:01 PMGigoDA
09/17/2026, 12:01 PMAI Evy
09/17/2026, 12:01 PM{{variable}} against a value with operators including exists or not exists [(2) ]() . Since a function's output can be mapped to a dynamic variable, you could map the search result to a variable and gate the create-contact function on that vAI Evy
09/17/2026, 12:01 PM{{call_summary}}, {{call_successful}}, {{user_sentiment}}, {{disconnection_reason}}, {{call_status}}, and one variable per custom Post Call Extraction field [(2) ]() [(3) ]() . The docs state these "are available to post-conversation functions only; nothing earlier can read them, because the analysis hasn't run yet" [(2) ]() .
On the recording URL: the sources don't mention a recording URL variable available to post-call functions. I can't confirm this one either.
Check out these potentially useful sources: [Agent workflow]() , [Integrations overview]() , [Dynamic variables: personalize Retell agent calls]()
Want a general answer based on my broader knowledge for the pricing and recording-URL questions instead?AI Evy
09/17/2026, 12:01 PMAI Evy
09/17/2026, 12:02 PMGigoDA
09/18/2026, 1:29 PMAI Evy
09/18/2026, 1:29 PMAI Evy
09/18/2026, 1:29 PMAI Evy
09/18/2026, 1:29 PMAI Evy
09/18/2026, 1:29 PMAI Evy
09/18/2026, 2:05 PMGigoDA
09/18/2026, 2:05 PMAI Evy
09/18/2026, 2:05 PMAI Evy
09/18/2026, 2:05 PM+ Add, pick the function from the dropdown, and enter the mock result it should return [(1) ]() .
One caveat from the best practices: "Mock functions that reach production before you run. An unmocked custom function, code tool, calendar tool, or MCP tool calls its real endpoint, so a test can create a real booking or record" — confirming this is exactly why you'd mock it.
On cost estimate: I don't have pricing information for simulation test runs in the sources — I can't confirm a per-run or per-message cost estimate. Simulation testing does note that the simulated user's LLM "bills per message," and your agent's own model billing applies separately , but no dollar figures are given.
I can't build the actual test case (test cases require a specific tool ID from your Cal.com Book Appointment setup, which I don't have) , but here's the structure once you have your event type ID [(2) ]() :
- Name the test case (e.g. book-appointment-text-only) [(1) ]()
- Write a useAI Evy
09/18/2026, 2:05 PMAI Evy
09/18/2026, 2:05 PMGigoDA
09/18/2026, 2:05 PMAI Evy
09/18/2026, 2:06 PMAI Evy
09/18/2026, 2:06 PM{{variable}} [(4) ]() , and I described that gating logic earlier. But nothing in the sources addresses assigning a specific test caller number for a simulation run, so I can't confirm whether that's possible or how it would be configured.
Check out these potentially useful sources: [Agent workflow]() , [GoHighLevel agent functions]() , [Integration tools in conversation flow]()
Want a general answer based on my broader knowledge foAI Evy
09/18/2026, 2:06 PMAI Evy
09/18/2026, 2:06 PMAI Evy
09/18/2026, 2:06 PMGigoDA
09/18/2026, 2:08 PMAI Evy
09/18/2026, 2:08 PMAI Evy
09/18/2026, 2:08 PMAI Evy
09/18/2026, 2:08 PMAI Evy
09/18/2026, 2:08 PMGigoDA
09/18/2026, 2:09 PMAI Evy
09/18/2026, 2:09 PMAI Evy
09/18/2026, 2:09 PMAI Evy
09/18/2026, 2:09 PMAI Evy
09/18/2026, 2:09 PMGigoDA
09/18/2026, 2:11 PMAI Evy
09/18/2026, 2:11 PMAI Evy
09/18/2026, 2:11 PMAI Evy
09/18/2026, 2:11 PMAI Evy
09/18/2026, 2:11 PMAI Evy
09/18/2026, 2:11 PMGigoDA
09/18/2026, 2:12 PMAI Evy
09/18/2026, 2:12 PMAI Evy
09/18/2026, 2:12 PMinterruption_sensitivity, responsiveness, enable_dynamic_responsiveness, and custom_stt_config.endpointing_ms as configurable parameters in API request schemas, without guidance on tuning values for high-latency routes or talk-over issues [(1) ]() [(2) ]() .
For example, the parameters appear in request bodies like this:
json
"responsiveness": 1,
"interruption_sensitivity": 1,
[(1) ]() , [(2) ]()
json
"custom_stt_config": {
"endpointing_ms": 123
},
"enable_dynamic_responsiveness": true,
[(1) ]() , [(2) ]()
These show the fields exist and their expected types, but nothing in the sources discusses a recommended starting configuration for high-latency callers or how to reduce talk-over in that scenario.
Check out these potentially useful sources: [Create Batch Call]() , [Create Web Call]()
Want a general (non-documented) recommendation based on my broader knowledge for tuning these settings on high-latency international calls instead?AI Evy
09/18/2026, 2:12 PMAI Evy
09/18/2026, 2:12 PMGigoDA
09/18/2026, 2:13 PMAI Evy
09/18/2026, 2:13 PMAI Evy
09/18/2026, 2:13 PMAI Evy
09/18/2026, 2:13 PMAI Evy
09/18/2026, 2:13 PMGigoDA
09/18/2026, 2:14 PMAI Evy
09/18/2026, 2:14 PMAI Evy
09/18/2026, 2:14 PMAI Evy
09/18/2026, 2:14 PMAI Evy
09/18/2026, 2:14 PMAI Evy
09/18/2026, 2:14 PMGigoDA
09/18/2026, 2:15 PMAI Evy
09/18/2026, 2:15 PMAI Evy
09/18/2026, 2:15 PMNumber is stored as "42" and a Boolean as "true" [(1) ]() . This same conversion is confirmed in the dynamic variables documentation: numbers, booleans, or other data types are not supported directly, so a boolean is stored as "true" [(2) ]() .
For your equation edge, since equation conditions can only reference dynamic variables and every value is a string [(3) ]() , your comparison needs to check against the string "true", not a native boolean. This matches the exists-style equation pattern documented for conversation flow:
- {{name}} exists
For a direct equality check, the same equation syntax style applies to comparing a variable to a literal value, as shown here:
- {{user_location}} == "New York"
So your equation would compare {{your_boolean_variable}} to the string "true" rather than an unquoted boolean literal, consistent with the extract dynamic variables documentation stating "a Boolean is stored as `\"true\"`" and that in code contexts you'd need to cast it, e.g. dv.is_member === "true" [(2) ]() .AI Evy
09/18/2026, 2:15 PMAI Evy
09/18/2026, 2:15 PMGigoDA
09/18/2026, 2:17 PMAI Evy
09/18/2026, 2:17 PMAI Evy
09/18/2026, 2:17 PMAI Evy
09/18/2026, 2:17 PMAI Evy
09/18/2026, 2:17 PMGigoDA
09/18/2026, 2:17 PMAI Evy
09/18/2026, 2:17 PMAI Evy
09/18/2026, 2:18 PMAI Evy
09/18/2026, 2:18 PMAI Evy
09/18/2026, 2:18 PMGigoDA
09/19/2026, 9:26 AMAI Evy
09/19/2026, 9:26 AMAI Evy
09/19/2026, 9:27 AM{{variable}} appears in a value field — it's set explicitly by how you chain the functions on the canvas. The docs describe two distinct actions: "**Add sequential function** makes the new function depend on every function in the row's card, so it starts only once they've all succeeded. That's what lets it use their output," versus "**Add parallel function** starts the new function at the same point as the row you clicked, and anything that was waiting on that row now waits for both." [(1) ]()
Referencing {{new_contact_id}} inside a constant parameter value does not by itself register a dependency on postcall_create_contact. The docs are explicit that "Variables become available as the graph runs, so a function only ever sees output from functions that finished before it. The dashboard enforces the same rule as you type: when you pick a variable, it offers only the outputs of the functions this one waits on, not the ones running beside it or after it." That last clause is the key: if postcall_tag_new and postcall_note_new were added as independent/parallel functions rather than as sequential children of postcall_create_contact, they start immediately with the rest of the no-dependency batch, and any {{new_contact_id}} reference in them would simply resolve to nothing (or be skipped) since the value hasn't been produced yet — which matches the "Skipped: contact_id is required" failures you saw.
The docs also confirm what happens when a referenced variable has no value yet: "If a {{variable}} in an input has no value — the function it came from didn't run, or returned nothing for that field — the input is left out. If that input was required, the function is skipped rather than sent with a gap in it." That's exactly your `tag_new`/`AI Evy
09/19/2026, 9:27 AMpostcall_search_contact → sequential → postcall_tag_called (consumes {{ghl_contact_id}})
- postcall_create_contact → sequential → postcall_tag_new and postcall_note_new (both consume {{new_contact_id}})
This also matches the worked example in the docs, where list_tickets is "added as a sequential function under find_user," explicitly depending on it to use its output.
Separately, the discord thread on this exact question confirms dynamic variables can be referenced across functions in JSON/constant fields once the dependency exists: "Yes you can use dynamic variables inside the JSON." [(2) ]() But that only addresses whether referencing is supported syntactically — it doesn't say referencing alone creates the dependency; the chaining action is what the primary documentation ties dependency to. [(1) ]()AI Evy
09/19/2026, 9:27 AMAI Evy
09/19/2026, 9:27 AM