Company settings

The company record, its feature toggles, base currency, logos, and tags — the company-wide configuration every module reads from.

Everything in Carbon is scoped to a company. Your login can belong to several companies, and each one carries its own address, base currency, logos, feature toggles, and numbering. Two records hold this configuration: the company row (identity, address, currency, logos) and a paired companySettings row (one-to-one, keyed on the same id) that holds the company-wide feature flags and defaults. This page is the map of what lives where.

Settings live under Settings in the app, grouped into Company, Modules, and System (apps/erp/app/modules/settings/ui/useSettingsSubmodules.tsx). Every route is employee-only; a few are gated further — Billing needs company ownership and a Cloud environment, and Companies and Backups are internal-only.

The company record

The company table is the tenant's identity. Its fields come from the companyValidator (apps/erp/app/modules/settings/settings.models.ts:81) and are edited under Settings → Company.

FieldType
Company name.
The registered address. addressLine1, city, postalCode, and countryCode are required.
The currency every posted amount is expressed in. See base currency below.
Contact details.
Tax registration identifiers printed on documents.
Storage paths to the company's logos. See logos.
Set when this company is a subsidiary of another. See multiple companies.
Marks a consolidation-only company used to eliminate intercompany pairs.
Groups related companies for the company switcher.
Which modules this company turned on during onboarding.
The industry chosen at onboarding — collected on the industry step, not the general company form.
Whether change history is recorded. See audit logs.
Who is notified when the AI suggestion engine surfaces something.

The service reads it with getCompany(client, companyId), which rewrites each stored logo path to a public URL before returning (settings.service.ts:230).

Multiple companies

company membership is per-user, so one login can hold several companies and switch between them. getCompanies(client, userId) returns every company a user can enter (settings.service.ts:139); the ERP is an employee app, so supplier- and customer-only memberships are filtered out by getEmployeeCompanies (settings.service.ts:183). Switching happens through the company picker, and each company you enter carries its own settings, currency, and numbering — nothing crosses the boundary.

Companies can also nest. A company with a parentCompanyId is a subsidiary (subsidiaryValidator, settings.models.ts:279); an isEliminationEntity company exists only to net intercompany transactions out of consolidated reports.

NOTE

Companies and Backups are internal-only

The Companies management screen and Backups are gated to internal operators (internalOnlyRoutes in useSettingsSubmodules.tsx). Most tenants create and switch companies through onboarding and the company picker, not this screen.

For consolidated reporting and the elimination flow, see intercompany accounting.

Feature toggles and defaults

companySettings is a single row per company (one-to-one with company, keyed on the same id). It holds the company-wide switches and defaults that individual modules read at runtime. Read it with getCompanySettings(client, companyId) (settings.service.ts:283). Each group of fields is edited on its own Settings → Modules page and saved through a small dedicated validator.

The flags below are the real column names from the companySettings row (packages/database/src/types.ts:6653).

FieldType
Master switch for the ledger. When off, operations complete without posting journal entries. This is the gate the accounting flow checks before it posts anything.
Turns on shop-floor time cards. Edited via timeCardSettingsValidator.
Enables the support/impersonation console. Edited via consoleSettingsValidator.
Whether material units default to metric. Edited via materialUnitsValidator.
Whether new materials get an auto-generated readable id. Edited via materialIdsValidator.
The release-control policy for item revisions.
What a Kanban card prints: label, qrcode, or url.
Default label sizes for product and shelf labels.
Whether receiving recalculates supplier lead times.
When purchase prices refresh: Purchase Invoice Post or Purchase Order Finalize.
Whether preventive-maintenance work is generated ahead of time, and by how many days (1–90).
The default inspection sampling standard.
Requires a second person to sign off inspections.
The quality issue target used in reporting.
Whether a separate tax-depreciation schedule is tracked for fixed assets, and its rate.
Whether customer/supplier readable ids are surfaced in the UI.
A single blob holding every shelf-life knob (near-expiry warning days, default shelf life, calculated-input scope, expired-entity policy). See shelf life.
Whether customers get a digital quote, and whether it includes purchase orders.
Per-category default markups (material, part, tool, labor, machine, overhead, outside…) applied to quote lines.

Several fields on the same row are notification groups — arrays of who to notify for a given event (digitalQuoteNotificationGroup, rfqReadyNotificationGroup, supplierQuoteNotificationGroup, inventoryJobCompletedNotificationGroup, salesJobCompletedNotificationGroup, the maintenance/quality/operations/other *DispatchNotificationGroups, and gaugeCalibrationExpiredNotificationGroup). Two AP/AR email addresses (accountsPayableEmail, accountsReceivableEmail) and default CC lists (defaultSupplierCc, defaultCustomerCc) live here too. For how these fan out to people, see notifications.

HEADS UP

Accounting is a company-wide toggle, not per-document

accountingEnabled gates the entire ledger. If it is off, jobs, shipments, and invoices still complete, but nothing posts to the general ledger — there are no partial or per-transaction exceptions. Turning it on mid-stream doesn't backfill past activity.

Base currency

Every company has one baseCurrencyCode, set on the company row and required by companyValidator (settings.models.ts:77). It is the currency that all posted amounts are stored and reported in. Transactions in other currencies are converted to base at their exchange rate before they post, so the ledger stays single-currency.

Base currency is chosen at onboarding and is not something you flip casually — it's the denomination of your whole history. A subsidiary can carry a different base currency from its parent; consolidation is where those meet.

Theme

Carbon ships eight themes, each supplying a full set of HSL CSS variables (packages/utils/src/themes.ts): Modern (zinc), Brutal (neutral), Cherry (red), Apricot (orange), Lemon (yellow), Mint (green), Blueberry (blue), and Lavender (violet). The set is validated by themeValidator (settings.models.ts:306).

NOTE

Theme is per-person, not per-company

Theme selection is stored in a cookie for the current user and browser, not on the company record — the action just sets a cookie via setTheme (apps/erp/app/routes/x+/account+/theme.tsx). Two people in the same company can each run a different theme. Document templates have their own, separate theme setting.

Logos

The company row holds up to five logo slots: logoLight, logoDark, logoLightIcon, logoDarkIcon, and logoWatermark, edited under Settings → Logos. They are stored as storage paths; getCompany and getCompanies rewrite them to public URLs on read (settings.service.ts:230, settings.service.ts:139). The light/dark pairs cover light and dark UI backgrounds; the icon variants are the compact mark; the watermark prints behind documents.

Tags

Tags are free-form labels scoped to a company and a table, stored in the tag table. They're loaded per table with getTagsList(client, companyId, table) and created with insertTag (apps/erp/app/modules/shared/shared.service.ts:929, :987). Because every tag carries both companyId and a table, the same label can mean different things on items versus jobs, and tag vocabularies never leak across companies.

A few more company-wide lookups live under Settings → System and have their own reference pages:

Which company-wide features are available at all also depends on your plan and edition — see licensing.