# NetSuite Script ID Prefixes: custbody, custcol, customrecord and More

> Source: https://netray.co/tools/netsuite-script-id-prefixes-reference
> Publisher: Netray (netray.co), AI and integration engineering for ERP and manufacturing systems.
> Section: Free Tools

## Short answer

The prefix NetSuite applies to each custom object and field type, where you create it, and how to reference it in SuiteScript, SuiteQL and REST.

## Category

netsuite

## Erp

NetSuite

## Audience

- NetSuite administrator
- SuiteScript developer
- SuiteCloud developer

## Tool

**Kind:** worksheet

**Mode:** reference

**Columns:**

#### Prefix

**Key:** prefix

**Type:** text

#### Object

**Key:** object

**Type:** text

#### Where created

**Key:** where_created

**Type:** text

#### Example ID

**Key:** example_id

**Type:** text

#### How to reference

**Key:** how_to_reference

**Type:** text

#### Notes

**Key:** notes

**Type:** text

**Rows:**

**Prefix:** custbody

**Object:** Transaction body field

**Where created:** Customization > Lists, Records and Fields > Transaction Body Fields

**Example id:** custbody_qc_inspection

**How to reference:** rec.getValue({fieldId: 'custbody_qc_inspection'}); SuiteQL transaction.custbody_qc_inspection; REST body field

**Notes:** Applies to the transaction types ticked on the field.

**Prefix:** custcol

**Object:** Transaction column (line) field

**Where created:** Customization > Lists, Records and Fields > Transaction Line Fields

**Example id:** custcol_heat_number

**How to reference:** rec.getSublistValue({sublistId: 'item', fieldId: 'custcol_heat_number', line: 0}); SuiteQL transactionline.custcol_heat_number

**Notes:** Lives on transactionline in SuiteQL, not transaction.

**Prefix:** custentity

**Object:** Entity field (customer, vendor, employee, contact, partner)

**Where created:** Customization > Lists, Records and Fields > Entity Fields

**Example id:** custentity_credit_tier

**How to reference:** SuiteQL customer.custentity_credit_tier or vendor.custentity_credit_tier

**Notes:** One field can apply to several entity types.

**Prefix:** custitem

**Object:** Item field

**Where created:** Customization > Lists, Records and Fields > Item Fields

**Example id:** custitem_material_grade

**How to reference:** SuiteQL item.custitem_material_grade

**Notes:** Applies to the item types ticked on the field.

**Prefix:** custevent

**Object:** CRM field (case, task, event, call)

**Where created:** Customization > Lists, Records and Fields > CRM Fields

**Example id:** custevent_root_cause

**How to reference:** SuiteQL supportcase.custevent_root_cause

**Notes:** Used on activities and support cases.

**Prefix:** custitemnumber

**Object:** Item number field (lot and serial numbers)

**Where created:** Customization > Lists, Records and Fields > Item Number Fields

**Example id:** custitemnumber_cert_no

**How to reference:** Inventory number record field

**Notes:** Stored per lot or serial number, not per item.

**Prefix:** custrecord

**Object:** Custom record field, and Other Record field on standard records

**Where created:** On the custom record type, or Customization > Lists, Records and Fields > Other Record Fields

**Example id:** custrecord_qc_result

**How to reference:** SuiteQL customrecord_qc_inspection.custrecord_qc_result

**Notes:** Same prefix for both uses; name it after its record to stay readable.

**Prefix:** custpage

**Object:** Field, sublist or tab added by script at runtime

**Where created:** serverWidget in a Suitelet or beforeLoad user event

**Example id:** custpage_preview

**How to reference:** form.addField({id: 'custpage_preview', ...})

**Notes:** Not stored. Values are lost unless the script saves them to a real field.

**Prefix:** custscript

**Object:** Script parameter

**Where created:** Script record > Parameters subtab

**Example id:** custscript_ap_approver_role

**How to reference:** runtime.getCurrentScript().getParameter({name: 'custscript_ap_approver_role'})

**Notes:** Defined on the script, valued on the deployment or as a preference.

**Prefix:** customrecord

**Object:** Custom record type

**Where created:** Customization > Lists, Records and Fields > Record Types

**Example id:** customrecord_qc_inspection

**How to reference:** record.load({type: 'customrecord_qc_inspection', id}); SuiteQL FROM customrecord_qc_inspection; REST record/v1/customrecord_qc_inspection

