Persist calls and associate calls, texts and voicemail with leads

FeatureVOIPService
Shipped
August 5, 2026 at 6:02 PM UTC
Author
Kamo
Commit
d4ba503

Calls were never recorded anywhere — VoipCallEventService published a NATS event for the browser and kept nothing, and RECORDINGS only exists when audio was captured. The per-instance sync now pulls call history through the PhoneProvider abstraction and upserts PHONE_CALL_LOG, keyed on (instance, provider call id). That is the only route that works for FreePBX and Microsoft Teams, neither of which offers a usable per-call webhook. The sweep is the single writer. Persisting from the RingCentral webhook as well was tried and removed: its notification carries telephonySessionId while the call-history API returns a different record id, so the two writers produced two rows and two timeline entries for one call. Calls are attributed to an extension only when that extension is actually on the call. RingCentral's endpoint is extension/~ and ignores the argument, so looping per extension would otherwise file every member's calls under whichever one the loop visited last. Recording ids are resolved per page via RecordingLookupService, the same enrichment the softphone history gets — without it the tab knows a recording exists but cannot play it. Texts link at send/receive; voicemails link at sync.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing