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

# सीट-आधारित मूल्य निर्धारण के साथ ऐड-ऑन और भुगतान लिंक

> सीट-आधारित मूल्य निर्धारण के लिए ऐड-ऑन बनाने और कस्टम ऐड-ऑन मात्रा के साथ भुगतान लिंक उत्पन्न करने के लिए Dodo Payments का उपयोग करना सीखें

इस ट्यूटोरियल में, आप Dodo Payments ऐड-ऑन का उपयोग करके सीट-आधारित मूल्य निर्धारण को लागू करना सीखेंगे। हम अतिरिक्त सीटों के लिए ऐड-ऑन के साथ एक सदस्यता उत्पाद बनाएंगे और आपको कस्टम ऐड-ऑन मात्रा के साथ भुगतान लिंक उत्पन्न करना दिखाएंगे।

<Note>
  यह ट्यूटोरियल Node.js/Express एप्लिकेशन के लिए नमूना कार्यान्वयन कोड प्रदान करता है। आप इस कोड को अपने विशिष्ट फ्रेमवर्क (Next.js, React, Vue, आदि) के लिए संशोधित कर सकते हैं और अपनी एप्लिकेशन की आवश्यकताओं के अनुसार उपयोगकर्ता इंटरफ़ेस को अनुकूलित कर सकते हैं।
</Note>

इस ट्यूटोरियल के अंत तक, आप जानेंगे कि:

* सीट-आधारित मूल्य निर्धारण के साथ सदस्यता उत्पाद कैसे बनाएं
* अतिरिक्त सीटों के लिए ऐड-ऑन कैसे सेट करें
* कस्टम ऐड-ऑन मात्रा के साथ भुगतान लिंक कैसे उत्पन्न करें
* गतिशील सीट गिनती के साथ चेकआउट सत्र कैसे संभालें

## हम क्या बना रहे हैं

आइए एक सीट-आधारित मूल्य निर्धारण मॉडल बनाते हैं:

* **बेस प्लान**: 5 टीम सदस्यों के लिए \$49/माह
* **सीट ऐड-ऑन**: प्रति अतिरिक्त सीट \$2/माह
* **भुगतान लिंक**: कस्टम सीट मात्रा के साथ गतिशील चेकआउट

<Info>
  शुरू करने से पहले, सुनिश्चित करें कि आपके पास है:

  * एक Dodo Payments खाता
  * TypeScript/Node.js की बुनियादी जानकारी
</Info>

## चरण 1: अपना सीट ऐड-ऑन बनाएं

अब हमें एक ऐड-ऑन बनाने की आवश्यकता है जो अतिरिक्त सीटों का प्रतिनिधित्व करता है। यह ऐड-ऑन हमारे बेस सदस्यता से जुड़ा होगा और ग्राहकों को अतिरिक्त सीटें खरीदने की अनुमति देगा।

<Frame>
  <img src="https://mintcdn.com/dodopayments/ajOhO6Du1yNsg0hy/images/cookbooks/seat-based/seat-based-addons-creation.png?fit=max&auto=format&n=ajOhO6Du1yNsg0hy&q=85&s=d2c17b4a9f2f9a1b19f537f0507656a4" alt="बेस सब्सक्रिप्शन उत्पाद बनाना" style={{ maxHeight: '500px', width: 'auto' }} width="2348" height="1606" data-path="images/cookbooks/seat-based/seat-based-addons-creation.png" />
</Frame>

<Tip>
  **हम क्या बना रहे हैं**: एक ऐसा एड-ऑन जो \$2/माह प्रति सीट की लागत पर किसी भी बेस सब्सक्रिप्शन में जोड़ा जा सकता है।
</Tip>

<Steps>
  <Step title="Navigate to Add-Ons">
    1. अपने Dodo Payments डैशबोर्ड में, **Products** सेक्शन में बने रहें
    2. **Add-Ons** टैब पर क्लिक करें
    3. **Create Add-On** पर क्लिक करें

    यह एड-ऑन निर्माण फ़ॉर्म खोलेगा।
  </Step>

  <Step title="Enter add-on details">
    हमारे सीट एड-ऑन के लिए इन मानों को भरें:

    **Add-On Name**: `Additional Team Seat`

    **Description**: `Add extra team members to your workspace with full access to all features`

    **Price**: Enter → `2.00`

    **मुद्रा**: आपकी बेस सदस्यता मुद्रा से मेल खाना चाहिए

    **कर श्रेणी**: अपने उत्पाद के लिए उपयुक्त श्रेणी चुनें।
  </Step>

  <Step title="Save your add-on">
    1. अपनी सभी सेटिंग्स की समीक्षा करें:
       * Name: Additional Team Seat
       * Price: \$2.00/month
    2. **Create Add-On** पर क्लिक करें

    <Check>
      **एड-ऑन बन गया!** आपका सीट एड-ऑन अब सब्सक्रिप्शन में जोड़ने के लिए उपलब्ध है।
    </Check>
  </Step>
