Saltar al contenido principal
Los webhooks permiten la comunicación en tiempo real entre Matcher y sistemas externos. Esta guía cubre las notificaciones de eventos salientes y los callbacks de resolución entrantes.

Descripción general


Matcher permite comunicación bidireccional mediante webhooks:
  • Webhooks salientes: Matcher notifica a sistemas externos cuando ocurren eventos
  • Callbacks entrantes: Sistemas externos notifican a Matcher cuando se toman acciones
Cuando algo sucede en Matcher, como una nueva excepción o una coincidencia completada, envía un evento a sus endpoints configurados. Los sistemas externos como JIRA o ServiceNow pueden entonces enviar callbacks para actualizar el estado de excepciones o cerrar elementos automáticamente. Este flujo bidireccional mantiene sus herramientas sincronizadas sin intervención manual.
Callbacks de llamadas de webhooks del Matcher

Eventos salientes


Matcher emite eventos cuando ocurren acciones significativas en el proceso de conciliación.

Eventos disponibles

EventoDisparadorUso típico
ingestion.completedImportación de archivo finalizadaMonitoreo de pipeline de datos
ingestion.failedImportación de archivo fallóAlertas de error
match.createdNueva coincidencia propuestaRegistro de auditoría
match.confirmedCoincidencia aprobadaActualizaciones downstream
match.rejectedCoincidencia rechazadaDisparadores de investigación
match.force_matchedCoincidencia forzada manual aplicadaPista de auditoría, flujos de aprobación
match.unmatchedCoincidencia revertida manualmentePista de auditoría, seguimiento de correcciones
match_run.startedTrabajo de coincidencia automático iniciadoMonitoreo de trabajos
match_run.completedTrabajo de coincidencia automático finalizadoMonitoreo de trabajos, reportes
match_run.failedTrabajo de coincidencia automático fallóAlertas de error
exception.createdNueva excepciónCreación de tickets
exception.assignedExcepción asignadaNotificación al usuario
exception.escalatedExcepción escaladaAlertas de gerencia
exception.resolvedExcepción resueltaSincronización de estado
exception.sla_warningSLA aproximándoseAlertas proactivas
exception.sla_breachSLA excedidoDisparadores de escalamiento
context.closedPeríodo de conciliación cerradoDisparadores de reportes

Estructura del payload de eventos

Todos los eventos siguen una estructura consistente:
{
 "id": "evt_001",
 "type": "exception.created",
 "timestamp": "2024-01-20T10:30:00Z",
 "version": "1.0",
 "tenant_id": "tenant_001",
 "context_id": "ctx_abc123",
 "data": {
 // Datos específicos del evento
 },
 "metadata": {
 "correlation_id": "req_xyz789",
 "source": "matching_engine"
 }
}

Payloads de eventos


Ingestion completed

Se dispara cuando un lote de transacciones se importa exitosamente.
{
  "id": "evt_ing_001",
  "type": "ingestion.completed",
  "timestamp": "2024-01-20T10:30:00Z",
  "data": {
    "job_id": "job_imp_001",
    "source_id": "src_bank456",
    "source_name": "Chase Bank",
    "file_name": "statement_january.csv",
    "summary": {
      "total_rows": 1250,
      "imported": 1240,
      "duplicates_skipped": 8,
      "validation_errors": 2
    },
    "duration_seconds": 45,
    "started_at": "2024-01-20T10:29:15Z",
    "completed_at": "2024-01-20T10:30:00Z"
  }
}

Match confirmed

Se dispara cuando una coincidencia es aprobada (automática o manual).
{
  "id": "evt_mtch_001",
  "type": "match.confirmed",
  "timestamp": "2024-01-20T10:30:01Z",
  "data": {
    "match_id": "match_001",
    "confidence": 100,
    "rule_id": "rule_exact001",
    "rule_name": "Exact Match",
    "confirmation_type": "AUTO",
    "transactions": [
      {
        "id": "txn_bank_001",
        "source_name": "Chase Bank",
        "amount": 1000.0,
        "currency": "USD",
        "date": "2024-01-15"
      },
      {
        "id": "txn_ledger_001",
        "source_name": "Main Ledger",
        "amount": 1000.0,
        "currency": "USD",
        "date": "2024-01-15"
      }
    ],
    "variance": {
      "amount_diff": 0,
      "date_diff_days": 0
    }
  }
}

Exception created

