Dialpad OPS Console
Real-time call center operations dashboard for managers. Monitors queue health, agent states, SLA compliance, and system diagnostics, and provides the Script Manager to control what guidance techs see during calls.
What This Tool Is
The OPS Console is the manager's real-time command view of the call center floor. It surfaces live metrics from Dialpad, runs a local diagnostics engine, and gives managers a single screen to monitor queue health, agent distribution, SLA status, and error patterns. It also contains the Script Manager, the only place where call scripts and KB steps can be authored and published to the tech console.
Track agent state distribution
Watch SLA and abandon rate live
Identify routing issues and SIP failures
Flag individual agent outliers
Author and publish call scripts
Control script source per issue type
Execute scripts or automation
Show individual call content to techs
Replace Dialpad admin portal
Manage agent schedules
Authenticate users (no login layer)
Allow techs to see the live queue
Architecture
The console is a single stateless HTML file. All live metrics come from Dialpad's REST API and Stats API via a proxy server. The diagnostics engine runs entirely in the browser. Scripts are read from and written to SharePoint via the SP REST API.
Dialpad Stats API — Historical call counts, AHT, SLA, abandon rate. Two-step:
POST /stats to initiate, then GET /stats/{id} to retrieve CSV. Results cached 30 min by Dialpad.SharePoint REST API —
scripts.json in {SP_DATA_FOLDER}. Read on Script Manager open, written on Publish. Same site and folder as Agent Tracker data.
genDemoState() generates all dashboard data. The signal strip drifts every 12 seconds via liveTick(). All real API calls are commented out pending proxy deployment.| Aspect | Demo Mode | Live Mode |
|---|---|---|
| Data source | genDemoState() — random within realistic ranges | Dialpad Stats + Call Center Status APIs via proxy |
| Signal strip | liveTick() every 12s random walk | liveTick() calls GET /callcenters/{id}/status |
| Stats | Generated hourly buckets with business-hour curve | POST /stats then GET /stats/{id} after 15–20s |
| Target selector | Switches simulated client label | Switches Dialpad call center ID for all API calls |
| Mode indicator | Yellow dot, label: DEMO | Green dot, label: LIVE |
UI Panels
#ktc-barOPS CONSOLE — Active page, cyan style.
MGR TRENDS — Links to
dialpad-mgr-trends-v8.html.TECH CONSOLE — Links to
dashboard-dialpad-tech-console.html.Script Manager button — Purple, right-aligned. Slides open the Script Manager drawer. Highlights when open. Shows a dot indicator when there are unpublished changes.
#railTarget selector —
#target-sel — Switches monitored call center. In demo mode changes the label. In live mode sets TARGET_ID for all subsequent API calls. The hardcoded client names are placeholders — replace with your actual Dialpad call center names and IDs.Mode dot + label —
#mode-dot / #mode-lbl — Yellow (DEMO) or green (LIVE).API key input —
#key-in — Password field. On SET, base64-encoded and saved to localStorage under dp_api_key. Auto-restored on page load.Last updated —
#last-upd — HH:MM:SS of last full render plus TARGET_NAME.Refresh — Calls
refresh() for a full data re-render.
#signal-stripSeven live metrics below the rail. Updates every 12 seconds via liveTick() without full page re-render.
| Signal | Element ID | Thresholds | Live Source |
|---|---|---|---|
| Queue Depth | #sv-queue | >8 red · >4 orange · else green. >8 adds crit glow. | callcenters/{id}/status → queue_depth |
| Longest Wait | #sv-wait | >120s red · >60s orange · else green | Derived from queue status |
| Calls Active | #sv-active | >18 "near capacity" | agents_on_call |
| Agents Free | #sv-agents | <2 red · <4 yellow · else green | agents_available |
| Service Level | #sv-sl | ≥80% green · ≥70% orange · <70% red | Stats API stat_type=calls |
| Abandon Rate | #sv-abn | >5% red · >3% orange · else green | Stats API derived |
| Queue Pressure | #sv-pressure-val | <1 STABLE · <2 BUILDING · ≥2 CRITICAL. Ratio: queue ÷ free agents. | Calculated locally |
queue_depth by agents_available. A ratio ≥2 means twice as many waiting callers as free agents — a reliable early warning before SLA degrades.#gridNine panels in a 3-column CSS grid. Each panel has a header with title, source tag, and key metric, and a body with the visualization. Panels can enter warning or critical states via .sla-warn-panel and .sla-crit-panel classes which add colored border glows.
#cp-volKey value:
#cv-total — total calls today · Source tag: stat_type=callsLive source:
POST /api/v2/stats with stat_type=calls, is_today=trueDemo:
genDemoState().vol — business-hour sine curve shapePanel glow:
.sla-crit-panel when queue depth > 8
#cp-alertsrenderAlerts(d). Rules fire on current signal strip values. Threshold conditions:🔴 Critical: Abandon >5%, SLA <80%, Queue >8, Agents free <2, Pressure ≥2
🟠 Warning: Abandon 3–5%, SLA 70–80%, Overflow >12%, Errors >8
🟡 Info: Wrap-up agents >3
🟢 OK: All systems nominal
Critical alerts fire a toast on first render only. Count badge
#cv-alert-count shows critical count or ✓ when clear.
#cp-astateLive source:
GET /api/v2/callcenters/{id}/status → agents_on_call, agents_available, agents_in_wrapupKey value:
#cv-total-agents — total agent count
#cp-agingDerived Metric Dialpad does not expose per-caller wait time in the public Stats API. In live mode, accurate brackets require real-time WebSocket event stream to track each caller's entry time. Currently simulated from queue depth.
Key value:
#cv-aging-max — worst occupied wait bracket
#cp-errorsNot Yet Live No direct Dialpad API endpoint maps to these error categories. In live mode, data would come from Dialpad platform health API or SIEM integration. Currently simulated.
Key value:
#cv-err-total — total error count
#cp-routingDerived Routing path breakdown is not available in the
stat_type=calls Stats API response. Accurate data requires export_type=records with field mapping. The delta column compares to a simulated prior-period baseline.
#cp-qmapLive source:
GET /api/v2/callcenters/{id}/status per queue. Requires iterating all known call center IDs.Queue names and IDs in
genDemoState().queues must be updated to match actual Dialpad call centers.Color: ≥80% green · ≥70% orange · <70% red
#cp-timelinecollectMetrics(d) → runDiagnostics(metrics) → renderDiagnostics(alerts). No API call. Evaluates 12 rules against the current metric snapshot. Multiple rules can fire simultaneously. Results sorted critical-first.Header counters:
#diag-count-crit / #diag-count-warnPanel glow:
.sla-crit-panel when criticals fire; .sla-warn-panel for warnings onlySee Config → Diagnostics Rules for full rule catalog.
#outlier-drawerrenderOutliers().Outlier triggers: AHT >9 min (HIGH/CRITICAL), Wrap-up >5 min (HIGH), Idle >15 min (OFFLINE?)
Badge count:
#outlier-count — always visible, even when drawer is closedLive source: Proxy Required Agent-level metrics come from
GET /api/v2/stats with stat_type=onduty, target_type=user for per-agent AHT and state duration.
Script Manager
Full management UI for authoring and maintaining call scripts. Manager-only. Techs consume the published output read-only. All script changes must be made here and published before techs see them.
scripts.json read-only at startup. No edit controls exist in the tech console. All changes must be published via the SharePoint Publish button.Right editor — Step list for the selected issue. Source toggle at the top. Each step card has move up/down, inline edit, and delete. Edit opens title field, instructions textarea, badge type selector, Save/Cancel. Escalation config row at the bottom.
Every issue type has a Script Source toggle controlling what the tech console renders for calls of that type. The manager sets this. Techs cannot change it.
scripts.json. No Dialpad Playbook notice._scriptsDirty flag). A dot appears when dirty.On publish:
POST /_api/contextinfo to get form digest → POST /Files/Add(url='scripts.json', overwrite=true) with the full JSON payload.Closing the drawer with unsaved changes triggers a warning toast. Changes are not lost — the drawer can be reopened and Publish clicked before navigating away.
If
SP_SITE is not configured: publish saves to local defaults only with a toast confirmation.
Lives at {SP_DATA_FOLDER}/scripts.json on SharePoint — same folder as agent-tracker-data.json.
| Tag | Label | Color | Use For |
|---|---|---|---|
req | REQUIRED | Red | Steps that must not be skipped — identity verification, compliance |
run | RUNBOOK | Green | Technical procedure steps — AD commands, PowerShell, tool paths |
tip | TIP | Cyan | Soft guidance, shortcuts, context clues |
caut | CAUTION | Yellow | Steps requiring care — irreversible actions, service account warnings |
API Reference
All Dialpad API calls are commented out pending proxy deployment. They activate when PROXY.base is set and real fetch blocks are uncommented in refresh() and liveTick().
| Route | Method | Purpose | Key Params |
|---|---|---|---|
/api/v2/stats | POST | Initiate stats processing — returns an ID to poll | stat_type=calls, is_today=true, target_type=callcenter, target_id={id}, timezone |
/api/v2/stats/{id} | GET | Retrieve CSV result. Wait 15–20s before first GET. Retry every 5–10s if not ready. Cached 30 min. | Do not repeat POST with same params within cache window. |
/api/v2/stats | POST | On-duty stats for agent state distribution | stat_type=onduty, is_today=true, target_type=callcenter |
| Route | Method | Purpose | Response Fields Used |
|---|---|---|---|
/api/v2/callcenters/{id}/status | GET | Real-time queue and agent status — feeds signal strip | queue_depth, agents_available, agents_on_call, agents_in_wrapup, agents_total, service_level, abandon_rate |
/api/v2/callcenters | GET | List all call centers — use to populate target selector with real IDs | id, name, phone_number, type |
Config Fields
| Variable | Default | Description |
|---|---|---|
TARGET_ID | 'off_1a2b' | Dialpad call center ID for API calls. Update #target-sel option values to real IDs. |
TARGET_NAME | 'Meridian Financial' | Display name in last-updated stamp and toast messages. |
API_KEY | From localStorage | Dialpad API key. Base64-encoded in storage. Never hardcoded in file. |
MODE | 'demo' | Set to 'live' when API key is saved. |
SP_* Constants| Constant | Default | Description |
|---|---|---|
SP_SITE | '' | SharePoint site path e.g. '/sites/ITPortal'. Must match tech console exactly. |
SP_SCRIPTS_FILE | 'scripts.json' | Filename. Do not change. |
SP_DATA_FOLDER | '{SP_SITE}/pages/config/current' | Full folder path. Same as Agent Tracker data folder. |
DIAGNOSTIC_RULES12 rules evaluated every render cycle. Add, remove, or modify by editing the array. Each rule is a plain object with id, condition(m), severity, message, reason, and hint.
| Rule | Severity | Condition |
|---|---|---|
| R01 | Critical | Abandon >5% AND agents free <2 — staffing shortage |
| R02 | Warning | SLA <80% AND agents free >3 — routing misconfiguration |
| R03 | Critical | Queue pressure ratio >2 — queue overload |
| R04 | Critical | Queue >5 AND active calls <2 — possible platform issue |
| R05 | Warning | Abandon >7% AND queue <3 — abandon spike without queue cause |
| R06 | Warning | Wrap-up >30% of agents — ACW bloat |
| R07 | Critical | SIP failures ≥4 — carrier or trunk issue |
| R08 | Warning | Total errors >10 — elevated system error rate |
| R09 | Critical | SLA <70% AND agents free <4 — critically degraded |
| R10 | Info | Overflow >20% — primary queue undersized |
| R11 | Critical | Longest wait >180s AND agents free = 0 — callers trapped |
| OK | OK | All metrics in range — fallback when no rules trigger |
Live Mode Activation Checklist
/dialpad/* routes, hold the Dialpad API key server-side, set CORS headers, and forward to https://dialpad.com/api/v2.#target-sel with your actual Dialpad call center names and IDs. Use GET /api/v2/callcenters to list them.genDemoState() call with real API calls to POST /api/v2/stats and GET /api/v2/callcenters/{id}/status. Add a mapDialpadData() function translating API responses to the internal state shape.liveTick() with a real GET /api/v2/callcenters/{id}/status call to keep the signal strip current every 12 seconds without full re-render.SP_SITE in both the manager and tech console. Confirm /pages/config/current/ exists on SharePoint. Publish default scripts once to create the file.Limitations
stat_type=calls Stats API response. Accurate routing breakdown requires export_type=records with custom field mapping.Troubleshooting
refresh(). Setting the API key switches MODE but the data generator still calls genDemoState().Fix: Complete activation Step 3.
SP_SITE is empty.Fix: Set
SP_SITE to your SharePoint site path. Confirm /pages/config/current/ folder exists before first publish./_api/contextinfo request is failing — usually CORS or the console is not on the same SharePoint domain.Fix: The console must be hosted on the same SharePoint tenant, or SP REST API must be proxied. The form digest endpoint does not support cross-origin requests from non-SP domains.
Fix for testing: Temporarily lower a threshold in
DIAGNOSTIC_RULES to force a trigger, then revert.SP_SITE differs between the two files.Fix: Ensure both files have identical
SP_SITE values. The data folder is computed from SP_SITE — if one is empty and one is set, they resolve to different paths.liveTick() only updates the signal strip, not the charts. Charts update on full refresh() every 5 minutes or on manual refresh.