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

# GoHighLevel

> Integrasikan Dodo Payments dengan GoHighLevel (GHL) menggunakan payment links tanpa kode, overlay checkout, atau inline checkout, lalu otomatisasi fulfillment dengan webhook.

## Pendahuluan

Hubungkan Dodo Payments ke [GoHighLevel](https://www.gohighlevel.com/) (GHL) untuk berjualan melalui funnel, situs web, email, dan SMS GHL, serta memenuhi pesanan dengan otomatisasi GHL. GHL adalah platform CRM dan pemasaran dengan funnel, situs web, email dan SMS, serta otomatisasi (**Workflows**). GHL tidak mencantumkan Dodo Payments sebagai pemroses pembayaran bawaan, jadi Anda harus menghubungkan keduanya dengan salah satu dari tiga cara. Pilih berdasarkan seberapa terintegrasi checkout yang Anda inginkan dan seberapa banyak kode yang dapat Anda tulis.

Setiap pendekatan menangani pemenuhan pesanan dengan cara yang sama: Dodo Payments mengirimkan [webhook events](/developer-resources/webhooks) ke workflow **Inbound Webhook** GHL, yang menambahkan tag ke kontak, memberikan akses, dan mengirimkan konfirmasi.

## Pilih Pendekatan Anda

Ketiga pendekatan berbeda dalam kode yang diperlukan dan tempat pelanggan melakukan pembayaran:

| Pendekatan | Kode yang diperlukan | Pengalaman checkout | Paling cocok untuk |
| - | - | - | - |
| **A. Payment Links** | Tidak ada (tanpa kode) | Pelanggan menuju checkout yang di-host Dodo Payments | Sebagian besar pengguna GHL, peluncuran tercepat |
| **B. Overlay Checkout** | Kode khusus dan backend | Modal terbuka di atas halaman GHL | Tim yang ingin checkout berada di halaman tanpa meninggalkan funnel |
| **C. Inline Checkout** | Kode khusus dan backend | Formulir checkout tertanam di halaman | Checkout bermerek yang sepenuhnya tertanam |

<Info>
  Jika Anda baru menggunakan Dodo Payments, mulailah dengan **Pendekatan A (Payment Links)**. Pendekatan ini tidak memerlukan kode dan berfungsi untuk setiap pengguna GHL. Pendekatan B dan C memerlukan backend yang membuat [checkout sessions](/api-reference/checkout-sessions/create), sehingga cocok untuk tim yang nyaman dengan kode.
</Info>

## Prasyarat

Sebelum memulai, Anda memerlukan:

* Akun Dodo Payments dengan setidaknya satu **product**.
* Akun GoHighLevel dengan funnel, situs web, atau workflow.
* Akses ke **Developer → Webhooks** di dashboard Dodo Payments, serta ke **Developer → API Keys** jika Anda memerlukan API key.
* Untuk Pendekatan B dan C: **backend atau endpoint serverless** kecil yang membuat checkout sessions.

<Note>
  GHL memerlukan **connected domain** untuk *mempublikasikan* funnel. Selama membangun, gunakan **Preview** funnel untuk menguji. JavaScript khusus (Pendekatan B dan C) umumnya hanya berjalan di **halaman yang dipublikasikan pada domain nyata**, bukan di Preview.
</Note>

## Pemenuhan Pesanan dengan Webhook (Semua Pendekatan)

Workflow webhook adalah lapisan otomatisasi. Siapkan sekali, dan workflow ini akan berfungsi dengan setiap pendekatan checkout.

<Steps>
  <Step title="Create the Workflow">
    Di **sub-account** GHL Anda, buka **Automation** di menu sebelah kiri. Tab **Workflows** akan terbuka. Klik **Create workflow**, lalu pilih **Start from Scratch**.
  </Step>

  <Step title="Add the Inbound Webhook Trigger">
    Di builder, klik **Add new trigger**. Di panel **Add trigger**, cari **webhook** dan pilih **Inbound webhook**, yang tercantum di bawah **Triggers → Events**. Salin **Webhook URL** yang dibuat.
  </Step>

  <Step title="Register the Webhook in Dodo Payments">
    Di dashboard Dodo Payments, buka **Developer → Webhooks** dan klik **Add endpoint**. Tempel GHL Inbound Webhook URL ke **Endpoint URL**, lalu klik **Create endpoint**. Kemudian berikan GHL contoh payload untuk memetakan field, seperti email pelanggan, produk, jumlah, dan status. Lakukan pembelian pengujian, atau buka tab **Testing** endpoint, pilih jenis event, lalu klik **Send example**.
  </Step>

  <Step title="Add Fulfillment Actions">
    Di workflow GHL, tambahkan tindakan untuk event tersebut, seperti **find/create contact by email**, **add a tag**, **grant course/membership access**, dan **send a confirmation email**. Lalu **Publish** workflow.
  </Step>
</Steps>

<Warning>
  Dodo Payments memproses pembayaran, sehingga pembayaran tersebut **tidak** muncul di tab **Payments** GHL. Catat pembayaran tersebut di GHL menggunakan workflow webhook di atas. Berikan akses dari **webhook**, bukan dari pengalihan browser, karena pelanggan dapat menutup tab sebelum pengalihan selesai.
</Warning>

## Pendekatan A: Payment Links (Tanpa Kode)

Tambahkan payment link Dodo Payments ke tombol GHL apa pun, ajakan bertindak di funnel, tombol halaman pesanan, email, atau SMS. Pelanggan membayar di checkout yang di-host Dodo Payments. Untuk mengetahui apa saja yang didukung checkout, lihat [Checkout Features](/features/checkout).

<Steps>
  <Step title="Create a Product and Copy Its Payment Link">
    Di dashboard Dodo Payments, buka **Products** dan klik **Add Product**. Tetapkan **name** dan **price**, pilih **one-time** atau **subscription**, lalu simpan produk. Pada baris produk, klik **Share**, lalu klik **Copy payment link**. Link tersebut memiliki format `https://checkout.dodopayments.com/buy/{product_id}`.
  </Step>

  <Step title="Add the Link to Your GHL Button">
    Edit funnel atau halaman situs web Anda, lalu pilih **Buy / Checkout button**. Tetapkan tindakannya ke **Open URL / Website**, kemudian tempel payment link Anda.
  </Step>

  <Step title="Set a Success Page (Optional)">
    Untuk mengarahkan pelanggan kembali ke funnel setelah membayar, masukkan halaman terima kasih GHL Anda di **Redirect URL** pada lembar **Share** produk sebelum menyalin link. Link tersebut kemudian membawanya sebagai parameter `redirect_url`.
  </Step>
</Steps>

<Tip>
  Parameter query payment link dapat mengisi dan mengunci detail pelanggan, atau menambahkan pelacakan. Misalnya, teruskan ID funnel atau penawaran sebagai parameter `metadata_*` dan baca kembali nilainya dari webhook. Lihat [Static Payment Links](/developer-resources/integration-guide#static-payment-links) untuk semua parameter.
</Tip>

## Pendekatan B: Overlay Checkout (Kode Khusus)

Pendekatan B membuka checkout Dodo Payments sebagai **modal overlay** di halaman GHL Anda, menggunakan [Checkout SDK](/developer-resources/overlay-checkout) dari CDN. Pendekatan ini memerlukan backend yang membuat [checkout session](/api-reference/checkout-sessions/create) dan mengembalikan `checkoutUrl`.

<Steps>
  <Step title="Create a Backend Endpoint That Calls the Checkout Sessions API">
    Langkah ini **wajib**. SDK memerlukan URL checkout session, dan pembuatan session memerlukan **secret API key** Anda. GHL hanya meng-host halaman dan tidak dapat melakukan panggilan sisi server ini untuk Anda. Jangan pernah memanggil [Create Checkout Session API](/api-reference/checkout-sessions/create) dari browser, karena hal itu akan mengekspos secret key Anda di sumber halaman. Karena itu, overlay dan inline checkout **tidak dapat berfungsi hanya dengan GHL**: Anda memerlukan backend yang Anda kendalikan untuk membuat session dan hanya mengembalikan URL.

    Backend kecil apa pun dapat digunakan: fungsi serverless (Cloudflare Workers, Vercel Functions, AWS Lambda, Supabase Edge Functions, dan layanan serupa), atau endpoint di server yang sudah Anda jalankan. Logikanya sama di setiap platform: terima request, panggil API Dodo Payments dengan secret key Anda, lalu kembalikan `checkout_url`.

    Contoh logika handler, yang perlu disesuaikan dengan platform Anda:

    ```js theme={null}
    async function createCheckout(env) {
      const res = await fetch("https://test.dodopayments.com/checkouts", {
        method: "POST",
        headers: {
          "Authorization": `Bearer ${env.DODO_PAYMENTS_API_KEY}`,
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          product_cart: [{ product_id: "pdt_your_product_id", quantity: 1 }],
        }),
      });

      const data = await res.json();
      return { checkoutUrl: data.checkout_url };
    }
    ```

    Simpan API key Anda sebagai secret dalam variabel environment `DODO_PAYMENTS_API_KEY` di platform tempat Anda melakukan deployment, dan jangan pernah memasukkannya ke commit kode. Izinkan request dari domain GHL Anda (CORS), dan sajikan endpoint dari domain yang Anda kendalikan, misalnya `https://api.example.com/create-checkout`. Saat beralih ke mode live, ubah URL menjadi `https://live.dodopayments.com/checkouts`.
  </Step>

  <Step title="Add a Custom Code Element in the GHL Page Builder">
    Buka langkah funnel atau halaman situs web Anda di page builder GHL, lalu:

    1. Klik ikon **+** di kiri atas builder untuk membuka **Quick Add**.
    2. Pilih **Elements** dari daftar kategori di sebelah kiri.
    3. Temukan **Custom Code** (juga ditampilkan sebagai HTML) dan seret ke halaman.
    4. Tempel kode di bawah ke editor kode elemen, lalu simpan.

    ```html theme={null}
    <!-- Load the Dodo Checkout SDK -->
    <script src="https://cdn.jsdelivr.net/npm/dodopayments-checkout@latest/dist/index.js"></script>
    <script>
      DodoPaymentsCheckout.DodoPayments.Initialize({
        mode: "test", // change to "live" in production
        displayType: "overlay",
        onEvent: (event) => console.log("Checkout event:", event),
      });

      async function openDodoCheckout() {
        // calls the backend endpoint from the previous step, creating a fresh session per click
        const res = await fetch("https://api.example.com/create-checkout", { method: "POST" });
        const { checkoutUrl } = await res.json();

        DodoPaymentsCheckout.DodoPayments.Checkout.open({ checkoutUrl });
      }
    </script>

    <button onclick="openDodoCheckout()">Pay Now</button>
    ```
  </Step>

  <Step title="Publish and Test on Your Domain">
    JavaScript khusus berjalan di halaman **yang dipublikasikan** pada connected domain Anda, dan mungkin tidak berjalan di Preview. Publikasikan halaman, lalu klik **Pay Now** untuk memastikan overlay terbuka.
  </Step>
</Steps>

## Pendekatan C: Inline (Tertanam) Checkout

Pendekatan C menanamkan formulir checkout **di dalam** halaman GHL Anda, tanpa pengalihan dan tanpa popup. Pendekatan ini menggunakan SDK yang sama dengan elemen container sebagai tempat pemasangan. Seperti Pendekatan B, pendekatan ini memerlukan backend untuk membuat session.

<Steps>
  <Step title="Create a Backend Endpoint That Calls the Checkout Sessions API">
    Langkah ini **wajib**, sama seperti pada overlay checkout. Pembuatan session memerlukan secret API key Anda, sehingga harus dilakukan di server dan GHL tidak dapat melakukannya sendiri. Gunakan kembali endpoint backend dari bagian **Overlay Checkout** di atas: fungsi serverless atau server kecil apa pun yang Anda kendalikan, yang memanggil [Create Checkout Session API](/api-reference/checkout-sessions/create) dan mengembalikan `{ checkoutUrl }`.
  </Step>

  <Step title="Add a Container and SDK via Custom Code">
    Di page builder GHL:

    1. Klik ikon **+** di kiri atas builder untuk membuka **Quick Add**.
    2. Pilih **Elements** dari daftar kategori di sebelah kiri.
    3. Temukan **Custom Code** (juga ditampilkan sebagai HTML) dan seret ke halaman tempat Anda ingin formulir checkout muncul.
    4. Tempel kode di bawah ke editor kode elemen, lalu simpan.

    ```html theme={null}
    <script src="https://cdn.jsdelivr.net/npm/dodopayments-checkout@latest/dist/index.js"></script>

    <div id="dodo-inline-checkout"></div>

    <script>
      DodoPaymentsCheckout.DodoPayments.Initialize({
        mode: "test",
        displayType: "inline",
        onEvent: (event) => console.log("Checkout event:", event),
      });

      async function mountDodoCheckout() {
        // calls the backend endpoint from the previous step
        const res = await fetch("https://api.example.com/create-checkout", { method: "POST" });
        const { checkoutUrl } = await res.json();

        DodoPaymentsCheckout.DodoPayments.Checkout.open({
          checkoutUrl,
          elementId: "dodo-inline-checkout",
        });
      }

      mountDodoCheckout();
    </script>
    ```
  </Step>

  <Step title="Verify Your Domain for Wallets (Apple Pay)">
    Untuk menawarkan Apple Pay di inline checkout, [verifikasi domain Anda](/features/payment-methods/digital-wallets#apple-pay). Di dashboard Dodo Payments, buka **Settings → Payment Methods** dan klik **Manage domains** pada baris **Apple Pay**. Unduh file asosiasi domain, host file tersebut di domain Anda, lalu daftarkan domainnya. Apple Pay tidak tersedia di overlay checkout (Approach B).

    Domain yang di-host oleh GHL tidak dapat meng-host file asosiasi domain. Apple Pay di inline checkout memerlukan domain yang Anda kontrol dan dapat menyajikan `/.well-known/apple-developer-merchantid-domain-association`. Pada halaman yang di-host oleh GHL, gunakan hosted checkout dari Payment Links (Approach A) atau jangan gunakan Apple Pay.
  </Step>
</Steps>

<Warning>
  Inline checkout adalah opsi yang paling kompleks di GHL. Opsi ini memerlukan kode kustom, backend, halaman yang dipublikasikan pada domain nyata, dan, untuk Apple Pay, verifikasi domain. Jika Anda tidak memerlukan formulir yang sepenuhnya tertanam, gunakan Approach A atau B.
</Warning>

## Events to Handle

Berlangganan endpoint GHL ke event yang ditangani oleh workflow Anda. Tabel berikut menyarankan tindakan GHL untuk setiap event:

| Dodo Payments event | When it fires | Suggested GHL action |
| - | - | - |
| `payment.succeeded` | Saat pembayaran berhasil | Tandai contact sebagai telah membayar, berikan akses, kirim konfirmasi |
| `subscription.active` | Saat subscription diaktifkan | Berikan membership, mulai workflow onboarding |
| `subscription.renewed` | Saat subscription diperpanjang untuk periode penagihan berikutnya | Perpanjang akses untuk siklus berikutnya |
| `subscription.past_due` | Saat perpanjangan gagal dan masa tenggang dimulai. Customer tetap memiliki akses hingga batas waktu | Mulai workflow penagihan atau pengingat saat customer masih memiliki akses |
| `subscription.on_hold` | Saat subscription ditangguhkan setelah perpanjangan yang gagal | Jeda akses, eskalasikan rangkaian pengingat |
| `subscription.cancelled` / `subscription.expired` | Saat subscription berakhir | Hapus akses, tandai sebagai churned |

Event pembayaran dan subscription menyertakan **customer email** di `data.customer.email`. Gunakan action GHL **find/create contact by email** untuk mencocokkan pembayaran dengan contact yang tepat. Untuk setiap event, lihat [Webhook Event Guide](/developer-resources/webhooks/intents/webhook-events-guide).

## Testing & Going Live

<Steps>
  <Step title="Test in Test Mode">
    Biarkan switch **Live Mode** di sidebar Dodo Payments tetap nonaktif agar Anda bekerja dalam mode pengujian. Selesaikan pembelian menggunakan kartu pengujian `4242 4242 4242 4242` (expiry `06/32`, CVV `123`), lalu konfirmasikan bahwa workflow GHL berjalan dan menerapkan tag atau akses.
  </Step>

  <Step title="Go Live">
    Aktifkan switch **Live Mode** dan tambahkan GHL Inbound Webhook URL sebagai endpoint dalam live mode. Perubahan lainnya bergantung pada pendekatan yang Anda gunakan:

    * **Payment Links (A):** Ganti link dengan payment link **live** milik produk.
    * **Overlay checkout (B):** Arahkan backend Anda ke `https://live.dodopayments.com/checkouts` menggunakan API key **live** Anda, lalu atur `mode` ke `"live"` dalam pemanggilan `Initialize` SDK.
    * **Inline checkout (C):** Lakukan perubahan yang sama seperti pada overlay checkout karena opsi ini menggunakan endpoint backend dan inisialisasi SDK yang sama.

    Kemudian lakukan satu pembelian nyata dari awal hingga selesai untuk mengonfirmasi penyiapan tersebut.
  </Step>
</Steps>

## Tips

<Tip>
  Anggap **webhook sebagai sumber kebenaran** untuk memberikan akses. Tindak lanjuti `payment.succeeded` atau `subscription.active`, bukan pengalihan browser.
</Tip>

<Tip>
  GHL Inbound Webhook tidak dapat memverifikasi header `webhook-signature`. Agar hanya event Dodo Payments yang benar-benar valid yang memicu fulfillment di GHL, arahkan endpoint webhook Dodo Payments ke backend Anda sendiri, verifikasi setiap event di sana ([Webhooks](/developer-resources/webhooks)), lalu teruskan event tersebut ke GHL Inbound Webhook URL.
</Tip>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Payment succeeded but nothing happened in GHL">
    Periksa apakah endpoint webhook Dodo Payments mengarah ke GHL Inbound Webhook URL yang benar, workflow sudah **dipublikasikan**, dan trigger telah menangkap sample payload sehingga pemetaan field tersedia.
  </Accordion>

  <Accordion title="Overlay or inline button does nothing">
    JavaScript kustom biasanya hanya berjalan pada **halaman yang dipublikasikan di domain nyata**, bukan di Preview. Pastikan halaman telah dipublikasikan, SDK `<script>` telah dimuat, dan `checkoutUrl` merupakan session URL yang valid dari backend Anda.
  </Accordion>

  <Accordion title="Contact not created or not matched">
    Periksa apakah workflow Anda menggunakan **find/create contact by email** dan field email dipetakan dari webhook payload.
  </Accordion>

  <Accordion title="Payment isn't showing in GHL's Payments tab">
    Hal ini memang diharapkan. Dodo Payments memproses pembayaran, jadi catat pembayaran tersebut di GHL menggunakan workflow webhook.
  </Accordion>
</AccordionGroup>


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