Internal product · unified communications managed service · 2026

AI voice agent monitoring platform

A multi-vendor service that ingests telemetry from Copilot Studio and Zoom virtual agents, computes daily quality metrics, and raises alerts — hardened through repeated self-run security reviews.

  • Azure
  • Code & DevOps
  • Power Platform & Dynamics
  • Zoom
  • Microsoft 365 & Teams
scheduled job, down from an 82–216 min hang
4.7s
live functions verified after every deploy
47
of sessions reported "none" — scoring fixed
91%
Architecture

How it fits together

  1. 01

    Agents

    • Copilot Studio
    • Zoom Virtual Agent
  2. 02

    Collect

    • Power Automate (managed)
    • Zoom webhooks
  3. 03

    Ingest

    • Azure Functions (Python)
    • Azure SQL
  4. 04

    Monitor

    • React console
    • Static Web Apps
    • Application Insights
  5. 05

    Alert

    • Graph Mail
    • GitHub Actions CI
Outcome

Running in production across multiple customer agents, with a scheduled job taken from an 82–216 minute hang to a 4.7-second run.

The problem

Customers’ voice agents ran on different platforms in different tenants. There was no single place to see whether an agent was healthy, how calls were ending, or whether something had quietly stopped.

What I did

  • Built the ingestion backend on Azure Functions and SQL. A managed Power Automate flow pushes Copilot Studio telemetry; Zoom virtual-agent events arrive via signed webhooks plus a 15-minute reconciliation timer.
  • Built a React admin console with a metric explorer, per-call sentiment chart, alert rules, per-customer mutes and Entra ID role gating.
  • Audited every advertised metric against live data rather than the code — and found a stub action leaving handle time permanently empty, sentiment read from the wrong table, a field requested by the wrong name (silently dropped), and escalations undercounted by a casing mismatch.
  • Found the quality score was structurally unfair to generative voice agents: 91% of sessions report outcome “none”, so a resolution component worth up to 35 of 100 points almost never scored.
  • Replaced a deploy action that reported success with zero functions loaded (4 times out of 4) with a publish step plus a post-deploy check that fails loudly.
  • Ran successive security reviews across every endpoint and admin page, closing issues before any external exposure.

Result

Corrected metrics, business-hours-aware alerting, and CI that can’t silently ship an empty app. A scheduled flow that had been hanging for 82–216 minutes now completes in 4.7 seconds, and all 47 live functions are verified after every deploy.