What This Table Is
The sc_req_item table stores individual catalog items (RITMs) that users order through the Service Catalog. When someone submits a cart with three items, ServiceNow creates one sc_request record and three sc_req_item records. Each RITM represents one fulfillment unit with its own approval chain, assignment, and lifecycle.
Owned by the Service Catalog module, this table drives the entire catalog fulfillment process from order to delivery. RITMs flow through states like Pending Approval, Work in Progress, and Closed Complete. The state field controls workflow progression, while stage tracks high-level phases like Request Approved or Fulfillment.
The table extends task, inheriting fields like assigned_to, priority, and work_notes. No child tables extend sc_req_item in baseline ServiceNow, though custom implementations sometimes create subtables for specialized catalog items like hardware requests or access requests.
Large enterprises typically see 50,000-500,000 RITM records annually, with peaks during hardware refresh cycles or new hire onboarding. The table performs well at scale, but complex queries joining sc_item_option_mtom for variable values can slow down significantly beyond 100,000 records without proper indexing.
When You'll Script Against This Table
You'll script against sc_req_item most often in catalog Business Rules (especially before/after insert and update), fulfillment Flow Designer actions, and Workflow activities. Script Includes that handle catalog automation, approval engines, and integration with external provisioning systems constantly query this table. Scheduled Jobs that monitor SLA breaches or send fulfillment reminders also run against RITM records.
The catalog_admin role provides full access, while catalog role allows reading most fields but restricts updates to assigned fulfillment groups. Record-level ACLs limit users to seeing their own requests unless they're in the fulfillment chain.
Common scripting patterns:
- Auto-assign RITMs to fulfillment groups based on
cat_itemor requester's location - Extract variable values from
sc_item_option_mtomfor provisioning systems - Update state to Work in Progress when external system accepts the request
- Create tasks, change requests, or project records as fulfillment work
- Calculate SLA due dates based on
cat_item.delivery_timeand business calendars - Send notifications to requesters when state changes to Closed Complete
- Generate configuration items when hardware or software gets provisioned
Table Gotchas
The state field uses integer values, not string choices. 'Pending Approval' is -5, 'Work in Progress' is 1, 'Closed Complete' is 3. Always query by number: current.state == 1, never current.state == 'Work in Progress'.
Variable values aren't stored on the RITM record itself. They're in sc_item_option_mtom as many-to-many relationships. Use getRITMVariableValue() or query the mtom table directly - never assume variables are direct RITM fields.
- The
opened_byfield points to who submitted the request, whilerequest.requested_foris the actual recipient - crucial for manager approval logic - Changing
stateautomatically updatesstagevia Business Rules - don't manually set both or you'll get conflicts
Queries joining sc_item_option_mtom can timeout on large datasets. The mtom table lacks indexes on item_option_new. Always filter RITMs first, then get variables for the smaller result set.
- The
approvalfield shows overall approval status, but individual approvals live insysapproval_approver- check both for complete approval logic - ACLs prevent users from seeing RITMs they didn't request unless they're assigned or have fulfillment roles - test your scripts with non-admin users
Enjoying this? Get one deep-dive per week.
Join 1,000+ ServiceNow pros — scripts, GlideRecord patterns, Flow Designer techniques, and career moves. Free.
Related Tables
As an extension of task, RITMs inherit all task functionality including assignments, work notes, and SLA tracking. The parent sc_request holds cart-level information like the original requester and submission timestamp. Most fulfillment logic operates on individual RITMs, not the parent request.
The sc_item_option_mtom table stores all variable values submitted with the RITM - you'll join this constantly to get user selections. sc_cat_item defines the catalog item being requested and contains fulfillment rules, delivery times, and approval mappings. The sysapproval_approver table tracks individual approvals when RITMs require manager or department head sign-off.
Fulfillment workflows often create records in sc_task for manual work items, change_request for infrastructure changes, or cmdb_ci when provisioning creates new assets. These relationships typically use the task_relations table or direct reference fields back to the originating RITM.