Chrome Extension — Marketer Setup
Before the Chrome extension can run experiments on your domain, you need to configure three things in the 10x.in backend:
- Map your domain to your handle
- Create chain rules that define what actions to trigger (popups, banners, CTA swaps)
- Create personalization rules that target specific visitor segments
All setup is done via the API.
- Step 1 (domain mapping) requires an OWNER JWT.
- Steps 2 and 3 (rules) can use PAT (
patv1_...) or JWT with write access.
Prerequisites
| Requirement | How to get it |
|---|---|
| A 10x.in handle | Create one at https://app.10x.in or via POST /v2/handles |
| An OWNER JWT | Sign in as account owner (required for /v2/account/domains/*) |
| A PAT token (optional for rules) | Generate from dashboard under Settings > API Tokens |
| A domain you control | You need access to its DNS records |
Set tokens as environment variables:
export OWNER_JWT="eyJ..."
export TOKEN="patv1_your_token_here" # optional for steps 2/3
export API="https://ai.10x.in"
---
Step 1: Map your domain to your handle
This tells the platform that traffic on your domain should resolve to your handle. The Chrome extension uses the GET /v2/public/domain-lookup endpoint to detect mapped domains.
Register the domain
curl -X POST "$API/v2/account/domains" \ -H "Authorization: Bearer $OWNER_JWT" \ -H "Content-Type: application/json" \ -d '{ "domain": "acmestore.com", "sourceType": "BYOD_HOSTNAME", "defaultHandle": "acmestore" }' ```Response (trimmed): ``
json { "domain": { "domain": "acmestore.com", "status": "PENDING_DELEGATION", "statusReason": "awaiting_nameserver_delegation" }, "verification": { "txtName": "_ls-verify.acmestore.com", "txtValue": "lsv1...." } }``</code></pre></li><li><h4>Configure DNS</h4><p>Use the domain setup values returned by the API:</p>- Save
verification.txtNameandverification.txtValue. - Run reconcile once and fetch
nameservers[]fromGET /v2/account/domains/{domain}. - At your registrar, set NS delegation to those nameservers.
- In delegated DNS, add TXT verification and traffic record values shown in Domain Management.
- Save
Trigger reconciliation
Trigger reconcile after DNS changes:
``
bash curl -X POST "$API/v2/account/domains/acmestore.com/reconcile" \ -H "Authorization: Bearer $OWNER_JWT"``Poll
GET /v2/account/domains/acmestore.comuntil status isACTIVE.Verify the domain is active
curl "$API/v2/public/domain-lookup?domain=acmestore.com" ```Expected response: ``
json { "handle": "acmestore", "pathRules": [], "status": "ACTIVE" }``If this returns
404, the domain is not yet active. CheckGET /v2/account/domains/acmestore.com.</code></pre></li></ol>---
Step 2: Create chain rules
Chain rules define what action to take when a trigger event occurs. The Chrome extension prefetches chain decisions and executes matched actions.
Chain rule structure
Field Type Description ruleIdString Unique rule identifier enabledBoolean Whether the rule is active priorityNumber Lower = higher priority triggerEventString Event that triggers evaluation ( page_load,exit_intent,scroll_75, etc.)whenObject Optional conditions: countryIn,deviceIn,sourceIn,campaignInchainConditionsObject Optional signal-based conditions (require/exclude) actionObject What to do when the rule matches Action types
action.typeRequired fields What it does show_popuptemplate(HTML string)Shows a popup overlay show_bannertemplate(HTML string)Shows a banner at top/bottom of page swap_ctaselector(CSS),templateorvars.textReplaces element content redirectdestinationUrlNavigates to a different URL fire_eventeventNameDispatches a custom DOM event add_to_cartmetadataFires a cart event with product data Example: Create an exit-intent popup
curl -X PUT "$API/v2/handles/acmestore/chain-rules/exit-popup-1" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "ruleId": "exit-popup-1", "enabled": true, "priority": 10, "triggerEvent": "exit_intent", "when": {}, "chainConditions": { "require": [], "exclude": [] }, "action": { "type": "show_popup", "template": "<div style=\"position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center;z-index:99999\"><div style=\"background:white;padding:40px;border-radius:12px;text-align:center;max-width:400px\"><h2 style=\"margin:0 0 12px\">Wait! Get 10% off</h2><p style=\"color:#666;margin:0 0 20px\">Use code EXIT10 at checkout.</p><a href=\"/checkout?coupon=EXIT10\" style=\"background:#0B6B3A;color:white;padding:12px 24px;border-radius:8px;text-decoration:none;display:inline-block\">Claim Discount</a></div></div>" } }'Example: Create a page-load banner
curl -X PUT "$API/v2/handles/acmestore/chain-rules/welcome-banner" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "ruleId": "welcome-banner", "enabled": true, "priority": 20, "triggerEvent": "page_load", "when": {}, "chainConditions": { "require": [], "exclude": [] }, "action": { "type": "show_banner", "template": "<div style=\"background:#0B6B3A;color:white;padding:12px;text-align:center;font-family:sans-serif\">Free shipping on orders over $50. <a href=\"/shop\" style=\"color:white;text-decoration:underline\">Shop now</a></div>" } }'---
Step 3: Create personalization rules
Personalization rules let you show different content to different visitor segments based on their source, campaign, country, or device.
Personalization rule structure
Field Type Description ruleIdString Unique rule identifier enabledBoolean Whether the rule is active priorityNumber Lower = higher priority whenObject Conditions: sourceIn,campaignIn,countryIn,deviceInvariantObject What to change: title,cta,destinationUrl,metadataExample: Country-based CTA personalization
curl -X PUT "$API/v2/handles/acmestore/personalization-rules/us-cta" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "ruleId": "us-cta", "enabled": true, "priority": 10, "when": { "countryIn": ["US"] }, "variant": { "id": "us-variant", "title": "Free Shipping to the US!", "cta": "Shop with Free US Shipping" } }'Example: Campaign-specific redirect
curl -X PUT "$API/v2/handles/acmestore/personalization-rules/spring-sale" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "ruleId": "spring-sale", "enabled": true, "priority": 5, "when": { "campaignIn": ["spring-2026"] }, "variant": { "id": "spring-redirect", "destinationUrl": "https://acmestore.com/spring-sale" } }'---
Step 4: Verify your setup
Check domain resolution
curl "$API/v2/public/domain-lookup?domain=go.acmestore.com"Should return your handle and
ACTIVEstatus.Check chain decisions
curl -X POST "$API/v2/public/chain/prefetch" \ -H "Content-Type: application/json" \ -d '{ "handle": "acmestore", "triggerEvents": ["page_load", "exit_intent", "scroll_75", "idle_30s"] }'You should see your rules in the
decisionsmap with"matched": true.Check personalization rules
curl "$API/v2/public/handles/acmestore/personalization-rules"Should return your rules with
"enabled": true.Test with the extension
- Install and log into the extension (see Chrome Extension guide).
- Navigate to your mapped domain.
- The badge should turn green with the experiment count.
- Trigger the appropriate event (scroll, leave the page, wait 30 seconds) to see the action.
---
Checklist
- [ ] Domain registered and DNS CNAME configured
- [ ] Domain reconciled and status is
ACTIVE - [ ] At least one chain rule created and enabled
- [ ] Chain prefetch returns
"matched": truefor your trigger events - [ ] Extension installed, logged in, and badge is green on your domain
Related guides
Updated Jun 19, 2026
