Disclaimer: This website requires Please enable JavaScript in your browser settings for the best experience.

The availability of features may depend on your plan type. Contact your Customer Success Manager if you have any questions.

Dev guideRecipesAPI Reference
Dev guideAPI ReferenceUser GuideLegal TermsGitHubDev CommunityOptimizely AcademySubmit a ticketLog In
Dev guide

Use forced bucketing

How to use forced bucketing to put a user into a certain variation in Optimizely Feature Experimentation.

Forced bucketing lets you programmatically put a user into a variation from within your code.

The Forced Decision methods let you

  • Set the forced decision.
  • Get the forced decision.
  • Remove the forced decision.
  • Remove all forced decisions.

To force a user into a variation, call the SDK Forced Decision methods to test and debug various flows of your client applications by forcing users into a specific variation.

Unlike allowlisting, forced bucketing takes place immediately (meaning, without waiting for a datafile update) and has no limit on users that can be forced.

Example usage

See the following code examples for implementation information.

Client-side SDK examples

// Create the OptimizelyUserContext, passing in the UserId and Attributes
val user = optimizelyClient.createUserContext("user-id")

val flagContext = OptimizelyDecisionContext("flag-1", null)
val flagAndABTestContext = OptimizelyDecisionContext("flag-1", "exp-1")
val flagAndDeliveryRuleContext = OptimizelyDecisionContext("flag-1", "delivery-1")
val variationAForcedDecision = OptimizelyForcedDecision("variation-a")
val variationBForcedDecision = OptimizelyForcedDecision("variation-b")
val variationOnForcedDecision = OptimizelyForcedDecision("on")

// set a forced decision for a flag
var success = user!!.setForcedDecision(flagContext, variationAForcedDecision)
var decision = user.decide("flag-1")

// set a forced decision for an ab-test rule
success = user.setForcedDecision(flagAndABTestContext, variationBForcedDecision)
decision = user.decide("flag-1")

// set a forced variation for a delivery rule
success = user.setForcedDecision(flagAndDeliveryRuleContext, variationOnForcedDecision)
decision = user.decide("flag-1")

// get forced variations
val forcedDecision = user.getForcedDecision(flagContext)
println("[ForcedDecision] variationKey = " + forcedDecision!!.variationKey)

// remove forced variations
success = user.removeForcedDecision(flagAndABTestContext)
success = user.removeAllForcedDecisions()
/* Create the OptimizelyUserContext, passing in the UserId and Attributes */
OptimizelyUserContext user = optimizelyClient.createUserContext("user-id");

OptimizelyDecisionContext flagContext = new OptimizelyDecisionContext("flag-1", null);
OptimizelyDecisionContext flagAndABTestContext = new OptimizelyDecisionContext("flag-1", "exp-1");
OptimizelyDecisionContext flagAndDeliveryRuleContext = new OptimizelyDecisionContext("flag-1", "delivery-1");
OptimizelyForcedDecision variationAForcedDecision = new OptimizelyForcedDecision("variation-a");
OptimizelyForcedDecision variationBForcedDecision = new OptimizelyForcedDecision("variation-b");
OptimizelyForcedDecision variationOnForcedDecision = new OptimizelyForcedDecision("on");
        
// set a forced decision for a flag
Boolean success = user.setForcedDecision(flagContext, variationAForcedDecision);
OptimizelyDecision decision = user.decide("flag-1");

// set a forced decision for an ab-test rule
success = user.setForcedDecision(flagAndABTestContext, variationBForcedDecision);
decision = user.decide("flag-1");

// set a forced variation for a delivery rule
success = user.setForcedDecision(flagAndDeliveryRuleContext, variationOnForcedDecision);
decision = user.decide("flag-1");

// get forced variations
OptimizelyForcedDecision forcedDecision = user.getForcedDecision(flagContext);
System.out.println("[ForcedDecision] variationKey = " + forcedDecision.getVariationKey()); 

// remove forced variations
success = user.removeForcedDecision(flagAndABTestContext);
success = user.removeAllForcedDecisions();
/* Create the OptimizelyUserContext, passing in the UserId and Attributes */
var user = await optimizelyClient.createUserContext(userId: "user-id");

var flagContext = OptimizelyDecisionContext("flag-1");
var flagAndABTestContext = OptimizelyDecisionContext("flag-1", "exp-1");
var flagAndDeliveryRuleContext = OptimizelyDecisionContext("flag-1", "delivery-1");
var variationAForcedDecision = OptimizelyForcedDecision("variation-a");
var variationBForcedDecision = OptimizelyForcedDecision("variation-b");
var variationOnForcedDecision = OptimizelyForcedDecision("on");

