> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Keplars

> Envía correos electrónicos transaccionales a través de Keplars cuando ocurran eventos de pago y suscripción de Dodo Payments, sin un servidor de middleware.

## Introducción

Envía correos electrónicos transaccionales automáticamente cuando ocurran eventos de pago y suscripción. Las confirmaciones de pago, las actualizaciones de suscripción y las notificaciones de errores se envían a través de Keplars sin un servidor de middleware: Dodo Payments llama directamente a la API de Keplars mediante un controlador de transformación de JavaScript.

<Info>
  Esta integración se autentica con tu API key de Keplars. Encuéntrala en el dashboard de Keplars, en **Settings → API Keys**, y verifica un dominio o una dirección de remitente en **Domains**.
</Info>

## Comenzando

<Steps>
  <Step title="Open the Webhook Section">
    En el dashboard de Dodo Payments, ve a **Developer → Webhooks** y haz clic en **Add endpoint**.
  </Step>

  <Step title="Select Keplars">
    En **Integration**, selecciona **Keplars**. La plantilla completa la URL de la API de Keplars y el código de transformación.

    <Frame>
      <img src="https://mintcdn.com/dodopayments/DL_ADtkdH7ph5YST/images/integrations/keplars/select.png?fit=max&auto=format&n=DL_ADtkdH7ph5YST&q=85&s=6dd9d05d29a67d43e74f5870c839725d" alt="Diálogo para añadir un endpoint con Keplars seleccionado en el menú desplegable Integration" style={{ maxHeight: '500px', width: 'auto' }} width="1536" height="1428" data-path="images/integrations/keplars/select.png" />
    </Frame>
  </Step>

  <Step title="Enter API Key">
    Pega tu clave de API de Keplars en **API key**. Dodo Payments la envía como un token Bearer en cada solicitud. En **Subscribed events**, selecciona los eventos que deben enviar un correo electrónico.

    <Frame>
      <img src="https://mintcdn.com/dodopayments/DL_ADtkdH7ph5YST/images/integrations/keplars/api-key.png?fit=max&auto=format&n=DL_ADtkdH7ph5YST&q=85&s=1639bfeb8a79835a274bb6ea07695489" alt="URL del endpoint de Keplars completada, campo de clave de API y lista Subscribed events" style={{ maxHeight: '500px', width: 'auto' }} width="1536" height="1428" data-path="images/integrations/keplars/api-key.png" />
    </Frame>
  </Step>

  <Step title="Configure Transformation">
    En **Transformation code**, edita el código para dar formato a los correos electrónicos para Keplars. Sustituye los ID de plantilla de marcador de posición por los tuyos.
  </Step>

  <Step title="Test & Create">
    En **Test this code**, selecciona un tipo de evento y haz clic en **Simulate** para ejecutar la transformación con un payload de ejemplo. Luego, haz clic en **Create endpoint** para comenzar a enviar correos electrónicos.
  </Step>

  <Step title="Done">
    <Check>
      Los eventos de Dodo Payments ahora envían correos electrónicos transaccionales a través de Keplars.
    </Check>
  </Step>
</Steps>

## Ejemplos de Código de Transformación

Cada handler establece `webhook.url` en el endpoint de envío de alta prioridad de Keplars y reescribe `webhook.payload` en una solicitud de Keplars. Dodo Payments añade la clave de API como un token Bearer. Sustituye `your-keplars-*-template-id` por tus ID de plantilla. La API de envío de Keplars no tiene el campo `from`, por lo que Keplars envía cada correo desde un remitente que configures en el dashboard de Keplars.

<Warning>
  `to` debe ser un **array**, incluso para un solo destinatario. Cuando uses `template_id`, **no** envíes también `subject` ni `body`, porque la plantilla los proporciona.
</Warning>

### Correo electrónico de confirmación del pago

```javascript payment_succeeded.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType !== "payment.succeeded") return webhook;

  const data = webhook.payload.data || {};
  const paymentDate = new Date(webhook.payload.timestamp).toLocaleDateString("en-US", {
    year: "numeric", month: "long", day: "numeric",
  });

  webhook.url = "https://api.keplars.com/api/v1/send-email/high";
  webhook.payload = {
    to: [data.customer?.email],
    template_id: "your-keplars-payment-success-template-id",
    params: {
      customer_name: data.customer?.name,
      amount: ((data.total_amount || 0) / 100).toFixed(2),
      currency: data.currency || "USD",
      payment_id: data.payment_id,
      payment_method: data.payment_method,
      payment_date: paymentDate,
    },
  };
  return webhook;
}
```

