Skip to Content
Developer DocsConceptsHow attribution works

How attribution works

The attribution flow

RevRoute uses a multi-stage attribution model that tracks the complete customer journey from initial click to final purchase:

Stage 1: Click tracking

When a visitor clicks a partner’s referral link, RevRoute captures the click server-side before redirecting to your website. This happens automatically and cannot be blocked by ad blockers.

Data captured at click:

  • Unique click ID
  • Timestamp
  • Geographic location (country, city, continent)
  • Device type (mobile, desktop, tablet)
  • Browser and operating system
  • Referrer URL
  • UTM parameters
  • Whether the click came from a QR code or a short link

The click is appended to your destination URL as a rr_id query parameter:

https://yoursite.com?rr_id=cm3w8x2...

Then, the RevRoute Analytics script detects the rr_id parameter and stores it as a first-party cookie.

// The SDK automatically handles this when installed // Cookie: rr_id=xyz... (expires in 90 days by default)

Why first-party cookies?

  • Persist across page navigation and sessions
  • Not blocked by ad blockers (unlike third-party cookies)
  • Compliant with privacy regulations
  • Work reliably across all browsers

The default cookie lifetime is 90 days, meaning conversions within this window are attributed to the original click. You can customize this with the expiresInDays parameter.

Stage 2: Lead tracking

When the visitor takes a qualifying action (signup, booking, form submission), you track a lead event. This links the customer to the original click.

await dub.track.lead({ clickId: cookies.get("rr_id"), // From the cookie eventName: "Sign Up", customerExternalId: user.id, // Your user ID customerEmail: user.email, customerName: user.name, });

The lead event is automatically deduplicated based on customerExternalId + eventName. Only the first event for each combination is recorded, preventing duplicate attribution — see Missing leads if an event you expected never showed up.

Stage 3: Sale tracking

When the customer makes a purchase, you track a sale event. RevRoute automatically links this to the customer’s previous lead event.

await dub.track.sale({ customerExternalId: user.id, // Same ID from lead event amount: 9900, // Amount in minor units (99.00 RUB or USD) paymentProcessor: "yookassa", // "yookassa" | "custom" invoiceId: "inv_123", // For idempotency });

The sale is attributed to the partner who drove the original click, and a commission record is automatically created based on your program’s reward rules.

Attribution models

RevRoute supports two attribution models:

  1. Last-click attribution (default)
  2. First-click attribution

Last-click attribution (default)

All credit goes to the most recent partner link the customer clicked before converting.

// include this script tag in your HTML Head tag <script src="https://app.revroute.ru/analytics/script.js" data-api-host="https://api.revroute.ru" data-attribution-model="last-click" // can be omitted since it's the default defer ></script>
💡

Pro-tip: Last-click attribution is the most commonly used attribution model when it comes to affiliate attribution, since it gives the most credit to the final partner that got the customer to convert.

First-click attribution

All credit goes to the first partner who introduced the customer, regardless of subsequent clicks.

// include this script tag in your HTML Head tag <script src="https://app.revroute.ru/analytics/script.js" data-api-host="https://api.revroute.ru" data-attribution-model="first-click" defer ></script>

When a customer clicks multiple partner links:

ModelBehavior
Last-clickThe rr_id cookie is overwritten with each new click. The most recent partner gets credit.
First-clickThe original rr_id cookie is preserved. The first partner retains credit.

Each click is still recorded in analytics, so you can see the full customer journey even if only one partner receives the commission.

Attribution window

The attribution window is the timeframe during which a conversion can be credited to a click. In RevRoute, this is controlled by the cookie lifetime:

ConfigurationDefaultDescription
expiresInDays90Days the rr_id cookie persists
// Set a 30-day attribution window <script src="https://app.revroute.ru/analytics/script.js" data-api-host="https://api.revroute.ru" data-cookie-options='{"expiresInDays": 30}' ></script>

If the customer converts after the cookie expires, the conversion event will not be attributed to the original click.

Cross-domain attribution

If your customer journey spans multiple domains, RevRoute supports cross-domain tracking as well:

  • yoursite.com → app.yoursite.com
  • app.yoursite.com → checkout.yoursite.com
  • yoursite.com → anothersite.com

For this to work, the RevRoute Analytics script has to be installed on every domain in the journey, and each origin must be present in the allowed origins list of your publishable key — otherwise the browser blocks the call with a CORS error. If the rr_id is lost on a hop, Tracking issues shows how to find where it happened.

Partner commission flow

When a sale is attributed, RevRoute automatically calculates and records the partner’s commission:

  1. Sale event received with customerExternalId
  2. Customer lookup finds the associated lead and original click
  3. Partner identified from the click’s referral link
  4. Commission calculated based on the reward rules for the partner’s group
  5. Commission created with pending status

Direct sale attribution

For scenarios without a signup flow (e.g., one-time purchases), you can track sales directly with the click ID:

await dub.track.sale({ clickId: cookies.get("rr_id"), // Directly from cookie customerExternalId: order.email, customerName: order.name, customerEmail: order.email, amount: 4900, invoiceId: order.id, });

Tracking sale events covers when to send this call and how to wire it to a payment webhook.

📝

Direct sale tracking bypasses the lead event. This means lead-based rewards are not created—only sale commissions.

Deferred lead tracking

For products with qualification periods (trials, approvals), RevRoute supports deferred lead tracking:

// Track initial signup (deferred) await dub.track.lead({ clickId: cookies.get("rr_id"), eventName: "Sign Up", customerExternalId: user.id, mode: "deferred", // Creates customer link but defers reward }); // Later, when qualified await dub.track.lead({ clickId: "", // Empty - uses existing customer record eventName: "Qualified Lead", customerExternalId: user.id, // Same customer ID });

This ensures partners are only rewarded when customers reach a meaningful milestone.

Learn more about deferred lead tracking.

Troubleshooting attribution

Common issues

IssueCauseSolution
Conversions not attributedrr_id cookie missingVerify SDK installation and allowed hostnames
Wrong partner creditedLast-click model with multiple clicksConsider first-click model if appropriate
Duplicate leadsSame customer tracked twiceEnsure consistent customerExternalId
Missing commissionSale tracked before leadTrack lead event first, or use direct sale tracking

Verifying attribution

  1. Check the cookie: Inspect browser cookies for rr_id
  2. Test the flow: Click a partner link, sign up, and verify the lead appears in your dashboard
  3. Review analytics: Check the Events tab for click → lead → sale progression
Last updated on