# 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.salescaling.com/api/webhooks.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
