Transaction Taxonomy
Master the 17 transaction types and 23+ cash flow types that drive every financial operation in Portfolio. Understand how they relate, when each is used, and the event chains they trigger.
The Core Relationship: Transaction and CashFlow
Before diving into the 17 types, you need to understand the fundamental relationship. In Portfolio, a Transaction is a container that groups related CashFlows. Think of it as a header record with one or more line items beneath it.
Key distinctions:
- The Transaction has a
type(from theTransactionTypeenum) and aguidfor unique identification - Each CashFlow has its own
type(from theCashFlowTypeenum) carrying the actual financial data - A single transaction can produce cash flows of different CashFlowTypes depending on the context
These are different enums with different values. A SUBSCRIPTION transaction creates a DRAWDOWN cash flow. A DISTRIBUTION transaction can create REDEMPTION, DIVIDEND, or OTHER_INCOME cash flows. Never assume the names match.
Interactive Transaction Type Explorer
All 17 transaction types, organized by category. Click any type to see its details, cash flow types, and behavior.
An LP joins a fund. This is the entry point for investor participation — it creates the link between an investor and an asset, establishing their commitment.
- Drawdown — LP commits capital to be called later (CashFlowType:
DRAWDOWN) - Units Assigned — LP receives units immediately (CashFlowType:
UNITS_ASSIGNED) - Fully Paid Up — LP pays in full at subscription (CashFlowType:
FULLY_PAID_UP)
SubscriptionAdded event
The fund draws committed capital from investors. Creates one cash flow per investor, allocated based on their commitment percentage.
amount = commitment x percentage / 100
CashFlowCreated, updates unit holdings via UpdateInvestorAssetUnits
Returns committed capital to investors. This is the reverse of a capital call — the fund is giving back money that was previously drawn.
A direct stake in an asset. Simpler than subscription — no commitment/drawdown lifecycle. Creates a cash flow and issues shares in a single step.
A fund invests into a sub-asset (e.g., a PE fund deploying capital into a portfolio company). Issues shares from the source asset to the target asset.
Returns capital to specific investors by surrendering units. The total amount is split into return-of-capital vs capital-gain via DistributionComponents.
DistributionCreated, surrenders units, recalculates NAV
Income distribution to specific investors. Unlike redemption, no units are surrendered — investors keep their position.
Non-dividend, non-redemption income paid to specific investors. Catch-all for income types that don't fit the other categories (e.g., interest income, royalties).
Fund-level distribution — operates from fund cash rather than targeting specific investors. A single transaction type with three distinct cash flow types for different distribution purposes.
Covers all 13 fee sub-types. Fees are pro-rated across investors by their committed capital ratio.
FeeCreated event
Cash coming into the fund. Records external inflows that increase the fund's cash position.
Cash going out of the fund. Records external outflows that decrease the fund's cash position.
Inter-account transfer between cash pots within the same fund. No money enters or leaves the fund — it moves between internal accounts.
Transfers an asset position between investors. Moves commitment amount and percentage from the transferor to the transferee. Both sides get cash flow records.
Records the disposal (sale, liquidation, write-off) of an asset. Finalizes the position and records any proceeds.
Catch-all transaction type for operations that don't fit any other category. Used sparingly for edge cases that the standard taxonomy doesn't cover.
You may have counted 16 rows above, not 17. That's because the DISTRIBUTION enum value (type 4 in the enum) covers investor-level distributions — REDEMPTION, DIVIDEND, and INCOME (OTHER) all share that underlying enum value but are presented as distinct transaction types in the UI based on the CashFlowType they create. The 17th type is FUND_DISTRIBUTION which similarly covers fund-level redemption, dividend, and other income.
The Distribution Taxonomy
Distributions are the most nuanced category, with a clean split between investor-level and fund-level variants:
| Level | TransactionType | CashFlowType | What It Does |
|---|---|---|---|
| Investor | REDEMPTION | REDEMPTION |
Returns capital by surrendering units, splits return-of-capital vs capital-gain |
| DIVIDEND | DIVIDEND |
Income distribution, no unit surrender | |
| INCOME (OTHER) | OTHER_INCOME |
Non-dividend, non-redemption income | |
| Fund | FUND_DISTRIBUTION | FUND_REDEMPTION |
Fund-level capital return from fund cash |
FUND_DIVIDEND |
Fund-level income distribution from fund cash | ||
FUND_OTHER_INCOME |
Fund-level non-dividend income from fund cash |
Investor-level distributions target specific investors — you choose which LPs receive money. Fund-level distributions come from fund cash and are not allocated to specific investors. This matters for pro-rata calculations and reporting.
The Complete CashFlowType Enum
While TransactionTypes describe what happened, CashFlowTypes describe how the money moved. Here are all 23+ values grouped by their parent transaction type:
| CashFlowType | Created By TransactionType | Meaning |
|---|---|---|
DRAWDOWN | SUBSCRIPTION | LP commits to a drawdown-style fund |
UNITS_ASSIGNED | SUBSCRIPTION | LP receives units immediately at subscription |
FULLY_PAID_UP | SUBSCRIPTION | LP pays in full at subscription |
CAPITAL_CALL | CAPITAL_CALL | Capital drawn from committed investors |
CAPITAL_REPAYMENT | CAPITAL_REPAYMENT | Capital returned to investors |
INVESTMENT | INVESTMENT | Direct investment in an asset |
FUND_INVESTMENT | FUND_INVESTMENT | Fund investing into a sub-asset |
| CashFlowType | Created By TransactionType | Meaning |
|---|---|---|
DISTRIBUTION | DISTRIBUTION / DISPOSAL | General distribution or disposal proceeds |
REDEMPTION | REDEMPTION | Capital return by surrendering units |
DIVIDEND | DIVIDEND | Income distribution to investors |
OTHER_INCOME | INCOME (OTHER) | Non-dividend, non-redemption income |
FUND_REDEMPTION | FUND_DISTRIBUTION | Fund-level capital return |
FUND_DIVIDEND | FUND_DISTRIBUTION | Fund-level income distribution |
FUND_OTHER_INCOME | FUND_DISTRIBUTION | Fund-level other income |
FEE | FEE | Standard fee charged to investors |
SUBSCRIPTION_FEE | FEE | Fee charged at subscription time |
| CashFlowType | Created By TransactionType | Meaning |
|---|---|---|
TRANSFER_OUT | TRANSFER | Units leaving the transferor |
TRANSFER_IN | TRANSFER | Units arriving at the transferee |
SUBSCRIPTION_TRANSFER_IN | TRANSFER | Subscription record transferred in |
SUBSCRIPTION_TRANSFER_OUT | TRANSFER | Subscription record transferred out |
FUND_TRANSFER_IN | TRANSFER | Fund-level position transferred in |
FUND_TRANSFER_OUT | TRANSFER | Fund-level position transferred out |
UNPAID_CAPITAL_TRANSFER | TRANSFER | Uncalled commitment transferred between investors |
| CashFlowType | Created By TransactionType | Meaning |
|---|---|---|
FUND_CASH_MOVEMENT | FUND_CASH_MOVEMENT | Internal transfer between cash pots |
FUND_CASH_CREDIT | FUND_CASH_CREDIT | Cash inflow to fund |
FUND_CASH_DEBIT | FUND_CASH_DEBIT | Cash outflow from fund |
The Event Chain
Creating a transaction is not just "insert a row." It triggers a cascade of events that update unit holdings, recalculate valuations, and clear caches. Here's the full chain:
The event types dispatched depend on the transaction:
| Event | Triggered By | What Listeners Do |
|---|---|---|
CashFlowCreated | Most transaction types | Update investor asset units, clear caches |
SubscriptionAdded | SUBSCRIPTION | Create investor-asset link, initialize unit holding |
DistributionCreated | Distributions, Redemptions | Update units (if redeemed), recalculate NAV |
FeeCreated | FEE | Record fee allocation, clear caches |
AssetValuationUpdated | After NAV recalc | Clear additional caches up the asset hierarchy |
Some Actions can defer event dispatch by returning a closure instead of immediately dispatching. This is used during bulk import — you don't want to trigger NAV recalculations after every single row. Instead, all events are collected and dispatched in batch at the end of the import.
Requested Transactions (Investor-Initiated)
Not all transactions come from admins. Investors can request certain transaction types through the portal, which then go through an approval workflow before any actual transaction is created.
Requestable Types
- REDEMPTION — Investor requests to redeem their units
- ASSET_TRANSFER — Investor requests to transfer their position to another investor
- ASSET_TRANSFER_PIT — Point-in-time asset transfer (transfer with a specific valuation date)
The State Machine
Key rules:
- Investors can only create requests — actual transactions are created by admins upon approval
- The state machine allows reversals: an approved request can be sent back to pending, a rejected request can be re-opened
- No money moves until the request reaches Approved and an admin creates the actual transaction
Gotchas and Edge Cases
A frequent source of confusion. Examples of mismatches:
- TransactionType
SUBSCRIPTIONcreates CashFlowTypeDRAWDOWN(not SUBSCRIPTION) - TransactionType
DISTRIBUTIONcreates CashFlowTypeREDEMPTION,DIVIDEND, orOTHER_INCOME(not DISTRIBUTION) - TransactionType
FEEcreates CashFlowTypeFEEorSUBSCRIPTION_FEE(these do match, partially)
Always check which CashFlowType a given TransactionType actually produces.
Subscriptions cannot be deleted if capital calls or distributions depend on them. This prevents orphaned cash flows that reference a non-existent subscription.
The system checks for downstream dependencies before allowing any deletion. If you need to remove a subscription, you must first reverse or delete all dependent transactions.
During XLSX bulk import, dispatching events after every single row would trigger hundreds of NAV recalculations. Instead, Actions can defer event dispatch by returning a closure.
The import pipeline collects all these closures and dispatches them in batch at the end. This means intermediate states during import are not fully consistent — NAV and unit calculations only become accurate after the final batch dispatch.
Unlike investor-level distributions (which have distinct TransactionTypes for REDEMPTION, DIVIDEND, and INCOME), fund-level distributions all share the single FUND_DISTRIBUTION TransactionType.
The distinction between fund redemption, fund dividend, and fund other income happens entirely at the CashFlowType level (FUND_REDEMPTION, FUND_DIVIDEND, FUND_OTHER_INCOME).
Knowledge Check
An LP subscribes to a drawdown-style PE fund. What CashFlowType is created?
DRAWDOWN, not SUBSCRIPTION. This is one of the most common points of confusion. The CashFlowType for subscriptions depends on the asset configuration: DRAWDOWN, UNITS_ASSIGNED, or FULLY_PAID_UP.A fund manager creates a capital call for $1,000,000. Investor A has 60% commitment, Investor B has 40%. How many CashFlow records are created and what are their amounts?
An investor submits a redemption request through the portal. What happens immediately?
What's Next
You now understand every transaction type in Portfolio's taxonomy and how they map to cash flow types. You know the event chain that fires after each transaction and the approval workflow for investor-initiated requests. Next, we'll explore data ingress — the three ways data enters Portfolio (UI, Machine API, XLSX import) and the validation pipeline each one passes through.