Scope: inbound and outbound, with browser audio over WebRTC.
npm test runs 63 assertions across the call flows, the ClickUp task shape and a security-regression group. A live call has not been run since the 2.0.0 security rewrite, so verify both directions on your own account before rolling it out.This is a page you open beside ClickUp, not a ClickUp extension. ClickUp is written through its REST API with a personal token — there is no OAuth app, no iframe, and no command-centre entry. If you need a listable App Directory app, that gap is the work.
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.
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: Provision Vobiz
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 opening the softphone:
<Response> containing <Dial …><Number>. Anything else — a tunnel error page, an ngrok interstitial — and every call dies silently.
Step 4: Sign in and call
Openhttp://localhost:8092/ for the softphone. While it is registering, the badge reads CONNECTING.

The softphone while it registers.

Registered and ready to dial.
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 any phone number in ClickUp and the panel dials it for you.
A destination entered, ready to dial.

An active call, with the ClickUp task card below it.
Inbound calls
Receive calls here is the one-time setup that points your selected Vobiz number at this panel. After that, a call to the DID raises an in-panel prompt — Enter accepts, Escape declines.
The inbound prompt, with keyboard shortcuts.
Recordings
Completed calls appear under Call recordings, each with an inline player.
Recordings, with inline players.
What lands in ClickUp
One task per call, inCLICKUP_LIST_ID:
Without
CLICKUP_API_TOKEN the backend logs the task it would have created and returns simulated: true. It never pretends the write happened.Reading the logs
Backend routes
Troubleshooting
Testing
test:* scripts drive a backend you started, sign in with the credentials in backend/.env, and fail the process when something is wrong.
Next steps
- ServiceNow integration → - the same softphone architecture inside ITSM.
- Pipedrive integration → - calls logged as CRM activities.
- SIP Endpoints → - create and manage the endpoint the softphone registers as.
- Call Detail Records → - the CDR API behind
fetch-cdr.