Hoppa till huvudinnehåll
I den här handledningen kommer du att lära dig hur du implementerar platsbaserad prissättning med Dodo Payments-tillägg. Vi kommer att skapa en prenumerationsprodukt med tillägg för ytterligare platser och visa hur du genererar betalningslänkar med anpassade tilläggsmängder.
Denna handledning tillhandahåller exempel på implementationskod för en Node.js/Express-applikation. Du kan modifiera denna kod för ditt specifika ramverk (Next.js, React, Vue, etc.) och anpassa användargränssnittet enligt dina applikationsbehov.
I slutet av denna handledning kommer du att veta hur man:
  • Skapar prenumerationsprodukter med platsbaserad prissättning
  • Ställer in tillägg för ytterligare platser
  • Genererar betalningslänkar med anpassade tilläggsmängder
  • Hanterar kassa-sessioner med dynamiska platsantal

Vad vi bygger

Låt oss skapa en platsbaserad prissättningsmodell:
  • Basplan: 49 USD/månad för upp till 5 teammedlemmar
  • Plats-tillägg: 2 USD/månad per ytterligare plats
  • Betalningslänkar: Dynamisk kassa med anpassade platsmängder
Innan vi börjar, se till att du har:
  • Ett Dodo Payments-konto
  • Grundläggande kännedom om TypeScript/Node.js

Steg 1: Skapa ditt plats-tillägg

Nu behöver vi skapa ett tillägg som representerar ytterligare platser. Detta tillägg kommer att kopplas till vår basprenumeration och tillåta kunder att köpa ytterligare platser.
Skapa basprenumerationsprodukt
Vad vi bygger: Ett tillägg som kostar 2 USD/månad per plats och kan läggas till vilken basprenumeration som helst.
1

Navigera till Tillägg

  1. I din Dodo Payments-instrumentpanel, stanna i Produkter-sektionen
  2. Klicka på fliken Tillägg
  3. Klicka på Skapa Tillägg
Detta öppnar formuläret för att skapa tillägg.
2

Ange tilläggsdetaljer

Fyll i dessa värden för vårt plats-tillägg:Tilläggsnamn: Additional Team SeatBeskrivning: Add extra team members to your workspace with full access to all featuresPris: Ange → 2.00Valuta: Måste matcha din basprenumerationsvalutaSkattekategori: Välj lämplig kategori för din produkt.
3

Spara ditt tillägg

  1. Granska alla dina inställningar:
    • Namn: Ytterligare Teamplats
    • Pris: 2,00 USD/månad
  2. Klicka på Skapa Tillägg
Tillägg skapat! Ditt plats-tillägg är nu tillgängligt för att kopplas till prenumerationer.

Steg 2: Skapa din basprenumerationsprodukt

Vi börjar med att skapa en basprenumerationsprodukt som inkluderar 5 teammedlemmar. Detta kommer att vara grunden för vår platsbaserade prissättningsmodell.
Skapa basprenumerationsprodukt
1

Navigera till Produkter

  1. Logga in på din Dodo Payments-instrumentpanel
  2. Klicka på Produkter i vänster sidofält
  3. Klicka på knappen Skapa Produkt
  4. Välj Prenumeration som produkttyp
Du bör se ett formulär där vi kommer att konfigurera vår basprenumeration.
2

Fyll i prenumerationsdetaljer

Nu kommer vi att ange de specifika detaljerna för vår basplan:Produktnamn: MotionBeskrivning: Where your team's documentation lives.Återkommande pris: Ange → 49.00Faktureringscykel: Välj → MonthlyValuta: Välj din föredragna valuta (t.ex. USD)

Steg 3: Koppla tillägg till prenumeration

Nu behöver vi koppla vårt plats-tillägg till basprenumerationen så att kunder kan köpa ytterligare platser under kassan.
1

Fäst plats-tillägget

Fästa tillägg till prenumeration
  1. Scrolla ner till sektionen Tillägg
  2. Klicka på Lägg till Tillägg
  3. Välj ditt plats-tillägg från rullgardinsmenyn
  4. Bekräfta att det visas i din prenumerationskonfiguration
2

Spara prenumerationsändringar

  1. Granska din kompletta prenumerationsinställning:
    • Basplan: 49 USD/månad för 5 platser
    • Tillägg: 2 USD/månad per ytterligare plats
    • Gratis provperiod: 14 dagar
  2. Klicka på Spara Ändringar
Platsbaserad prissättning konfigurerad! Kunder kan nu köpa din basplan och lägga till extra platser vid behov.

Steg 4: Generera betalningslänkar med anpassade tilläggsmängder

