approval-workflows
Service Catalog Approval Workflows
Overview
This skill covers approval management for service catalog items:
- Understanding approval architecture
- Configuring approval rules and conditions
- Multi-level and parallel approvals
- Approval delegation and coverage
- Timeout, reminder, and escalation configuration
- Monitoring and managing approval requests
When to use: When setting up approval processes for catalog items, troubleshooting stuck approvals, or implementing complex approval routing.
Prerequisites
- Roles:
catalog_admin,approval_admin, oradmin - Access: sysapproval_approver, sc_ic_aprvl_type_defn, sc_ic_aprvl_defn tables
- Knowledge: Service catalog structure, approval concepts
- Related Skills:
catalog/item-creationshould be completed first
Procedure
Step 1: Understand Approval Architecture
Approval Tables:
| Table | Purpose |
|---|---|
| sysapproval_approver | Individual approval records (one per approver) |
| sysapproval_group | Group-based approvals |
| sc_ic_aprvl_type_defn | Catalog approval type definitions |
| sc_ic_aprvl_defn | Catalog-specific approval definitions |
| sys_approval_rule | System-wide approval rules |
Approval Flow:
Request Submitted
↓
Approval Rule Evaluated
↓
Approval Records Created (sysapproval_approver)
↓
Approvers Notified
↓
Approver Takes Action
↓
Next Level (if multi-level) OR Complete
Approval States:
| State | Value | Description |
|---|---|---|
| Not Yet Requested | not yet requested | Approval not triggered |
| Requested | requested | Waiting for approver action |
| Approved | approved | Approver approved |
| Rejected | rejected | Approver rejected |
| Cancelled | cancelled | Approval cancelled |
| Duplicate | duplicate | Duplicate approval skipped |
| Not Required | not_required | Approval waived |
Step 2: Query Existing Approvals
Find pending approvals for a request:
Tool: SN-Query-Table
Parameters:
table_name: sysapproval_approver
query: sysapproval=[ritm_sys_id]
fields: sys_id,approver,state,due_date,source_table,sys_created_on
limit: 50
Find all pending approvals for a user:
Tool: SN-Query-Table
Parameters:
table_name: sysapproval_approver
query: approver=[user_sys_id]^state=requested
fields: sys_id,sysapproval,document_id,source_table,sys_created_on
limit: 100
Find overdue approvals:
Tool: SN-Query-Table
Parameters:
table_name: sysapproval_approver
query: state=requested^due_date<javascript:gs.nowDateTime()
fields: sys_id,approver,sysapproval,due_date,source_table
limit: 100
Step 3: Create Approval Rules (Legacy Method)
Note: This uses the legacy approval rule system. For new implementations, consider using Flow Designer or Catalog Builder approval types.
Create basic approval rule:
Tool: SN-Create-Record
Parameters:
table_name: sys_approval_rule
data:
name: "Manager Approval for Hardware > $1000"
active: true
table: sc_req_item
condition: cat_item.price>1000^cat_item.category.title=Hardware
approval_type: "single"
approver_field: "opened_by.manager"
order: 100
Step 4: Configure Catalog Approval Types
Catalog approval types define reusable approval patterns.
Query existing approval types:
Tool: SN-Query-Table
Parameters:
table_name: sc_ic_aprvl_type_defn
query: active=true
fields: sys_id,name,description,approval_type
limit: 50
Create approval type definition:
Tool: SN-Create-Record
Parameters:
table_name: sc_ic_aprvl_type_defn
data:
name: "Manager Approval"
description: "Requires approval from requester's manager"
active: true
approval_type: "approver_user_field"
approver_user_field: "requested_for.manager"
wait_for: "everyone" # everyone, anyone
mandatory: true
Approval Type Options:
| approval_type | Description |
|---|---|
| approver_user_field | User from field on record |
| approver_group_field | Group from field on record |
| specific_user | Hardcoded user |
| specific_group | Hardcoded group |
| script | Custom script determines approver |
Step 5: Configure Multi-Level Approvals
Multi-level approvals execute in sequence based on order.
Create Level 1 - Manager Approval:
Tool: SN-Create-Record
Parameters:
table_name: sc_ic_aprvl_defn
data:
catalog_item: [catalog_item_sys_id]
name: "Manager Approval"
approval_type_definition: [manager_approval_type_sys_id]
order: 100
active: true
condition: "" # Always apply
Create Level 2 - Director Approval (for high-value requests):
Tool: SN-Create-Record
Parameters:
table_name: sc_ic_aprvl_defn
data:
catalog_item: [catalog_item_sys_id]
name: "Director Approval"
approval_type_definition: [director_approval_type_sys_id]
order: 200
active: true
condition: "price>5000" # Only for requests over $5000
Create Level 3 - Finance Approval (for very high value):
Tool: SN-Create-Record
Parameters:
table_name: sc_ic_aprvl_defn
data:
catalog_item: [catalog_item_sys_id]
name: "Finance Approval"
approval_type_definition: [finance_approval_type_sys_id]
order: 300
active: true
condition: "price>10000"
Step 6: Configure Parallel Approvals
Parallel approvals execute simultaneously at the same level.
Create Parallel Approvers (same order = parallel):
Tool: SN-Create-Record
Parameters:
table_name: sc_ic_aprvl_defn
data:
catalog_item: [catalog_item_sys_id]
name: "IT Security Review"
approval_type_definition: [security_approval_type_sys_id]
order: 100 # Same order as other parallel approval
active: true
Tool: SN-Create-Record
Parameters:
table_name: sc_ic_aprvl_defn
data:
catalog_item: [catalog_item_sys_id]
name: "Legal Review"
approval_type_definition: [legal_approval_type_sys_id]
order: 100 # Same order = parallel execution
active: true
Wait For Options:
everyone- All approvers must approveanyone- First approval completes the levelmajority- Majority of approvers must approve
Step 7: Configure Group Approvals
Create group-based approval type:
Tool: SN-Create-Record
Parameters:
table_name: sc_ic_aprvl_type_defn
data:
name: "Change Advisory Board"
description: "CAB approval required for major changes"
active: true
approval_type: "specific_group"
approver_group: [cab_group_sys_id]
wait_for: "everyone"
Query group approval status:
Tool: SN-Query-Table
Parameters:
table_name: sysapproval_group
query: parent=[ritm_sys_id]
fields: sys_id,group,approval,sys_created_on
Step 8: Configure Approval Delegation
Delegation allows users to assign approval authority to others during absence.
Query existing delegations:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_delegate
query: delegate=[user_sys_id]^active=true
fields: sys_id,user,delegate,starts,ends,approval
limit: 50
Create delegation record:
Tool: SN-Create-Record
Parameters:
table_name: sys_user_delegate
data:
user: [original_approver_sys_id]
delegate: [delegate_user_sys_id]
starts: "2026-02-10"
ends: "2026-02-24"
approval: true # Delegate approvals
active: true
Step 9: Configure Timeout and Escalation
Approval with Due Date:
Tool: SN-Update-Record
Parameters:
table_name: sysapproval_approver
sys_id: [approval_sys_id]
data:
due_date: "2026-02-13 17:00:00"
Create Escalation via SLA: Configure through SLA Definitions (sla) table:
Tool: SN-Create-Record
Parameters:
table_name: contract_sla
data:
name: "Approval Escalation - 48 Hours"
table: sysapproval_approver
condition: "state=requested"
duration: "2 00:00:00" # 48 hours
workflow: [escalation_workflow_sys_id]
active: true
Step 10: Process Approvals Programmatically
Approve a request:
Tool: SN-Update-Record
Parameters:
table_name: sysapproval_approver
sys_id: [approval_sys_id]
data:
state: "approved"
comments: "Approved - budget verified and manager confirmed need"
Reject a request:
Tool: SN-Update-Record
Parameters:
table_name: sysapproval_approver
sys_id: [approval_sys_id]
data:
state: "rejected"
comments: "Rejected - request exceeds department budget. Please resubmit next quarter."
Cancel pending approvals:
Tool: SN-Update-Record
Parameters:
table_name: sysapproval_approver
sys_id: [approval_sys_id]
data:
state: "cancelled"
comments: "Approval cancelled - request withdrawn by user"
Step 11: Monitor Approval Metrics
Count pending approvals by group:
Tool: SN-Query-Table
Parameters:
table_name: sysapproval_approver
query: state=requested^sys_created_on>=javascript:gs.beginningOfLastMonth()
fields: sys_id,approver.u_group,state
limit: 1000
Find approval bottlenecks:
Tool: SN-Query-Table
Parameters:
table_name: sysapproval_approver
query: state=requested^sys_created_onRELATIVELE@dayofweek@ago@5
fields: sys_id,approver,sysapproval,sys_created_on
limit: 100
Complete Example: Multi-Level Hardware Approval
# 1. Create Manager Approval Type
Tool: SN-Create-Record
Parameters:
table_name: sc_ic_aprvl_type_defn
data:
name: "Requester Manager"
description: "Approval from requester's direct manager"
active: true
approval_type: "approver_user_field"
approver_user_field: "requested_for.manager"
wait_for: "everyone"
mandatory: true
# Result: sys_id = "type_manager"
# 2. Create IT Director Approval Type
Tool: SN-Create-Record
Parameters:
table_name: sc_ic_aprvl_type_defn
data:
name: "IT Director"
description: "IT Director approval for large hardware purchases"
active: true
approval_type: "specific_user"
specific_user: [it_director_sys_id]
wait_for: "everyone"
mandatory: true
# Result: sys_id = "type_director"
# 3. Create Level 1 Approval Definition (always required)
Tool: SN-Create-Record
Parameters:
table_name: sc_ic_aprvl_defn
data:
catalog_item: [hardware_item_sys_id]
name: "Manager Approval"
approval_type_definition: "type_manager"
order: 100
active: true
condition: ""
# 4. Create Level 2 Approval Definition (only for > $2000)
Tool: SN-Create-Record
Parameters:
table_name: sc_ic_aprvl_defn
data:
catalog_item: [hardware_item_sys_id]
name: "IT Director Approval"
approval_type_definition: "type_director"
order: 200
active: true
condition: "price>2000"
# 5. Verify configuration
Tool: SN-Query-Table
Parameters:
table_name: sc_ic_aprvl_defn
query: catalog_item=[hardware_item_sys_id]
fields: name,approval_type_definition,order,condition,active
Approval State Transitions
┌──────────────────┐
│ not yet requested│
└─────────┬────────┘
│ Workflow triggers
┌─────────▼────────┐
│ requested │
└─────────┬────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
┌─────────▼────────┐ ┌─────────▼────────┐ ┌─────────▼────────┐
│ approved │ │ rejected │ │ cancelled │
└──────────────────┘ └──────────────────┘ └──────────────────┘
│
│ All approvals approved
┌─────────▼──────────────────────┐
│ Request proceeds to fulfillment│
└────────────────────────────────┘
Tool Usage Summary
| Operation | MCP Tool | Table |
|---|---|---|
| Query approvals | SN-Query-Table | sysapproval_approver |
| Process approval | SN-Update-Record | sysapproval_approver |
| Create approval type | SN-Create-Record | sc_ic_aprvl_type_defn |
| Create approval definition | SN-Create-Record | sc_ic_aprvl_defn |
| Configure delegation | SN-Create-Record | sys_user_delegate |
| Query group approvals | SN-Query-Table | sysapproval_group |
Best Practices
- Minimize Approval Levels: Each level adds delay; use conditions to skip when appropriate
- Use Groups Over Individuals: Groups survive personnel changes
- Set Due Dates: Ensure approvals don't stall indefinitely
- Configure Escalation: Auto-escalate overdue approvals
- Document Conditions: Make approval conditions clear and auditable
- Test All Paths: Test approval, rejection, and cancellation flows
- Monitor Metrics: Track approval time and bottlenecks
- Enable Delegation: Allow coverage during PTO
Troubleshooting
Approval Not Generated
Symptom: Request submitted but no approval record created Causes:
- Approval rule condition not met
- Approval type inactive
- Workflow not triggering approval activity Solution:
Tool: SN-Query-Table
Parameters:
table_name: sc_ic_aprvl_defn
query: catalog_item=[item_sys_id]^active=true
fields: name,condition,active,order
Approval Stuck in "Requested"
Symptom: Approval pending but approver claims to have acted Causes:
- Multiple approval records (one approved, one pending)
- Approver acted on wrong record
- Multi-level approval waiting for previous level Solution:
Tool: SN-Query-Table
Parameters:
table_name: sysapproval_approver
query: sysapproval=[ritm_sys_id]
fields: sys_id,approver,state,order,sys_updated_on
Request Rejected But Still Processing
Symptom: Request continues despite rejection Cause: Business rule or workflow not honoring rejection Solution: Check workflow for proper rejection handling
Delegation Not Working
Symptom: Delegate not receiving approval requests Causes:
- Delegation record inactive
- Date range expired
- approval flag not set Solution:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_delegate
query: user=[original_user_sys_id]^active=true
fields: delegate,starts,ends,approval,active
Related Skills
catalog/item-creation- Creating catalog items (prerequisite)catalog/request-fulfillment- Processing approved requestsadmin/workflow-management- Building approval workflowsadmin/notification-management- Approval notification setup
References
More from happy-technologies-llc/happy-platform-skills
happy-platform-skills
Reusable development patterns and automation recipes for enterprise platforms - 180+ skills across 23 categories
17scheduled-jobs
Comprehensive guide to creating and managing ServiceNow scheduled jobs - run frequencies, conditional execution, performance optimization, error handling, and debugging
4flow-generation
Generate ServiceNow Flow Designer flows from natural language descriptions including triggers, actions, conditions, subflows, approval flows, notification flows, and data manipulation flows
4application-scope
Manage scoped application development including setting application context and update set alignment
4scripted-rest-apis
Comprehensive guide to creating, securing, and testing Scripted REST APIs in ServiceNow for custom integrations and external system connectivity
4automated-testing
Comprehensive Automated Test Framework (ATF) guide for creating, managing, and executing automated tests in ServiceNow
4