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

> Integre o Dodo Payments ao GoHighLevel (GHL) usando links de pagamento sem código, checkout em overlay ou checkout inline, e automatize o fulfillment com webhooks.

## Introdução

Conecte o Dodo Payments ao [GoHighLevel](https://www.gohighlevel.com/) (GHL) para vender pelos seus funis, sites, e-mails e SMS do GHL e processar pedidos com a automação do GHL. O GHL é uma plataforma de CRM e marketing com funis, sites, e-mail e SMS e automação (**Workflows**). O GHL não lista o Dodo Payments como processador de pagamentos integrado, então você conecta os dois de uma destas três maneiras. Escolha uma com base no nível de integração desejado para o checkout e na quantidade de código que você consegue escrever.

Todas as abordagens lidam com o processamento da mesma forma: o Dodo Payments envia [eventos de webhook](https://docs.dodopayments.com/developer-resources/webhooks.md) para um workflow de **Inbound Webhook** do GHL, que adiciona uma tag ao contato, concede acesso e envia confirmações.

## Escolha sua abordagem

As três abordagens diferem no código necessário e no local onde o cliente paga:

| Abordagem | Código necessário | Experiência de checkout | Ideal para |
| - | - | - | - |
| **A. Payment Links** | Nenhum (sem código) | O cliente acessa o checkout hospedado do Dodo Payments | A maioria dos usuários do GHL, lançamento mais rápido |
| **B. Overlay Checkout** | Código personalizado e um backend | Um modal é aberto sobre a página do GHL | Equipes que querem o checkout na página sem sair do funil |
| **C. Inline Checkout** | Código personalizado e um backend | O formulário de checkout é incorporado à página | Um checkout totalmente integrado e com a marca da empresa |

> [!NOTE]
>
> Se você é novo no Dodo Payments, comece pela **Abordagem A (Payment Links)**. Ela não exige código e funciona para todos os usuários do GHL. As abordagens B e C precisam de um backend que crie [sessões de checkout](https://docs.dodopayments.com/api-reference/checkout-sessions/create.md), portanto são adequadas para equipes familiarizadas com código.

## Pré-requisitos

Antes de começar, você precisa de:

* Uma conta do Dodo Payments com pelo menos um **produto**.
* Uma conta do GoHighLevel com um funil, site ou workflow.
* Acesso a **Developer → Webhooks** no dashboard do Dodo Payments e a **Developer → API Keys** se precisar de uma API key.
* Para as abordagens B e C: um pequeno **backend ou endpoint serverless** que crie sessões de checkout.

> [!NOTE]
>
> O GHL exige um **domínio conectado** para *publicar* um funil. Enquanto estiver criando, use o **Preview** do funil para testar. O JavaScript personalizado (abordagens B e C) geralmente é executado apenas na **página publicada em um domínio real**, não no Preview.

## Processamento com Webhooks (todas as abordagens)

O workflow do webhook é a camada de automação. Configure-o uma vez e ele funcionará com todas as abordagens de checkout.

**1. Create the Workflow**

Na sua **sub-account** do GHL, abra **Automation** no menu à esquerda. A aba **Workflows** será aberta. Clique em **Create workflow** e escolha **Start from Scratch**.

**2. Add the Inbound Webhook Trigger**

No builder, clique em **Add new trigger**. No painel **Add trigger**, pesquise por **webhook** e selecione **Inbound webhook**, listado em **Triggers → Events**. Copie a **Webhook URL** gerada.

**3. Register the Webhook in Dodo Payments**

No dashboard do Dodo Payments, acesse **Developer → Webhooks** e clique em **Add endpoint**. Cole a URL do GHL Inbound Webhook em **Endpoint URL** e clique em **Create endpoint**. Em seguida, forneça ao GHL um payload de exemplo para mapear campos, como o e-mail do cliente, o produto, o valor e o status. Faça uma compra de teste ou abra a aba **Testing** do endpoint, selecione um tipo de evento e clique em **Send example**.

**4. Add Fulfillment Actions**

No workflow do GHL, adicione ações para o evento, como **find/create contact by email**, **add a tag**, **grant course/membership access** e **send a confirmation email**. Depois, **Publish** o workflow.

> [!WARNING]
>
> O Dodo Payments processa os pagamentos, portanto eles **não** aparecem na aba **Payments** do GHL. Registre-os no GHL usando o workflow do webhook acima. Conceda acesso a partir do **webhook**, não do redirecionamento do navegador, pois o cliente pode fechar a aba antes que o redirecionamento seja concluído.

## Abordagem A: Payment Links (sem código)

Adicione um link de pagamento do Dodo Payments a qualquer botão do GHL, chamada para ação do funil, botão da página de pedido, e-mail ou SMS. Os clientes pagam no checkout hospedado do Dodo Payments. Para saber o que o checkout oferece, consulte [Recursos do Checkout](https://docs.dodopayments.com/features/checkout.md).

**1. Create a Product and Copy Its Payment Link**

No dashboard do Dodo Payments, acesse **Products** e clique em **Add Product**. Defina o **name** e o **price**, escolha **one-time** ou **subscription** e salve o produto. Na linha do produto, clique em **Share** e depois em **Copy payment link**. O link tem o formato `https://checkout.dodopayments.com/buy/{product_id}`.

**2. Add the Link to Your GHL Button**

Edite o funil ou a página do site e selecione o **Buy / Checkout button**. Defina a ação como **Open URL / Website** e cole seu link de pagamento.

**3. Set a Success Page (Optional)**

Para levar os clientes de volta ao seu funil depois que pagarem, informe a página de agradecimento do GHL em **Redirect URL**, na janela **Share** do produto, antes de copiar o link. O link passará a conter esse valor como o parâmetro `redirect_url`.

> [!TIP]
>
> Os parâmetros de consulta do link de pagamento podem preencher previamente e bloquear dados do cliente ou adicionar rastreamento. Por exemplo, passe o ID de um funil ou oferta como um parâmetro `metadata_*` e leia-o novamente a partir do webhook. Consulte [Links de pagamento estáticos](https://docs.dodopayments.com/developer-resources/integration-guide.md#static-payment-links) para ver todos os parâmetros.

## Abordagem B: Overlay Checkout (código personalizado)

A abordagem B abre o checkout do Dodo Payments como um **modal overlay** na página do GHL, usando o [Checkout SDK](https://docs.dodopayments.com/developer-resources/overlay-checkout.md) de uma CDN. Ela precisa de um backend que crie uma [sessão de checkout](https://docs.dodopayments.com/api-reference/checkout-sessions/create.md) e retorne seu `checkoutUrl`.

**1. Create a Backend Endpoint That Calls the Checkout Sessions API**

Esta etapa é **obrigatória**. O SDK precisa de uma URL de sessão de checkout, e a criação de uma sessão exige sua **secret API key**. O GHL hospeda apenas páginas e não pode fazer essa chamada no servidor por você. Nunca chame a [Create Checkout Session API](https://docs.dodopayments.com/api-reference/checkout-sessions/create.md) no navegador, pois isso expõe sua chave secreta no código-fonte da página. Portanto, o checkout overlay e o inline **não funcionam apenas com o GHL**: você precisa de um backend sob seu controle que crie a sessão e retorne somente a URL.

Qualquer backend pequeno funciona: uma função serverless (Cloudflare Workers, Vercel Functions, AWS Lambda, Supabase Edge Functions e similares) ou um endpoint em um servidor que você já execute. A lógica é a mesma em todas as plataformas: receber a solicitação, chamar a API do Dodo Payments com sua chave secreta e retornar o `checkout_url`.

Exemplo de lógica do handler, para adaptar à sua plataforma:

```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 };
}
```

Armazene sua API key como um secret na variável de ambiente `DODO_PAYMENTS_API_KEY` da plataforma na qual fará o deploy e nunca faça commit dela no código. Permita solicitações do seu domínio do GHL (CORS) e disponibilize o endpoint em um domínio sob seu controle, por exemplo `https://api.example.com/create-checkout`. Quando passar para o modo live, altere a URL para `https://live.dodopayments.com/checkouts`.

**2. Add a Custom Code Element in the GHL Page Builder**

Abra a etapa do funil ou a página do site no page builder do GHL e, em seguida:

1. Clique no ícone **+** no canto superior esquerdo do builder para abrir **Quick Add**.
2. Selecione **Elements** na lista de categorias à esquerda.
3. Encontre **Custom Code** (também exibido como HTML) e arraste-o para a página.
4. Cole o código abaixo no editor de código do elemento e salve.

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

**3. Publish and Test on Your Domain**

O JavaScript personalizado é executado na página **publicada** em seu domínio conectado e pode não ser executado no Preview. Publique a página e clique em **Pay Now** para confirmar que o overlay é aberto.

## Abordagem C: Inline (incorporado) Checkout

A abordagem C incorpora o formulário de checkout **dentro** da página do GHL, sem redirecionamento nem popup. Ela usa o mesmo SDK com um elemento de contêiner no qual o checkout é montado. Assim como a abordagem B, precisa de um backend para criar a sessão.

**1. Create a Backend Endpoint That Calls the Checkout Sessions API**

Esta etapa é **obrigatória**, assim como no checkout overlay. A criação de uma sessão exige sua secret API key, portanto deve ocorrer em um servidor, e o GHL não consegue fazer isso sozinho. Reutilize o endpoint de backend da seção **Overlay Checkout** acima: qualquer função serverless pequena ou servidor sob seu controle que chame a [Create Checkout Session API](https://docs.dodopayments.com/api-reference/checkout-sessions/create.md) e retorne `{ checkoutUrl }`.

**2. Add a Container and SDK via Custom Code**

No page builder do GHL:

1. Clique no ícone **+** no canto superior esquerdo do builder para abrir **Quick Add**.
2. Selecione **Elements** na lista de categorias à esquerda.
3. Encontre **Custom Code** (também exibido como HTML) e arraste-o para a página, no local em que deseja exibir o formulário de checkout.
4. Cole o código abaixo no editor de código do elemento e salve.

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

**3. Verify Your Domain for Wallets (Apple Pay)**

Para oferecer Apple Pay no inline checkout, [verifique seu domínio](https://docs.dodopayments.com/features/payment-methods/digital-wallets.md#apple-pay). No dashboard do Dodo Payments, acesse **Settings → Payment Methods** e clique em **Manage domains** na linha do **Apple Pay**. Baixe o arquivo de associação de domínio, hospede-o no seu domínio e registre o domínio. O Apple Pay não está disponível no overlay checkout (Approach B).

Um domínio hospedado pelo GHL não pode hospedar o arquivo de associação de domínio. O Apple Pay no inline checkout requer um domínio sob seu controle que possa servir `/.well-known/apple-developer-merchantid-domain-association`. Em páginas hospedadas pelo GHL, use o hosted checkout do Payment Links (Approach A) ou não use o Apple Pay.

> [!WARNING]
>
> O inline checkout é a opção mais complexa no GHL. Ele requer código personalizado, um backend, uma página publicada em um domínio real e, para o Apple Pay, a verificação do domínio. Se você não precisa de um formulário totalmente incorporado, use o Approach A ou B.

## Eventos a serem tratados

Inscreva o endpoint do GHL nos eventos usados pelo seu workflow. A tabela sugere uma ação do GHL para cada evento:

| Evento do Dodo Payments | Quando ocorre | Ação sugerida no GHL |
| - | - | - |
| `payment.succeeded` | Quando um pagamento é concluído com sucesso | Marcar o contato como pago, conceder acesso, enviar uma confirmação |
| `subscription.active` | Quando uma assinatura é ativada | Conceder acesso à associação, iniciar o workflow de onboarding |
| `subscription.renewed` | Quando uma assinatura é renovada para o próximo período de cobrança | Estender o acesso para o próximo ciclo |
| `subscription.past_due` | Quando uma renovação falha e o período de carência começa. O cliente mantém o acesso até o prazo final | Iniciar o workflow de cobrança ou lembrete enquanto o cliente ainda tem acesso |
| `subscription.on_hold` | Quando a assinatura é colocada em espera após uma renovação malsucedida | Pausar o acesso, intensificar a sequência de lembretes |
| `subscription.cancelled` / `subscription.expired` | Quando a assinatura termina | Remover o acesso, marcar como churned |

Os eventos de pagamento e assinatura incluem o **e-mail do cliente** em `data.customer.email`. Use a ação **find/create contact by email** do GHL para associar o pagamento ao contato correto. Para cada evento, consulte o [Webhook Event Guide](https://docs.dodopayments.com/developer-resources/webhooks/intents/webhook-events-guide.md).

## Testes e entrada em produção

**1. Test in Test Mode**

Mantenha a opção **Live Mode** na barra lateral do Dodo Payments desativada para trabalhar no modo de teste. Conclua uma compra com o cartão de teste `4242 4242 4242 4242` (validade `06/32`, CVV `123`) e confirme que o workflow do GHL é executado e aplica a tag ou concede o acesso.

**2. Go Live**

Ative a opção **Live Mode** e adicione a URL do GHL Inbound Webhook como endpoint no modo de produção. O que mais precisa ser alterado depende da sua abordagem:

* **Payment Links (A):** Substitua o link pelo link de pagamento **live** do produto.
* **Overlay checkout (B):** Aponte seu backend para `https://live.dodopayments.com/checkouts` usando sua chave de API **live** e defina `mode` como `"live"` na chamada INLINE\_CODE\_PLACEHOLDER\_f5db7a37f0e5ebbcf\_END do SDK.
* **Inline checkout (C):** Faça as mesmas alterações do overlay checkout, pois ele usa o mesmo endpoint do backend e a mesma inicialização do SDK.

Depois, faça uma compra real do início ao fim para confirmar a configuração.

## Dicas

> [!TIP]
>
> Considere o **webhook como a fonte de verdade** para conceder acesso. Aja com base em `payment.succeeded` ou `subscription.active`, não no redirecionamento do navegador.

> [!TIP]
>
> Um GHL Inbound Webhook não pode verificar o cabeçalho `webhook-signature`. Para garantir que somente eventos genuínos do Dodo Payments acionem o fulfillment no GHL, aponte o endpoint de webhook do Dodo Payments para seu próprio backend, verifique cada evento nele ([Webhooks](https://docs.dodopayments.com/developer-resources/webhooks.md)) e encaminhe-o para a URL do GHL Inbound Webhook.

## Solução de problemas

> **Payment succeeded but nothing happened in GHL**
>
> Verifique se o endpoint de webhook do Dodo Payments aponta para a URL correta do GHL Inbound Webhook, se o workflow está **published** e se o trigger capturou um payload de exemplo, para que o mapeamento dos campos exista.

> **Overlay or inline button does nothing**
>
> O JavaScript personalizado geralmente é executado apenas na **página publicada em um domínio real**, não no Preview. Confirme se a página foi publicada, se o SDK `<script>` foi carregado e se `checkoutUrl` é uma URL de sessão válida do seu backend.

> **Contact not created or not matched**
>
> Verifique se seu workflow usa **find/create contact by email** e se o campo de e-mail foi mapeado a partir do payload do webhook.

> **Payment isn't showing in GHL's Payments tab**
>
> Isso é esperado. O Dodo Payments processa os pagamentos; portanto, registre-os no GHL com o workflow do webhook.


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