Chrome Extension
The 10x.in Experiment Runner is a Chrome extension that detects when you visit a domain mapped to a 10x.in handle and automatically runs active experiments on that page. It injects the tracking SDK, evaluates chain rules, and applies personalization — all without modifying the site's source code.
When to use
- You want to run experiments on your site without adding a script tag.
- You want visitors to receive personalized experiences (popups, banners, CTA swaps) driven by your 10x.in handle configuration.
- You want to preview and test experiments on your own domain before deploying the tracking SDK site-wide.
Installation
Download the extension
Download the latest extension package:
Extract the zip to a folder on your computer.
Load in Chrome
- Open
chrome://extensionsin Chrome. - Enable Developer mode (toggle in the top-right corner).
- Click Load unpacked.
- Select the extracted folder.
- Open
Verify
The 10x.in icon appears in your Chrome toolbar. Click it to open the popup.
Tip
Building from source — If you prefer, clone the repository and run:
cd chrome-extension
npm install
npm run build
Then load the dist/ folder as an unpacked extension.
Authentication
The extension supports two authentication methods. You need to log in before experiments will activate.
- Click the extension icon in the toolbar.
- Select Email Login.
- Enter your 10x.in email and password.
- Click Sign in.
JWT tokens are stored in session storage and cleared when you close the browser. The extension refreshes tokens automatically.
- Click the extension icon in the toolbar.
- Select PAT Token.
- Paste your token (starts with
patv1_). - Click Connect.
PAT tokens persist across browser sessions. Generate a PAT from your 10x.in dashboard under Settings > API Tokens.
Tip
PAT tokens are recommended for long-term use since they don't expire on browser close.
How it works
Once logged in, the extension activates automatically as you browse:
| Step | What happens |
|---|---|
| 1. Domain detection | When you navigate to any page, the extension checks if the domain is mapped to a 10x.in handle via GET /v2/public/domain-lookup. |
| 2. Badge update | If the domain is mapped, the badge turns green with the number of active experiments. Unmapped domains show no badge. |
| 3. SDK injection | The tracking SDK (tracking-sdk.umd.js) is injected into the page and initialized with the resolved handle. |
| 4. Experiment execution | Pre-fetched chain rule decisions are evaluated. Matched actions (popups, banners, CTA swaps) execute immediately for page_load triggers. |
| 5. Trigger listeners | The extension monitors scroll depth, exit intent, and idle time. When a trigger fires, the corresponding chain rule action executes. |
Note
Domain lookups are cached for 5 minutes. Experiment configs are cached for 2 minutes. To force a refresh, reload the page.
Supported experiment types
Chain rule actions
The extension executes all 7 chain action types:
| Action type | What it does |
|---|---|
show_popup | Injects a popup overlay with HTML from the template field |
show_banner | Injects a banner (top or bottom) with HTML from the template field |
swap_cta | Finds an element by CSS selector and replaces its content |
redirect | Navigates to the destinationUrl |
add_to_cart | Fires a custom tenx:add_to_cart DOM event |
fire_event | Dispatches a custom DOM event with the specified eventName |
no_action | Does nothing (useful for control groups) |
Trigger events
| Trigger | When it fires |
|---|---|
page_load | Immediately when the page loads |
scroll_25 | When the user scrolls past 25% of the page |
scroll_50 | When the user scrolls past 50% of the page |
scroll_75 | When the user scrolls past 75% of the page |
exit_intent | When the mouse leaves the viewport at the top edge |
idle_30s | After 30 seconds of no mouse, keyboard, or scroll activity |
Each trigger fires at most once per page load.
Personalization rules
Personalization rules are evaluated based on URL parameters and visitor context:
sourceIn— matchesutm_sourceorrefquery parametercampaignIn— matchesutm_campaignquery parametercountryIn— matches visitor country (from targeting profile)deviceIn— matches device type (mobile, desktop, tablet)
The highest-priority matching rule is applied. Variants can override the page title, swap CTAs, or redirect to a different URL.
Per-domain toggle
You can disable the extension on specific domains without logging out:
- Navigate to the domain.
- Click the extension icon.
- Toggle the switch to off.
The domain is added to a blocklist stored locally. Toggle it back on at any time.
Environment switching
By default, the extension connects to the production API (api.10x.in). For development, you can switch to the dev API (api.arjun.tv) by sending a SET_ENV message from the popup — this will be available in a future settings panel.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Badge is empty / gray | Domain is not mapped to a handle | Map the domain — see Marketer Setup Guide |
| Badge is green but nothing happens | No active chain rules or personalization rules for this handle | Create experiments — see Marketer Setup Guide |
| "This domain is not connected" in popup | Domain lookup returned 404 | Verify domain is registered and in ACTIVE state via API |
| Extension not activating after login | Page was loaded before login | Reload the page after logging in |
| Popup or banner looks unstyled | The template HTML in your chain rule may be missing CSS | Include inline styles in your chain rule template |
Related guides
- Marketer Setup Guide — How to configure domains, chain rules, and personalization rules
- Full Walkthrough Example — Step-by-step: exit-intent popup on an e-commerce store
- Custom Domains — Detailed domain mapping guide
- Chain Signals and Prefetch — Chain rule concepts and signal model
- Smart Link Personalization — Personalization rule concepts