# NetSuite System Notes Report with SuiteQL: Who Changed What and When

> Source: https://netray.co/tools/netsuite-suiteql-system-notes-audit-query-generator
> Publisher: Netray (netray.co), AI and integration engineering for ERP and manufacturing systems.
> Section: Free Tools

## Short answer

Build SuiteQL over the systemnote table to audit field changes by record, user and date range, with a transaction join and a field discovery query.

## Category

netsuite

## Erp

NetSuite

## Audience

- NetSuite administrator
- Internal auditor
- NetSuite developer

## Tool

**Kind:** template

**Output:** code

**Language:** sql

**Fields:**

#### From date

**Key:** date_from

**Type:** date

**Default:** 2026-10-01

#### To date (inclusive)

**Key:** date_to

**Type:** date

**Default:** 2026-10-21

#### Record type ID

**Key:** recordtypeid

**Type:** text

**Default:** -30

**Help:** Use block 1 to see the record type IDs present in your system notes.

#### Record internal ID

**Key:** record_id

**Type:** number

**Default:** 4512

#### User (employee) internal ID

**Key:** user_id

**Type:** number

**Default:** 17

#### Field ID as stored in system notes

**Key:** field_id

**Type:** text

**Default:** TRANDOC.KSTATUS

**Help:** Use block 1 to list the field IDs for the record type.

**Blocks:**

#### 1. Discover record types and field IDs in the date range

**Body:** SELECT
  sn.recordtypeid,
  BUILTIN.DF(sn.recordtypeid) AS record_type,
  sn.field,
  BUILTIN.DF(sn.field) AS field_label,
  COUNT(*) AS changes
FROM systemnote sn
WHERE sn.date >= TO_DATE('{{date_from}}', 'YYYY-MM-DD')
  AND sn.date < TO_DATE('{{date_to}}', 'YYYY-MM-DD') + 1
GROUP BY sn.recordtypeid, BUILTIN.DF(sn.recordtypeid), sn.field, BUILTIN.DF(sn.field)
ORDER BY changes DESC

#### 2. Full change history of one record

**Body:** SELECT
  sn.date,
  BUILTIN.DF(sn.name) AS changed_by,
  BUILTIN.DF(sn.role) AS role,
  BUILTIN.DF(sn.context) AS context,
  BUILTIN.DF(sn.type) AS change_type,
  BUILTIN.DF(sn.field) AS field,
  sn.oldvalue,
  sn.newvalue
FROM systemnote sn
WHERE sn.recordtypeid = {{recordtypeid}}
  AND sn.recordid = {{record_id}}
ORDER BY sn.date DESC

#### 3. All changes by one user in the date range

**Body:** SELECT
  sn.date,
  BUILTIN.DF(sn.recordtypeid) AS record_type,
  sn.recordid,
  BUILTIN.DF(sn.field) AS field,
  sn.oldvalue,
  sn.newvalue,
  BUILTIN.DF(sn.context) AS context
FROM systemnote sn
WHERE sn.name = {{user_id}}
  AND sn.date >= TO_DATE('{{date_from}}', 'YYYY-MM-DD')
  AND sn.date < TO_DATE('{{date_to}}', 'YYYY-MM-DD') + 1
ORDER BY sn.date DESC

#### 4. Changes to one field on transactions, with document number

**Body:** SELECT
  sn.date,
  t.tranid,
  BUILTIN.DF(t.type) AS tran_type,
  BUILTIN.DF(sn.name) AS changed_by,
  sn.oldvalue,
  sn.newvalue
FROM systemnote sn
INNER JOIN transaction t ON t.id = sn.recordid
WHERE sn.recordtypeid = {{recordtypeid}}
  AND sn.field = '{{field_id}}'
  AND sn.date >= TO_DATE('{{date_from}}', 'YYYY-MM-DD')
  AND sn.date < TO_DATE('{{date_to}}', 'YYYY-MM-DD') + 1
  -- AND sn.name = {{user_id}}
ORDER BY sn.date DESC

