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 on https://ai.10x.in. For local or non-production validation, use the environment selector or the support-provided runtime override for your workspace instead of hardcoding alternate public hostnames in the extension.
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