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

# Bộ chuyển đổi Nuxt

> Tích hợp Dodo Payments với dự án Nuxt của bạn bằng module Nuxt chính thức. Bao gồm checkout, customer portal, webhooks và thiết lập môi trường an toàn.

<CardGroup cols={2}>
  <Card title="Checkout API Route" icon="cart-shopping" href="#checkout-api-route">
    Tích hợp checkout của Dodo Payments vào ứng dụng Nuxt bằng server route.
  </Card>

  <Card title="Customer Portal API Route" icon="user" href="#customer-portal-api-route">
    Cho phép khách hàng quản lý các gói đăng ký và thông tin chi tiết thông qua server route của Nuxt.
  </Card>

  <Card title="Webhooks API Route" icon="bell" href="#webhook-api-route">
    Nhận và xử lý an toàn các sự kiện webhook của Dodo Payments trong Nuxt.
  </Card>
</CardGroup>

## Tổng quan

<Info>
  Hướng dẫn này giải thích cách tích hợp Dodo Payments vào ứng dụng Nuxt bằng module Nuxt chính thức. Bạn sẽ tìm hiểu cách thiết lập các API route cho checkout, customer portal và webhook, cũng như cách quản lý an toàn các biến môi trường.
</Info>

## Cài đặt

<Steps>
  <Step title="Install the Nuxt module">
    Chạy lệnh sau trong thư mục gốc của dự án:

    ```bash theme={null}
    npm install @dodopayments/nuxt
    ```
  </Step>

  <Step title="Register the module in nuxt.config.ts">
    Thêm <code>@dodopayments/nuxt</code> vào mảng <code>modules</code> và cấu hình module:

    ```typescript nuxt.config.ts expandable theme={null}
    export default defineNuxtConfig({
      modules: ["@dodopayments/nuxt"],
      devtools: { enabled: true },
      compatibilityDate: "2025-02-25",
      runtimeConfig: {
        private: {
          bearerToken: process.env.NUXT_PRIVATE_BEARER_TOKEN,
          webhookKey: process.env.NUXT_PRIVATE_WEBHOOK_KEY,
          environment: process.env.NUXT_PRIVATE_ENVIRONMENT,
          returnUrl: process.env.NUXT_PRIVATE_RETURNURL
        },
      }
    });
    ```
  </Step>
</Steps>

<Warning>
  Không bao giờ commit tệp <code>.env</code> hoặc các secret vào hệ thống quản lý phiên bản.
</Warning>

## Ví dụ về API Route Handler

<Info>
  Tất cả tích hợp Dodo Payments trong Nuxt đều được xử lý thông qua các server route trong thư mục <code>server/routes/api/</code>.
</Info>