// set a forced decision for a flag
var success = await user!.setForcedDecision(flagContext, variationAForcedDecision);
var decision = await user.decide("flag-1");

// set a forced decision for an ab-test rule
success = await user.setForcedDecision(flagAndABTestContext, variationBForcedDecision);
decision = await user.decide("flag-1");

// set a forced variation for a delivery rule
success = await user.setForcedDecision(flagAndDeliveryRuleContext, variationOnForcedDecision);
decision = await user.decide("flag-1");

// get forced variations
var forcedDecision = await user.getForcedDecision(flagContext);
print("[ForcedDecision] variationKey = ${forcedDecision.variationKey}");

// remove forced variations
success = await user.removeForcedDecision(flagAndABTestContext);
success = await user.removeAllForcedDecisions();
import { createInstance } from '@optimizely/optimizely-sdk';

const optimizely = createInstance({
  sdkKey: '<YOUR_SDK_KEY>'// Provide the sdkKey of your desired environment here
});

if (optimizely) {
  optimizely.onReady().then(({ success, reason }) => {
    if (!success) {
      throw new Error(reason);
    }

    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
  });
} else {
  // handle instantiation error
}
const { createInstance } = require('@optimizely/optimizely-sdk');

const optimizely = createInstance({
  sdkKey: '<YOUR_SDK_KEY>'// Provide the sdkKey of your desired environment here
});

if (optimizely) {
  optimizely.onReady().then(({ success, reason }) => {
    if (!success) {
      throw new Error(reason);
    }

    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
  });
} else {
  // handle instantiation error
}
import React from "react"; 
import { 
  createInstance, 
  OptimizelyProvider, 
  useDecision, 
  withOptimizely, 
} from "@optimizely/react-sdk"; 

const optimizely = createInstance({ 
   sdkKey: "<YOUR_SDK_KEY_HERE>", 
}); 

optimizely.onUserUpdate(() => { 
  // Wait for the user to be available before using forced decision methods. 
  optimizely.setForcedDecision({ flagKey: "product_sort" }, { variationKey: "treatment" });
}); 

const PurchaseButton = withOptimizely((props: any) => { 
  const handleClick = () => { 
    const { optimizely } = props; 
    optimizely.track("purchased"); 
  }; 
  return <div><button onClick={handleClick}>Purchase</button></div>; 
}); 

const RemoveForcedDecision = withOptimizely((props: any) => { 
  const handleClick = () => {
    const { optimizely } = props; 
    optimizely.removeForcedDecision({ flagKey: 'product_sort' });
  };
  return <div><button onClick={handleClick}>Remove Forced Decision</button></div>; 
});

const RemoveAllForcedDecisions = withOptimizely((props: any) => { 
  const handleClick = () => { 
    const { optimizely } = props; 
    optimizely.removeAllForcedDecisions(); 
  }; 
  return <div><button onClick={handleClick}>Remove All Forced Decisions</button></div>; 
}); 

function ProductSort() { 
  const [decision] = useDecision("product_sort", { 
    autoUpdate: true 
  }); 

  const variationKey = decision.variationKey;
  const isEnabled = decision.enabled;
  const sortMethod = decision.variables["sort_method"]; 

  return ( 
     <div> 
       {/* If variation is null, display error */} 
       {variationKey === null && <div className="error">{decision.reasons}</div>} 

       {/* If feature is enabled, do something with the Sort Method variable */} 
       {isEnabled && <div>The Sort method is {sortMethod}</div>} 

       {/* Show relevant component based on the variation key */} 
       {variationKey === "control" && <div>Control Component</div>} 
       {variationKey === "treatment" && <div>Treatment Component</div>} 

       {/* Show Purchase Button to track Purchase event */} 
       <PurchaseButton /> 
       <RemoveForcedDecision /> 
       <RemoveAllForcedDecisions /> 
     </div> 
  ); 
}

function App() { 
  return ( 
    <OptimizelyProvider 
      optimizely={optimizely} 
      user={{ 
        id: "user123", 
      }} 
    > 
      <ProductSort /> 
    </OptimizelyProvider> 
  ); 
} 

export default App;
import React from "react"; 
import { 
  createInstance, 
  OptimizelyProvider, 
  useDecision, 
  withOptimizely, 
} from "@optimizely/react-sdk"; 

const optimizely = createInstance({ 
   sdkKey: "<YOUR_SDK_KEY_HERE>", 
}); 

