tessl install tessl/npm-posthog-js@1.335.0PostHog Browser JS Library is a comprehensive browser analytics and feature management SDK that enables developers to capture user events, track product analytics, manage feature flags, record session replays, and implement feedback mechanisms like surveys and conversations in web applications.
Web experiments enable A/B testing by dynamically modifying web page content based on feature flag variants. They automatically apply visual transformations to elements without code changes.
Import from PostHog instance:
const experiments = posthog.experiments;Fetches web experiments from the server and evaluates which ones to apply based on current feature flag values, URL matching, and display conditions.
/**
* Get web experiments and evaluate display logic
* @param forceReload - Force reload from server, bypassing cache
*/
function getWebExperimentsAndEvaluateDisplayLogic(forceReload?: boolean): void;Usage Example:
import posthog from 'posthog-js';
// Automatically load and apply experiments
posthog.experiments.getWebExperimentsAndEvaluateDisplayLogic();
// Force reload from server
posthog.experiments.getWebExperimentsAndEvaluateDisplayLogic(true);Fetches web experiments with a callback, optionally enabling preview mode.
/**
* Get web experiments with callback
* @param callback - Called with array of web experiments
* @param forceReload - Force reload from server
* @param previewing - Enable preview mode (for testing)
*/
function getWebExperiments(
callback: WebExperimentsCallback,
forceReload: boolean,
previewing?: boolean
): void;
type WebExperimentsCallback = (webExperiments: WebExperiment[]) => void;Usage Example:
posthog.experiments.getWebExperiments(
(experiments) => {
console.log('Loaded experiments:', experiments);
experiments.forEach(exp => {
console.log(`Experiment ${exp.name}: ${exp.variants}`);
});
},
false // Don't force reload
);Activates web experiment preview mode using query parameters __experiment_id and __experiment_variant in the URL.
/**
* Preview a web experiment from URL parameters
* Looks for __experiment_id and __experiment_variant query params
*/
function previewWebExperiment(): void;Usage Example:
// URL: https://example.com?__experiment_id=123&__experiment_variant=test
posthog.experiments.previewWebExperiment();
// Applies the "test" variant of experiment 123Loads experiments if enabled in configuration. Called automatically during PostHog initialization.
/**
* Load experiments if enabled in config
* Typically called internally during initialization
*/
function loadIfEnabled(): void;Web experiments are controlled via PostHog configuration:
posthog.init('YOUR_PROJECT_API_KEY', {
api_host: 'https://us.i.posthog.com',
// Web experiments are disabled by default (beta feature)
disable_web_experiments: false, // Set to false to enable
});Main web experiment interface.
interface WebExperiment {
/** Unique experiment ID */
id: number;
/** Human-readable experiment name */
name: string;
/** Optional feature flag key controlling this experiment */
feature_flag_key?: string;
/** Map of variant names to variant configurations */
variants: Record<string, WebExperimentVariant>;
}Defines a single variant within an experiment.
interface WebExperimentVariant {
/** Display conditions for this variant */
conditions?: WebExperimentConditions;
/** Variant name (matches feature flag variant value) */
variant_name: string;
/** List of transformations to apply */
transforms: WebExperimentTransform[];
}Conditions that determine when a variant is applied.
interface WebExperimentConditions {
/** URL matching configuration */
url?: string;
/** How to match the URL */
urlMatchType?: WebExperimentUrlMatchType;
/** UTM parameter matching */
utm?: {
utm_source?: string;
utm_medium?: string;
utm_campaign?: string;
utm_term?: string;
};
}
type WebExperimentUrlMatchType =
| 'regex' // Regular expression match
| 'not_regex' // Inverse regex match
| 'exact' // Exact URL match
| 'is_not' // URL is not this value
| 'icontains' // URL contains substring (case-insensitive)
| 'not_icontains' // URL does not contain substring
;Defines a transformation to apply to page elements.
interface WebExperimentTransform {
/** CSS selector to target elements */
selector?: string;
/** HTML attributes to set/modify */
attributes?: Array<{ name: string; value: string }>;
/** Text content to replace */
text?: string;
/** HTML content to replace */
html?: string;
/** Image URL to replace */
imgUrl?: string;
/** CSS styles to apply */
css?: string;
}Transform Examples:
// Change button text
{
selector: '.cta-button',
text: 'Buy Now - 20% Off!'
}
// Modify image source
{
selector: '#hero-image',
imgUrl: 'https://example.com/new-hero.jpg'
}
// Apply custom CSS
{
selector: '.pricing-card',
css: 'background-color: #ff6b6b; border: 2px solid #000;'
}
// Change multiple attributes
{
selector: 'a.signup-link',
attributes: [
{ name: 'href', value: '/special-offer' },
{ name: 'class', value: 'btn btn-primary' }
]
}
// Replace HTML content
{
selector: '.announcement',
html: '<strong>Limited Time:</strong> Get 50% off!'
}Feature Flag Integration: Web experiments are tied to feature flag variants. When a user is assigned to a variant, the experiment's transforms are applied.
Conditions Evaluation: Before applying transforms, PostHog checks:
Transform Application: If conditions are met, transforms are applied to matching elements using DOM manipulation.
Preview Mode: Use query parameters to preview specific variants without feature flag evaluation.
Test Selectors: Ensure CSS selectors are specific enough to target the right elements without side effects.
Performance: Limit the number of transforms per experiment to minimize DOM manipulation overhead.
Fallbacks: Design experiments so the original experience is acceptable if transforms fail to apply.
Feature Flags: Always tie experiments to feature flags for proper variant assignment and analytics.
Preview Before Launch: Use preview mode to verify transforms work correctly before enabling for users.