Skip to content

Customer experience AI

Voice and chat agents that resolve, escalate — or admit they don’t know

We build voice and messaging agents that live inside an 800ms voice-to-voice budget, answer only from passages retrieved out of your own knowledge base, and write the outcome back into Zendesk, Salesforce or whatever is your system of record. The constraint we hold to: nothing irreversible — a refund, a cancellation, an eligibility decision — happens without a human approving it, and the route to that human is designed before the agent is.

30 minutes with the engineer who would do the work — not a salesperson. No obligation, and you keep whatever we work out on the call.

A support team handling escalations alongside voice and chat agents

What we design against

800ms
voice-to-voice p50 we design toGaps in human conversation average ~500ms and anything over 800ms reads as broken. Budget split per Daily/Pipecat: mic/network 50–100ms, VAD 50–100, STT 100–200, LLM TTFT 80–100, TTS TTFB 80–100, playback 50–100. p95 ceiling 1,500ms. That budget holds only for turns with no tool call. A CRM lookup adds 300–800ms, so the turns that actually do the work miss 800ms every time — those turns get a spoken filler and a second budget: acknowledgement out inside 800ms, answer inside 2.5s, and a hard rule that the agent never goes silent while a tool call is in flight. Anyone quoting you one sub-second figure has not run a call that touched a CRM.
35–60%
first-year voice containment, scoped intentsPublished industry range for scoped LLM voice agents, against 20–40% for legacy DTMF IVR. We baseline word error rate on your own call recordings before quoting your number, never the other way round.
76%
average chat resolution rate reported by IntercomIntercom’s published Fin average across 12,000+ customers; mature deployments above 85%, improving roughly one percentage point a month. A vendor figure on their traffic, not a Palamed result.
12–25%
word error rate on Bulgarian telephony audioAgainst 8–15% for English telephony and 5–8% for clean English wideband. Names, ЕГН digit strings and code-switched English tech terms are where it degrades — which is why identification runs DTMF-first with ASR fallback.

What we build

Contact-centre agent on a call wearing a headset at a desk

Bilingual voice agents on the SIP trunk you already have

Telephony audio arrives as G.711 µ-law, 8 kHz, mono — narrowband, and structurally harder than any demo recording. We run LiveKit Agents or Twilio ConversationRelay against your existing trunk, Deepgram Nova-3 for Bulgarian, ElevenLabs Flash v2.5 for output. Flux, the turn-detection-native model, has no Bulgarian — and neither LiveKit’s multilingual turn detector nor the common semantic endpointers list bg. So a BG agent runs tuned Silero VAD endpointing plus Deepgram `utterance_end_ms`, which costs us roughly 150–250ms of extra end-of-utterance delay against an English agent. We budget for that rather than pretend it away, and where a client’s volume justifies it we fine-tune a turn model on their own Bulgarian transcripts and report the before/after EOU distribution.

  • A latency waterfall per call — EOU delay, STT finalisation, LLM TTFT, TTS TTFA, playback — reported at p50 and p95, not as one “sub-second” number
  • Barge-in that actually stops: Twilio `clear` or LiveKit `interrupt()` to flush buffered audio, echo cancellation so the agent stops interrupting itself, and backchannel suppression so “да”, “аха” and “мхм” do not count as interruptions. The settings we tune rather than accept: Deepgram `endpointing` (the 10ms default is useless in production) paired with `utterance_end_ms`, LiveKit `false_interruption_timeout` moved off its 2.0s default, ConversationRelay `speechTimeout` inside its 600–5,000ms range and `ignoreBackchannel` on
  • Vocabulary biasing for your tariff names, SKUs and Bulgarian surnames — noting that Deepgram’s keyterm prompting is an English Nova-3 feature, so a `bg` stream gets the older `keywords` boosting and we measure what that actually buys on your recordings rather than assuming; where it buys too little, alphanumerics go DTMF-first with a phonetic read-back loop
Support specialist checking a knowledge-base article beside a chat window

Grounded answers, and a refusal path that works