Se dispara cuando se identifica una nueva excepción.
{
  "id": "evt_exc_001",
  "type": "exception.created",
  "timestamp": "2024-01-20T10:30:00Z",
  "data": {
    "exception_id": "exc_001",
    "severity": "HIGH",
    "reason": "NO_MATCH_FOUND",
    "reason_details": "No se encontró transacción coincidente dentro de la tolerancia",
    "transaction": {
      "id": "txn_bank_999",
      "source_id": "src_bank456",
      "source_name": "Chase Bank",
      "external_id": "BANK-2024-999",
      "amount": 15000.0,
      "currency": "USD",
      "date": "2024-01-15",
      "reference": "Transferencia bancaria #7890"
    },
    "candidates": [
      {
        "transaction_id": "txn_ledger_777",
        "confidence": 55,
        "rejection_reason": "Por debajo del umbral del 60%"
      }
    ],
    "sla": {
      "due_at": "2024-01-21T10:30:00Z",
      "hours_remaining": 24
    }
  }
}

Exception resolved

Se dispara cuando una excepción es resuelta.
{
  "id": "evt_exc_002",
  "type": "exception.resolved",
  "timestamp": "2024-01-20T14:30:00Z",
  "data": {
    "exception_id": "exc_001",
    "resolution": {
      "type": "FORCE_MATCH",
      "match_id": "match_forced_001",
      "resolved_by": "user_123",
      "notes": "Verificado: la diferencia de monto es la comisión bancaria por transferencia"
    },
    "time_to_resolution": {
      "hours": 4,
      "within_sla": true
    }
  }
}

Match force matched

Se dispara cuando un usuario fuerza manualmente una coincidencia entre transacciones.
{
  "id": "evt_force_001",
  "type": "match.force_matched",
  "timestamp": "2024-01-20T14:30:00Z",
  "data": {
    "match_id": "match_forced_001",
    "exception_id": "exc_001",
    "forced_by": "user_123",
    "reason": "La diferencia de monto es una comisión bancaria documentada",
    "notes": "Verificado con extracto bancario mostrando comisión de $250 por transferencia deducida",
    "transactions": [
      {
        "id": "txn_bank_999",
        "source_name": "Chase Bank",
        "amount": 15000.0,
        "currency": "USD",
        "date": "2024-01-15"
      },
      {
        "id": "txn_ledger_777",
        "source_name": "Main Ledger",
        "amount": 15250.0,
        "currency": "USD",
        "date": "2024-01-14"
      }
    ],
    "variance": {
      "amount_diff": 250.0,
      "amount_variance_percent": 1.67,
      "date_diff_days": 1
    },
    "requires_approval": true,
    "approval_threshold": 10000.0
  }
}
Los eventos de coincidencia forzada se usan comúnmente para activar flujos de aprobación cuando la variación excede los umbrales de la empresa.

Match unmatched

Se dispara cuando una coincidencia previamente confirmada es revertida.
{
  "id": "evt_unmatch_001",
  "type": "match.unmatched",
  "timestamp": "2024-01-20T15:45:00Z",
  "data": {
    "match_id": "match_001",
    "unmatched_by": "user_456",
    "reason": "Coincidencia incorrecta - las transacciones pertenecen a facturas diferentes",
    "notes": "Txn bancaria es para Factura #1234, txn del libro mayor es para Factura #5678",
    "original_match": {
      "confirmed_at": "2024-01-15T10:00:00Z",
      "confirmed_by": "system",
      "confidence": 85,
      "rule_name": "Tolerance Match"
    },
    "transactions": [
      {
        "id": "txn_bank_001",
        "source_name": "Chase Bank",
        "amount": 1000.0,
        "currency": "USD"
      },
      {
        "id": "txn_ledger_001",
        "source_name": "Main Ledger",
        "amount": 1005.0,
        "currency": "USD"
      }
    ],
    "action": {
      "exceptions_created": [
        "exc_new_001",
        "exc_new_002"
      ],
      "status": "Ambas transacciones devueltas al pool de no coincidentes"
    }
  }
}
Deshacer una coincidencia confirmada crea nuevas excepciones para ambas transacciones y genera una entrada completa en el registro de auditoría.

Match run completed

