Skip to content
Grounded ERP AI

What is a data dictionary in ERP?

What a data dictionary is in ERP terms: record types, custom fields, join paths, observed status values — and why AI answers need a per-account one.

ERPray teamUpdated 9 min read
Short answer

A data dictionary in ERP is a per-account inventory of your data structure: every record type with its row count, every field including custom ones, the real join paths between records, and the status values that actually occur. It is what makes an accurate AI answer possible, because a query can only reference what the dictionary contains.

Key takeaways

  • A data dictionary is an inventory of your account's structure and meaning: record types, fields including custom, join paths, observed value domains and row counts.
  • Vendor schema documentation describes the software. A data dictionary describes your account — and the difference is where wrong answers come from.
  • The valuable parts are observed rather than documented: which status values actually occur, which fields are actually populated, how many rows are actually there.
  • A dictionary is only current until your next customisation, so it needs a refresh mechanism and a stated staleness window.
  • Keeping a lightweight dictionary — field register, status glossary, metric definitions — is worth doing even if you never connect an AI tool to your ERP.

Every ERP vendor documents their software. Nobody documents your account. The gap between those two things — the custom fields somebody added in 2019, the status list your ops team renamed, the two fields that both look like they hold the ship date — is where reports go wrong, onboarding takes months, and AI answers become confidently incorrect. An ERP data dictionary is how you close it.

Data dictionary
A structured inventory of the data in a specific system: what records exist, what fields each record has, what those fields mean, what values they legitimately contain, and how records relate to each other. In ERP terms it is account-specific — two companies running the same ERP have different dictionaries, because the customisations, statuses and conventions are theirs.

What is in an ERP data dictionary

A useful dictionary has seven layers. The first three are structural and readable from the system. The next two must be observed from the data itself. The last two require a human, which is the part most tooling skips.

LayerWhat it recordsWhy an answer needs it
Record typesEvery record and table in the account, standard and custom, with row counts and whether it is in use.Tells you where a question can be answered from, and whether a table with 0 rows is a dead end.
FieldsInternal id, display label, data type, custom flag, list flag, and whether it is populated.A query can only reference fields that exist. Labels matter because people ask using labels, not ids.
RelationshipsThe real join paths, which direction is valid, and where a join fans out to many rows.Most wrong totals are a join problem: one row per order becomes one row per line, and everything doubles.
Observed value domainsThe distinct values that actually appear in status, type and list fields, with a count for each.A filter on a status value your account does not use returns zero rows and no error.
Structure and scopeSubsidiaries, currencies, accounting periods, departments, classes, locations — and which are in use.Determines whether a number is one entity or all of them, and which date field defines a period.
Access scopeWhat the connected role can see, and what it cannot.Stops a partial answer being presented as a complete one. If the role cannot see a subsidiary, the total is not company-wide.
SemanticsYour definitions: what counts as revenue, what "active customer" means, which DSO variant you report.The schema cannot tell you this. Without it a system answers a well-formed version of the wrong question.
Seven layers. Structure is readable, domains must be observed, semantics must be agreed by people.

Fields, including the ones only you have

Custom fields are the whole reason a generic schema is not enough. In NetSuite they announce themselves by prefix: custentity_ on entities like customers and vendors, custbody_ on transaction bodies, custcol_ on transaction lines, custitem_ on items, custrecord_ on custom records, and customrecord_ for the custom record types themselves. The prefix tells you the field is yours. It tells you nothing about what it means.

A dictionary captures both the internal id and the label, because your team asks for "credit tier" and the query needs custentity_credit_tier. It also records the unglamorous facts: which custom fields are populated, which are leftovers from a project that ended, and which two fields hold overlapping versions of the same concept. Custom fields also behave differently in reporting depending on type and configuration — see reporting on NetSuite custom fields.

Join paths, not just foreign keys

Knowing that two tables can be joined is not the same as knowing how they should be. A transaction joins to its lines one-to-many, so any sum of a header amount across a line-level join is inflated. Some records connect through an intermediate table. Some connections are valid in one direction only. Some look valid and are semantically wrong — joining a payment to an invoice through the customer rather than the applied-to link gives you a number that is arithmetically fine and meaningless. A dictionary records which paths are real, their cardinality, and the grain each produces. That is the layer that stops the most common category of silently wrong total.