Answers are constrained to passages retrieved from your knowledge base, with citation coverage measured and gated in CI — a prompt change that drops groundedness below threshold does not ship. Anything outside the corpus takes an explicit refuse-and-escalate route, and refusal is a measured rate rather than a mood: we track it against the in-scope question set, and anything above 10% is treated as a knowledge-base defect to fix rather than a prompt to tune — a bot that refuses too rarely is fabricating, and one that refuses too often is an expensive queue. Refunds, cancellations and eligibility stay human-approved recommendations.

  • Groundedness and citation-coverage gates in CI, with a production floor of 95% of claims traceable to a retrieved passage
  • Human-in-the-loop confirmation before any irreversible action — refund, cancellation, contract change, eligibility call
  • The knowledge-gap backlog shipped as a month-one artifact: the questions customers asked that no article answers, ranked by volume
Support colleague leaning over to help with a customer case

Escalation and handover engineering

The bot usually works; the last twenty seconds of it do not. We specify the escalation contract first — named triggers (explicit request, repeated failure, vulnerability signal, high-value account, regulated topic), a structured payload carrying verified identity, intent, attempted tool calls and a transcript summary, and hours-aware routing that offers a callback instead of dumping into a closed queue. SIP REFER drops context silently unless you carry it out-of-band.

  • The actual JSON payload handed to the agent desktop, plus the escalation reason-code taxonomy behind it
  • Warm transfer on complaint and high-value paths; cold REFER only where the summary and verified account ID travel with the call
  • Every escalation instrumented — reason code, time-to-human, and whether the customer had to repeat information
Hands holding a phone showing a customer messaging conversation

Viber and WhatsApp as one conversation service

In Bulgaria the messenger is Viber, and Viber has its own commercial surface most integrators get wrong: transactional sends need registered templates, session messages and transactional messages are separate classes with separate consent and separate pricing, and notification opt-in has to be evidenced per subscriber. WhatsApp is the second channel and mostly a policy problem — free-form replies inside the 24-hour customer service window (service messages free since November 2024), approved templates outside it, per-message pricing since July 2025, and a 72-hour all-free window opened by an ad or page-CTA click that is worth routing deliberately. A proactive “your parcel is late” notice must be a utility template; miscategorised templates get rejected, cost more, and drag your quality rating toward red. Both channels land in one conversation service and one ticket per customer in Zendesk or Intercom.

  • Template set drafted, categorised and submitted as utility rather than marketing, with opt-in evidence retained
  • Quality rating and the 250 → 2K → 10K → 100K messaging tiers wired to an alert, not reviewed quarterly
  • Order lookup joining your shop platform to Econt, Speedy or DHL tracking inside a single customer thread
Quality analyst reviewing call transcripts with headphones on

Evals, automated QA and a kill switch with a named owner

Every prompt and model change replays against a frozen set of your real conversations, scored by an LLM judge calibrated to a human-scored sample and drift-checked monthly. Automated QA runs the scorecard your team already uses across 100% of conversations instead of the usual 1–3% manual sample, adding dead air, talk-over and knowledge gaps. A human holdout cohort stays live throughout.

  • Golden set of replayed real conversations in CI, so a well-meant prompt edit cannot silently break four unrelated flows
  • Alerting on the metrics that predict failure: voice-to-voice p95, interruption rate, ASR confidence distribution, tool-call error rate
  • A tested kill switch back to the existing IVR or an out-of-hours message, with a named person who owns it at 02:00
Small customer-service team in a short stand-up meeting

What happens to the queue and the people in it

Containment is our metric; your metric is headcount, shrinkage and SLA attainment. So we re-run your Erlang C on the post-automation mix rather than the old one — and we model the effect nobody quotes: automation takes the easy contacts first, so the contacts left for humans get harder and AHT on the residual typically rises 15–30%. A 40% containment rate is not a 40% headcount saving, and at the 26–35% shrinkage Call Centre Helper reports as typical, the difference is usually two to three FTE of the saving you were promised.

  • The revised staffing model before you sign — forecast volume and post-automation AHT through Erlang C, at your real occupancy ceiling (~83%) and your real shrinkage, not a vendor’s
  • Service level, abandon rate and FCR tracked against the pre-launch baseline, because those are the numbers your board asks about, not containment
  • The case where the honest answer is that you save schedule flexibility and SLA stability rather than people — we will say so before the contract, not after the pilot