</Steps>

## चरण 2: अपना बेस सदस्यता उत्पाद बनाएं

हम 5 टीम सदस्यों के साथ एक बेस सदस्यता उत्पाद बनाने से शुरू करेंगे। यह हमारे सीट-आधारित मूल्य निर्धारण मॉडल की नींव होगी।

<Frame>
  <img src="https://mintcdn.com/dodopayments/ajOhO6Du1yNsg0hy/images/cookbooks/seat-based/seat-based-subscription.png?fit=max&auto=format&n=ajOhO6Du1yNsg0hy&q=85&s=f17e96f3d106b88b6dc32a00be535620" alt="बेस सब्सक्रिप्शन उत्पाद बनाना" style={{ maxHeight: '500px', width: 'auto' }} width="2118" height="1580" data-path="images/cookbooks/seat-based/seat-based-subscription.png" />
</Frame>

<Steps>
  <Step title="Navigate to Products">
    1. अपने Dodo Payments डैशबोर्ड में लॉग इन करें
    2. बाएँ साइडबार में **Products** पर क्लिक करें
    3. **Create Product** बटन पर क्लिक करें
    4. प्रोडक्ट टाइप के रूप में **Subscription** चुनें

    आपको एक फ़ॉर्म दिखाई देगा जहाँ हम अपनी बेस सब्सक्रिप्शन को कॉन्फ़िगर करेंगे।
  </Step>

  <Step title="Fill in the subscription details">
    अब हम अपने बेस प्लान के विशिष्ट विवरण भरेंगे:

    **Product Name**: `Motion`

    **Description**: `Where your team's documentation lives.`

    **Recurring Price**: Enter → `49.00`

    **Billing Cycle**: Select → `Monthly`

    **Currency**: अपनी पसंदीदा मुद्रा चुनें (उदा., `USD`)
  </Step>
</Steps>

## चरण 3: सदस्यता से ऐड-ऑन को कनेक्ट करें

अब हमें अपने सीट ऐड-ऑन को बेस सदस्यता से जोड़ने की आवश्यकता है ताकि ग्राहक चेकआउट के दौरान अतिरिक्त सीटें खरीद सकें।

<Steps>
  <Step title="Attach the seat add-on">
    <Frame>
      <img src="https://mintcdn.com/dodopayments/ajOhO6Du1yNsg0hy/images/cookbooks/seat-based/seat-based-addons.png?fit=max&auto=format&n=ajOhO6Du1yNsg0hy&q=85&s=ea4ce0d437201c92590eea6c31a14e80" alt="सब्सक्रिप्शन से ऐड-ऑन को जोड़ना" style={{ maxHeight: '500px', width: 'auto' }} width="2338" height="1196" data-path="images/cookbooks/seat-based/seat-based-addons.png" />
    </Frame>

    1. **ऐड-ऑन** अनुभाग में स्क्रॉल करें
    2. **ऐड-ऑन जोड़ें** पर क्लिक करें
    3. ड्रॉपडाउन से अपने सीट ऐड-ऑन का चयन करें
    4. पुष्टि करें कि यह आपकी सदस्यता कॉन्फ़िगरेशन में दिखाई दे रहा है
  </Step>

  <Step title="Save subscription changes">
    1. अपनी पूरी सब्सक्रिप्शन सेटअप की समीक्षा करें:
       * बेस प्लान: \$49/माह के लिए 5 सीटें
       * एड-ऑन: अतिरिक्त सीट के लिए \$2/माह
       * मुफ्त परीक्षण: 14 दिन
    2. **Save Changes** पर क्लिक करें

    <Check>
      **सीट-आधारित मूल्य निर्धारण कॉन्फ़िगर हो गया है!** अब ग्राहक आपका बेस प्लान खरीद सकते हैं और जरूरत के अनुसार अतिरिक्त सीटें जोड़ सकते हैं।
    </Check>
  </Step>
</Steps>

## चरण 4: कस्टम ऐड-ऑन मात्रा के साथ भुगतान लिंक उत्पन्न करें

अब आइए एक Express.js एप्लिकेशन बनाते हैं जो कस्टम ऐड-ऑन मात्रा के साथ भुगतान लिंक उत्पन्न करता है। यही वह जगह है जहां सीट-आधारित मूल्य निर्धारण की असली शक्ति आती है - आप किसी भी संख्या में अतिरिक्त सीटों के साथ गतिशील रूप से चेकआउट सत्र बना सकते हैं।

<Steps>
  <Step title="Set up your project">
    एक नया Node.js प्रोजेक्ट बनाएँ और आवश्यक डिपेंडेंसी इंस्टॉल करें:

    ```bash theme={null}
    mkdir seat-based-pricing
    cd seat-based-pricing
    npm init -y
    npm install dodopayments express dotenv
    npm install -D @types/node @types/express typescript ts-node
    ```

    एक `tsconfig.json` फ़ाइल बनाएँ:

    ```json theme={null}
    {
      "compilerOptions": {
        "target": "ES2020",
        "module": "commonjs",
        "outDir": "./dist",
        "rootDir": "./src",
        "strict": true,
        "esModuleInterop": true,
        "skipLibCheck": true,
        "forceConsistentCasingInFileNames": true
      }
    }
    ```
  </Step>

  <Step title="Create your environment file">
    अपने Dodo Payments API key के साथ एक `.env` फ़ाइल बनाएँ:

    ```bash theme={null}
    DODO_PAYMENTS_API_KEY=your_actual_dodo_api_key_here
    ```

    <Warning>
      अपने API key को संस्करण नियंत्रण में कभी कमिट न करें। `.env` को अपनी `.gitignore` फ़ाइल में जोड़ें।
    </Warning>
  </Step>

  <Step title="Implement the checkout session creation">
    निम्नलिखित कोड के साथ एक `src/server.ts` फ़ाइल बनाएँ:

    <CodeGroup>
      ```typescript server.ts expandable theme={null}
      // Add this new endpoint for dynamic seat quantities
      import 'dotenv/config';
      import DodoPayments from 'dodopayments';
      import express, { Request, Response } from 'express';

      const app = express();

      // Initialize the Dodo Payments client
      const client = new DodoPayments({
        bearerToken: process.env.DODO_PAYMENTS_API_KEY,
        environment: 'test_mode'
      });

      async function createCheckoutSession(seatCount: number) {
        try {
          const session = await client.checkoutSessions.create({
            // Products to sell - use IDs from your Dodo Payments dashboard
            product_cart: [
              {
                product_id: 'pdt_7Rl9OWT2Mz4wwUTKz74iZ', // Replace with your actual product ID
                quantity: 1,
                addons: [
                  {
                    addon_id: 'adn_eKQbNakKrivDpaxmI8wKI', // Replace with your actual addon ID
                    quantity: seatCount
                  }
                ]
              }
            ],
            
            // Pre-fill customer information to reduce friction
            customer: {
              email: 'steve@example.com',
              name: 'Steve Irwin',
            },
            // Where to redirect after successful payment
            return_url: 'https://example.com/checkout/success',
          });

          // Redirect your customer to this URL to complete payment
          console.log('Checkout URL:', session.checkout_url);
          console.log('Session ID:', session.session_id);
          
          return session;
          
        } catch (error) {
          console.error('Failed to create checkout session:', error);
          throw error;
        }
      }

      // Example usage in an Express.js route
      app.post('/create-checkout/:seatCount', async (req: Request, res: Response) => {
        try {
          const seatCount = parseInt(req.params.seatCount);
          const session = await createCheckoutSession(seatCount);
          res.json({ checkout_url: session.checkout_url });
        } catch (error) {
          res.status(500).json({ error: 'Failed to create checkout session' });
        }
      });

      // Add this line after your other middleware
      app.use(express.static('public'));

      // Add this route to serve the demo page
      app.get('/', (req, res) => {
        res.sendFile(__dirname + '/../public/index.html');
      });

      app.listen(3000, () => {
        console.log('Server is running on port 3000');
      });
      ```
    </CodeGroup>
  </Step>

  <Step title="Add a simple web interface">
    सरल परीक्षण के लिए एक `public/index.html` फ़ाइल बनाएँ:

    <CodeGroup>
      ```html index.html expandable theme={null}
      <!DOCTYPE html>
      <html>
      <head>
          <title>Seat-Based Pricing Demo</title>
          <style>
              body { font-family: Arial, sans-serif; max-width: 600px; margin: 50px auto; padding: 20px; }
              .form-group { margin: 20px 0; }
              label { display: block; margin-bottom: 5px; font-weight: bold; }
              input { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; }
              button { background: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; }
              button:hover { background: #0056b3; }
              .result { margin-top: 20px; padding: 15px; background: #f8f9fa; border-radius: 4px; }
          </style>
      </head>
      <body>
          <h1>Seat-Based Pricing Demo</h1>
          <p>Generate checkout links with custom seat quantities:</p>
          
          <div class="form-group">
              <label for="seatCount">Number of Additional Seats:</label>
              <input type="number" id="seatCount" value="3" min="0" max="50">
          </div>
          
          <button onclick="createCheckout()">Generate Checkout Link</button>
          
          <div id="result" class="result" style="display: none;">
              <h3>Checkout Link Generated!</h3>
              <p><strong>Seat Count:</strong> <span id="seatCountDisplay"></span></p>
              <p><strong>Total Cost:</strong> $<span id="totalCost"></span>/month</p>
              <p><strong>Checkout URL:</strong></p>
              <a id="checkoutUrl" href="#" target="_blank">Click here to checkout</a>
          </div>

          <script>
              async function createCheckout() {
                  const seatCount = document.getElementById('seatCount').value;
                  
                  try {
                      const response = await fetch(`/create-checkout/${seatCount}`, {
                          method: 'POST'
                      });
                      
                      const data = await response.json();
                      
                      if (response.ok) {
                          document.getElementById('seatCountDisplay').textContent = seatCount;
                          document.getElementById('totalCost').textContent = data.total_cost;
                          document.getElementById('checkoutUrl').href = data.checkout_url;
                          document.getElementById('result').style.display = 'block';
                      } else {
                          alert('Error: ' + data.error);
                      }
                  } catch (error) {
                      alert('Error creating checkout session');
                  }
              }
          </script>
      </body>
      </html>
      ```
    </CodeGroup>

    <Check>
      **वेब इंटरफ़ेस बन गया है!** अब आपके पास विभिन्न सीट मात्रा का परीक्षण करने के लिए एक सरल UI है।
    </Check>
  </Step>

  <Step title="Serve static files">
    HTML फ़ाइल को सर्व करने के लिए इसे अपने `src/server.ts` में जोड़ें:

    ```typescript theme={null}
    // Add this line after your other middleware
    app.use(express.static('public'));

    // Add this route to serve the demo page
    app.get('/', (req, res) => {
      res.sendFile(__dirname + '/../public/index.html');
    });
    ```

    <Check>
      **स्टैटिक फ़ाइलें कॉन्फ़िगर हो गई हैं!** अपना डेमो इंटरफ़ेस देखने के लिए `http://localhost:3000` पर जाएँ।
    </Check>
  </Step>
</Steps>

## चरण 5: अपने कार्यान्वयन का परीक्षण करें

आइए अपने सीट-आधारित मूल्य निर्धारण कार्यान्वयन का परीक्षण करें ताकि यह सुनिश्चित हो सके कि सब कुछ सही ढंग से काम कर रहा है।

<Steps>
  <Step title="Start your server">
    1. सुनिश्चित करें कि आपकी `.env` फ़ाइल में सही API key है
    2. अपने कोड में उत्पाद और एड-ऑन आईडी को Dodo Payments डैशबोर्ड से वास्तविक मानों से अपडेट करें
    3. अपना सर्वर शुरू करें:

    ```bash theme={null}
    npm run dev
    ```

    <Check>
      आपका सर्वर सफलतापूर्वक शुरू हो जाना चाहिए और "Server running on [http://localhost:3000](http://localhost:3000)" दिखाना चाहिए
    </Check>
  </Step>

  <Step title="Test the web interface">
    <Frame>
      <img src="https://mintcdn.com/dodopayments/ajOhO6Du1yNsg0hy/images/cookbooks/seat-based/seat-based-billing-ui.png?fit=max&auto=format&n=ajOhO6Du1yNsg0hy&q=85&s=37d166d8e76b0bfbb4959bc9a3eff1f8" alt="बेस सब्सक्रिप्शन उत्पाद बनाना" style={{ maxHeight: '500px', width: 'auto' }} width="1806" height="1416" data-path="images/cookbooks/seat-based/seat-based-billing-ui.png" />
    </Frame>

    1. अपने ब्राउज़र में `http://localhost:3000` पर जाएँ
    2. आपको सीट-आधारित मूल्य निर्धारण डेमो इंटरफ़ेस दिखाई देना चाहिए
    3. विभिन्न सीट मात्राओं (0, 3, 10, आदि) को आज़माएँ
    4. प्रत्येक मात्रा के लिए "Generate Checkout Link" पर क्लिक करें
    5. सत्यापित करें कि चेकआउट URL सही तरीके से जनरेट हो रहे हैं
  </Step>

  <Step title="Test a checkout session">
    1. 3 अतिरिक्त सीटों के साथ एक चेकआउट लिंक जनरेट करें
    2. चेकआउट URL पर क्लिक करके Dodo Payments चेकआउट खोलें
    3. सत्यापित करें कि चेकआउट में यह दिखाया जा रहा है:
       * बेस प्लान: \$49/माह
       * अतिरिक्त सीटें: 3 × 2 डॉलर = \$6/माह
    4. परीक्षण खरीद को पूरा करें

    <Check>
      चेकआउट को सही मूल्य निर्धारण ब्रेकडाउन दिखाना चाहिए और आपको खरीदारी पूरी करने की अनुमति देनी चाहिए।
    </Check>
  </Step>

  <Step title="Listen for webhooks and update your DB">
    अपने डेटाबेस को सब्सक्रिप्शन और सीट परिवर्तनों के साथ सिंक में बनाए रखने के लिए, आपको Dodo Payments से वेबहुक इवेंट्स को सुनने की आवश्यकता है। वेबहुक आपके बैकएंड को सूचित करते हैं जब कोई ग्राहक चेकआउट पूरा करता है, अपनी सब्सक्रिप्शन अपडेट करता है, या सीट काउंट बदलता है।

    वेबहुक एंडपॉइंट सेट करने और घटनाओं को संभालने के लिए चरण-दर-चरण निर्देशों के लिए आधिकारिक Dodo Payments वेबहुक गाइड का पालन करें:

    <Card title="Dodo Payments Webhooks Documentation" icon="bell" href="/developer-resources/webhooks">
      सब्सक्रिप्शन और सीट प्रबंधन के लिए वेबहुक इवेंट्स को सुरक्षित रूप से प्राप्त और संसाधित करना सीखें।
    </Card>
  </Step>
</Steps>

## समस्या निवारण

सामान्य समस्याएँ और उनके समाधान:

<AccordionGroup>
  <Accordion title="Checkout creation failing">
    **संभावित कारण:**

    * अमान्य उत्पाद ID या एड-ऑन ID
    * API key के पास पर्याप्त अनुमतियाँ नहीं हैं
    * एड-ऑन सब्सक्रिप्शन के साथ ठीक से संबद्ध नहीं किया गया है
    * नेटवर्क कनेक्टिविटी की समस्या

    **समाधान:**

    1. सत्यापित करें कि उत्पाद और एड-ऑन ID आपके Dodo Payments डैशबोर्ड में मौजूद हैं
    2. जांचें कि एड-ऑन ठीक से सब्सक्रिप्शन से जुड़ा हुआ है
    3. सुनिश्चित करें कि API key के पास चेकआउट सेशन बनाने की अनुमतियाँ हैं
    4. एक साधारण GET अनुरोध के साथ API कनेक्टिविटी का परीक्षण करें
  </Accordion>
</AccordionGroup>

## बधाई! आपने सीट-आधारित मूल्य निर्धारण लागू किया है

आपने Dodo Payments के साथ एक सीट-आधारित मूल्य निर्धारण प्रणाली सफलतापूर्वक बनाई है! आपने जो हासिल किया है वह यहाँ है:

<CardGroup cols={2}>
  <Card title="Base Subscription">
    \$49/माह पर 5 शामिल सीटों के साथ एक सब्सक्रिप्शन उत्पाद बनाया गया
  </Card>

  <Card title="Seat Add-ons">
    अतिरिक्त सीटों के लिए \$2/माह प्रति सीट पर एड-ऑन कॉन्फ़िगर किए गए
  </Card>

  <Card title="Checkout">
    कस्टम सीट मात्राओं के साथ चेकआउट सत्र जनरेट करने वाली एक API बनाई गई
  </Card>

  <Card title="Web Interface">
    विभिन्न सीट मात्राओं का परीक्षण करने के लिए एक सरल वेब इंटरफ़ेस बनाया गया
  </Card>
</CardGroup>

<Info>
  यह उदाहरण केवल सीट-आधारित मूल्य निर्धारण का एक न्यूनतम कार्यान्वयन दिखाता है। उत्पादन उपयोग के लिए, आपको मजबूत त्रुटि हैंडलिंग, प्रमाणीकरण, डेटा मान्यता, सुरक्षा उपाय जोड़ने चाहिए और लॉजिक को अपनी एप्लिकेशन की आवश्यकताओं के अनुसार अनुकूलित करना चाहिए।
</Info>