optimizely.onUserUpdate(() => { 
  // Wait for the user to be available before using forced decision methods. 
  optimizely.setForcedDecision({ flagKey: "product_sort" }, { variationKey: "treatment" });
}); 

const PurchaseButton = withOptimizely((props: any) => { 
  const handleClick = () => { 
    const { optimizely } = props; 
    optimizely.track("purchased"); 
  }; 
  return <div><button onClick={handleClick}>Purchase</button></div>; 
}); 

const RemoveForcedDecision = withOptimizely((props: any) => { 
  const handleClick = () => {
    const { optimizely } = props; 
    optimizely.removeForcedDecision({ flagKey: 'product_sort' });
  };
  return <div><button onClick={handleClick}>Remove Forced Decision</button></div>; 
});

const RemoveAllForcedDecisions = withOptimizely((props: any) => { 
  const handleClick = () => { 
    const { optimizely } = props; 
    optimizely.removeAllForcedDecisions(); 
  }; 
  return <div><button onClick={handleClick}>Remove All Forced Decisions</button></div>; 
}); 

function ProductSort() { 
  const [decision] = useDecision("product_sort", { 
    autoUpdate: true 
  }); 

  const variationKey = decision.variationKey;
  const isEnabled = decision.enabled;
  const sortMethod = decision.variables["sort_method"]; 

  return ( 
     <div> 
       {/* If variation is null, display error */} 
       {variationKey === null && <div className="error">{decision.reasons}</div>} 

       {/* If feature is enabled, do something with the Sort Method variable */} 
       {isEnabled && <div>The Sort method is {sortMethod}</div>} 

       {/* Show relevant component based on the variation key */} 
       {variationKey === "control" && <div>Control Component</div>} 
       {variationKey === "treatment" && <div>Treatment Component</div>} 

       {/* Show Purchase Button to track Purchase event */} 
       <PurchaseButton /> 
       <RemoveForcedDecision /> 
       <RemoveAllForcedDecisions /> 
     </div> 
  ); 
}

function App() { 
  return ( 
    <OptimizelyProvider 
      optimizely={optimizely} 
      user={{ 
        id: "user123", 
      }} 
    > 
      <ProductSort /> 
    </OptimizelyProvider> 
  ); 
} 

export default App;
let optimizely = OptimizelyClient(sdkKey: “sdk-key”)
optimizely.start(datafile: datafile)
let user = optimizely.createUserContext(userId: “test-user”, attributes: attributes)

let flagContext = OptimizelyDecisionContext(flagKey: "flag-1")
let flagAndABTestContext = OptimizelyDecisionContext(flagKey: "flag-1", ruleKey: "ab-test-1")
let flagAndDeliveryRuleContext = OptimizelyDecisionContext(flagKey: "flag-1", ruleKey: "delivery-1")
let variationAForcedDecision = OptimizelyForcedDecision(variationKey: "variation-a")
let variationBForcedDecision = OptimizelyForcedDecision(variationKey: "variation-b")
let variationOnForcedDecision = OptimizelyForcedDecision(variationKey: "on")
        
// set a forced decision for a flag
var success = user.setForcedDecision(context: flagContext, decision: variationAForcedDecision)
decision = user.decide(key: "flag-1")

// set a forced decision for an ab-test rule
success = user.setForcedDecision(context: flagAndABTestContext, decision: variationBForcedDecision)
decision = user.decide(key: "flag-1")

// set a forced variation for a delivery rule
success = user.setForcedDecision(context: flagAndDeliveryRuleContext, decision: variationOnForcedDecision)
decision = user.decide(key: "flag-1")

// get forced variations
let forcedDecision = user.getForcedDecision(context: flagContext)
print("[ForcedDecision] variationKey = \(forcedDecision!.variationKey)")

// remove forced variations
success = user.removeForcedDecision(context: flagAndABTestContext)
success = user.removeAllForcedDecisions()

Server-side SDK examples

var Optimizely = OptimizelyFactory.NewDefaultInstance("<your sdk key>");
var attributes = new UserAttributes();
var user = Optimizely.CreateUserContext(RandomUserId(), attributes);

var flagContext = new OptimizelyDecisionContext("flag-1", null);
var flagAndABTestContext = new OptimizelyDecisionContext("flag-1", "ab-test-1");
var flagAndDeliveryRuleContext = new OptimizelyDecisionContext("flag-1", "delivery-1");
var variationAForcedDecision = new OptimizelyForcedDecision("variation-a");
var variationBForcedDecision = new OptimizelyForcedDecision("variation-b");
var variationOnForcedDecision = new OptimizelyForcedDecision("on");

