Helm Portfolio for Dummies
Syllabus Next →
Module 04 of 10

Asset Structures

Every asset in Portfolio is either a Private Equity Fund or a Direct investment. This single enum value determines which transactions, metrics, and workflows are available. Get this wrong and everything downstream breaks.

25 minutes Completed Module 3

Why Structure Matters

When you create an asset in Portfolio, the very first decision is its structure. This is stored as the AssetStructure enum and it has exactly two values: PRIVATE_EQUITY_FUND and DIRECT. There is no third option, no hybrid, no "other."

This choice acts as a routing switch for the entire system. It determines:

This is not a soft preference

The structure determines which transaction types the system will accept. Attempting to create a Capital Call on a Direct asset, or an Investment on a PE Fund asset, will fail at the validation layer. The codebase enforces this rigidly through action classes and form requests.

The Two Structures: Side by Side

Private Equity Fund

Pooled Vehicle

Investors commit capital; the fund draws it down over time

  • Investors enter via Subscriptions (3 types)
  • Capital drawn via Capital Calls (%-based)
  • Returns via Distributions (investor + fund level)
  • Fund Cash management with cash pots
  • Capital Repayments return committed capital
  • NAV tracked via Valuations
Direct

Direct Stake

Investors invest directly and receive units immediately

  • Investors enter via Investments (simpler)
  • No capital call cycle
  • Returns via Distributions (investor level only)
  • No fund cash management
  • No commitment tracking
  • Value tracked via Valuations

Let's explore each structure in depth, then compare them feature by feature.

Private Equity Fund: The Full Lifecycle

A PE Fund models the traditional private equity lifecycle: raise commitments, call capital over time, deploy it, return profits. This is the more complex of the two structures, with more transaction types and more moving parts.

Step 1: Subscriptions (Investor Entry)

When an LP joins a PE Fund, they create a Subscription that records their commitment. But not all subscriptions work the same way. The subscription type is configured per-asset via AssetData with the key SUBSCRIPTION_TYPE, and it determines how capital flows from commitment to units.

Drawdown
Traditional PE fund subscription model

The LP commits capital but no units are assigned yet. The commitment sits as an obligation — actual cash transfers happen later when the fund issues capital calls.

On subscriptionCommitment recorded. No units. No cash moves.
On capital callA percentage of the commitment is called. LP pays. Units are assigned at this point.
Typical fund typeCLOSED — fixed fundraise period, then drawdowns
Units Assigned
Commitment with immediate unit allocation

The LP commits capital and units are assigned immediately at subscription time. An initial valuation is created automatically. Capital calls may still draw down the commitment later.

On subscriptionCommitment recorded AND units assigned. Initial valuation auto-created.
On capital callA percentage of the commitment is called. LP pays.
Key differenceInvestor appears on the cap table immediately, not after first drawdown.
Fully Paid Up
No drawdown cycle — pay everything upfront

The LP pays the full commitment upfront and gets units immediately. This extends the Units Assigned type — it inherits the automatic unit and valuation creation, but there's nothing left to call because the commitment is already fully paid.

On subscriptionFull payment, units assigned, valuation auto-created. Capital is 100% called.
Capital callsNot applicable — nothing left to draw down.
Typical fund typeOPEN_ENDED — accepts new subscriptions over time
Gotcha: Subscription type is per-asset, not per-investor

The subscription type is set once at the asset level in AssetData using the SUBSCRIPTION_TYPE key. All investors in that fund use the same subscription type. You cannot have one LP on Drawdown and another on Fully Paid Up within the same asset.

Step 2: Capital Calls (Drawing Down Commitments)

Once investors have subscribed with a Drawdown type, the fund issues Capital Calls to request a portion of their committed capital. Capital calls are percentage-based — the fund calls a percentage of each investor's commitment (e.g., "calling 25% of your $1M commitment = $250K").

Capital calls create cash flows, update the paid-in totals, and assign units to investors. They're a core part of what makes PE Funds complex — and they don't exist at all for Direct assets.

Step 3: Distributions (Returning Capital + Profits)

Distributions are how money flows back to investors. PE Funds support distributions at two levels:

Investor-Level Distributions

Paid directly to specific investors. Each investor gets their own cash flow record.

  • Redemption — investor exits, units redeemed
  • Dividend — income distribution, units retained
  • Other Income — catch-all for non-standard returns
Fund-Level Distributions

Applied to the fund as a whole, then allocated pro-rata across all investors based on their paid-in capital.

  • Fund Redemption — pro-rata across all LPs
  • Fund Dividend — pro-rata income split
  • Fund Other Income — pro-rata other returns

Step 4: Fund Cash & Capital Repayments

PE Funds have a Fund Cash entity (FundCash) that tracks the cash pool available for deployment. Fund cash can be organized into cash pots (FundCashPots) — separate pools for different purposes (e.g., deployment, expenses, reserves).

Capital Repayments return committed capital to investors, reducing their outstanding commitment. This is different from a distribution — a distribution returns profits or redeemed capital, while a capital repayment reduces the commitment itself.

Direct: The Simpler Path

A Direct asset represents a direct stake in a single investment. There's no commitment-and-drawdown cycle — investors simply invest and receive units.

Step 1: Investments (Investor Entry)

Instead of Subscriptions, Direct assets use Investments. An investment is simpler: the investor puts money in and gets units. There's no commitment tracking, no unfunded obligation, no capital call lifecycle.

Step 2: Distributions (Investor-Level Only)

Direct assets support the same three distribution types (Redemption, Dividend, Other Income) but only at the investor level. There are no fund-level distributions because there's no concept of a pooled vehicle to distribute from pro-rata.

Step 3: Valuations

Both structures track value over time via Valuations, but the metrics differ significantly. Direct assets focus on investment return metrics rather than fund performance metrics.

Interactive Comparison

Use the tabs below to compare the two structures across different dimensions.

Transaction TypePE FundDirect
Subscription
Investment
Capital Call
Capital Repayment
Investor Distribution
Fund Distribution
Fund Cash
Valuation
AspectPE Fund (Subscription)Direct (Investment)
Entry mechanismSubscription (3 types)Investment (1 type)
Commitment trackingYes — committed, called, uncalledNo — just the investment amount
Unit assignment timingDepends on subscription type (immediate or on first capital call)Immediate on investment
Capital call cycleYes — fund calls % of commitment over timeNo — full amount invested upfront
Unfunded obligationYes — uncalled capital is a real liability for LPsNo concept of uncalled capital
Subscription typesDrawdown, Units Assigned, Fully Paid UpN/A
AspectPE FundDirect
Distribution typesRedemption, Dividend, Other IncomeRedemption, Dividend, Other Income
Investor-level Yes Yes
Fund-level Yes — pro-rata allocation based on paid-in No
Fund-level allocation basisPro-rata by paid-in capital (uses PaidInPerInvestor calc)N/A
Capital repayment Yes — reduces commitment No
PE Fund MetricsDirect Metrics
Committed CapitalInvestment
Called CapitalValuation
Uncalled CapitalIncome
Paid-In CapitalYield
DPI (Distributions to Paid-In)Return on Capital
TVPI (Total Value to Paid-In)Multiple
RVPI (Residual Value to Paid-In)Profit
XIRR (Internal Rate of Return) 
NAV 
Different calc endpoints

PE Fund metrics are computed by FundsOverview, FundsOverviewPerAsset, and FundsOverviewPerInvestor in the Go calc service. Direct metrics use DirectOverview, DirectOverviewPerAsset, and DirectOverviewPerInvestor. The AggregatesOverview endpoint combines both when a portfolio has mixed structures.

Fund Type: Open vs Closed

PE Fund assets have an additional configuration: the fund type. This is stored in the AssetData EAV table (not as a direct column on the assets table) and has two values:

Closed Fund

Fixed fundraise period. Once closed, no new subscriptions are accepted. Capital is drawn down over the fund's life via capital calls.

Typical subscription type: DRAWDOWN

Open-Ended Fund

Accepts new subscriptions on an ongoing basis. Investors can typically subscribe and redeem at regular intervals (monthly, quarterly).

Typical subscription type: FULLY_PAID_UP

Gotcha: Fund type is EAV, not a column

Fund type is stored in the AssetData entity-attribute-value table, not as a direct column on the assets table. This means you won't find it with a simple SELECT * FROM assets — you need to join or query AssetData with the appropriate key. The same is true for SUBSCRIPTION_TYPE.

Knowledge Check 1

Question 1

A client wants to set up a traditional PE buyout fund where LPs commit capital and the GP draws it down over 5 years. Which configuration is correct?

Structure: DIRECT, with Investments
Structure: PRIVATE_EQUITY_FUND, Subscription Type: DRAWDOWN, Fund Type: CLOSED
Structure: PRIVATE_EQUITY_FUND, Subscription Type: FULLY_PAID_UP, Fund Type: OPEN_ENDED
Structure: PRIVATE_EQUITY_FUND, Subscription Type: UNITS_ASSIGNED, Fund Type: CLOSED
Correct! A traditional PE buyout fund uses PRIVATE_EQUITY_FUND structure with DRAWDOWN subscriptions (LPs commit but don't pay upfront) and CLOSED fund type (fixed fundraise, then drawdowns over the fund life). This is the standard configuration for traditional PE.
Not quite. A traditional PE buyout fund needs: PRIVATE_EQUITY_FUND structure (it's a pooled vehicle), DRAWDOWN subscription type (LPs commit capital that gets drawn down via capital calls over time), and CLOSED fund type (fixed fundraise period). DIRECT is for direct stakes, FULLY_PAID_UP means pay upfront (no drawdown cycle), and OPEN_ENDED means ongoing subscriptions.

Asset Hierarchy

Assets in Portfolio aren't always flat — they can be organized into hierarchies. There are two mechanisms for this:

1. Parent-Child Relationship

The assets table has a self-referencing foreign key (parent_asset_id) for simple parent-child relationships. A parent asset can have multiple child assets.

2. Sub-Positions (Many-to-Many)

For more complex structures, assets use the asset_sub_positions pivot table — a many-to-many relationship that allows an asset to appear as a sub-position under multiple parents. Each sub-position has a type:

CLASS_TYPE

Represents share classes within a fund. Example: a PE fund with Class A (lower fees, higher minimum) and Class B (higher fees, lower minimum) shares.

UNDERLYING_INVESTMENT_TYPE

Represents underlying investments held by the fund. Example: a PE fund that owns stakes in Company A, Company B, and Company C.

Visual: Asset Hierarchy Example

PE Fund (Parent)
AssetStructure: PRIVATE_EQUITY_FUND
Sub-positions via pivot table
CLASS_TYPE
Class A Shares
Class B Shares
UNDERLYING_INVESTMENT_TYPE
Company A
Company B
Company C

Sub-Position Toggles

When an asset has sub-positions, the SubPositionToggle enum controls which behaviors are enabled. These toggles determine how transactions, valuations, and visibility work across the hierarchy.

INVESTOR_SUBSCRIPTION_DISTRIBUTION
When ON, subscriptions and distributions happen at the sub-position level (e.g., investors subscribe to Class A specifically, not the parent fund)
MANUAL_VALUATION (tri-state)
Controls NAV entry: TRUE = NAV is entered manually. FALSE = NAV is calculated upward from child asset valuations. This is a tri-state toggle (on / off / inherit).
SHOW_FUND_ACTIVITY_TO_INVESTORS
When ON, investors can see fund-level activity (capital calls, distributions) in their portal view
INVESTOR_FUND_INVESTMENT_ASSIGNMENT
When ON, investors can be assigned to specific underlying investments. Inherited from parent asset for some configurations.
Manual vs Calculated Valuations

The MANUAL_VALUATION toggle is the key to understanding how NAV flows through the hierarchy. When set to false, the parent asset's NAV is calculated by summing the valuations of its children. When set to true, someone manually enters the NAV for that node. This matters enormously for multi-class funds where each share class may have its own valuation methodology.

Asset Classes

Every asset has an AssetClass that categorizes the type of investment. This is independent of the asset structure — both PE Funds and Direct assets can be any asset class.

Asset ClassDescription
CASHCash and cash equivalents
DEBTDebt instruments (bonds, loans, credit facilities)
EQUITYEquity holdings (stock, ownership stakes)
HYBRIDHybrid instruments combining debt and equity characteristics
MULTI_ASSETDiversified across multiple asset classes
REAL_ASSETSPhysical assets (infrastructure, natural resources)
REAL_ESTATEProperty and real estate investments
COLLECTIBLE / COLLECTIBLESArt, wine, cars, and other collectible assets
MEZZANINE_FINANCESubordinated debt, typically with equity conversion features
CONVERTIBLE_LOANLoans that can convert to equity under specified conditions

Asset classes drive the allocation charts in the dashboard (allocation by geography, sector, vintage, style) and help categorize the portfolio for reporting purposes. They don't affect transaction availability — that's purely determined by the asset structure.

Putting It All Together

Here's the complete decision tree when setting up a new asset:

  1. Choose the structure: Is this a pooled fund (PE Fund) or a direct stake (Direct)?
  2. If PE Fund — choose the subscription type: Drawdown (commit now, pay later), Units Assigned (commit and get units immediately), or Fully Paid Up (pay everything upfront)?
  3. If PE Fund — choose the fund type: Closed (fixed fundraise) or Open-Ended (ongoing subscriptions)?
  4. Choose the asset class: Equity, Debt, Real Estate, etc. — categorization for reporting.
  5. Set up hierarchy (if needed): Does this asset have share classes (CLASS_TYPE) or underlying investments (UNDERLYING_INVESTMENT_TYPE)? Configure sub-position toggles.
  6. Configure valuation method: Manual NAV entry or calculated from children?
Gotcha: You can't change structure after transactions exist

Once an asset has transactions recorded against it, changing the structure from PE Fund to Direct (or vice versa) would invalidate existing data. The subscription/investment records, capital calls, and metrics would all be inconsistent. Get the structure right at setup time.

Knowledge Check 2

Question 2

A PE Fund has MANUAL_VALUATION set to FALSE on the parent asset, with two share class sub-positions (Class A and Class B). How is the parent fund's NAV determined?

An administrator manually enters the NAV for the parent fund
The NAV is calculated upward by summing the valuations of Class A and Class B
The Go calc service computes NAV from the fund's cash flows directly
The parent fund doesn't have its own NAV — only the sub-positions do
Correct! When MANUAL_VALUATION is FALSE, the parent asset's NAV is calculated upward from its children. The valuations of Class A and Class B are summed to produce the parent fund's NAV. This is the "calculated valuation" path — the alternative (MANUAL_VALUATION = TRUE) would require someone to enter the parent NAV directly.
Not quite. The MANUAL_VALUATION toggle controls this behavior directly. When set to FALSE, the parent asset's NAV is calculated by summing the valuations of its child assets (in this case, Class A + Class B). When set to TRUE, an admin would enter the NAV manually. The calc service uses this hierarchy when computing CalculatedValuationPerAsset.

What's Next

You now understand the two fundamental asset structures and how they determine everything downstream — transaction availability, investor entry, distribution mechanics, and metrics. Next, we'll dive into the full transaction taxonomy — all 17+ transaction types, how they create cash flows, and the dependency chain between them.