# A/B holdout

> Measure TryYourSize's effect on size-related returns. A share of visitors sees no element; the holdout is never metered.

Source: https://docs.tryyoursize.com/guides/ab-holdout/

An A/B holdout shows you, with your own orders, how size-related returns compare **with and without** TryYourSize. A share of your visitors (the **holdout**) sees no TryYourSize element at all; everyone else (the **treatment**) sees it as usual.

## Start an experiment

In **Studio → Results**, start an experiment and choose the holdout share: **10–50 %** of visitors. One experiment runs per store at a time. Stopping it shows TryYourSize to everyone again; the results stay.

Nothing changes in your code: TryYourSize.js reads the running experiment and applies it.

## What the SDK does

- **Assignment:** a random anonymous visitor ID in your site's own `localStorage` (`tys_vid`). It is first-party to your shop, not shared across shops, not a cookie on our domain, and never linked to a shopper account. The arm is a deterministic hash of the experiment's salt and that ID, so a visitor stays in the same arm.
- **Holdout:** nothing is rendered: no element, no status frame, no window. `recommendation()` and `getRecommendation()` answer `unavailable` with no size, and `recommendationHandle()` answers `null`, so your own preselection and your server do not leak TryYourSize into the holdout. `ready` never fires.
- **No experiment, or our API unreachable:** everyone sees TryYourSize (such visitors are not counted in either arm).
- Demo mode is never part of an experiment.

## Send the visitor ID with orders

To attribute an order to its arm, save the visitor ID with the cart and send it with the order:

```ts
const assignment = await tys.experiment();   // { experimentId, arm, visitorId } | null
if (assignment) saveToCart("tys_vid", assignment.visitorId);
```

Then send it as `visitor_id` in [`POST /v1/orders`](https://docs.tryyoursize.com/guides/outcomes.md). TryYourSize recomputes the arm from the ID; it stores only a hash of it. If you cannot send the ID, send `experiment_arm` (`treatment` or `holdout`). On Shopify, the theme block writes the ID as the hidden line property `_tys_vid` for you.

## Billing

The holdout renders nothing, so it never creates a fit check, a try-on or a window session: **holdout traffic is never metered**.

## Reading the results

Studio → Results shows the size-related return rate per arm with 95 % intervals, the difference and whether it is significant, the sample still needed when there is not enough data yet, and a warning when the observed split does not match the configured one. "Followed the recommendation vs not" is shown too, labelled as observational. The methods are written on the page and in the CSV export.