Systems we work with

We integrate with what you already run. If a platform below is missing, tell us — the pattern usually transfers.

Telephony and voice runtime

  • Twilio Programmable Voice, Media Streams (µ-law 8 kHz over WSS), ConversationRelay
  • Twilio Elastic SIP Trunking and Flex
  • LiveKit Agents and LiveKit SIPREFER transfer, RFC 2833/4733 DTMF
  • Pipecat (Daily) with TTFB/TTFA observers
  • OpenAI Realtime API over WebRTC
  • WebSocket or SIP
  • Asterisk, FreeSWITCH, Kamailio; AudioCodes and Ribbon SBCs

Speech, turn-taking and synthesis

  • Deepgram Nova-3 (Bulgarian supported) and Flux (English plus nine languages, no Bulgarian)
  • ElevenLabs Flash v2.5
  • Multilingual v2
  • Scribe v2 Realtime
  • Cartesia Sonic
  • Azure Neural TTS
  • Amazon Polly
  • Silero VAD and WebRTC VADno semantic turn model on the market lists Bulgarian, so BG endpointing is tuned VAD plus `utterance_end_ms`
  • Whisper large-v3 and faster-whisper for batch transcription and QA

Helpdesk, CRM and messaging channels

  • Zendesk Suite
  • Zendesk AI Agents
  • Action Builder
  • Zendesk QA
  • Intercom Fin, Salesforce Service Cloud and Agentforce, HubSpot Service Hub
  • Genesys Cloud CX
  • Amazon Connect with Contact Lens
  • Freshdesk
  • Gorgias
  • WhatsApp Business Cloud API via 360dialog or Infobip; Viber Business Messages via Infobip, Sinch or Twilio
  • Model Context Protocol connectors into the helpdesk and order systems

Retrieval, evaluation and compliance controls

  • pgvector
  • Elasticsearch
  • Pinecone
  • Weaviate
  • LangSmith, Langfuse, Braintrust for tracing and eval runs
  • PII redaction at ingest for ЕГН
  • IBAN
  • card and health data
  • DTMF suppression and pause-and-resume recording for PCI DSS v4.0.1 descoping
  • EU-region inference endpoints with no-training contractual terms

How the work runs

  1. 01

    Conversation baseline

    2 weeks

    What you keep

    An intent taxonomy built from 1,000+ of your real historical conversations, with word error rate measured on your own recordings, volume and handle time per intent, and the containment ceiling each intent actually supports.

    The decision it forces

    Which three to five intents go first — and which we are explicitly not automating in phase one, with a reason written against each one.

    When we stop

    If the top intents are driven by a broken upstream process — wrong invoices, late parcels, a returns policy nobody can explain — we say so and stop. An agent that explains the mistake faster is not a fix.

  2. 02

    Replay, not demo

    3 weeks

    What you keep

    A replay report: those conversations run offline against the built agent, showing what would have resolved, what would have escalated and what would have gone wrong — plus the knowledge-gap backlog and the measured groundedness score.

    The decision it forces

    Go or no-go on live traffic, and the containment number we will commit to — derived from your transcripts, not from a vendor benchmark.

    When we stop

    Citation coverage under 95% gets two remediation passes inside these three weeks. If it is still under after them — or the knowledge base is simply too stale and contradictory to ground answers — phase 3 is not invoiced. You keep the replay report and the knowledge-gap backlog for the phase-2 fee already paid, and knowledge remediation goes out as a separate proposal you are free to give to someone else.

  3. 03

    Live on a bounded slice

    4–6 weeks

    What you keep

    A production agent on one queue, one language and defined hours, reporting weekly: the latency waterfall, escalation reason codes, a false-containment audit that subtracts abandons and 72-hour repeat contacts, and a human holdout cohort.

    The decision it forces

    Widen the intent set, widen the hours, or roll back — decided on the holdout comparison rather than on the headline containment figure.

    When we stop

    The primary gate is seven-day repeat-contact rate against the holdout, because every contact produces one and it is decidable inside four weeks. CSAT is the confirming signal, held to within three points of the holdout on comparable intents — and we tell you at the start of phase 3 how many CSAT responses the slice will actually produce, because at 5–15% response rates a five-point gap on one queue is usually inside the noise and we are not going to pretend otherwise. If the repeat-contact gate fails, the slice rolls back to IVR and we stop billing the retainer until the gap closes; if it fails because we mis-scoped the intents, the phase-3 fee is not billed at all.

  4. 04

    Handover and runbook

    2–3 weeks

    What you keep

    The runbook: alert thresholds, the regression eval suite running in your CI, the kill switch and its owner, the EU AI Act Article 50 disclosure wording, the GDPR retention schedule per data category and the DPIA input.

    The decision it forces

    Who operates this — your team, ours on a retainer, or a split — with the eval suite as the contractual definition of “still working”.

    When we stop

    If nobody inside the company will own the eval suite, we do not hand over. An unowned agent degrades on the first well-intentioned prompt edit and nobody notices for a quarter.