<Tabs>
  <Tab title="Checkout API Route">
    <Info>
      Sử dụng handler này để tích hợp checkout của Dodo Payments vào ứng dụng Nuxt. Hỗ trợ các luồng thanh toán static (GET), dynamic (POST) và session (POST).
    </Info>

    <CodeGroup>
      ```typescript server/routes/api/checkout.get.ts expandable theme={null}

      export default defineEventHandler((event) => {
        const {
          private: { bearerToken, environment, returnUrl },
        } = useRuntimeConfig();

        const handler = checkoutHandler({
          bearerToken: bearerToken,
          environment: environment,
          returnUrl: returnUrl,
        });

        return handler(event);
      });
      ```
    </CodeGroup>

    <CodeGroup>
      ```typescript server/routes/api/checkout.post.ts expandable theme={null}

      export default defineEventHandler((event) => {
        const {
          private: { bearerToken, environment, returnUrl },
        } = useRuntimeConfig();

        const handler = checkoutHandler({
          bearerToken: bearerToken,
          environment: environment,
          returnUrl: returnUrl,
          type: "dynamic"
        });

        return handler(event);
      });
      ```
    </CodeGroup>

    <CodeGroup>
      ```typescript server/routes/api/checkout.post.ts (Checkout Sessions) expandable theme={null}

      export default defineEventHandler((event) => {
        const {
          private: { bearerToken, environment, returnUrl },
        } = useRuntimeConfig();

        const handler = checkoutHandler({
          bearerToken: bearerToken,
          environment: environment,
          returnUrl: returnUrl,
          type: "session"
        });

        return handler(event);
      });
      ```
    </CodeGroup>

    <Warning>
      Nếu thiếu hoặc không hợp lệ <code>productId</code>, handler sẽ trả về phản hồi 400.
    </Warning>

    <CodeGroup>
      ```curl Static Checkout Curl example expandable theme={null}
      curl --request GET \
      --url 'https://example.com/api/checkout?productId=pdt_fqJhl7pxKWiLhwQR042rh' \
      --header 'User-Agent: insomnia/11.2.0' \
      --cookie mode=test
      ```
    </CodeGroup>

    <CodeGroup>
      ```curl Dynamic Checkout Curl example expandable theme={null}
      curl --request POST \
      --url https://example.com/api/checkout \
      --header 'Content-Type: application/json' \
      --header 'User-Agent: insomnia/11.2.0' \
      --cookie mode=test \
      --data '{
      "billing": {
        "city": "Texas",
        "country": "US",
        "state": "Texas",
        "street": "56, hhh",
        "zipcode": "560000"
      },
      "customer": {
        "email": "test@example.com",
        	"name": "test"
      },
      "metadata": {},
      "payment_link": true,
        "product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
        "quantity": 1,
        "billing_currency": "USD",
        "discount_codes": ["IKHZ23M9GQ"],
        "return_url": "https://example.com",
        "trial_period_days": 10
      }'
      ```
    </CodeGroup>

    <CodeGroup>
      ```curl Checkout Session Curl example expandable theme={null}
      curl --request POST \
      --url https://example.com/api/checkout \
      --header 'Content-Type: application/json' \
      --header 'User-Agent: insomnia/11.2.0' \
      --cookie mode=test \
      --data '{
      "product_cart": [
        {
          "product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
          "quantity": 1
        }
      ],
      "customer": {
        "email": "test@example.com",
        "name": "test"
      },
      "return_url": "https://example.com/success"
      }'
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Customer Portal API Route">
    <Info>
      Tạo GET route để khách hàng truy cập portal của họ. Chấp nhận <code>customer\_id</code> làm query parameter.
    </Info>

    <CodeGroup>
      ```typescript server/routes/api/customer-portal.get.ts expandable theme={null}

      export default defineEventHandler((event) => {
        const {
          private: { bearerToken, environment },
        } = useRuntimeConfig();

        const handler = customerPortalHandler({
          bearerToken,
          environment: environment,
        });

        return handler(event);
      });
      ```
    </CodeGroup>

    **Query Parameters:**

    * <code>customer\_id</code> (bắt buộc): ID khách hàng cho portal session (ví dụ: <code>?customer\_id=cus\_123</code>)
    * <code>send\_email</code> (không bắt buộc, boolean): Nếu là <code>true</code>, gửi email chứa liên kết portal cho khách hàng.

    <Warning>
      Trả về 400 nếu thiếu <code>customer\_id</code>.
    </Warning>

    <CodeGroup>
      ```curl Customer Portal Curl example expandable theme={null}
      curl --request GET \
      --url 'https://example.com/api/customer-portal?customer_id=cus_9VuW4K7O3GHwasENg31m&send_email=true' \
      --header 'User-Agent: insomnia/11.2.0' \
      --cookie mode=test
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Webhook API Route">
    <Info>
      Tạo POST route để nhận và xử lý an toàn các sự kiện webhook từ Dodo Payments.
    </Info>

    <CodeGroup>
      ```typescript server/routes/api/webhook.post.ts expandable theme={null}

      export default defineEventHandler((event) => {
        const {
          private: { webhookKey },
        } = useRuntimeConfig();

        const handler = Webhooks({
          webhookKey: webhookKey,
          onPayload: async (payload: any) => {
            // Handle webhook payload here
          },
          // ...add other event handlers as needed
        });

        return handler(event);
      });
      ```
    </CodeGroup>
  </Tab>
