Outbound calling

How cold calling works

Cold calling is Callable dialling a list of people, holding a real conversation with whoever answers, and writing down what happened. This page is the whole mechanism — every hop, every place a call can be stopped, and what one actually costs.

The eight stages

1  You set the campaign up      agent · contact list · calling hours · concurrency
        ↓
2  A worker wakes up            callable-cron → /api/cron/campaigns, every 60s
        ↓                       (not your browser — close the laptop, calls continue)
3  The tick decides who         min(pace, concurrency − in flight) · retry hold · quiet hours
        ↓
4  Telnyx rings the person      caller ID = the campaign's from number
        ↓
5  The call dials itself back   → re-enters as an INBOUND call (see below)
        ↓
6  Hear → think → speak         Deepgram → language model → ElevenLabs, on repeat
        ↓
7  Tools fire mid-conversation  book · transfer · look up · text · hand off
        ↓
8  Written down and billed      transcript · recording · outcome · metered every 60s

Stages 1–4 and 8 are ordinary request/response work. Stages 5–7 run for the whole call over one open websocket.

Why the call phones itself

This is the strangest part of the system and it looks like a bug. It is the fix.

When Telnyx places a call for us, it will not forward the other person's voice to our media socket. Not with any setting. The agent talks, the caller hears it perfectly, and our end receives zero audio frames. Calls coming in to a number always worked.

So a campaign call now dials out and, the moment the person answers, dials your own number — which makes it arrive as a normal inbound call, the kind that always worked.

Direct outbound              Bridge mode (what runs)
  Telnyx → person              Telnyx → person
  Telnyx ✗ media bridge        person → your number → inbound leg → media bridge
  agent talks, can't hear      agent talks AND hears

The cost of the workaround is one extra on-net leg per call.

If an agent greets and then cannot hear the caller, it is this — the carrier's audio fork, not the agent, the prompt, or the model. Five other explanations were tried and all five were wrong.

What can stop a call before it dials

Every tick, each of these can veto a number. When a campaign looks stuck, it is almost always one of them doing its job quietly.

| Gate | What it prevents | | --- | --- | | Pacing (per_minute) | Dialling your whole list in one tick and burning it | | Concurrency | More simultaneous live calls than you chose | | Tick overlap | Two cron ticks both dialling the same batch | | Retry hold | Redialling a no-answer immediately instead of later | | Quiet hours | Calling someone at 3am in their timezone | | Balance | Running up cost past what has been paid for | | Carrier caps (SMS) | Spiking an SMS campaign into a carrier block |

One turn of conversation

This loop runs every time the person stops speaking, and it is racing a human's patience — roughly a second and a half before silence starts to feel like a dropped call.

  1. Their speech streams to Deepgram, which transcribes it.
  2. The language model reads that plus the agent's prompt, knowledge base passages ranked against what they actually asked, the tool definitions, and the contact's fields.
  3. The reply is spoken sentence by sentence rather than after the model finishes — that single choice is most of the difference between a natural pause and an awkward one.
  4. ElevenLabs synthesizes each sentence and it streams straight back down the same socket.

Keeping it human

A caller notices robotic behaviour long before they notice a wrong answer, so several guards exist purely for how it feels:

  • Anti-repetition — if a reply mostly repeats the previous one, the agent says something short and human instead of re-reading its opening line. Asking the same question twice, reworded, is the single most robotic thing an agent does.
  • Echo guard — stops the agent replying to its own voice coming back down the line.
  • Sentence streaming — the reply starts while the rest is still being written.
  • One voice, every language — the multilingual model speaks every supported language with the same voice, so the agent doesn't become a different person when a caller switches language.
Known gap: on campaign calls the agent cannot currently be interrupted. It is the largest remaining difference between this and talking to a person.

Call length and billing

There is no time limit on a call. A caller and an agent can talk for as long as the conversation naturally lasts. Set Max call length on an agent only if you actively want a cap; leave it at 0 for none.

That is safe because usage is metered every 60 seconds during the call, not once at the end. Cost is bounded by a meter that runs as the call runs, rather than by a stopwatch cutting someone off mid-sentence. It also means a long call is never sitting unbilled, and nothing is lost if the media bridge restarts mid-conversation.

What a call actually costs

Measured from a real 66-second campaign call to a Pakistani mobile:

| Component | Share | | --- | --- | | Telephony (Telnyx, international) | 47% | | Language model | 31% | | Text-to-speech (ElevenLabs) | 21% | | Speech-to-text (Deepgram) | 1% |

Two things worth knowing from that. Telephony dominates on international destinations — the same call domestically is far cheaper. And the language model is usually the biggest lever you control: the whole prompt is re-sent every turn, so a large model on a chatty call adds up fast. Switching to a smaller model is a dropdown and often changes nothing a caller would notice.

What survives the call

| Record | Holds | | --- | --- | | Call session | One row per call — who, how long, outcome | | Transcript | Every line either side said | | Contact status | Answered, no answer, queued for retry | | Recording | The audio, both sides | | Usage | Minutes, characters, tokens — priced |

All of it lands on Results, and the contact status drives the campaign's own progress.

When something goes wrong

| Symptom | Nearly always | | --- | --- | | Greets, then can't hear you | The carrier audio fork — not the agent or prompt | | Campaign dials nothing | A gate above: quiet hours, retry hold, or an empty balance | | "I don't have that information" | Knowledge that never reached the model, not knowledge that's missing | | Answers with an apology line | The model provider is out of credit — the call itself is fine | | Long awkward pauses | A slow tool call |