Sample scripts

  • Release version: Australia
  • Updated March 12, 2026
  • 3 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 Sample scripts

    This collection of sample scripts provides ServiceNow CPQ customers with practical code examples to address common configuration and customization needs within the platform. The scripts demonstrate how to determine CPU core counts, build descriptive text fields, manage product rule logic, handle arrays and maps, and manipulate field values for product configuration and order processing.

    Show full answer Show less

    Key Features

    • CPU Core Count Calculations: Scripts show how to calculate quantities of 64, 32, 16, 8, and 1 vCPU configurations based on estimated compute capacity and allowed CPU cores.
    • Text Field Construction: Example code concatenates CPU core counts into formatted multiline strings for display or logging.
    • Product Rule Scripts: Demonstrates retrieving product details from a lookup query, populating product list objects with properties like quantity, bill of materials (BOM) type, unit of measure, and parent product ID, and iterating to replicate items as needed.
    • Loop-based Product List Population: Shows how to repeatedly add product line items with conditional BOM types depending on provisioning flags, supporting scalable configurations.
    • Working with Arrays and Maps: Illustrates querying product information based on arrays of product IDs, mapping unique identifiers to BOM types, and evaluating conditions across all items.
    • Field Value Manipulation: Provides methods to split multi-select picklist values from Salesforce and synchronize them with ServiceNow CPQ fields, concatenate multiple field values into strings, and simulate a “contains” function to execute conditional logic based on string content.

    Practical Application for ServiceNow Customers

    These sample scripts enable customers to efficiently implement and customize configurations in ServiceNow CPQ by:

    • Automating complex calculations related to CPU core provisioning, improving accuracy and reducing manual effort.
    • Generating user-friendly summaries and notes that reflect the configuration details for display and documentation.
    • Implementing dynamic product rules that integrate with external product data and support hierarchical BOM structures.
    • Handling multiple product instances flexibly through loops, which is essential for scaling configurations and provisioning orders.
    • Integrating data from Salesforce multi-select picklists to ensure synchronized and accurate configuration states.
    • Utilizing JavaScript string and array functions to customize logic conditions and data transformations within the CPQ environment.

    By adapting these scripts, ServiceNow customers can streamline their product configuration workflows, enhance integration with external systems, and ensure consistent and scalable order processing.

    View a selection of commonly requested sample scripts.

    This article shows some commonly requested sample scripts.

    Sample number field determination:

    var count64 = 0;
    var count32 = 0;
    var perCoreProcessing = 40; //assuming 8 processors with 5 TFlops compute
    var cpu64Processing = 64*perCoreProcessing;
    var cpu32Processing = 32*perCoreProcessing;
    var cpu16Processing = 16*perCoreProcessing;
    var remainingCompute = cfg.estPeakOps;
    if(cfg.allowCPU64 == true) { //64 core allowed so divide by that
    	count64 = remainingCompute/cpu64Processing;
    	remainingCompute = remainingCompute%cpu64Processing;
    }
    if(cfg.allowCPU32 == true) {
    	count32 = remainingCompute/cpu32Processing;
    	remainingCompute = remainingCompute%cpu32Processing;
    }
    return count32;

    Sample text field determination:

    var retStr = "";
    retStr = retStr + "64 vCPUs: " + Math.round(cfg.cpu64Count);
    retStr = retStr + "\\n32 vCPUs: " + Math.round(cfg.cpu32Count);
    retStr = retStr + "\\n16 vCPUs: " + Math.round(cfg.cpu16Count);
    retStr = retStr + "\\n8 vCPUs: " + Math.round(cfg.cpu8Count);
    retStr = retStr + "\\n1 vCPUs: " + Math.round(cfg.cpu1Count);
    return retStr;

    Sample product rule script:

    //Base Product
    var baseProductP2ID = "BP_ID";
    var inputs = {"g2BaseProduct": cfg.g2BaseProduct};
    var resultSet = lookup("SELECT Product2Id, ProductName FROM Dummytable WHERE ProductCode = :g2BaseProduct", inputs);
    for (var row of resultSet) {
    	ProductList.id = row.get("Product2Id");
    	ProductList.quantity = cfg.orderQty;
    	ProductList.bomType = "SALES";
    	ProductList.uom = "EA";
    	ProductList.level = 1;
    	ProductList.notes = row.get("ProductName");
    	ProductList.parentProduct = "01t5f000000uJgoAAE"; //parent product identifier. In this case top product being configured from SFDC
    	baseProductP2ID = row.get("Product2Id");
    	ProductList.uniqueIdentifier = baseProductP2ID; //Parent
    	...SF ProductID; not req'd if this has no other children
    	ProductList.next();
    	break;
    }

    Sample product rule script with for loop:

    //var timesReplicate = cfg.numberOfComputeClusters; //this doesn't work yet.. If it does, we will replicate that many times easier
    var timesReplicate = [1,1,1,1,1,1,1,1,1,1]; //dummy 10 times loop based on 10x boolean true, Double loop for 100
    for (var parentStep of timesReplicate) {
    	for (var step of timesReplicate) {
    		if(cfg.cpu16Count > 0) {
    			ProductList.id = "01t5f000000v50CAAQ";
    			ProductList.quantity=Math.round(cfg.cpu16Count);
    			ProductList.notes="Provisioning " + Math.round(cfg.cpu16Count) + " number of 16 core vCPUs";
    			if(cfg.sendDirectlyToProvisioning == true) {
    				ProductList.bomType = "Manufacturing";
    				ProductList.level = 2;
    			} else {
    				ProductList.bomType = "SALES";
    			}
    			ProductList.next();
    		}
    		if(cfg.cpu8Count > 0) {
    			ProductList.id = "01t5f000000v50DAAQ";
    			ProductList.quantity=Math.round(cfg.cpu8Count);
    			ProductList.notes="Provisioning " + Math.round(cfg.cpu8Count) + " number of 8 core vCPUs";
    			if(cfg.sendDirectlyToProvisioning == true) {
    				ProductList.bomType = "Manufacturing";
    				ProductList.level = 2;
    			} else {
    				ProductList.bomType = "SALES";
    			}
    			ProductList.next();
    		}
    		if(cfg.cpu32Count > 0) {
    			ProductList.id = "01t5f000000v50BAAQ";
    			ProductList.quantity=Math.round(cfg.cpu32Count);
    			ProductList.notes="Provisioning " + Math.round(cfg.cpu32Count) + " number of 32 core vCPUs";
    			if(cfg.sendDirectlyToProvisioning == true) {
    				ProductList.bomType = "Manufacturing";
    				ProductList.level = 2;
    			} else {
    				ProductList.bomType = "SALES";
    			}
    			ProductList.next();
    		}
    		if(cfg.cpu64Count > 0) {
    			ProductList.id = "01t5f000000v50JAAQ";
    			ProductList.quantity=Math.round(cfg.cpu64Count);
    			ProductList.notes="Provisioning " + Math.round(cfg.cpu64Count) + " number of 64 core vCPUs";
    			if(cfg.sendDirectlyToProvisioning == true) {
    				ProductList.bomType = "Manufacturing";
    				ProductList.level = 2;
    			} else {
    				ProductList.bomType = "SALES";
    			}
    			ProductList.next();
    		}
    		if(cfg.cpu1Count > 0) {
    			ProductList.id = "01t5f000000v50SAAQ";
    			ProductList.quantity=Math.round(cfg.cpu1Count);
    			ProductList.notes="Provisioning " + Math.round(cfg.cpu1Count) + " number of 1 core vCPUs";
    			if(cfg.sendDirectlyToProvisioning == true) {
    				ProductList.bomType = "Manufacturing";
    				ProductList.level = 2;
    			} else {
    				ProductList.bomType = "SALES";
    			}
    			ProductList.next();
    		}
    	}
    }
    console.log("Added line items 100 times");
    return ProductList;

    Sample array and map functions:

    var productidArr = ["test123", "chtest123"];
    var inputs = {"productids": productidArr};
    var resultSet = lookup("SELECT uniqueidentifier, bomtype FROM bominformation WHERE productid IN (:productids)", inputs);
    
    var prodTypeMap = new Map();
    for (var row of resultSet) {
    	prodTypeMap.set(row.get("uniqueidentifier"), row.get("bomtype"));
    }
    var itemTypeManuf = productidArr.every((value) => {return prodTypeMap.get(value) != "Manufacturing";});
    if (isGood == false) {
    	return "Sales type item found";
    }
    var summary = "";
    productidArr.forEach((item, index) => {summary += index + " " + item + ". ";});
    return summary;

    How to pull multi-select picklist values from SFDC to twinned multi-select picklist field in ServiceNow CPQ in the On Configure/Reconfigure enrichment:

    let x = (cfgRequest.yourTwinnedLogikField.value).split(";");
    cfgRequest.yourTwinnedLogikField.set("value", x);
    return cfgRequest;

    How to concatenate field values into a string:

    stringVar = "";
    stringVar = stringVar.concat(cfg.varible1, cfg.variable2, cfg.variable3);
    return stringVar;// returns selected values of "variable1variable2variable3"

    How to imitate a CONTAINS function:

    var yourVariable = "Field Value"; // Replace with your actual Field value
    if (yourVariable.includes("CU")) {
    	// Code you wish to execute when Field Value contains "CU"
    } else if (yourVariable.includes("AL")) {
    	// Code you wish to execute when Field Value contains "AL"
    } else {
    	// Code you wish to execute when Field Value doesn't contain "CU" or "AL"
    };