Hoppa till huvudinnehåll

Introduktion

Dub är en kraftfull länkhanteringsplattform som hjälper dig att skapa, dela och spåra korta länkar. Genom att integrera Dodo Payments med Dub kan du automatiskt spåra försäljningskonverteringsevenemang när kunder slutför köp, vilket gör att du kan mäta ROI för dina marknadsföringskampanjer och referensprogram. Ett “försäljning”-evenemang registreras i Dub när en kund:
  • Slutför en engångsbetalning
  • Prenumererar på en betald plan
  • Gör en återkommande prenumerationsbetalning
Denna integration kräver ett Dub-konto med konverteringsspårning aktiverad på dina länkar.
Affiliate Program Integration: Denna integration fungerar också sömlöst med Dub Partners för att spåra affiliate-referenser och provisioner. Använd Dubs konverteringsspårning för att attribuera försäljningar till dina affiliate-länkar och mäta partnerprestanda. Lär dig mer om hur du ställer in affiliate-program i vår Affiliates-funktionsguide.

Hur det fungerar

Dub spårar besökare genom en unik klick-ID (dub_id) som lagras i en cookie när användare klickar på dina Dub-kortlänkar. För att attribuera försäljningar till dina länkar behöver du:
  1. Fånga Dubs klick-ID från dub_id cookien när du skapar kassa-sessioner
  2. Lagra klick-ID i din betalningsmetadata tillsammans med kundens externa ID
  3. Skicka försäljningsdata till Dub när betalningar lyckas med deras Track API
Detta gör att Dub kan matcha lyckade försäljningar med det ursprungliga länk-klicket, vilket ger dig fullständig konverteringsattribuering.

Förutsättningar

Innan du ställer in denna integration, se till att du har:
  1. Ett Dub-konto med en arbetsyta
  2. Konverteringsspårning aktiverad för dina länkar
  3. Din Dub API-nyckel (tillgänglig i din Dub-instrumentpanel under Inställningar → API-nycklar)

Komma igång

1

Aktivera konverteringsspårning i Dub

I din Dub-instrumentpanel, aktivera konverteringsspårning för de länkar du vill spåra försäljningar för. Detta gör att Dub kan registrera försäljningsevenemang när kunder slutför köp.
Lär dig mer om att aktivera konverteringsspårning i Dubs dokumentation.
2

Hämta din Dub API-nyckel

Navigera till din Dub-instrumentpanel → Inställningar → API-nycklar och skapa en ny API-nyckel med conversions.write omfång.
Håll din API-nyckel säker och exponera den aldrig i klientkod.
3

Fånga Klick-ID i Kassa

När du skapar en kassa-session, fånga Dubs klick-ID från cookien och lägg till det i din betalningsmetadata.
4

Skicka Försäljningsdata via Webhook

Konfigurera en webhook för att skicka försäljningsdata till Dubs Track API när betalningar lyckas.
5

Klart!

Försäljningskonverteringsevenemang kommer nu att visas i din Dub-analysinstrumentpanel med full attribuering till dina länkar.

Implementeringsguide

Steg 1: Lägg till Klick-ID och Kund-ID i Kassa-Metadata

När du skapar en kassa-session, fånga Dubs klick-ID från cookien och inkludera det i din betalningsmetadata tillsammans med kundens externa ID.
import { cookies } from 'next/headers';
import DodoPayments from 'dodopayments';

const client = new DodoPayments();

export async function createCheckout(productId: string, customerId: string) {
  // Capture Dub click ID from cookie
  const dubClickId = cookies().get('dub_id')?.value;

  const payment = await client.payments.create({
    billing: {
      city: 'New York',
      country: 'US',
      state: 'NY',
      street: '123 Main St',
      zipcode: '10001',
    },
    customer: {
      email: 'customer@example.com',
      name: 'John Doe',
    },
    product_id: productId,
    metadata: {
      dub_click_id: dubClickId,           // Store Dub click ID
      dub_external_id: customerId,        // Store your customer's unique ID
    },
  });

  return payment;
}

Steg 2: Skicka Försäljningsdata till Dub

Konfigurera en webhook-endpoint för att skicka försäljningsdata till Dubs Track API när betalningar lyckas.
1

Öppna Webhook-sektionen

I din Dodo Payments-instrumentpanel, navigera till Webhooks → + Lägg till Endpoint och expandera integrationsrullgardinsmenyn.
Lägg till Endpoint och integrationsrullgardinsmeny
2

Välj Dub