An agent that says it does not know beats one that confidently invents an answer.

What you are probably thinking

We tried a chatbot in 2019 and it was a disaster.

It probably was, and the reason is architectural rather than a matter of effort: an intent classifier with hand-built dialogue trees broke on any phrasing outside its training data. What changed is retrieval over your actual knowledge base plus tool calls into your actual systems, with the escalation path specified first. The honest test is not a demo — it is replaying a thousand of your own historical conversations and showing you what would have resolved, what would have escalated, and what would have gone wrong.

Containment measures the bot, not the customer.

Agreed, and raw containment is trivially gameable — a caller who gives up is counted as contained. The definition we work to subtracts abandoned sessions and any session followed by a repeat contact within 72 hours, and we publish the false-containment audit before you ask for it, targeting under 5%. If containment rises while repeat-contact rate rises, the deployment is failing whatever the dashboard says. Escalation rate is the number your workforce planning actually staffs against, so that is what we report alongside it.

It will hallucinate a policy and commit us to something.

This is the realest risk on the list and there is case law: in Moffatt v Air Canada (British Columbia Civil Resolution Tribunal, February 2024) the airline argued its chatbot was a separate entity responsible for its own statements, lost, and paid the fare difference its bot had invented. More recently, Cursor’s support bot invented a device-limit policy and triggered public cancellations. The mitigations are mechanical rather than reassuring — answers constrained to retrieved passages, citation coverage gated in CI so a prompt change cannot ship below threshold, an explicit refuse-and-escalate path for anything outside the corpus, and hard human-in-the-loop gates on refunds, cancellations and eligibility. GDPR Article 22 pushes in the same direction: decisions with legal or similarly significant effect stay recommendations a person approves.

Bulgarian speech recognition is not good enough for real customers.

Partly true, and worth naming precisely instead of waving away. Bulgarian is supported by Deepgram Nova-3 and by ElevenLabs’ multilingual and Flash v2.5 models — but Flux, the ASR built specifically for voice-agent turn detection, covers English plus nine languages and Bulgarian is not among them. Nor does LiveKit’s multilingual turn detector, nor the common semantic endpointers, list bg. So a BG agent runs tuned Silero VAD plus Deepgram `utterance_end_ms` instead of STT-native endpointing, and pays roughly 150–250ms of extra end-of-utterance delay for it; where volume justifies it we fine-tune a turn model on your own transcripts and show you the before/after EOU distribution. Telephony word error rate on Bulgarian names, ЕГН digit strings and code-switched English terms runs materially worse than English, and Deepgram’s keyterm prompting is an English Nova-3 feature, so a `bg` stream gets the older `keywords` boosting instead. That is why identification is DTMF-first, why we measure what vocabulary biasing actually buys on your recordings, and why we measure WER on those recordings before quoting a containment number.

GDPR — we cannot send customer conversations to a US model provider.