</Tabs>

## Checkout Route Handler

<Info>
  Dodo Payments hỗ trợ ba loại luồng thanh toán để tích hợp thanh toán vào website của bạn; bộ chuyển đổi này hỗ trợ tất cả các loại luồng thanh toán.
</Info>

* **Payment Links Static:** URL có thể chia sẻ ngay để thu tiền nhanh mà không cần code.
* **Payment Links Dynamic:** Tạo payment link theo cách lập trình với thông tin tùy chỉnh bằng API hoặc SDK.
* **Checkout Sessions:** Tạo trải nghiệm checkout an toàn, có thể tùy chỉnh, với giỏ sản phẩm và thông tin khách hàng được cấu hình sẵn.

<AccordionGroup>
  <Accordion title="Static Checkout (GET)">
    ### Query Parameters được hỗ trợ

    <ParamField query="productId" type="string" required>
      Mã định danh sản phẩm (ví dụ: <code>?productId=pdt\_nZuwz45WAs64n3l07zpQR</code>).
    </ParamField>

    <ParamField query="quantity" type="integer">
      Số lượng sản phẩm.
    </ParamField>

    <ParamField query="fullName" type="string">
      Họ tên đầy đủ của khách hàng.
    </ParamField>

    <ParamField query="firstName" type="string">
      Tên của khách hàng.
    </ParamField>

    <ParamField query="lastName" type="string">
      Họ của khách hàng.
    </ParamField>

    <ParamField query="email" type="string">
      Địa chỉ email của khách hàng.
    </ParamField>

    <ParamField query="country" type="string">
      Quốc gia của khách hàng.
    </ParamField>

    <ParamField query="addressLine" type="string">
      Dòng địa chỉ của khách hàng.
    </ParamField>

    <ParamField query="city" type="string">
      Thành phố của khách hàng.
    </ParamField>

    <ParamField query="state" type="string">
      Bang/tỉnh của khách hàng.
    </ParamField>

    <ParamField query="zipCode" type="string">
      Mã ZIP/mã bưu chính của khách hàng.
    </ParamField>

    <ParamField query="disableFullName" type="boolean">
      Tắt trường họ tên đầy đủ.
    </ParamField>

    <ParamField query="disableFirstName" type="boolean">
      Tắt trường tên.
    </ParamField>

    <ParamField query="disableLastName" type="boolean">
      Tắt trường họ.
    </ParamField>

    <ParamField query="disableEmail" type="boolean">
      Tắt trường email.
    </ParamField>

    <ParamField query="disableCountry" type="boolean">
      Tắt trường quốc gia.
    </ParamField>

    <ParamField query="disableAddressLine" type="boolean">
      Tắt dòng địa chỉ.
    </ParamField>

    <ParamField query="disableCity" type="boolean">
      Tắt trường thành phố.
    </ParamField>

    <ParamField query="disableState" type="boolean">
      Tắt trường bang.
    </ParamField>

    <ParamField query="disableZipCode" type="boolean">
      Tắt trường mã ZIP.
    </ParamField>

    <ParamField query="paymentCurrency" type="string">
      Chỉ định loại tiền thanh toán (ví dụ: <code>USD</code>).
    </ParamField>

    <ParamField query="showCurrencySelector" type="boolean">
      Hiển thị bộ chọn tiền tệ.
    </ParamField>

    <ParamField query="paymentAmount" type="integer">
      Chỉ định số tiền thanh toán (ví dụ: <code>1000</code> cho \$10.00).
    </ParamField>

    <ParamField query="showDiscounts" type="boolean">
      Hiển thị các trường giảm giá.
    </ParamField>

    <ParamField query="metadata_*" type="string">
      Mọi query parameter bắt đầu bằng <code>metadata\_</code> sẽ được truyền dưới dạng metadata.
    </ParamField>

    <Warning>
      Nếu thiếu <code>productId</code>, handler sẽ trả về phản hồi 400. Query parameter không hợp lệ cũng dẫn đến phản hồi 400.
    </Warning>

    ### Định dạng phản hồi

    Checkout static trả về phản hồi JSON chứa URL checkout:

    ```json theme={null}
    {
      "checkout_url": "https://checkout.dodopayments.com/..."
    }
    ```
  </Accordion>

  <Accordion title="Dynamic Checkout (POST)">
    * Gửi các parameter trong JSON body của yêu cầu POST.
    * Hỗ trợ cả thanh toán một lần và thanh toán định kỳ.
    * Để xem danh sách đầy đủ các field được hỗ trợ trong POST body, tham khảo:
      * [Request body cho sản phẩm thanh toán một lần](https://docs.dodopayments.com/api-reference/payments/post-payments)
      * [Request body cho sản phẩm đăng ký](https://docs.dodopayments.com/api-reference/subscriptions/post-subscriptions)

    ### Định dạng phản hồi

    Checkout dynamic trả về phản hồi JSON chứa URL checkout:

    ```json theme={null}
    {
      "checkout_url": "https://checkout.dodopayments.com/..."
    }
    ```
  </Accordion>

  <Accordion title="Checkout Sessions (POST)">
    Checkout session cung cấp trải nghiệm checkout được lưu trữ an toàn hơn, xử lý toàn bộ luồng thanh toán cho cả giao dịch mua một lần và gói đăng ký, đồng thời cho phép tùy chỉnh đầy đủ.

    Tham khảo [Hướng dẫn tích hợp Checkout Sessions](https://docs.dodopayments.com/developer-resources/checkout-session) để biết thêm chi tiết và xem danh sách đầy đủ các field được hỗ trợ.

    ### Định dạng phản hồi

    Checkout session trả về phản hồi JSON chứa URL checkout:

    ```json theme={null}
    {
      "checkout_url": "https://checkout.dodopayments.com/session/..."
    }
    ```
  </Accordion>
</AccordionGroup>

## Customer Portal Route Handler

Customer Portal Route Handler cho phép bạn tích hợp liền mạch customer portal của Dodo Payments vào ứng dụng Nuxt.

### Query Parameters

<ParamField query="customer_id" type="string" required>
  ID khách hàng cho portal session (ví dụ: <code>?customer\_id=cus\_123</code>).
</ParamField>

<ParamField query="send_email" type="boolean">
  Nếu được đặt thành <code>true</code>, gửi email chứa liên kết portal cho khách hàng.
</ParamField>

<Warning>
  Trả về 400 nếu thiếu <code>customer\_id</code>.
</Warning>

## Webhook Route Handler

* **Method:** Chỉ hỗ trợ yêu cầu POST. Các method khác trả về 405.
* **Xác minh chữ ký:** Xác minh chữ ký webhook bằng <code>webhookKey</code>. Trả về 401 nếu xác minh thất bại.
* **Xác thực payload:** Được xác thực bằng Zod. Trả về 400 nếu payload không hợp lệ.
* **Xử lý lỗi:**
  * 401: Chữ ký không hợp lệ
  * 400: Payload không hợp lệ
  * 500: Lỗi nội bộ trong quá trình xác minh
* **Định tuyến sự kiện:** Gọi event handler phù hợp dựa trên loại payload.

### Event Handler Webhook được hỗ trợ

<CodeGroup>
  ```typescript Typescript expandable theme={null}
  onPayload?: (payload: WebhookPayload) => Promise<void>;
  onPaymentSucceeded?: (payload: WebhookPayload) => Promise<void>;
  onPaymentFailed?: (payload: WebhookPayload) => Promise<void>;
  onPaymentProcessing?: (payload: WebhookPayload) => Promise<void>;
  onPaymentCancelled?: (payload: WebhookPayload) => Promise<void>;
  onRefundSucceeded?: (payload: WebhookPayload) => Promise<void>;
  onRefundFailed?: (payload: WebhookPayload) => Promise<void>;
  onDisputeOpened?: (payload: WebhookPayload) => Promise<void>;
  onDisputeExpired?: (payload: WebhookPayload) => Promise<void>;
  onDisputeAccepted?: (payload: WebhookPayload) => Promise<void>;
  onDisputeCancelled?: (payload: WebhookPayload) => Promise<void>;
  onDisputeChallenged?: (payload: WebhookPayload) => Promise<void>;
  onDisputeWon?: (payload: WebhookPayload) => Promise<void>;
  onDisputeLost?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionActive?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionOnHold?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionRenewed?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionPlanChanged?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionCancelled?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionFailed?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionExpired?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionUpdated?: (payload: WebhookPayload) => Promise<void>;
  onLicenseKeyCreated?: (payload: WebhookPayload) => Promise<void>;
  onAbandonedCheckoutDetected?: (payload: WebhookPayload) => Promise<void>;
  onAbandonedCheckoutRecovered?: (payload: WebhookPayload) => Promise<void>;
  onDunningStarted?: (payload: WebhookPayload) => Promise<void>;
  onDunningRecovered?: (payload: WebhookPayload) => Promise<void>;
  onCreditAdded?: (payload: WebhookPayload) => Promise<void>;
  onCreditDeducted?: (payload: WebhookPayload) => Promise<void>;
  onCreditExpired?: (payload: WebhookPayload) => Promise<void>;
  onCreditRolledOver?: (payload: WebhookPayload) => Promise<void>;
  onCreditRolloverForfeited?: (payload: WebhookPayload) => Promise<void>;
  onCreditOverageCharged?: (payload: WebhookPayload) => Promise<void>;
  onCreditManualAdjustment?: (payload: WebhookPayload) => Promise<void>;
  onCreditBalanceLow?: (payload: WebhookPayload) => Promise<void>;
  ```
</CodeGroup>

***

## Prompt cho LLM

```
You are an expert Nuxt developer assistant. Your task is to guide a user through integrating the @dodopayments/nuxt module into their existing Nuxt project.

The @dodopayments/nuxt module provides API route handlers for Dodo Payments' Checkout, Customer Portal, and Webhook functionalities, designed for Nuxt 3 server routes.

First, install the necessary package:

npm install @dodopayments/nuxt

Second, add the configuration to nuxt.config.ts

export default defineNuxtConfig({
  modules: ["@dodopayments/nuxt"],
  devtools: { enabled: true },
  compatibilityDate: "2025-02-25",
  runtimeConfig: {
    private: {
      bearerToken: process.env.NUXT_PRIVATE_BEARER_TOKEN,
      webhookKey: process.env.NUXT_PRIVATE_BEARER_TOKEN,
      environment: process.env.NUXT_PRIVATE_ENVIRONMENT,
      returnUrl: process.env.NUXT_PRIVATE_RETURNURL
    },
  }
});

Here's how you should structure your response:

    Ask the user which functionalities they want to integrate.

"Which parts of the @dodopayments/nuxt module would you like to integrate into your project? You can choose one or more of the following:

    Checkout API Route (for handling product checkouts)
    Customer Portal API Route (for managing customer subscriptions/details)
    Webhook API Route (for receiving Dodo Payments webhook events)
    All (integrate all three)"

    Based on the user's selection, provide detailed integration steps for each chosen functionality.

If Checkout API Route is selected:

Purpose: This route redirects users to the Dodo Payments checkout page.
File Creation: Create a new file at server/routes/api/checkout.get.ts in your Nuxt project.

Code Snippet:

// server/routes/api/checkout.get.ts

export default defineEventHandler((event) => {
  const {
    private: { bearerToken, environment, returnUrl },
  } = useRuntimeConfig();

  const handler = checkoutHandler({
    bearerToken: bearerToken,
    environment: environment,
    returnUrl: returnUrl,
  });

  return handler(event);
});

Configuration & Usage:
- bearerToken: Your Dodo Payments API key. Set via the NUXT_PRIVATE_BEARER_TOKEN environment variable.
- returnUrl: (Optional) The URL to redirect the user to after a successful checkout.
- environment: (Optional) Set to your environment (e.g., "test_mode" or "live_mode").

Static Checkout (GET) Query Parameters:
- productId (required): Product identifier (e.g., ?productId=pdt_nZuwz45WAs64n3l07zpQR)
- quantity (optional): Quantity of the product
- Customer Fields (optional): fullName, firstName, lastName, email, country, addressLine, city, state, zipCode
- Disable Flags (optional, set to true to disable): disableFullName, disableFirstName, disableLastName, disableEmail, disableCountry, disableAddressLine, disableCity, disableState, disableZipCode
- Advanced Controls (optional): paymentCurrency, showCurrencySelector, paymentAmount, showDiscounts
- Metadata (optional): Any query parameter starting with metadata_ (e.g., ?metadata_userId=abc123)

Dynamic Checkout (POST): Parameters are sent as a JSON body. Supports both one-time and recurring payments. For a complete list of supported POST body fields, refer to:
- Docs - One Time Payment Product: https://docs.dodopayments.com/api-reference/payments/post-payments
- Docs - Subscription Product: https://docs.dodopayments.com/api-reference/subscriptions/post-subscriptions

Checkout Sessions (POST) - (Recommended) A more customizable checkout experience. Returns JSON with checkout_url: Parameters are sent as a JSON body. Supports both one-time and recurring payments. Returns: {"checkout_url": "https://checkout.dodopayments.com/session/..."}. For a complete list of supported fields, refer to:

  Checkout Sessions Integration Guide: https://docs.dodopayments.com/developer-resources/checkout-session

Error Handling: If productId is missing or other query parameters are invalid, the handler will return a 400 response.

If Customer Portal API Route is selected:

Purpose: This route allows customers to access their Dodo Payments customer portal.
File Creation: Create a new file at server/routes/api/customer-portal.get.ts in your Nuxt project.

Code Snippet:

// server/routes/api/customer-portal.get.ts

export default defineEventHandler((event) => {
  const {
    private: { bearerToken, environment },
  } = useRuntimeConfig();

  const handler = customerPortalHandler({
    bearerToken,
    environment: environment,
  });

  return handler(event);
});

Query Parameters:
- customer_id (required): The customer ID for the portal session (e.g., ?customer_id=cus_123)
- send_email (optional, boolean): If set to true, sends an email to the customer with the portal link.
- Returns 400 if customer_id is missing.

If Webhook API Route is selected:

Purpose: This route processes incoming webhook events from Dodo Payments, allowing your application to react to events like successful payments, refunds, or subscription changes.
File Creation: Create a new file at server/routes/api/webhook.post.ts in your Nuxt project.

Code Snippet:

// server/routes/api/webhook.post.ts

export default defineEventHandler((event) => {
  const {
    private: { webhookKey },
  } = useRuntimeConfig();

  const handler = Webhooks({
    webhookKey: webhookKey,
    onPayload: async (payload) => {
      // handle the payload
    },
    // ... other event handlers for granular control
  });

  return handler(event);
});

Handler Details:
- Method: Only POST requests are supported. Other methods return 405.
- Signature Verification: The handler verifies the webhook signature using webhookKey and returns 401 if verification fails.
- Payload Validation: The payload is validated with Zod. Returns 400 for invalid payloads.

Error Handling:
- 401: Invalid signature
- 400: Invalid payload
- 500: Internal error during verification

Event Routing: Calls the appropriate event handler based on the payload type. Supported event handlers include:
- onPayload?: (payload: WebhookPayload) => Promise<void>
- onPaymentSucceeded?: (payload: WebhookPayload) => Promise<void>
- onPaymentFailed?: (payload: WebhookPayload) => Promise<void>
- onPaymentProcessing?: (payload: WebhookPayload) => Promise<void>
- onPaymentCancelled?: (payload: WebhookPayload) => Promise<void>
- onRefundSucceeded?: (payload: WebhookPayload) => Promise<void>
- onRefundFailed?: (payload: WebhookPayload) => Promise<void>
- onDisputeOpened?: (payload: WebhookPayload) => Promise<void>
- onDisputeExpired?: (payload: WebhookPayload) => Promise<void>
- onDisputeAccepted?: (payload: WebhookPayload) => Promise<void>
- onDisputeCancelled?: (payload: WebhookPayload) => Promise<void>
- onDisputeChallenged?: (payload: WebhookPayload) => Promise<void>
- onDisputeWon?: (payload: WebhookPayload) => Promise<void>
- onDisputeLost?: (payload: WebhookPayload) => Promise<void>
- onSubscriptionActive?: (payload: WebhookPayload) => Promise<void>
- onSubscriptionOnHold?: (payload: WebhookPayload) => Promise<void>
- onSubscriptionRenewed?: (payload: WebhookPayload) => Promise<void>
- onSubscriptionPlanChanged?: (payload: WebhookPayload) => Promise<void>
- onSubscriptionCancelled?: (payload: WebhookPayload) => Promise<void>
- onSubscriptionFailed?: (payload: WebhookPayload) => Promise<void>
- onSubscriptionExpired?: (payload: WebhookPayload) => Promise<void>
- onSubscriptionUpdated?: (payload: WebhookPayload) => Promise<void>
- onLicenseKeyCreated?: (payload: WebhookPayload) => Promise<void>
- onAbandonedCheckoutDetected?: (payload: WebhookPayload) => Promise<void>
- onAbandonedCheckoutRecovered?: (payload: WebhookPayload) => Promise<void>
- onDunningStarted?: (payload: WebhookPayload) => Promise<void>
- onDunningRecovered?: (payload: WebhookPayload) => Promise<void>
- onCreditAdded?: (payload: WebhookPayload) => Promise<void>
- onCreditDeducted?: (payload: WebhookPayload) => Promise<void>
- onCreditExpired?: (payload: WebhookPayload) => Promise<void>
- onCreditRolledOver?: (payload: WebhookPayload) => Promise<void>
- onCreditRolloverForfeited?: (payload: WebhookPayload) => Promise<void>
- onCreditOverageCharged?: (payload: WebhookPayload) => Promise<void>
- onCreditManualAdjustment?: (payload: WebhookPayload) => Promise<void>
- onCreditBalanceLow?: (payload: WebhookPayload) => Promise<void>

Environment Variable Setup:
To ensure the module functions correctly, set up the following environment variables in your Nuxt project's deployment environment (e.g., Vercel, Netlify, AWS, etc.):
- NUXT_PRIVATE_BEARER_TOKEN: Your Dodo Payments API Key (required for Checkout and Customer Portal).
- NUXT_PRIVATE_WEBHOOK_KEY: Your Dodo Payments Webhook Secret (required for Webhook handler).
- NUXT_PRIVATE_ENVIRONMENT: (Optional) Set to your environment (e.g., "test_mode" or "live_mode").
- NUXT_PRIVATE_RETURNURL: (Optional) The URL to redirect to after a successful checkout (for Checkout handler).

Usage in your code:
bearerToken: useRuntimeConfig().private.bearerToken
webhookKey: useRuntimeConfig().private.webhookKey

Important: Never commit sensitive environment variables directly into your version control. Use environment variables for all sensitive information.

If the user needs assistance setting up environment variables for their specific deployment environment, ask them what platform they are using (e.g., Vercel, Netlify, AWS, etc.), and provide guidance.
```
