LogSure

Lab

Test it. Then ship the winner.

A/B experiments and feature flags without cookies: variants and values worked out in the page, results with uplift, intervals and the chance to beat control, and guardrails that warn you before a win costs you something else.

A running experiment, Green checkout button: the green button is ahead with a 27% uplift, an interval from 1.3% to 52%, a p-value of 0.039 and a 98% chance to beat the blue control, with a refund-request guardrail below.

No cookie. No visitor ID kept.

Ask for the variant in your page. With your own user ID, the same person always gets the same variant: it is a hash of the experiment and the ID, worked out in the page, and LogSure never stores the ID.

Without an ID, the variant is picked once per page view, so pass one for anything people come back to.

In your page

const v = await logsure.variant('checkout-button', { id: user.id });

if (v === 'green') showGreenButton();
// null while the experiment isn't running: show your default

Results you can act on.

Each variant's visitors, conversions and rate, the uplift over control with its 95% interval, a p-value and the chance to beat control. LogSure says when to keep running and when a variant has won.

  • A warning when the split does not match the weights
  • Nothing called before every variant has enough visitors
  • Results by device, country, browser, system or source
  • The rates day by day
Further down an experiment: the guardrail, the conversion rate of each variant cumulatively by day since it started, and the results split by device.

Goals and guardrails.

The goal is what should go up: a custom event, a page, or a saved funnel. Guardrails are what must not get worse, such as refunds or signups, and a harmed one is marked in red.

eventpagefunnel2 to 5 variantsweightsguardrails

Feature flags.

Ship behind a flag, then turn it on for the people you choose. Each flag has a type, a kill switch and rules, and is worked out in the page, so LogSure stays cookieless and learns nothing about the visitor to serve it.

  • Typed values: on and off, text, numbers or JSON
  • An enabled switch that turns a flag off for everyone at once
  • Rules on the attributes you pass, tried first, in order
  • Every change in the flag's history, and an experiment can measure it
A boolean flag, new-checkout: how it decides, in order (off, a staff rule, a recent-app rule, scores 10 to 50 inclusive, then the default), a test box where a score of 30 gets On, and the tracker snippet.

A score your app chooses.

Optionally, a flag can follow a number from 0 to 100 that your app passes: engagement, a plan tier, a bucket of your own. LogSure never computes one. Ranges such as "on for scores 10 to 50" include both ends; with no score, or a score in no range, the flag serves its default.

Feature flags in the docs

In your page

<script defer data-app="example-shop" data-flags="true"
  src="/_care/script.js"></script>

const on = logsure.flag('new-checkout', {
  id: user.id,
  score: user.engagement,   // 0–100, set by your app
  attrs: { plan: user.plan, version: '2.4.1' },
  fallback: false,
});

Every flag at a glance.

What each flag serves right now, its type, whether it uses the score, and a switch to turn it off. Back-ends read the same public config, or ask /_care/flags/evaluate with the server key.

The Lab's flags: five flags of a sample app with their type, what each serves (a JSON banner, a boolean on for scores 10 to 50, a text headline, a number), an enabled switch and when each changed.

How it works.

Make the experiment

In the console's Lab: a key, 2 to 5 variants with weights, the first being the control, and a goal. Start it.

checkout-button
  control  Blue button   50%
  green    Green button  50%
goal: purchase

Ask for the variant

The tracker sends one exposure and tags later events with the variant.

logsure.variant('checkout-button',
  { id: user.id })
  .then((v) => render(v));

Read the results

In the console, the iPhone and Mac apps, the terminal, or from your AI assistant.

logsure                # then :lab
# or ask over MCP
get_experiment_results
list_flags  get_flag