Observed value domains, not documented ones

This is the layer that separates a dictionary from a schema list. Documentation tells you a status field exists and lists the values the software supports. It cannot tell you which values your account contains, what your team renamed them to, or which are so rare they signal a data problem. So you ask the data.

-- Read the status domain instead of assuming it
SELECT status, COUNT(*) AS row_count
FROM transaction
WHERE type = 'SalesOrd'
GROUP BY status
ORDER BY row_count DESC
Run once per status-bearing record type. The output is the only authoritative list of what "open" can mean in your account.

The same pattern gives you populated-field rates, currency mixes, subsidiary distribution and the date range each table covers. None of it comes from a manual. If you are collecting these probes into something your team can read, run them through the SuiteQL formatter first — a dictionary nobody can read is not documentation.

Row counts, and why they earn their place

Row counts look like trivia and do three jobs. They flag dead tables, so a question is not routed to a custom record with 4 rows in it. They set expectations about cost, since a query over 48,112 transactions and one over 6.2 million transaction lines are different operations against a paged API. And they give you the best sanity check available: a filter returning 0 of 48,112 rows is almost always a wrong filter, not a real zero.

Why vendor documentation is not a data dictionary

NetSuite publishes a records browser describing the standard schema, and your customisations are listed under the customisation menus. Both are useful and neither is a dictionary, for the same reason a dictionary of English is not a transcript of your meeting. The standard schema is shared by every account. The meaning is local.

  • Renamed lists. A status called "Pending Review" matches nothing in any documentation, because you named it.
  • Unused standard fields. Hundreds of documented fields are empty in your account. A system treating them as available builds a query on top of nothing.
  • Convention in free text. A memo field where everyone types PO#12345 is load-bearing structure that no schema records.
  • Archaeology. Custom fields from a migration that ended three years ago still exist, still look authoritative, and return values for old records only.
  • Duplicate concepts. Two ship-date fields, one from the original build and one from the integration, agreeing most of the time. Choosing between them is a business decision.

How a per-account dictionary is built

Whether a tool does this or a person does, the sequence is the same.

  1. 1.Connect with a least-privilege, read-only role. The dictionary should describe what that role can see, not what an administrator could — otherwise it promises answers the connection cannot deliver.
  2. 2.Enumerate structure and count rows. Every record type and field — internal id, label, type, custom flag — plus one row count per table, which separates the live account from the theoretical one.
  3. 3.Sample the domains. Group-by on every status, type and list field. Record values and frequencies, not just the distinct list.
  4. 4.Establish join paths. Confirm which joins are real and what grain each produces. Cardinality is what prevents inflated sums.
  5. 5.Capture semantics with humans. Metric definitions, synonyms, which of two duplicate fields is authoritative, which subsidiaries belong in a consolidated figure. This step cannot be automated, and it decides whether answers match the numbers finance already publishes.
  6. 6.Version it. Date it, store it, and diff it against the next build so you can see what changed and when.

Keeping it fresh

A dictionary is accurate until your next customisation, which may be this afternoon. Five drift sources matter, and every one of them is invisible until something answers wrongly.

Change in your accountWhat it breaksHow a dictionary should handle it
New custom field addedQuestions about the new concept get refused, or answered from an older overlapping field.Scheduled metadata refresh, plus an on-demand rescan an admin can trigger.
Status value renamedFilters silently match nothing. Totals come back understated with no error.Re-sample domains on refresh and flag values that appeared or disappeared.
New subsidiary"Company-wide" numbers quietly exclude it.Version the structure, and state the subsidiary set used in every answer.
Role permissions tightenedAnswers become partial without saying so.Record access scope, and refuse rather than under-report.
Definitions changed by financeAnswers stay technically correct and stop matching the reported pack.Keep the semantic layer human-editable, with a date and an owner per definition.
Five drift sources. Every one of them produces an answer that looks fine.

Two properties matter more than refresh frequency: a stated staleness window, and a feedback loop so a confirmed answer improves the dictionary rather than being forgotten. Ask any vendor for both. "It learns automatically" is not a mechanism.

Free calculator
Reporting time savings calculator

Quantify the hours your team currently spends rediscovering which fields to use — the cost of not having a dictionary.

What a dictionary changes about the answers