Nu låt oss skapa en Express.js-applikation som genererar betalningslänkar med anpassade tilläggsmängder. Det är här den verkliga kraften i platsbaserad prissättning kommer in - du kan dynamiskt skapa kassa-sessioner med vilket antal ytterligare platser som helst.
1

Ställ in ditt projekt

Skapa ett nytt Node.js-projekt och installera de nödvändiga beroenden:
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
Skapa en tsconfig.json fil:
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}
2

Skapa din miljöfil

Skapa en .env fil med din Dodo Payments API-nyckel:
DODO_PAYMENTS_API_KEY=your_actual_dodo_api_key_here
Kom ihåg att aldrig begå din API-nyckel till versionskontroll. Lägg till .env i din .gitignore fil.
3

Implementera skapandet av kassa-sessioner

Skapa en src/server.ts fil med följande kod:
// 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: '[email protected]',
        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');
});
4

Lägg till ett enkelt webbgränssnitt

Skapa en public/index.html fil för enkel testning:
<!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>
Webbgränssnitt skapat! Du har nu ett enkelt användargränssnitt för att testa olika platsmängder.
5

Servera statiska filer

Lägg till detta i din src/server.ts för att servera HTML-filen:
// 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');
});
Statiska filer konfigurerade! Besök http://localhost:3000 för att se ditt demogränssnitt.

Steg 5: Testa din implementation

Låt oss testa vår platsbaserade prissättningsimplementation för att säkerställa att allt fungerar korrekt.
1

Starta din server

  1. Se till att du har din .env fil med rätt API-nyckel
  2. Uppdatera produkt- och tilläggs-ID:erna i din kod med de faktiska värdena från din Dodo Payments-instrumentpanel
  3. Starta din server:
npm run dev
Din server bör starta framgångsrikt och visa “Servern körs på http://localhost:3000
2

Testa webbgränssnittet

Skapa basprenumerationsprodukt
  1. Öppna din webbläsare och gå till http://localhost:3000
  2. Du bör se demogränssnittet för platsbaserad prissättning
  3. Prova olika platsmängder (0, 3, 10, etc.)
  4. Klicka på “Generera Kassa-länk” för varje mängd
  5. Verifiera att kassa-URL:erna genereras korrekt
3

Testa en kassa-session

  1. Generera en kassa-länk med 3 ytterligare platser
  2. Klicka på kassa-URL:en för att öppna Dodo Payments-kassan
  3. Verifiera att kassan visar:
    • Basplan: 49 USD/månad
    • Ytterligare platser: 3 × 2 dollar = 6 USD/månad
  4. Slutför testköpet
Kassan bör visa den korrekta prissättningen och låta dig slutföra köpet.
4

Lyssna på webhooks och uppdatera din databas

För att hålla din databas synkroniserad med prenumerations- och platsändringar måste du lyssna på webhook-händelser från Dodo Payments. Webhooks meddelar din backend när en kund slutför kassan, uppdaterar sin prenumeration eller ändrar platsantal.Följ den officiella Dodo Payments-webhookguiden för steg-för-steg-instruktioner om hur du ställer in webhook-slutpunkter och hanterar händelser:

Dodo Payments Webhooks Dokumentation

Lär dig hur du säkert tar emot och bearbetar webhook-händelser för prenumeration och platsadministration.

Felsökning

Vanliga problem och deras lösningar:
Möjliga orsaker:
  • Ogiltigt produkt-ID eller tilläggs-ID
  • API-nyckeln har inte tillräckliga behörigheter
  • Tillägget är inte korrekt kopplat till prenumerationen
  • Nätverksanslutningsproblem
Lösningar:
  1. Verifiera att produkt- och tilläggs-ID:n finns i din Dodo Payments-instrumentpanel
  2. Kontrollera att tillägget är korrekt kopplat till prenumerationen
  3. Se till att API-nyckeln har behörigheter för att skapa kassa-sessioner
  4. Testa API-anslutningen med en enkel GET-förfrågan

Grattis! Du har implementerat platsbaserad prissättning

Du har framgångsrikt skapat ett system för platsbaserad prissättning med Dodo Payments! Här är vad du har åstadkommit:

Basprenumeration

Skapat en prenumerationsprodukt med 5 inkluderade platser för 49 USD/månad

Plats-tillägg

Konfigurerade tillägg för ytterligare platser för 2 USD/månad per plats

Kassa

Byggt ett API som genererar kassa-sessioner med anpassade platsmängder

Webbgränssnitt

Skapat ett enkelt webbgränssnitt för att testa olika platsmängder
Detta exempel visar endast en minimal implementation av platsbaserad prissättning. För produktionsanvändning bör du lägga till robust felhantering, autentisering, datavalidering, säkerhetsåtgärder och anpassa logiken för att passa din applikations krav.