Cómo conecté Zendesk y SQL Server a Power BI para monitorear el rendimiento de soporte


Introducción
En mi equipo de analítica, uno de los desafíos más interesantes fue desarrollar un dashboard que integrara los tickets de Zendesk con información de SQL Server, para evaluar el rendimiento individual de los agentes de soporte: cuántos tickets atienden, su tiempo promedio de respuesta, el estado de los casos (abiertos, cerrados, en curso) y los tickets resueltos por día. Esta integración no solo ayudó al equipo de soporte a identificar cuellos de botella, sino que también permitió a los líderes tomar decisiones más informadas.
El límite de los 1.000 tickets y el conector personalizado
El conector oficial de Zendesk para Power BI es útil... hasta que necesitas más de 1.000 tickets. En mi caso, la organización ya tenía más de 30.000 tickets acumulados y no había forma de acceder a todos sin una solución personalizada.
Después de investigar en foros y documentaciones dispersas, opté por crear un script en M (Power Query) que implementara paginación recursiva. Fue mi primer reto: entender cómo hacer que Power BI hiciera múltiples llamadas a la API y concatenara los resultados sin bloquearse.
La primera vez que lo corrí, Power BI se quedó congelado. ¿La causa? No había límite de seguridad, y la API se seguía llamando hasta el infinito por un error de URL mal armada en la paginación. Agregué logs de prueba, validaciones y verifiqué los headers uno por uno. Eventualmente, todo funcionó... y los 30.000 tickets estaban disponibles.
Ejemplo de código base en M para paginación en Zendesk:
let
BaseUrl = "https://tusubdominio.zendesk.com/api/v2/tickets.json?page=",
GetPage = (page as number) =>
let
Source = Json.Document(Web.Contents(BaseUrl & Number.ToText(page), [
Headers = [
#"Authorization" = "Basic " & Binary.ToText(Text.ToBinary("usuario:token"), BinaryEncoding.Base64)
]
])),
Data = Source[tickets],
NextPage = if List.Count(Data) = 0 then null else GetPage(page + 1),
Combined = if NextPage = null then Data else List.Combine({Data, NextPage})
in
Combined,
Tickets = GetPage(1),
Table = Table.FromList(Tickets, Record.FieldValues, {"ticket"})
in
Table
⚠️ Nota: Este código es una base conceptual. Requiere ajustes según la estructura de tu JSON, validaciones de errores, y tiempo de espera entre llamadas para no saturar la API de Zendesk.
Unir los tickets con datos maestros desde SQL Server
Tener los tickets en bruto no era suficiente. Necesitábamos enriquecerlos con datos internos: nombre completo del agente, área a la que pertenece, cliente asignado y SLA esperado. Toda esa información vivía en SQL Server.
La conexión a SQL Server desde Power BI es sencilla y confiable:
- Ve a Inicio > Obtener datos > SQL Server
- Introduce el nombre del servidor y la base de datos
- Usa autenticación básica o Windows (según configuración)
- Selecciona las tablas que necesitas (como agentes, clientes, productos) y cárgalas al modelo
SELECT agente_id, nombre_completo, area
FROM agentes_soporte
Relación de tablas en Power BI:
Tabla | Relación |
---|---|
Tickets (Zendesk) | agente_id |
Agentes (SQL) | agente_id |
Clientes (SQL) | cliente_id |
Métricas de rendimiento que construimos
Con los datos integrados, diseñamos un conjunto de KPIs útiles para el equipo de soporte:
Indicador | Fórmula en Power BI (DAX) |
---|---|
Tickets resueltos por día | COUNTROWS(FILTER(Tickets, Tickets[estado] = "cerrado")) |
Tiempo promedio de respuesta | AVERAGE(Tickets[tiempo_respuesta_minutos]) |
Tickets abiertos actualmente | CALCULATE(COUNTROWS(Tickets), Tickets[estado] = "abierto") |
SLA incumplido | COUNTROWS(FILTER(Tickets, Tickets[fuera_de_sla] = TRUE)) |
También se añadieron filtros por agente, fecha y tipo de cliente, permitiendo a los supervisores hacer comparaciones por turnos, días, semanas o clientes clave.
Ventajas de esta solución
- Visibilidad real del trabajo por agente, útil para evaluaciones de desempeño
- Alertas automáticas si algún agente supera cierto umbral de tickets abiertos
- Integración completa entre plataformas sin necesidad de herramientas de terceros costosas
Esta solución me enseñó que a veces Power BI puede ir más allá de los conectores predeterminados, y que con algo de creatividad y scripting en Power Query, es posible construir integraciones robustas, útiles y escalables. En lugar de comprar una solución externa, desarrollamos algo propio que ahora forma parte del flujo diario de análisis del equipo de soporte.