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

> Kirim email transaksional melalui Keplars berdasarkan acara dari Dodo Payments.

## Pendahuluan

Kirim email transaksional profesional secara otomatis ketika acara pembayaran dan langganan terjadi. Sampaikan konfirmasi pembayaran, pembaruan langganan, dan notifikasi kegagalan melalui Keplars tanpa memerlukan server middleware. Dodo Payments memanggil API Keplars secara langsung menggunakan JavaScript transformation handler.

<Info>
  Integrasi ini memerlukan Keplars API Key Anda untuk autentikasi. Temukan di dashboard Keplars di bawah **Settings → API Keys**, dan verifikasi domain atau alamat pengirim di bawah **Domains**.
</Info>

## Memulai

<Steps>
  <Step title="Open the Webhook Section">
    Di dashboard Dodo Payments Anda, navigasikan ke <b>Webhooks → + Add Endpoint</b> dan buka dropdown integrasi.
  </Step>

  <Step title="Select Keplars">
    Pilih kartu integrasi <b>Keplars</b>.

    <Frame>
      <img src="https://mintcdn.com/dodopayments/tM0KgwbOo2xwg7zr/images/integrations/keplars/select.png?fit=max&auto=format&n=tM0KgwbOo2xwg7zr&q=85&s=776a4a2228efa0822b15b13d2baaf5bb" alt="Pilih kartu integrasi Keplars" style={{ maxHeight: '500px', width: 'auto' }} width="1040" height="731" data-path="images/integrations/keplars/select.png" />
    </Frame>
  </Step>

  <Step title="Enter API Key">
    Masukkan Keplars API Key Anda. Ini dikirim sebagai token Bearer pada setiap permintaan.

    <Frame>
      <img src="https://mintcdn.com/dodopayments/tM0KgwbOo2xwg7zr/images/integrations/keplars/api-key.png?fit=max&auto=format&n=tM0KgwbOo2xwg7zr&q=85&s=f3e0917155715d0587a6012c1bfd3f26" alt="Masukkan URL API Keplars, API Key, dan langganan ke acara" style={{ maxHeight: '500px', width: 'auto' }} width="982" height="854" data-path="images/integrations/keplars/api-key.png" />
    </Frame>
  </Step>

  <Step title="Configure Transformation">
    Ubah kode transformasi untuk memformat email bagi Keplars. Ganti alamat pengirim placeholder dan template ID dengan milik Anda sendiri.
  </Step>

  <Step title="Test & Create">
    Uji dengan payload sampel dan klik <b>Create</b> untuk mengaktifkan pengiriman email.
  </Step>

  <Step title="Done!">
    🎉 Acara pembayaran kini akan secara otomatis memicu email transaksional melalui Keplars.
  </Step>
</Steps>

## Contoh Kode Transformasi

Setiap handler menetapkan `webhook.url` ke endpoint pengiriman prioritas tinggi Keplars dan menulis ulang `webhook.payload` menjadi permintaan Keplars (API key dikirim secara otomatis sebagai token Bearer). Ganti `payments@mail.yourdomain.com` dengan pengirim terverifikasi Anda dan `your-keplars-*-template-id` dengan template ID Anda yang sebenarnya.

<Warning>
  `to` harus berupa **array**, bahkan untuk satu penerima. Saat menggunakan `template_id`, **jangan** juga mengirimkan `subject` atau `body`. Template menyediakannya.
</Warning>

### Email Konfirmasi Pembayaran

```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],
    from: "payments@mail.yourdomain.com",
    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;
}
```

### Notifikasi Gagal Pembayaran

```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],
    from: "payments@mail.yourdomain.com",
    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;
}
```

### Email Selamat Datang Langganan

```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],
    from: "payments@mail.yourdomain.com",
    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;
}
```

### Email Pembatalan Langganan

```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],
    from: "payments@mail.yourdomain.com",
    template_id: "your-keplars-subscription-cancelled-template-id",
    params: {
      customer_name: data.customer?.name,
      subscription_id: data.subscription_id,
      cancellation_date: cancellationDate,
    },
  };
  return webhook;
}
```

## Tips

* Gunakan domain atau alamat pengirim yang telah diverifikasi untuk pengiriman yang lebih baik.
* Buat template Keplars yang didedikasikan untuk setiap jenis acara sehingga setiap email tetap sesuai merek dan pesan.
* Personalisasikan setiap email dengan mengirimkan data pelanggan seperti nama, jumlah, dan ID pembayaran melalui `params`.
* Uji dalam mode sandbox terlebih dahulu. Pengiriman sandbox akan ditangkap di Keplars Test Inbox alih-alih dikirimkan.

## Pemecahan Masalah

<AccordionGroup>
  <Accordion title="Emails not being sent">
    * Verifikasi bahwa API key Anda benar dan aktif di Keplars di bawah **Settings → API Keys**.
    * Verifikasi bahwa domain atau alamat pengirim Anda diverifikasi.
    * Dodo Payments menampilkan respons kesalahan Keplars mentah di log pengiriman webhook. Periksa untuk detail.
  </Accordion>

  <Accordion title="Template not found">
    * `template_id` dalam handler Anda harus cocok dengan template aktif di akun Keplars Anda. Verifikasi ID (dan bahwa itu aktif) di dashboard.
  </Accordion>

  <Accordion title="Wrong event triggered">
    * Setiap handler memeriksa `webhook.eventType` dan mengembalikannya lebih awal jika tidak cocok. Pastikan acara yang benar berlangganan di endpoint webhook Dodo Payments.
  </Accordion>
</AccordionGroup>
