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

<Info>
  Customer Blocklist menghentikan pelaku bermasalah yang sudah dikenal agar tidak membeli dari Anda lagi. Pelanggan yang diblokir tidak dapat membayar, kehilangan langganan aktifnya, dan dapat melihat tetapi tidak mengubah apa pun di [Customer Portal](/features/customer-portal). Kelola dari **Settings → Blocklist** atau melalui Blocklist API.
</Info>

<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

| 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 dalam status `pending`, `active`, `on_hold`, atau `paused` dibatalkan dengan alasan `cancelled_by_merchant`. Webhook `subscription.cancelled` yang biasa akan aktif untuk masing-masing subscription.                                                |
| **Renewals and retries** | Renewal otomatis dan [payment retries](/features/recovery/payment-retries) melewati pelanggan yang diblokir, sehingga tidak ada tagihan lanjutan meskipun pembatalan masih tertunda.                                                                               |
| **Manual retry**         | [Manual retry](/features/recovery/manual-retry) untuk pembayaran pelanggan yang diblokir akan ditolak.                                                                                                                                                             |
| **Customer Portal**      | Pelanggan tetap dapat login dan melihat invoice, subscription, serta license key, tetapi tidak dapat membatalkan, menjeda, atau melanjutkan subscription, mengubah plan, atau memperbarui payment method. Menghapus payment method yang tersimpan tetap diizinkan. |

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

## Cara Pemblokiran Mencocokkan Pelanggan

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

* **Setiap record dengan email tersebut tercakup.** Checkout dapat membuat customer record baru untuk email yang kembali berbelanja, sehingga pemblokiran berdasarkan satu customer ID dapat dilewati. Pemblokiran berdasarkan email tidak dapat dilewati.
* **Alias juga tercakup.** Email dibandingkan dalam huruf kecil dengan `+alias` dihapus, sehingga `buyer+promo@example.com` dan `Buyer@example.com` dianggap sebagai pelanggan yang sama. Titik dalam alamat email tetap dipertahankan.
* **Berlaku hanya untuk 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 pelanggan yang sudah ada.** Anda tidak dapat memblokir email yang belum pernah melakukan checkout dengan Anda, dan customer record tanpa email tidak dapat diblokir.

## Memblokir Pelanggan

<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 atau customer ID pelanggan. Tambahkan alasan agar tim Anda nantinya dapat melihat alasan pemblokiran tersebut.
      </Step>

      <Step title="Confirm">
        Konfirmasikan pemblokiran. Live subscriptions pelanggan akan segera dibatalkan, dan entri tersebut muncul di tabel **Blocked entries**.
      </Step>
    </Steps>
  </Tab>

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

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

## Mengelola Pelanggan yang Diblokir

Halaman **Blocklist** mencantumkan setiap pemblokiran yang aktif:

* **Total Customers Blocked**: Jumlah pelanggan yang saat ini diblokir.
* **Blocked entries**: Satu baris untuk setiap pemblokiran, dengan **Identifier** yang Anda masukkan (email atau customer ID), **Blocked By** (anggota tim yang menambahkan pemblokiran), dan **Blocked On**.
* **Search Identifier** dan **Filters**: Temukan entri berdasarkan email atau customer ID, atau filter berdasarkan siapa yang memblokir dan waktunya.
* **Action**: Kelola entri, termasuk membuka blokir pelanggan.

### Halaman Pelanggan 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 pelanggan yang diblokir yang menampilkan badge Blocked, tombol Unblock Customer, Activity Log dengan catatan dan peristiwa 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 pelanggan yang diblokir dari **Sales → Customers** atau dari halaman Blocklist untuk melihat:

* Badge **Blocked** di samping nama pelanggan dan tombol **Unblock Customer**.
* **Activity Log**: Waktu pelanggan ditambahkan ke daftar blokir, alasannya, dan catatan yang telah ditambahkan tim Anda sejak saat itu. Klik **Add Note** untuk mencatat konteks baru, seperti hasil chargeback. Catatan dapat diedit nanti.
* **Reference IDs**: Customer ID yang terkait dengan pemblokiran ini, siap untuk disalin.

## Membuka Blokir Pelanggan

Klik **Unblock Customer** di halaman pelanggan, atau gunakan menu tindakan di halaman Blocklist.

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

## Yang Dilihat Pelanggan

Pelanggan 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`, yang tidak menyebutkan penyebab apa pun. Alasan sebenarnya hanya ditulis dalam log Dodo Payments.
* **Di Customer Portal**, semua hal terlihat tetapi setiap tindakan dinonaktifkan. Write yang diblokir mengembalikan `PORTAL_ACTION_NOT_PERMITTED` dengan pesan "This action is not available." Profil portal menyertakan `read_only: true` sehingga integrasi portal kustom dapat menonaktifkan kontrolnya sendiri. Portal tidak pernah menampilkan entri daftar blokir atau catatannya.

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

## Menggunakan API

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

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

### Memblokir Pelanggan

Kirim `customer_id` atau `email` di tingkat teratas body. `reason` bersifat opsional dan ditampilkan di halaman entri.

<CodeGroup>
  ```typescript Node.js 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 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>

```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                        | Deskripsi                                                                                                                       |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `identifier`                 | Customer ID atau email yang Anda kirimkan.                                                                                      |
| `source`                     | Asal pemblokiran: `blocklist_page`, `customer_page`, `payment_page`, `dispute_page`, atau `api`. API key selalu mencatat `api`. |
| `blocked_by_email`           | Pengguna dashboard yang menambahkan pemblokiran. `null` untuk API key.                                                          |
| `cancelled_subscription_ids` | Subscription yang dibatalkan oleh panggilan ini.                                                                                |
| `remaining_subscription_ids` | Subscription yang masih aktif karena pembatalan gagal atau panggilan mencapai batas 25 pembatalan.                              |
| `subscriptions_swept`        | `false` saat masih ada subscription aktif. Ulangi panggilan hingga statusnya `true`. Pemblokiran itu sendiri sudah berlaku.     |

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

### Memeriksa Apakah Pelanggan Diblokir

[Get Customer Detail](/api-reference/customers/get-customers-1) mengembalikan dua field tambahan: `blocked_at`, waktu pemblokiran aktif ditambahkan (`null` saat pelanggan tidak diblokir), dan `blocklist_entry_id`, entri yang mendasarinya. Endpoint [List Customers](/api-reference/customers/get-customers) membiarkan keduanya kosong.

### Membuka Blokir Pelanggan

<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. Membuka blokir memulihkan write pada 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 dukungan Anda gambaran lengkap tanpa meninggalkan dashboard.
* **Blokir setelah chargeback.** Buka pelanggan dari dispute atau payment, lalu blokir dari sana, atau otomatisasi dari webhook `dispute.opened` dengan `POST /blocklist/customers`. Lihat [Disputes](/features/transactions/disputes).
* **Periksa `subscriptions_swept`.** Saat memblokir melalui API, ulangi panggilan hingga respons melaporkan `true`, sehingga tidak ada subscription aktif yang tertinggal.
* **Lakukan refund secara terpisah.** Pemblokiran hanya menghentikan pembelian berikutnya. Jika Anda harus mengembalikan uang pelanggan, lakukan refund payment seperti biasa.
* **Tinjau daftar.** Buka blokir pelanggan yang masalahnya telah terselesaikan. Pembukaan blokir berlaku segera dan tetap menyimpan riwayat.

## Terkait

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

  <Card title="Customer Portal" icon="id-card" href="/features/customer-portal">
    Hal-hal yang dapat dan tidak dapat dilakukan pelanggan 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>
