Multi-entity / Holding

One system β€” multiple legal entities

For holding companies, franchise networks and business groups: manage all legal entities in a single deployment with full financial isolation, per-entity Chart of Accounts and consolidated reporting with intercompany elimination.

Data isolation per entity CoA per legal entity Consolidated P&L IC elimination One Docker image Π„Π”Π ΠŸΠžΠ£ per entity

Three company types

Each deployment supports any mix of standalone companies, holding parents and subsidiaries β€” all sharing one database, one Docker image and one access panel.

🏒 Standalone

A single legal entity with its own Π„Π”Π ΠŸΠžΠ£, accounting books, payroll and tax records. The default mode for SME clients.

πŸ›οΈ Holding (parent)

The root company of a group. Defines the Group Chart of Accounts, owns the consolidated reporting view and manages subsidiary access.

πŸ—οΈ Subsidiary

A child company owned by a holding. Has its own Π„Π”Π ΠŸΠžΠ£, its own CoA, independent financial statements and full accounting isolation from sibling entities.

Example: Arx Group
πŸ›οΈ
Arx Group
Π„Π”Π ΠŸΠžΠ£ 12345678 Β· Holding
🏒
Arx Retail LLC
Π„Π”Π ΠŸΠžΠ£ 23456789 Β· Subsidiary
CoA #1
🏭
Arx Manufacturing LLC
Π„Π”Π ΠŸΠžΠ£ 34567890 Β· Subsidiary
CoA #2
πŸ’»
Arx IT Services LLC
Π„Π”Π ΠŸΠžΠ£ 45678901 Β· Subsidiary
CoA #3
Active entity (sidebar switcher)
🏒 Arx Retail LLC β–Ύ
Arx Retail LLC β€” Chart of Accounts
1 Β· Assets
10 Β· Cash and bank accounts
1010 Β· Cash desk β†’ Group 1000
1011 Β· Current account UAH β†’ Group 1010
13 Β· Accounts receivable
1300 Β· Trade receivables β†’ Group 1300
4 Β· Revenue
70 Β· Sales revenue
702 Β· Revenue from goods β†’ Group 700

Chart of Accounts per legal entity

Each legal entity maintains its own Chart of Accounts adapted to its operational specifics β€” retail, manufacturing or services. Accounts are company-scoped: code 702 in Retail can differ from code 702 in Manufacturing.

  • Separate CoA per subsidiary β€” own account codes, names and hierarchy
  • Group CoA β€” parent mapping table that aligns entity accounts to group codes for consolidation
  • Clone CoA β€” copy the account structure from an existing entity and adjust locally
  • Group mapping editor β€” configure entity_account_code β†’ group_account_code links inline
  • Account-level uniqueness is scoped to company: two entities may use the same code independently

Group CoA mapping

Arx Retail  702  β†’ Group 700
Arx Mfg     701  β†’ Group 700
Arx IT      703  β†’ Group 700
All map to the same group revenue account for consolidated P&L.

Full financial isolation across 10 contexts

Every financial record β€” journal entry, invoice, order, tax invoice, payroll run β€” is tagged with company_id. A user logged into entity A never sees entity B data, even when both run on the same database.

πŸ“’

Accounting

Journal entries, accounts, periods, reconciliations, transactions β€” fully scoped per entity.

🧾

Invoicing & Orders

Invoices, payments, credit notes, installment plans, orders, quotes β€” per entity.

πŸ“‹

Contracts

Contracts with full lifecycle, delivery schedules and pricing conditions β€” isolated per entity.

πŸ‡ΊπŸ‡¦

Tax (UA)

Tax invoices (ПН/Π„Π ΠŸΠ) and VAT declarations per Π„Π”Π ΠŸΠžΠ£. Migration seeds existing ПН by matching seller_edrpou.

🏭

Inventory & WMS

Warehouses, stock, movements and lots are owned by a legal entity. Physical location is shared; stock ownership is not.

πŸ‘₯

HR & Payroll

Employee profiles are shared across the holding. Departments, positions and payroll runs are per legal entity β€” supporting split employment contracts.

βœ… Shared across the whole holding (no duplication)

πŸ—‚οΈ Product catalog & categories
🀝 Customers, suppliers, partners
πŸ‘€ Employee profiles
πŸ—οΈ Physical warehouses
🌍 Countries & currencies
πŸ“ Units of measure
πŸ‘” Users & roles
πŸ“š Document templates

Intercompany transactions

When entities within a holding buy from each other, transfer assets, lend money or pay dividends, these flows must be tracked explicitly for proper consolidation.

  • 6 transaction types: sale, purchase, asset transfer, loan, dividend, service
  • 3-stage lifecycle: open (one side recorded) β†’ matched (both sides confirmed) β†’ eliminated (excluded from consolidation)
  • Link to journal entries on both the from- and to-company sides
  • Mismatch detector β€” find open IC transactions that haven't been matched within the reporting period
  • Accessible via POST /api/v1/accounting/ic-transactions
IC Transaction β€” sale between entities
Arx Retail LLC
Seller
β†’
Arx Manufacturing
Buyer
Type
sale
Amount
250 000 β‚΄
Status
matched
βœ“ Will be eliminated in consolidated P&L β€” this IC revenue/cost pair nets to zero.
Consolidated P&L β€” Arx Group Q1 2026
Account
Retail
Mfg
IT
Total
Revenue
1 200
3 400
850
5 450
IC elimination
βˆ’250
βˆ’250
β€”
βˆ’500
Expenses
900
2 100
600
3 600
Net profit
50
1 050
250
1 350
Values in thousands UAH Β· IC elimination applied Β· API: GET /api/v1/holding/reports/consolidated/pnl

Consolidated financial reports

The holding view aggregates financial results across all subsidiaries and optionally eliminates intercompany flows for a true group picture.

Consolidated P&L

  • Sum of revenue, expenses and net profit per entity
  • Group account code mapping applied before aggregation
  • Optional IC elimination: matched intercompany revenue/cost pairs net to zero
  • Per-entity breakdown alongside consolidated total

Consolidated Balance Sheet

  • Balance sheet snapshot across all group entities
  • IC receivable/payable balances eliminated before presentation
  • Accessible via GET /api/v1/holding/reports/consolidated/pnl

Single Docker image for all clients

The same Docker image is deployed to every customer. The license key controls which modules are active. The database handles isolation via company_id columns β€” no per-customer builds, no schema per tenant.

🐳

One Docker image

All 31 bounded contexts compiled together. Simpler CI/CD, uniform upgrades, same binary everywhere.

πŸ”‘

License controls modules

The license key lists enabled modules. Unlicensed contexts return 402 Payment Required at runtime β€” no code change needed.

πŸ—„οΈ

company_id isolation

15 database migrations add company_id to all entity-scoped tables. Application-level filtering enforced by RequireCompanyContext middleware.

🐳
Docker image
axiom-backend:1.0.0
β†’
πŸ”‘
license.key
crm_warehouse
β†’
πŸ‘€
User session
active_company_id
β†’
πŸ›‘οΈ
Middleware
RequireCompanyContext
β†’
πŸ—„οΈ
Database
WHERE company_id = $N

Who is this for?

Any organization that operates through multiple registered legal entities and needs financial reports per entity plus a group view.

🌾

Agricultural holdings

МΠ₯П, Астарта, Нібулон-type structures: separate legal entities for growing, processing and distribution β€” consolidated group P&L eliminates intragroup crop transfers.

πŸ›’

Retail & marketplace networks

A platform operator (Rozetka-type) with 100s of FOP sellers: each FOP is an independent legal entity with own Π„Π”Π ΠŸΠžΠ£ and accounting, yet all managed in one system.

βš™οΈ

Industrial groups

Manufacturing holding with separate entities per production site, logistics subsidiary and sales company β€” intercompany goods flows automatically tracked and eliminated.

πŸ₯

Service company networks

Clinic chains, law firm branches, IT consulting groups β€” shared client base and catalogue, independent profit centres with per-entity P&L and payroll.

Related modules