Helm Portfolio for Dummies
Syllabus Next →
Module 05 of 10

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.

30 minutes Completed Module 4

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.

Transaction
type, guid, date, amount
CashFlow #1
Investor A — $50,000
CashFlow #2
Investor B — $30,000
CashFlow #3
Investor C — $20,000
One transaction creates multiple cash flows (one per affected investor)

Key distinctions:

Critical distinction: TransactionType vs CashFlowType

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.

Showing all 17 transaction types

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.

CashFlowTypes DRAWDOWN UNITS_ASSIGNED FULLY_PAID_UP
Sub-types Determined by the asset's configuration:
  • 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)
Side effects Creates investor-asset link, dispatches SubscriptionAdded event
Deletion guard Cannot delete if capital calls or distributions depend on it

The fund draws committed capital from investors. Creates one cash flow per investor, allocated based on their commitment percentage.

CashFlowType CAPITAL_CALL
Allocation amount = commitment x percentage / 100
Statuses Paid, Outstanding, Partial — tracked per investor cash flow
Side effects Dispatches 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.

CashFlowType CAPITAL_REPAYMENT
Modes Percentage-based (% of commitment) or value-based (fixed amount)

A direct stake in an asset. Simpler than subscription — no commitment/drawdown lifecycle. Creates a cash flow and issues shares in a single step.

CashFlowType INVESTMENT
Key difference No commitment tracking, no capital call lifecycle. Cash flow + share issuance happen together.

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.

CashFlowType FUND_INVESTMENT
Key behavior Links two assets in the hierarchy — the investing fund and the target company/sub-fund

Returns capital to specific investors by surrendering units. The total amount is split into return-of-capital vs capital-gain via DistributionComponents.

CashFlowType REDEMPTION
Scope Investor-level — targets specific investors
Components Return of capital + capital gain (split via DistributionComponents)
Tax impact May trigger capital gains tax withholding
Side effects Dispatches DistributionCreated, surrenders units, recalculates NAV

Income distribution to specific investors. Unlike redemption, no units are surrendered — investors keep their position.

CashFlowType DIVIDEND
Scope Investor-level — targets specific investors

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).

CashFlowType OTHER_INCOME
Scope Investor-level — targets specific investors

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.

CashFlowTypes FUND_REDEMPTION FUND_DIVIDEND FUND_OTHER_INCOME
Scope Fund-level — from fund cash, not targeting individual investors
Key difference Investor-level distributions (types 6-8) target specific investors. Fund distributions operate at the fund level from accumulated cash.

Covers all 13 fee sub-types. Fees are pro-rated across investors by their committed capital ratio.

CashFlowType FEE SUBSCRIPTION_FEE
13 sub-types ONE_OFF_FEE ONGOING_FEE MANAGEMENT_FEE ADMIN_FEE PERFORMANCE_FEE SUBSCRIPTION_FEE TRANSACTION_FEE TAX CAPITAL_GAIN_TAX DIVIDEND_TAX OTHER_TAX EQUALISATION_FEE TRANSFEREE_FEE TRANSFEROR_FEE
Allocation Pro-rated across investors by committed capital ratio
Side effects Dispatches FeeCreated event

Cash coming into the fund. Records external inflows that increase the fund's cash position.

CashFlowType FUND_CASH_CREDIT
Direction Inflow — increases fund cash balance

Cash going out of the fund. Records external outflows that decrease the fund's cash position.

CashFlowType FUND_CASH_DEBIT
Direction Outflow — decreases fund cash balance

Inter-account transfer between cash pots within the same fund. No money enters or leaves the fund — it moves between internal accounts.

CashFlowType FUND_CASH_MOVEMENT
Direction Internal transfer — net zero impact on total fund cash

Transfers an asset position between investors. Moves commitment amount and percentage from the transferor to the transferee. Both sides get cash flow records.

CashFlowTypes TRANSFER_OUT TRANSFER_IN SUBSCRIPTION_TRANSFER_IN SUBSCRIPTION_TRANSFER_OUT FUND_TRANSFER_IN FUND_TRANSFER_OUT UNPAID_CAPITAL_TRANSFER
What moves Commitment amount, commitment percentage, and associated unit holdings

Records the disposal (sale, liquidation, write-off) of an asset. Finalizes the position and records any proceeds.

CashFlowType DISTRIBUTION

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.

CashFlowType Varies by context
Counting note

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:

LevelTransactionTypeCashFlowTypeWhat 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 vs Fund-level

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:

CashFlowTypeCreated By TransactionTypeMeaning
DRAWDOWNSUBSCRIPTIONLP commits to a drawdown-style fund
UNITS_ASSIGNEDSUBSCRIPTIONLP receives units immediately at subscription
FULLY_PAID_UPSUBSCRIPTIONLP pays in full at subscription
CAPITAL_CALLCAPITAL_CALLCapital drawn from committed investors
CAPITAL_REPAYMENTCAPITAL_REPAYMENTCapital returned to investors
INVESTMENTINVESTMENTDirect investment in an asset
FUND_INVESTMENTFUND_INVESTMENTFund investing into a sub-asset
CashFlowTypeCreated By TransactionTypeMeaning
DISTRIBUTIONDISTRIBUTION / DISPOSALGeneral distribution or disposal proceeds
REDEMPTIONREDEMPTIONCapital return by surrendering units
DIVIDENDDIVIDENDIncome distribution to investors
OTHER_INCOMEINCOME (OTHER)Non-dividend, non-redemption income
FUND_REDEMPTIONFUND_DISTRIBUTIONFund-level capital return
FUND_DIVIDENDFUND_DISTRIBUTIONFund-level income distribution
FUND_OTHER_INCOMEFUND_DISTRIBUTIONFund-level other income
FEEFEEStandard fee charged to investors
SUBSCRIPTION_FEEFEEFee charged at subscription time
CashFlowTypeCreated By TransactionTypeMeaning
TRANSFER_OUTTRANSFERUnits leaving the transferor
TRANSFER_INTRANSFERUnits arriving at the transferee
SUBSCRIPTION_TRANSFER_INTRANSFERSubscription record transferred in
SUBSCRIPTION_TRANSFER_OUTTRANSFERSubscription record transferred out
FUND_TRANSFER_INTRANSFERFund-level position transferred in
FUND_TRANSFER_OUTTRANSFERFund-level position transferred out
UNPAID_CAPITAL_TRANSFERTRANSFERUncalled commitment transferred between investors
CashFlowTypeCreated By TransactionTypeMeaning
FUND_CASH_MOVEMENTFUND_CASH_MOVEMENTInternal transfer between cash pots
FUND_CASH_CREDITFUND_CASH_CREDITCash inflow to fund
FUND_CASH_DEBITFUND_CASH_DEBITCash 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:

1. Action
Creates Transaction + CashFlow(s)
2. Events Dispatched
CashFlowCreated, SubscriptionAdded, etc.
3. Listeners Execute
UpdateInvestorAssetUnits, cache clear
4. If Units Changed
RunCalculatedValuations → NAV recalc
5. Cascade
AssetValuationUpdated → more cache clears

The event types dispatched depend on the transaction:

EventTriggered ByWhat Listeners Do
CashFlowCreatedMost transaction typesUpdate investor asset units, clear caches
SubscriptionAddedSUBSCRIPTIONCreate investor-asset link, initialize unit holding
DistributionCreatedDistributions, RedemptionsUpdate units (if redeemed), recalculate NAV
FeeCreatedFEERecord fee allocation, clear caches
AssetValuationUpdatedAfter NAV recalcClear additional caches up the asset hierarchy
The "returnEvent" pattern

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

The State Machine

Requested
Pending
Approved
Rejected
Reversible paths: Approved → Pending | Rejected → Requested

Key rules:

Gotchas and Edge Cases

A frequent source of confusion. Examples of mismatches:

  • TransactionType SUBSCRIPTION creates CashFlowType DRAWDOWN (not SUBSCRIPTION)
  • TransactionType DISTRIBUTION creates CashFlowType REDEMPTION, DIVIDEND, or OTHER_INCOME (not DISTRIBUTION)
  • TransactionType FEE creates CashFlowType FEE or SUBSCRIPTION_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

Question 1

An LP subscribes to a drawdown-style PE fund. What CashFlowType is created?

SUBSCRIPTION
CAPITAL_CALL
DRAWDOWN
INVESTMENT
Correct! A SUBSCRIPTION transaction to a drawdown-style fund creates a CashFlowType of DRAWDOWN. This is one of the key name mismatches in the taxonomy -- the TransactionType and CashFlowType don't share a name.
Not quite. A SUBSCRIPTION transaction to a drawdown-style fund creates a CashFlowType of 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.
Question 2

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?

1 cash flow of $1,000,000 linked to both investors
2 cash flows: $600,000 for Investor A and $400,000 for Investor B
2 cash flows of $500,000 each (split equally)
Correct! A capital call creates one CashFlow per investor, with amounts allocated by commitment percentage: $600,000 (60%) for Investor A and $400,000 (40%) for Investor B. The formula is: amount = commitment x percentage / 100.
Not quite. A capital call creates one CashFlow per investor, allocated by their commitment percentage. Investor A (60%) gets a $600,000 cash flow and Investor B (40%) gets a $400,000 cash flow. Cash flows are never shared between investors.
Question 3

An investor submits a redemption request through the portal. What happens immediately?

A REDEMPTION transaction is created and units are surrendered
A Requested-state request is created; no transaction or money moves until admin approval
The request goes directly to Pending state and awaits automatic processing
Correct! Investor-initiated requests enter the "Requested" state. No transaction is created and no money moves until an admin reviews, advances it to Pending, and then approves it. Only upon admin approval is the actual transaction created.
Not quite. When an investor submits a request, it enters the "Requested" state. No transaction is created and no money moves. The request must be reviewed by an admin and advanced through Requested → Pending → Approved before any actual transaction is created.

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.