Create an ExternalAccount in Modern Treasury for the omnibus FBO bank account held at the sponsor bank; this is the physical account where all funds actually land
Create VirtualAccounts under the FBO ExternalAccount, one per sub-tenant or customer; each VirtualAccount gets a unique routing number and account number (provided by Modern Treasury or the sponsor bank) that sub-tenants give to their payers
Configure a routing rule or ledger account association so that when an inbound ACH or wire arrives at a VirtualAccount number, Modern Treasury automatically creates a LedgerTransaction crediting that sub-tenant's ledger account
Create a Ledger with LedgerAccounts for each sub-tenant (e.g., 'customer:{id}:available'); verify that the sum of all sub-tenant ledger balances always equals the physical FBO account balance as your invariant
For payouts, create a PaymentOrder specifying originating_account_id (the FBO ExternalAccount) and debit the sub-tenant's ledger account atomically with the payment order creation to prevent double-spend
Set up a reconciliation job that periodically pulls actual bank balances from Modern Treasury and compares them to the sum of all ledger account balances, alerting on any discrepancy
Known gotchas
VirtualAccount routing numbers are real routing numbers issued by the sponsor bank — losing track of which numbers are assigned to which customers will cause irrecoverable reconciliation failures; treat the VirtualAccount-to-customer mapping as critical data
Modern Treasury's ledger is not the source of truth for the physical money — the bank account is; if a ledger transaction is created without a corresponding physical movement (or vice versa), your FBO math breaks
Not all bank partners support the virtual account number issuance feature; verify with your Modern Treasury implementation team which partner banks support unique inbound routing per virtual account before designing your sub-tenant structure
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp