E-Commerce and Retail
Best practices for online stores, DTC brands, and retail marketers using 10x to improve campaign velocity, conversion attribution, and revenue capture.
Business problems
- Slow campaign launches — Every promotion needs a new link, tracking setup, and QA cycle.
- Broken attribution — Clicks happen on one channel, conversions on another, and the data never connects.
- One-size-fits-all landing pages — Every visitor sees the same page regardless of geography, device, or intent.
- Cart abandonment — Visitors leave checkout with no automated recovery path.
- Manual geo-pricing — International traffic lands on wrong-currency pages, killing conversion.
Feature-to-problem map
| Problem | 10x feature | Guide |
|---|---|---|
| Slow launches | Campaign with PRODUCT_SALE goal + linked slug | Campaign Funnel Workflow |
| Broken attribution | ctx token + idempotent conversions | Context Token Lifecycle |
| Same page for all visitors | Routing rules with countryIn, deviceIn, segmentIn | Smart Link Personalization |
| Cart abandonment | Chain signals + lifecycle rules | Chain Signals and Prefetch |
| Manual geo-pricing | Country-based routing rules with priority ordering | Advanced Link Controls |
Recommended workflows
1. Launch a promotion in under 5 minutes
Create a campaign with an embedded primary link in a single API call:
POST /v2/handles/{handle}/campaigns
{
"campaignId": "summer-sale",
"goalType": "PRODUCT_SALE",
"status": "ACTIVE",
"primaryLink": {
"slug": "summer",
"destinationUrl": "https://store.example.com/summer-sale",
"title": "Summer Sale 2026",
"enabled": true
}
}
This creates the campaign, provisions the short link, and starts tracking immediately. Share https://{handle}.10x.in/summer in any channel.
Validate the pipeline end-to-end with a test conversion:
POST /v2/handles/{handle}/campaigns/summer-sale/test-conversion
{
"value": 49.99,
"currency": "USD"
}
Check campaign health to confirm all tracking is wired:
GET /v2/handles/{handle}/campaigns/summer-sale/health
A READY readiness status means the campaign is fully operational.
2. Route visitors by country for geo-pricing
Add routing rules to your link so each region sees the right pricing page:
PUT /v2/handles/{handle}/links/summer
{
"destinationUrl": "https://store.example.com/summer-sale",
"routingRules": [
{
"priority": 10,
"destinationUrl": "https://store.example.com/summer-sale?region=na",
"conditions": { "countryIn": ["US", "CA"] }
},
{
"priority": 20,
"destinationUrl": "https://store.example.com/summer-sale?region=eu",
"conditions": { "countryIn": ["DE", "FR", "GB", "IT", "ES"] }
},
{
"priority": 30,
"destinationUrl": "https://store.example.com/summer-sale?region=apac",
"conditions": { "countryIn": ["JP", "AU", "SG", "IN"] }
}
]
}
The base destinationUrl acts as the global fallback. Rules are evaluated by priority (lower number = higher priority). Preview the routing decision before publishing:
POST /v2/handles/{handle}/links/summer/route-preview
{ "country": "DE", "device": "MOBILE" }
3. Recover abandoned carts with chain signals
When a visitor adds to cart but leaves, your site posts a signal:
POST /v2/public/chain/signals
{
"handle": "yourstore",
"sessionId": "sig_yourstore_1740500000000_abc123",
"eventType": "cart_abandon",
"signals": [
{ "signalKey": "cart_value", "signalValue": "89.99", "confidence": 1.0 },
{ "signalKey": "product_category", "signalValue": "shoes", "confidence": 0.9 }
]
}
A chain rule triggers a recovery action when the visitor returns:
{
"ruleId": "cart-recovery",
"enabled": true,
"priority": 100,
"triggerEvent": "page_view",
"chainConditions": {
"require": [
{ "signalKey": "cart_value", "operator": "exists" }
],
"exclude": [
{ "signalKey": "purchase_complete", "operator": "exists" }
],
"maxChainAgeMinutes": 1440
},
"action": {
"type": "show_banner",
"template": "You left {{cart_value}} in your cart. Complete your order for 10% off."
}
}
The rule fires only if the visitor has a cart signal but no purchase signal within the last 24 hours.
4. Track conversions with clean attribution
On your checkout success page, submit the conversion using the ctx token from the redirect:
POST /v2/public/conversions
{
"ctx": "<token from redirect query param>",
"eventType": "purchase",
"value": 89.99,
"currency": "USD",
"idempotencyKey": "order-12345"
}
The idempotencyKey ensures duplicate submissions (retries, double-clicks) are safely ignored. The ctx token connects the conversion back to the original click, campaign, and routing rule.
Key metrics to track
| Metric | Where to find it | What it tells you |
|---|---|---|
| Conversion rate | GET /v2/handles/{handle}/analytics?funnel=true&campaignId={id} | Clicks-to-conversions efficiency |
| Revenue by campaign | Same funnel endpoint, revenue field | Total attributed revenue |
| Geo performance | GET /v2/handles/{handle}/analytics?groupBy=country&campaignId={id} | Which regions convert best |
| Segment breakdown | GET /v2/handles/{handle}/analytics?groupBy=segment&campaignId={id} | High-intent vs. window-shoppers |
| Confidence score | Funnel response confidence field (0-100) | Data quality for decision-making |
Common mistakes
- Skipping the test conversion. Always run
POST .../test-conversionbefore sharing the link. It validates the entire pipeline end-to-end. - Not setting an idempotency key. Without one, retried requests can double-count conversions. Use your order ID.
- Overlapping routing rules with the same priority. When two rules share a priority, evaluation order is not guaranteed. Space priorities by 10 (10, 20, 30).
- Ignoring bot traffic in metrics. Use
qualifiedClicks(clicks minus bot clicks) instead of rawclicksfor conversion rate calculations. - Letting the ctx token expire. The default TTL is 15 minutes. If your checkout flow takes longer, ensure the ctx is captured on the landing page, not at checkout completion.
Related: