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

# Daftar Blokir Pelanggan

> Blokir pelanggan untuk menghentikan checkout berikutnya, membatalkan langganan aktif mereka, dan membuat Customer Portal hanya dapat dibaca. Kelola daftar blokir dari Settings atau API.

Customer Blocklist mencegah pelaku buruk yang sudah dikenal untuk membeli dari Anda lagi. Customer yang diblokir tidak dapat membayar, langganan aktifnya dibatalkan, dan mereka dapat melihat akun mereka di [Customer Portal](/features/customer-portal), tetapi tidak dapat mengubah langganan. Kelola blocklist dari **Settings → Blocklist** atau melalui Blocklist API.

<Frame caption="The Blocklist tab under Settings">
  <img src="https://mintcdn.com/dodopayments/c1t35qHSH45TR4GO/images/blocklist/blocklist-settings.png?fit=max&auto=format&n=c1t35qHSH45TR4GO&q=85&s=771eb4a5654fbd22e6a5110cfb1a2e9d" alt="Halaman pengaturan daftar blokir yang menampilkan jumlah total pelanggan yang diblokir, tabel entri yang diblokir dengan kolom identifier, diblokir oleh, dan diblokir pada, serta tombol Add to Blocklist" style={{ maxHeight: '500px', width: 'auto' }} width="2358" height="1554" data-path="images/blocklist/blocklist-settings.png" />
</Frame>

## Yang Terjadi Saat Anda Memblokir Pelanggan

Pemblokiran berlaku segera setelah Anda menambahkannya, di setiap area berikut:

| Area | Dampak |
| - | - |
| **Checkout** | Setiap upaya pembayaran dari email yang diblokir akan ditolak: payment links, checkout sessions, serta payments atau subscriptions yang dibuat melalui API. |
| **Live subscriptions** | Subscriptions dengan status `pending`, `active`, `on_hold`, atau `paused` dibatalkan dengan alasan `cancelled_by_merchant`. Webhook `subscription.cancelled` yang biasa akan dikirim untuk masing-masing subscription. |
| **Renewals and retries** | Perpanjangan otomatis dan [payment retries](/features/recovery/payment-retries) melewati customer yang diblokir, sehingga tidak ada biaya lanjutan yang dikenakan meskipun pembatalan masih tertunda. |
| **Manual retry** | [Manual retry](/features/recovery/manual-retry) untuk pembayaran customer yang diblokir akan ditolak. |
| **Customer Portal** | Customer tetap dapat login dan melihat invoice, subscription, serta license key. Mereka tidak dapat membatalkan, menjeda, atau melanjutkan subscription, mengubah plan, memperbarui payment method, atau mengedit alamat invoice. Mereka tetap dapat menghapus payment method yang tersimpan. |

<Note>
  Pemblokiran tidak mengembalikan pembayaran sebelumnya dan tidak memengaruhi dispute yang masih terbuka. Lakukan refund secara terpisah dari halaman [Refunds](/features/transactions/refunds).
</Note>

## Cara Pemblokiran Mencocokkan Customer

Anda dapat memblokir berdasarkan **customer ID** atau **email**. Bagaimanapun caranya, pemblokiran didasarkan pada email customer, bukan pada customer record:

* **Setiap record dengan email tersebut tercakup.** Checkout dapat membuat customer record baru untuk email yang kembali digunakan, sehingga pemblokiran berdasarkan satu customer ID dapat dilewati. Pemblokiran berdasarkan email tidak dapat dilewati.
* **Alias juga tercakup.** Email dibandingkan dalam huruf kecil setelah `+alias` dihapus, sehingga `buyer+promo@example.com` dan `Buyer@example.com` dianggap sebagai customer yang sama. Titik dalam alamat tetap dipertahankan.
* **Terbatas pada bisnis Anda.** Pemblokiran hanya berlaku untuk bisnis Anda. Email yang sama tetap dapat digunakan untuk membeli dari bisnis lain di Dodo Payments.
* **Email harus dimiliki customer yang sudah ada.** Anda tidak dapat memblokir email yang tidak cocok dengan customer mana pun, dan tidak dapat memblokir customer record yang tidak memiliki email.

## Memblokir Customer

Anda dapat memblokir customer dari halaman Blocklist atau dari halaman customer tersebut.

<Tabs>
  <Tab title="From Settings">
    <Steps>
      <Step title="Open the Blocklist">
        Buka **Settings → Blocklist** di dashboard Anda.
      </Step>

      <Step title="Add to Blocklist">
        Klik **Add to Blocklist**, lalu masukkan email customer atau customer ID di **Customer ID or email**. Panel akan menampilkan customer yang cocok.
      </Step>

      <Step title="Confirm">
        Klik **Add to Blocklist** di panel. Live subscriptions customer akan segera dibatalkan, dan entri tersebut muncul di tabel **Blocked entries**. Jika beberapa subscription masih dalam proses pembatalan, dashboard akan menampilkan pemberitahuan. Muat ulang halaman beberapa saat kemudian untuk memeriksanya.
      </Step>
    </Steps>
  </Tab>

  <Tab title="From the customer's page">
    <Steps>
      <Step title="Open the Customer">
        Buka **Sales → Customers**, lalu buka customer yang ingin Anda blokir.
      </Step>

      <Step title="Block the Customer">
        Buka menu dengan ikon tiga titik, lalu pilih **Block this Customer**.
      </Step>

      <Step title="Confirm">
        Klik **Block**. Setelah pemblokiran berlaku, halaman akan menampilkan badge **Blocked** di sebelah nama customer.
      </Step>
    </Steps>
  </Tab>
</Tabs>

Dashboard tidak meminta alasan. Untuk mencatat alasan Anda memblokir customer, tambahkan catatan di halaman customer atau kirim `reason` saat melakukan pemblokiran melalui API.

## Mengelola Customer yang Diblokir

Halaman **Blocklist** mencantumkan setiap pemblokiran aktif:

* **Total Customers Blocked**: Jumlah customer yang saat ini diblokir.
* **Blocked entries**: Satu baris untuk setiap pemblokiran, dengan **Identifier** yang Anda masukkan (email atau customer ID), **Blocked By**, dan **Blocked On**. **Blocked By** menampilkan anggota tim yang menambahkan pemblokiran, atau **API** untuk pemblokiran yang ditambahkan dengan API key.
* **Search Identifier** dan **Filters**: Cari entri berdasarkan email atau customer ID, atau filter berdasarkan **Blocked By** dan **Blocked Between**.
* **Action**: **See Details** membuka halaman customer yang diblokir, sedangkan **Unblock** menghapus pemblokiran. Anggota tim dengan peran **Viewer** tidak dapat membatalkan pemblokiran.

### Halaman Customer yang Diblokir

<Frame caption="A blocked customer's details page">
  <img src="https://mintcdn.com/dodopayments/c1t35qHSH45TR4GO/images/blocklist/blocked-customer-details.png?fit=max&auto=format&n=c1t35qHSH45TR4GO&q=85&s=83e1225a8e71c003d2bf660f0eea9c08" alt="Halaman Customer Information untuk customer yang diblokir, menampilkan badge Blocked, tombol Unblock Customer, Activity Log dengan catatan dan event Added to blocklist, serta panel Reference IDs dengan customer ID" style={{ maxHeight: '500px', width: 'auto' }} width="2366" height="1554" data-path="images/blocklist/blocked-customer-details.png" />
</Frame>

Buka customer yang diblokir dari **Sales → Customers** atau dari halaman Blocklist untuk melihat:

* Badge **Blocked** di sebelah nama customer dan tombol **Unblock Customer**.
* **Activity Log**: Kapan customer ditambahkan ke blocklist, alasannya, dan catatan apa pun yang ditambahkan tim Anda setelahnya. Klik **Add Note** untuk mencatat konteks baru, seperti hasil chargeback. Anda dapat mengedit catatan nanti melalui API.
* **Reference IDs**: Customer ID yang terkait dengan pemblokiran ini, siap untuk disalin.

## Membatalkan Pemblokiran Customer

Untuk membatalkan pemblokiran customer, klik **Unblock Customer** di halaman customer atau pilih **Unblock** di kolom **Action** pada halaman Blocklist. Kemudian konfirmasikan dengan **Unblock**.

* Perubahan pada Checkout dan Customer Portal segera dipulihkan.
* **Subscription yang dibatalkan tidak diaktifkan kembali.** Customer harus membeli lagi.
* Entri tetap disimpan sebagai audit record beserta catatannya, tetapi tidak lagi muncul dalam daftar aktif.
* Anda dapat memblokir customer yang sama lagi nanti. Tindakan ini akan membuat entri baru.

## Yang Dilihat Customer

Customer yang diblokir tidak pernah diberi tahu bahwa mereka telah diblokir.

* **Saat checkout**, pembayaran gagal dengan penolakan umum: "This payment cannot be processed." API mengembalikan HTTP `403` dengan error code `PAYMENT_NOT_PERMITTED`, tanpa menyebutkan penyebab. Alasan sebenarnya hanya dicatat dalam log Dodo Payments.
* **Di Customer Portal**, semua hal tetap terlihat, tetapi setiap tindakan yang mengubah akun akan ditolak. Tindakan yang ditolak mengembalikan HTTP `403` dengan `PORTAL_ACTION_NOT_PERMITTED` dan pesan "This action is not available." Profil portal membawa `read_only: true`, sehingga custom portal integration dapat menonaktifkan kontrolnya sendiri. Portal tidak pernah menampilkan entri blocklist atau catatannya.

<Warning>
  Jika Anda menampilkan error checkout atau portal di produk Anda sendiri, pertahankan perilaku ini. Tampilkan pesan umum untuk `PAYMENT_NOT_PERMITTED` dan `PORTAL_ACTION_NOT_PERMITTED`. Mengungkapkan pemblokiran akan memberi tahu pelaku buruk untuk mencoba email lain.
</Warning>

## Menggunakan API

Blocklist API memungkinkan Anda melakukan pemblokiran dari tooling Anda sendiri, misalnya saat chargeback masuk. API ini memerlukan secret [API key](/api-reference/introduction) Anda. Key apa pun dapat mencantumkan entri dan membaca catatan. Key dengan **write access** yang diaktifkan dapat memblokir, membatalkan pemblokiran, dan mengelola catatan. Dashboard menerapkan pembagian yang sama pada peran tim: peran **Viewer** dapat membaca daftar, sedangkan peran **Editor** dapat melakukan perubahan.

Blocklist API memiliki enam endpoint:

| Method | Endpoint | Tujuan |
| - | - | - |
| `GET` | `/blocklist/customers` | Mencantumkan customer yang diblokir, dengan filter dan jumlah `total` |
| `POST` | `/blocklist/customers` | Memblokir customer berdasarkan customer ID atau email |
| `GET` | `/blocklist/customers/{entry_id}` | Mendapatkan entri beserta catatannya |
| `DELETE` | `/blocklist/customers/{entry_id}` | Membatalkan pemblokiran customer |
| `POST` | `/blocklist/customers/{entry_id}/notes` | Menambahkan catatan |
| `PATCH` | `/blocklist/customers/{entry_id}/notes/{note_id}` | Memperbarui catatan |

Daftar hanya mengembalikan pemblokiran aktif. Untuk memfilternya, kirim `identifier` (pencocokan sebagian yang tidak membedakan huruf besar-kecil pada email atau customer ID), `blocked_by_email`, `created_at_gte`, atau `created_at_lte`. Secara default, daftar mengembalikan 10 entri per halaman: atur `page_size` untuk mengembalikan hingga 100 entri, dan `page_number` untuk berpindah halaman.

### Memblokir Customer

Kirim `customer_id` atau `email` di tingkat teratas body. Jika Anda mengirim keduanya, pemblokiran akan menggunakan `customer_id`. `reason` bersifat opsional dan ditampilkan di halaman entri. Pemblokiran baru mengembalikan HTTP `201`.

<CodeGroup>
  ```typescript Node.js expandable theme={null}
  import DodoPayments from 'dodopayments';

  const client = new DodoPayments({
    bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  });

  // Block by customer ID
  const entry = await client.blocklist.customers.create({
    customer_id: 'cus_0NmichXWP8JYBB9Dw1Unj',
    reason: 'Chargeback on pay_0NmichXuYoNoapmr',
  });

  // Or block by email
  const byEmail = await client.blocklist.customers.create({
    email: 'buyer@example.com',
    reason: 'Repeated refund abuse',
  });

  console.log(entry.id, entry.cancelled_subscription_ids);
  ```

  ```python Python expandable theme={null}
  import os
  from dodopayments import DodoPayments

  client = DodoPayments(bearer_token=os.environ["DODO_PAYMENTS_API_KEY"])

  # Block by customer ID
  entry = client.blocklist.customers.create(
      customer_id="cus_0NmichXWP8JYBB9Dw1Unj",
      reason="Chargeback on pay_0NmichXuYoNoapmr",
  )

  # Or block by email
  by_email = client.blocklist.customers.create(
      email="buyer@example.com",
      reason="Repeated refund abuse",
  )

  print(entry.id, entry.cancelled_subscription_ids)
  ```

  ```bash cURL theme={null}
  curl -X POST https://live.dodopayments.com/blocklist/customers \
    -H "Authorization: Bearer $DODO_PAYMENTS_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "customer_id": "cus_0NmichXWP8JYBB9Dw1Unj",
      "reason": "Chargeback on pay_0NmichXuYoNoapmr"
    }'
  ```
</CodeGroup>

Respons tersebut menjelaskan entri dan subscription yang dibatalkan oleh call tersebut:

```json Response theme={null}
{
  "id": "bcu_7Hq2mV9kRt4LxYw3Pz",
  "customer_id": "cus_0NmichXWP8JYBB9Dw1Unj",
  "customer_name": "wow guy",
  "customer_email": "wowguy@example.com",
  "identifier": "cus_0NmichXWP8JYBB9Dw1Unj",
  "reason": "Chargeback on pay_0NmichXuYoNoapmr",
  "source": "api",
  "blocked_by_email": null,
  "created_at": "2026-09-02T12:09:41Z",
  "unblocked_at": null,
  "cancelled_subscription_ids": ["sub_3Fk8pW2nQs6MzXc1"],
  "subscriptions_swept": true
}
```

Field berikut memerlukan perhatian khusus:

| Field | Deskripsi |
| - | - |
| `identifier` | Customer ID atau email yang Anda kirim. |
| `source` | Sumber pemblokiran: `blocklist_page`, `customer_page`, `payment_page`, `dispute_page`, atau `api`. API key selalu mencatat `api`, apa pun `source` yang Anda kirim. |
| `blocked_by_email` | User dashboard yang menambahkan pemblokiran. `null` untuk API key. |
| `cancelled_subscription_ids` | Subscription yang dibatalkan oleh call ini. Hanya tersedia pada create response. |
| `remaining_subscription_ids` | Subscription yang masih aktif karena pembatalan gagal atau call mencapai batas 25 pembatalan. |
| `subscriptions_swept` | `false` jika masih ada live subscription atau jika Dodo Payments tidak dapat mencantumkannya. Ulangi call sampai statusnya menjadi `true`. Pemblokiran itu sendiri sudah berlaku. |

<Note>
  Memblokir customer yang sudah diblokir mengembalikan HTTP `409` dengan `CUSTOMER_ALREADY_BLOCKED`, kecuali masih ada subscription yang menunggu untuk dibatalkan. Dalam kasus tersebut, call akan melanjutkan pembatalan dan mengembalikan HTTP `200`.
</Note>

### Memeriksa Apakah Customer Diblokir

[Get Customer Detail](/api-reference/customers/get-customers-1) mengembalikan dua field tambahan: `blocked_at`, waktu pemblokiran aktif ditambahkan (`null` jika customer tidak diblokir), dan `blocklist_entry_id`, entri yang mendasarinya. Endpoint [List Customers](/api-reference/customers/get-customers) mengosongkan kedua field tersebut.

### Membatalkan Pemblokiran Customer

<CodeGroup>
  ```typescript Node.js theme={null}
  await client.blocklist.customers.delete('bcu_7Hq2mV9kRt4LxYw3Pz');
  ```

  ```python Python theme={null}
  client.blocklist.customers.delete("bcu_7Hq2mV9kRt4LxYw3Pz")
  ```

  ```bash cURL theme={null}
  curl -X DELETE https://live.dodopayments.com/blocklist/customers/bcu_7Hq2mV9kRt4LxYw3Pz \
    -H "Authorization: Bearer $DODO_PAYMENTS_API_KEY"
  ```
</CodeGroup>

Endpoint mengembalikan HTTP `204` jika berhasil, dan HTTP `404` jika ID tidak cocok dengan pemblokiran aktif mana pun. Membatalkan pemblokiran memulihkan penulisan di checkout dan portal, serta tidak mengaktifkan kembali subscription apa pun.

## Praktik Terbaik

* **Catat alasannya.** Alasan singkat pada pemblokiran, ditambah catatan untuk hal-hal yang terjadi kemudian, memberi tim support Anda gambaran lengkap tanpa harus meninggalkan dashboard.
* **Blokir setelah chargeback.** Buka halaman customer dari dispute atau payment, lalu blokir customer di sana, atau otomatisasikan dari webhook `dispute.opened` dengan `POST /blocklist/customers`. Lihat [Disputes](/features/transactions/disputes).
* **Periksa `subscriptions_swept`.** Saat memblokir melalui API, ulangi call hingga respons melaporkan `true`, sehingga tidak ada live subscription yang tertinggal.
* **Lakukan refund secara terpisah.** Pemblokiran hanya menghentikan pembelian di masa mendatang. Jika Anda berutang uang kepada customer, lakukan refund payment seperti biasa.
* **Tinjau daftar.** Batalkan pemblokiran customer yang masalahnya telah selesai. Pembatalan pemblokiran berlaku segera dan tetap menyimpan riwayat.

## Terkait

<CardGroup cols={2}>
  <Card title="Customer Management" icon="user-group" href="/features/customers">
    Cari customer, buka halaman detailnya, lalu kelola subscription mereka.
  </Card>

  <Card title="Customer Portal" icon="id-card" href="/features/customer-portal">
    Hal-hal yang dapat dan tidak dapat dilakukan customer yang diblokir di portal.
  </Card>

  <Card title="Disputes" icon="circle-exclamation" href="/features/transactions/disputes">
    Tanggapi chargeback dan tentukan kapan pemblokiran diperlukan.
  </Card>

  <Card title="Error Codes" icon="triangle-exclamation" href="/api-reference/error-codes">
    Arti `PAYMENT_NOT_PERMITTED` dan `PORTAL_ACTION_NOT_PERMITTED`.
  </Card>
</CardGroup>


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