# Webhooks

Los webhooks te permiten recibir notificaciones en tiempo real sobre eventos que ocurren en Salescaling. Cuando se produce un evento, Salescaling enviará una solicitud HTTP POST a la URL que hayas configurado.

## Configuración de Webhooks

Para configurar un webhook, necesitas proporcionar:

* Nombre del webhook
* URL de destino
* Tipo de evento a escuchar
* Headers personalizados (opcional)
* Descripción (opcional)

## Tipos de Eventos

Actualmente soportamos los siguientes tipos de eventos:

### 1. Cambios en el Estado de Reuniones (`meeting_status_changed`)

Este evento se dispara cuando hay cambios en el estado de una reunión. Los posibles estados son:

* `meeting_created`: Cuando se crea una nueva reunión
* `meeting_deleted`: Cuando se elimina una reunión
* `meeting_transcript_done`: Cuando se completa la transcripción
* `meeting_summary_done`: Cuando se completa el resumen
* `meeting_video_done`: Cuando se completa el procesamiento del vídeo
* `meeting_notes_done`: Cuando se completa el procesamiento de las notas

#### Payload

```json
{
  "meetingId": "string",
  "status": "meeting_created" | "meeting_deleted" | "meeting_transcript_done" | "meeting_summary_done" | "meeting_video_done" | "meeting_notes_done"
}
```

#### Notas

* El procesamiento del vídeo y del contenido de la reunión se realiza de forma paralela, por lo que el evento `meeting_video_done` se puede recibir antes del evento `meeting_summary_done`.
* Si se quiere saber cuando se completa el procesamiento del contenido de la reunión, se puede utilizar el evento `meeting_summary_done`.
* Si se quiere saber cuando se completa el procesamiento de las notas, se puede utilizar el evento `meeting_notes_done`.

### 2. Cambios en Notas de Reuniones (`meeting_note_status_changed`)

Este evento se dispara cuando hay cambios en al menos una nota de una reunión. Los posibles estados son:

* `meeting_note_created`: Cuando se crea una nueva nota
* `meeting_note_deleted`: Cuando se elimina una nota
* `meeting_note_updated`: Cuando se actualiza una nota

#### Payload

```json
{
  "meetingNoteId": "string",
  "status": "meeting_note_created" | "meeting_note_deleted" | "meeting_note_updated"
}
```

#### Notas

* Este evento se dispara una vez por cada nota que se procese.
* Al generarse notas de forma automática, se dispara este evento para cada nota generada.

### 3. Detección de Señales Comerciales (`commercial_signal_detected`)

Este evento se dispara cuando se detecta una señal comercial en una actividad. Las señales comerciales son indicadores importantes que pueden ayudar a identificar oportunidades o riesgos en las interacciones con clientes.

#### Payload

```json
{
  "code": "string",
  "description": "string",
  "contactId": "string",
  "companyId": "string",
  "activityType": "string",
  "activityId": "string",
  "evidence": ["string"],
  "changeType": "string"
}
```

#### Campos