Välj Dub integrationskortet.
3

Ange API-nyckel

Ange din Dub API-nyckel i konfigurationsfältet.
Lägg till API-nyckel
4

Konfigurera Transformation

Redigera transformationskoden för att formatera betalningsdata för Dubs Track Sale API.
5

Testa & Skapa

Testa med exempelpayloads och klicka på Skapa för att aktivera integrationen.

Transformationskodsexempel

Grundläggande Försäljningsspårning

Spåra försäljningar när betalningar lyckas:
basic_sale.js
function handler(webhook) {
  if (webhook.eventType === "payment.succeeded") {
    const payment = webhook.payload.data;

    // Only send to Dub if click ID exists in metadata
    if (payment.metadata && payment.metadata.dub_click_id) {
      webhook.payload = {
        clickId: payment.metadata.dub_click_id,
        externalId: payment.metadata.dub_external_id || payment.customer.customer_id,
        amount: payment.total_amount, // Ensure the amount is in cents
        currency: payment.currency || "USD",
        paymentProcessor: "dodo",
        invoiceId: payment.payment_id,
        metadata: {
          customer_email: payment.customer.email,
          customer_name: payment.customer.name,
          product_id: payment.product_cart ? payment.product_cart.map(product => product.product_id).join(', ') : undefined,
        },
      };
    } else {
      // Cancel dispatch if no click ID (organic traffic)
      webhook.cancel = true;
    }
  }
  return webhook;
}

Spåra Prenumerationsförsäljningar

Spåra både initiala prenumerationer och återkommande betalningar:
subscription_sale.js
function handler(webhook) {
  const data = webhook.payload.data;

  // Track initial subscription activation
  if (webhook.eventType === "subscription.active") {
    if (data.metadata && data.metadata.dub_click_id) {
      webhook.payload = {
        clickId: data.metadata.dub_click_id,
        externalId: data.metadata.dub_external_id || data.customer.customer_id,
        amount: data.recurring_pre_tax_amount, // Amount in cents
        currency: data.currency || "USD",
        paymentProcessor: "dodo",
        invoiceId: data.subscription_id,
        eventName: "Subscription Started",
        metadata: {
          subscription_id: data.subscription_id,
          product_id: data.product_id,
          billing_interval: data.payment_frequency_interval,
          customer_email: data.customer.email,
        },
      };
    } else {
      // Cancel dispatch if no click ID (organic traffic)
      webhook.cancel = true;
    }
  }

  // Track recurring subscription payments
  if (webhook.eventType === "subscription.renewed") {
    if (data.metadata && data.metadata.dub_click_id) {
      webhook.payload = {
        clickId: data.metadata.dub_click_id,
        externalId: data.metadata.dub_external_id || data.customer.customer_id,
        amount: data.recurring_pre_tax_amount,
        currency: data.currency || "USD",
        paymentProcessor: "dodo",
        invoiceId: `${data.subscription_id}_${Date.now()}`,
        eventName: "Subscription Renewed",
        metadata: {
          subscription_id: data.subscription_id,
          product_id: data.product_id,
          customer_email: data.customer.email,
        },
      };
    } else {
      // Cancel dispatch if no click ID (organic traffic)
      webhook.cancel = true;
    }
  }

  return webhook;
}

Spåra Försäljningar med Skatteexkludering

Skicka endast beloppet före skatt till Dub för noggrann intäktsrapportering:
sale_without_tax.js
function handler(webhook) {
  if (webhook.eventType === "payment.succeeded") {
    const payment = webhook.payload.data;

    if (payment.metadata && payment.metadata.dub_click_id) {
      // Calculate pre-tax amount (total minus tax)
      const preTaxAmount = payment.total_amount - (payment.tax || 0);

      webhook.payload = {
        clickId: payment.metadata.dub_click_id,
        externalId: payment.metadata.dub_external_id || payment.customer.customer_id,
        amount: preTaxAmount, // Pre-tax amount in cents
        currency: payment.currency || "USD",
        paymentProcessor: "dodo",
        invoiceId: payment.payment_id,
        metadata: {
          total_amount: payment.total_amount,
          tax_amount: payment.tax || 0,
          customer_email: payment.customer.email,
        },
      };
    } else {
      // Cancel dispatch if no click ID (organic traffic)
      webhook.cancel = true;
    }
  }
  return webhook;
}

Spåra Försäljningar med Anpassade Evenemangsnamn

Använd anpassade evenemangsnamn för att kategorisera olika typer av försäljningar:
custom_events.js
function handler(webhook) {
  if (webhook.eventType === "payment.succeeded") {
    const payment = webhook.payload.data;

    if (payment.metadata && payment.metadata.dub_click_id) {
      // Determine event name based on payment type
      let eventName = "Purchase";
      if (payment.subscription_id) {
        eventName = "Subscription Purchase";
      } else if (payment.metadata && payment.metadata.is_upgrade) {
        eventName = "Plan Upgrade";
      }

      webhook.payload = {
        clickId: payment.metadata.dub_click_id,
        externalId: payment.metadata.dub_external_id || payment.customer.customer_id,
        amount: payment.total_amount,
        currency: payment.currency || "USD",
        paymentProcessor: "dodo",
        invoiceId: payment.payment_id,
        eventName: eventName,
        metadata: {
          product_id: payment.product_cart ? payment.product_cart.map(product => product.product_id).join(', ') : undefined,
          customer_email: payment.customer.email,
        },
      };
    } else {
      // Cancel dispatch if no click ID (organic traffic)
      webhook.cancel = true;
    }
  }
  return webhook;
}

Alternativ: Klientside-implementering

Om du föredrar att spåra försäljningar från din server istället för att använda webhooks, kan du anropa Dubs Track API direkt efter en lyckad betalning:
'use server';

import { Dub } from 'dub';

const dub = new Dub();

export async function trackSale(
  paymentId: string,
  clickId: string,
  customerId: string,
  amount: number,
  currency: string
) {
  await dub.track.sale({
    clickId: clickId,
    externalId: customerId,
    amount: amount,
    currency: currency,
    paymentProcessor: 'dodo',
    invoiceId: paymentId,
  });
}

Bästa Praxis

Fånga klick-ID tidigt: Lagra Dubs klick-ID så tidigt som möjligt i din kassa-flöde för att säkerställa noggrann attribuering, även om användaren navigerar bort och återvänder senare.
  • Inkludera alltid klick-ID i metadata: Utan klick-ID kan Dub inte attribuera intäkter till dina länkar
  • Använd externa ID konsekvent: Skicka samma kund-ID som du använder i ditt system för noggrann kundanalys
  • Hantera organisk trafik smidigt: Sätt webhook.cancel = true när det inte finns något klick-ID för att undvika onödiga API-anrop
  • Testa med exempelbetalningar: Verifiera att integrationen fungerar korrekt innan du går live
  • Övervaka din Dub-instrumentpanel: Kontrollera att försäljningar visas korrekt med rätt attribuering

Viktiga Anteckningar

  • Beloppsformat: Dub förväntar sig belopp i cent (t.ex. $10.00 = 1000)
  • Valuta: Använd ISO 4217-valutakoder (USD, EUR, GBP, etc.)
  • Gratis provperioder: $0 betalningar spåras inte som försäljningar
  • Återbetalningar: Överväg att spåra återbetalningar separat om det behövs för noggrann intäktsrapportering

Felsökning

  • Verifiera att din Dub API-nyckel är korrekt och har conversions.write omfång
  • Kontrollera att dub_click_id fångas och lagras i betalningsmetadata
  • Se till att webhook-transformationen korrekt formaterar payloaden
  • Verifiera att webhooken utlöses på payment.succeeded evenemang
  • Bekräfta att konverteringsspårning är aktiverad för dina Dub-länkar
  • Bekräfta att användare klickar igenom dina Dub-kortlänkar innan kassan
  • Verifiera att dub_id cookien sätts korrekt på din domän
  • Kontrollera att klick-ID matchar mellan skapande av kassa och betalningsslutförande
  • Se till att du fångar klick-ID innan du skapar kassa-sessionen
  • Validera att JSON-strukturen matchar Dubs Track Sale API-format
  • Kontrollera att alla obligatoriska fält (clickId, externalId, amount) är närvarande
  • Se till att beloppet är i cent (heltal, inte decimal)
  • Verifiera att API-endpoint-URL:en är korrekt: https://api.dub.co/track/sale
  • Testa transformationen med exempel-webhookpayloads
  • Se till att du endast spårar på payment.succeeded evenemang, inte payment.processing
  • Använd unika invoiceId värden för varje försäljning
  • För prenumerationer, lägg till tidsstämplar eller faktureringsperioder för att förhindra dubbletter vid förnyelser

Ytterligare Resurser

Behöver du hjälp? Kontakta Dodo Payments support på support@dodopayments.com för hjälp med integrationen.