The difference shows up on ordinary questions, not exotic ones.

QuestionWithout a dictionaryWith a per-account dictionary
"How much AR is overdue?"A plausible query against invented column names, or credit memos treated as positive balances.The real balance-remaining field, your due-date field, credit memos per your convention, subsidiaries stated.
"Show me open sales orders."One of six meanings of "open", picked silently and not disclosed.The observed status domain, so the system can ask which of your actual statuses you mean.
"Revenue by credit tier."The concept appears in no documentation, so it is ignored or approximated.custentity_credit_tier is a first-class field with its real list values.
The dictionary is what turns a plausible answer into a checkable one.

The semantic layer earns its keep here too. "What's our DSO?" has more than one defensible answer depending on the variant you report and whether cash sales are excluded — the DSO calculator settles the arithmetic independently of your ERP, and the AR aging calculator does the same for overdue balances.

Build a lightweight one even if you never buy AI

Most of the value here is not about AI. Four spreadsheets will shorten every onboarding and settle most reporting arguments — and they make an AI layer more accurate later, because semantics are the part software cannot derive:

  • Field register. Every custom field: id, label, meaning, owner, whether it is still in use.
  • Status glossary. Every status value in every list your business uses, in your words.
  • Metric definitions. One page per reported number: formula, fields, exclusions, owner, date agreed.
  • Join map. The five or six joins your reporting depends on, with cardinality marked.

Limits of a data dictionary

A dictionary describes your data. It does not improve it. If two integrations write conflicting ship dates, it can record that both exist and which you trust — it cannot make them agree. It cannot infer intent, so an ambiguous question stays ambiguous and the right behaviour is to ask. It cannot see past the connected role's permissions, so a dictionary built on a narrow role describes a narrow account. And its semantic layer is only as current as the last person who maintained it.

This is why the dictionary is a component rather than the product. It is the first of the four properties of grounded ERP AI — the others are validating each query against the real schema before it runs, showing the query with the answer, and refusing outside what is known. Take away one and you are back to plausible answers nobody can check.

builds this dictionary of your account during onboarding — record types with row counts, every standard and custom field, your subsidiaries, the real join paths, and status domains read from your data rather than assumed — and you can watch it being built. Queries are generated from it, validated against your schema before they run, and shown as SuiteQL under every answer. What we cannot invent is the semantic layer: if your team has three definitions of revenue, we will ask which you mean.

Frequently asked questions

What is a data dictionary?

A data dictionary is a structured inventory of the data in a system: which records exist, which fields each one has, what those fields mean, what values they legitimately contain, and how records relate. In ERP it is account-specific, because your custom fields, renamed status values and reporting definitions are yours and appear in no vendor documentation.

What is the difference between a data dictionary and a database schema?

A schema describes structure: tables, columns, types, keys. A dictionary adds meaning and observation — the human label for each field, which fields are actually populated, which status values actually occur in your data, how many rows each table holds, and your definitions of business terms. The schema is the same for every account; the dictionary is not.

Does NetSuite have a data dictionary?

NetSuite publishes a records browser documenting the standard schema, and your customisations are listed under the customisation menus. That covers structure. What no vendor can supply is the account-specific layer: which fields you actually use, what your renamed status values mean, which of two similar fields is authoritative, and how your team defines revenue.

How is a per-account data dictionary built?

Connect with a read-only least-privilege role, enumerate every record type and field from metadata, count rows per table, sample the distinct values in every status and list field, confirm the real join paths and their cardinality, then capture business definitions with the people who own them. Version and date the result so you can diff it later.

How often does a data dictionary need refreshing?

It is accurate until the next customisation, so treat it as continuously drifting. What matters is a scheduled metadata refresh, an on-demand rescan your admin can trigger after adding fields, and a stated staleness window so you know how old the map can be. Renamed status values are the most common silent break.

Why can't AI just read my ERP schema directly?

A schema tells it which columns exist, not what they mean or what they contain. Without observed status domains it filters on values your account does not use and returns zero rows with no error. Without row counts it cannot sanity-check a result. Without your definitions it answers a well-formed version of a different question.

Your ERP already knows. Start asking.

ERPray computes answers like these live from your own ERP account and shows the exact query behind every number. Early access is open for NetSuite teams — free plan at launch.