Skip to main content
Conversion tracking requires a Business plan subscription or higher.
When it comes to conversion tracking, 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)
In this guide, we will be focusing on tracking sales events for a SaaS application that uses Google Tag Manager to manage client-side tracking scripts.

Prerequisites

First, you’ll need to enable conversion tracking for your Dub links to be able to start tracking conversions:
If you’re using Dub Partners, you can skip this step since partner links will have conversion tracking enabled by default.
To enable conversion tracking for all future links in a workspace, you can do the following: To enable conversion tracking for all future links in a workspace, you can do the following:
  1. Navigate to your workspace’s Analytics settings page.
  2. Toggle the Workspace-level Conversion Tracking switch to enable conversion tracking for the workspace.
Enabling conversion tracking for a workspace
This option will enable conversion tracking in the Dub Link Builder for all future links.
Alternatively, you can also enable conversion tracking programmatically via the Dub API. All you need to do is pass trackConversion: true when creating or updating a link:
const link = await dub.links.create({
  url: "https://dub.co",
  trackConversion: true,
});

Set up Dub Analytics in Google Tag Manager

If you’ve already set up the Dub Analytics script for lead tracking, you can skip to Step 2.
To track sales conversion events with Google Tag Manager, you’ll need to install the Dub analytics script and configure sales tracking tags.

Step 1: Add Dub Analytics Script to GTM

If you’ve already set up the Dub Analytics script for lead tracking, you can skip this step.
First, you’ll need to add the Dub analytics script to your website using Google Tag Manager. In your GTM workspace, navigate to the Tags section and click New to create a new tag.
GTM New Tag
Select Custom HTML as the tag type and add the following code:
<script>
  !(function (c, n) {
    c[n] =
      c[n] ||
      function () {
        (c[n].q = c[n].q || []).push(arguments);
      };
    ["trackClick", "trackLead", "trackSale"].forEach(
      (t) => (c[n][t] = (...a) => c[n](t, ...a))
    );
    var s = document.createElement("script");
    s.defer = 1;
    s.src = "https://www.dubcdn.com/analytics/script.conversion-tracking.js";
    s.setAttribute("data-publishable-key", "dub_pk_xxxxxxxx"); // Replace with your publishable key
    document.head.appendChild(s);
  })(window, "dubAnalytics");
</script>
Make sure to replace dub_pk_xxxxxxxx with your actual publishable key from your Dub workspace (under the Analytics settings page).
Configure the tag to fire on All Pages by setting the trigger to All Pages - Page View. Name this tag “Dub Analytics Script” and save it.

Step 2: Create Sales Tracking Tag for Checkout Forms

Next, create a tag to track sales when users complete checkout forms on your website. Create another Custom HTML tag with the following code:
<script>
  (function () {
    // Get checkout data - customize these selectors based on your form
    var customerId = document.getElementById("customer_id")
      ? document.getElementById("customer_id").value
      : "";
    var amount = document.getElementById("amount")
      ? document.getElementById("amount").value
      : "";
    var invoiceId = document.getElementById("invoice_id")
      ? document.getElementById("invoice_id").value
      : "";

    // Only track if customer ID and amount are present
    if (customerId && amount) {
      // Track the sale event
      dubAnalytics.trackSale({
        eventName: "Purchase",
        customerExternalId: customerId,
        amount: parseInt(amount), // Amount in cents
        invoiceId: invoiceId || undefined,
        currency: "usd", // Customize as needed
        paymentProcessor: "stripe", // Customize as needed
      });
    }
  })();
</script>
Important: You’ll need to customize the DOM selectors (getElementById('customer_id'), getElementById('amount'), etc.) to match your actual checkout form field IDs or use different methods to capture the form data based on your website’s structure.
Configure this tag to fire on Form Submission by creating a new trigger:
  • Trigger Type: Form Submission
  • This trigger fires on: Some Forms (or All Forms if you want to track all form submissions)
  • Add conditions to specify which forms should trigger sales tracking (e.g., checkout forms)
Name this tag “Dub Sales Tracking - Checkout Form” and save it.

Step 3: Create Sales Tracking Tag for Order Confirmation Pages