// set a forced decision for a flag
var success = user.SetForcedDecision(flagContext, variationAForcedDecision);
var decision = user.Decide("flag-1");

// set a forced decision for an ab-test rule
success = user.SetForcedDecision(flagAndABTestContext, variationBForcedDecision);
decision = user.Decide("flag-1");

// set a forced variation for a delivery rule
success = user.SetForcedDecision(flagAndDeliveryRuleContext, variationOnForcedDecision);
decision = user.Decide("flag-1");

// get forced variations
var forcedDecision = user.GetForcedDecision(flagContext);
Console.WriteLine(string.Format("ForcedDecision variationKey = {0}", forcedDecision.VariationKey));

// remove forced variations
success = user.RemoveForcedDecision(flagAndABTestContext);
success = user.RemoveAllForcedDecisions();
factory := &client.OptimizelyFactory{SDKKey: "sdk-key"}
if optimizely, err := factory.StaticClient(); err == nil {
  user := optimizely.CreateUserContext("test-user", map[string]interface{}{})

  flagContext := decision.OptimizelyDecisionContext{FlagKey: "flag-1"}
  flagAndABTestContext := decision.OptimizelyDecisionContext{FlagKey: "flag-1", RuleKey: "ab-test-1"}
  flagAndDeliveryRuleContext := decision.OptimizelyDecisionContext{FlagKey: "flag-1", RuleKey: "delivery-1"}
  variationAForcedDecision := decision.OptimizelyForcedDecision{VariationKey: "variation-a"}
  variationBForcedDecision := decision.OptimizelyForcedDecision{VariationKey: "variation-b"}
  variationOnForcedDecision := decision.OptimizelyForcedDecision{VariationKey: "on"}

  // set a forced decision for a flag
  success := user.SetForcedDecision(flagContext, variationAForcedDecision)
  decision := user.Decide("flag-1", nil)

  // set a forced decision for an ab-test rule
  success = user.SetForcedDecision(flagAndABTestContext, variationBForcedDecision)
  decision = user.Decide("flag-1", nil)

  // set a forced variation for a delivery rule
  success = user.SetForcedDecision(flagAndDeliveryRuleContext, variationOnForcedDecision)
  decision = user.Decide("flag-1", nil)

  // get forced variations
  if forcedDecision, err := user.GetForcedDecision(flagContext); err == nil {
    fmt.Println("[ForcedDecision] variationKey = " + forcedDecision.VariationKey)
  }

  // remove forced variations
  success = user.RemoveForcedDecision(flagAndABTestContext)
  success = user.RemoveAllForcedDecisions()
}
/* Create the Optimizely instance and provide the sdk-key */
Optimizely optimizely = OptimizelyFactory.newDefaultInstance("sdk-key");
/* Create the OptimizelyUserContext, passing in the UserId and Attributes */
OptimizelyUserContext user = optimizely.createUserContext("user-id", Collections.emptyMap());

OptimizelyDecisionContext flagContext = new OptimizelyDecisionContext("flag-1");
OptimizelyDecisionContext flagAndABTestContext = new OptimizelyDecisionContext("flag-1", "ab-test-1");
OptimizelyDecisionContext flagAndDeliveryRuleContext = new OptimizelyDecisionContext("flag-1", "delivery-1");
OptimizelyForcedDecision variationAForcedDecision = new OptimizelyForcedDecision("variation-a");
OptimizelyForcedDecision variationBForcedDecision = new OptimizelyForcedDecision("variation-b");
OptimizelyForcedDecision variationOnForcedDecision = new OptimizelyForcedDecision("on");
        
// set a forced decision for a flag
Boolean success = user.setForcedDecision(flagContext, variationAForcedDecision);
OptimizelyDecision decision = user.decide("flag-1");

// set a forced decision for an ab-test rule
success = user.setForcedDecision(flagAndABTestContext, variationBForcedDecision);
decision = user.decide("flag-1");

// set a forced variation for a delivery rule
success = user.setForcedDecision(flagAndDeliveryRuleContext, variationOnForcedDecision);
decision = user.decide("flag-1");

// get forced variations
OptimizelyForcedDecision forcedDecision = user.getForcedDecision(flagContext);
System.out.println("[ForcedDecision] variationKey = " + forcedDecision.getVariationKey()); 

// remove forced variations
success = user.removeForcedDecision(flagAndABTestContext);
success = user.removeAllForcedDecisions();
$optimizelyClient = OptimizelyFactory::createDefaultInstance($sdkKey);

