{"slug":"cold-transfer","title":"Cold Transfer — Blind Transfer via SIP REFER and SWML connect","tags":["cold-transfer","blind-transfer","sip-refer","call-flow","signalwire"],"agent_summary":"Cold transfer (blind transfer) is the pattern where the original caller is connected directly to the destination without consultation. The transferring party drops immediately. Implemented in SWML via `connect: { to: ... }` after a brief message, or via SIP REFER without the Replaces header. Faster than warm transfer but caller may have to repeat themselves.","trigger_phrases":["cold transfer","blind transfer","SIP REFER blind","transfer without consultation","direct transfer voice","drop and dial"],"runnable":true,"markdown":"\n# Cold Transfer (Blind Transfer)\n\nA **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.\n\nContrast with [warm transfer](/topic/warm-transfer), where the destination is briefed first.\n\n## When to use cold transfer\n\n- Single-purpose routing (caller asked for billing → straight to billing queue)\n- High-volume IVR routing where context isn't critical\n- After-hours forwarding to on-call number\n- Caller already self-identified and the destination has CRM screen-pop\n\n## When NOT to use cold transfer\n\n- Lead handoff in B2B sales (warm gets higher conversion)\n- L1 → L2 escalation (L2 needs context)\n- Sensitive matters (insurance claims, healthcare)\n\n## SWML implementation — simplest pattern\n\n```yaml\nversion: 1.0.0\nsections:\n  main:\n    - answer: {}\n    - play: say:Transferring you to billing now.\n    - connect:\n        to: +13105551234\n        timeout: 30\n        from: +12125551111\n```\n\nThat'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.\n\n## SWML — connect to SIP endpoint\n\n```yaml\n- connect:\n    to: sip:agent42@pbx.example.com\n    timeout: 30\n    headers:\n      X-Caller-ID: \"${call.from}\"\n      X-Original-To: \"${call.to}\"\n```\n\nPass caller context to the destination via custom SIP headers. The destination PBX or CRM can use these for screen-pop.\n\n## SWML — connect with fallback\n\n```yaml\n- connect:\n    to: +13105551234\n    timeout: 25\n    on_no_answer:\n      - play: say:Sorry, no one is available right now.\n      - record_call: {}\n```\n\nIf 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.\n\n## Compatibility API (LaML)\n\n```xml\n<Response>\n  <Say>Connecting you to support, one moment.</Say>\n  <Dial timeout=\"30\" answerOnBridge=\"true\">+13105551234</Dial>\n  <Say>Sorry, we couldn't reach anyone. Please call back later.</Say>\n</Response>\n```\n\n`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.\n\n## SIP REFER (blind variant)\n\nFor a PBX-initiated blind transfer using REFER:\n\n```\nA ----INVITE----> B  [active call]\n                  B ----REFER-----> A  with Refer-To: <sip:C>\n                                       (no Replaces header → blind)\n                  B sends BYE to A immediately after sending REFER\n                  A ----INVITE----> C\n                  A and C connected\n```\n\nThis is the SIP-level mechanism behind PBX \"blind transfer\" buttons. SignalWire supports receiving REFER on customer SIP endpoints and bridging accordingly.\n\n## Cold transfer with screen-pop context\n\nTo make cold transfer feel less cold to the destination, pass context out-of-band:\n\n### Pattern 1: SIP header injection\n\n```yaml\n- connect:\n    to: sip:agent@pbx\n    headers:\n      X-Caller-Name: \"Bob Smith\"\n      X-Customer-ID: \"C-7842\"\n      X-Reason-Code: \"BILLING_DISPUTE\"\n```\n\nDestination PBX exposes headers to the CRM, which pops the customer record.\n\n### Pattern 2: Webhook fires CRM update before connect\n\n```yaml\n- request:\n    url: https://crm.example.com/screen-pop\n    method: POST\n    body:\n      agent_id: \"${agent_id}\"\n      caller: \"${call.from}\"\n      context: \"Billing dispute\"\n- connect:\n    to: sip:agent@pbx\n```\n\nThe destination agent's screen shows the customer record before the call rings through.\n\n### Pattern 3: Caller-ID injection\n\n```yaml\n- connect:\n    to: +13105551234\n    from: \"${call.from}\"\n    timeout: 30\n```\n\nSetting `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](/topic/stir-shaken). If the destination's network is strict, spoofed-looking caller IDs may be tagged as \"Spam Likely\".\n\n## Failure modes\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| Destination rings briefly then hangs up | `answerOnBridge` not set, caller hears nothing | Set `answerOnBridge: true` or use SWML `connect` (default behavior) |\n| Caller charged for unanswered call | Same — caller leg answered immediately | Same fix |\n| Destination phone shows your DID instead of caller | `from` not set to caller's number | Set `from: ${call.from}` (mind STIR/SHAKEN) |\n| 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 |\n| Long TTS message before transfer | Caller impatient, hangs up | 5-second max, or skip the TTS entirely for known-impatient flows |\n\n## Cold transfer vs warm transfer — decision matrix\n\n| Factor | Choose cold | Choose warm |\n|---|---|---|\n| Volume | High | Low |\n| Caller-CSAT priority | Medium | High |\n| Destination needs prep | No | Yes |\n| Setup complexity tolerance | Low | High |\n| Cost concern | Lower minutes | Higher minutes |\n| CRM screen-pop available | Yes | Either |\n\n## SignalWire cost note\n\nA 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:\n\n- 30 seconds inbound (greeting + transfer announcement)\n- 4:30 inbound bridged + 4:30 outbound bridged = 9 minutes bridged\n\nTotal: 9.5 billable minutes across two legs.\n\n## Related patterns\n\n- [Warm transfer](/topic/warm-transfer) — same goal, with consultation\n- [SWML connect verb](/topic/swml-connect-verb) — full reference\n- [Call routing strategies](/topic/call-routing-strategies) — choosing the destination\n\n## References\n\n- RFC 3515 — The SIP REFER Method\n- RFC 5359 — Session Initiation Protocol Service Examples (blind transfer §2.4)\n- SignalWire docs — SWML connect verb, Compatibility API Dial\n","html":"<h1>Cold Transfer (Blind Transfer)</h1>\n<p>A <strong>cold transfer</strong> 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.</p>\n<p>Contrast with <a href=\"/topic/warm-transfer\">warm transfer</a>, where the destination is briefed first.</p>\n<h2>When to use cold transfer</h2>\n<ul>\n<li>Single-purpose routing (caller asked for billing → straight to billing queue)</li>\n<li>High-volume IVR routing where context isn't critical</li>\n<li>After-hours forwarding to on-call number</li>\n<li>Caller already self-identified and the destination has CRM screen-pop</li>\n</ul>\n<h2>When NOT to use cold transfer</h2>\n<ul>\n<li>Lead handoff in B2B sales (warm gets higher conversion)</li>\n<li>L1 → L2 escalation (L2 needs context)</li>\n<li>Sensitive matters (insurance claims, healthcare)</li>\n</ul>\n<h2>SWML implementation — simplest pattern</h2>\n<pre><code class=\"language-yaml\">version: 1.0.0\nsections:\n  main:\n    - answer: {}\n    - play: say:Transferring you to billing now.\n    - connect:\n        to: +13105551234\n        timeout: 30\n        from: +12125551111\n</code></pre>\n<p>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 <code>connect</code> succeeds, A and C are bridged peer-to-peer through SignalWire and B (the script) exits.</p>\n<h2>SWML — connect to SIP endpoint</h2>\n<pre><code class=\"language-yaml\">- connect:\n    to: sip:agent42@pbx.example.com\n    timeout: 30\n    headers:\n      X-Caller-ID: \"${call.from}\"\n      X-Original-To: \"${call.to}\"\n</code></pre>\n<p>Pass caller context to the destination via custom SIP headers. The destination PBX or CRM can use these for screen-pop.</p>\n<h2>SWML — connect with fallback</h2>\n<pre><code class=\"language-yaml\">- connect:\n    to: +13105551234\n    timeout: 25\n    on_no_answer:\n      - play: say:Sorry, no one is available right now.\n      - record_call: {}\n</code></pre>\n<p>If the destination doesn't answer in 25 seconds, fall through to voicemail. The <code>on_no_answer</code> block fires only if the destination did not answer — it does NOT fire if the destination answered and hung up.</p>\n<h2>Compatibility API (LaML)</h2>\n<pre><code class=\"language-xml\">&#x3C;Response>\n  &#x3C;Say>Connecting you to support, one moment.&#x3C;/Say>\n  &#x3C;Dial timeout=\"30\" answerOnBridge=\"true\">+13105551234&#x3C;/Dial>\n  &#x3C;Say>Sorry, we couldn't reach anyone. Please call back later.&#x3C;/Say>\n&#x3C;/Response>\n</code></pre>\n<p><code>answerOnBridge=\"true\"</code> 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.</p>\n<h2>SIP REFER (blind variant)</h2>\n<p>For a PBX-initiated blind transfer using REFER:</p>\n<pre><code>A ----INVITE----> B  [active call]\n                  B ----REFER-----> A  with Refer-To: &#x3C;sip:C>\n                                       (no Replaces header → blind)\n                  B sends BYE to A immediately after sending REFER\n                  A ----INVITE----> C\n                  A and C connected\n</code></pre>\n<p>This is the SIP-level mechanism behind PBX \"blind transfer\" buttons. SignalWire supports receiving REFER on customer SIP endpoints and bridging accordingly.</p>\n<h2>Cold transfer with screen-pop context</h2>\n<p>To make cold transfer feel less cold to the destination, pass context out-of-band:</p>\n<h3>Pattern 1: SIP header injection</h3>\n<pre><code class=\"language-yaml\">- connect:\n    to: sip:agent@pbx\n    headers:\n      X-Caller-Name: \"Bob Smith\"\n      X-Customer-ID: \"C-7842\"\n      X-Reason-Code: \"BILLING_DISPUTE\"\n</code></pre>\n<p>Destination PBX exposes headers to the CRM, which pops the customer record.</p>\n<h3>Pattern 2: Webhook fires CRM update before connect</h3>\n<pre><code class=\"language-yaml\">- request:\n    url: https://crm.example.com/screen-pop\n    method: POST\n    body:\n      agent_id: \"${agent_id}\"\n      caller: \"${call.from}\"\n      context: \"Billing dispute\"\n- connect:\n    to: sip:agent@pbx\n</code></pre>\n<p>The destination agent's screen shows the customer record before the call rings through.</p>\n<h3>Pattern 3: Caller-ID injection</h3>\n<pre><code class=\"language-yaml\">- connect:\n    to: +13105551234\n    from: \"${call.from}\"\n    timeout: 30\n</code></pre>\n<p>Setting <code>from</code> 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 <a href=\"/topic/stir-shaken\">STIR/SHAKEN</a>. If the destination's network is strict, spoofed-looking caller IDs may be tagged as \"Spam Likely\".</p>\n<h2>Failure modes</h2>\n<p>| Symptom | Cause | Fix |\n|---|---|---|\n| Destination rings briefly then hangs up | <code>answerOnBridge</code> not set, caller hears nothing | Set <code>answerOnBridge: true</code> or use SWML <code>connect</code> (default behavior) |\n| Caller charged for unanswered call | Same — caller leg answered immediately | Same fix |\n| Destination phone shows your DID instead of caller | <code>from</code> not set to caller's number | Set <code>from: ${call.from}</code> (mind STIR/SHAKEN) |\n| 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 |\n| Long TTS message before transfer | Caller impatient, hangs up | 5-second max, or skip the TTS entirely for known-impatient flows |</p>\n<h2>Cold transfer vs warm transfer — decision matrix</h2>\n<p>| Factor | Choose cold | Choose warm |\n|---|---|---|\n| Volume | High | Low |\n| Caller-CSAT priority | Medium | High |\n| Destination needs prep | No | Yes |\n| Setup complexity tolerance | Low | High |\n| Cost concern | Lower minutes | Higher minutes |\n| CRM screen-pop available | Yes | Either |</p>\n<h2>SignalWire cost note</h2>\n<p>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:</p>\n<ul>\n<li>30 seconds inbound (greeting + transfer announcement)</li>\n<li>4:30 inbound bridged + 4:30 outbound bridged = 9 minutes bridged</li>\n</ul>\n<p>Total: 9.5 billable minutes across two legs.</p>\n<h2>Related patterns</h2>\n<ul>\n<li><a href=\"/topic/warm-transfer\">Warm transfer</a> — same goal, with consultation</li>\n<li><a href=\"/topic/swml-connect-verb\">SWML connect verb</a> — full reference</li>\n<li><a href=\"/topic/call-routing-strategies\">Call routing strategies</a> — choosing the destination</li>\n</ul>\n<h2>References</h2>\n<ul>\n<li>RFC 3515 — The SIP REFER Method</li>\n<li>RFC 5359 — Session Initiation Protocol Service Examples (blind transfer §2.4)</li>\n<li>SignalWire docs — SWML connect verb, Compatibility API Dial</li>\n</ul>\n"}