Skip to main content

Ledger Service

Purpose

Authoritative source of financial truth. All monetary movements recorded as immutable double-entry transactions.

Responsibilities

  • Double-entry transaction posting
  • Debit/credit entry creation
  • Balance calculation
  • Transaction immutability
  • Reversal via compensating entries

Non-Responsibilities

  • Payment orchestration (Payment Service)
  • Account lifecycle (Account Service)
  • Fraud decisions

APIs

MethodEndpointAuthDescription
POST/api/v1/ledger/transactionsSERVICEPost transaction
GET/api/v1/ledger/transactions/{id}BearerGet transaction
GET/api/v1/ledger/accounts/{id}/entriesBearerAccount entries
POST/api/v1/ledger/transactions/{id}/reverseSERVICEReverse transaction

Database

TableKey ColumnsDescription
ledger_transactionsid, reference, currency, posted_at, statusTransaction headers
ledger_entriesid, transaction_id, account_id, type, amountDebit/credit lines
account_balancesaccount_id, available, pending, currencyComputed balances

Kafka

Produces: LedgerTransactionCreated, LedgerEntryCreated Consumes: None (receives via API) Partition key: account_id

Dependencies

Sync: Called by Payment Service Async: Publishes ledger events

Failure Handling

  • Unbalanced entry → reject (debits ≠ credits)
  • Duplicate reference → idempotent return
  • DB failure → no partial writes (single TX)

Scaling

Write-heavy. Partition by account_id. Optimistic locking on balances.

Security

SERVICE role only for writes. CUSTOMER read own entries.

Observability

Metrics: ledger_processing_latency, ledger_posting_total. Critical path monitoring.