$user = $optimizelyClient->createUserContext('test_user', $attributes);

$flagContext = new OptimizelyDecisionContext('flag-1', null);
$flagAndABTestContext = new OptimizelyDecisionContext('flag-1', 'ab-test-1');
$flagAndDeliveryRuleContext = new OptimizelyDecisionContext('flag-1', 'delivery-1');
$variationAForcedDecision = new OptimizelyForcedDecision('variation-a');
$variationBForcedDecision = new OptimizelyForcedDecision('variation-b');
$variationOnForcedDecision = new OptimizelyForcedDecision('on');

# set a forced decision for a flag
$success = $user->setForcedDecision($flagContext, $variationAForcedDecision);
$decision = $user->decide('flag-1');

# set a forced decision for an ab-test rule
$success = $user->setForcedDecision($flagAndABTestContext, $variationBForcedDecision);
$decision = $user->decide('flag-1');

# set a forced variation for a delivery rule
$success = $user->setForcedDecision($flagAndDeliveryRuleContext, $variationOnForcedDecision);
$decision = $user->decide('flag-1');

# get forced variations
$forcedDecision = $user->getForcedDecision($flagContext);
echo "[ForcedDecision] variationKey = {$forcedDecision}";

# remove forced variations
$success = $user->removeForcedDecision($flagAndABTestContext);
$success = $user->removeAllForcedDecisions();
from optimizely import optimizely, optimizely_user_context

optimizely_client = optimizely.Optimizely(sdk_key="<YOUR_SDK_KEY>")

user = optimizely_client.create_user_context("test_user", attributes)

flag_context = optimizely_user_context.OptimizelyUserContext.OptimizelyDecisionContext("flag-1",None)
flag_and_ab_test_context = optimizely_user_context.OptimizelyUserContext.OptimizelyDecisionContext("flag-1","ab-test-1")
flag_and_delivery_rule_context = optimizely_user_context.OptimizelyUserContext.OptimizelyDecisionContext("flag-1","delivery-1")
variation_a_forced_decision = optimizely_user_context.OptimizelyUserContext.OptimizelyForcedDecision("variation-a")
variation_b_forced_decision = optimizely_user_context.OptimizelyUserContext.OptimizelyForcedDecision("variation-b")
variation_on_forced_decision = optimizely_user_context.OptimizelyUserContext.OptimizelyForcedDecision("on")

# set a forced decision for a flag
success = user.set_forced_decision(flag_context, variation_a_forced_decision)
decision = user.decide("flag-1")

# set a forced decision for an ab-test rule
success = user.set_forced_decision(flag_and_ab_test_context, variation_b_forced_decision)
decision = user.decide("flag-1")

# set a forced variation for a delivery rule
success = user.set_forced_decision(flag_and_delivery_rule_context, variation_on_forced_decision)
decision = user.decide("flag-1")

# get forced variations
forced_decision = user.get_forced_decision(flag_context)
print(f"[ForcedDecision] variation_key = {forced_decision}")

# remove forced variations
success = user.remove_forced_decision(flag_and_ab_test_context)
success = user.remove_all_forced_decision()
require 'optimizely'
require 'optimizely/optimizely_factory'

optimizely = Optimizely::OptimizelyFactory.default_instance('sdk_key')

user = optimizely.create_user_context('test_user', attributes)

flag_context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new('flag-1', nil)
flag_and_ab_test_context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new('flag-1','ab-test-1')
flag_and_delivery_rule_context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new('flag-1','delivery-1')
variation_a_forced_decision = Optimizely::OptimizelyUserContext::OptimizelyForcedDecision.new('variation-a')
variation_b_forced_decision = Optimizely::OptimizelyUserContext::OptimizelyForcedDecision.new('variation-b')
variation_on_forced_decision = Optimizely::OptimizelyUserContext::OptimizelyForcedDecision.new('on')

# set a forced decision for a flag
success = user.set_forced_decision(flag_context, variation_a_forced_decision)
decision = user.decide('flag-1')

# set a forced decision for an ab-test rule
success = user.set_forced_decision(flag_and_ab_test_context, variation_b_forced_decision)
decision = user.decide('flag-1')

# set a forced variation for a delivery rule
success = user.set_forced_decision(flag_and_delivery_rule_context, variation_on_forced_decision)
decision = user.decide('flag-1')

# get forced variations
forced_decision = user.get_forced_decision(flag_context)
puts "[ForcedDecision] variation_key = #{forced_decision}"

# remove forced variations
success = user.remove_forced_decision(flag_and_ab_test_context)
success = user.remove_all_forced_decisions