Analytics Dashboard and Visualization Generation
Overview
This skill covers generating analytics dashboards, Performance Analytics (PA) indicators, data collectors, widgets, and standard reports from natural language descriptions:
- Creating PA indicators to track key metrics over time
- Configuring data collectors to gather and store metric snapshots
- Building dashboard layouts with widgets and visualizations
- Generating standard reports with charts, lists, and pivot tables
- Mapping natural language metric descriptions to ServiceNow PA configuration
- Combining PA and reporting for comprehensive analytics solutions
When to use: When stakeholders request new dashboards, KPI tracking, trend analysis, or when translating business reporting requirements into ServiceNow analytics configuration.
Prerequisites
- Roles:
pa_admin,report_admin, oradmin - Access: pa_dashboards, pa_widgets, pa_indicators, pa_data_collectors, sys_report tables
- Knowledge: Performance Analytics concepts, ServiceNow reporting framework, data aggregation methods
- Plugins: Performance Analytics (com.snc.pa) must be activated for PA features
- Related Skills: Complete
reporting/query-generationfor advanced query construction
Procedure
Step 1: Understand the Analytics Data Model
pa_dashboards (Dashboard)
├── pa_tabs (Dashboard Tabs)
│ └── pa_widgets (Widget Instances)
│ └── pa_widget_indicators (Widget-Indicator Links)
├── pa_indicators (Indicators/KPIs)
│ ├── pa_indicator_source (Indicator Sources)
│ └── pa_data_collectors (Data Collectors)
│ └── pa_job_logs (Collection Logs)
└── sys_report (Standard Reports)
Key Tables:
| Table | Purpose |
|---|---|
| pa_dashboards | Dashboard container definitions |
| pa_widgets | Widget instances placed on dashboards |
| pa_indicators | KPI/metric definitions with formulas |
| pa_data_collectors | Scheduled jobs that collect indicator data |
| sys_report | Standard ServiceNow reports (charts, lists, pivot tables) |
Step 2: Create a PA Indicator
Indicators define WHAT to measure.
Create a count-based indicator:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: pa_indicators
data:
name: "Open Critical Incidents"
description: "Count of open incidents with priority 1 (Critical)"
type: 1
aggregate: "COUNT"
table: "incident"
conditions: "active=true^priority=1"
frequency: "daily"
direction: "minimize"
unit: "incidents"
precision: 0
active: true
REST Alternative:
curl -u "$SN_USER:$SN_PASS" \
"$SN_INSTANCE/api/now/table/pa_indicators" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-X POST \
-d '{
"name": "Open Critical Incidents",
"description": "Count of open incidents with priority 1",
"type": 1,
"aggregate": "COUNT",
"table": "incident",
"conditions": "active=true^priority=1",
"frequency": "daily",
"active": true
}'
Create an average-based indicator:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: pa_indicators
data:
name: "Average Incident Resolution Time"
description: "Average time in hours from opening to resolution"
type: 1
aggregate: "AVG"
table: "incident"
field: "business_duration"
conditions: "state=6^resolved_atISNOTEMPTY"
frequency: "daily"
direction: "minimize"
unit: "hours"
precision: 1
active: true
Create a percentage indicator:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: pa_indicators
data:
name: "SLA Compliance Rate"
description: "Percentage of incidents resolved within SLA"
type: 2
aggregate: "COUNT"
table: "incident"
conditions: "state=6"
numerator_conditions: "state=6^made_sla=true"
frequency: "daily"
direction: "maximize"
unit: "%"
precision: 1
active: true
Step 3: Create Data Collectors
Data collectors define WHEN and HOW to gather indicator data.
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: pa_data_collectors
data:
indicator: [indicator_sys_id]
name: "Daily Open Critical Incidents Collector"
active: true
run_as: "system"
collection_frequency: "daily"
is_scheduled: true
REST Alternative:
curl -u "$SN_USER:$SN_PASS" \
"$SN_INSTANCE/api/now/table/pa_data_collectors" \
-H "Content-Type: application/json" \
-X POST \
-d '{
"indicator": "[indicator_sys_id]",
"name": "Daily Open Critical Incidents Collector",
"active": true,
"collection_frequency": "daily",
"is_scheduled": true
}'
Step 4: Create a Dashboard
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: pa_dashboards
data:
name: "IT Service Management Overview"
description: "Executive dashboard for ITSM key performance indicators"
active: true
published: true
owner: [user_sys_id]
REST Alternative:
curl -u "$SN_USER:$SN_PASS" \
"$SN_INSTANCE/api/now/table/pa_dashboards" \
-H "Content-Type: application/json" \
-X POST \
-d '{
"name": "IT Service Management Overview",
"description": "Executive dashboard for ITSM KPIs",
"active": true,
"published": true
}'
Step 5: Add Widgets to Dashboard
PA Indicator Widget Types:
| Type | Value | Use Case |
|---|---|---|
| Scorecard | scorecard | Single KPI with trend |
| Time Series | time_series | Metric over time (line chart) |
| Breakdown | breakdown | Metric split by dimension |
| Dial | dial | Gauge-style single metric |
| Single Score | single_score | Large number display |
| List | list | Tabular data |
| Pivot Table | pivot | Cross-tabulation |
Create a scorecard widget:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: pa_widgets
data:
dashboard: [dashboard_sys_id]
indicator: [indicator_sys_id]
visualization: "scorecard"
name: "Critical Incidents Scorecard"
row: 0
column: 0
width: 6
height: 4
active: true
Create a time series widget:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: pa_widgets
data:
dashboard: [dashboard_sys_id]
indicator: [indicator_sys_id]
visualization: "time_series"
name: "Incident Volume Trend"
row: 0
column: 6
width: 6
height: 4
active: true
time_series_period: "last_12_months"
Create a breakdown widget:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: pa_widgets
data:
dashboard: [dashboard_sys_id]
indicator: [indicator_sys_id]
visualization: "breakdown"
name: "Incidents by Priority"
breakdown: [breakdown_sys_id]
row: 4
column: 0
width: 6
height: 4
active: true
chart_type: "bar"
Step 6: Create Standard Reports
For simpler reporting needs without PA overhead, use sys_report.
Create a bar chart report:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: sys_report
data:
title: "Incidents by Category"
table: "incident"
type: "bar"
field: "category"
filter: "active=true"
aggregate: "COUNT"
group: "category"
is_published: true
active: true
chart_size: "large"
REST Alternative:
curl -u "$SN_USER:$SN_PASS" \
"$SN_INSTANCE/api/now/table/sys_report" \
-H "Content-Type: application/json" \
-X POST \
-d '{
"title": "Incidents by Category",
"table": "incident",
"type": "bar",
"field": "category",
"filter": "active=true",
"aggregate": "COUNT",
"is_published": true
}'
Create a trend report:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: sys_report
data:
title: "Weekly Incident Volume"
table: "incident"
type: "line"
field: "sys_created_on"
filter: "sys_created_on>=javascript:gs.daysAgo(90)"
aggregate: "COUNT"
trend_field: "sys_created_on"
interval: "week"
is_published: true
active: true
Create a pivot table report:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: sys_report
data:
title: "Incidents: Priority vs State"
table: "incident"
type: "pivot"
field: "priority"
stack: "state"
filter: "sys_created_on>=javascript:gs.daysAgo(30)"
aggregate: "COUNT"
is_published: true
active: true
Step 7: Create PA Breakdowns
Breakdowns define dimensions for slicing indicator data.
MCP Approach:
Tool: SN-Query-Table
Parameters:
table_name: pa_breakdowns
query: table=incident^active=true
fields: sys_id,name,field,table
limit: 50
If a needed breakdown does not exist:
Tool: SN-Create-Record
Parameters:
table_name: pa_breakdowns
data:
name: "Incident Priority Breakdown"
table: "incident"
field: "priority"
active: true
Step 8: Validate and Test
Verify indicator configuration:
MCP Approach:
Tool: SN-Query-Table
Parameters:
table_name: pa_indicators
query: sys_id=[indicator_sys_id]
fields: sys_id,name,aggregate,table,conditions,frequency,active
Verify dashboard widgets:
MCP Approach:
Tool: SN-Query-Table
Parameters:
table_name: pa_widgets
query: dashboard=[dashboard_sys_id]
fields: sys_id,name,visualization,indicator,row,column,width,height,active
limit: 50
Check data collector status:
MCP Approach:
Tool: SN-Query-Table
Parameters:
table_name: pa_data_collectors
query: indicator=[indicator_sys_id]
fields: sys_id,name,active,is_scheduled,last_collection_time
Tool Usage
| Action | MCP Tool | REST Endpoint |
|---|---|---|
| Create indicator | SN-Create-Record | POST /api/now/table/pa_indicators |
| Create data collector | SN-Create-Record | POST /api/now/table/pa_data_collectors |
| Create dashboard | SN-Create-Record | POST /api/now/table/pa_dashboards |
| Add widget | SN-Create-Record | POST /api/now/table/pa_widgets |
| Create report | SN-Create-Record | POST /api/now/table/sys_report |
| Query indicators | SN-Query-Table | GET /api/now/table/pa_indicators |
| Query dashboards | SN-Query-Table | GET /api/now/table/pa_dashboards |
| Update widget | SN-Update-Record | PATCH /api/now/table/pa_widgets/{sys_id} |
Best Practices
- Start with indicators: Define metrics before building dashboards; indicators are the foundation
- Use daily frequency for most KPIs: Daily collection balances granularity with performance
- Set direction on indicators: Specify "minimize" or "maximize" so trends show improvement correctly
- Design for the audience: Executive dashboards should have 4-6 widgets; operational dashboards can have more
- Use breakdowns for drill-down: Allow users to slice data by priority, category, group, or location
- Combine PA and standard reports: Use PA for trends and KPIs; use sys_report for ad-hoc lists and detail views
- Test data collection: Run a manual collection to verify indicator conditions return expected results
- Set thresholds and targets: Configure indicator thresholds to enable red/yellow/green visualization
- Avoid over-aggregation: Too many breakdowns on a single widget makes data hard to read
- Document indicator formulas: Use the description field to explain what each indicator measures and why
Troubleshooting
Indicator Shows No Data
Symptom: Indicator exists but displays zero or no data Causes:
- Data collector not active or not yet run
- Conditions filter returns no records
- Indicator frequency mismatch with collection schedule Solution:
Tool: SN-Query-Table
Parameters:
table_name: pa_data_collectors
query: indicator=[indicator_sys_id]
fields: sys_id,name,active,is_scheduled,last_collection_time
Then verify the condition query returns data:
Tool: SN-Query-Table
Parameters:
table_name: incident
query: active=true^priority=1
fields: sys_id
limit: 1
Dashboard Not Visible
Symptom: Dashboard created but not appearing in navigation Causes:
- Dashboard not published
- User lacks pa_viewer or pa_admin role
- Dashboard not active Solution:
Tool: SN-Update-Record
Parameters:
table_name: pa_dashboards
sys_id: [dashboard_sys_id]
data:
published: true
active: true
Report Filter Not Working
Symptom: Report shows all records instead of filtered set Cause: Filter encoded query syntax incorrect Solution: Validate the encoded query:
Tool: SN-Query-Table
Parameters:
table_name: incident
query: [your_filter_query]
fields: sys_id
limit: 5
If results are unexpected, adjust the query.
Widget Overlapping on Dashboard
Symptom: Widgets overlap or display incorrectly Cause: Row/column/width/height values conflict Solution: Review all widget positions:
Tool: SN-Query-Table
Parameters:
table_name: pa_widgets
query: dashboard=[dashboard_sys_id]
fields: name,row,column,width,height
limit: 20
Examples
Example 1: ITSM Executive Dashboard
# 1. Create indicators
Tool: SN-Create-Record
Parameters:
table_name: pa_indicators
data:
name: "Open Incidents"
aggregate: "COUNT"
table: "incident"
conditions: "active=true"
frequency: "daily"
active: true
# Result: indicator1_sys_id
Tool: SN-Create-Record
Parameters:
table_name: pa_indicators
data:
name: "MTTR (Hours)"
aggregate: "AVG"
table: "incident"
field: "business_duration"
conditions: "state=6^sys_created_on>=javascript:gs.daysAgo(30)"
frequency: "daily"
active: true
# Result: indicator2_sys_id
# 2. Create data collectors for each indicator
Tool: SN-Create-Record
Parameters:
table_name: pa_data_collectors
data:
indicator: indicator1_sys_id
name: "Open Incidents Daily"
active: true
is_scheduled: true
# 3. Create dashboard
Tool: SN-Create-Record
Parameters:
table_name: pa_dashboards
data:
name: "ITSM Executive Dashboard"
published: true
active: true
# Result: dashboard_sys_id
# 4. Add widgets
Tool: SN-Create-Record
Parameters:
table_name: pa_widgets
data:
dashboard: dashboard_sys_id
indicator: indicator1_sys_id
visualization: "single_score"
name: "Open Incidents"
row: 0
column: 0
width: 3
height: 3
Tool: SN-Create-Record
Parameters:
table_name: pa_widgets
data:
dashboard: dashboard_sys_id
indicator: indicator2_sys_id
visualization: "time_series"
name: "MTTR Trend"
row: 0
column: 3
width: 9
height: 6
Example 2: Quick Standard Report
Tool: SN-Create-Record
Parameters:
table_name: sys_report
data:
title: "Top 10 Incident Categories This Month"
table: "incident"
type: "bar"
field: "category"
filter: "sys_created_on>=javascript:gs.beginningOfThisMonth()"
aggregate: "COUNT"
orderby: "COUNT"
order_direction: "desc"
row_count: 10
is_published: true
Related Skills
reporting/query-generation- Generate complex queries for reportsitsm/incident-lifecycle- Incident data model contextdevelopment/scheduled-jobs- Configure scheduled data collectionea/business-app-insights- Application-level analytics