Se dispara cuando una ejecución de coincidencias automática o manual finaliza.
{
  "id": "evt_run_001",
  "type": "match_run.completed",
  "timestamp": "2024-01-20T06:05:23Z",
  "data": {
    "run_id": "run_001",
    "context_id": "ctx_abc123",
    "context_name": "Daily Bank Reconciliation",
    "trigger": "SCHEDULED",
    "started_at": "2024-01-20T06:00:00Z",
    "completed_at": "2024-01-20T06:05:23Z",
    "duration_seconds": 323,
    "statistics": {
      "transactions_processed": 1250,
      "matches_found": 1180,
      "matches_confirmed": 1120,
      "matches_pending_review": 60,
      "exceptions_created": 70,
      "by_confidence": {
        "high_90_100": 1120,
        "medium_60_89": 60,
        "low_0_59": 0
      }
    },
    "performance": {
      "transactions_per_second": 3.87,
      "avg_rule_evaluation_ms": 12.5
    }
  }
}

SLA warning / SLA breach

Se dispara cuando se alcanzan los umbrales de SLA.
{
  "id": "evt_sla_001",
  "type": "exception.sla_warning",
  "timestamp": "2024-01-20T18:30:00Z",
  "data": {
    "exception_id": "exc_001",
    "severity": "HIGH",
    "sla": {
      "due_at": "2024-01-21T10:30:00Z",
      "hours_remaining": 16,
      "percent_remaining": 25
    },
    "assigned_to": "user_123",
    "escalation_path": [
      "user_manager",
      "user_director"
    ]
  }
}

Seguridad de webhooks


Verificación de firma

Todas las entregas de webhooks incluyen un encabezado de firma para verificación:
X-Matcher-Signature: sha256=abc123...
X-Matcher-Timestamp: 1705758600
Proceso de verificación:
  1. Concatenar timestamp y body: {timestamp}.{body}
  2. Calcular HMAC-SHA256 usando el secreto del webhook
  3. Comparar con el encabezado de firma
Ejemplo (Node.js):
const crypto = require('crypto');

function verifyWebhook(payload, signature, timestamp, secret) {
 const signedPayload = `${timestamp}.${payload}`;
 const expectedSignature = crypto
 .createHmac('sha256', secret)
 .update(signedPayload)
 .digest('hex');

 return `sha256=${expectedSignature}` === signature;
}
Ejemplo (Python):
import hmac
import hashlib

def verify_webhook(payload, signature, timestamp, secret):
 signed_payload = f"{timestamp}.{payload}"
 expected = hmac.new(
 secret.encode(),
 signed_payload.encode(),
 hashlib.sha256
 ).hexdigest()
 return f"sha256={expected}" == signature

Lista de IPs permitidas

Matcher envía webhooks desde rangos de IP específicos:
52.1.2.0/24
52.1.3.0/24
Configure su firewall para permitir estos rangos.

Requisitos de TLS

  • Mínimo TLS 1.2
  • Se requiere certificado SSL válido
  • Certificados autofirmados no soportados en producción

Lógica de reintentos


Las entregas de webhooks fallidas se reintentan con retroceso exponencial.

Política de reintentos por defecto

IntentoRetrasoEspera total
1Inmediato0s
25 segundos5s
330 segundos35s
42 minutos2m 35s
510 minutos12m 35s
61 hora1h 12m 35s

Configuración de reintentos personalizada

{
  "retry": {
    "max_attempts": 5,
    "initial_delay_seconds": 10,
    "max_delay_seconds": 3600,
    "backoff_multiplier": 2
  }
}

Condiciones de reintento

Los reintentos ocurren para:
  • Respuestas HTTP 5xx
  • Timeouts de conexión
  • Fallos de resolución DNS
Sin reintento para:
  • Respuestas HTTP 4xx (excepto 429)
  • Certificados SSL inválidos
  • Webhook deshabilitado

Mejores prácticas


Siempre verifique la firma HMAC antes de procesar los payloads de webhooks. Esto previene solicitudes falsificadas.
Retorne una respuesta 2xx dentro de 5 segundos. Procese el evento de forma asíncrona si es necesario.
Los eventos pueden entregarse más de una vez. Use el ID del evento para deduplicar.
Configure alertas para tasas de falla de webhooks. Investigue las fallas persistentes de inmediato.
Suscríbase solo a los eventos que necesita. El filtrado reduce el ruido y la carga de procesamiento.
Use el endpoint de prueba para verificar que su manejador de webhooks funciona correctamente antes de habilitar en producción.

Próximos pasos