Warm Transfers not working at all. All transfers a...
# support
s
I've got this call id "b52226e5-9692-4ad4-9bf4-b5d938021fbd" that utilizes my dynamicDestinationTransferCall function. My server receives the transfer-destination-request and forms this response to the webhook:
Copy code
{
  "destination": {
    "message": "I believe you're looking for Liz. I'll transfer you to her now. Please hold.",
    "transfer_plan": {
      "mode": "warm-transfer-with-summary",
      "summary_plan": {
        "enabled": true,
        "messages": [
          {
            "role": "system",
            "content": "Please provide a summary of the call."
          },
          {
            "role": "user",
            "content": "Here is the transcript:\n\n{{transcript}}\n\n"
          }
        ]
      }
    },
    "type": "number",
    "number": "+MYNUMBER",
    "number_e_1_6_4_check_enabled": true
  }
}
.
I've tried warm-transfer-with-summary in the setup you see above, and also a fixed message like this:
Copy code
"transferPlan": {
    "mode": "warm-transfer-with-message",
    "message": "Hey, this call has been forwarded through Vapi."
},
It just performs a blind transfer, as soon as +MYNUMBER picks up, it just connects the 2 calls with no message. Here are the relevant messages from the artifact:
Copy code
{
  "role": "tool_calls",
  "time": 1744658355741,
  "message": "",
  "toolCalls": [
    {
      "id": "call_qH9ZEQi3ZlxGFjIoHsfhRyh6",
      "type": "function",
      "function": {
        "name": "dynamicDestinationTransferCall",
        "arguments": "{}"
      }
    }
  ],
  "secondsFromStart": 21
}
{
  "name": "dynamicDestinationTransferCall",
  "role": "tool_call_result",
  "time": 1744658362514,
  "result": "",
  "toolCallId": "call_qH9ZEQi3ZlxGFjIoHsfhRyh6",
  "secondsFromStart": 27.773
}
For some reason, my tool_call_result never returns "result": "success" like it used to. It just returns a blank result.
v
Based on your description, I can see you're having issues with warm transfers defaulting to blind transfers. Let me ask a few questions to help troubleshoot this: 1. Are you using snake_case or camelCase in your response? I notice your JSON response uses
transfer_plan
and
summary_plan
(snake_case), but Vapi might be expecting
transferPlan
and
summaryPlan
(camelCase). This casing mismatch could be causing the issue, as mentioned in [Vapi documentation](https://docs.vapi.ai/call-forwarding). 2. Is your webhook response properly formatted with the required
toolCallId
and
result
fields?
According to [Vapi's tools documentation](https://docs.vapi.ai/tools-calling), your response should be structured like:
Copy code
json
{
  "results": [
    {
      "toolCallId": "X",
      "result": {
        "destination": {
          // your destination object
        }
      }
    }
  ]
}
3. Do you have the 'phone-call-control' server event enabled? This can interfere with Vapi's call forwarding logic. 4. Are you seeing any errors in your Vapi logs related to this call ID? This could provide more insight into what's happening during the transfer attempt. 5. Is your SIP system configured to handle SIP REFER messages? Vapi uses these for transfers, and incompatibility could cause issues. Sources: - [Vapi Call Forwarding Documentation](https://docs.vapi.ai/call-forwarding) - [Vapi Tools Calling Documentation](https://docs.vapi.ai/tools-calling) - [Dynamic Call Transfers Documentation](https://docs.vapi.ai/phone-calling/dynamic-call-transfers)
s
1. I am using camelCase. The snake_case above was from the webhook log. 2. I just modified my response to the transfer-destination-request webhook be formatted like this:
Copy code
"results": [
    {
      "toolCallId": "call_WkMZ8xVl8nxKV6ZQxdzNMS69",
      "result": {
        "destination": {
          "message": "I'm transferring you to Liz Reyes. Please hold.",
          "transferPlan": {
            "mode": "warm-transfer-with-message",
            "message": "Hey, this call has been forwarded through Vapi."
          },
          "type": "number",
          "number": "+12016944225",
          "numberE164CheckEnabled": true
        }
      }
    }
  ]
}
It broke the transfer functionality. Now instead of a blind transfer, it just doesn't transfer at all. It does make the tool_call_result a little different. it returns a result that isn't blank:
Copy code
{
  "name": "dynamicDestinationTransferCall",
  "role": "tool_call_result",
  "time": 1744659432551,
  "result": "No transfer destination returned.",
  "toolCallId": "call_WkMZ8xVl8nxKV6ZQxdzNMS69",
  "secondsFromStart": 11.429
}
3. phone-call-control is disabled 4. No errors observed. Vapi considers the call a "Pass" for the success evaluation, no failed webhooks. 5. Not using SIP, this is all PSTN to PSTN now.
@Vapi Support Bot any update on this issue? Thank you!
s
It only works using twilio number at the moment.
s
@Sahil @Vapi Support Bot @Vapi Reopening this. I've switched the destination number to a Twilio number and it is still performing blind transfers. Here is the destination object being sent to the transfer-destination-request request: Status 200
Copy code
"destination": {
    "message": "I'm transferring you to Liz. Please hold.",
    "transferPlan": {
      "mode": "warm-transfer-with-summary",
      "summaryPlan": {
        "enabled": true,
        "messages": [
          {
            "role": "system",
            "content": "Please provide a summary of the call."
          },
          {
            "role": "user",
            "content": "Here is the transcript:\n\n{{transcript}}\n\n"
          }
        ]
      }
    },
    "type": "number",
    "number": "+{{TWILIO_NUMBER}}",
    "numberE164CheckEnabled": true
  }
}
This occurred on callid
Copy code
49361ce7-f4a4-4c68-832d-8cce214a452b
Once I pick up on the twilio number, it blind transfers.
v
Try adjusting your call flow to ensure the warm message is fully played before the transfer executes:
Copy code
json
"transferPlan": {
  "mode": "warm-transfer-wait-for-operator-to-speak-first-and-then-say-message",
  "message": "This is a warm transfer from Vapi with customer information..."
}
This alternative mode waits for the operator to speak first before delivering your warm message, which may help prevent the blind transfer behavior. Source: - [Discord conversation about warm transfers](https://discord.com/channels/1211482211119796234/1316539646808686602)
s
I meant it should be twilio number
not the transfeee as twilio number
s
Sorry I’m not understanding. I purchased the number through Vapi. Are these not Twilio numbers? Or do I need to enter my Twilio credentials and use a number from my Twilio account?
s
No, number purchased through vapi are not twilio numbers.