interaction table with a playable recording link.
Source code: vobiz-ai/Vobiz-ServiceNow-Calling — the softphone, the OpenFrame mount, the Call via Vobiz UI Action, and the Node backend that answers Vobiz webhooks and writes to ServiceNow.
Scope: inbound and outbound, with browser audio over WebRTC. The backend, the answer XML and the whole HTTP surface are covered by
npm test — 46 assertions, including a security-regression group. A live call has not been run since the 2.1.0 security rewrite, so verify both directions on your own account before rolling it out to agents.What you get
How it works
The one thing to understand first: the browser is the A leg. The softphone sends the SIP INVITE itself, and the backend answers<Dial><Number> to reach the customer.
The backend writes the interaction record itself, over the Table API, using the instance credentials in
.env. That is the opposite of the HubSpot build, where the CRM creates the engagement from the widget’s own session — so here the ServiceNow user in .env needs write access to interaction.Requirements
Step 1: Prove the Vobiz account
Place a call with rtc-demo.vobiz.ai. If that fails, nothing here will work and you will debug the wrong layer for a day.Step 2: Create the SIP endpoint
Step 3: Run the backend
cloudflared must be on your PATH (brew install cloudflared, or winget install --id Cloudflare.cloudflared -e). The binary is deliberately not committed.
The .env values that matter:
Then verify before touching ServiceNow:
<Response> containing <Dial …><Number>. Anything else — a tunnel error page, an ngrok interstitial — and every call dies silently.
Step 4: Point Vobiz at the backend
Create an application whoseanswer_url is $TUNNEL_URL/answer, bind the SIP endpoint to it, and attach a DID for inbound. POST /setup on the backend does this for you with an active session, or do it by hand:
Step 5: Set the ServiceNow properties
In System Properties → All Properties (sys_properties.list), create:
Step 6: Mount the OpenFrame panel
In the Filter Navigator go to OpenFrame → Configurations → New:
The panel then appears in the top-right of the Next Experience header and loads the softphone inside the ServiceNow frame.
Step 7: Sign in and call
Open the OpenFrame panel. Before credentials are entered the badge reads CONNECTING and the three steps below are inert.
The panel before sign-in.

Registered. The badge reads READY and the signed-in account is shown.
Choose a caller ID
Calling from lists the numbers on the account. Carriers require a real number here to bridge a call to a mobile or landline.
Selecting the outbound caller ID.
Place the call
Type a number in E.164 format, or click a number in ServiceNow and the panel picks it up. Recently used numbers are suggested as you type, in both their+91… and bare forms.
Once connected the panel switches to Hang up, starts the timer, and confirms who is on the call.

An active call.
/start-call with the shared secret from step 5.
Inbound calls
Receive calls here is the one-time setup that points your Vobiz number at this panel. After that, a call to the attached DID raises an in-panel prompt — Enter accepts, Escape declines.
The inbound prompt, with keyboard shortcuts.
Recordings
Completed calls appear under Call recordings with their timestamp, each with an inline player.
Recordings, with inline players.
What lands in ServiceNow
One record per call in theinteraction table:
Reading the logs
The backend log is the honest account of what happened:Backend routes
Troubleshooting
Testing
/answer, checks the CDR ledger, and asserts the security regressions — that unsigned playback is refused, that /agent and /start-call demand authentication, that /health leaks nothing, and that an unknown origin is not echoed back as allowed. It exits non-zero when any of that stops being true.
Next steps
- Pipedrive integration → - the same softphone architecture against a sales CRM.
- ClickUp integration → - calls logged as tasks.
- SIP Endpoints → - create and manage the endpoint the softphone registers as.
- Voice Applications → - answer URLs, hangup URLs, and attaching numbers.