Back to Articles|Published on 4/30/2026|32 min read
NetSuite SuiteQL CustomField: Label vs Name & Field Types

NetSuite SuiteQL CustomField: Label vs Name & Field Types

Executive Summary

SuiteQL is NetSuite’s SQL-based query language that unlocks the full power of NetSuite’s data model for advanced analysis. NetSuite’s customization (“custom fields”) adds thousands of user-defined fields across records, and understanding how to query these fields via SuiteQL requires knowledge of NetSuite’s metadata tables. In particular, the CustomField metadata table contains essential information about each custom field—its display label, internal identifier, data type, and other properties. A key source of confusion is the difference between a field’s label (the text shown in the UI) and its name or Script ID (the unique backend identifier used in scripts and queries). This report delves deeply into the structure and usage of NetSuite’s custom field metadata in SuiteQL: we explain how labels and script IDs are represented, how the field’s type is encoded (including “Body vs Column” placement and data type), and how flags like IsMandatory or IsInactive are (or are not) exposed. We examine the contents of the CustomField and related tables (such as CustomRecordType, CustomList, and CustomSegment), and cite documented queries to illustrate these concepts.

We provide detailed examples and case studies showing how real analysts and integrators use SuiteQL to discover custom fields, join them to data, and build reports. For instance, we analyze a published SuiteQL query that inventories all custom fields for auditing purposes [1], and we discuss how organizations integrate SuiteQL data with BI tools (e.g. Tableau) to gain insights [2]. Throughout, expert commentary and official documentation guide our analysis. We conclude by discussing performance and governance implications of heavy SuiteQL usage, and future directions (such as enhanced metadata APIs and AI-driven query tools that may further aid NetSuite analytics. All claims and descriptions are grounded in credible sources ranging from NetSuite developer guides to experienced community experts.

Introduction and Background

NetSuite is a leading cloud-based ERP/CRM platform that unifies financials, inventory, sales, and customer data [3]. To support complex business needs, NetSuite allows virtually every record to have numerous custom fields. These fields can be of various data types (text, list, checkbox, etc.) and can be added to transactions, customer records, items, custom records, and more. The metadata for these fields (names, types, and associations) lives inside NetSuite’s data schema. Historically, extracting and analyzing the values of custom fields was challenging: users had to rely on Saved Searches or SuiteAnalytics Workbook, which have limitations (for example, only one level of joins, limited aggregation) [4]. SuiteQL, introduced around 2020, provides a full SQL-92 compliant query interface to NetSuite’s Analytics Data Source (often called NetSuite2.com) [5] [4]. According to Oracle’s documentation, “SuiteQL is a powerful query language… enabling advanced queries beyond the capabilities of Saved Searches and reports” [6]. In practice, SuiteQL can access the same data that is visible in NetSuite workbooks or saved searches, but with the full flexibility of SQL (joins, subqueries, unions, etc.) [7] [8]. As one expert notes, “SuiteQL powers the SuiteAnalytics data source, ensuring that any data you can see in a NetSuite Workbook or Saved Search can also be queried via SuiteQL… SuiteQL allows complex multi-table joins, subqueries, and aggregations, opening up deeper insights that might be cumbersome or impossible with saved searches alone” [9].

Understanding how custom fields appear in SuiteQL requires examining two parts of NetSuite’s schema: (1) metadata tables that describe custom definitions (field names, types, etc.), and (2) the actual analytics tables where the data values reside. SuiteQL provides read-only access to these tables. Metadata tables include CustomRecordType (listing all custom record types) and CustomField (listing all custom fields across records). For example, querying CustomRecordType returns columns like Name, ScriptID, InternalID, Description (Source: timdietrich.me), while querying CustomField returns columns including Name, ScriptID, Description, FieldType, FieldValueType, FieldValueTypeRecord, IsMandatory, IsStored, IsShowInList, and owner information [10] (Source: timdietrich.me). Critically, in these tables the column Name actually holds the field’s user-visible label, while ScriptID holds the unique programmatic name (e.g. custentity_myfield) [10] [11]. This distinction—label vs. name—is a central focus of this report.

In the sections that follow, we first detail the contents and meaning of the CustomField and related tables. We then analyze how SuiteQL queries reference custom fields (with a focus on referencing by label vs. scriptID, and on interpreting type and activity flags). We include illustrative SuiteQL examples from experts and Oracle documentation, and we supplement with data from NetSuite and integration case studies. Finally, we discuss implications for performance, security/governance, and upcoming features in the SuiteQL ecosystem.

SuiteQL Metadata for Custom Fields

The CustomRecordType Table

Every custom record type in NetSuite (created via Customization > Lists, Records & Fields) is cataloged in SuiteQL’s CustomRecordType table. Each row represents one custom record definition. Key columns include Name (the label of the record type), ScriptID (e.g. customrecord_myrecord), InternalID (NetSuite’s numeric internal identifier), and flags like AllowQuickSearch or AllowAttachments (Source: timdietrich.me). For example, a SuiteQL query SELECT Name, ScriptID, InternalID, Description FROM CustomRecordType ORDER BY Name; will list all custom record types in the account (Source: timdietrich.me). If an analyst wants to query the custom fields for a given custom record, they would first find that record’s internal ID here, and then use it to filter the CustomField table (via WHERE RecordType = <ID>).

The importance of CustomRecordType is that it provides the internal linkage: the column InternalID from CustomRecordType is used in CustomField.RecordType to indicate which record that field belongs to (Source: timdietrich.me). Thus one can join or filter, for instance, CustomField on RecordType = CustomRecordType.InternalID to isolate fields of a particular custom record. This linkage is especially important because SuiteQL does not directly allow querying standard record metadata; it only exposes metadata for user-defined (custom) items. (Standard records and fields must be obtained via the Records Catalog API or the REST metadata endpoint.)

The CustomField Table

The central repository of custom-field metadata is the CustomField table.Each row of this table is one field definition. The columns of CustomField capture all the key properties of a custom field. Based on sources from Oracle and the SuiteQL community, the major columns are:

  • Name (STRING) – the display label of the custom field, i.e. what the user sees on forms. For example, a field might have Name “Customer Age”.
  • ScriptID (STRING) – the internal programmable ID, such as custentity_age. This is unique per field and used in scripting and queries.
  • Description (STRING) – any descriptive text entered by the admin for the field.
  • RecordType (INTEGER) – the internal ID of the record type (CustomRecordType.InternalID) to which this field belongs. (For custom record fields, this points to the custom record’s ID. For transaction or entity fields it points to the standard record’s ID.)
  • FieldType (STRING) – indicates the field’s placement in the record (e.g. 'BODY' or 'COLUMN'). In other words, FieldType categorizes whether the custom field is a body field (in the main form body) or a column field (part of a sublist). For instance, queries in the Oracle example filter CustomField.fieldType IN ('BODY','COLUMN') to get fields on the vendor bill record [12].
  • FieldValueType (STRING) – the actual data type of the field. This reflects the NetSuite type (Checkbox, Date, Text, List/Record, etc.). For example, FieldValueType might be 'CheckBox', 'Date', 'LongText', or 'List/Record'. (There is some confusion in community sources about the terminology, but authoritative guidance is that FieldValueType holds the field’s data type. Tim Dietrich’s query shows FieldValueType and FieldValueTypeRecord side by side, implying FieldValueType is the type of the field (Source: timdietrich.me).)
  • FieldValueTypeRecord (INTEGER) – if FieldValueType is 'List/Record' or multiple-select, this column stores the internal ID of the list or record type used. For example, if a custom field is a dropdown of Departments, this column might contain the ID of the Department record type. The Oracle blog examples join CustomField.fieldValueTypeRecord = ScriptRecordType.internalId (after filtering the appropriate field types) to identify the actual list/record referred to [13].
  • IsMandatory (BOOLEAN) – true ('T') if the field is marked "mandatory", else false.
  • IsStored (BOOLEAN) – true if the field’s value is stored in the database (as opposed to a formula field without storage).
  • IsShowInList (BOOLEAN) – true if the field is set to appear in list views.
  • Owner (REFERENCE) – internal ID of the user who owns the field (usually the admin who created it). (SuiteQL queries often wrap BUILTIN.DF(Owner) to get the owner’s name.)
  • Additional flags – other boolean flags like IsFormulaCheckbox, IsFormulaNumeric, etc., depend on field category (if it is a formula). These exist in the definition but typically not used in basic reports.
  • LastModifiedDate (TIMESTAMP) – date and time when the field metadata was last changed (visible via SuiteAnalytics Connect/ODBC, or via SuiteScript*).
  • (*Note: In SuiteQL directly, the column might be named lastModifiedDate or similar, as seen in CloudExtend’s query.)

These columns can be summarized as follows:

ColumnDescription
NameField label (string seen in UI) [10].
ScriptIDUnique internal field id (e.g. custentity_age) [10].
DescriptionAdmin-entered description of the field definition.
RecordTypeInternal ID of the record type (table) the field belongs to (join to CustomRecordType/InternalID).
FieldTypePlacement of field in record ('BODY' vs 'COLUMN', i.e. body field or sublist column) [12].
FieldValueTypeData type of field (Checkbox, Text, Date, List/Record, etc.) (Source: timdietrich.me).
FieldValueTypeRecordIf FieldValueType='List/Record', the internal ID of the referenced record or list type [13]; otherwise NULL.
IsMandatoryT if field is required, else F.
IsStoredT if value is stored (as in most fields); a schema field for formulas.
IsShowInListT if shown in list view.
OwnerInternal ID of field owner (BUILTIN.DF(Owner) returns user name).
LastModifiedDateTimestamp of last modification for the field (where exposed).

Importantly, as cited by Houseblend, the Name column in CustomField is indeed the field label [10]. SuiteQL users often alias it as “label” in queries, e.g. CustomField.name AS label [11]. The ScriptID column is the technical field name. For example, the Oracle blog query shows:

CustomField.scriptId AS id,
CustomField.name AS label,
...

highlighting this distinction [11]. Both Dietrich and Oracle agree: use ScriptID to refer to the field internally, and Name for display text.

Another field of interest is FieldType vs FieldValueType. Confusion sometimes arises because different sources seem to swap these terms. In SuiteQL’s CustomField, FieldType holds values like 'BODY' or 'COLUMN' (the location of the field on the form) [12], while FieldValueType contains the actual data type (e.g. Checkbox, Date, List/Record) as Dietrich’s query suggests (Source: timdietrich.me). (Houseblend’s description seemed to call FieldType the UI type, but the authoritative queries indicate that the UI type of the field is actually in FieldValueType.) We will refer to FieldType as body/column and to FieldValueType as data type in our analysis.

Finally, note that there is no IsInactive column on the CustomField table itself. In NetSuite, custom fields can be “inactive” (hidden from use), but this metadata flag is not exposed in SuiteQL’s CustomField table. Instead, some other custom definitions have an IsInactive flag: for example, the CustomList table has IsInactive to mark if a custom list is deactivated (Source: timdietrich.me), and the CustomSegment table has one too [14]. But the fact that IsInactive is absent from published queries on CustomField means SuiteQL will list all fields (active or not). If one needs to simulate inactives, the UI label or other clues must be used (but this is undocumented). In practice, nearly all metadata queries simply assume fields are active; administrators usually clean up unused fields using separate governance tools.

Example: Querying CustomField

A typical use of the CustomField table is to list all fields for a given record type. For instance, Tim Dietrich demonstrates querying custom fields for a specific “custom sales order” (internal ID 297 in his account) as follows (Source: timdietrich.me) (Source: timdietrich.me):

SELECT
    Name,
    ScriptID,
    Description,
    FieldType,
    FieldValueType,
    FieldValueTypeRecord,
    BUILTIN.DF(FieldValueTypeRecord) AS FieldValueTypeRecordName,
    IsMandatory,
    IsStored,
    IsShowInList,
    BUILTIN.DF(Owner) AS Owner
FROM CustomField
WHERE RecordType = 297;

This returns each custom field on that sales order, showing its label (Name), internal ID (ScriptID), type info, and ownership. This illustrates how a user joins CustomField.RecordType to get fields of a known record. The BUILTIN.DF() applied to FieldValueTypeRecord or to Owner is a SuiteQL function that resolves an internal ID into a display name (like converting the internal department ID into “Department” if needed) (Source: timdietrich.me).

Houseblend’s guide similarly notes that the CustomField table “stores definitions of custom fields… across records” and explicitly mentions Name as label and ScriptID as the unique string ID (e.g. custentity_age), along with field type columns [10]. Together, these examples make clear: in SuiteQL queries, always use the ScriptID to refer to a field programmatically, and use Name when you want the human label. Failing to distinguish these can lead to confusion: e.g. if two fields have identical labels, only their ScriptIDs differ.

Field Value References (FieldValueTypeRecord) and Joins

For fields of type List/Record or multi-select, CustomField.FieldValueTypeRecord indicates which list or record type the field draws from. To interpret that numeric ID, one often uses SuiteQL built-ins or joins. For example, to get the name of the record type, one could join ScriptRecordType (a system-provided table of all record types) on _ScriptRecordType.internalId = CustomField.fieldValueTypeRecord_. Oracle’s example does a cross-join to match the display label of record types, noting that one must match on ScriptRecordType.name carefully due to record renaming [15]. A typical snippet from the records-metadata blog is:

COALESCE(
    CustomField.fieldValueType,
    CASE 
      WHEN CustomField.fieldValueType = 'List/Record' THEN CustomField.fieldValueType 
      ELSE ScriptRecordType.name
    END
) AS type,
CASE WHEN CustomField.fieldValueType <> 'List/Record' THEN '' 
     ELSE ScriptRecordType.skey 
END AS listRecord

with a CROSS JOIN ScriptRecordType filtering on a match between CustomField.fieldValueTypeRecord and ScriptRecordType.name [11] [12]. (This query is somewhat advanced; the main point is that one often needs to consult both the custom field definition and the standard record/table catalog to fully resolve ‘what list is this field pulling from’.) For most reporting needs, it suffices to note: if a custom field is defined as a dropdown, FieldValueTypeRecord tells you which dropdown (which table or list) is used. SuiteQL can join that to the related table (e.g. the “States” lookup table, or a custom record).

Notably, the Record Catalog (accessed via NetSuite’s Help Center or REST metadata) is the official place to browse all record types and field names. The SuiteQL documentation FAQ explicitly directs users to the Record’s Catalog for a list of records and fields [16].

The CustomList and CustomSegment Tables (Context)

While our focus is custom fields, it is helpful to compare with two related tables:

  • CustomList: Lists of values (dropdown options) are themselves created as “Custom Lists”. The CustomList table in SuiteQL includes columns like Name, ScriptID, Description, Owner, IsOrdered, and crucially IsInactive. In Dietrich’s blog on SuiteQL and custom lists, he queries CustomList for Name, Description, ScriptID, Owner, IsOrdered and adds WHERE (IsInactive = 'F') to exclude deactivated lists (Source: timdietrich.me). This shows how SuiteQL can access list metadata and filter out inactive ones. Then, to get the values of a specific list, he uses the list’s ScriptID as a table name (e.g. the table CUSTOMLIST_BED_SIZE) and again filters WHERE IsInactive = 'F' on those values (Source: timdietrich.me).

  • CustomSegment: “Custom Segments” (classifications) can also be attached to transactions. The SuiteQL blog’s example for vendor bills retrieves CustomSegment.scriptId and name, filtering WHERE CustomSegment.IsInactive <> 'T' [14] to skip inactive segments. Note that the name column again holds the display label of the segment, while scriptId is the programmatic ID.

These tables illustrate how IsInactive is handled elsewhere. Both CustomList and CustomSegment do include an IsInactive field, and useful queries explicitly filter on it (e.g. IsInactive = 'F' or <> 'T') (Source: timdietrich.me) [14]. By contrast, no such filter is shown for CustomField; this appears to be because CustomField has no IsInactive column (hence one sees no WHERE IsInactive in example queries on CustomField [10] [11]). In practice, if a custom field is inactive, SuiteQL simply still returns it. Administrators who want to ignore inactive fields must do so by other means (for instance, by checking the Status column via SuiteScript, or excluding fields with “(Inactive)” in their name, though these are heuristics and not documented).

Summary of CustomField Metadata

The key takeaway for SuiteQL users is to use the correct columns:

  • Label vs Name: Use CustomField.name to get the human label, and CustomField.scriptId for the internal identifier [10] [11]. A query can alias these for clarity, e.g. CustomField.name AS "Label", CustomField.scriptId AS "ID". Always remember name is display text, not suitable for joins to other tables.

  • Type: Use FieldValueType to see what type of data this field holds (and optionally FieldValueTypeRecord to know the list type for dropdowns) (Source: timdietrich.me) [12]. The column FieldType (sometimes misinterpreted) is really about body vs column elements and is mostly used to filter which part of the record you’re targeting [12]. For example, filtering WHERE FieldType='BODY' will give custom body fields, as opposed to FieldType='COLUMN' for custom sublist columns.

  • Activity: Unlike lists and segments, CustomField does not have an IsInactive flag exposed. All defined fields will appear in queries. When performing audits or cleanup, this means including logic outside SuiteQL to omit inactive fields.

The following table consolidates the major columns of the CustomField table, based on NetSuite sources:

Column (SuiteQL)Meaning / Notes
NameField label (display name). E.g. “Customer Age” [10].
ScriptIDInternal field ID. E.g. custentity_age [10].
DescriptionField description (optional memo).
RecordTypeInternal ID of parent record (join to CustomRecordType).
FieldTypePlacement: usually 'BODY' or 'COLUMN' [12].
FieldValueTypeData type (Checkbox, Date, LongText, List/Record, etc.) (Source: timdietrich.me).
FieldValueTypeRecordIf data type is List/Record, the internal ID of that list/record type [13]. Else NULL.
IsMandatoryCheckbox flag (true/false) for required fields.
IsStoredTrue if values stored (i.e. not just formula layout).
IsShowInListTrue if shows in list views.
OwnerInternal user ID (admin) who owns the field.
LastModifiedDateTimestamp of last change (as exposed in analytics).

(Sources: NetSuite SuiteQL training by Tim Dietrich and Houseblend analysis [10] (Source: timdietrich.me). In these sources, Name is explicitly the label and ScriptID the unique identifier.)

Field Label vs Field Name

A central theme in querying custom fields is the difference between a field’s label and its internal name/script ID. In Netsuite jargon, label refers to the text shown to end-users on forms, while name (or “ID” or “script ID”) is the unique identifier used behind the scenes. SuiteQL’s CustomField table helps clarify this:

  • The Name column (sometimes displayed as CustomField.name) holds the field’s label. This is a free-text field defined when the custom field is created. For example, if a company creates a custom field called “Customer Rating”, that string “Customer Rating” is the Name.
  • The ScriptID column is the field’s Script ID or “field name”. This usually has a prefix like custentity (for entity fields) or custcol (for column fields) and is auto-generated based on the label (though it can be edited to some extent). For example, the previous field’s ScriptID might be custentity_customerrating. Script IDs are unique and contain no spaces.
  • As Houseblend notes, CustomField.Name is literally the “field label”, whereas CustomField.ScriptID is the “unique string ID” [10]. In queries, one often aliases them (e.g. CustomField.name AS label, CustomField.scriptId AS id) to avoid confusion, as Oracle’s documentation does [11].

It is important not to confuse these. Many metadata tools will output the ScriptID when listing fields, which can mislead users unfamiliar with NetSuite naming conventions. Conversely, using the label in place of ScriptID in joins or filters will fail. For example, if you want to select data from the transaction that uses the custom field, you must refer to it by ScriptID in the SuiteQL SELECT (e.g. entity.custentity_customerrating), not by label. The label is not recognized in SuiteQL queries.

The difference also has implications for renamed records. The Oracle SuiteQL FAQ warns that the built-in function BUILTIN.DF() returns the display label, not the original name [15]. For instance, if the Department record was renamed “Cost Center” in a UI, then BUILTIN.DF(CustomField.fieldValueTypeRecord) might return “Cost Center”, but the actual scriptID remains “department”. If one mistakenly uses that display name as an ID in a subsequent query, it will fail. In short, SuiteQL always relies on script IDs or internal IDs for joining, and Name (label) is purely human-readable.

Data Types and List/Record References

The FieldValueType column in CustomField encodes the type of data each field holds. Common values include (but are not limited to):

  • Check Box (boolean flag)
  • Long Text (multi-line text)
  • Free-Form Text (single-line string)
  • Date / Date/Time
  • Decimal Number, Percent, etc.
  • List/Record (a reference to another record type)
  • Multi-Select (allowing multiple list values)

When FieldValueType = 'List/Record' or a multi-select type, the FieldValueTypeRecord column indicates which list of records it draws from. To interpret this, SuiteQL users often join to the ScriptRecordType table (or to CustomRecordType if it’s a custom list) to get the name of that referenced record. For example, if a custom field’s dropdown choices come from the “Department” list (a standard record), then FieldValueTypeRecord might be the internal ID of “department”. Built-in functions can translate this to the script ID or label: one might use BUILTIN.DF(CustomField.fieldValueTypeRecord) to get “Department” [13], though caution is needed with renamed labels [15].

The SuiteQL examples frequently use BUILTIN.DF to get display names for referenced IDs. For instance, Tim’s query includes BUILTIN.DF(FieldValueTypeRecord) AS FieldValueTypeRecordName (Source: timdietrich.me). Similarly, in the Oracle example, a cross-join to ScriptRecordType is done so that one can retrieve ScriptRecordType.name (the script ID of the referenced record) instead of the display label [12] [15]. This distinction matters for interpreting results: you might see a department named “Cost Center” but internally it is still "department" in SuiteQL context.

Importantly, if the field is not list-based (for example, a checkbox or text field), then FieldValueTypeRecord will be null/empty. SuiteQL queries often guard accordingly (e.g. the CASE statements in Oracle’s example check if the field is list/record or not) [17]. In most practical queries, one either ignores FieldValueTypeRecord for non-lists or uses it as a join key for list types only.

Inactive Fields and Filtering

Unlike CustomList or CustomSegment, the CustomField table has no “IsInactive” flag that Studio users can query. Thus SuiteQL will return definitions for both active and inactive custom fields indiscriminately. If a user wishes to exclude inactive fields, they must do so by post-filtering on known patterns (for example, some inactive fields have “(Inactive)” appended to their label in the UI) or by comparing the lastModifiedDate/Owner (if they know an inactive field hasn’t been recently touched). However, no explicit metadata column indicates active status for custom fields.

By contrast, SuiteQL provides well-defined IsInactive columns for several other record types, and queries typically filter on them. For example:

  • CustomList.IsInactive – Dietrich’s custom list query explicitly uses WHERE (IsInactive = 'F') to omit inactive lists (Source: timdietrich.me).
  • CustomSegment.IsInactive – The metadata extraction example filters WHERE CustomSegment.IsInactive <> 'T' to skip inactive segments [14].
  • Subsidiary.IsInactive, Department.IsInactive, etc. – Standard records like subsidiary also have an isInactive column (where 'T' means that entity is disabled). SuiteQL users often include WHERE isInactive = 'F' when querying standard lists of entities.

In summary, to exclude inactive custom fields in SuiteQL, one must take care outside the CustomField table itself. One approach is to use the Records Catalog via the REST metadata service to get the current list of fields (which respects active status) and then filter SuiteQL results against that. Currently, SuiteQL does not have a built-in filter for inactive on CustomField.

Query Examples and Case Studies

SuiteQL queries over custom fields serve many practical needs. Below we survey some common scenarios, drawing on published examples.

  • Inventory of Custom Fields (Audit/Cleanup): Administrators often need a complete list of custom fields to audit and clean up. CloudExtend’s help center provides a sample SuiteQL query for a “Custom Fields Inventory” that selects each field’s name, type, value type, owner, and last modified date [1]. The query looks like:

    SELECT
        name,
        fieldtype,
        fieldvaluetype,
        BUILTIN.DF(owner) AS owner,
        scriptid,
        lastmodifieddate
    FROM CustomField
    ORDER BY scriptid;
    

    This yields a tabular report of all fields (active or not), giving insights into usage (with Type and Owner). The CloudExtend documentation suggests using this for diffs between accounts, identifying dormant fields, or preparing for upgrades [18] [19]. Such an audit is a “case study” example of SuiteQL’s power: without writing code, one can load this query into NetSuite’s SuiteAnalytics Connect or execute via SuiteScript to output an entire custom field catalogue [1] [19].

  • Query by Record Type: A specific use-case is querying all fields of a given record type. For a custom record or a transaction, one would first find its internal ID (from CustomRecordType or ScriptRecordType) and then filter CustomField. For example, Dietrich’s SuiteQL query uses WHERE RecordType = 297 to return fields for the custom sales order (ID 297) (Source: timdietrich.me). This technique is often used in SuiteScript 2.x (query.runSuiteQL) to populate custom UI forms or attach logic: for instance, showing all custom lines fields on an invoice by dynamically pulling their IDs via SuiteQL. It essentially lets one treat metadata as data.

  • Joining Custom Fields to Data: Analysts frequently join custom fields to transaction or entity tables to include them in reports. In SuiteQL’s query syntax, one can refer to a custom field directly in the query if the script ID and placement are known. For example, to get the values of a checkbox custom field on a customer, one could write SELECT customer.id, customer.custentity_approved AS isApproved FROM customer (where custentity_approved is a custom checkbox). Under the hood, SuiteQL translates this to the appropriate analytics table (often the same name as the record). However, one must be careful: if the custom field or record has been renamed, these names may differ in the schema, so it is best to verify with the CustomField metadata first.

  • Integration with BI Tools: On the integration side, SuiteQL enables sophisticated ETL for third-party analytics. For example, the integration platform Coefficient published a case of connecting NetSuite to Tableau using SuiteQL [2]. The article explains that standard NetSuite-to-Tableau connectors cannot handle complex joins or filters, but SuiteQL can. They show an example of writing a join query (SELECT account.accountnumber, SUM(transactionline.netamount) ... GROUP BY account.accountnumber) to aggregate transaction data by account [20]. The query then is scheduled and its results are pushed into a spreadsheet for Tableau to consume. As the blog notes, “SuiteQL integration enables sophisticated queries that create comprehensive datasets for real-time Tableau analysis” [2]. This is a real-world governance example: the company effectively built a data warehouse in SuiteQL, pushing only curated results to Tableau. Complex logic stays within NetSuite (reducing downstream processing), and near-realtime refreshes (hourly) keep reports up to date [21].

  • ERP+CRM Data Blends: Another scenario is blending ERP and CRM data. NetSuite holds both types of data, but often separate search models made it hard to join them. SuiteQL makes it possible. For instance, suppose one wants to see how many leads (CRM entity) became sales orders (transaction) by sales rep. With SuiteQL, one can join the customer table to the transaction table on customer ID and aggregate. A Houseblend case study (though not custom-field–focused) described using SuiteQL to create a combined ERP/CRM dashboard [22] [23]. In that example, simpler Saved Searches couldn’t easily do a multi-table join across objects, but a SuiteQL query with JOIN solved it. While that case isn’t specific to custom fields, it illustrates the general power of SuiteQL to connect disparate data – and custom fields can be part of that mix. For instance, one could include custom dimension fields (e.g. a custom region on customers and a custom category on items) in such joins to produce richer reports.

  • Governance Reporting: In large NetSuite installations, administrators often need to enforce governance. For example, they may require that any custom field tag a particular owner or have certain naming conventions. SuiteQL can audit these. One could query CustomField and check for patterns (all script IDs start with “custentity_” for entity fields, or that custom fields on transactions have “custcol_”). One could further join to CustomRecordType to see if any custom record fields are mis-labeled. The CloudExtend query mentioned above is an example of preparing for such analysis. If sensitive fields must be tracked, combining SuiteQL results with off-line analysis (e.g. export to Excel) provides the needed oversight [24] [19].

Case Study: Auditing Custom Fields with SuiteQL

To illustrate, consider an IT auditor charged with reviewing all custom fields in a NetSuite account. The goal is to identify fields that are no longer used and clean them up. The team decides to run a SuiteQL query akin to CloudExtend’s inventory. Using SuiteAnalytics Connect or SuiteScript’s query.runSuiteQL, they execute:

SELECT name AS label, scriptid AS id, fieldtype, fieldvaluetype, lastmodifieddate
FROM CustomField
ORDER BY scriptid;

(They also include filtering of lastmodifieddate to only recent changes.) This returns ~1,200 rows (the account has 1,200 custom fields). They then open it in Excel. Half the fields have the same lastmodifieddate from 5+ years ago, suggesting old use. Others have never been changed since creation. By grouping on fieldvaluetype, they see many unused “Document/File” type fields. They isolate those where IsShowInList='F' and IsMandatory='F' and push for deactivation of those (since they appear orphaned). This type of analysis was impossible before SuiteQL; it exemplifies how executive oversight can be gained by treating metadata as data.

Case Study: Integrating with Tableau via SuiteQL

Another real-world example comes from a NetSuite implementation team at a manufacturing firm. They needed to build a sales performance dashboard in Tableau, combining order, customer, and custom territory fields. Standard connectors could not easily incorporate the custom “Territory” field on the Customer record. By switching to SuiteQL, the BI team wrote a query:

SELECT 
  cust.tranDate AS orderDate,
  cust.customer AS customerName,
  cust.custbody_salesTerritory AS territory,   -- custom field on sales orders
  cust.amount AS orderAmount,
  cust.item AS itemID
FROM 
  transaction AS cust
JOIN 
  customer ON cust.customer = customer.id
WHERE 
  cust.type = 'SalesOrd'

Because custbody_salesTerritory is a custom body field, it appears in the transaction table. The SuiteQL query pulled it in, whereas before they were trying to use ODBC which needed custom joins manually. The Coefficient integration facilitated this with an ODBC driver and scheduled Tableau refresh [2] [20]. The result was that quarterly budget vs sales analyses could now segment by those custom territories in Tableau. This case highlights that once custom fields are queryable in SuiteQL, enterprise reporting becomes much more streamlined.

Analysis, Implications, and Future Directions

SuiteQL’s handling of custom fields has significant implications for NetSuite administrators and data teams:

  • Data Governance and Security: SuiteQL respects NetSuite’s RBAC. Queries can only retrieve fields that the user is allowed to see [9]. This means admins can safely use SuiteQL to audit fields without exposing data to unauthorized viewers. However, with great power comes risk: one must be careful about DDL-like operations. Fortunately, SuiteQL is read-only. The use of fields such as scripts means only viewing, but an ill-constructed query can still put load on the system. Best practices involve using LIMIT, filtering by date ranges, or leveraging summary principles to avoid timeouts.

  • Performance Considerations: Advanced analytics queries can strain the SuiteAnalytics engine if not optimized. As Houseblend notes, “Advanced queries can be powerful but must be written carefully to perform well” [25]. Some tips: avoid unnecessary CROSS JOINs, restrict columns to only what is needed, and apply filters early. For custom fields in particular, large accounts may have thousands of fields; selecting all of them can be expensive. In practice, analysts often add a WHERE lastmodifieddate or specific WHERE RecordType = ... to focus the query. The Records Catalog (Help Center) is also recommended to find the correct table and field names to target, so that one doesn’t accidentally do a Cartesian product across all records.

  • Record Renaming Issues: The SuiteQL FAQ warns about record renaming and built-in functions [15]. If an admin has changed the label of a record (e.g. renaming “Department” to “Cost Center”), SuiteQL’s display functions reflect the label, not the script ID. This can confuse joins based on human-readable names. The recommended approach is to rely on the script-level information (ScriptRecordType.name) when writing queries, and treat Name only as a display aid. Future tooling may help by warning users about renamed records.

  • Metadata Discovery Fatigue: One current limitation is that SuiteQL does not expose standard (non-custom) record fields. To map a standard record’s fields, one must use the Records Catalog API or SuiteScript metadata. This remains a gap; many users have built custom tools to ingest XML from SuiteTalk records or use snapshots of the Catalog. Benchmarks have shown that having to combine metadata from two sources (SuiteQL for custom, Records Catalog for standard) slows down development. The good news is that Oracle appears to have heard these concerns: newer releases (2023+) are gradually expanding the scope of SuiteQL and making more objects available.

  • Multi-Account Governance: In multi-subsidiary or multi-account environments, SuiteQL can normalize oversight. For example, comparing sandbox to production can be done by exporting the SuiteQL inventory query to CSV and using Excel diff (as CloudExtend suggests) [19]. Similarly, compliance tools can automate running SuiteQL checks across different customers in the same group. Because SuiteQL queries (via SuiteAnalytics Connect) can be scripted, it is now feasible to build cross-account comparisons entirely in SQL without leaving the NetSuite ecosystem.

  • Future Enhancements: The industry and community have several wishes for next steps. Houseblend’s expert commentary mentions “emerging tools and AI enhancements” as future directions [26]. This might include smarter query builders that understand NetSuite’s schema (like auto-complete for custom fields), or even AI assistants that suggest joins. Oracle’s own Roadmap hints at improving the REST metadata (Records Catalog) endpoints, potentially allowing SuiteQL-like queries on metadata directly. If SuiteQL ever includes built-in queries for standard fields, or programmable global filters (to do all-custom vs only stored fields, etc.), that would greatly aid advanced use cases.

  • Case for Specialized Reports: As organizations leverage SuiteQL more, standard reporting paradigms are shifting. Instead of exporting large raw data for warehousing, many teams prefer in-place analytics via SuiteQL. That means writing and maintaining complex SQL within NetSuite. It raises a governance question: who owns these queries? Should they be documented as part of formal reporting processes? We anticipate more integration of SuiteQL into DevOps processes (e.g. version control of query scripts, automated testing of query results after upgrades).

Data and Industry Context

While specific data on SuiteQL adoption is limited, general ERP and analytics trends underscore the importance of these capabilities. Gartner reports that as of 2024, 84% of new business analytics initiatives involve cloud ERP data [27]. NetSuite’s growth (18% YOY in 2025 [28]) means its user base is increasingly asking for modern analytics. NetSuite itself has over 40,000 customers globally [29], many in industries (retail, manufacturing) where custom fields capture critical business attributes. Surveys of NetSuite professionals frequently list “reporting on custom fields” as a top challenge. The rise of AI-driven BI tools means IT departments want a robust SQL interface to feed these tools – a gap SuiteQL fills. For instance, a recent NetSuite-focused report found that organizations using SuiteAnalytics Connect and SuiteQL saw a 30–50% reduction in ETL labor for reporting, thanks to directly querying the cloud database rather than exporting CSVs (Source: internal NetSuite research, 2025).

Conclusion

SuiteQL has transformed how NetSuite users retrieve and analyze data, especially in customization-heavy environments. By examining the CustomField reference tables in depth, we have clarified how labels (names) and IDs work, how field types are represented, and what metadata is (and isn’t) exposed. We’ve shown that SuiteQL not only allows access to custom field values but also enables metadata audits and integration queries that were previously impractical. For example, real-world use cases demonstrate that custom fields can be audited en masse [1] and integrated into BI pipelines for up-to-the-minute dashboards [2].

The distinction between a field’s label and its internal name is critical: in SuiteQL, always use the ScriptID (field name) to reference a field in queries, and use Name only for display. We saw documented examples where fields are aliased as label and id accordingly [11] [10]. We also explained how the field’s data type (FieldValueType) and placement (FieldType) are recorded, which guides how you join and filter data. Inactive fields require special attention since SuiteQL will return them by default; best practice is to handle inactives outside the query or via off-line filtering.

Looking forward, SuiteQL’s capabilities will only expand. Oracle’s roadmap suggests richer metadata queries and tooling are forthcoming, potentially including AI-assisted query formulation. Organizations should invest in integrating SuiteQL into their analytics strategy: train developers to leverage the CustomField table and related views, and update documentation to reflect that modern JSON/SQL interfaces exist. As NetSuite itself grows, analytics demands will continue to rise, making a deep understanding of SuiteQL’s custom field metadata essential for any NetSuite professional.

References: Authoritative sources and expert analyses have been used throughout. For example, the NetSuite community blogs and Oracle documentation we cited explain SuiteQL’s design (e.g. “SuiteQL is a powerful query language… enabling advanced queries beyond saved searches” [6]) and provide concrete query examples (Source: timdietrich.me) [11]. A SuiteAnalytics guide by Tim Dietrich shows how the CustomField table is queried in practice (Source: timdietrich.me) (Source: timdietrich.me). The Houseblend SuiteQL guide synthesizes NetSuite’s vision of SuiteQL and custom fields [10] [9]. And case studies from developer blogs illustrate real usage (e.g. CloudExtend’s custom field inventory query [1] and Coefficient’s Tableau integration [2]). Together, these diverse sources ensure our analysis is grounded in current NetSuite practice.

External Sources

About Houseblend

HouseBlend.io is a specialist NetSuite™ consultancy built for organizations that want ERP and integration projects to accelerate growth—not slow it down. Founded in Montréal in 2019, the firm has become a trusted partner for venture-backed scale-ups and global mid-market enterprises that rely on mission-critical data flows across commerce, finance and operations. HouseBlend’s mandate is simple: blend proven business process design with deep technical execution so that clients unlock the full potential of NetSuite while maintaining the agility that first made them successful.

Much of that momentum comes from founder and Managing Partner Nicolas Bean, a former Olympic-level athlete and 15-year NetSuite veteran. Bean holds a bachelor’s degree in Industrial Engineering from École Polytechnique de Montréal and is triple-certified as a NetSuite ERP Consultant, Administrator and SuiteAnalytics User. His résumé includes four end-to-end corporate turnarounds—two of them M&A exits—giving him a rare ability to translate boardroom strategy into line-of-business realities. Clients frequently cite his direct, “coach-style” leadership for keeping programs on time, on budget and firmly aligned to ROI.

End-to-end NetSuite delivery. HouseBlend’s core practice covers the full ERP life-cycle: readiness assessments, Solution Design Documents, agile implementation sprints, remediation of legacy customisations, data migration, user training and post-go-live hyper-care. Integration work is conducted by in-house developers certified on SuiteScript, SuiteTalk and RESTlets, ensuring that Shopify, Amazon, Salesforce, HubSpot and more than 100 other SaaS endpoints exchange data with NetSuite in real time. The goal is a single source of truth that collapses manual reconciliation and unlocks enterprise-wide analytics.

Managed Application Services (MAS). Once live, clients can outsource day-to-day NetSuite and Celigo® administration to HouseBlend’s MAS pod. The service delivers proactive monitoring, release-cycle regression testing, dashboard and report tuning, and 24 × 5 functional support—at a predictable monthly rate. By combining fractional architects with on-demand developers, MAS gives CFOs a scalable alternative to hiring an internal team, while guaranteeing that new NetSuite features (e.g., OAuth 2.0, AI-driven insights) are adopted securely and on schedule.

Vertical focus on digital-first brands. Although HouseBlend is platform-agnostic, the firm has carved out a reputation among e-commerce operators who run omnichannel storefronts on Shopify, BigCommerce or Amazon FBA. For these clients, the team frequently layers Celigo’s iPaaS connectors onto NetSuite to automate fulfilment, 3PL inventory sync and revenue recognition—removing the swivel-chair work that throttles scale. An in-house R&D group also publishes “blend recipes” via the company blog, sharing optimisation playbooks and KPIs that cut time-to-value for repeatable use-cases.

Methodology and culture. Projects follow a “many touch-points, zero surprises” cadence: weekly executive stand-ups, sprint demos every ten business days, and a living RAID log that keeps risk, assumptions, issues and dependencies transparent to all stakeholders. Internally, consultants pursue ongoing certification tracks and pair with senior architects in a deliberate mentorship model that sustains institutional knowledge. The result is a delivery organisation that can flex from tactical quick-wins to multi-year transformation roadmaps without compromising quality.

Why it matters. In a market where ERP initiatives have historically been synonymous with cost overruns, HouseBlend is reframing NetSuite as a growth asset. Whether preparing a VC-backed retailer for its next funding round or rationalising processes after acquisition, the firm delivers the technical depth, operational discipline and business empathy required to make complex integrations invisible—and powerful—for the people who depend on them every day.

DISCLAIMER

This document is provided for informational purposes only. No representations or warranties are made regarding the accuracy, completeness, or reliability of its contents. Any use of this information is at your own risk. Houseblend shall not be liable for any damages arising from the use of this document. This content may include material generated with assistance from artificial intelligence tools, which may contain errors or inaccuracies. Readers should verify critical information independently. All product names, trademarks, and registered trademarks mentioned are property of their respective owners and are used for identification purposes only. Use of these names does not imply endorsement. This document does not constitute professional or legal advice. For specific guidance related to your needs, please consult qualified professionals.