What It Is
The Application Navigator is ServiceNow's hierarchical menu system that organizes platform functionality into applications, modules, and sub-modules, providing users with structured access to tables, lists, dashboards, and custom functionality. It solves the fundamental problem of navigating thousands of platform features by grouping related functionality into logical applications like Incident, Change, or System Definition. The navigator dynamically filters menu visibility based on user roles, ensuring users only see functionality they can access while maintaining a consistent organizational structure across the entire platform.
Architecturally, the Application Navigator lives in the global scope and is managed through three core tables: sys_app_application (applications), sys_app_module (modules), and sys_app_category (categories). These tables define the menu structure, visibility rules, and navigation targets that appear in both Classic UI's left navigation panel and Next Experience's All menu. The navigator integrates with ServiceNow's role-based access control system, reading user roles at runtime to determine which applications and modules to display, while supporting both out-of-box platform functionality and custom scoped applications.
The underlying data model connects applications to modules through a parent-child relationship, where each module record contains an application reference field pointing to its parent application record. Modules define their navigation targets through fields like link_type (list, new, dashboard, etc.) and table or query fields that specify what loads when clicked. The execution environment evaluates role conditions stored in the roles field of each application and module record, creating a dynamic menu that refreshes based on the current user's session context and role assignments.
You cannot function without the Application Navigator in any enterprise ServiceNow implementation because it's the primary method users access platform functionality — there's no alternative way for end users to reach incident lists, change forms, or configuration tables without either navigator access or direct URL knowledge. Custom applications become completely inaccessible to users if they lack proper application and module records, making navigator configuration essential for any scoped application deployment. The business necessity becomes critical during role-based implementations where different user groups need access to different subsets of functionality; without proper navigator configuration, you'll have users unable to access tools they need or seeing functionality they shouldn't touch.
Platform owners typically manage out-of-box application and module records, while system administrators handle role assignments and custom module creation for business-specific needs. Developers working in scoped applications automatically get application records created when they build new applications, but they must manually create module records to expose their custom tables and functionality in the navigator. The relationship between these roles matters because improper module configuration by developers can create security gaps, while overly restrictive role assignments by admins can block legitimate user access to necessary functionality.
Vancouver introduced significant changes to navigator behavior in Next Experience, moving from the persistent left panel to the All menu accessible via the grid icon. The filter navigator functionality now includes enhanced search capabilities that index module descriptions and keywords, not just titles. Xanadu builds on this with improved application grouping and the ability to pin frequently accessed modules, but the underlying data model and configuration approach remain consistent with Classic UI — the same application and module records control navigation in both interface versions.
Where to Find and Configure It
Primary configuration happens at System Definition > Applications for managing application records and System Definition > Modules for creating and modifying individual menu items. Access the underlying tables directly at sys_app_application.list and sys_app_module.list when you need bulk operations or advanced filtering capabilities.
For scoped application development, access navigator configuration through System Applications > Studio where you can create modules within your application scope, or use System Applications > App Engine Studio for low-code module creation with guided workflows. Studio provides the Application Files > Application Menus section where you build navigation structure specific to your custom application. Related configuration includes User Administration > Roles for managing which roles can see specific applications and modules.
See navigator configuration in action by switching between user roles at System Security > Impersonate User to test how different role assignments affect menu visibility. Check navigator filter behavior and search indexing at System Properties > UI Properties where properties like glide.ui.filter_navigator_by_description control search functionality. The key difference between scoped and global applications is that scoped applications automatically create application records when you publish them, while global applications require manual creation of both application and module records with proper scope settings.
How It Works Step by Step
The Application Navigator operates through a real-time evaluation system that queries application and module records against the current user's role assignments during each session initialization and navigation refresh. When a user logs in or changes context, ServiceNow builds the navigation menu by first retrieving all application records where the user has matching roles, then fetching associated module records that also pass role validation. The system caches this navigation structure in the user's session but re-evaluates role conditions whenever roles change or when navigating between different application scopes.
Role inheritance plays a crucial part in navigator visibility, where users inherit navigation access from parent roles and role groups, while application-specific roles can override or extend base platform access. The navigator also respects table-level ACL restrictions, meaning users might see a module in the navigation but receive access denied errors when clicking if they lack proper table permissions. Module ordering within applications follows the order field value, while application ordering can be controlled through application menu categories and their associated ordering rules.
Enjoying this? Get one deep-dive per week.
Join 1,000+ ServiceNow pros — scripts, GlideRecord patterns, Flow Designer techniques, and career moves. Free.
The Execution Order
- User authentication triggers navigation menu construction by querying the
sys_app_applicationtable for applications where current user roles match the application'srolesfield or where the application has no role restrictions. - For each accessible application, ServiceNow queries
sys_app_modulerecords where theapplicationfield matches the application record and applies role filtering again at the module level. - Module records are evaluated for active status (
active=true) and sorted byorderfield values, with duplicate order numbers sorted alphabetically by title. - The system builds the navigation tree structure, grouping modules under their parent applications and applying any category-based organization defined in
sys_app_category. - Navigation structure gets cached in user session data with cache invalidation triggered by role changes, application updates, or explicit cache clearing.
- When users click modules, the platform reads the module's
link_typeand constructs the appropriate URL usingtable,query, orapplicationfield values before final ACL validation at the target resource.
// Query to find all accessible applications for current user
var appGR = new GlideRecord('sys_app_application');
appGR.addQuery('active', true);
appGR.addQuery('roles', 'CONTAINS', gs.getUser().getRoles().toString());
appGR.orderBy('title');
appGR.query();
// For each application, get accessible modules
while (appGR.next()) {
var modGR = new GlideRecord('sys_app_module');
modGR.addQuery('application', appGR.getUniqueValue());
modGR.addQuery('active', true);
modGR.addQuery('roles', 'CONTAINS', gs.getUser().getRoles().toString());
modGR.orderBy('order');
modGR.orderBy('title');
modGR.query();
gs.info('Application: ' + appGR.getDisplayValue('title') + ' has ' + modGR.getRowCount() + ' accessible modules');
}Real-World Scenarios
Creating Custom Application with Role-Restricted Access
Your organization needs a custom Asset Tracking application that only facilities managers and IT asset coordinators can access, with separate modules for different asset types. The business requires strict role segregation where general users cannot see asset management functionality in their navigation menus.
// Create the application record
var appGR = new GlideRecord('sys_app_application');
appGR.initialize();
appGR.setValue('title', 'Asset Tracking');
appGR.setValue('hint', 'Manage organizational assets and inventory');
appGR.setValue('roles', 'asset_manager,facilities_admin');
appGR.setValue('order', 100);
appGR.setValue('active', true);
var appSysId = appGR.insert();
// Create modules for different asset types
var moduleTypes = [
{title: 'All Assets', table: 'alm_asset', link_type: 'LIST'},
{title: 'Create Asset', table: 'alm_asset', link_type: 'NEW'},
{title: 'Hardware Assets', table: 'alm_asset', link_type: 'LIST', query: 'install_status!=7^category=Hardware'},
{title: 'Software Assets', table: 'alm_asset', link_type: 'LIST', query: 'category=Software'}
];
moduleTypes.forEach(function(module, index) {
var modGR = new GlideRecord('sys_app_module');
modGR.initialize();
modGR.setValue('title', module.title);
modGR.setValue('application', appSysId);
modGR.setValue('name', module.table);
modGR.setValue('link_type', module.link_type);
modGR.setValue('table', module.table);
if (module.query) modGR.setValue('query', module.query);
modGR.setValue('roles', 'asset_manager,facilities_admin');
modGR.setValue('order', (index + 1) * 100);
modGR.setValue('active', true);
modGR.insert();
});Watch for role inheritance issues where users might have broader roles like admin that automatically grant access despite not being explicitly listed in module roles. Test navigation visibility by impersonating users with only the specific roles assigned, and verify that ACL rules on the underlying tables match the navigator role restrictions to prevent access denied errors.
Organizing Complex Application with Categories and Separators
Your ITSM implementation has grown to include 40+ modules under the Incident application, making navigation unwieldy for agents who need quick access to specific incident queues and reporting tools. Business users want logical groupings that separate day-to-day operations from administrative functions and reporting.
- Navigate to
System Definition > Application Menusand open the Incident application record - Create separator modules by setting
link_typetoSEPARATORwith titles like 'Daily Operations' and 'Administration' - Reorder existing modules using
orderfield values: Daily Operations (100), Create Incident (110), My Incidents (120), separator (200), Administration (210), Incident Rules (220) - Apply role-based visibility where operational modules show to
itilrole but administrative modules requireadminorincident_adminroles
Separator modules don't display in Next Experience the same way they do in Classic UI, appearing as subtle dividers rather than bold section headers. Consider using application categories through sys_app_category for more robust grouping that works consistently across both interfaces. Test the ordering with different user roles since separators only show when users can see modules both above and below them in the navigation sequence.
Implementing Dynamic Module Queries for Personalized Navigation
Your service desk needs personalized incident queues where agents automatically see modules for incidents assigned to their team, managed by their group, or in their location, without manual filter configuration. The navigation should dynamically update when user assignments change without requiring administrator intervention.
// Create modules with dynamic queries using session variables
// Module 1: My Assigned Incidents
var modGR = new GlideRecord('sys_app_module');
modGR.initialize();
modGR.setValue('title', 'My Assigned Incidents');
modGR.setValue('application', incident_app_sys_id);
modGR.setValue('link_type', 'LIST');
modGR.setValue('table', 'incident');
modGR.setValue('query', 'assigned_to=javascript:gs.getUserID()');
modGR.setValue('roles', 'itil');
modGR.setValue('order', 150);
modGR.setValue('active', true);
modGR.insert();
// Module 2: My Team's Incidents
var modGR2 = new GlideRecord('sys_app_module');
modGR2.initialize();
modGR2.setValue('title', 'My Team Incidents');
modGR2.setValue('application', incident_app_sys_id);
modGR2.setValue('link_type', 'LIST');
modGR2.setValue('table', 'incident');
modGR2.setValue('query', 'assignment_group=javascript:gs.getUser().getManagerID()');
modGR2.setValue('roles', 'itil');
modGR2.setValue('order', 160);
modGR2.setValue('active', true);
modGR2.insert();
// Module 3: Location-Based Incidents
var modGR3 = new GlideRecord('sys_app_module');
modGR3.initialize();
modGR3.setValue('title', 'My Location Incidents');
modGR3.setValue('application', incident_app_sys_id);
modGR3.setValue('link_type', 'LIST');
modGR3.setValue('table', 'incident');
modGR3.setValue('query', 'location=javascript:gs.getUser().getLocation()');
modGR3.setValue('roles', 'itil');
modGR3.setValue('order', 170);
modGR3.setValue('active', true);
modGR3.insert();Dynamic queries using javascript: syntax execute every time the module loads, which can impact performance with complex user lookups. Test thoroughly with realistic user loads and consider caching user attributes in session variables for frequently accessed dynamic queries.
Dynamic queries work well for user-specific data but fail when users don't have the expected attributes populated (like missing manager or location assignments). Include fallback logic in your queries or create conditional modules that only appear when users have the required attributes. Monitor module load times through System Diagnostics > Stats since complex javascript queries can slow navigation performance significantly.
The Classic Mistake
Creating modules with identical or near-identical names across different applications, making the Filter Navigator return confusing duplicate results.
The worst offender is creating modules named Users in multiple custom applications. When an admin searches for users in the Filter Navigator, they get five different results: System Security > Users, Employee Center > Users, and three custom application modules all called Users. Even worse, the modules show identical icons and similar descriptions. Users click the wrong one repeatedly, then complain that ServiceNow navigation is "broken" because they're looking at sys_user records when they expected custom employee records.
This happens because the Filter Navigator searches the title field in sys_app_module records across all applications visible to the user. ServiceNow doesn't namespace module names by application in search results—it just returns everything that matches. The user sees multiple identical titles with minimal context about which application owns each module. They guess wrong, waste time, and lose confidence in the navigation system.
// GOOD: Descriptive, unique module names
// HR Application modules:
"HR Employee Records" // Not just "Users"
"HR Org Chart" // Not just "Organization"
"HR Onboarding Tasks" // Not just "Tasks"
// Facilities Application modules:
"Facility Access Cards" // Not just "Cards"
"Space Assignments" // Not just "Assignments"
"Building Maintenance" // Not just "Maintenance"
// Custom IT App modules:
"IT Asset Inventory" // Not just "Assets"
"Software Licenses" // Not just "Licenses"
"IT Service Requests" // Not just "Requests"Module names must be globally unique and descriptive. Include the application context or business function in every module title, even if it seems redundant within the application menu.
When to Use This vs Alternatives
Use the Application Navigator for structured, role-based access to forms, lists, and reports that users access regularly as part of their workflow. This is the primary navigation method for users who need consistent access to the same set of ServiceNow functionality day-to-day. The Navigator excels when you have defined user roles that map to specific applications and modules.
When Application Navigator is the Right Choice
Choose Application Navigator when users need organized access to multiple related tables and functions within a business domain. It's superior to workspace tabs or dashboard buttons for comprehensive administrative functions because it provides hierarchical organization and contextual grouping. The Navigator also handles role-based security better than custom UI pages, automatically hiding modules based on ACL rules and role assignments.
When to Use Workspaces Instead
Use Agent Workspace or Employee Center workspaces when users focus on individual record processing or case resolution rather than navigating between different table types. Workspaces excel for single-purpose roles like incident handlers or request fulfillers who spend most of their time in forms and related records. The contextual side panels and embedded lists in workspaces are more efficient than jumping between Navigator modules for record-centric work.
When You Need Both Together
Configure both Application Navigator modules and workspace experiences for roles that switch between administrative tasks and operational work. For example, IT managers need Navigator modules for user administration, reporting, and configuration, but also need ITSM workspace access for escalated incidents. Use the Navigator for setup and oversight functions, workspaces for daily operational tasks, and ensure both respect the same role-based access controls.
Platform Interactions & Side Effects
- ACL rules automatically filter visible modules based on
sys_app_module.rolesand table-level read access—modules disappear silently when users lack proper roles - Module conditions are evaluated on every page load and cached per user session in
user_preferencetable, causing performance issues with complex scripted conditions - Update sets capture
sys_app_moduleandsys_app_applicationchanges but don't handle module ordering conflicts between instances - Module filter preferences are stored in
sys_user_preference.name='navigator.expanded'and can become corrupted with invalid JSON, breaking navigation - Business rules firing on
sys_app_moduletable can break module creation workflows and cause infinite loops during Application Creator processes - Global search indexing includes module titles from
sys_app_module.title, causing navigation modules to appear in general search results unexpectedly - Module
hintfields support HTML but are not sanitized, creating XSS vulnerabilities when populated from user input or external sources - Database views defined in module
filterfield override user's personal list filters and can't be modified by end users, causing confusion - Module analytics track clicks in
syslog_transactionwithtype='security'whenglide.ui.security.track_navigation_access=true - Related list modules create hidden
sys_ui_listrecords that conflict with manual list configurations on the same table and view
Debugging and Troubleshooting
When modules don't appear in the Application Navigator, users see empty applications or missing menu items without error messages. Admins typically discover this when users report they "can't find" functionality that was working previously. The most common symptoms are modules that appear for admin users but not for regular users, modules that disappear after role changes, or Filter Navigator searches returning no results for known module names. Check System Log > All for ACL denials with source security_acl and look for entries mentioning the module's target table. Module condition failures generate JavaScript errors in the browser console but not in ServiceNow logs, so check browser developer tools for condition script errors.
Module ordering and display issues manifest as applications appearing in wrong positions or modules showing in incorrect sequence within applications. Navigate to System Definition > Application Menus and check order field values for overlapping numbers. Use Background Scripts to query module conditions that may be returning inconsistent results. Filter Navigator problems often stem from corrupted user preferences—clear them by deleting records from sys_user_preference where name starts with navigator for the affected user.
Diagnostic Checklist:
- Impersonate the affected user and verify role assignments in
User Administration > Usersrole tabs - Check module
activecheckbox andconditionscript insys_app_moduletable - Test module URL directly by copying
link_typevalue and browsing to the target page - Verify table ACL read permissions using
Access Control Debugwithglide.security.ui.acl.debug=true - Clear browser cache and user session, then logout/login to refresh Navigator cache
- Check application
activestatus anduser_rolefield insys_app_applicationrecord - Run Navigator rebuild using
gs.clearNavigatorCache()in Background Scripts for persistent issues
Quick Reference
- Module
orderfield accepts decimals—use 100, 110, 120 for easy insertion rather than 1, 2, 3 - Filter Navigator searches module
titleandhintfields but ignores application names—add keywords to hint for better discoverability - Maximum of 50 modules per application before Navigator performance degrades noticeably in Classic UI
- Module condition scripts can't access
currentobject—usegs.getUser()andgs.hasRole()instead - Separator modules with
link_type='SEPARATOR'don't display in Next Experience but still affect module ordering - Module icons support custom images but require 16x16 pixel PNG files uploaded to
sys_attachmenttable with specific naming - URL-type modules with
link_type='DIRECT'don't inherit user session context—external URLs won't have ServiceNow authentication - Application scope affects module creation but not visibility—Global modules appear in scoped applications if roles match
- Module
window_namefield controls browser tab targeting—identical values force single tab reuse across modules - Deep-linking to modules requires
$navpage.doURL format with modulesys_idparameter for bookmarking specific Navigator locations