AdUnity
Multi-Tenant CRM & AI Call Analytics Platform
Problem
Real-estate sales teams juggle leads across multiple channels and vendors, and the same prospect frequently gets logged twice by different agents. Meanwhile calls happen and the useful information — what the client actually wants, how the call went — lives only in an agent's memory unless someone manually writes it up. Every tenant (agency/team) needed strict data isolation, since agencies compete with each other on the same platform.
Architecture
Tenant-scoped CRM core: leads, site-visit schedules, and team performance analytics are all filtered through a tenant boundary enforced at the query layer. Communication utilities (Aloha, Knowlarity) provide click-to-call directly from a lead record, and every recorded call is sent to AssemblyAI for automated transcription and sentiment analysis, turning a phone call into searchable, structured data attached to the lead. Incoming calls trigger real-time alerts to the owning agent over Socket.IO so a call is never missed while it's happening. A duplicate-detection pass runs against new leads on ingestion — matching on phone/contact signals — to stop the same prospect from being worked twice, and a lead-expiry job automatically escalates or closes leads that go stale past a configurable window.
Trade-offs
Running sentiment analysis and transcription on every call adds cost and latency versus only transcribing on-demand, but on-demand meant most calls never got transcribed at all because agents rarely went back to request it — defaulting to always-on made the data actually useful. Duplicate detection is a precision/recall tradeoff: too aggressive and it merges genuinely distinct prospects, too lenient and duplicates slip through — we tuned matching to favor fewer false merges since incorrectly merging two leads is harder to undo than missing a duplicate.