The line between what a bank configures and what only a developer changes is drawn on purpose, and it sits far towards configuration.
| Configuration: a settings row, versioned, per tenant | Code: the engine |
|---|---|
| Account types: positions, transaction types, schedules, input amounts | How a position is posted and accrued |
| Rate cards, banded by period and amount; day-count conventions | Interest arithmetic and rounding |
| Calendars and business-day conventions | Date arithmetic |
| Posting groups and posting rules per operating entity | Double entry and period close |
| Workflow steps and which operations need four eyes | The authorisation mechanism |
| Permissions per role | Deny by default |
| Counterparty, relationship, role and collateral types | The aggregate model |
| Capabilities switched on per tenant | The capabilities themselves |
| Numbering schemes, statement layouts, submission formats | Rendering and transport |
# One account type, excerpted from the retail lending template.
- accountType:
name: PersonalLoan
label: Personal Loan
productFamily: Loans
nature: Asset
collectionMethod: DirectDebit
positionTypes:
- name: Balance
- name: Accrued
- name: Arrears
- name: Provision
transactionTypes:
- name: Advance
isPostable: true
paymentInstruction: DirectCredit
positionRules:
- operation: Debit
positionTypeName: Balance
- name: InterestAccrued
costOfCreditCategory: Interest
positionRules:
- operation: Debit
positionTypeName: Accrued
scheduleTypes:
- name: Accrual
frequency: Daily
businessDayConvention: None
startDateExpression: StartDate
endDateExpression: EndDate
- name: Anniversary
frequency: Monthly
businessDayConvention: ModifiedFollowing
startDateExpression: FirstPaymentDate
endDateExpression: EndDate
scheduledTransactions:
- name: DailyAccrual
scheduleName: Accrual
timing: EndOfDay
generatedTransactionType: InterestAccrued
amountExpression: (Balance + Arrears) * rate(interestRate, valueDate) / daysInYear(valueDate)
conditionExpression: (Balance + Arrears) > 0
- name: AnniversaryServiceFee
scheduleName: Anniversary
timing: StartOfDay
generatedTransactionType: ServiceFeeCharged
amountExpression: price('service-fee', valueDate)
instalmentType:
name: Instalment
scheduleName: Anniversary
transactionType: InstalmentDue
solveForZeroPosition: Balance
solveForDate: EndDate
rateChangePolicy: ReSolve
openingTransactions:
- type: InitiationFeeCharged
amount: initiationFee
optional: true
- type: Advance
isAdvance: true
amount: loanAmountAn account type is a document, not a program.
This is a personal loan from the retail lending template, shortened. Its positions, the transactions that move them, the schedules they run on, the expressions that price them and the instalment solver are all here. A product manager reads it. The engine runs it. A new product is a new document.
The full type carries the capture screens, the balance views, the statutory cost-of-credit categories and the operations a clerk may perform. Same file, same shape.
Describe a new account type in plain English.
The designer reads the configuration model, drafts the account type, builds the capture screens in a sandbox and projects transactions across the account's whole life. When the numbers are right, it goes live at runtime. No code. Where else AI works in the product →

A capability you can switch on is a capability you can price. A product you can configure is a product a partner can sell into a market we have never seen. And a settings row is something an auditor can read.
What this means for you: onboarding a product is a configuration exercise on a sandbox tenant, with the forecaster as the test.