Saltar al contenido principal

Ejemplo de dashboard custom

Esta página muestra cómo, a partir del export de datos de tu cuenta, puedes armar tu propio dashboard de cobros sin depender del panel de Debi. Cada bloque es un panel del dashboard: un caso de uso concreto, las tablas que usa y la query SQL lista para adaptar.

Conteo de intentos por resultado y marca de tarjeta

Descripción: Para cada combinación de número de intentos de cobro, estado final y marca de tarjeta, devuelve cuántos pagos hay. Sirve como panel "performance por marca": muestra dónde se concentran los rechazos y cuántos intentos están haciendo falta para cobrar.

Motor: MySQL Tablas: payments, payment_methods

SELECT
submissions_count AS attempts,
status,
payment_methods.network,
COUNT(*) AS count
FROM payments
LEFT JOIN payment_methods ON payments.payment_method_id = payment_methods.id
GROUP BY submissions_count, status, payment_methods.network

Nota: submissions_count es el número de intentos de cobro acumulados sobre el pago. Para segmentar entre "primer intento" y "reintento", filtra por submissions_count = 1 o submissions_count > 1.

Buscador de pagos por atributos de tarjeta

Descripción: Búsqueda transaccional sobre los pagos a partir del medio de pago (BIN, últimos 4 dígitos, tipo, red) y rango de fechas. Es el panel de detalle típico para investigar un caso de soporte o reconstruir la actividad de un cliente.

Motor: MySQL Tablas: payments, payment_methods, customers

Parámetros (opcionales):

ParámetroTipoDescripción
:binstringPrimeros 6 dígitos de la tarjeta.
:typestringTipo de tarjeta (credit, debit, etc.).
:last_four_digitsstringÚltimos 4 dígitos de la tarjeta.
:created_fromdatetimeInicio del rango de creación del pago.
:created_todatetimeFin del rango de creación del pago.
SELECT
JSON_UNQUOTE(JSON_EXTRACT(p.metadata, '$.external_id')) AS EXTERNAL_ID,
c.id AS IDENTIFICADOR_CLIENTE,
c.name AS NOMBRE_CLIENTE,
p.description AS DESCRIPCION,
p.amount AS AMOUNT,
pm.bin AS BIN,
pm.name AS NAME,
pm.bank AS BANK,
pm.type AS TYPE,
pm.last_four_digits AS LAST_FOUR_DIGITS,
pm.network AS NETWORK,
pm.funding AS FUNDING,
pm.fingerprint AS FINGERPRINT,
p.response_message AS RESPONSE_MESSAGE,
p.status AS STATUS,
p.effective_charged_date AS EFFECTIVE_CHARGED_DATE
FROM payments p
LEFT JOIN payment_methods pm ON p.payment_method_id = pm.id
LEFT JOIN customers c ON p.customer_id = c.id
-- Filtros opcionales:
-- WHERE pm.bin = :bin
-- AND pm.type = :type
-- AND pm.last_four_digits = :last_four_digits
-- AND p.created_at >= :created_from
-- AND p.created_at <= :created_to

Nota: El EXTERNAL_ID proviene de metadata.external_id. Si en tu sistema lo llamas distinto, basta con cambiar la ruta JSON.

Historial de intentos por identificador externo

Descripción: Devuelve la línea de tiempo completa de un pago a partir de su external_id: cada cambio de estado en payment_logs con su mensaje de respuesta. Es el panel "drill-down" para auditar qué pasó en cada intento.

Motor: MySQL Tablas: payments, payment_logs, customers

Parámetros:

ParámetroTipoDescripción
:external_idstringIdentificador externo del pago, enviado en metadata.external_id.
SELECT
pl.created_at,
pl.status,
pl.response_message,
p.public_id,
c.public_id AS customer
FROM payments p
JOIN payment_logs pl ON pl.payment_id = p.id
JOIN customers c ON p.customer_id = c.id
WHERE JSON_UNQUOTE(JSON_EXTRACT(p.metadata, '$.external_id')) = :external_id
ORDER BY pl.created_at

Distribución mensual por marca, red y financiamiento

Descripción: Para un mes determinado, muestra cómo se distribuyen los pagos entre las combinaciones de tipo de tarjeta, red y modalidad (crédito/débito), junto con el estado final. Es la base del panel "composición de cobros por mes".

Motor: MySQL Tablas: payments, payment_methods

Parámetros:

ParámetroTipoDescripción
:charge_datestring YYYY-MMMes a analizar (por ejemplo 2025-11).
SELECT
CONCAT(
IFNULL(pm.type, ''), '-',
IFNULL(pm.network, ''), '-',
IFNULL(pm.funding, '')
) AS Type_Network_Funding,
p.status AS status,
COUNT(*) AS count
FROM payments p
LEFT JOIN payment_methods pm ON p.payment_method_id = pm.id
WHERE p.deleted_at IS NULL
AND DATE_FORMAT(p.charge_date, '%Y-%m') = :charge_date
GROUP BY pm.type, pm.network, pm.funding, p.status
ORDER BY count DESC, pm.network ASC, p.status ASC

Volumen diario por tipo de tarjeta (últimos 36 días)