**Notes:** SuiteQL table name is the script ID in lower case.

**Prefix:** customlist

**Object:** Custom list

**Where created:** Customization > Lists, Records and Fields > Lists

**Example id:** customlist_ship_method

**How to reference:** SuiteQL FROM customlist_ship_method (id, name, scriptid, isinactive)

**Notes:** Fields of type List/Record store the value's internal ID.

**Prefix:** customscript

**Object:** Script record

**Where created:** Customization > Scripting > Scripts

**Example id:** customscript_so_credit_hold_ue

**How to reference:** task.create({scriptId: 'customscript_...'}); url.resolveScript

**Notes:** Name it with type suffix (_ue, _cs, _sl, _rl, _mr, _ss).

**Prefix:** customdeploy

**Object:** Script deployment

**Where created:** Script record > Deploy Script

**Example id:** customdeploy_so_credit_hold_ue

**How to reference:** task.create({deploymentId: 'customdeploy_...'}); url.resolveScript

**Notes:** Auto IDs customdeploy1, 2... are hard to manage across accounts.

**Prefix:** customsearch

**Object:** Saved search

**Where created:** Lists > Search > Saved Searches

**Example id:** customsearch_open_wo_shortage

**How to reference:** search.load({id: 'customsearch_open_wo_shortage'})

**Notes:** Set the ID on the saved search before others depend on it.

**Prefix:** customworkflow

**Object:** Workflow

**Where created:** Customization > Workflow > Workflows

**Example id:** customworkflow_po_approval

**How to reference:** workflow.initiate({recordType, recordId, workflowId: 'customworkflow_po_approval'})

**Notes:** States and actions inside it carry their own IDs.

**Prefix:** workflowstate / workflowaction

**Object:** Workflow state and workflow action

**Where created:** Inside the workflow designer

**Example id:** workflowstate_pending_approval

**How to reference:** SDF workflow XML; workflow.trigger actionId

**Notes:** Visible mostly when working with SDF or triggering buttons from script.

**Prefix:** customtransaction

**Object:** Custom transaction type

**Where created:** Customization > Lists, Records and Fields > Transaction Types

**Example id:** customtransaction_scrap_journal

**How to reference:** record.create({type: 'customtransaction_scrap_journal'}); SuiteQL transaction.type

**Notes:** Behaves like a transaction, posting or non-posting by setup.

**Prefix:** customrole

**Object:** Custom role

**Where created:** Setup > Users/Roles > Manage Roles

**Example id:** customrole_integration_ro

**How to reference:** SDF role object; runtime.getCurrentUser().roleId

**Notes:** roleId returns the script ID, role returns the internal ID.

**Prefix:** custtab

**Object:** Custom subtab

**Where created:** Customization > Forms > Subtabs

**Example id:** custtab_quality

**How to reference:** Field Display subtab setting on custom fields

**Notes:** Group custom fields on one subtab per process.

**Prefix:** custform

**Object:** Custom entry or transaction form

**Where created:** Customization > Forms > Entry Forms / Transaction Forms

**Example id:** custform_qc_sales_order

**How to reference:** customform field value (internal ID) on the record

**Notes:** Records store the form's internal ID in customform.

**Prefix:** custtmpl

**Object:** Advanced PDF/HTML template

**Where created:** Customization > Forms > Advanced PDF/HTML Templates

**Example id:** custtmpl_coc_packing_slip

**How to reference:** renderer.setTemplateByScriptId({scriptId: 'CUSTTMPL_COC_PACKING_SLIP'})

**Notes:** Used for certificates of conformance, packing slips, invoices.

**Prefix:** custemailtmpl

**Object:** Email template

**Where created:** Documents > Templates > Email Templates

**Example id:** custemailtmpl_po_chase

**How to reference:** render.mergeEmail with templateId (internal ID)

**Notes:** Scripts usually need the internal ID.

**Prefix:** cseg

**Object:** Custom segment

**Where created:** Customization > Lists, Records and Fields > Custom Segments

**Example id:** cseg_program

**How to reference:** Body and line field cseg_program; SuiteQL transactionline.cseg_program

**Notes:** Use for GL reporting dimensions such as program or contract.

**Notes:** NetSuite adds the prefix automatically; you type only the suffix, and an underscore after the prefix is the usual convention. Script IDs are stored in lower case. For multi-select fields and length limits, check the SDF custom object reference in NetSuite help for your release.