* `code`: Código de la señal comercial detectada. Los tipos disponibles son:
  * **Engagement & Intent**:
    * `buying_intent`: Intención de compra detectada
    * `interest_in_trial`: Interés en realizar una prueba
    * `opportunity_qualified`: Oportunidad calificada
    * `champion_detected`: Detección de un campeón interno
    * `gatekeeper_detected`: Detección de un guardián
    * `future_meeting_scheduled`: Reunión futura programada
    * `decision_timeline_mentioned`: Mencionada línea temporal de decisión
    * `follow_up_required`: Se requiere seguimiento
    * `follow_up_deadline_mentioned`: Mencionado plazo de seguimiento
    * `multi_department_involvement`: Involucrados múltiples departamentos
  * **Pricing, Budget & Negotiation**:
    * `pricing_discussed`: Discusión sobre precios
    * `budget_blocker`: Bloqueo por presupuesto
    * `budget_discussed`: Discusión sobre presupuesto
    * `discount_requested`: Solicitado descuento
    * `contractual_concerns`: Preocupaciones contractuales
    * `legal_process_discussed`: Discusión sobre proceso legal
    * `renewal_discussed`: Discusión sobre renovación
    * `upsell_opportunity`: Oportunidad de upsell
    * `pilot_success`: Éxito del piloto
    * `pilot_failure`: Fracaso del piloto
  * **Fit & Product**:
    * `product_fit_confirmed`: Confirmado ajuste del producto
    * `usage_feedback_positive`: Feedback positivo de uso
    * `usage_feedback_negative`: Feedback negativo de uso
    * `technical_validation_passed`: Pasada validación técnica
    * `technical_blocker`: Bloqueo técnico
    * `integration_concerns`: Preocupaciones sobre integración
    * `training_requested`: Solicitado entrenamiento
    * `feature_request_made`: Solicitada nueva funcionalidad
    * `security_concerns`: Preocupaciones de seguridad
    * `compliance_concern`: Preocupación sobre cumplimiento
  * **Competition**:
    * `competitor_mentioned`: Mencionado competidor
    * `competitor_comparison_favorable`: Comparación favorable con competidor
    * `competitor_comparison_unfavorable`: Comparación desfavorable con competidor
  * **Risk & Churn**:
    * `churn_risk`: Riesgo de abandono
    * `no_decision_maker`: Sin tomador de decisiones
    * `internal_disalignment`: Desalineación interna
    * `resistance_to_change`: Resistencia al cambio
    * `escalation_detected`: Detectada escalada
    * `low_engagement`: Bajo compromiso
    * `deadline_blocker`: Bloqueo por plazo
  * **Relationship & Communication**:
    * `positive_feedback_on_demo`: Feedback positivo en demo
    * `negative_feedback_on_demo`: Feedback negativo en demo
    * `rapport_detected`: Detectado rapport
    * `misalignment_on_goals`: Desalineación en objetivos
    * `client_asks_many_questions`: Cliente hace muchas preguntas
    * `client_confused_about_offering`: Cliente confundido sobre la oferta
    * `tone_aggressive`: Tono agresivo
    * `tone_passive`: Tono pasivo
    * `speaker_dominates_conversation`: El hablante domina la conversación
    * `client_drives_conversation`: El cliente dirige la conversación
* `description`: Descripción detallada de la señal
* `contactId`: ID del contacto relacionado
* `companyId`: ID de la empresa relacionada
* `category`: Categoría de la señal comercial. Los tipos disponibles son:
  * `positive`: Señal positiva
  * `risk`: Señal de riesgo
  * `neutral`: Señal neutral
* `activityType`: Tipo de actividad donde se detectó la señal. Los tipos disponibles son:
  * `meeting`: Reunión
  * `call`: Llamada
  * `mail`: Correo electrónico
* `activityId`: ID de la actividad donde se detectó la señal
* `evidence`: Array de evidencias textuales que soportan la detección de la señal
* `changeType`: Tipo de cambio que representa la señal. Los tipos disponibles son:
  * `new`: Nueva señal detectada
  * `unchanged`: Señal sin cambios
  * `escalated`: Señal escalada
  * `improved`: Señal mejorada
  * `recovered`: Señal recuperada

## Estructura de la Solicitud

Cada solicitud webhook incluye:

1. **Headers**:
   * `Content-Type: application/json`
   * Headers personalizados configurados
   * `X-Webhook-Signature`: Firma para verificar la autenticidad (próximamente)
2. **Body**:
   * Definido según el tipo de evento

## Mejores Prácticas

1. **Verificación de Payload**:
   * Implementa la verificación de la firma del webhook (Próximamente)
2. **Manejo de Errores**:
   * Responde con un código 2xx para confirmar la recepción
   * Implementa reintentos en caso de fallos
   * Mantén un registro de los eventos recibidos
3. **Seguridad**:
   * Utiliza HTTPS para tu endpoint
   * Implementa autenticación en tu endpoint, puedes especificar un token en las cabeceras de la solicitud
   * Valida los datos recibidos antes de procesarlos

## Ejemplo de Implementación

```javascript
app.post("/webhook", (req, res) => {
  const { type, payload } = req.body;

  switch (type) {
    case "meeting_status_changed":
      handleMeetingStatusChange(payload);
      break;
    case "meeting_note_status_changed":
      handleMeetingNoteStatusChange(payload);
      break;
  }

  res.status(200).send("OK");
});
```

## Límites y Restricciones

* Los webhooks tienen un tiempo de espera de 10 segundos
* Se realizarán hasta 3 reintentos en caso de fallo
* El tamaño máximo del payload es de 1MB

## Soporte

Si necesitas ayuda con la implementación de webhooks o tienes preguntas sobre los eventos disponibles, contacta con nuestro equipo de soporte.