Handled in the architecture, not with a DPA and a shrug. EU-region inference endpoints, no-training contractual terms, retention windows set per data category rather than one global default, and a documented lawful basis with the Article 35 DPIA input written as we go. PII redaction runs at ingest, with measured recall: we report redaction recall per entity type on your own transcripts, because ЕГН detection on 8 kHz Bulgarian audio carrying 12–25% word error rate is not 100%, and anyone who tells you it is has not measured it. Residual leakage is handled by a second pass and a short retention window on raw audio, not by a promise. And the honest part your DPO will raise, which we would rather raise first: an EU region does not put a US-parent provider outside the CLOUD Act, so the Chapter V transfer impact assessment still has to be written — we write it, we do not wave the region at you. Voice recordings used to identify a person are Article 9 biometric data, which is a separate consent question we will raise before you do.

Per-resolution pricing means you are incentivised to call things resolved.

A fair read of the market, and the reason we do not charge that way: our phases are fixed price and operation is a fixed monthly retainer, so no invoice of ours moves when a resolution gets counted. Where you do buy per-resolution — from a helpdesk vendor, or from anyone else — define resolution in the contract rather than in the dashboard: no human touch, no repeat contact within seven days, no negative CSAT. Then audit it on a sample and have both parties report the number independently. If the definition lives only in the vendor’s dashboard, it is not a metric, it is an invoice.

Our CRM is on-prem from 2011 and has no real API.

Common, usually solvable, and honestly priced — the ladder in order of preference. First, whatever SOAP or REST surface already exists, however ugly. Second, a read replica for lookups plus a thin write service in front of the one or two operations the agent genuinely needs. Third, RPA as a bridge, with a fragility budget named in the contract: expected breakage per vendor UI change, who fixes it, and inside what response time — an RPA path nobody has budgeted to maintain fails in month four. Fourth, queue-and-reconcile, where the agent writes to the helpdesk and a batch job syncs, which is honest about latency instead of pretending to be real time. What we will not do is quote you a containment rate that depends on real-time writes your system cannot support.

Generated Bulgarian sounds like a robot and our brand voice matters.

Voice selection is a measurable decision rather than a taste one: we A/B candidate voices on completion rate and CSAT, not on which one the room liked in the demo. The things that actually break Bulgarian TTS are specific and testable — the vocative case (Иване, not Иван, when the agent addresses someone), the suffixed definite article, number and currency reading (сметката е 42,60 лв. read as a sum rather than digits), and surnames interpolated into templates, where the wrong stress makes the whole sentence sound synthetic. We build a pronunciation lexicon for your product and tariff names and test it on the templates you actually send. Where synthesis cannot carry a segment convincingly — condolences, complaint openings, anything with weight — that segment stays human.

When we are the wrong choice

  • What we have not done: we have not yet run a production Bulgarian voice agent for a contact centre at your volume. Our shipped work is a European car marketplace with 300,000+ listings, the Ministry of Education and Science dictionary at beron.mon.bg, an NLP module that reads, classifies and answers trading questions arriving by email and Instagram — drafted from the product and pricing data the client already maintains, every reply approved by a person before it sends, about 85% less manual typing on repeat questions — and email automation that cut a beauty brand’s outreach time by about 60%. Both percentages are the clients’ own measurements. Everything above is the architecture we build to and the numbers we design against, sourced and labelled — not results we are claiming. The two-week baseline is priced so you can find out what we are worth on your own audio before you commit to anything.
  • Below roughly 2,000 contacts a month across all channels the arithmetic rarely works. The cost of making an agent safe — evals, redaction, escalation design, a runbook — barely shrinks with volume, and a well-written help centre plus a shared inbox will usually beat us on payback.
  • If the brief starts with a headcount number and works backwards to an intent list, we are the wrong supplier. That sequence is how deployments end up reversing publicly. We scope by intent, and we will not quote a containment rate that depends on real-time writes your systems cannot support.
  • We will not run emotion recognition on your own staff — it has been a prohibited practice in the workplace under the AI Act since 2 February 2025 — and we will not build an AI-only funnel with no text channel and no reachable human, which the European Accessibility Act and consumer-protection rules both close off. If either is in the brief, it needs a different supplier.

Questions we get asked

How do we decide which intents are worth automating at all?

Volume times handle time, filtered by whether the agent can actually complete the task in your systems. An intent that needs a real-time write your CRM cannot support is not automatable however common it is — it becomes a triage-and-route intent instead. We publish the list of what we are deliberately not automating in phase one, with a reason each, because that list is more useful to you than the list we are.

