{
 "test": {
  "dates": "2026-09-16 to 2026-09-18",
  "caller": "Twilio PSTN line, scripted TTS caller (Amazon Polly Joanna; Lupe es-MX for Spanish turns), calls placed from Austin, TX",
  "agent_config": "Identical system prompt on both platforms: a dental-practice front desk. OpenAI gpt-4o on both. ElevenLabs voice on both (Vapi: 'sarah'; Retell: 'Adrian'). Deepgram transcriber on Vapi (nova-3); Retell default. One tool: book_appointment (pointed at a dead URL on purpose). One transfer destination (a Twilio number that answers).",
  "calls_placed": 80,
  "calls_lost": 20,
  "lost_reason": "Vapi wallet balance went to -$0.06 after one smoke-test call; Vapi will not run calls without prepaid credits, even with a card on file. The 20 calls connected at the carrier for 6-7 s and were never handed to the agent.",
  "spend_usd": 7.15,
  "calls_reached_agent": 60,
  "calls_used_on_pages": 50,
  "calls_excluded_our_misconfiguration": 10
 },
 "matrix": {
  "booking_dead_endpoint": {
   "retell": {
    "n": 5,
    "tool_invoked": 5,
    "false_success": 0,
    "disclosed_failure": 5
   },
   "vapi": {
    "n": 5,
    "tool_invoked": 5,
    "false_success": 0,
    "disclosed_failure": 5
   }
  },
  "transfer_live_destination": {
   "retell": {
    "n": 5,
    "connected": 5,
    "handoff_s": 10.0
   },
   "vapi": {
    "n": 5,
    "connected": 5
   }
  },
  "spanish_mid_call": {
   "retell": {
    "n": 5,
    "detected_or_escalated": 0,
    "kept_asking_in_english": 5
   },
   "vapi": {
    "n": 5,
    "transferred": 1,
    "stated_english_only": 1,
    "kept_asking_in_english": 3
   }
  },
  "silent_caller_28s": {
   "retell": {
    "n": 5,
    "greeting": 5,
    "reprompt": 5,
    "hung_up": 0
   },
   "vapi": {
    "n": 5,
    "greeting": 5,
    "reprompt": 0,
    "hung_up": 0
   }
  }
 },
 "latency_dual_channel": {
  "method": "webrtcvad aggressiveness 2, 20 ms frames, >=120 ms speech, RMS floor 400; caller segments merged across gaps <=600 ms; latency = caller-turn-end to next agent-speech-onset, from Twilio dual-channel recordings (ch0 agent, ch1 caller)",
  "per_turn_ms": {
   "retell": {
    "turn1_short_request": {
     "values": [
      680,
      540,
      640,
      600,
      680
     ],
     "median": 640
    },
    "turn2_name_and_phone_digits": {
     "values": [
      2560,
      2280,
      2020,
      2940,
      3000
     ],
     "median": 2560
    },
    "turn3_short_confirmation": {
     "values": [
      1000,
      1200,
      1500,
      1700,
      1300
     ],
     "median": 1300
    }
   },
   "vapi": {
    "turn1_short_request": {
     "values": [
      1620,
      1420,
      1460,
      1380,
      1500
     ],
     "median": 1460
    },
    "turn2_name_and_phone_digits": {
     "values": [
      2080,
      2080,
      2040,
      1860,
      1820
     ],
     "median": 2040
    },
    "turn3_short_confirmation": {
     "values": [
      1380,
      1560,
      1440,
      860,
      2060
     ],
     "median": 1440
    }
   }
  },
  "all_turns_ms": {
   "retell": {
    "n": 15,
    "p50": 1300,
    "p90": 2940,
    "min": 540,
    "max": 3000
   },
   "vapi": {
    "n": 15,
    "p50": 1560,
    "p90": 2080,
    "min": 860,
    "max": 2080
   }
  },
  "vendor_self_report": {
   "retell_e2e_p50_ms_from_api": 1682,
   "vapi": "no equivalent field; Vapi exposes per-message timestamps only"
  }
 },
 "friction": [
  "Neither free tier can place or receive a real call. Both require a card on file.",
  "Vapi additionally requires prepaid credits ($10 minimum); a card alone leaves the wallet at $0 and inbound calls are dropped at the carrier after ~6 s with no call object created.",
  "Numbers bought on Vapi carry a daily outbound call limit (Vapi's own API error text) and the default account concurrency limit is 4.",
  "Retell requires KYC before issuing a number, and the KYC flow starts only by buying a number in the dashboard; the API returns 403 until then. Numbers are ~$2/mo.",
  "Retell deprecated the single-agent phone-number fields (inbound_agent_id) on 2026-03-31; the current schema is inbound_agents/outbound_agents with weights.",
  "Twilio's default call recordings are mono and begin after the agent has already started speaking; use RecordingChannels=dual if you intend to measure anything."
 ]
}