## Content

**Intro:** NetSuite puts a fixed prefix on the script ID of every custom field and custom object, and that prefix tells you where the field lives and how to query it. This table lists each prefix, the menu path where the object is created, and the way to reference it in SuiteScript, SuiteQL and REST.

**Sections:**

#### How to use it

**Body:** Search for the prefix you see in a script or saved search formula, for example custcol, to learn which record holds it. The How to reference column gives the pattern for getValue, the SuiteQL table and column, or the REST field. This matters most in SuiteQL: a custbody field is a column on transaction, while a custcol field is a column on transactionline, and a custom record or custom list is its own table named after its script ID. When you design new fields, pick a suffix that names the process and the record, for example custbody_qc_inspection rather than custbody1, because these IDs end up in scripts, integrations and reports for years.

#### Where to find record type IDs

**Body:** Custom record types are listed at Customization > Lists, Records and Fields > Record Types, with both the script ID (customrecord_...) and the internal ID. Scripts and SuiteQL use the script ID. Some older APIs and URL parameters use the numeric internal ID, for example rectype on custom record URLs. Standard record types use names such as salesorder in SuiteQL and record.Type.SALES_ORDER in SuiteScript. The Records Catalog (Setup > Records Catalog) shows the SuiteQL table and every column for standard and custom records in your account, including joins, which makes it the fastest way to confirm a custom field's column name.

#### Worked example

**Body:** A quality team stores inspections in customrecord_qc_inspection with fields custrecord_qc_result (List/Record pointing to customlist_qc_result) and custrecord_qc_item. Sales orders carry custbody_qc_inspection linking to it. In SuiteQL: SELECT r.id, BUILTIN.DF(r.custrecord_qc_result) AS result FROM customrecord_qc_inspection r. To find orders with inspections: SELECT t.tranid FROM transaction t WHERE t.custbody_qc_inspection IS NOT NULL. In a 2.1 user event on the sales order: context.newRecord.getValue({fieldId: 'custbody_qc_inspection'}) returns the inspection's internal ID, and getText returns its name. The prefixes alone tell you which table to look in at each step.

#### Common mistakes

**Body:** Leaving the ID blank gives you custbody1, custbody2 and so on, which nobody can read and which collide across accounts when SDF projects are merged. Changing a script ID later breaks every script, saved search formula and integration mapping that uses it. Querying a custcol field on the transaction table returns an unknown identifier error in SuiteQL because it belongs to transactionline. custpage fields look like fields but are not stored, so values typed into them are lost unless your script copies them to a real field on submit. Finally, the same custrecord prefix is used for fields on custom records and for Other Record fields on standard records, so name them clearly.

**Cta:** If you want people to ask questions about your custom records and fields in plain English and get answers from NetSuite on your own servers, with the query shown, we can set that up.

**Faq:**

#### What is the difference between custbody and custcol?

**Answer:** custbody fields sit on the transaction header, one value per transaction, and appear on the transaction table in SuiteQL. custcol fields sit on each line, one value per line, and appear on transactionline. In SuiteScript you read custbody with getValue and custcol with getSublistValue on the item, expense or other sublist.

#### How do I query a custom list in SuiteQL?

**Answer:** Use the list's script ID as the table name: SELECT id, name, isinactive FROM customlist_ship_method WHERE isinactive = 'F'. Fields that point to the list store the internal ID, so join on id or wrap the field in BUILTIN.DF to get the label without a join.

#### Can I rename a field's script ID after it is created?

**Answer:** NetSuite allows changing some script IDs from the record's action menu, but every reference in scripts, saved search formulas, workflows, CSV import maps and integrations must change too, and SDF projects will no longer match. Treat script IDs as permanent and choose them carefully at creation.

#### Why do some fields start with custpage?

**Answer:** custpage is the required prefix for fields, sublists and tabs added at runtime by a Suitelet or a beforeLoad user event through serverWidget. They are display-only and not stored on the record. Use them for previews, helpers and Suitelet forms, and save any value you need to a real custom field.

## Search terms

netsuite custom record types, record type in netsuite, netsuite record type ids, query netsuite suiteql from custom lists, netsuite custom record form, netsuite custbody custcol, netsuite script id prefix, netsuite custentity field

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