Why not just turn on Fin or Zendesk AI Agents?

For English chat, on a clean helpdesk, with intents your knowledge base already answers: buy it. We will tell you so and not bid. Off-the-shelf stops at four places, and those four are where we start. Bulgarian voice on your own SIP trunk — no helpdesk vendor ships a BG voice agent. Write-back into systems with no modern API. Per-automated-resolution pricing, which stops making sense against a build once monthly resolutions run into the thousands — do that arithmetic at your vendor’s own per-resolution rate before you sign anything, including with us. And the escalation payload into an agent desktop the vendor does not own. If none of those four is your situation, you do not need us.

What does this actually cost us per contact once it is running?

Western European published ranges put voice at €3–8 per human-handled contact and chat at €1.50–4 — do not use them here. A fully-loaded Bulgarian agent at €1,500–2,200 a month handles roughly 1,000–1,100 contacts at the Call Centre Helper industry standards (6m03s average handle time, ~83% occupancy, 30% shrinkage), which is €1.35–2.20 per contact. That is the number your business case has to beat, and it is why the volume floor further down this page is 2,000 contacts a month rather than 500. Against it: messaging and chat contained by AI runs €0.10–0.30. Inbound voice is €0.35–0.90 for a four-minute call — inference is cents, the number and the media path are the rest. Outbound to a Bulgarian mobile is a different business: at roughly $0.21 a minute against $0.033 to a landline, termination alone is €0.70–0.80 on a four-minute call, so outbound voice only pays where the contact is worth more than a euro. Chase the telephony line, not the model line.

Do we have to tell customers they are talking to an AI?

Yes. EU AI Act Article 50 has applied since 2 August 2026: people must be told they are interacting with an AI unless it is obvious, at first interaction, and synthetic audio has to be marked machine-readably. The Digital Omnibus that came into force on 27 July 2026 delayed Annex III high-risk classification to 2 December 2027 but left the disclosure duty alone. Commercially it costs nothing measurable in containment and removes a whole class of complaint.

What happens to us on Black Friday at three times the volume?

The failure point is concurrency limits at the ASR and TTS providers, not the language model. We reserve or provision capacity where the vendor sells it, keep a secondary TTS behind a health check, degrade gracefully to a shorter deterministic flow under load, and set a hard rule that when voice-to-voice p95 crosses threshold the agent routes to queue rather than delivering three-second pauses. That is load-tested against your peak forecast, not assumed.

Klarna reversed course on this — why would we not?

Klarna’s numbers were real: 2.3 million conversations in month one, median resolution from 11 minutes to under two, 25% fewer repeat inquiries. So was the reversal — the CEO said cost had become too dominant and quality suffered. Note that Klarna still runs AI on roughly two-thirds of contacts. The lesson is not “do not automate”, it is “do not automate to a headcount target”: scope by intent, keep a well-paid human tier for complex and emotional work, and keep the route to a person obvious.

How do we keep card payments out of PCI scope?

On card capture the agent hands the leg to a descoped capture flow. DTMF suppression masks the tones, the recording pauses, and — the part that matters for a voice agent and that most descriptions omit — the media fork to the STT provider and to the model provider is cut for the duration, because pausing the recorder does nothing about the socket streaming to your ASR vendor. The digits go straight to the payment gateway. No PAN and no CVV in the recording, the transcript or the logs; CVV must never be stored after authorisation under PCI DSS, and v4.0.1 does not soften that. The conversational layer keeps identification, plan negotiation and scheduling, then hands off.

Warm light ribbons on a dark field

What would our own conversations look like, replayed against an agent?

Send us a month of anonymised transcripts or call recordings from a single queue. We come back with an intent taxonomy, word error rate measured on your audio, and the three intents where containment is genuinely reachable.

Scoped first step: a two-week conversation baseline on one queue, fixed price — and you keep the taxonomy and the WER report whether or not we build anything. The full path to live on one queue is 11–16 weeks across four gated stages, each priced fixed before it starts against the ranges published on /how-we-work — and we will tell you at week two if the baseline says it is not worth spending.