The Picklist Extension Pricing enrichment

  • Release version: Australia
  • Updated March 12, 2026
  • 2 minutes to read
  • Summarize
    Summarized using AI
    This content was generated using new OpenAI-powered functionality. Results are provided on an as is basis and are not guaranteed to be accurate or complete.

    Summary of The Picklist Extension Pricing enrichment

    The Picklist Extension Pricing enrichment in ServiceNow CPQ allows dynamic adjustment of pricing for Field Options within picklist extension fields based on factors like location. This feature is useful for tailoring prices such as those dependent on ZIP code or applying multipliers and discounts at a granular picklist option level.

    Show full answer Show less

    Prerequisites

    • A support case must be submitted to enable the enrichment in your environment, including a clear use case.
    • Picklist extension fields must have the "Enable for enrichment" toggle activated to be affected by this pricing enrichment.
    • The enrichments tab becomes visible when accessing a blueprint in the ServiceNow CPQ Admin interface.

    Key Functionality and Usage

    The enrichment uses scripting to:

    • Iterate through picklist options and collect their values.
    • Perform lookups against pricing tables based on location (e.g., ZIP code) and option values.
    • Apply price multipliers or discounts dynamically to relevant picklist options.
    • Set the calculated prices back into the picklist extension request object (pleRequest), enabling customized pricing per option.

    The scripting model references elements such as pleRequest.fieldVariableName, pleRequest.optionValue, and pleRequest.price to identify and update pricing for each picklist option. This approach supports complex pricing scenarios like ZIP code dependent pricing, independent component pricing, and delta pricing.

    Practical Benefits for ServiceNow Customers

    • Enables fine-tuned control over product pricing within picklist extensions tailored to customer location or other criteria.
    • Supports multi-factor pricing adjustments, improving pricing accuracy and competitiveness.
    • Integrates seamlessly within ServiceNow CPQ blueprints for consistent administration and maintenance.
    • Provides flexibility to implement use cases such as price multipliers, discounts, or subtractive component pricing efficiently.

    Next Steps

    • Submit a support case via the ServiceNow Support portal to enable this enrichment in your environment.
    • Activate the enrichment toggle on desired picklist extension fields.
    • Customize your enrichment script to incorporate your pricing logic, referencing the provided scripting examples as a foundation.
    • Test the enrichment in your CPQ blueprint to ensure pricing adjusts correctly based on your defined criteria.

    Use the Picklist Extension Pricing enrichment to adjust pricing according to location or other factors.

    The Picklist Extension Pricing enrichment can be used to dynamically change the pricing of Field Options in designated picklist extension fields.

    Prerequisites

    Submit a support case requesting the enrichment be enabled for your environment. Please provide a use case for using the enrichment. To submit a support case, use the ServiceNow Support portal. For step-by-step instructions, see Create a case on Now Support for CPQ Customers.

    Picklist extension fields need to have the "Enable for enrichment" toggle turned on to be affected by the enrichment.

    Picklist extension fields

    The enrichments tab will be shown when navigating to a blueprint in the ServiceNow CPQ Admin.

    Picklist extension fields

    Watch this demonstration of the Picklist Extension Pricing enrichment in action.

    PLE enrichment Script Demo

    Demonstration script

    The following script was used in the demonstration video.

    let sourcesArr = [];
    let componentArr = [];
    let accessoryArr = [];
    
    pleRequest.forEach(o => {
        if(o.fieldVariableName == "alternateEnergySources") {
            sourcesArr.push(o.optionValue);
            //o.price = "1000";
        }
        if(o.fieldVariableName == "alternateEnergyComponents") {
            componentArr.push(o.optionValue);
            //o.price = "900";
        }
        if(o.fieldVariableName == "alternateEnergyAccessory") {
            accessoryArr.push(o.optionValue);
            //o.price = "800";
        }
    });
    
    var sourceMap = new Map();
    if(sourcesArr != null && sourcesArr.length != 0) {
        var sourceRows = lookup("Select Energy, BasePrice from AlternateEnergyPricing where Zip = :zip and Energy IN (:value)", { "zip": cfg.zipCode, "value": sourcesArr });
        for (var row of sourceRows) {
            sourceMap.set(row.get("Energy"), row.get("BasePrice"));
        }
    } else {    //source PLE not part of request. So populate this map for other PLEs 
        console.log("Entered non PLE in request case");
        sourcesArr = ["Solar", "Wind", "Nuclear"];
        var sourceRows = lookup("Select Energy, BasePrice from AlternateEnergyPricing where Zip = :zip and Energy IN (:value)", { "zip": cfg.zipCode, "value": sourcesArr });
        for (var row of sourceRows) {
            sourceMap.set(row.get("Energy"), row.get("BasePrice")); 
        }
        console.log(sourcesArr);
        console.log(sourceMap);
    }
    
    var multiplierMap = new Map();
    if(cfg.alternateEnergySources != "") {
        var multiplierRows = lookup("Select Group, Factor from AlternateEnergyMultiplier where Zip = :zip and Energy = :energyVal", { "zip": cfg.zipCode, "energyVal": cfg.alternateEnergySources });
        for (var row of multiplierRows) {
            multiplierMap.set(row.get("Group"), row.get("Factor"));
        }
    }
    let sourcePrice = sourceMap.get(cfg.alternateEnergySources);
    if(sourcePrice != null) {
            pleRequest.forEach(o => {
            if(o.fieldVariableName == "alternateEnergySources") {
                o.price = sourceMap.get(o.optionValue);
            }
            if(o.fieldVariableName == "alternateEnergyComponents") {
                let compPrice = multiplierMap.get("Component");
                if(compPrice != null) {
                    o.price = sourcePrice*compPrice;
                }
            }
            if(o.fieldVariableName == "alternateEnergyAccessory") {
                let multA = multiplierMap.get("Accessory");
                if(multA != null) {
                    o.price = sourcePrice*multA;
                }
            }
        });
    }
    
    console.log(sourcesArr);
    console.log(componentArr);
    console.log(accessoryArr);
    console.log(sourceMap);
    console.log(multiplierMap);
    
    return pleRequest;

    Sample design, use cases, and pleRequest elements

    Sample enrichment script design:

    1. Loop through picklist options and store them for reference later (pleRequest.forEach())
    2. Get prices for options and store them (either via table lookup or in the function itself)
    3. Set the price for the right option (pleRequest.forEach())

    Use cases:

    • ZIP code dependent pricing
    • Price multipliers and discounts
    • Delta pricing
    • Independent component pricing subtraction

    pleRequest elements:

    • pleRequest.fieldVariableName: variable name of the picklist field
    • pleRequest.optionValue: picklist options defined in the field
    • pleRequest.productId: ID of the product in the PLE mapping
    • pleRequest.price: price to be set in the extension

    Referencing elements in the pleRequest object is similar to referencing objects such as ProductList, cfg, and cfgRequest. If a variable is substituted into pleRequest (either in a for loop or using the forEach function), the element is still referenced after the variable, followed by a period.