Cold Transfer (Blind Transfer)
A cold transfer connects the original caller directly to the destination party with no consultation. The transferring party (AI receptionist or human agent) drops off immediately or before the destination answers. The destination picks up cold — they have no idea who is calling or why.
Contrast with warm transfer, where the destination is briefed first.
When to use cold transfer
- Single-purpose routing (caller asked for billing → straight to billing queue)
- High-volume IVR routing where context isn't critical
- After-hours forwarding to on-call number
- Caller already self-identified and the destination has CRM screen-pop
When NOT to use cold transfer
- Lead handoff in B2B sales (warm gets higher conversion)
- L1 → L2 escalation (L2 needs context)
- Sensitive matters (insurance claims, healthcare)
SWML implementation — simplest pattern
version: 1.0.0
sections:
main:
- answer: {}
- play: say:Transferring you to billing now.
- connect:
to: +13105551234
timeout: 30
from: +12125551111
That's it. Caller hears the announcement, then the call is bridged to the destination. The transferring party (the SignalWire-hosted script) does not stay on the line — once connect succeeds, A and C are bridged peer-to-peer through SignalWire and B (the script) exits.
SWML — connect to SIP endpoint
- connect:
to: sip:agent42@pbx.example.com
timeout: 30
headers:
X-Caller-ID: "${call.from}"
X-Original-To: "${call.to}"
Pass caller context to the destination via custom SIP headers. The destination PBX or CRM can use these for screen-pop.
SWML — connect with fallback
- connect:
to: +13105551234
timeout: 25
on_no_answer:
- play: say:Sorry, no one is available right now.
- record_call: {}
If the destination doesn't answer in 25 seconds, fall through to voicemail. The on_no_answer block fires only if the destination did not answer — it does NOT fire if the destination answered and hung up.
Compatibility API (LaML)
<Response>
<Say>Connecting you to support, one moment.</Say>
<Dial timeout="30" answerOnBridge="true">+13105551234</Dial>
<Say>Sorry, we couldn't reach anyone. Please call back later.</Say>
</Response>
answerOnBridge="true" is critical — without it, SignalWire answers the inbound leg immediately (consuming billable minutes) instead of waiting for the destination to answer. With it, the inbound leg only "answers" when the destination picks up, so the caller hears ringing until then.
SIP REFER (blind variant)
For a PBX-initiated blind transfer using REFER:
A ----INVITE----> B [active call]
B ----REFER-----> A with Refer-To: <sip:C>
(no Replaces header → blind)
B sends BYE to A immediately after sending REFER
A ----INVITE----> C
A and C connected
This is the SIP-level mechanism behind PBX "blind transfer" buttons. SignalWire supports receiving REFER on customer SIP endpoints and bridging accordingly.
Cold transfer with screen-pop context
To make cold transfer feel less cold to the destination, pass context out-of-band:
Pattern 1: SIP header injection
- connect:
to: sip:agent@pbx
headers:
X-Caller-Name: "Bob Smith"
X-Customer-ID: "C-7842"
X-Reason-Code: "BILLING_DISPUTE"
Destination PBX exposes headers to the CRM, which pops the customer record.
Pattern 2: Webhook fires CRM update before connect
- request:
url: https://crm.example.com/screen-pop
method: POST
body:
agent_id: "${agent_id}"
caller: "${call.from}"
context: "Billing dispute"
- connect:
to: sip:agent@pbx
The destination agent's screen shows the customer record before the call rings through.
Pattern 3: Caller-ID injection
- connect:
to: +13105551234
from: "${call.from}"
timeout: 30
Setting from to the original caller's number means the destination's caller ID shows the actual caller, not the SignalWire DID. Useful for callbacks but be careful with STIR/SHAKEN — see STIR/SHAKEN. If the destination's network is strict, spoofed-looking caller IDs may be tagged as "Spam Likely".
Failure modes
| Symptom | Cause | Fix |
|---|---|---|
| Destination rings briefly then hangs up | answerOnBridge not set, caller hears nothing | Set answerOnBridge: true or use SWML connect (default behavior) |
| Caller charged for unanswered call | Same — caller leg answered immediately | Same fix |
| Destination phone shows your DID instead of caller | from not set to caller's number | Set from: ${call.from} (mind STIR/SHAKEN) |
| Some calls cold-transfer, some don't | Race between connect and TTS — caller hangs up during the message | Move "transferring you now" before connect, keep it short |
| Long TTS message before transfer | Caller impatient, hangs up | 5-second max, or skip the TTS entirely for known-impatient flows |
Cold transfer vs warm transfer — decision matrix
| Factor | Choose cold | Choose warm | |---|---|---| | Volume | High | Low | | Caller-CSAT priority | Medium | High | | Destination needs prep | No | Yes | | Setup complexity tolerance | Low | High | | Cost concern | Lower minutes | Higher minutes | | CRM screen-pop available | Yes | Either |
SignalWire cost note
A cold transfer is one inbound leg + one outbound leg. Pricing is the sum of both leg-minutes. A 5-minute transferred call where the connect bridges 4:30 of conversation bills:
- 30 seconds inbound (greeting + transfer announcement)
- 4:30 inbound bridged + 4:30 outbound bridged = 9 minutes bridged
Total: 9.5 billable minutes across two legs.
Related patterns
- Warm transfer — same goal, with consultation
- SWML connect verb — full reference
- Call routing strategies — choosing the destination
References
- RFC 3515 — The SIP REFER Method
- RFC 5359 — Session Initiation Protocol Service Examples (blind transfer §2.4)
- SignalWire docs — SWML connect verb, Compatibility API Dial