Descripción: Serie diaria de la cantidad de pagos para cada combinación de tipo / red / modalidad de tarjeta, sobre los últimos 36 días. Ideal para alimentar un gráfico de barras apiladas que muestre la evolución y la composición del volumen.

Motor: MySQL Tablas: payments, payment_methods

SELECT
DATE(p.created_at) AS fecha,
CONCAT(
IFNULL(pm.type, ''), '-',
IFNULL(pm.network, ''), '-',
IFNULL(pm.funding, '')
) AS network_funding,
COUNT(*) AS count
FROM payments p
LEFT JOIN payment_methods pm ON p.payment_method_id = pm.id
WHERE p.created_at >= DATE(DATE_ADD(NOW(), INTERVAL -36 DAY))
AND p.created_at < DATE(DATE_ADD(NOW(), INTERVAL 1 DAY))
AND p.deleted_at IS NULL
GROUP BY DATE(p.created_at), pm.type, pm.network, pm.funding
ORDER BY network_funding DESC, fecha DESC

Proyección de acreditaciones por proveedor (últimos 90 días)

Descripción: Suma del monto aprobado por fecha estimada de acreditación y por proveedor de cobro, sobre los últimos 90 días. Permite anticipar el flujo de fondos que vas a recibir en cada fecha, abierto por canal.

Motor: MySQL Tablas: payments, gateways

SELECT
p.estimated_accreditation_date,
g.provider,
SUM(p.amount) AS total
FROM payments p
LEFT JOIN gateways g ON p.gateway_id = g.id
WHERE p.status = 'approved'
AND p.created_at >= DATE(DATE_ADD(NOW(), INTERVAL -90 DAY))
GROUP BY p.estimated_accreditation_date, g.provider
ORDER BY p.estimated_accreditation_date DESC, g.provider DESC

Nota: La fecha estimada de acreditación es la fecha prevista en la que el dinero queda disponible en tu cuenta. Depende del proveedor (gateways.provider) y de la operatoria de cada canal.

Resultado mensual de cobros por proveedor y mensaje de rechazo

Descripción: Resumen mensual con la cantidad de cobros aprobados, rechazados, pendientes y enviados, agrupados por proveedor, red de tarjeta, modalidad y mensaje de respuesta. Es el panel ejecutivo para detectar concentraciones de rechazos en un mensaje o proveedor puntual.

Motor: ClickHouse (usa formatDateTime, propia de ese motor) Tablas: payments, gateways, payment_methods

SELECT
formatDateTime(p.charge_date, '%Y-%m') AS month,
g.provider,
pm.network,
pm.funding,
p.response_message AS rejection_message,
SUM(CASE WHEN p.status = 'rejected' THEN 1 ELSE 0 END) AS rejected_count,
SUM(CASE WHEN p.status = 'approved' THEN 1 ELSE 0 END) AS approved_count,
SUM(CASE WHEN p.status = 'pending_submission' THEN 1 ELSE 0 END) AS pending_submission,
SUM(CASE WHEN p.status = 'submitted' THEN 1 ELSE 0 END) AS submitted
FROM payments AS p
JOIN gateways AS g ON p.gateway_id = g.id
JOIN payment_methods AS pm ON p.payment_method_id = pm.id
WHERE p.status IN ('approved', 'rejected', 'pending_submission', 'submitted')
GROUP BY
formatDateTime(p.charge_date, '%Y-%m'),
g.provider, pm.network, pm.funding, p.response_message
ORDER BY month DESC, g.provider, rejected_count DESC

Nota: approved_count y rejected_count son, respectivamente, cobros aprobados y cobros rechazados en ese mes y combinación.

Detalle transaccional por proveedor y mensaje de rechazo

Descripción: Volcado plano, fila por pago, con cliente, método de pago, proveedor y mensaje de respuesta. Es la tabla de detalle del dashboard, pensada para filtrarse por cualquiera de las dimensiones del panel anterior.

Motor: ClickHouse (usa JSONExtractString, propia de ese motor) Tablas: payments, payment_methods, customers, gateways

SELECT
JSONExtractString(p.metadata, 'external_id') AS EXTERNAL_ID,
c.id AS IDENTIFICADOR_CLIENTE,
c.name AS NOMBRE_CLIENTE,
p.description AS DESCRIPCION,
p.amount AS AMOUNT,
pm.bin AS BIN,
pm.name AS NAME,
pm.bank AS BANK,
pm.type AS TYPE,
pm.last_four_digits AS LAST_FOUR_DIGITS,
pm.network AS NETWORK,
pm.funding AS FUNDING,
pm.fingerprint AS FINGERPRINT,
g.provider AS PROVIDER,
p.response_message AS RESPONSE_MESSAGE,
p.status AS STATUS,
p.effective_charged_date AS EFFECTIVE_CHARGED_DATE
FROM payments AS p
LEFT JOIN payment_methods AS pm ON p.payment_method_id = pm.id
LEFT JOIN customers AS c ON p.customer_id = c.id
LEFT JOIN gateways AS g ON p.gateway_id = g.id
ORDER BY p.effective_charged_date DESC