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.

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-korta lä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 Dub-dokumentationen.
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 Dub 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 Dub 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: '[email protected]',
      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äktsövervakning:
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: Klientsideimplementering

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 Dub 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-transformeringen 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-korta lä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 slutförande av betalning
  • 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å [email protected] för hjälp med integrationen.