Multi-Turn Catalog Ordering
SkillAI & modelsConfigure multi-turn catalog ordering for conversational item selection, variable collection, and order placement via Virtual Agent
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Multi-Turn Catalog Ordering skill
What this skill tells your AI
The instructions your AI receives, as published by happy-technologies-llc/happy-platform-skills in skills/catalog/multi-turn-ordering/SKILL.md and read by ahel’s review.
Overview
This skill configures conversational multi-turn ordering flows where users can browse, select, and order catalog items through a guided dialogue. It covers:
- Setting up Virtual Agent topics for catalog ordering conversations using
sys_cb_topic - Configuring conversational item discovery and selection from
sc_cat_itemandsc_category - Designing multi-turn variable collection flows that gather
item_option_newvalues step by step - Implementing cart management and order placement via the Service Catalog API
- Handling disambiguation when multiple items match a user's request
- Managing conversation context across turns for complex ordering scenarios
When to use: When organizations want employees to order catalog items through a chat-based interface (Virtual Agent, Slack, Teams) rather than navigating the traditional catalog portal, or when items require guided, step-by-step variable collection.
Value proposition: Multi-turn ordering reduces catalog abandonment rates, improves requester experience by guiding users through complex forms, and enables ordering from messaging platforms without portal access.
Prerequisites
- Plugins:
com.glide.cs.chatbot(Virtual Agent),com.glideapp.servicecatalog(Service Catalog) - Roles:
admin,virtual_agent_admin, orcatalog_admin - Access: Read/write access to
sc_cat_item,sc_category,item_option_new,sys_cb_topic, andsys_cb_topic_detail - Knowledge: Understanding of Virtual Agent topic design, NLU models, and Service Catalog API
Procedure
Step 1: Identify Catalog Items for Conversational Ordering
Determine which items are suitable for multi-turn ordering. Items with 3-8 variables and clear selection paths work best.
Using MCP (Claude Code/Desktop):
Tool: SN-Query-Table
Parameters:
table_name: sc_cat_item
query: active=true^type=item^sc_catalogs.titleLIKEService Catalog
fields: sys_id,name,short_description,category,sc_catalogs,price,order,availability
limit: 50
order_by: category,name
Using REST API:
GET /api/now/table/sc_cat_item?sysparm_query=active=true^type=item&sysparm_fields=sys_id,name,short_description,category,sc_catalogs,price,order&sysparm_limit=50&sysparm_display_value=true
Check variable count per item to assess complexity:
Tool: SN-Execute-Background-Script
Parameters:
description: Count variables per catalog item for ordering suitability
script: |
var items = new GlideRecord('sc_cat_item');
items.addQuery('active', true);
items.addQuery('type', 'item');
items.orderBy('category');
items.query();
var results = [];
while (items.next()) {
var vars = new GlideAggregate('item_option_new');
vars.addQuery('cat_item', items.sys_id);
vars.addQuery('active', true);
vars.addAggregate('COUNT');
vars.query();
var varCount = 0;
if (vars.next()) varCount = parseInt(vars.getAggregate('COUNT'));
var mandatoryVars = new GlideAggregate('item_option_new');
mandatoryVars.addQuery('cat_item', items.sys_id);
mandatoryVars.addQuery('active', true);
mandatoryVars.addQuery('mandatory', true);
mandatoryVars.addAggregate('COUNT');
mandatoryVars.query();
var mandCount = 0;
if (mandatoryVars.next()) mandCount = parseInt(mandatoryVars.getAggregate('COUNT'));
if (varCount > 0) {
results.push({
name: items.name.toString(),
category: items.category.getDisplayValue(),
total_variables: varCount,
mandatory_variables: mandCount,
suitability: varCount <= 8 ? 'Good' : 'Complex'
});
}
}
gs.info(JSON.stringify(results, null, 2));
Step 2: Design the Conversation Flow
Map the ordering process into conversation turns:
| Turn | Bot Action | User Response | Data Captured |
|---|---|---|---|
| 1 | "What would you like to order?" | "I need a new laptop" | Intent: catalog_order, keyword: laptop |
| 2 | "I found these options: [list]" | "The performance model" | Item selection |
| 3 | "What RAM size do you need?" | "16GB" | Variable: ram_size |
| 4 | "What storage capacity?" | "512GB SSD" | Variable: storage_size |
| 5 | "Business justification?" | "Current laptop failing" | Variable: justification |
| 6 | "Confirm order: [summary]" | "Yes, submit" | Cart submission |
Step 3: Create the Virtual Agent Topic
Configure the Virtual Agent topic for catalog ordering.
Using MCP:
Tool: SN-Create-Record
Parameters:
table_name: sys_cb_topic
fields:
name: "Order Catalog Item"
description: "Conversational flow for browsing and ordering service catalog items with guided variable collection"
category: service_catalog
active: true
enabled: true
nlu_intent: catalog_order
greeting_message: "I can help you order from the service catalog. What are you looking for?"
fallback_message: "I couldn't find a matching item. Could you describe what you need differently?"
end_message: "Your order has been submitted! You'll receive a confirmation email shortly."
topic_type: standard
Using REST API:
POST /api/now/table/sys_cb_topic
Content-Type: application/json
{
"name": "Order Catalog Item",
"description": "Conversational flow for browsing and ordering service catalog items",
"category": "service_catalog",
"active": "true",
"enabled": "true",
"nlu_intent": "catalog_order",
"greeting_message": "I can help you order from the service catalog. What are you looking for?",
"topic_type": "standard"
}
Step 4: Configure Topic Details for Item Discovery
Add topic detail nodes that handle item search and selection.
Create search node:
Tool: SN-Create-Record
Parameters:
table_name: sys_cb_topic_detail
fields:
topic: [topic_sys_id]
name: "Search Catalog Items"
node_type: script
order: 100
script: |
(function() {
var keyword = vaSystem.getLastUserMessage();
var items = [];
var gr = new GlideRecord('sc_cat_item');
gr.addQuery('active', true);
gr.addQuery('type', 'item');
gr.addQuery('nameLIKE' + keyword)
.addOrCondition('short_descriptionLIKE' + keyword);
gr.setLimit(5);
gr.query();
while (gr.next()) {
items.push({
sys_id: gr.sys_id.toString(),
name: gr.name.toString(),
description: gr.short_description.toString(),
price: gr.price.toString()
});
}
vaVars.items = JSON.stringify(items);
return items.length > 0 ? 'found' : 'not_found';
})();
Create disambiguation node for multiple matches:
Tool: SN-Create-Record
Parameters:
table_name: sys_cb_topic_detail
fields:
topic: [topic_sys_id]
name: "Disambiguate Items"
node_type: user_input
order: 200
prompt_message: "I found multiple items matching your request. Which one did you mean?"
input_type: picker
picker_source_variable: items
Step 5: Configure Variable Collection Nodes
Create conversational nodes that collect each required variable.
Using MCP:
Tool: SN-Execute-Background-Script
Parameters:
description: Create variable collection nodes for catalog item ordering
script: |
var topicId = '[topic_sys_id]';
var itemId = '[cat_item_sys_id]';
// Get mandatory variables for the item
var vars = new GlideRecord('item_option_new');
vars.addQuery('cat_item', itemId);
vars.addQuery('active', true);
vars.addQuery('mandatory', true);
vars.orderBy('order');
vars.query();
var nodeOrder = 300;
while (vars.next()) {
var detail = new GlideRecord('sys_cb_topic_detail');
detail.initialize();
detail.topic = topicId;
detail.name = 'Collect: ' + vars.question_text.toString();
detail.node_type = 'user_input';
detail.order = nodeOrder;
detail.prompt_message = vars.question_text.toString();
// Map variable type to input type
var varType = parseInt(vars.type);
if (varType === 3) {
detail.input_type = 'picker';
} else if (varType === 9) {
detail.input_type = 'date';
} else if (varType === 2) {
detail.input_type = 'text_area';
} else {
detail.input_type = 'text';
}
detail.mapped_variable = vars.name.toString();
detail.insert();
nodeOrder += 100;
}
gs.info('Created ' + ((nodeOrder - 300) / 100) + ' variable collection nodes');
Step 6: Add Order Confirmation and Submission
Create the confirmation and cart submission nodes.
Create confirmation node:
Tool: SN-Create-Record
Parameters:
table_name: sys_cb_topic_detail
fields:
topic: [topic_sys_id]
name: "Confirm Order"
node_type: user_input
order: 900
prompt_message: "Here's your order summary:\n\nItem: {{selected_item_name}}\n{{variable_summary}}\n\nWould you like to submit this order?"
input_type: yes_no
Create submission node using the Service Catalog API:
Tool: SN-Create-Record
Parameters:
table_name: sys_cb_topic_detail
fields:
topic: [topic_sys_id]
name: "Submit Order"
node_type: script
order: 1000
script: |
(function() {
var itemId = vaVars.selected_item_id;
var variables = JSON.parse(vaVars.collected_variables || '{}');
// Create cart item
var cart = new sn_sc.CatalogOrderHelper();
cart.setRequestedFor(vaSystem.getUserSysId());
var cartItem = cart.addToCart(itemId);
for (var key in variables) {
cartItem.setVariable(key, variables[key]);
}
var request = cart.submitOrder();
vaVars.request_number = request.number;
return 'submitted';
})();
Step 7: Test and Publish the Conversation Flow
Validate the multi-turn flow end to end.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sys_cb_topic_detail
query: topic=[topic_sys_id]
fields: sys_id,name,node_type,order,prompt_message,input_type,mapped_variable
limit: 20
order_by: order
Using REST API:
GET /api/now/table/sys_cb_topic_detail?sysparm_query=topic=[topic_sys_id]^ORDERBYorder&sysparm_fields=sys_id,name,node_type,order,prompt_message,input_type,mapped_variable&sysparm_limit=20&sysparm_display_value=true
Activate the topic:
Tool: SN-Update-Record
Parameters:
table_name: sys_cb_topic
sys_id: [topic_sys_id]
fields:
active: true
enabled: true
published: true
Tool Usage
MCP Tools Reference
| Tool | When to Use |
|---|---|
SN-Query-Table | Query catalog items, variables, categories, topics |
SN-Create-Record | Create topics, topic details, and catalog configurations |
SN-Update-Record | Activate and publish topics, update item settings |
SN-Natural-Language-Search | Find catalog items matching natural language queries |
SN-Execute-Background-Script | Batch-create conversation nodes and test flows |
SN-Discover-Table-Schema | Explore Virtual Agent and catalog table schemas |
REST API Reference
| Endpoint | Method | Purpose |
|---|---|---|
/api/now/table/sc_cat_item | GET | Query catalog items for ordering |
/api/now/table/item_option_new | GET | Retrieve item variables for collection |
/api/now/table/sc_category | GET | Browse catalog categories |
/api/now/table/sys_cb_topic | GET/POST/PATCH | Manage Virtual Agent topics |
/api/now/table/sys_cb_topic_detail | GET/POST | Configure conversation flow nodes |
/api/sn_sc/servicecatalog/items | GET | Service Catalog API for item details |
/api/sn_sc/servicecatalog/cart | POST | Cart management and order submission |
Best Practices
- Keep conversations short: Limit to 5-7 turns maximum; combine related variables into single prompts when possible
- Offer quick picks: Present the 3-5 most popular items first before searching the full catalog
- Provide context at each turn: Remind users what they are ordering and what information is still needed
- Handle backtracking: Allow users to say "go back" or "change my selection" to revise previous answers
- Use rich messages: Display item images, prices, and descriptions using card-style responses
- Collect mandatory variables first: Ask for required fields before optional ones to minimize abandonment
- Confirm before submission: Always show a complete order summary and ask for explicit confirmation
- Graceful error handling: When item search finds no matches, suggest browsing by category or rephrasing the query
Troubleshooting
Virtual Agent Not Recognizing Catalog Intent
Cause: NLU model is not trained with sufficient utterances for the catalog ordering intent
Solution: Add training utterances to the catalog_order intent such as "I need to order," "request a new," "can I get a," "I want to buy." Retrain the NLU model after adding utterances.
Variables Not Being Saved Between Turns
Cause: Conversation variables (vaVars) are not correctly mapped to catalog variables
Solution: Verify mapped_variable on each topic detail node matches the name field in item_option_new. Check that the variable names in the submission script match exactly.
Cart Submission Fails
Cause: Missing mandatory variables, invalid variable values, or user session issues
Solution: Validate all mandatory variables are collected before the submission node. Add a pre-submission script node that checks for missing values and loops back if needed. Verify CatalogOrderHelper is available in the instance.
Item Search Returns Wrong Results
Cause: Search query too broad or catalog items lack descriptive names and keywords
Solution: Improve item short_description and description fields with searchable keywords. Consider adding a catalog keyword field or using NLU entity extraction to refine the search.
Examples
Example 1: Simple Hardware Order Conversation
Bot: "What would you like to order?"
User: "I need a new monitor"
Bot: "I found 2 monitors available:
1. Standard Monitor (24" Dell) - $350
2. Ultra-Wide Monitor (34" LG) - $750
Which one would you like?"
User: "The ultra-wide"
Bot: "What is your desk location?"
User: "Building A, Floor 3, Desk 312"
Bot: "Do you need any mounting accessories? (desk mount, wall mount, or none)"
User: "Desk mount please"
Bot: "Order Summary:
Ultra-Wide Monitor (34" LG) - $750
Location: Building A, Floor 3, Desk 312
Mounting: Desk mount
Shall I submit this order?"
User: "Yes"
Bot: "Order submitted! Request REQ0045123 created. Expected delivery: 5-7 business days."
Example 2: Software Request with Disambiguation
Bot: "What would you like to order?"
User: "I need Adobe"
Bot: "I found several Adobe products:
1. Adobe Creative Cloud (Full Suite) - $55/mo
2. Adobe Acrobat Pro - $15/mo
3. Adobe Photoshop (Single App) - $22/mo
Which one do you need?"
User: "Just Acrobat"
Bot: "How many licenses do you need?"
User: "3"
Bot: "Business justification for the licenses?"
User: "Legal team needs PDF editing for contract reviews"
Bot: "I'll submit this for approval since it's 3+ licenses. Confirm?
Adobe Acrobat Pro x3 - $45/mo
Justification: Legal team PDF editing for contract reviews"
User: "Confirm"
Bot: "Submitted! REQ0045124 is pending manager approval."
Related Skills
catalog/catalog-item-generation- Generate catalog items from descriptionscatalog/variable-management- Advanced variable configurationcatalog/item-creation- Standard catalog item setupcatalog/request-fulfillment- Post-order fulfillment workflowscatalog/approval-workflows- Approval routing for ordersgenai/playbook-generation- Generate Virtual Agent playbooks
Signals
- GitHub stars
- 37
- Forks
- 13
- Last commit
- Jul 2026
Advanced
- Catalog kind
- skill
- Gateway key
multi-turn-ordering- Source
- github.com/happy-technologies-llc/happy-platform-skills