Acme Industries Inc. — Production Role: Executive
KM
Home › Executive KPIs › Executive KPI Center  ·  rendered by Suitelet customscript_exec_kpi_sl inside the current NetSuite session — no second login
Executive KPI Center
Custom Content Portlet SuiteQL live
Last refreshed 20 Aug 2026, 09:12 IST · cache TTL 15 min
Revenue, year to date
$48.2M
▲ 12.4% vs same period FY25  ·  102% of budget

Revenue vs budget

FY26 · $ millions · consolidated
Actual revenueBudget

Cash position

Month-end balance · $ millions

AR aging

Open receivables by bucket · $ millions

Opex mix

YTD spend by function · $ millions
Bookings, year to date
$50.9M
▲ 9.8% vs FY25  ·  Q3 pace $7.1M/mo

Bookings vs invoiced

FY26 · $ millions
BookingsInvoiced

Revenue by customer

YTD · top 5 named, remainder folded into “Other”

Pipeline conversion

FY26 stage counts — ordered stages, one-hue ramp

Bookings by region

YTD · $ millions
On-time delivery, YTD
94.2%
▲ 3.0 pt vs FY25  ·  target 95%

On-time delivery trend

% of shipments on or before promise date

Inventory by class

Quarter-end value · $ millions · stacked
Finished goodsWIPRaw material

Inventory by location

Current on-hand value · $ millions

Capacity & exception watchlist

COO daily attention list
Dallas DC utilisation82% of racked capacity
Reno DC utilisation61%
3PL EU utilisation94% — overflow fees likely
  • 22 purchase orders past expected receipt date (>7 days)
  • 9 items below reorder point with no open PO
  • 4 work orders blocked on component shortage
GoodWarningCritical
Billable utilisation, YTD
78.4%
▲ 4.3 pt vs FY25  ·  target 80%

Utilisation trend

Billable hours ÷ available hours

Headcount by department

Active employees, 20 Aug 2026

Margin by project

Largest 6 active projects · target 30%
At or above 30% targetBelow targetBelow 20%

Labour cost vs billings

FY26 · $ millions
BillingsLoaded labour cost

The one-sentence answer

Build the dashboard as a SuiteScript 2.1 Suitelet + Custom Content Portlet that renders an open-source JS chart library (ECharts / Chart.js / ApexCharts — MIT-licensed) served from the NetSuite File Cabinet, fed by SuiteQL queries executed in the signed-in user's own session. Nothing leaves NetSuite, there is no second login, no second URL, and no per-user BI licence.

CEO opens NetSuite Portlet / Center tab Suitelet (same session cookie) N/query SuiteQL JSON ECharts renders in the browser Click ⇢ NetSuite record
Layer 1 · Data

SuiteQL over NetSuite tables

N/query runs SQL-92 against transaction, entity, item and custom records. Heavy aggregates get pre-computed nightly by a Map/Reduce script into a custom record customrecord_kpi_snapshot, so the portlet reads one small table instead of scanning millions of transaction lines.

Layer 2 · Service

Suitelet returns JSON

One Suitelet, Available Without Login = No. It reads the period / subsidiary parameters, runs the SuiteQL, and returns JSON. Because it runs in the user's session, NetSuite's own role, subsidiary and row-level permissions apply automatically — a subsidiary controller physically cannot pull another subsidiary's numbers.

Layer 3 · Render

Open-source charts from the File Cabinet

Apache ECharts (Apache-2.0) or Chart.js (MIT) uploaded as a File Cabinet JS file and referenced by the Suitelet's HTML. No CDN call, so it works behind corporate proxies and passes security review. This mockup is that render layer.

Layer 4 · Surface

Portlet + Center tab

A Portlet script of type HTML/INLINE embeds the dashboard directly on the NetSuite Home dashboard; a Custom Center Tab gives the full-screen version. Executives see it where they already log in.

Layer 5 · Performance

Cache + scheduled refresh

N/cache holds the JSON for 15 minutes so repeated opens cost no governance units. Portlet scripts have a 1,000-unit budget — the snapshot table plus cache keeps a full render well under 100 units.

Layer 6 · Security

Zero extra credentials

No OAuth app, no service account, no gateway, no data copy leaving NetSuite. Access is granted by adding the Suitelet/Portlet deployment to the CEO and COO roles. Audit trail stays in NetSuite's own script execution log.

Why not Power BI (and when it is still right)

OptionRuns inside NetSuite?Second login / credentials?Cost & effortVerdict
SuiteScript Suitelet + Portlet + open-source chartsYes — native pageNone~4–6 weeks build, no licence costRecommended
SuiteAnalytics Workbook / standard dashboard portletsYesNoneDays, config onlyGood for simple KPIs; limited layout, no cross-module composite view, weak visual control
Power BI Embedded in an iframe inside NetSuiteVisually yes, technically noYes — Entra ID sign-in or an embed token service you must hostPower BI capacity + a hosted token serviceFails the “no other credentials” requirement
Power BI / Tableau as a separate appNoYesPer-user licences + ODBC/connectorFails the “one application” requirement
Power BI still earns its place when you need to blend NetSuite with non-NetSuite sources (CRM, payroll, web analytics) or serve hundreds of analysts. For a CEO/COO KPI wall that must live inside NetSuite, it is the wrong tool.

Build plan — 6 sprints

  • S1 · KPI charter. Lock ~20 KPIs with the CEO/COO: exact formula, source record, owner, target, refresh frequency. This is where projects fail, not in the code.
  • S2 · Data layer. Write and tune the SuiteQL; build customrecord_kpi_snapshot + the Map/Reduce that fills it nightly.
  • S3 · Service layer. Suitelet endpoints, parameter validation, N/cache, governance profiling.
  • S4 · Render layer. ECharts in the File Cabinet, this layout, drill-through links to saved searches and records.
  • S5 · Security & roles. Role-conditional layout via runtime.getCurrentUser().role; subsidiary filtering; UAT with real executive roles.
  • S6 · Rollout. Portlet on Home + Center tab, mobile-width check, scheduled email snapshot, handover runbook.

Things that bite you later

  • Governance limits. Portlet = 1,000 units. Never run raw transaction-level SuiteQL in the portlet; read the snapshot record.
  • Multi-currency. Decide consolidated vs local rate up front; use the consolidated exchange rate table, not spot.
  • Period close. Show the accounting period status on the card — executives must know if a number is pre-close.
  • Definition drift. One KPI, one SuiteQL, one place. Put the formula in the tooltip so nobody re-derives it in a spreadsheet.
  • SuiteScript file cabinet caching. Version your JS filenames (echarts.5.4.3.js) or browsers will serve stale code after a release.
Prototype — illustrative data only. Render layer: hand-built SVG (stands in for Apache ECharts served from the File Cabinet). Every tile and chart is clickable; “Drill in” shows the SuiteQL and the NetSuite records behind the number.