For tracking sales on order confirmation pages (recommended approach), create another Custom HTML tag:
<script>
  (function () {
    // Get query parameters from URL
    var params = new URLSearchParams(window.location.search);
    var customerId = params.get("customer_id");
    var amount = params.get("amount");
    var invoiceId = params.get("invoice_id");

    // Only track if customer ID and amount are present
    if (customerId && amount) {
      // Track the sale event
      dubAnalytics.trackSale({
        eventName: "Purchase",
        customerExternalId: customerId,
        amount: parseInt(amount), // Amount in cents
        invoiceId: invoiceId || undefined,
        currency: "usd", // Customize as needed
        paymentProcessor: "stripe", // Customize as needed
      });
    }
  })();
</script>
Configure this tag to fire on specific pages by creating a Page View trigger with conditions:
  • Trigger Type: Page View
  • This trigger fires on: Some Page Views
  • Add conditions like:
    • Page URL contains /order-confirmation
    • Or Page Path equals /checkout/success
    • Or whatever URL pattern matches your order confirmation pages
Name this tag “Dub Sales Tracking - Order Confirmation” and save it. Here are the properties you can include when sending a sale event:
PropertyRequiredDescription
customerExternalIdYesThe unique ID of the customer in your system. Will be used to identify and attribute all future events to this customer.
amountYesThe amount of the sale in cents.
paymentProcessorNoThe payment processor that processed the sale (e.g. Stripe, Shopify). Defaults to “custom”.
eventNameNoThe name of the event. Defaults to “Purchase”.
invoiceIdNoThe invoice ID of the sale. Can be used as a idempotency key – only one sale event can be recorded for a given invoice ID.
currencyNoThe currency of the sale. Defaults to “usd”.
metadataNoAn object containing additional information about the sale.
clickIdNo[For direct sale tracking]: The unique ID of the click that the sale conversion event is attributed to. You can read this value from dub_id cookie.
customerNameNo[For direct sale tracking]: The name of the customer. If not passed, a random name will be generated.
customerEmailNo[For direct sale tracking]: The email address of the customer.
customerAvatarNo[For direct sale tracking]: The avatar URL of the customer.

Testing your setup

To test your GTM setup, you can use the Preview mode in Google Tag Manager:
  1. Enable Preview Mode: In your GTM workspace, click the Preview button in the top right corner
  2. Enter your website URL and click Connect
  3. Navigate to a checkout page or your order confirmation page
  4. Complete a test purchase or visit the confirmation page with query parameters
  5. Check the GTM debugger to see if your tags are firing correctly

Verify sales tracking

You can also verify that sales are being tracked by:
  1. Checking your browser’s developer console for any JavaScript errors
  2. Using the Network tab to see if requests are being sent to Dub’s analytics endpoint
  3. Viewing your Dub dashboard to confirm that sale events are appearing in your analytics

Common troubleshooting tips

  • Tag not firing: Check that your triggers are configured correctly and that the conditions match your page structure
  • Form data not captured: Verify that your DOM selectors match your actual form field IDs or names
  • Amount formatting: Ensure amounts are in cents (e.g., $10.00 = 1000 cents)
  • Multiple events: Make sure your tags aren’t firing multiple times by checking trigger conditions
  • Missing publishable key: Ensure you’ve replaced the placeholder with your actual publishable key
Client-Side Tracking Limitations:
  • Ad blockers – Users with ad blockers may prevent tracking scripts from loading
  • JavaScript disabled – Events won’t be tracked if users have JavaScript disabled
  • Network issues – Failed network requests won’t retry automatically
  • Privacy concerns – Some users may block client-side tracking for privacy reasons
For more accurate conversion tracking, consider using server-side conversion tracking

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 line chart
  • Funnel chart: A funnel chart view visualizing the conversion & dropoff rates across the different steps in the conversion funnel (clicks → leads → sales).
Funnel chart view showing the conversion & dropoff rates from clicks → leads → sales
  • Real-time events stream: A real-time events stream of every single conversion event that occurs across all your links in your workspace.
The Events Stream dashboard on Dub