**Notes:** Confirm the systemnote columns (date, name, role, context, type, field, oldvalue, newvalue, recordid, recordtypeid) in Setup > Records Catalog for your account. Run block 1 first: it shows the recordtypeid and field values your account actually stores, which you then paste into the other blocks. Block 4 joins to transaction, so use it only with the transaction record type ID from block 1. Uncomment the user line to narrow by person.

## Content

**Intro:** System notes record who changed which field on which record, when, in what context and from what value to what value. This generator writes SuiteQL against the systemnote table for a single record's history, one user's changes, or one field across transactions.

**Sections:**

#### How to use it

**Body:** Start with block 1 for your date range. It lists the record type IDs and field IDs present in system notes with a count, so you never guess the internal codes. Field IDs are stored as internal identifiers (for example a TRANDOC-style code for standard transaction fields or the custbody ID for custom ones), while BUILTIN.DF shows the label. Paste the record type ID and field ID you need into the other fields. Block 2 gives the full history of one record, block 3 everything a user changed, and block 4 every change to one field on transactions with the document number. Dates use TO_DATE and an exclusive upper bound of the day after, so the whole last day is included.

#### Where this lives in NetSuite

**Body:** The same data appears on the System Information subtab (System Notes) of each record, and in saved searches of type System Note or through the System Notes fields join on a record search. SuiteQL exposes it as the systemnote table. The role running the query needs permission to see the underlying records, and administrators should confirm the table and columns in Setup > Records Catalog. For user access reviews, combine block 3 with the Login Audit Trail (Setup > Users/Roles > View Login Audit Trail), which records logins, roles used and IP addresses; system notes record data changes, not logins.

#### Worked example: who closed this sales order

**Body:** A customer disputes that order SO-10442 was closed early. Run block 1 for the last 30 days to find the transaction record type ID and the field ID for status, then run block 2 with the order's internal ID. The output shows each change in date order with the user, role and context such as User Interface, CSV Import or a script, plus old and new values. If the context shows a script or web services, check the integration or script deployment that ran at that time. If the change was made in the UI, the user and role identify who to ask. Export the result as the audit record.

#### Gotchas and deleted records

**Body:** System notes are a change log, not a backup; a deleted record cannot be restored from them. Deleted transactions and records are tracked separately, for example through a saved search of the Deleted Record type, which shows what was deleted, by whom and when, but not the full data, and there is no undelete in NetSuite. Old and new values for list fields may be stored as internal IDs or codes rather than labels, so decode them against the list. The table is large in busy accounts: always filter by date, record type or record ID, and page results with limit and offset when calling through REST.

**Cta:** If you want auditors and admins to ask who changed what in plain English and get answers from NetSuite system notes on your own infrastructure, we can set that up.

**Faq:**

#### How do I run a system notes report in NetSuite?

**Answer:** For one record, open its System Information subtab. For many records, create a saved search of type System Note, or query the systemnote table in SuiteQL filtered by date, record type and user as this tool generates. Saved searches are easier for business users; SuiteQL is better for integrations and repeatable audit extracts.

#### Can I recover a deleted record in NetSuite?

**Answer:** No, NetSuite has no undelete. A Deleted Record saved search shows the record type, name, who deleted it, when and in what context, which helps you recreate it from exports, PDFs, emails or a sandbox copy refreshed before the deletion. To prevent repeats, restrict the delete permission on the roles involved.

#### How do I build a NetSuite user access report?

**Answer:** Combine three sources: the employee list with roles (Lists > Employees, Access subtab, or a search on employee with role), the Login Audit Trail for actual logins and roles used, and system notes for what each user changed. Block 3 of this tool gives the changes part for one user and date range.

#### Why are system note values numbers instead of names?

**Answer:** For select and list fields, system notes often store the internal ID or an internal code of the old and new value. Decode them by looking up the ID in the list or record, or by joining to that table in SuiteQL. Text, number and date fields show the actual values.

## Search terms

netsuite system notes report, netsuite user access report, netsuite suiteql query, netsuite recover deleted record, netsuite system notes suiteql, netsuite audit trail query, who changed a field in netsuite

---
Talk to an engineer: https://netray.co/contact?intent=erp_ai | Machine catalog: https://netray.co/agent/catalog.json
