Contact Center Zoom Wallboard
The Problem
A contact center runs two platforms at once: a predictive dialer for outbound calls and Zoom Contact Center for warm transfers. When an agent has a live prospect ready for a transfer, they need to know which Zoom agents are available right now � not after switching tabs, not after asking in Slack.
The existing workflow: alt-tab to Zoom, find an available agent, alt-tab back, attempt the transfer. Every second of that adds friction to a handoff that’s already under time pressure.
The ask was: put Zoom availability data inside the dialer. Make it visible without any additional license cost per seat.
The Approach
Proof of concept first. Before writing a line of real code, I loaded Wikipedia inside the dialer’s embedded website feature to confirm the iframe mechanism actually worked. It did. Full Wikipedia article, inside the production dialer, in under two minutes. That’s how you validate a closed platform � build toward the answer because the documentation doesn’t have it.
The real build: FastAPI backend, static HTML frontend, 10-second polling loop against the Zoom Contact Center Readiness Hub API. Agent cards with color-coded status indicators matching Zoom’s own visual language � green for available, amber for busy, grey for offline. Deployed to Google Cloud Run. When it loaded inside the dialer for the first time, it looked like it belonged there.
The auth problem: Standard token-based auth doesn’t work inside an iframe � you can’t set headers on a cross-origin embed. The solution was token authentication via URL parameter, validated server-side on every request. One secret per deployment, rotated when needed.
Campaign filtering: The wallboard needed to show different Zoom agents depending on which campaign the dialer agent was working. The solution was per-campaign URL parameters � 13 campaigns, 13 URLs, one JSON config file. An operations manager sets the URL once in the dialer admin panel. No code changes to add a new campaign.
The Wall I Hit
Convoso’s embedded website feature has a variable substitution field in the admin panel � a way to pass the current agent’s email into the iframe URL. The plan was to use this for per-agent filtering: each agent sees only the transfer targets relevant to their book of business.
It doesn’t work. The parameter stays an empty string when the iframe loads. I confirmed it in Cloud Run logs, watching live requests come in with nothing where the email should have been. No documentation mentions this. You find it by building toward it and hitting the wall.
So Tier 1 shipped: per-campaign filtering. Tier 2 (per-agent) is documented, deferred, and waiting on a platform workaround or a different embedding mechanism.
What It Taught Me
Closed platforms have invisible walls that only become visible when you build into them. The fastest way to find the walls is to build at speed, log everything, and read the logs when something doesn’t behave as specified.
The Convoso variable substitution finding took 20 minutes to confirm live. It would have taken days to find in documentation that doesn’t mention it. That’s the speed advantage of building your way to the answer.
Architecture
Zoom ZCC API (10s poll)
|
FastAPI backend (Cloud Run)
|
Static HTML + CSS frontend
|
Convoso iframe embed
|
Agent sees transfer availability
Token auth on every request. Campaign config via JSON. Zero per-seat cost beyond the backend container.
Built with Python, FastAPI, and Google Cloud Run. Deployed in one afternoon. Runs in production.