> ## Documentation Index
> Fetch the complete documentation index at: https://dub-client-tracking-lead-sale.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Server-side tracking

> Learn how to track sales conversion events with Dub using server-side tracking

<Note>
  Conversion tracking require a [Business plan](https://dub.co/pricing)
  subscription or higher.
</Note>

When it comes to [conversion tracking](/conversions/quickstart), a `sale` event happens when a user purchases your product or service. Examples include:

* Subscribing to a paid plan
* Usage expansion (upgrading from one plan to another)
* Purchasing a product from your online store

<Frame>
  <img className="rounded-lg border border-gray-100" src="https://assets.dub.co/help/conversion-sale-event.png" alt="A diagram showing how lead events are tracked in the conversion funnel" />
</Frame>

In this guide, we will be focusing on tracking sales conversion events with Dub.

## Prerequisites

Before you get started, make sure you follow the [Dub Conversions quickstart guide](/conversions/quickstart) to get Dub Conversions set up for your links:

1. [Enable conversion tracking for your links](/conversions/quickstart#step-1%3A-enable-conversion-tracking-for-your-links)
2. [Install the @dub/analytics client-side SDK](/sdks/client-side/introduction)
3. [Install the Dub server-side SDK](/sdks/overview#server-side-sdks)

Then, depending on your authentication provider, follow the relevant guide to set up lead conversion tracking:

<CardGroup>
  <Card title="Clerk" icon="shield-halved" iconType="solid" href="https://dub.co/docs/conversions/leads/clerk" horizontal />

  <Card title="Better Auth" icon="shield-halved" iconType="solid" href="https://dub.co/docs/conversions/leads/better-auth" horizontal />

  <Card title="NextAuth.js" icon="shield-halved" iconType="solid" href="https://dub.co/docs/conversions/leads/next-auth" horizontal />

  <Card title="Supabase" icon="shield-halved" iconType="solid" href="https://dub.co/docs/conversions/leads/supabase" horizontal />

  <Card title="Auth0" icon="shield-halved" iconType="solid" href="https://dub.co/docs/conversions/leads/auth0" horizontal />

  <Card title="Appwrite" icon="shield-halved" iconType="solid" href="https://dub.co/docs/conversions/leads/appwrite" horizontal />
</CardGroup>

## Step 1: Configure sale tracking

Next, depending on which payment processor you're using, you can leverage our native integrations to track sale events:

<CardGroup cols={1}>
  <Card title="Stripe" icon="stripe" href="/conversions/sales/stripe" horizontal>
    Tracking sale conversion events with Stripe and the Dub SDK
  </Card>

  <Card title="Shopify" icon="shopify" href="/conversions/sales/shopify" horizontal>
    Tracking sale conversion events with Shopify and the Dub SDK
  </Card>
</CardGroup>

If you're not using any of the providers listed above, you can also manually track sale events using our [native SDKs](/sdks/overview) within your backend code:

<CodeGroup>
  ```javascript Node.js
  import { Dub } from "dub";

  const dub = new Dub();

  await dub.track.sale({
    customerExternalId: "cus_RBfbD57HDzPKpduI8elr5qHA",
    amount: 100,
    paymentProcessor: "stripe",
    eventName: "E-book purchase",
    invoiceId: "123456",
    currency: "usd",
  });
  ```

  ```python Python
  from dub import Dub
  import os

  dub = Dub(token=os.environ['DUB_API_KEY'])

  dub.track.sale({
      'external_id': 'cus_RBfbD57HDzPKpduI8elr5qHA',
      'amount': 100,
      'payment_processor': 'stripe',
      'event_name': 'E-book purchase',
      'invoice_id': '123456',
      'currency': 'usd'
  })
  ```

  ```go Go
  package main

  import (
      "context"
      dub "github.com/dubinc/dub-go"
  )

  d := dub.New(
      dub.WithSecurity(os.Getenv("DUB_API_KEY")),
  )

  _, err := d.Track.Sale(context.Background(), &operations.TrackSaleRequest{
      CustomerExternalId:       "cus_RBfbD57HDzPKpduI8elr5qHA",
      Amount:          100,
      PaymentProcessor: "stripe",
      EventName:       "E-book purchase",
      InvoiceId:       "123456",
      Currency:        "usd",
  })
  ```

  ```ruby Ruby
  require 'dub'

  dub = ::OpenApiSDK::Dub.new
  dub.config_security(
    ::OpenApiSDK::Shared::Security.new(
      token: ENV['DUB_API_KEY']
    )
  )

  req = ::OpenApiSDK::Operations::TrackSaleRequest.new(
    external_id: 'cus_RBfbD57HDzPKpduI8elr5qHA',
    amount: 100,
    payment_processor: 'stripe',
    event_name: 'E-book purchase',
    invoice_id: '123456',
    currency: 'usd'
  )

  dub.track.sale(req)
  ```

  ```php PHP
  <?php

  require 'vendor/autoload.php';

  use Dub\Dub;
  use Dub\Models\Operations;

  $dub = Dub::builder()->setSecurity($_ENV["DUB_API_KEY"])->build();

  $request = new Operations\TrackSaleRequest();
  $request->customerExternalId = 'cus_RBfbD57HDzPKpduI8elr5qHA';
  $request->amount = 100;
  $request->paymentProcessor = 'stripe';
  $request->eventName = 'E-book purchase';
  $request->invoiceId = '123456';
  $request->currency = 'usd';

  $dub->track->sale($request);
  ```
</CodeGroup>

Here are the properties you can include when sending a sale event:

| Property             | Required | Description                                                                                                                                            |
| :------------------- | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `customerExternalId` | **Yes**  | The unique ID of the customer in your system. Will be used to identify and attribute all future events to this customer.                               |
| `amount`             | **Yes**  | The amount of the sale in cents.                                                                                                                       |
| `paymentProcessor`   | No       | The payment processor that processed the sale (e.g. [Stripe](/conversions/sales/stripe), [Shopify](/conversions/sales/shopify)). Defaults to "custom". |
| `eventName`          | No       | The name of the event. Defaults to "Purchase".                                                                                                         |
| `invoiceId`          | No       | The invoice ID of the sale. Can be used as a idempotency key – only one sale event can be recorded for a given invoice ID.                             |
| `currency`           | No       | The currency of the sale. Defaults to "usd".                                                                                                           |
| `metadata`           | No       | An object containing additional information about the sale.                                                                                            |

## Step 2: View conversion results

And that's it – you're all set! You can now sit back, relax, and watch your conversion revenue grow. We provide 3 different views to help you understand your conversions:

* **Time-series**: A [time-series view](https://app.dub.co/dub/analytics?view=timeseries) of the number clicks, leads and sales.

<Frame>
  <img src="https://mintcdn.com/dub-client-tracking-lead-sale/Fo3EyiwSOIeMUHrn/images/conversions/timeseries-chart.png?fit=max&auto=format&n=Fo3EyiwSOIeMUHrn&q=85&s=71d3c78498e8befddb5d2fda748d7d54" alt="Time-series line chart" width="2400" height="1260" data-path="images/conversions/timeseries-chart.png" />
</Frame>

* **Funnel chart**: A [funnel chart view](http://app.dub.co/analytics?view=funnel) visualizing the conversion & dropoff rates across the different steps in the conversion funnel (clicks → leads → sales).

<Frame>
  <img src="https://mintcdn.com/dub-client-tracking-lead-sale/Fo3EyiwSOIeMUHrn/images/conversions/funnel-chart.png?fit=max&auto=format&n=Fo3EyiwSOIeMUHrn&q=85&s=1a70ca66d94eee8d705323f7fd33944e" alt="Funnel chart view showing the conversion & dropoff rates from clicks → leads → sales" width="2400" height="1260" data-path="images/conversions/funnel-chart.png" />
</Frame>

* **Real-time events stream**: A [real-time events stream](https://app.dub.co/events) of every single conversion event that occurs across all your links in your workspace.

<Frame>
  <img src="https://mintcdn.com/dub-client-tracking-lead-sale/Fo3EyiwSOIeMUHrn/images/conversions/events-table.png?fit=max&auto=format&n=Fo3EyiwSOIeMUHrn&q=85&s=70741a124cdbaa226d35cec457e65f54" alt="The Events Stream dashboard on Dub" width="2400" height="1260" data-path="images/conversions/events-table.png" />
</Frame>

## Currency conversion support

For simplicity, Dub records all sales in the default currency of your Dub workspace. This means that if you pass a different currency, it will be automatically converted to USD for reporting consistency – using the latest foreign exchange rates.

```typescript TypScript
await dub.track.sale({
  customerExternalId: "cus_RBfbD57HDzPKpduI8elr5qHA",
  amount: 15480, // this will be converted from PLN to USD
  currency: "pln",
  paymentProcessor: "stripe",
  eventName: "Purchase",
});
```

<Note>
  The default currency for all Dub workspaces is currently set to `USD`. We will
  add the ability to customize that in the future.
</Note>
