Chart of Accounts
The chart of accounts defines the account structure used to classify every financial transaction in the General Ledger. Rather than a flat list of account numbers, Raytio uses a multi-segment model where each segment draws its allowed values from a value set, and the segments are assembled into a structure that defines the full account string.
Value sets
A Value Set is a named collection of allowed values for a single segment of the chart of accounts. Value sets are independent of any particular structure — the same value set can be reused across multiple structures if the same set of codes applies.
| Attribute | Purpose |
|---|---|
| Value set code | Unique identifier within the tenant (e.g. VS_DEPT, VS_ACCT) |
| Name | Human-readable name with i18n support |
| Description | Optional longer description |
| Validation type | How values are validated (e.g. TABLE for table-based validation) |
| Value data type | Data type of values (e.g. VARCHAR, NUMBER) |
| Maximum length | Maximum character length for values |
| Status | Active/inactive lifecycle state |
Value set values
Each value set contains one or more values — the individual codes that can be used in that segment position:
| Attribute | Purpose |
|---|---|
| Value | The code itself (e.g. 1100, 200, 01) |
| Name | Human-readable description with i18n support |
| Description | Optional longer explanation |
| Enabled flag | Whether the value is available for new transactions |
| Start/end dates | Optional validity period |
| Summary flag | Whether this is a summary (parent) value for roll-up reporting |
| Budgeting allowed | Whether the value can be used in budget entries |
| Posting allowed | Whether the value can be used in actual postings |
Values can be disabled without deletion, allowing existing transactions to retain their references while preventing new usage.
Chart-of-accounts structures
A COA Structure defines the blueprint for account strings within a ledger. It specifies which segments make up the account, their order, and the character used to separate them in the display string.
| Attribute | Purpose |
|---|---|
| Structure code | Unique identifier within the tenant (e.g. ACME_COA) |
| Name | Human-readable name with i18n support |
| Segment separator | Character used between segments (typically - or .) |
| Description | Optional longer description |
| Cross-validation flag | Whether cross-segment validation rules are enforced |
| Dynamic insertion flag | Whether new code combinations are created automatically (see below) |
| Freeze flag | Whether the structure is frozen (no further segment changes) |
| Status | Active/inactive lifecycle state |
Segments
Each structure contains one or more Segments, ordered by display sequence. A segment links to a value set and defines the rules for that position in the account string:
| Attribute | Purpose |
|---|---|
| Segment code | Identifier within the structure (e.g. COMPANY, ACCOUNT, DEPT) |
| Name | Human-readable label with i18n support |
| Value set | The value set this segment draws from |
| Display sequence | Position in the account string (1, 2, 3, …) |
| Display size | Rendering width for the segment in the UI |
| Required flag | Whether a value must be provided for this segment |
| Natural account flag | Identifies the segment that holds the natural account number |
| Balancing segment flag | Identifies the segment used for automatic balancing |
A typical three-segment structure might look like:
| Seq | Segment | Value Set | Example Values |
|---|---|---|---|
| 1 | Company | VS_COMPANY | 01, 02 |
| 2 | Account | VS_ACCT | 1100, 2000, 5010 |
| 3 | Department | VS_DEPT | 100, 200, 300 |
With a - separator, account strings appear as 01-1100-100.
Code combinations
A Code Combination is a fully qualified, validated account string. Each combination records the individual segment values alongside the concatenated display string:
| Attribute | Purpose |
|---|---|
| Concatenated segments | The full account string (e.g. 01-1100-100) |
| Segment 1–N values | Individual segment values stored in separate columns |
| Enabled flag | Whether the combination is available for new transactions |
| Start/end dates | Optional validity period |
| Summary flag | Whether this is a summary combination for roll-up reporting |
| Budgeting allowed | Whether the combination can be used in budget entries |
| Description | Optional description |
Validation
Before a code combination can be used, it must pass validation:
- Segment values — each segment value must exist and be enabled in its value set
- Required segments — all required segments must have a value
- Cross-validation — if the structure has cross-validation enabled, the combination must satisfy any cross-validation rules (future phase)
- Date validity — the combination and its segment values must be valid for the transaction date
The platform provides validation functions that check these rules and return a clear pass/fail result with error details.
Dynamic insertion
When a structure has dynamic insertion enabled, new code combinations are created automatically the first time a valid but previously unrecorded combination is used in a journal entry. This avoids the need to pre-create every possible combination manually.
Dynamic insertion still validates all segment values against their value sets — it only skips the requirement that the combination already exists in the code-combinations table. If any segment value is invalid, the entry is rejected regardless of the dynamic insertion setting.
When dynamic insertion is disabled, only pre-created and enabled code combinations can be used.
How it fits together
Further reading
- Ledgers — how ledgers reference a chart-of-accounts structure
- Data Model Overview — the full FGL entity landscape
- GL Setup Walkthrough — step-by-step guide to creating value sets, structures, and combinations