### Notificación de pago fallido

```javascript payment_failed.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType !== "payment.failed") return webhook;

  const data = webhook.payload.data || {};
  const paymentDate = new Date(webhook.payload.timestamp).toLocaleDateString("en-US", {
    year: "numeric", month: "long", day: "numeric",
  });

  webhook.url = "https://api.keplars.com/api/v1/send-email/high";
  webhook.payload = {
    to: [data.customer?.email],
    template_id: "your-keplars-payment-failed-template-id",
    params: {
      customer_name: data.customer?.name,
      amount: ((data.total_amount || 0) / 100).toFixed(2),
      currency: data.currency || "USD",
      payment_id: data.payment_id,
      error_message: data.error_message || "Your payment could not be processed.",
      payment_date: paymentDate,
    },
  };
  return webhook;
}
```

### Correo electrónico de bienvenida a la suscripción

```javascript subscription_active.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType !== "subscription.active") return webhook;

  const data = webhook.payload.data || {};
  const nextBilling = data.next_billing_date
    ? new Date(data.next_billing_date).toLocaleDateString("en-US", {
        year: "numeric", month: "long", day: "numeric",
      })
    : "";

  webhook.url = "https://api.keplars.com/api/v1/send-email/high";
  webhook.payload = {
    to: [data.customer?.email],
    template_id: "your-keplars-subscription-active-template-id",
    params: {
      customer_name: data.customer?.name,
      subscription_id: data.subscription_id,
      product_id: data.product_id,
      amount: ((data.recurring_pre_tax_amount || 0) / 100).toFixed(2),
      currency: data.currency || "USD",
      billing_interval: data.payment_frequency_interval || "Month",
      next_billing_date: nextBilling,
    },
  };
  return webhook;
}
```

### Correo electrónico de cancelación de la suscripción

```javascript subscription_cancelled.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType !== "subscription.cancelled") return webhook;

  const data = webhook.payload.data || {};
  const cancellationDate = new Date(webhook.payload.timestamp).toLocaleDateString("en-US", {
    year: "numeric", month: "long", day: "numeric",
  });

  webhook.url = "https://api.keplars.com/api/v1/send-email/high";
  webhook.payload = {
    to: [data.customer?.email],
    template_id: "your-keplars-subscription-cancelled-template-id",
    params: {
      customer_name: data.customer?.name,
      subscription_id: data.subscription_id,
      cancellation_date: cancellationDate,
    },
  };
  return webhook;
}
```

## Consejos

* Envía los correos desde un dominio o una dirección verificados para mejorar la entregabilidad.
* Crea una plantilla de Keplars por cada tipo de evento para que cada correo mantenga la identidad y el mensaje de tu marca.
* Personaliza cada correo pasando los datos del cliente, como el nombre, el importe y el ID de pago, en `params`.
* Prueba primero en modo sandbox. Keplars captura los envíos de sandbox en su Test Inbox en lugar de entregarlos.

## Solución de problemas

<AccordionGroup>
  <Accordion title="Emails not being sent">
    * Comprueba que tu clave de API sea correcta y esté activa en Keplars, en **Settings → API Keys**.
    * Comprueba que tu dominio o dirección de remitente estén verificados.
    * En el dashboard de Dodo Payments, abre el mensaje en la pestaña **Logs** de **Developer → Webhooks**. Cada intento de entrega muestra la respuesta de error sin procesar de Keplars.
  </Accordion>

  <Accordion title="Template not found">
    * El `template_id` de tu handler debe coincidir con una plantilla activa de tu cuenta de Keplars. Comprueba el ID y verifica que la plantilla esté activa en el dashboard de Keplars.
  </Accordion>

  <Accordion title="Wrong event triggered">
    * Cada handler comprueba `webhook.eventType` y devuelve el webhook sin cambios si el evento no coincide. Comprueba que **Subscribed events** del endpoint incluya únicamente los eventos que quieres.
  </Accordion>
</AccordionGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.