Automating the submission of Service Catalog items is a fundamental requirement for advanced ServiceNow implementations, enabling processes like inbound email provisioning, workflow automation, and external integrations. This is achieved using server-side APIs that mimic the user checkout process.
The method you choose depends on your application’s scope: the Global scope uses the traditional Cart API, while a Scoped Application uses the modern CartJS API.
1. Using the CART API (Global Scope)
The Cart API is a widely-used, server-side object available for scripts running in the Global scope, such as Business Rules, Inbound Email Actions, or Global Script Includes.
Key Steps
- Instantiate the Cart: Create a new
Cartobject, typically using a uniqueGlideGuid. - Add the Item: Use the
addItem()method with thesys_idof the catalog item. This returns a cart item ID. - Set Variables: Use the
setVariable()method to populate the item’s variables using the cart item ID, variable name, and value. - Place the Order: Use the
placeOrder()method to submit the request.
Code Example
This script submits a catalog item and retrieves the resulting RITM number.
JavaScript
// 1. Instantiate the Cart with a unique ID
var cartID = GlideGuid.generate(null);
var cart = new Cart(cartID);
// Replace with your catalog item's sys_id
var catalogItemSysID = 'a22c1b1c476721004653609822a7fcf2';
// 2. Add the item and get its cart item ID
var cartItemID = cart.addItem(catalogItemSysID);
// 3. Set the variables for the item
cart.setVariable(cartItemID, 'ram_size', '16GB');
cart.setVariable(cartItemID, 'operating_system', 'windows_11');
cart.setVariable(cartItemID, 'location', 'San_Diego');
// 4. Place the order
var requestGR = cart.placeOrder(); // Returns a GlideRecord for the sc_request
// 5. Retrieve the RITM number from the Request
var ritmGR = new GlideRecord('sc_req_item');
ritmGR.addQuery('request', requestGR.sys_id);
ritmGR.query();
if (ritmGR.next()) {
gs.print('Order Submitted! Request: ' + requestGR.number + ', RITM: ' + ritmGR.number);
}
💡 Important Note: The
placeOrder()method returns the Request (sc_request). You must perform a separateGlideRecordquery on the Request Item table (sc_req_item) using the Request’ssys_idto get the resulting RITM number.
2. Using the Cartjs API (Scoped Application)
The CartJS API is the modern, preferred method for submitting catalog items when working within a Scoped Application. It relies on JSON objects for input and output, making it highly structured.
Key Steps
- Instantiate CartJS: Create a new
sn_sc.CartJSobject. - Define Item Details: Construct a JSON object containing the item’s
sysparm_id,sysparm_quantity, and a nestedvariablesobject. - Add to Cart: Use the
addToCart()method with the item details JSON. - Checkout: Use the
checkoutCart()method to submit the order.
Code Example
This script uses the JSON-based approach to submit the catalog item.
JavaScript
// 1. Instantiate the CartJS object
var cart = new sn_sc.CartJS();
// 2. Define the Catalog Item and all its variables in a JSON object
var itemOrderDetails = {
// Catalog item sys_id
'sysparm_id': '875e031c47a321004653609822a7fc9c',
'sysparm_quantity': '1',
// Key-value pairs for all variable names and their desired values
'variables': {
'access_level': 'admin',
'application_name': 'jira',
'approver_email': 'john.doe@example.com'
}
};
// 3. Add item to the cart
var cartStatus = cart.addToCart(itemOrderDetails);
// 4. Checkout and submit the order
var checkoutResult = cart.checkoutCart();
// Log the result, which contains the Request number
if (checkoutResult && checkoutResult.request_number) {
gs.info('Order successfully submitted. Request Number: ' + checkoutResult.request_number);
} else {
gs.error('Failed to submit order: ' + JSON.stringify(checkoutResult));
}
💡 Data Handling: The
CartJSmethods return JSON objects, which makes parsing the response simple and efficient for tracking the resulting Request and RITM IDs.
Important Note on User Context
The scripts above, by default, will NOT automatically populate the Requested For and Opened By fields with a specific target user.
For scenarios where you need to order items on behalf of another user, additional logic is required. You can achieve this by:
- Setting the User: Manually update the
sc_requestandsc_req_itemrecords afterplaceOrder()is called, setting therequested_forandopened_byfields to the desired user’ssys_id. - Using
runAs: For Scoped applications, you may use methods to impersonate or run the script under a different user context, though this requires careful implementation and permissions.