Saved Searches
Master NetSuite's most powerful reporting tool: saved searches with filters, formulas, summarization, and scheduling.
Saved Searches Overview
Saved searches are NetSuite's Swiss Army knife for data retrieval. They power reports, KPIs, portlets, dropdowns, script data sources, and mass updates. Mastering saved searches is essential for any NetSuite implementation.
| Use Case | Description | Example |
|---|---|---|
| Reports | Ad-hoc and scheduled data retrieval | Open invoices by customer |
| Dashboard Portlets | Real-time KPIs and lists | Top 10 customers this month |
| Form Dropdowns | Filter available selections | Active vendors only |
| Script Data Sources | Query data in SuiteScript | Process pending orders |
| Mass Updates | Identify records for bulk changes | Inactive customers to archive |
| Workflows | Condition evaluation and transitions | Escalate overdue tasks |
Search Architecture
SAVED SEARCH STRUCTURE
═══════════════════════════════════════════════════════════════
┌─────────────────────────────────────────────────────────────┐
│ SEARCH DEFINITION │
├─────────────────────────────────────────────────────────────┤
│ Record Type: Transaction, Customer, Item, etc. │
│ Search Title: Human-readable name │
│ Search ID: customsearch_xxx (for scripting) │
│ Public: Available to all roles │
│ Audience: Specific roles/employees │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ CRITERIA │ │ RESULTS │ │ AVAILABLE │
│ (Filters) │ │ (Columns) │ │ (Filters) │
├─────────────┤ ├─────────────┤ ├─────────────┤
│ Standard │ │ Fields │ │ User-facing │
│ filters │ │ Formulas │ │ filter │
│ Summary │ │ Summary │ │ options at │
│ type │ │ functions │ │ runtime │
│ Filter │ │ Sort order │ │ │
│ expressions │ │ Links │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
Filter Types
| Filter Type | Description | Example |
|---|---|---|
| Standard | Simple field comparisons | Status = Open |
| Date Range | Relative or absolute dates | Created within last 30 days |
| Is Empty / Not Empty | Null value checks | Email is not empty |
| Contains / Starts With | Text pattern matching | Name contains "Corp" |
| Any Of / None Of | Multi-value selection | Type is any of: Invoice, Credit Memo |
| Formula (Numeric) | SQL expression returning number | CASE WHEN {amount} > 1000 THEN 1 ELSE 0 END = 1 |
| Formula (Text) | SQL expression returning text | SUBSTR({tranid}, 1, 3) = 'INV' |
Formula Fields
Formula fields use SQL syntax to calculate values. Common functions:
COMMON FORMULA PATTERNS
═══════════════════════════════════════════════════════════════
DATE CALCULATIONS
───────────────────────────────────────────────────────────────
Days Since: {today} - {trandate}
Days Until Due: {duedate} - {today}
Month Name: TO_CHAR({trandate}, 'Month YYYY')
Fiscal Quarter: 'Q' || TO_CHAR({trandate}, 'Q') || ' ' || TO_CHAR({trandate}, 'YYYY')
TEXT MANIPULATION
───────────────────────────────────────────────────────────────
Concatenate: {firstname} || ' ' || {lastname}
Extract: SUBSTR({tranid}, 1, 3)
Replace: REPLACE({phone}, '-', '')
Upper/Lower: UPPER({name}) / LOWER({email})
CONDITIONAL LOGIC
───────────────────────────────────────────────────────────────
Simple IF: CASE WHEN {amount} > 0 THEN 'Credit' ELSE 'Debit' END
Nested: CASE
WHEN {daysoverdue} > 90 THEN 'Critical'
WHEN {daysoverdue} > 60 THEN 'High'
WHEN {daysoverdue} > 30 THEN 'Medium'
ELSE 'Current'
END
Null Check: NVL({memo}, 'No memo')
NullIf: NULLIF({quantity}, 0)
NUMERIC CALCULATIONS
───────────────────────────────────────────────────────────────
Percentage: ROUND({amount} / NULLIF({total}, 0) * 100, 2)
Running Total: SUM({amount}) OVER (ORDER BY {trandate})
Absolute: ABS({amount})
Round: ROUND({rate}, 2)
Summary Types
Summary searches aggregate data across records:
| Summary | Function | Use Case |
|---|---|---|
| Group | Group by this field | Customer name, Month |
| Sum | Total numeric values | Total sales amount |
| Count | Count of records | Number of orders |
| Average | Mean value | Average order size |
| Minimum | Lowest value | First order date |
| Maximum | Highest value | Largest invoice |
Joins and Related Records
SEARCH JOINS
═══════════════════════════════════════════════════════════════
TRANSACTION SEARCH (Invoice)
│
├── Main Record Fields
│ └── {tranid}, {trandate}, {amount}, {status}
│
├── Customer Join (entity...)
│ └── {entity.companyname}, {entity.email}, {entity.salesrep}
│
├── Item Join (item...)
│ └── {item.displayname}, {item.type}, {item.class}
│
├── Created By Join (createdby...)
│ └── {createdby.entityid}, {createdby.email}
│
├── Applied To Join (appliedtotransaction...)
│ └── {appliedtotransaction.tranid}, {appliedtotransaction.type}
│
└── Custom Record Join (custbody_xxx...)
└── {custbody_project.custrecord_project_manager}
JOIN NOTATION:
───────────────────────────────────────────────────────────────
{fieldname} Main record field
{join.fieldname} Related record field
{join.join2.fieldname} Nested join (2 levels max)
Performance Optimization
- Use indexed fields in filters: Internal ID, Date, Status, Type
- Avoid formula filters: Filter first, then calculate
- Limit result columns: Only include fields you need
- Use date ranges: Don't search all historical data
- Avoid "contains" on large text fields: Use "starts with" instead
- Pre-filter with standard filters: Before applying formulas
Search Scheduling
| Option | Description |
|---|---|
| Recipients | Employees, groups, or specific email addresses |
| Schedule | Daily, Weekly, Monthly, or specific days |
| Time | Specific time of day (in account timezone) |
| Format | CSV, PDF, or Excel attachment |
| Send If Empty | Option to suppress emails with no results |
Create a "Saved Search Library" document for each implementation. Include search name, ID, purpose, key filters, and owner. Clients often have hundreds of searches with no documentation—this becomes a maintenance nightmare. Also establish naming conventions: prefix with department or function (e.g., FIN_Open_AP, OPS_Pending_Orders).
Implementation Checklist
Reports
Standard reports, Financial Report Builder, and custom report configurations.
Reports Overview
NetSuite provides hundreds of standard reports across all functional areas. Understanding report types and customization options helps deliver the right information to stakeholders.
| Report Type | Description | Examples |
|---|---|---|
| Financial Statements | GAAP-compliant financial reports | Balance Sheet, Income Statement, Cash Flow |
| Transaction Reports | Lists of transactions with details | Sales by Customer, A/R Aging, Open POs |
| Summary Reports | Aggregated data by dimension | Sales by Item Category, Expenses by Department |
| Comparative Reports | Period-over-period analysis | Budget vs. Actual, YoY Comparison |
| Register Reports | Detailed transaction registers | General Ledger, A/P Register |
Financial Report Builder
The Financial Report Builder creates customized financial statements with full control over row/column structure:
FINANCIAL REPORT STRUCTURE
═══════════════════════════════════════════════════════════════
│ Jan 2025 │ Feb 2025 │ Mar 2025 │ Q1 Total │
────────────────────┼───────────┼───────────┼───────────┼───────────┤
REVENUE │ │ │ │ │
Product Sales │ 125,000 │ 142,000 │ 138,000 │ 405,000 │
Service Revenue │ 45,000 │ 48,000 │ 52,000 │ 145,000 │
Other Income │ 5,000 │ 3,500 │ 4,200 │ 12,700 │
────────────────────┼───────────┼───────────┼───────────┼───────────┤
TOTAL REVENUE │ 175,000 │ 193,500 │ 194,200 │ 562,700 │
│ │ │ │ │
COST OF GOODS SOLD │ │ │ │ │
Direct Materials │ 50,000 │ 56,800 │ 55,200 │ 162,000 │
Direct Labor │ 25,000 │ 28,400 │ 27,600 │ 81,000 │
────────────────────┼───────────┼───────────┼───────────┼───────────┤
TOTAL COGS │ 75,000 │ 85,200 │ 82,800 │ 243,000 │
│ │ │ │ │
GROSS PROFIT │ 100,000 │ 108,300 │ 111,400 │ 319,700 │
Gross Margin % │ 57.1% │ 56.0% │ 57.4% │ 56.8% │
ROW DEFINITIONS:
───────────────────────────────────────────────────────────────
• Account ranges (4000-4999)
• Account types (Income, Expense)
• Specific accounts
• Calculated rows (formulas)
• Subtotal rows
• Blank/header rows
COLUMN DEFINITIONS:
───────────────────────────────────────────────────────────────
• Date range (absolute or relative)
• Subsidiary/Location/Class/Department
• Budget vs. Actual
• Comparative periods
• Calculated columns (variance, %)
Financial Report Builder Features
| Feature | Description |
|---|---|
| Row Layout | Define account groups, subtotals, headers, calculated rows |
| Column Layout | Define periods, subsidiaries, dimensions, calculations |
| Filtering | Restrict by subsidiary, location, department, class |
| Calculated Rows | Sum, difference, percentage of other rows |
| Drill-Down | Click amounts to see underlying transactions |
| Export | Excel, PDF, CSV formats |
Report Customization
Standard reports can be customized without building from scratch:
Key Financial Reports
| Report | Purpose | Key Filters |
|---|---|---|
| Balance Sheet | Assets, liabilities, equity at point in time | As of date, subsidiary |
| Income Statement | Revenue and expenses for period | Date range, subsidiary, department |
| Cash Flow Statement | Cash movement by activity | Date range, subsidiary |
| Trial Balance | All account balances | Date range, include zeros |
| General Ledger | Transaction detail by account | Account, date range |
| A/R Aging | Outstanding receivables by age | As of date, aging periods |
| A/P Aging | Outstanding payables by age | As of date, aging periods |
Report Scheduling
Schedule reports for automatic distribution:
| Setting | Options |
|---|---|
| Frequency | Daily, Weekly, Monthly, Quarterly |
| Format | PDF, Excel, CSV |
| Recipients | Employees, roles, email addresses |
| Subject Line | Custom email subject |
Create a standard "Financial Reporting Pack" for monthly close: Balance Sheet, Income Statement (with budget comparison), Cash Flow, Departmental P&Ls, and Key Metrics. Schedule to distribute on close day +2 to give accounting time to complete close.
When building custom financial reports, always start by asking "What decisions will this report inform?" Map report columns to actual business questions. Avoid building 50-column reports when 5 columns answer the real question. Also verify sign conventions—NetSuite shows debits as positive, which confuses users expecting income as positive.
Datasets & Workbooks
SuiteAnalytics Workbook for advanced multi-dataset analysis with pivots and visualizations.
SuiteAnalytics Workbook Overview
SuiteAnalytics Workbook provides a modern, Excel-like analytics experience within NetSuite. It overcomes many saved search limitations with multi-dataset joins, advanced pivoting, and rich visualizations.
| Feature | Saved Searches | SuiteAnalytics Workbook |
|---|---|---|
| Data Sources | Single record type with joins | Multiple datasets with joins |
| Joins | 2 levels maximum | Unlimited dataset joins |
| Pivoting | Basic summary grouping | Full pivot table functionality |
| Visualizations | Highlighting only | Charts, graphs, conditional formatting |
| Interactivity | Limited | Drill-down, slice and dice |
| Performance | Can be slow with complexity | Optimized for large datasets |
Workbook Architecture
WORKBOOK STRUCTURE
═══════════════════════════════════════════════════════════════
WORKBOOK
├── DATA
│ ├── Dataset 1: Transactions
│ │ ├── Fields: Date, Amount, Customer, Item
│ │ └── Filters: Date range, Status
│ │
│ ├── Dataset 2: Customers
│ │ ├── Fields: Name, Industry, Sales Rep
│ │ └── Filters: Active only
│ │
│ └── Joins
│ └── Transactions.Customer = Customers.ID
│
├── PIVOT TABLES
│ ├── Pivot 1: Sales by Month x Customer
│ └── Pivot 2: Sales by Item Category x Region
│
├── CHARTS
│ ├── Chart 1: Monthly Trend Line
│ ├── Chart 2: Top 10 Customers Bar
│ └── Chart 3: Category Pie Chart
│
└── TABLES
└── Table 1: Transaction Detail List
Dataset Creation
Dataset Components
| Component | Description |
|---|---|
| Record Type | Primary record (Transaction, Customer, Item, etc.) |
| Fields | Columns to include in dataset |
| Formulas | Calculated fields using SQL expressions |
| Criteria | Filters to restrict records |
| Joins | Related records to include |
Pivot Tables
Pivot tables summarize large datasets dynamically:
PIVOT TABLE EXAMPLE
═══════════════════════════════════════════════════════════════
CONFIGURATION:
Rows: Customer Industry
Columns: Fiscal Quarter
Values: Sum of Amount, Count of Transactions
Filters: Year = 2025
RESULT:
───────────────────────────────────────────────────────────────
│ Q1 2025 │ Q2 2025 │ Q3 2025 │
Industry │ Amount Count │ Amount Count │ Amount Count │
────────────────┼───────────────┼───────────────┼───────────────┤
Manufacturing │ $425K 142 │ $512K 168 │ $489K 155 │
Retail │ $312K 287 │ $398K 324 │ $445K 356 │
Services │ $189K 67 │ $223K 78 │ $256K 89 │
Technology │ $567K 45 │ $623K 52 │ $701K 58 │
────────────────┼───────────────┼───────────────┼───────────────┤
Grand Total │ $1.49M 541 │ $1.76M 622 │ $1.89M 658 │
Visualizations
| Chart Type | Best For | Example |
|---|---|---|
| Line Chart | Trends over time | Monthly revenue trend |
| Bar Chart | Category comparison | Sales by region |
| Pie/Donut | Part-to-whole | Revenue by product line |
| Area Chart | Cumulative trends | Cumulative bookings |
| Scatter Plot | Correlation | Spend vs. revenue |
| Table | Detailed data | Transaction list with totals |
Multi-Dataset Joins
DATASET JOIN EXAMPLE
═══════════════════════════════════════════════════════════════
USE CASE: Customer Profitability Analysis
Dataset 1: Invoices
└── Customer ID, Invoice Amount, Invoice Date
Dataset 2: Payments
└── Customer ID, Payment Amount, Payment Date
Dataset 3: Support Cases
└── Customer ID, Case Count, Resolution Hours
Dataset 4: Customers
└── Customer ID, Name, Industry, Acquisition Date
JOINS:
───────────────────────────────────────────────────────────────
Invoices.Customer ──► Customers.ID
Payments.Customer ──► Customers.ID
Cases.Customer ──► Customers.ID
RESULT: Single view with revenue, collections, and support cost
by customer—impossible in a single saved search!
Create reusable datasets for common analysis needs: "Core Transaction Dataset," "Customer Master Dataset," "Item Catalog Dataset." Multiple workbooks can reference the same dataset, ensuring consistency and reducing maintenance.
SuiteAnalytics Workbook is the future of NetSuite reporting. Start moving power users from complex saved searches to workbooks. The learning curve is minimal for anyone with Excel pivot table experience. Key advantage: workbooks let you ask follow-up questions (slice, filter, drill) without creating new searches.
Analytics Warehouse (NSAW)
NetSuite Analytics Warehouse for enterprise-grade BI, cross-subsidiary reporting, and advanced analytics.
Analytics Warehouse Overview
NetSuite Analytics Warehouse (NSAW) is a cloud data warehouse that replicates NetSuite data for advanced analytics. It enables enterprise BI capabilities without impacting transactional system performance.
| Capability | Standard NetSuite | Analytics Warehouse |
|---|---|---|
| Query Performance | Shares production resources | Dedicated warehouse |
| Historical Data | Limited by retention | Extended history |
| Cross-Subsidiary | Complex setup required | Pre-built consolidation |
| External Data | Requires integration | Native data blending |
| BI Tool Access | SuiteAnalytics Connect | Direct warehouse access |
| Pre-built Analytics | Standard reports only | Industry analytics packs |
NSAW Architecture
ANALYTICS WAREHOUSE ARCHITECTURE
═══════════════════════════════════════════════════════════════
┌─────────────────────────────────────────────────────────────┐
│ NETSUITE ERP │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Transactions│ │ Customers │ │ Items │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
└─────────┼───────────────┼───────────────┼───────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ DATA REPLICATION (Near Real-Time) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ ANALYTICS WAREHOUSE (NSAW) │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ PRE-BUILT DATA MODELS ││
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ││
│ │ │Financial│ │ Sales │ │Procure- │ │Inventory│ ││
│ │ │ Cube │ │ Cube │ │ment Cube│ │ Cube │ ││
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ ││
│ └─────────────────────────────────────────────────────────┘│
│ ┌─────────────────────────────────────────────────────────┐│
│ │ ANALYTICS INTERFACE ││
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ││
│ │ │Dashboard│ │ Reports │ │ Query │ ││
│ │ │ Builder │ │ Builder │ │ Direct │ ││
│ │ └─────────┘ └─────────┘ └─────────┘ ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Embedded │ │ External │ │ Export │
│ Dashboards │ │ BI Tools │ │ (Excel) │
└─────────────┘ └─────────────┘ └─────────────┘
Pre-Built Analytics
NSAW includes ready-to-use analytics for common business needs:
| Analytics Pack | Key Metrics |
|---|---|
| Financial Analytics | P&L trends, balance sheet analysis, cash flow, working capital |
| Sales Analytics | Pipeline analysis, win/loss, sales cycle, rep performance |
| Procurement Analytics | Spend analysis, vendor performance, PO cycle time |
| Inventory Analytics | Turns, aging, stockouts, demand planning |
| Revenue Analytics | ARR/MRR trends, churn, cohort analysis |
NSAW now provides AI-powered contextual insights that automatically surface anomalies, trends, and recommendations. The system learns from your data patterns and proactively highlights items requiring attention—like a significant variance from last month or unusual transaction patterns.
Dashboard Builder
Create executive dashboards with drag-and-drop interface:
EXECUTIVE DASHBOARD EXAMPLE
═══════════════════════════════════════════════════════════════
┌─────────────────────────────────────────────────────────────┐
│ CEO DASHBOARD │
├──────────────────────────┬──────────────────────────────────┤
│ REVENUE YTD │ GROSS MARGIN TREND │
│ ┌─────────────────┐ │ ┌─────────────────────────────┐│
│ │ │ │ │ ╭──────╮ ││
│ │ $12.4M │ │ │ ───╯ ╰─── ││
│ │ ▲ 15% vs LY │ │ │ ││
│ │ │ │ │ Jan Feb Mar Apr May Jun ││
│ └─────────────────┘ │ └─────────────────────────────┘│
├──────────────────────────┼──────────────────────────────────┤
│ TOP 10 CUSTOMERS │ SALES BY REGION │
│ ┌─────────────────┐ │ ┌─────────────────────────────┐│
│ │ Acme Corp $2.1M│ │ │ ████ West 35% ││
│ │ Beta Inc $1.8M│ │ │ ████ East 28% ││
│ │ Gamma LLC $1.2M│ │ │ ████ Central 22% ││
│ │ ... │ │ │ ████ International 15% ││
│ └─────────────────┘ │ └─────────────────────────────┘│
├──────────────────────────┴──────────────────────────────────┤
│ MONTHLY REVENUE TREND │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ ╭─────╮ ││
│ │ ╭────╯ ╰────╮ ╭───── ││
│ │ ───╯ ╰────────╯ ││
│ │ Jan Feb Mar Apr May Jun Jul Aug Sep Oct ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
When to Use NSAW
- Complex multi-subsidiary reporting: Consolidated views across all entities
- Executive dashboards: Real-time KPIs without performance impact
- Historical trend analysis: Multi-year comparisons
- External BI integration: Feed Tableau, Power BI, Looker
- Ad-hoc analysis: Self-service analytics for business users
NSAW is an add-on license—factor this into implementation budgets. It's most valuable for organizations with 3+ subsidiaries, heavy reporting needs, or existing BI tool investments. For simpler needs, SuiteAnalytics Workbook may suffice. The 2025.2 Contextual Insights feature significantly increases value by reducing time spent hunting for important variances.
SuiteAnalytics Connect
ODBC/JDBC connectivity and SuiteQL for external BI tools and custom data extraction.
SuiteAnalytics Connect Overview
SuiteAnalytics Connect provides direct database-style access to NetSuite data via ODBC/JDBC drivers, enabling integration with external BI tools, custom applications, and advanced SQL queries.
| Access Method | Use Case | Tools |
|---|---|---|
| ODBC Driver | Windows-based BI tools | Excel, Power BI, Tableau (Windows) |
| JDBC Driver | Java-based applications | Custom apps, Java BI tools |
| SuiteQL | SQL queries via REST | Any HTTP client, SuiteScript |
Connection Architecture
SUITEANALYTICS CONNECT ARCHITECTURE
═══════════════════════════════════════════════════════════════
┌─────────────────────────────────────────────────────────────┐
│ EXTERNAL TOOLS │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Excel │ │Power BI │ │ Tableau │ │ Custom │ │
│ │ │ │ │ │ │ │ App │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
└───────┼────────────┼────────────┼────────────┼──────────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ SUITEANALYTICS CONNECT │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ │
│ │ ODBC/JDBC │ │ SuiteQL │ │
│ │ Drivers │ │ REST API │ │
│ └───────────┬─────────────┘ └───────────┬─────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ CONNECT SERVICE ││
│ │ • Authentication (Token-based) ││
│ │ • Query Processing ││
│ │ • Role-based Data Access ││
│ │ • Governance Limits ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ NETSUITE DATA │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Transactions│ │ Entities │ │ Items │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
SuiteQL
SuiteQL is NetSuite's SQL-like query language for direct data access:
SUITEQL EXAMPLES
═══════════════════════════════════════════════════════════════
BASIC SELECT
───────────────────────────────────────────────────────────────
SELECT
t.tranid,
t.trandate,
e.companyname AS customer,
t.foreigntotal AS amount
FROM
transaction t
JOIN entity e ON t.entity = e.id
WHERE
t.type = 'CustInvc'
AND t.trandate >= TO_DATE('2025-01-01', 'YYYY-MM-DD')
ORDER BY
t.trandate DESC
AGGREGATION
───────────────────────────────────────────────────────────────
SELECT
TO_CHAR(t.trandate, 'YYYY-MM') AS month,
COUNT(*) AS invoice_count,
SUM(t.foreigntotal) AS total_amount,
AVG(t.foreigntotal) AS avg_amount
FROM
transaction t
WHERE
t.type = 'CustInvc'
AND t.trandate >= ADD_MONTHS(SYSDATE, -12)
GROUP BY
TO_CHAR(t.trandate, 'YYYY-MM')
ORDER BY
month
JOIN MULTIPLE TABLES
───────────────────────────────────────────────────────────────
SELECT
c.companyname,
c.email,
COUNT(t.id) AS order_count,
SUM(t.foreigntotal) AS lifetime_value,
MAX(t.trandate) AS last_order_date
FROM
customer c
LEFT JOIN transaction t ON c.id = t.entity
AND t.type = 'SalesOrd'
GROUP BY
c.id, c.companyname, c.email
HAVING
SUM(t.foreigntotal) > 10000
ORDER BY
lifetime_value DESC
ODBC Setup
Configure ODBC connection for external tools:
| Step | Action |
|---|---|
| 1. Download Driver | Get ODBC driver from NetSuite (Setup → Company → Enable Features) |
| 2. Install Driver | Run installer on client machine |
| 3. Configure DSN | Create Data Source Name in ODBC Administrator |
| 4. Set Credentials | Account ID, Role ID, Email, Password (or token) |
| 5. Test Connection | Verify connectivity before using in tools |
Governance & Limits
- Concurrent queries: Limited per account (typically 5-10)
- Query timeout: Long-running queries may be terminated
- Row limits: Large result sets may be paginated
- Schedule off-peak: Heavy queries should run during low-usage periods
- Role permissions: Connect respects role-based data access
Common Use Cases
| Use Case | Tool | Approach |
|---|---|---|
| Executive Dashboards | Power BI / Tableau | Scheduled refresh from saved queries |
| Financial Modeling | Excel | ODBC connection with pivot tables |
| Data Warehouse ETL | Custom/ETL Tools | SuiteQL extracts via REST API |
| Custom Applications | Web Apps | JDBC or REST/SuiteQL integration |
SuiteAnalytics Connect is often the answer when clients say "We need to get data into [BI tool]." Start with SuiteQL for prototyping—it's faster to iterate than ODBC setup. For production dashboards, consider whether real-time is truly needed; often a nightly extract to a data warehouse provides better performance and doesn't consume NetSuite resources during business hours.
Industry Reporting
Industry-specific KPIs, metrics, and reporting requirements.
Industry KPI Overview
Different industries focus on different metrics. Understanding industry-specific KPIs helps build relevant dashboards and reports that drive business decisions.
| KPI | Formula | Target |
|---|---|---|
| Inventory Turns | COGS / Average Inventory | 4-8x annually |
| Days Sales in Inventory | 365 / Inventory Turns | 45-90 days |
| Gross Margin % | (Revenue - COGS) / Revenue | 25-40% |
| On-Time Delivery | Orders Shipped On Time / Total Orders | >95% |
| Production Variance | Actual Cost - Standard Cost | <5% |
| Scrap Rate | Scrap Value / Production Value | <2% |
| KPI | Formula | Target |
|---|---|---|
| Gross Margin Return on Inventory | Gross Margin $ / Average Inventory | >200% |
| Fill Rate | Lines Shipped Complete / Lines Ordered | >98% |
| Order Cycle Time | Ship Date - Order Date | <2 days |
| Backorder Rate | Backorder Lines / Total Lines | <2% |
| Revenue per Employee | Total Revenue / FTE Count | $500K+ |
| KPI | Formula | Target |
|---|---|---|
| Monthly Recurring Revenue | Sum of monthly subscription fees | Growing |
| Annual Recurring Revenue | MRR × 12 | Growing |
| Customer Churn Rate | Lost Customers / Starting Customers | <5% annually |
| Net Revenue Retention | (Starting ARR + Expansion - Churn) / Starting ARR | >110% |
| Customer Acquisition Cost | Sales & Marketing Spend / New Customers | Varies |
| LTV:CAC Ratio | Customer Lifetime Value / CAC | >3:1 |
| KPI | Formula | Target |
|---|---|---|
| Utilization Rate | Billable Hours / Available Hours | 70-80% |
| Realization Rate | Billed Amount / (Hours × Standard Rate) | >90% |
| Revenue per Consultant | Total Revenue / Consultant FTE | $200-400K |
| Project Margin | (Revenue - Direct Costs) / Revenue | 30-50% |
| Backlog | Contracted but undelivered revenue | 3-6 months |
| KPI | Formula | Target |
|---|---|---|
| Program Expense Ratio | Program Expenses / Total Expenses | >75% |
| Fundraising Efficiency | Funds Raised / Fundraising Costs | >4:1 |
| Donor Retention Rate | Repeat Donors / Prior Year Donors | >45% |
| Grant Utilization | Grant Spent / Grant Received | Per terms |
| Operating Reserve Ratio | Unrestricted Net Assets / Annual Expenses | 3-6 months |
| KPI | Formula | Target |
|---|---|---|
| Days in A/R | A/R Balance / (Annual Revenue / 365) | <40 days |
| Collection Rate | Payments Collected / Charges | >95% |
| Denial Rate | Claims Denied / Claims Submitted | <5% |
| Bad Debt % | Bad Debt / Gross Revenue | <2% |
| Cost per Encounter | Total Costs / Patient Encounters | Varies |
Building Industry Dashboards
DASHBOARD DESIGN FRAMEWORK
═══════════════════════════════════════════════════════════════
1. IDENTIFY KEY QUESTIONS
└── What decisions does this dashboard inform?
2. SELECT METRICS (5-7 MAX)
├── Leading indicators (predict future)
└── Lagging indicators (measure past)
3. DEFINE DATA SOURCES
├── Saved searches for real-time
├── Workbooks for analysis
└── NSAW for historical trends
4. DESIGN LAYOUT
├── Big numbers for KPIs
├── Trends for patterns
└── Tables for details
5. SET REFRESH CADENCE
├── Real-time for operational
├── Daily for management
└── Weekly/Monthly for executive
6. CONFIGURE ALERTS
└── Threshold-based notifications
The best KPI dashboards answer "So what?" Every metric should drive action. If a metric goes red, users should know exactly what to do. During discovery, ask stakeholders: "If this number changed significantly, what would you do differently?" If they can't answer, the metric may not belong on the dashboard.
Implementation Checklist
NetSuite Analytics Warehouse (NSAW) Deep Dive
Master the enterprise analytics platform that transforms NetSuite data into strategic insights. Learn architecture, data modeling, performance optimization, and advanced query techniques.
NSAW Architecture Overview
NETSUITE ANALYTICS WAREHOUSE ARCHITECTURE
═══════════════════════════════════════════════════════════════════
NETSUITE ERP NSAW (Oracle Cloud)
┌───────────────────┐ ┌────────────────────────────┐
│ Transaction Data │ │ DIMENSIONAL DATA MODEL │
│ - Sales Orders │ ETL Pipeline │ ┌──────────────────────┐ │
│ - Invoices │ ─────────────────→ │ │ FACT TABLES │ │
│ - Payments │ (Nightly Sync) │ │ - Transaction Lines │ │
│ - Inventory │ │ │ - GL Journal Lines │ │
│ │ │ │ - Item Fulfillments │ │
│ Master Data │ │ └──────────────────────┘ │
│ - Customers │ │ ┌──────────────────────┐ │
│ - Items │ │ │ DIMENSION TABLES │ │
│ - Vendors │ │ │ - Customer_Dim │ │
│ - Employees │ │ │ - Item_Dim │ │
└───────────────────┘ │ │ - Time_Dim │ │
│ │ - Location_Dim │ │
│ └──────────────────────┘ │
│ │
│ QUERY ENGINE │
│ - Oracle Analytics Cloud │
│ - SQL Interface │
│ - BI Publisher │
└────────────────────────────┘
KEY CHARACTERISTICS:
• Data refresh: Nightly (typically 2-4 AM account time zone)
• Latency: T-1 (yesterday's data by morning)
• Retention: Historical data preserved indefinitely
• Scale: Billions of rows supported
• Access: SQL, Workbooks, Connect, REST API
Enabling NSAW
PATH: Setup → Company → Enable Features → Analytics
Requirements:
□ NetSuite Analytics Warehouse SKU purchased
□ Administrator role for initial setup
□ Data sync must complete (24-48 hours initial load)
Feature Checkbox:
☑ NetSuite Analytics Warehouse
Post-Enable Steps:
1. Wait for initial data sync (check status in Setup → Analytics)
2. Configure data retention policies
3. Set up user access (Analytics role permissions)
4. Review default subject areas
Status Check:
Path: Setup → Analytics → SuiteAnalytics Warehouse → Sync Status
Status: ✓ Sync Complete
Last Sync: 2024-12-10 03:42:15
Records Synced: 12,847,293
Next Scheduled: 2024-12-11 02:00:00
NSAW Subject Areas
NSAW organizes data into pre-built subject areas for common analytics needs.
| Subject Area | Primary Facts | Key Dimensions | Use Cases |
|---|---|---|---|
| Transaction Lines | Amount, Quantity, Rate | Item, Customer, Date, Location | Sales analysis, margin reports |
| GL Journal Lines | Debit, Credit, Amount | Account, Period, Department, Class | Financial reporting, trial balance |
| Inventory Balance | On Hand, Available, On Order | Item, Location, Bin | Stock analysis, reorder planning |
| A/R Aging | Balance, Days Outstanding | Customer, Invoice, Aging Bucket | Collections, credit risk |
| A/P Aging | Balance, Days Outstanding | Vendor, Bill, Aging Bucket | Cash management, vendor payments |
| Budget | Budget Amount | Account, Period, Department | Budget vs actual, variance |
| Time Tracking | Hours, Billable Amount | Employee, Customer, Project | Utilization, project costing |
SQL Query Patterns
NSAW supports standard SQL via SuiteAnalytics Connect. Here are essential query patterns:
Pattern 1: Sales Trend Analysis
-- Monthly Sales by Customer Segment
SELECT
TO_CHAR(t.trandate, 'YYYY-MM') AS month,
c.category AS customer_segment,
SUM(tl.netamount) AS revenue,
COUNT(DISTINCT t.id) AS order_count,
COUNT(DISTINCT t.entity) AS unique_customers
FROM
transaction t
JOIN transactionline tl ON t.id = tl.transaction
JOIN customer c ON t.entity = c.id
WHERE
t.type = 'SalesOrd'
AND t.trandate >= ADD_MONTHS(SYSDATE, -12)
AND tl.mainline = 'F'
GROUP BY
TO_CHAR(t.trandate, 'YYYY-MM'),
c.category
ORDER BY
month, revenue DESC;
Pattern 2: Inventory Turnover
-- Inventory Turnover by Product Category
WITH cogs AS (
SELECT
i.custitem_category AS category,
SUM(tl.costestimate) AS total_cogs
FROM
transactionline tl
JOIN item i ON tl.item = i.id
JOIN transaction t ON tl.transaction = t.id
WHERE
t.type IN ('CustInvc', 'CashSale')
AND t.trandate BETWEEN
ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), -12)
AND TRUNC(SYSDATE, 'YEAR') - 1
AND tl.mainline = 'F'
GROUP BY i.custitem_category
),
avg_inventory AS (
SELECT
i.custitem_category AS category,
AVG(ib.quantityonhand * i.averagecost) AS avg_inv_value
FROM
inventorybalance ib
JOIN item i ON ib.item = i.id
GROUP BY i.custitem_category
)
SELECT
c.category,
c.total_cogs,
ai.avg_inv_value,
ROUND(c.total_cogs / NULLIF(ai.avg_inv_value, 0), 2) AS turnover_ratio,
ROUND(365 / NULLIF(c.total_cogs / ai.avg_inv_value, 0), 1) AS days_on_hand
FROM
cogs c
JOIN avg_inventory ai ON c.category = ai.category
ORDER BY
turnover_ratio DESC;
Pattern 3: Customer Lifetime Value
-- Customer LTV with Cohort Analysis
WITH first_purchase AS (
SELECT
entity,
MIN(trandate) AS first_order_date,
TO_CHAR(MIN(trandate), 'YYYY-Q') AS cohort
FROM transaction
WHERE type IN ('SalesOrd', 'CustInvc')
GROUP BY entity
),
customer_revenue AS (
SELECT
t.entity,
fp.cohort,
fp.first_order_date,
SUM(t.foreigntotal) AS total_revenue,
COUNT(DISTINCT t.id) AS order_count,
MAX(t.trandate) AS last_order_date,
ROUND(MONTHS_BETWEEN(MAX(t.trandate), fp.first_order_date)) AS tenure_months
FROM
transaction t
JOIN first_purchase fp ON t.entity = fp.entity
WHERE
t.type IN ('SalesOrd', 'CustInvc')
GROUP BY
t.entity, fp.cohort, fp.first_order_date
)
SELECT
cohort,
COUNT(*) AS customers,
ROUND(AVG(total_revenue), 2) AS avg_ltv,
ROUND(AVG(order_count), 1) AS avg_orders,
ROUND(AVG(tenure_months), 1) AS avg_tenure_months,
ROUND(SUM(total_revenue), 0) AS cohort_total_revenue
FROM customer_revenue
GROUP BY cohort
ORDER BY cohort;
Performance Optimization
| Technique | Implementation | Impact |
|---|---|---|
| Filter Early | Apply WHERE clauses before JOINs | Reduce rows processed by 50-90% |
| Date Partitioning | Always filter on trandate or period | Leverage partition pruning |
| Select Specific Columns | Avoid SELECT *; list needed columns | Reduce I/O by 60-80% |
| Use Summary Tables | Pre-aggregate for common queries | 10-100x faster for dashboards |
| Limit Result Sets | Use FETCH FIRST n ROWS | Faster response for exploration |
| Avoid Functions on Indexed Columns | Use range filters instead of TO_CHAR | Enable index usage |
QUERY OPTIMIZATION EXAMPLE
═══════════════════════════════════════════════════════════════════
❌ SLOW: Function on indexed column
SELECT * FROM transaction
WHERE TO_CHAR(trandate, 'YYYY') = '2024';
✓ FAST: Range filter
SELECT * FROM transaction
WHERE trandate >= DATE '2024-01-01'
AND trandate < DATE '2025-01-01';
❌ SLOW: SELECT *
SELECT * FROM transactionline tl
JOIN transaction t ON tl.transaction = t.id;
✓ FAST: Specific columns
SELECT t.tranid, t.trandate, tl.item, tl.quantity, tl.amount
FROM transactionline tl
JOIN transaction t ON tl.transaction = t.id;
❌ SLOW: Late filtering
SELECT ... FROM large_table
JOIN another_table ON ...
WHERE large_table.date > SYSDATE - 30;
✓ FAST: Filter in subquery
SELECT ... FROM (
SELECT * FROM large_table WHERE date > SYSDATE - 30
) filtered
JOIN another_table ON ...;
NSAW vs Other Analytics Tools
| Capability | Saved Searches | Workbooks | NSAW |
|---|---|---|---|
| Data Freshness | Real-time | Real-time | T-1 (nightly sync) |
| Historical Depth | Current data only | Current data only | Years of history |
| Query Complexity | Limited joins | Multi-dataset | Full SQL capability |
| Performance at Scale | Degrades >100K rows | Good to 1M rows | Billions of rows |
| External BI Tools | CSV export only | Limited | JDBC/ODBC native |
| Best For | Operational reports | Self-service analytics | Strategic analytics |
NSAW is essential for organizations that need trend analysis beyond the current period. The T-1 latency makes it unsuitable for operational dashboards, but it's the only NetSuite-native option for multi-year trend analysis, cohort tracking, or feeding external BI tools like Tableau, Power BI, or Looker. Budget 24-48 hours for initial sync before UAT.
SuiteAnalytics Workbook Mastery
Advanced techniques for building powerful self-service analytics with datasets, calculated fields, pivots, and charts. Learn to create interactive analytical tools for business users.
Workbook Architecture
WORKBOOK COMPONENT HIERARCHY
═══════════════════════════════════════════════════════════════════
WORKBOOK
│
├── DATASETS (data sources)
│ ├── Primary Dataset (required)
│ │ ├── Record Type (Transaction, Customer, etc.)
│ │ ├── Criteria (filters)
│ │ └── Fields
│ │
│ └── Linked Datasets (optional)
│ └── Join conditions to primary
│
├── DATA DEFINITIONS
│ ├── Calculated Fields (formulas)
│ ├── Groupings (hierarchies)
│ └── Filters (user parameters)
│
└── VISUALIZATIONS
├── Tables (raw data view)
├── Pivot Tables (aggregations)
├── Charts (bar, line, pie, etc.)
└── KPI Tiles (single metrics)
EXECUTION FLOW:
Datasets → Apply Criteria → Calculate Fields →
Group/Aggregate → Filter → Render Visualization
Dataset Design Patterns
Pattern 1: Transaction Analysis Dataset
DATASET: Sales Transaction Analysis
═══════════════════════════════════════════════════════════════════
Record Type: Transaction
Criteria:
Type: is any of [Sales Order, Invoice, Cash Sale]
Main Line: is false
Date: within last 365 days
Fields:
DIMENSIONS MEASURES
├── Transaction > Date ├── Amount
├── Transaction > Document # ├── Quantity
├── Customer > Name ├── Cost
├── Customer > Category ├── Tax Amount
├── Item > Name └── Foreign Amount
├── Item > Type
├── Location > Name
├── Department > Name
└── Class > Name
Join Pattern:
Transaction (main)
└── Customer (entity field)
└── Item (item field)
└── Location (location field)
Pattern 2: Multi-Dataset Customer 360
DATASET: Customer 360 View
═══════════════════════════════════════════════════════════════════
Primary Dataset: Customer
Record Type: Customer
Fields: ID, Name, Category, Sales Rep, Date Created
Linked Dataset 1: Sales History
Record Type: Transaction
Join: Transaction.Entity = Customer.ID
Criteria: Type in [Invoice, Cash Sale], Date > 1 year ago
Fields: SUM(Amount) as Total Revenue, COUNT(*) as Order Count
Linked Dataset 2: Open A/R
Record Type: Transaction
Join: Transaction.Entity = Customer.ID
Criteria: Type = Invoice, Status = Open
Fields: SUM(Amount Due) as Open Balance, MAX(Days Overdue)
Linked Dataset 3: Support Cases
Record Type: Support Case
Join: Case.Company = Customer.ID
Fields: COUNT(*) as Case Count, COUNT(Open) as Open Cases
Result: Single row per customer with aggregated metrics
Calculated Field Formulas
| Use Case | Formula | Notes |
|---|---|---|
| Gross Margin % | ({amount} - {cost}) / {amount} * 100 |
Handle divide by zero |
| Year-over-Year | ({current_year} - {prior_year}) / {prior_year} * 100 |
Requires date grouping |
| Running Total | SUM({amount}) OVER (ORDER BY {date}) |
Window function |
| Rank | RANK() OVER (PARTITION BY {category} ORDER BY {amount} DESC) |
Within groups |
| Days Between | DATEDIFF({end_date}, {start_date}) |
Date arithmetic |
| Fiscal Period | CONCAT('FY', SUBSTR({posting_period}, 1, 4), '-Q', CEIL(MONTH({date})/3)) |
Custom periods |
Advanced Formula Examples
CALCULATED FIELD EXAMPLES
═══════════════════════════════════════════════════════════════════
-- Customer Tier Based on Revenue
CASE
WHEN {total_revenue} >= 100000 THEN 'Enterprise'
WHEN {total_revenue} >= 50000 THEN 'Mid-Market'
WHEN {total_revenue} >= 10000 THEN 'SMB'
ELSE 'Starter'
END
-- Aging Bucket
CASE
WHEN {days_overdue} <= 0 THEN 'Current'
WHEN {days_overdue} <= 30 THEN '1-30 Days'
WHEN {days_overdue} <= 60 THEN '31-60 Days'
WHEN {days_overdue} <= 90 THEN '61-90 Days'
ELSE '90+ Days'
END
-- Percentage of Total (within group)
{amount} / SUM({amount}) OVER (PARTITION BY {category}) * 100
-- Moving Average (3 periods)
AVG({amount}) OVER (
ORDER BY {date}
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
)
-- First Purchase Flag
CASE
WHEN {date} = MIN({date}) OVER (PARTITION BY {customer})
THEN 'First Order'
ELSE 'Repeat'
END
-- Contribution Margin
{amount} - {variable_cost} - ({amount} * {commission_rate})
Pivot Table Techniques
PIVOT TABLE CONFIGURATION
═══════════════════════════════════════════════════════════════════
EXAMPLE: Sales by Region and Product Category
ROWS (Dimensions):
Level 1: Region
Level 2: Sales Rep
COLUMNS (Time/Category):
Level 1: Fiscal Year
Level 2: Fiscal Quarter
VALUES (Measures):
□ Revenue: SUM(Amount)
□ Margin: SUM(Amount - Cost)
□ Margin %: (SUM(Amount) - SUM(Cost)) / SUM(Amount)
□ Order Count: COUNT(DISTINCT Transaction ID)
Result Layout:
┌────────────────────────────────────────────────────────────────┐
│ │ FY2024 │ FY2025 │
│ │ Q1 │ Q2 │ Q3 │ Q4 │ Q1 │ Q2 │
├────────────────────┼──────┼──────┼──────┼──────┼──────┼──────┤
│ West Region │ │ │ │ │ │ │
│ ├── John Smith │ 125K │ 142K │ 138K │ 165K │ 155K │ 172K │
│ └── Jane Doe │ 98K │ 105K │ 112K │ 128K │ 135K │ 141K │
│ East Region │ │ │ │ │ │ │
│ ├── Bob Wilson │ 145K │ 158K │ 162K │ 175K │ 168K │ 182K │
│ └── ... │ │ │ │ │ │ │
├────────────────────┼──────┼──────┼──────┼──────┼──────┼──────┤
│ Grand Total │ 856K │ 924K │ 967K │1.2M │1.1M │1.3M │
└────────────────────────────────────────────────────────────────┘
PIVOT OPTIONS:
☑ Show row totals
☑ Show column totals
☑ Show % of total
☐ Show variance
☑ Conditional formatting (heat map)
Chart Types and Best Practices
| Chart Type | Best For | Avoid When |
|---|---|---|
| Bar Chart | Comparing categories, rankings | >12 categories, time series |
| Line Chart | Trends over time, continuous data | Categorical comparisons |
| Pie/Donut | Part-to-whole (2-5 segments) | >5 segments, comparing sizes |
| Stacked Bar | Composition over categories | Comparing individual segments |
| Area Chart | Cumulative values, volume | Precise value comparison |
| Scatter Plot | Correlation, distribution | Few data points, categories |
| KPI Tile | Single critical metric | Multiple related metrics |
Workbook Performance Optimization
PERFORMANCE CHECKLIST
═══════════════════════════════════════════════════════════════════
□ LIMIT DATE RANGE
- Default to 90 days or current quarter
- Provide date filter for users to expand
□ FILTER RECORD TYPES
- Only include needed transaction types
- Use Main Line = false for line details
□ SELECT ONLY NEEDED FIELDS
- Don't add fields "just in case"
- Each field increases query size
□ USE CRITERIA vs FILTERS
- Criteria: Applied at data load (faster)
- Filters: Applied at render (flexible but slower)
□ LIMIT LINKED DATASETS
- Each link = additional query
- Pre-aggregate where possible
□ OPTIMIZE CALCULATED FIELDS
- Simple math > complex CASE statements
- Avoid nested window functions
□ TEST WITH PRODUCTION DATA VOLUMES
- Sandbox may have less data
- Test with 100K+ rows
TYPICAL PERFORMANCE TARGETS:
< 5 seconds: Excellent
5-15 seconds: Acceptable
15-30 seconds: Needs optimization
> 30 seconds: Redesign required
Common Workbook Patterns
Executive Summary Workbook
WORKBOOK: Executive KPI Dashboard
═══════════════════════════════════════════════════════════════════
Page 1: Financial Overview
┌─────────────────────────────────────────────────────────────────┐
│ [Revenue YTD] [Margin %] [Cash Balance] [A/R Days] │
│ $4.2M 42.3% $1.8M 38 │
│ ▲ 12% YoY ▲ 2.1pts ▲ $200K ▼ 3 days │
├─────────────────────────────────────────────────────────────────┤
│ [Revenue Trend - Line Chart] [Revenue by Segment - Pie] │
│ 12-month trend with forecast Top 5 + Other │
├─────────────────────────────────────────────────────────────────┤
│ [Top 10 Customers - Bar] [Regional Performance] │
│ YTD revenue + vs prior year Heat map by region/month │
└─────────────────────────────────────────────────────────────────┘
Page 2: Operational Metrics
- Order fulfillment rate
- Inventory turnover
- Customer acquisition cost
- Support ticket resolution
Page 3: Drill-Down Tables
- Customer detail with filters
- Product performance
- Regional breakdown
The most successful workbooks start with business questions, not data. Before building, ask stakeholders: "What decisions will this help you make?" Then work backwards to identify the exact metrics needed. Resist the urge to include every available field—complexity kills adoption.
Implementation Checklist
Dashboard Design Patterns
Create effective role-based dashboards that drive action. Learn layout principles, portlet selection, and configuration for different user personas from executives to operational staff.
Dashboard Design Principles
THE DASHBOARD HIERARCHY OF NEEDS
═══════════════════════════════════════════════════════════════════
Level 4: ACTIONABLE "I know what to do next"
▲ Alerts, thresholds, drill-downs
│
Level 3: CONTEXTUAL "I understand the 'so what?'"
│ Trends, comparisons, targets
│
Level 2: INFORMATIVE "I see the current state"
│ KPIs, metrics, status
│
Level 1: ACCESSIBLE "I can find the data"
│ Navigation, search, shortcuts
Most dashboards fail at Level 4. Users see data but don't
know what action to take. Every metric should answer:
"If this changes, what should I do?"
Role-Based Dashboard Templates
Executive Dashboard
ROLE: CEO / CFO / Executive
PURPOSE: Strategic overview, exception-based management
REFRESH: Daily (morning)
═══════════════════════════════════════════════════════════════════
LAYOUT (3 columns):
┌────────────────────────────────────────────────────────────────┐
│ ROW 1: KPI TILES (Critical Metrics) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Revenue │ │ Margin │ │ Cash │ │ Pipeline │ │
│ │ MTD │ │ % │ │ Position │ │ Value │ │
│ │ $2.4M │ │ 41.2% │ │ $3.1M │ │ $8.7M │ │
│ │ ▲ 8% │ │ ▼ 1.2pts │ │ ▲ $400K │ │ ▲ 12% │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
├────────────────────────────────────────────────────────────────┤
│ ROW 2: TRENDS & COMPARISON │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐│
│ │ Revenue vs Plan (Line) │ │ Revenue by Segment (Pie) ││
│ │ Actual | Budget | Forecast │ │ Product mix breakdown ││
│ └─────────────────────────────┘ └─────────────────────────────┘│
├────────────────────────────────────────────────────────────────┤
│ ROW 3: EXCEPTIONS & ACTIONS │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐│
│ │ Deals Requiring Attention │ │ Upcoming Commitments ││
│ │ - Stalled opportunities │ │ - Large payments due ││
│ │ - High-risk renewals │ │ - Contract expirations ││
│ └─────────────────────────────┘ └─────────────────────────────┘│
└────────────────────────────────────────────────────────────────┘
PORTLETS USED:
- KPI Scorecard (custom portlet or Key Performance Indicators)
- Saved Search (chart) - Revenue trend
- Saved Search (chart) - Segment breakdown
- Saved Search (list) - Exception alerts
- Reminders portlet - Upcoming items
Sales Manager Dashboard
ROLE: Sales Manager
PURPOSE: Team performance, pipeline management
REFRESH: Real-time
═══════════════════════════════════════════════════════════════════
LAYOUT (3 columns):
┌────────────────────────────────────────────────────────────────┐
│ ROW 1: TEAM PERFORMANCE │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐│
│ │ Quota Attainment by Rep │ │ Pipeline by Stage ││
│ │ (Horizontal Bar) │ │ (Funnel Chart) ││
│ │ Green/Yellow/Red status │ │ Qualification → Close ││
│ └─────────────────────────────┘ └─────────────────────────────┘│
├────────────────────────────────────────────────────────────────┤
│ ROW 2: ACTIVITY & VELOCITY │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐│
│ │ Activities This Week │ │ Win Rate Trend (Line) ││
│ │ Calls | Meetings | Demos │ │ Last 6 months by rep ││
│ │ vs Target │ │ ││
│ └─────────────────────────────┘ └─────────────────────────────┘│
├────────────────────────────────────────────────────────────────┤
│ ROW 3: DEAL FOCUS │
│ ┌──────────────────────────────────────────────────────────────┐│
│ │ Opportunities Closing This Month (Table) ││
│ │ Account | Deal | Value | Stage | Probability | Next Step ││
│ └──────────────────────────────────────────────────────────────┘│
├────────────────────────────────────────────────────────────────┤
│ ROW 4: QUICK LINKS │
│ [Create Lead] [Create Opportunity] [Pipeline Report] [Forecast]│
└────────────────────────────────────────────────────────────────┘
Operations Manager Dashboard
ROLE: Operations / Fulfillment Manager
PURPOSE: Order status, inventory alerts, shipment tracking
REFRESH: Real-time
═══════════════════════════════════════════════════════════════════
LAYOUT (3 columns):
┌────────────────────────────────────────────────────────────────┐
│ ROW 1: TODAY'S PRIORITIES │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Orders │ │ Orders │ │ Back- │ │ Late │ │
│ │ to Ship │ │ Pending │ │ orders │ │ Shipments│ │
│ │ 47 │ │ 12 │ │ 8 │ │ 3 │ │
│ │ ▼ 5 vs │ │ Approval │ │ ▲ 2 new │ │ ⚠ Action │ │
│ │ yesterday│ │ │ │ │ │ needed │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
├────────────────────────────────────────────────────────────────┤
│ ROW 2: ORDER QUEUE │
│ ┌──────────────────────────────────────────────────────────────┐│
│ │ Orders Pending Fulfillment (Table - Sortable) ││
│ │ Order# | Customer | Items | Ship By | Status | [Fulfill] ││
│ │ Color-coded by urgency (today=red, tomorrow=yellow) ││
│ └──────────────────────────────────────────────────────────────┘│
├────────────────────────────────────────────────────────────────┤
│ ROW 3: INVENTORY ALERTS │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐│
│ │ Below Reorder Point │ │ Inbound Shipments ││
│ │ Items needing restock │ │ Expected this week ││
│ │ Link to PO creation │ │ PO# | Vendor | ETA ││
│ └─────────────────────────────┘ └─────────────────────────────┘│
├────────────────────────────────────────────────────────────────┤
│ ROW 4: PERFORMANCE METRICS │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐│
│ │ Order Cycle Time (Trend) │ │ Fill Rate (Gauge) ││
│ │ Target: < 24 hours │ │ Target: > 98% ││
│ └─────────────────────────────┘ └─────────────────────────────┘│
└────────────────────────────────────────────────────────────────┘
Accounting Team Dashboard
ROLE: Controller / Accounting Manager
PURPOSE: Period close status, reconciliation, compliance
REFRESH: Daily
═══════════════════════════════════════════════════════════════════
LAYOUT (3 columns):
┌────────────────────────────────────────────────────────────────┐
│ ROW 1: PERIOD STATUS │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Unposted │ │ A/R │ │ A/P │ │ Bank │ │
│ │ JEs │ │ Unappld │ │ Unappld │ │ Unrec'd │ │
│ │ 15 │ │ $42K │ │ $28K │ │ $156K │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
├────────────────────────────────────────────────────────────────┤
│ ROW 2: CLOSE CHECKLIST │
│ ┌──────────────────────────────────────────────────────────────┐│
│ │ Month-End Close Tasks ││
│ │ ☑ Revenue recognition ││
│ │ ☑ Inventory valuation ││
│ │ ☐ Depreciation run ││
│ │ ☐ Intercompany reconciliation ││
│ │ ☐ Bank reconciliation ││
│ │ ☐ Review trial balance ││
│ └──────────────────────────────────────────────────────────────┘│
├────────────────────────────────────────────────────────────────┤
│ ROW 3: CASH POSITION │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐│
│ │ Cash Flow Forecast │ │ A/R Aging Summary ││
│ │ (13-week rolling) │ │ (Stacked bar by bucket) ││
│ └─────────────────────────────┘ └─────────────────────────────┘│
├────────────────────────────────────────────────────────────────┤
│ ROW 4: APPROVALS QUEUE │
│ ┌──────────────────────────────────────────────────────────────┐│
│ │ Pending My Approval (Journal Entries, Vendor Bills) ││
│ │ Quick approve/reject from dashboard ││
│ └──────────────────────────────────────────────────────────────┘│
└────────────────────────────────────────────────────────────────┘
Portlet Types Reference
| Portlet Type | Use Case | Configuration Tips |
|---|---|---|
| Key Performance Indicators | Big number metrics with trend | Limit to 4-6 KPIs; show variance |
| Saved Search (List) | Tabular data, action lists | Limit rows; add inline edit if possible |
| Saved Search (Chart) | Visual trends, comparisons | Choose chart type carefully; less is more |
| Reminders | Upcoming tasks, follow-ups | Customize reminder types per role |
| Quick Search | Navigation shortcut | Position prominently for data entry roles |
| Shortcuts | Frequently used transactions | Limit to 5-8 most common actions |
| Analytics (Workbook) | Self-service drill-down | Embed focused workbook views |
| Custom Portlet (SuiteScript) | Custom UI/logic | Use for complex conditional display |
Dashboard Layout Guidelines
LAYOUT BEST PRACTICES
═══════════════════════════════════════════════════════════════════
1. VISUAL HIERARCHY
┌─────────────────────────────────────────────────────────────┐
│ TOP: Most critical metrics (KPIs, alerts) │
│ User's eye starts here │
├─────────────────────────────────────────────────────────────┤
│ MIDDLE: Supporting context (trends, breakdowns) │
│ Answers "why" for top metrics │
├─────────────────────────────────────────────────────────────┤
│ BOTTOM: Detail data (tables, lists) │
│ Drill-down and action items │
└─────────────────────────────────────────────────────────────┘
2. COLUMN USAGE
1 column: Mobile/narrow views
2 columns: Most common, balanced layout
3 columns: Information-dense for wide screens
3. PORTLET SIZING
Small: KPI tiles, shortcuts
Medium: Charts, short lists
Large: Data tables, calendars
4. WHITESPACE
Don't fill every pixel
Group related portlets
Separate logical sections
5. REFRESH RATES
Real-time: Operational dashboards
Cached: Executive summaries
Manual: Heavy analytics
ANTI-PATTERNS TO AVOID:
✗ Too many portlets (>12)
✗ Duplicate information in multiple portlets
✗ Charts without context (no targets, no comparisons)
✗ Scroll-heavy layouts
✗ Data without action path
Publishing & Permissions
DASHBOARD PUBLISHING OPTIONS
═══════════════════════════════════════════════════════════════════
1. ROLE-BASED ASSIGNMENT
Path: Customization → Centers & Tabs → Set Up Dashboard
Options:
- Set as default dashboard for role
- Allow users to modify personal copy
- Lock dashboard (no modifications)
2. CENTER TAB PLACEMENT
Path: Customization → Centers & Tabs → Center Tabs
Position dashboard as:
- Home (first tab, default landing)
- Additional center tab
- Subtab within existing center
3. PUBLISHED DASHBOARDS
Path: Customization → Publishing → Published Dashboards
Create dashboard templates that:
- Users can subscribe to
- Automatically update when published
- Maintain consistent reporting
4. PERMISSION CONSIDERATIONS
□ User can view underlying saved searches
□ User has access to record types displayed
□ Subsidiary restrictions apply
□ Role restrictions apply
TESTING CHECKLIST:
□ Test with intended role (not Administrator)
□ Verify data filters correctly by user
□ Check load time with production data
□ Confirm drill-downs work
□ Validate mobile rendering (if needed)
The best dashboards are boring—in a good way. They show expected information in expected places. Resist the urge to add visual flair. Focus on consistency: same metrics appear in same positions, same color meanings across charts, same drill-down patterns. Users should spend zero cognitive effort figuring out where to look.