From someone dialling your number to the record of what they wanted. Follow
the arrows; where the path splits, the question tells you which way it goes.
The colours are the point — they show who is doing
the work at each step, and how little of it is us.
RubyDoo Phone — we build and run this ElevenLabs — we configure it, it does the work Your business apps Vonage & the caller — outside any of our code Not built yet A decision — the path splits here
Drag anywhere on the background to move around.
1 Setting it up — once
Buy a number
Search, pick one, it is yours in seconds
Connect your apps
Sign in to Service Request, CRM, Books — once each
Pick the tools
Six of Service Request’s forty-nine, not all of them
Write the agent
What it says, which voice, how it opens
2 Handed over
The agent exists at ElevenLabs
Prompt, voice, number and tool list, pushed by us
Your app tokens live here too — revocable in each app if you ever need to
3 The call arrives
Someone dials your number
A customer, usually — not your staff
Vonage picks up
and asks us what to do with it
“Send it to ElevenLabs”
One line of JSON. The only thing we say about the call.
ElevenLabs takes the call
From this point the audio is theirs. It never reaches us.
4 Before it speaks
“Who is calling?”
ElevenLabs waits for our answer before the first word
We look up the number
Caller ID arrives with the call — we match it to a contact
Have we spoken to this caller before?
Greets them by name
and knows the job they called about last week
Greets them cold
and asks who it is speaking to
5 The conversation
They talk
Speech in, Claude decides, speech out — all inside ElevenLabs
Does it need something from your business?
Answers from what you told it
Hours, service area, whether an estimate is free
Calls your app directly
Opens the service request, reads the ticket, adds a note
Service Request · CRM · Books · Documents · Property
Each one enforces its own permissions, as it always has
We are not in this path. ElevenLabs calls your app and reads the answer straight back to the caller.
6 How it ends
Can the agent finish this on its own?
Wraps up and hangs up
The job is logged before the caller puts the phone down
Hands off to a person
Rings whoever is on call, and says why
7 After the call
ElevenLabs tells us what happened
Transcript, what it cost, every tool it touched
We keep the record
Transcript, the details it pulled out, and the caller it belongs to
Charged to the wallet
Per call, per minute — not a monthly guess
Texts them a summary
Same number, same conversation
not built yet
Where the code lives
Four separate things. Note what is not connected: the mobile
app’s backend is a different product with its own tokens, and nothing
on this page runs through it.
ElevenLabs
one workspace
Answers the phone, runs the conversation, calls the tools
AgentsSIPSpeechTool calls
RubyDoo Phone
you are here
One Heroku app. Sets everything up, then gets out of the way.
Config UINumbersWebhooksCall recordsBilling
Your business apps
heroku
Own the data and the permissions. Unchanged by any of this.
Service RequestCRMBooksDocumentsProperty
RubyDoo Mobile proxy
A different product, deployed separately. Its own tokens, its own
rows — no shared runtime with the phone.
Push-to-talk appEntra sign-in
What the picture is arguing
We never touch the audio
The old system sat in the middle of every call, bridging audio between the
carrier and the model. Here we say one sentence at the start —
“send it to ElevenLabs” — and then two short webhooks.
Everything that used to break lived in the part that is gone.
Three moments are ours, and only three
Answering the carrier, saying who is calling before the greeting, and
filing the record afterwards. The middle two are on the caller’s
clock, which is why this app can never be allowed to sleep.
Tools go straight to your apps
ElevenLabs holds each business’s token and calls Service Request or
Books itself. Nothing routes through us, so nothing waits on us —
and each app keeps enforcing its own permissions.