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

> Intégrez Dodo Payments à GoHighLevel (GHL) à l’aide de liens de paiement sans code, d’un checkout en overlay ou d’un checkout inline, et automatisez l’exécution avec des webhooks.

## Introduction

[GoHighLevel](https://www.gohighlevel.com/) (GHL) est une plateforme CRM et marketing tout-en-un qui couvre les funnels, les sites web, les e-mails/SMS et l’automatisation ("Workflows"). GHL ne répertorie pas Dodo Payments comme processeur intégré. Vous devez donc connecter les deux de l’une des trois façons suivantes, selon le degré d’intégration souhaité pour le checkout et vos capacités en matière de code.

Quelle que soit l’approche, l’exécution est gérée de la même manière. Dodo envoie des [événements webhook](/developer-resources/webhooks) vers un **Inbound Webhook Workflow** de GHL, qui ajoute un tag au contact, accorde l’accès et envoie les confirmations.

## Choisissez votre approche

| Approche                | Code requis                  | Expérience de checkout                                   | Idéal pour                                                                |
| ----------------------- | ---------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------- |
| **A. Payment Links**    | Aucun (sans code)            | Le client est redirigé vers le checkout hébergé par Dodo | La plupart des utilisateurs de GHL, lancement rapide                      |
| **B. Overlay Checkout** | Code personnalisé et backend | Une fenêtre modale s’ouvre au-dessus de votre page GHL   | Les équipes qui souhaitent un checkout sur la page sans quitter le funnel |
| **C. Inline Checkout**  | Code personnalisé et backend | Le formulaire de checkout est intégré à la page          | Une UX entièrement intégrée et personnalisée                              |

<Info>
  Vous débutez ? Commencez par **l’approche A (Payment Links)**. Elle ne nécessite aucun code, fonctionne pour tous les utilisateurs de GHL et peut être mise en place en quelques minutes. Les approches B et C nécessitent un backend pour créer des [checkout sessions](/api-reference/checkout-sessions/create) et s’adressent aux équipes à l’aise avec le code.
</Info>

## Prérequis

* Un compte Dodo Payments avec au moins un **produit** créé.
* Un compte GoHighLevel avec un funnel, un site web ou un workflow.
* L’accès à **Settings → Webhooks** (et à **Settings → Developer** pour une clé API) dans votre tableau de bord Dodo.
* Pour les approches B et C : un petit **backend ou endpoint serverless** pour créer des checkout sessions.

<Note>
  GHL exige un **domaine connecté** pour *publier* un funnel. Pendant la création, utilisez la **Preview** du funnel pour effectuer vos tests. Notez que le JavaScript personnalisé (approches B et C) s’exécute généralement uniquement sur la **page publiée sur un domaine réel**, et non dans la Preview.
</Note>

## Exécution avec des webhooks (toutes les approches)

Il s’agit de la couche d’automatisation. Configurez-la une seule fois : elle fonctionnera quelle que soit l’approche de checkout choisie.

<Steps>
  <Step title="Create the workflow">
    Dans votre **sous-compte** GHL, ouvrez **Automation** dans le menu de gauche (l’onglet **Workflows** s’affiche alors). Cliquez sur **Create workflow**, puis choisissez **Start from Scratch**.
  </Step>

  <Step title="Add the Inbound Webhook trigger">
    Dans le builder, cliquez sur **Add new trigger**. Dans le panneau **Add trigger**, recherchez **webhook**, puis sélectionnez **Inbound webhook** (répertorié sous **Triggers → Events**). Copiez l’**URL du webhook** générée.
  </Step>

  <Step title="Register the webhook in Dodo">
    Dans le tableau de bord Dodo, accédez à **Settings → Webhooks**, ajoutez un nouvel endpoint et collez l’URL de l’Inbound Webhook de GHL. Effectuez un achat de test afin que GHL capture un exemple de payload et vous permette de mapper les champs (e-mail du client, produit, montant, statut).
  </Step>

  <Step title="Add fulfillment actions">
    De retour dans le workflow GHL, ajoutez des actions basées sur l’événement, comme **find/create contact by email**, **add a tag**, **grant course/membership access** et **send a confirmation email**. Puis **Publish** le workflow.
  </Step>
</Steps>

<Warning>
  Les paiements sont traités sur Dodo et n’apparaîtront donc **pas** dans l’onglet Payments de GHL. Réconciliez-les dans GHL à l’aide du workflow webhook ci-dessus et considérez le **webhook comme la source de vérité** pour accorder l’accès, et non la redirection du navigateur, car un client peut fermer l’onglet avant de revenir.
</Warning>

## Approche A : Payment Links (sans code)

Associez un lien de paiement Dodo à n’importe quel bouton GHL, CTA de funnel, bouton de page de commande, e-mail ou SMS.

<Steps>
  <Step title="Create a product and copy its payment link">
    Dans le tableau de bord Dodo, accédez à **Products → Add Product**, définissez le **nom** et le **prix**, choisissez **one-time** ou **subscription**, puis cliquez sur **Save**. Ouvrez le produit et copiez son **Payment Link** (format : `https://checkout.dodopayments.com/buy/{product_id}`).
  </Step>

  <Step title="Add the link to your GHL button">
    Modifiez votre funnel ou votre page web, sélectionnez le **bouton Buy / Checkout**, définissez son action sur **Open URL / Website**, puis collez votre lien de paiement Dodo.
  </Step>

  <Step title="Set a success page (optional)">
    Définissez l’**URL de retour** du produit dans Dodo sur une page de remerciement GHL afin que les clients retournent dans votre funnel après leur paiement.
  </Step>
</Steps>

<Tip>
  Vous pouvez préremplir et verrouiller les informations du client, ou ajouter un suivi, à l’aide des [paramètres de requête des payment links](/features/checkout). Cela est utile pour transmettre un ID de funnel ou d’offre en tant que métadonnées que vous pourrez relire depuis le webhook.
</Tip>

## Approche B : Overlay Checkout (code personnalisé)

Ouvre le checkout Dodo sous la forme d’une **fenêtre modale en overlay** sur votre page GHL, à l’aide du [Checkout SDK](/developer-resources/overlay-checkout) via CDN. Nécessite un backend pour créer une [checkout session](/api-reference/checkout-sessions/create) et renvoyer `checkoutUrl`.

<Steps>
  <Step title="Create a backend endpoint that calls the Checkout Sessions API">
    Cette étape est **obligatoire**. Le SDK a besoin d’un `checkoutUrl` actif, et sa création nécessite votre **clé API secrète**. GHL héberge uniquement des pages statiques : il ne peut pas exécuter cet appel côté serveur pour vous. Vous ne devez jamais appeler directement la [Create Checkout Session API](/api-reference/checkout-sessions/create) depuis le navigateur, car votre clé secrète serait alors exposée dans le code source de la page. Le checkout overlay et le checkout inline **ne peuvent donc pas fonctionner avec GHL seul** : vous avez besoin d’un backend que vous contrôlez, qui crée la session et renvoie uniquement l’URL.

    N’importe quel petit backend convient : une fonction serverless (Cloudflare Workers, Vercel Functions, AWS Lambda, Supabase Edge Functions, ou solution similaire) ou un endpoint sur un serveur que vous administrez déjà. La logique est la même partout : recevoir la requête, appeler l’API Dodo avec votre clé secrète et renvoyer `checkout_url`.

    Exemple de logique de handler (à adapter à la plateforme de votre choix) :

    ```js theme={null}
    async function createCheckout(env) {
      const res = await fetch("https://test.dodopayments.com/checkouts", {
        method: "POST",
        headers: {
          "Authorization": `Bearer ${env.DODO_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 };
    }
    ```

    Stockez votre clé API Dodo comme secret sur la plateforme où vous déployez (ne la commitez jamais dans le code), autorisez les requêtes provenant de votre domaine GHL (CORS) et exposez l’endpoint sous un domaine que vous contrôlez, par exemple `https://api.example.com/create-checkout`. Passez à `https://live.dodopayments.com/checkouts` lorsque vous passez en mode live.
  </Step>

  <Step title="Add a Custom Code element in the GHL page builder">
    Ouvrez l’étape de votre funnel ou votre page web dans le page builder GHL, puis :

    1. Cliquez sur l’icône **+** en haut à gauche du builder pour ouvrir **Quick Add**.
    2. Sélectionnez **Elements** dans la liste des catégories à gauche.
    3. Repérez **Custom Code** (également affiché comme HTML) et faites-le glisser sur la page.
    4. Collez le code ci-dessous dans l’éditeur de code de l’élément, puis enregistrez.

    ```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">
    Le JS personnalisé s’exécute sur la page **publiée** (domaine connecté), mais pas toujours dans la Preview. Publiez, puis cliquez sur **Pay Now** pour vérifier que l’overlay s’ouvre.
  </Step>
</Steps>

## Approche C : Inline Checkout (intégré)

Intègre le formulaire de checkout **dans** votre page GHL (sans redirection ni popup) à l’aide du même SDK et d’un conteneur de montage. Comme l’approche B, elle nécessite un backend pour créer la session.

<Steps>
  <Step title="Create a backend endpoint that calls the Checkout Sessions API">
    La même exigence que pour l’overlay s’applique, et elle est tout aussi **obligatoire** : la création d’une session nécessite votre clé API secrète et doit donc avoir lieu côté serveur. GHL ne peut pas le faire seul. Réutilisez le même endpoint backend décrit dans la section **Overlay Checkout** ci-dessus (une petite fonction serverless ou un serveur que vous contrôlez) qui appelle la [Create Checkout Session API](/api-reference/checkout-sessions/create) et renvoie `{ checkoutUrl }`.
  </Step>

  <Step title="Add a container and SDK via Custom Code">
    Dans le page builder GHL :

    1. Cliquez sur l’icône **+** en haut à gauche du builder pour ouvrir **Quick Add**.
    2. Sélectionnez **Elements** dans la liste des catégories à gauche.
    3. Repérez **Custom Code** (également affiché comme HTML) et faites-le glisser sur la page à l’endroit où vous souhaitez afficher le formulaire de checkout.
    4. Collez le code ci-dessous dans l’éditeur de code de l’élément, puis enregistrez.

    ```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)">
    Pour utiliser Apple Pay avec le checkout inline, [vérifiez votre domaine](/features/payment-methods/digital-wallets#apple-pay). Hébergez le fichier d’association et enregistrez le domaine dans le tableau de bord.
  </Step>
</Steps>

<Warning>
  L’option inline est la plus complexe dans GHL. Elle nécessite du code personnalisé, un backend, une page publiée sur un domaine réel et, pour Apple Pay, une vérification du domaine. Si vous n’avez pas besoin d’un formulaire entièrement intégré, préférez l’approche A ou B.
</Warning>

## Événements à gérer

| Événement Dodo                                    | Déclenchement                              | Action GHL suggérée                                                                        |
| ------------------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ |
| `payment.succeeded`                               | Un paiement est capturé                    | Ajouter un tag indiquant que le contact a payé, accorder l’accès, envoyer une confirmation |
| `subscription.active`                             | Une subscription est activée               | Accorder l’accès à l’adhésion, démarrer le workflow d’onboarding                           |
| `subscription.renewed`                            | Un paiement de renouvellement est effectué | Prolonger l’accès pour le cycle suivant                                                    |
| `subscription.on_hold`                            | Un renouvellement échoue                   | Déclencher un workflow de relance ou de rappel                                             |
| `subscription.cancelled` / `subscription.expired` | La subscription prend fin                  | Supprimer l’accès, ajouter un tag indiquant le churn                                       |

Chaque webhook inclut l’**e-mail du client**. Utilisez l’action **find/create contact by email** de GHL pour associer le paiement au bon contact. Pour obtenir la liste complète, consultez le [Guide des événements webhook](/developer-resources/webhooks/intents/webhook-events-guide).

## Tests et mise en production

<Steps>
  <Step title="Test in test mode">
    Laissez Dodo en **Test Mode**, utilisez la carte de test `4242 4242 4242 4242` (n’importe quelle date d’expiration future et n’importe quel CVC), effectuez un achat et vérifiez que le workflow GHL se déclenche et applique le tag ou l’accès.
  </Step>

  <Step title="Go live">
    Passez Dodo en **Live Mode** et mettez à jour l’endpoint webhook du mode live. Les autres changements dépendent de votre approche :

    * **Payment Links (A) :** remplacez le lien par le **lien de paiement live** du produit.
    * **Overlay checkout (B) :** configurez votre backend pour utiliser `https://live.dodopayments.com/checkouts` avec votre **clé API live**, et définissez le `mode` du SDK sur `"live"` dans l’appel `Initialize`.
    * **Inline checkout (C) :** même procédure que pour l’overlay, puisqu’il utilise le même endpoint backend et la même initialisation du SDK.

    Effectuez ensuite un achat réel de bout en bout pour confirmer le fonctionnement.
  </Step>
</Steps>

## Conseils

<Tip>
  Considérez le **webhook comme la source de vérité** pour accorder l’accès. Agissez sur `payment.succeeded` / `subscription.active`, et non sur la redirection du navigateur.
</Tip>

<Tip>
  Vérifiez l’authenticité des webhooks à l’aide de l’en-tête `webhook-signature` ([Standard Webhooks](/developer-resources/webhooks)), afin que seuls les événements Dodo authentiques déclenchent l’exécution dans GHL.
</Tip>

## Résolution des problèmes

<AccordionGroup>
  <Accordion title="Payment succeeded but nothing happened in GHL">
    Vérifiez que l’endpoint webhook Dodo pointe vers la bonne URL d’Inbound Webhook GHL, que le workflow est **publié** et que le déclencheur a capturé un exemple de payload afin que le mappage des champs soit disponible.
  </Accordion>

  <Accordion title="Overlay or inline button does nothing">
    Le JS personnalisé s’exécute généralement uniquement sur la **page publiée (domaine réel)**, et non dans la Preview. Vérifiez que la page est publiée, que le SDK `<script>` est chargé et que `checkoutUrl` est une URL de session valide renvoyée par votre backend.
  </Accordion>

  <Accordion title="Contact not created or not matched">
    Assurez-vous que votre workflow utilise **find/create contact by email** et que le champ d’e-mail est mappé à partir du payload webhook.
  </Accordion>

  <Accordion title="Payment isn't showing in GHL's Payments tab">
    C’est normal. Les paiements sont traités sur Dodo ; réconciliez-les dans GHL à l’aide du workflow webhook.
  </Accordion>
</AccordionGroup>
