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

# Reenviar

> Envía correos electrónicos transaccionales a través de Resend cuando ocurren eventos de Dodo Payments, como confirmaciones de pago, mensajes de bienvenida de suscripciones y avisos de pagos fallidos.

## Introducción

La integración de Resend envía un correo electrónico transaccional a través de Resend cuando ocurre un evento de Dodo Payments. Úsala para confirmar pagos, dar la bienvenida a nuevos suscriptores e informar a los clientes cuando un pago falla, desde tu propio dominio de envío.

<Info>
  Esta integración requiere una clave de API de Resend con **Sending access** y un dominio de envío verificado en Resend. También necesitas acceso a **Developer → Webhooks** en el dashboard de Dodo Payments.
</Info>

## Comenzando

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

    <Frame>
      <img src="https://mintcdn.com/dodopayments/DL_ADtkdH7ph5YST/images/integrations/resend.png?fit=max&auto=format&n=DL_ADtkdH7ph5YST&q=85&s=9968c4c48dca69a0eeffeffa0040b61d" alt="Add endpoint dialog with Resend selected in the Integration dropdown and the How to connect Resend steps" style={{ maxHeight: '500px', width: 'auto' }} width="1536" height="1428" data-path="images/integrations/resend.png" />
    </Frame>
  </Step>

  <Step title="Select Resend">
    En **Integration**, selecciona **Resend**. El dashboard completa la **Endpoint URL** y el código de transformación para Resend, y el panel **How to connect Resend** muestra los pasos de configuración.
  </Step>

  <Step title="Enter API Key">
    En Resend, abre [API Keys](https://resend.com/api-keys), haz clic en **Create API Key** y asigna a la clave **Sending access**. Resend muestra la clave, que comienza con `re_`, una sola vez. Pégala en **API key**. Dodo Payments la envía como un bearer token en el encabezado `Authorization` de cada solicitud a Resend.
  </Step>

  <Step title="Select Events">
    En **Subscribed events**, selecciona solo los eventos que maneja tu transformación. Un evento que la transformación deja sin cambios llega a Resend en el formato de Dodo Payments, y Resend lo rechaza.
  </Step>

  <Step title="Configure Transformation">
    En **Transformation code**, edita el handler para que cada evento suscrito se convierta en un correo electrónico de Resend. Comienza con los [ejemplos](#transformation-code-examples).
  </Step>

  <Step title="Test & Create">
    En **Test this code**, selecciona un tipo de evento y haz clic en **Simulate** para previsualizar la solicitud a Resend. Luego haz clic en **Create endpoint**.
  </Step>

  <Step title="Done">
    Dodo Payments ahora envía un correo electrónico a través de Resend por cada evento suscrito. Para ver cada entrega y la respuesta de Resend, abre la pestaña **Logs** en **Developer → Webhooks**.
  </Step>
</Steps>

## Ejemplos de código de transformación

Cada handler establece `webhook.url` en el endpoint de envío de correos de Resend y reemplaza `webhook.payload` por el correo electrónico. Los importes de Dodo Payments están en la unidad monetaria más pequeña, por lo que los ejemplos los dividen entre 100 y muestran el código de moneda. Para monedas sin decimales, como JPY y KRW, usa el importe tal cual.

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

Envía un recibo cuando un pago se realiza correctamente (`payment.succeeded`):

```javascript payment_confirmation.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType === "payment.succeeded") {
    const p = webhook.payload.data;
    webhook.url = "https://api.resend.com/emails";
    webhook.payload = {
      from: "payments@yourdomain.com",
      to: [p.customer.email],
      subject: "Payment Confirmation - " + (p.total_amount / 100).toFixed(2) + " " + p.currency,
      html: `
        <h2>Payment Successful!</h2>
        <p>Hi ${p.customer.name},</p>
        <p>Your payment of ${(p.total_amount / 100).toFixed(2)} ${p.currency} has been processed successfully.</p>
        <ul>
          <li><strong>Payment ID:</strong> ${p.payment_id}</li>
          <li><strong>Amount:</strong> ${(p.total_amount / 100).toFixed(2)} ${p.currency}</li>
          <li><strong>Date:</strong> ${new Date(webhook.payload.timestamp).toLocaleDateString()}</li>
          <li><strong>Method:</strong> ${p.payment_method || "Unknown"}</li>
        </ul>
        <p>Thank you for your business!</p>
      `,
      text: `Payment Successful! Your payment of ${(p.total_amount / 100).toFixed(2)} ${p.currency} has been processed. Payment ID: ${p.payment_id}`
    };
  }
  return webhook;
}
```

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

Da la bienvenida a un cliente cuando una suscripción se activa (`subscription.active`):

```javascript subscription_welcome.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType === "subscription.active") {
    const s = webhook.payload.data;
    webhook.url = "https://api.resend.com/emails";
    webhook.payload = {
      from: "welcome@yourdomain.com",
      to: [s.customer.email],
      subject: "Welcome to Your Subscription!",
      html: `
        <h2>Welcome to Your Subscription!</h2>
        <p>Hi ${s.customer.name},</p>
        <p>Your subscription has been activated successfully.</p>
        <ul>
          <li><strong>Subscription ID:</strong> ${s.subscription_id}</li>
          <li><strong>Product:</strong> ${s.product_id}</li>
          <li><strong>Amount:</strong> ${(s.recurring_pre_tax_amount / 100).toFixed(2)} ${s.currency}/${s.payment_frequency_interval}</li>
          <li><strong>Next Billing:</strong> ${new Date(s.next_billing_date).toLocaleDateString()}</li>
        </ul>
        <p>You can manage your subscription anytime from your account dashboard.</p>
      `,
      text: `Welcome! Your subscription is now active. Amount: ${(s.recurring_pre_tax_amount / 100).toFixed(2)} ${s.currency}/${s.payment_frequency_interval}`
    };
  }
  return webhook;
}
```

### Notificación de pago fallido

Pide al cliente que actualice su método de pago cuando un pago falla (`payment.failed`):

```javascript payment_failure.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType === "payment.failed") {
    const p = webhook.payload.data;
    webhook.url = "https://api.resend.com/emails";
    webhook.payload = {
      from: "support@yourdomain.com",
      to: [p.customer.email],
      subject: "Payment Failed - Action Required",
      html: `
        <h2>Payment Failed</h2>
        <p>Hi ${p.customer.name},</p>
        <p>We were unable to process your payment of ${(p.total_amount / 100).toFixed(2)} ${p.currency}.</p>
        <ul>
          <li><strong>Payment ID:</strong> ${p.payment_id}</li>
          <li><strong>Amount:</strong> ${(p.total_amount / 100).toFixed(2)} ${p.currency}</li>
          <li><strong>Error:</strong> ${p.error_message || "Payment processing failed"}</li>
        </ul>
        <p>Please update your payment method or contact support for assistance.</p>
        <a href="https://yourdomain.com/update-payment">Update Payment Method</a>
      `,
      text: `Payment Failed: We couldn't process your ${(p.total_amount / 100).toFixed(2)} ${p.currency} payment. Please update your payment method.`
    };
  }
  return webhook;
}
```

## Consejos

* Envía los correos desde un dominio que hayas verificado en Resend, lo que mejora la entregabilidad.
* Incluye una versión `html` y una versión `text` de cada correo electrónico.
* Personaliza el contenido con datos del cliente del payload, como `customer.name`.
* Escribe asuntos que indiquen el resultado o la acción necesaria.
* Incluye un enlace para cancelar la suscripción en cualquier correo electrónico que contenga contenido de marketing.
* Previsualiza cada plantilla con **Simulate** antes de crear el endpoint.
* Para omitir un evento en el código, establece `webhook.cancel = true` antes de devolver el webhook. Los logs registran una entrega omitida como exitosa.

## Solución de problemas

<AccordionGroup>
  <Accordion title="Emails Not Being Sent">
    * Comprueba que la clave de API sea correcta, esté activa y tenga **Sending access**. Para reemplazarla, edita el endpoint y pega una clave nueva en **API key**.
    * Comprueba que el dominio del remitente esté verificado en Resend.
    * Comprueba que las direcciones de correo electrónico de los destinatarios sean válidas.
    * Comprueba los límites y las cuotas de envío de Resend para tu plan.
    * Abre la pestaña **Logs** en **Developer → Webhooks** y lee la respuesta de Resend a la entrega fallida.
  </Accordion>

  <Accordion title="Transformation Errors">
    * Comprueba que el payload coincida con el formato de envío de correos de Resend. Resend requiere `from`, `to` y `subject`.
    * Comprueba que cada evento que maneja tu código establezca todos los campos obligatorios.
    * Comprueba que el valor de `html` sea HTML válido.
    * Comprueba que la dirección de `from` use un dominio verificado en Resend.
  </Accordion>
</AccordionGroup>


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