---
title: Forced decision methods for the JavaScript SDK v6+
slug: feature-experimentation/docs/forced-decision-methods-for-the-javascript-sdk
docTags: 
createdAt: 2026-08-05T20:39:53.000Z
---

These methods help test and debug various flows of your client applications by forcing users into a specific variation.

The JavaScript SDK checks forced decisions before making any decisions. If a matching item is found for the requested flag, [audience conditions](docId\:UDBvr5a8WHNkyOqzPhOr9) and traffic allocation are ignored, and the SDK returns the forced decision immediately before making normal decisions.

## Minimum SDK version

v6.0.0+

For versions 5.3.5 and below, see [JavaScript (Browser) SDK](docId:_tJtaK1gdRH1Glk5esaAn) or [JavaScript (Node) SDK](docId\:W54yp5v6sAJ7qgtGhaa1P). See the [SDK compatibility matrix](docId:2shbZfPCkPAZ0mlZpL1TU) documentation for a list of current SDK releases and the features they support.

## Scenarios

The JavaScript SDK checks for forced decisions at the start of each decision process. If a matching forced decision is found, it returns the decision immediately.

- **Flag-to-Decision** – The SDK checks at the start of any decide call for the given flag.
- **Experiment-Rule-to-Decision** – The SDK checks at the start of the decision for the given experiment rule of the flag key.
- **Delivery-Rule-to-Decision** – The SDK checks at the start of the decision for the given delivery rule of the flag key.

:::hint{type="danger"}
**Warning**
You must associate your variations to a [flag rule](docId:-yq2-thNRv7-SgwCXpG90) before calling any forced decision methods.
:::

On forced decisions, the JavaScript SDK fires impression events and notifications just like other normal decisions (unless disabled by the [disableDecisionEvent](docId\:SlmvozhQJ1rmI6AIIoqql) option).

:::hint{type="info"}
**Note**
These forced decisions are not persistent and are cleared when the [OptimizelyUserContext](docId\:OExtupzmm3AyVp8uWgIoC) is re-initialized.
:::

## Version

6.0.0 and higher

## `OptimizelyDecisionContext`

```typescript
export interface OptimizelyDecisionContext {
  flagKey: string;
  ruleKey?: string;
}
```

## `OptimizelyForcedDecision`

```typescript
export interface OptimizelyForcedDecision {
  variationKey: string;
}
```

## Set forced decision method (`setForcedDecision()`)

Sets a forced decision (`variationKey`) for a given `OptimizelyDecisionContext`.

### Parameters

This table lists the required and optional parameters for the JavaScript SDK.

| Parameter                  | Type      | Description                                                                                                                                  |
| -------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **context** \*required\*   | Interface | An instance of \`OptimizelyDecisionContext\` with the required \`flagKey\` and optional \`ruleKey\` for the forced decision you want to set. |
| **decision**\ \*required\* | Interface | An instance of \`OptimizelyForcedDecision\` with the required \`variationKey\` for the forced decision you want to set.                      |

### Returns

A boolean value that indicates if setting the forced decision (`variationKey`) was completed.

### Example

See the [full code example section](docId\:MlXiOVZlcD2IxEB1asphL).

## Get Forced Decision Method (`getForcedDecision()`)

Returns the forced decision (`variationKey`) for a given `OptimizelyDecisionContext`. Returns the `OptimizelyForcedDecision` instance or null if there is no matching item.

### Parameters

This table lists the required and optional parameters for the JavaScript SDK.

| Parameter                | Type      | Description                                                                                                                                  |
| ------------------------ | --------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **context** \*required\* | Interface | An instance of \`OptimizelyDecisionContext\` with the required \`flagKey\` and optional \`ruleKey\` for the forced decision you want to get. |

### Returns

A forced decision `OptimizelyForcedDecision` instance for the context or null if there is no matching item.

### Example

See the [full code example section](docId\:MlXiOVZlcD2IxEB1asphL).

## Remove forced decision method (`removeForcedDecision()`)

Removes the forced decision (`variationKey`) for a given `OptimizelyDecisionContext`.

### Parameters

This table lists the required and optional parameters for the JavaScript SDK.

| Parameters               | Type      | Description                                                                                                                                     |
| ------------------------ | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| **context** \*required\* | Interface | An instance of \`OptimizelyDecisionContext\` with the required \`flagKey\` and optional \`ruleKey\` for the forced decision you want to remove. |

### Returns

A success or failure boolean status if the forced decision (`variationKey`) was removed.

### Example

See the [full code example section](docId\:MlXiOVZlcD2IxEB1asphL).

## Remove all forced decisions method (`removeAllForcedDecisions()`)

### Parameters

There are no required parameters for `removeAllForcedDecisions()`.

### Returns

A success or failure boolean status.

### Example

See the [full code example](docId\:MlXiOVZlcD2IxEB1asphL).

## Full code example

```javascript
import { createInstance, createPollingProjectConfigManager } from '@optimizely/optimizely-sdk';

const SDK_KEY = "YOUR_SDK_KEY";

const pollingConfigManager = createPollingProjectConfigManager({
  sdkKey: SDK_KEY,
});

const optimizely = createInstance({
  projectConfigManager: pollingConfigManager,
});


optimizely.onReady().then(() => {
  const attributes = { logged_in: true };
  const user = optimizely.createUserContext('user123', attributes);
  if (!user) {
    throw new Error('failed to create user context');
  }

  let result, decision, forcedDecision;

  // set a forced decision for a flag
  result = user.setForcedDecision({flagKey: 'flag-1'}, {variationKey: 'off'});
  decision = user.decide('flag-1');

  // set a forced decision for an ab-test rule
  result = user.setForcedDecision({flagKey: 'flag-2', ruleKey: 'ab-test-1'}, {variationKey: 'variation-b'});
  decision = user.decide('flag-2');

  // set a forced variation for a delivery rule
  result = user.setForcedDecision({flagKey: 'flag-3', ruleKey: 'delivery-1'}, {variationKey: 'on'});
  decision = user.decide('flag-3');

  // get forced variations
  forcedDecision = user.getForcedDecision({flagKey: 'flag-2'});

  // remove forced variations
  result = user.removeForcedDecision({flagKey: 'flag-2', ruleKey: 'ab-test-1'});
  user.removeAllForcedDecisions();
  user.decideAll();

}).catch((err) => {
  console.log(err);
  // handle error
});
```

## See also

[OptimizelyUserContext](docId\:OExtupzmm3AyVp8uWgIoC)
