Affiliate and Partnerships
Best practices for affiliate networks, referral programs, and partnership teams using 10x to track partner performance, attribute conversions accurately, and automate commission workflows.
Business problems
- Inaccurate partner attribution — Clicks flow through shared links and there is no reliable way to isolate which partner drove which conversion.
- Commission disputes — Without idempotent conversion tracking, duplicate events inflate payouts or manual reconciliation is required.
- No real-time performance visibility — Partners and managers cannot see live campaign metrics without pulling CSV exports.
- Fraud and bot traffic — Click fraud inflates metrics and erodes trust between the network and its partners.
- Webhook delivery failures — Commission events fail to reach partner systems and there is no retry or audit mechanism.
Feature-to-problem map
| Problem | 10x feature | Guide |
|---|---|---|
| Inaccurate attribution | One campaign per partner + ctx tokens | Campaign Funnel Workflow |
| Commission disputes | Idempotent conversions + audit events | Context Token Lifecycle |
| No real-time visibility | Analytics API with campaign and segment grouping | Analytics Exports and Reconciliation |
| Fraud and bot traffic | qualifiedClicks metric + confidence scoring | Analytics Exports and Reconciliation |
| Webhook delivery failures | HMAC-signed webhooks with 5x exponential retry | Notifications and Alerting |
Recommended workflows
1. Set up per-partner campaign tracking
Create a separate campaign for each affiliate partner. This gives each partner isolated attribution:
POST /v2/handles/{handle}/campaigns
Partner A:
{
"campaignId": "partner-alpha",
"goalType": "AFFILIATE_CLICKOUT",
"status": "ACTIVE",
"primaryLink": {
"slug": "deal-alpha",
"destinationUrl": "https://merchant.example.com/product?ref=alpha",
"title": "Partner Alpha - Product Deal"
}
}
Partner B:
{
"campaignId": "partner-beta",
"goalType": "AFFILIATE_CLICKOUT",
"status": "ACTIVE",
"primaryLink": {
"slug": "deal-beta",
"destinationUrl": "https://merchant.example.com/product?ref=beta",
"title": "Partner Beta - Product Deal"
}
}
The AFFILIATE_CLICKOUT goal type auto-sets the tracking preset to custom_webhook and the conversion event to affiliate_click. Each partner gets a unique short link (deal-alpha, deal-beta) and all clicks and conversions attribute to their specific campaign.
2. Track conversions with idempotency
When a referred visitor converts on the merchant site, submit the conversion:
POST /v2/public/conversions
{
"ctx": "<token from redirect>",
"eventType": "affiliate_click",
"value": 24.99,
"currency": "USD",
"idempotencyKey": "txn-2026-02-25-order-789"
}
The idempotencyKey is critical for affiliate networks:
- Duplicate submissions return 200 with
deduped: trueinstead of creating a second conversion record. - The key is retained for 365 days, preventing late duplicates.
- Use a transaction ID or order ID as the key, not a session ID.
This eliminates commission disputes caused by double-counting.
3. Monitor partner performance in real time
Compare partner campaigns side by side:
GET /v2/handles/{handle}/analytics?funnel=true
This returns funnel metrics for all campaigns. Filter to a specific partner:
GET /v2/handles/{handle}/analytics?funnel=true&campaignId=partner-alpha
Response includes:
clicks— Total clicks from this partner.qualifiedClicks— Clicks minus detected bot traffic.conversions— Attributed conversions.revenue— Total conversion value.confidence— Data quality score (0-100).
For geographic breakdowns:
GET /v2/handles/{handle}/analytics?groupBy=country&campaignId=partner-alpha
4. Detect and filter bot traffic
The platform automatically separates bot traffic from legitimate clicks. Use the qualifiedClicks metric for commission calculations, not raw clicks.
The confidence score penalizes campaigns with high bot ratios:
| Bot ratio | Penalty | Meaning |
|---|---|---|
| < 20% | None | Normal traffic |
| 20-40% | -15 points | Some bot noise |
| > 40% | -30 points | Likely fraudulent |
A campaign with a confidence score below 50 warrants investigation. Export the data for manual review:
GET /v2/handles/{handle}/analytics/export?format=csv&campaignId=partner-alpha
Segment analytics reveal whether bot traffic concentrates in specific visitor segments:
GET /v2/handles/{handle}/analytics?groupBy=segment&campaignId=partner-alpha
5. Automate commission notifications via webhooks
Set up webhooks to push conversion events to your commission engine:
POST /v2/handles/{handle}/webhooks
{
"endpointUrl": "https://commissions.example.com/ingest",
"eventTypes": ["link.clicked", "conversion.tested"]
}
The response includes a one-time secret for HMAC-SHA256 signature verification. Store it securely — it cannot be retrieved again. Your endpoint should verify the signature on every delivery before processing.
Delivery guarantees:
- 5 retries with exponential backoff (5s, 10s, 20s, 40s, 80s).
- Failed deliveries are visible in the notifications panel.
- Each event includes the full conversion payload:
clickId,campaignId,value,currency, andeventType.
For PAT-based automation, use the webhooks.write scope to manage webhook subscriptions programmatically.
6. Use routing rules for source-based targeting
When a partner promotes across multiple channels, add source-based routing rules:
{
"routingRules": [
{
"priority": 10,
"destinationUrl": "https://merchant.example.com/product?ref=alpha&src=email",
"conditions": { "sourceIn": ["email"] }
},
{
"priority": 20,
"destinationUrl": "https://merchant.example.com/product?ref=alpha&src=social",
"conditions": { "sourceIn": ["twitter", "instagram", "facebook"] }
}
]
}
This lets you see which of a partner's channels performs best in the analytics breakdown by referrer:
GET /v2/handles/{handle}/analytics?groupBy=referrer&campaignId=partner-alpha
Key metrics to track
| Metric | Where to find it | What it tells you |
|---|---|---|
| Partner conversion rate | Funnel: conversions / qualifiedClicks | Per-partner efficiency |
| Revenue per partner | Funnel: revenue per campaignId | Commission basis |
| Bot traffic ratio | (clicks - qualifiedClicks) / clicks | Fraud indicator |
| Confidence score | Funnel response confidence field | Data reliability |
| Webhook delivery rate | Notifications panel success/failure counts | Integration health |
| Source breakdown | Analytics groupBy=referrer per campaign | Best-performing channels per partner |
Common mistakes
- Using one campaign for all partners. This makes per-partner attribution impossible. Always create one campaign per partner.
- Using session IDs as idempotency keys. Sessions can span multiple conversions. Use transaction or order IDs instead.
- Paying on raw clicks instead of qualified clicks. Bot traffic inflates raw click counts. Base commissions on
qualifiedClicksand verified conversions. - Not verifying webhook HMAC signatures. Without verification, your commission endpoint is vulnerable to spoofed events.
- Ignoring low confidence scores. A score below 50 indicates data anomalies (more conversions than clicks, high bot ratio, or stale data). Investigate before paying out.
Related: