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

> Integra Dodo Payments con GoHighLevel (GHL) mediante enlaces de pago sin código, checkout superpuesto o checkout integrado, y automatiza el cumplimiento con webhooks.

## Introducción

Conecta Dodo Payments a [GoHighLevel](https://www.gohighlevel.com/) (GHL) para vender desde tus funnels, sitios web, emails y SMS de GHL, y gestionar los pedidos con la automatización de GHL. GHL es una plataforma de CRM y marketing con funnels, sitios web, email y SMS, y automatización (**Workflows**). GHL no incluye Dodo Payments como procesador de pagos integrado, por lo que debes conectar ambos servicios de una de estas tres formas. Elige una según el nivel de integración que quieras para el checkout y cuánto código puedas escribir.

Todos los métodos gestionan el fulfillment de la misma manera: Dodo Payments envía [eventos de webhook](/developer-resources/webhooks) a un workflow de **Inbound Webhook** de GHL, que etiqueta al contacto, concede acceso y envía confirmaciones.

## Elige tu método

Los tres métodos se diferencian en el código que necesitan y en dónde paga el cliente:

| Método | Código necesario | Experiencia de checkout | Ideal para |
| - | - | - | - |
| **A. Payment Links** | Ninguno (sin código) | El cliente accede al checkout alojado de Dodo Payments | La mayoría de usuarios de GHL, lanzamiento más rápido |
| **B. Overlay Checkout** | Código personalizado y un backend | Se abre un modal sobre tu página de GHL | Equipos que quieren mantener el checkout en la página sin salir del funnel |
| **C. Inline Checkout** | Código personalizado y un backend | El formulario de checkout está integrado en la página | Un checkout completamente integrado y con tu marca |

<Info>
  Si eres nuevo en Dodo Payments, empieza con el **método A (Payment Links)**. No requiere código y funciona para cualquier usuario de GHL. Los métodos B y C necesitan un backend que cree [checkout sessions](/api-reference/checkout-sessions/create), por lo que son adecuados para equipos que se sienten cómodos trabajando con código.
</Info>

## Requisitos previos

Antes de empezar, necesitas:

* Una cuenta de Dodo Payments con al menos un **product**.
* Una cuenta de GoHighLevel con un funnel, sitio web o workflow.
* Acceso a **Developer → Webhooks** en el dashboard de Dodo Payments y a **Developer → API Keys** si necesitas una API key.
* Para los métodos B y C: un pequeño **backend o endpoint serverless** que cree checkout sessions.

<Note>
  GHL requiere un **connected domain** para *publicar* un funnel. Mientras lo construyes, usa **Preview** del funnel para probarlo. El JavaScript personalizado (métodos B y C) generalmente solo se ejecuta en la **página publicada en un dominio real**, no en Preview.
</Note>

## Fulfillment con Webhooks (todos los métodos)

El workflow de webhook es la capa de automatización. Configúralo una vez y funcionará con cualquier método de checkout.

<Steps>
  <Step title="Create the Workflow">
    En tu **sub-account** de GHL, abre **Automation** en el menú izquierdo. Se abrirá en la pestaña **Workflows**. Haz clic en **Create workflow** y selecciona **Start from Scratch**.
  </Step>

  <Step title="Add the Inbound Webhook Trigger">
    En el builder, haz clic en **Add new trigger**. En el panel **Add trigger**, busca **webhook** y selecciona **Inbound webhook**, que aparece en **Triggers → Events**. Copia la **Webhook URL** que se genere.
  </Step>

  <Step title="Register the Webhook in Dodo Payments">
    En el dashboard de Dodo Payments, ve a **Developer → Webhooks** y haz clic en **Add endpoint**. Pega la URL del GHL Inbound Webhook en **Endpoint URL** y haz clic en **Create endpoint**. Después, proporciona a GHL un payload de ejemplo del que pueda mapear campos, como el email del cliente, el producto, el importe y el status. Puedes hacer una compra de prueba o abrir la pestaña **Testing** del endpoint, seleccionar un tipo de evento y hacer clic en **Send example**.
  </Step>

  <Step title="Add Fulfillment Actions">
    En el workflow de GHL, añade acciones para el evento, como **find/create contact by email**, **add a tag**, **grant course/membership access** y **send a confirmation email**. Después, **Publish** el workflow.
  </Step>
</Steps>

<Warning>
  Dodo Payments procesa los pagos, por lo que **no** aparecen en la pestaña **Payments** de GHL. Regístralos en GHL con el workflow de webhook anterior. Concede acceso desde el **webhook**, no desde la redirección del navegador, porque el cliente puede cerrar la pestaña antes de que se complete la redirección.
</Warning>

## Método A: Payment Links (sin código)

Añade un payment link de Dodo Payments a cualquier botón de GHL, llamada a la acción del funnel, botón de la página de pedido, email o SMS. Los clientes pagan en el checkout alojado de Dodo Payments. Para consultar las funciones compatibles con el checkout, visita [Checkout Features](/features/checkout).

<Steps>
  <Step title="Create a Product and Copy Its Payment Link">
    En el dashboard de Dodo Payments, ve a **Products** y haz clic en **Add Product**. Define el **name** y el **price**, elige **one-time** o **subscription** y guarda el producto. En la fila del producto, haz clic en **Share** y después en **Copy payment link**. El enlace tiene el formato `https://checkout.dodopayments.com/buy/{product_id}`.
  </Step>

  <Step title="Add the Link to Your GHL Button">
    Edita tu funnel o página web y selecciona el **Buy / Checkout button**. Define su acción como **Open URL / Website** y pega tu payment link.
  </Step>

  <Step title="Set a Success Page (Optional)">
    Para devolver a los clientes a tu funnel después del pago, introduce tu página de agradecimiento de GHL en **Redirect URL**, dentro de la hoja **Share** del producto, antes de copiar el enlace. El enlace incluirá ese valor como parámetro `redirect_url`.
  </Step>
</Steps>

<Tip>
  Los query parameters de los payment links pueden rellenar y bloquear datos del cliente, o añadir tracking. Por ejemplo, pasa un ID de funnel u oferta como parámetro `metadata_*` y recupéralo desde el webhook. Consulta [Static Payment Links](/developer-resources/integration-guide#static-payment-links) para ver todos los parámetros.
</Tip>

## Método B: Overlay Checkout (código personalizado)

El método B abre el checkout de Dodo Payments como un **modal overlay** en tu página de GHL, utilizando el [Checkout SDK](/developer-resources/overlay-checkout) desde un CDN. Necesita un backend que cree una [checkout session](/api-reference/checkout-sessions/create) y devuelva su `checkoutUrl`.

<Steps>
  <Step title="Create a Backend Endpoint That Calls the Checkout Sessions API">
    Este paso es **obligatorio**. El SDK necesita una URL de checkout session y crear una session requiere tu **secret API key**. GHL solo aloja páginas y no puede hacer esta llamada server-side por ti. Nunca llames a la [Create Checkout Session API](/api-reference/checkout-sessions/create) desde el navegador, porque expondrías tu secret key en el código fuente de la página. Por tanto, el checkout overlay e inline **no pueden funcionar únicamente con GHL**: necesitas un backend bajo tu control que cree la session y devuelva solo la URL.

    Cualquier backend pequeño funciona: una función serverless (Cloudflare Workers, Vercel Functions, AWS Lambda, Supabase Edge Functions y similares) o un endpoint en un servidor que ya administres. La lógica es la misma en todas las plataformas: recibir la solicitud, llamar a la API de Dodo Payments con tu secret key y devolver `checkout_url`.

    Ejemplo de la lógica del handler, que debes adaptar a tu 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 };
    }
    ```

    Guarda tu API key como secret en la variable de entorno `DODO_PAYMENTS_API_KEY` de la plataforma en la que hagas el deploy y nunca la incluyas en el código. Permite solicitudes desde tu dominio de GHL (CORS) y sirve el endpoint desde un dominio bajo tu control, por ejemplo `https://api.example.com/create-checkout`. Cuando pases al live mode, cambia la URL a `https://live.dodopayments.com/checkouts`.
  </Step>

  <Step title="Add a Custom Code Element in the GHL Page Builder">
    Abre el paso de tu funnel o la página web en el page builder de GHL y, después:

    1. Haz clic en el icono **+** situado en la esquina superior izquierda del builder para abrir **Quick Add**.
    2. Selecciona **Elements** en la lista de categorías de la izquierda.
    3. Busca **Custom Code** (también aparece como HTML) y arrástralo hasta la página.
    4. Pega el código siguiente en el editor de código del elemento y guárdalo.

    ```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">
    El JavaScript personalizado normalmente solo se ejecuta en la página **publicada** en tu dominio conectado y puede no ejecutarse en Preview. Publica la página y haz clic en **Pay Now** para confirmar que se abre el overlay.
  </Step>
</Steps>

## Método C: Inline (Embedded) Checkout

El método C integra el formulario de checkout **dentro** de tu página de GHL, sin redirección ni popup. Utiliza el mismo SDK con un elemento contenedor en el que se monta. Al igual que el método B, necesita un backend para crear la session.

<Steps>
  <Step title="Create a Backend Endpoint That Calls the Checkout Sessions API">
    Este paso es **obligatorio**, igual que para el checkout overlay. Crear una session requiere tu secret API key, por lo que debe hacerse en un servidor y GHL no puede hacerlo por sí solo. Reutiliza el endpoint del backend de la sección **Overlay Checkout** anterior: cualquier función serverless pequeña o servidor bajo tu control que llame a la [Create Checkout Session API](/api-reference/checkout-sessions/create) y devuelva `{ checkoutUrl }`.
  </Step>

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

    1. Haz clic en el icono **+** situado en la esquina superior izquierda del builder para abrir **Quick Add**.
    2. Selecciona **Elements** en la lista de categorías de la izquierda.
    3. Busca **Custom Code** (también aparece como HTML) y arrástralo hasta la página donde quieras que aparezca el formulario de checkout.
    4. Pega el código siguiente en el editor de código del elemento y guárdalo.

    ```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)">
    Para ofrecer Apple Pay en inline checkout, [verifica tu dominio](/features/payment-methods/digital-wallets#apple-pay). En el dashboard de Dodo Payments, ve a **Settings → Payment Methods** y haz clic en **Manage domains** en la fila de **Apple Pay**. Descarga el archivo de asociación de dominio, alójalo en tu dominio y registra el dominio. Apple Pay no está disponible en overlay checkout (Approach B).

    Un dominio alojado por GHL no puede alojar el archivo de asociación de dominio. Apple Pay en inline checkout necesita un dominio bajo tu control que pueda servir `/.well-known/apple-developer-merchantid-domain-association`. En páginas alojadas por GHL, usa el hosted checkout de Payment Links (Approach A) o no uses Apple Pay.
  </Step>
</Steps>

<Warning>
  Inline checkout es la opción más compleja en GHL. Requiere código personalizado, un backend, una página publicada en un dominio real y, para Apple Pay, la verificación del dominio. Si no necesitas un formulario completamente integrado, usa Approach A o B.
</Warning>

## Eventos que se deben gestionar

Suscribe el endpoint de GHL a los eventos en los que actúa tu workflow. La tabla sugiere una acción de GHL para cada uno:

| Evento de Dodo Payments | Cuándo se activa | Acción de GHL sugerida |
| - | - | - |
| `payment.succeeded` | Cuando un pago se realiza correctamente | Etiquetar el contacto como pagado, conceder acceso y enviar una confirmación |
| `subscription.active` | Cuando se activa una suscripción | Conceder la membresía e iniciar el workflow de onboarding |
| `subscription.renewed` | Cuando una suscripción se renueva para el siguiente periodo de facturación | Ampliar el acceso para el siguiente ciclo |
| `subscription.past_due` | Cuando una renovación falla y comienza el periodo de gracia. El cliente conserva el acceso hasta la fecha límite | Iniciar el workflow de dunning o recordatorio mientras el cliente aún tiene acceso |
| `subscription.on_hold` | Cuando la suscripción se pone en pausa después de una renovación fallida | Pausar el acceso y escalar la secuencia de recordatorios |
| `subscription.cancelled` / `subscription.expired` | Cuando finaliza la suscripción | Eliminar el acceso y etiquetar al cliente como churned |

Los eventos de pagos y suscripciones incluyen el **correo electrónico del cliente** en `data.customer.email`. Usa la acción de GHL **find/create contact by email** para asociar el pago con el contacto correcto. Para cada evento, consulta la [Webhook Event Guide](/developer-resources/webhooks/intents/webhook-events-guide).

## Pruebas y puesta en producción

<Steps>
  <Step title="Test in Test Mode">
    Mantén desactivado el interruptor de **Live Mode** en la barra lateral de Dodo Payments para trabajar en test mode. Completa una compra con la tarjeta de prueba `4242 4242 4242 4242` (fecha de vencimiento `06/32`, CVV `123`) y confirma que el workflow de GHL se ejecuta y aplica la etiqueta o el acceso.
  </Step>

  <Step title="Go Live">
    Activa el interruptor de **Live Mode** y añade la URL del GHL Inbound Webhook como endpoint en live mode. El resto de los cambios depende de tu enfoque:

    * **Payment Links (A):** Sustituye el enlace por el enlace de pago **live** del producto.
    * **Overlay checkout (B):** Dirige tu backend a `https://live.dodopayments.com/checkouts` con tu clave de API **live** y establece `mode` en `"live"` en la llamada `Initialize` del SDK.
    * **Inline checkout (C):** Realiza los mismos cambios que para overlay checkout, ya que utiliza el mismo endpoint del backend y la misma inicialización del SDK.

    Después, realiza una compra real de principio a fin para confirmar la configuración.
  </Step>
</Steps>

## Consejos

<Tip>
  Considera el **webhook como la fuente de verdad** para conceder acceso. Actúa sobre `payment.succeeded` o `subscription.active`, no sobre la redirección del navegador.
</Tip>

<Tip>
  Un GHL Inbound Webhook no puede verificar el encabezado `webhook-signature`. Para que solo los eventos genuinos de Dodo Payments activen el fulfillment en GHL, dirige el endpoint del webhook de Dodo Payments a tu propio backend, verifica allí cada evento ([Webhooks](/developer-resources/webhooks)) y, después, reenvíalo a la URL del GHL Inbound Webhook.
</Tip>

## Solución de problemas

<AccordionGroup>
  <Accordion title="Payment succeeded but nothing happened in GHL">
    Comprueba que el endpoint del webhook de Dodo Payments apunta a la URL correcta del GHL Inbound Webhook, que el workflow está **publicado** y que el trigger capturó un payload de muestra, de modo que exista el mapeo de campos.
  </Accordion>

  <Accordion title="Overlay or inline button does nothing">
    Normalmente, el JavaScript personalizado solo se ejecuta en la **página publicada en un dominio real**, no en Preview. Confirma que la página está publicada, que el SDK `<script>` se cargó y que `checkoutUrl` es una URL de sesión válida de tu backend.
  </Accordion>

  <Accordion title="Contact not created or not matched">
    Comprueba que tu workflow utiliza **find/create contact by email** y que el campo de correo electrónico está mapeado desde el payload del webhook.
  </Accordion>

  <Accordion title="Payment isn't showing in GHL's Payments tab">
    Esto es normal. Dodo Payments procesa los pagos, por lo que debes registrarlos en GHL mediante el workflow del webhook.
  </Accordion>
</AccordionGroup>


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