# Configure fees & revenue \[Set fee structures and revenue distribution for your Conduit]

Your Conduit has its own Fee Manager, independent of what the yield source charges. Formulas, preview functions and the full API are in the [Fee Manager reference](/developers/contracts/fee-manager).

## Fee types

| Fee type | Typical use | When applied |
|----------|-------------|--------------|
| **Management fee** | Your main revenue line, annualized and prorated by time | Before each new query (`onOperations`) |
| **Performance fee** | Share of gains above the high water mark | Before each new query (`onOperations`) |
| **Deposit fee** | Deducted from deposit amounts | During `unlock` |
| **Redeem fee** | Deducted from redemption amounts | During `unlock` |

All rates are in basis points: 10,000 bps = 100%.

## Fee layers

On a single Vehicle the Conduit Fee Manager is your entire margin: no asset manager to compensate, and the Vehicle carries either no Fee Manager or a Railnet protocol-level one. Users pay your Conduit fee plus whatever the external protocol charges inside its own contracts, already reflected in the Vehicle's share price. Typical: 0.5–2% management, 0–20% performance, 0–0.25% redeem.

On a [MultiVehicle](/strategies/allocation/create) there are two independent Fee Managers, each with its own rates, caps and recipients. The MultiVehicle's fees pay whoever operates the allocation, usually with a split back to you; your Conduit fees sit on top and are normally lighter. Users see the combined effect in the share price.

<FeeLayers />

## Deploy the Fee Manager

Requires `FACTORY_SPAWN` on the Fee Manager factory. `initialMaxFees` are immutable caps you can never exceed later: performance and management allow up to 10,000 bps, deposit and redeem up to 9,999.

```solidity [Solidity]
FeeManager.FeeRecipient[] memory recipients = new FeeManager.FeeRecipient[](1);
recipients[0] = FeeManager.FeeRecipient({ target: platformTreasury, shareBps: 10000 });

FeeManagerFactory.SpawnParams memory params = FeeManagerFactory.SpawnParams({
    accessControl: externalAccessControl,
    initialFees: FeeManager.Fees({
        performanceFeeBps: 0,
        managementFeeBps: 50,      // 0.5% annual
        depositFeeBps: 0,
        redeemFeeBps: 0
    }),
    initialMaxFees: FeeManager.Fees({
        performanceFeeBps: 1000,   // 10% ceiling
        managementFeeBps: 200,     // 2% ceiling
        depositFeeBps: 100,
        redeemFeeBps: 100
    }),
    initialRecipients: recipients,
    deploymentSalt: keccak256("conduit-fee-manager-v1")
});

FeeManager conduitFeeManager = feeManagerFactory.spawn(params);
```

Pass `address(0)` as the Conduit's `feeManager` if you want no fees at all.

## Update fees

Requires `FEE_MANAGER_SET_FEES`. New rates must stay within the caps.

```solidity [Solidity]
feeManager.setFees(FeeManager.Fees({
    performanceFeeBps: 0,
    managementFeeBps: 25,   // down to 0.25%
    depositFeeBps: 0,
    redeemFeeBps: 0
}));
```

## Update recipients

Requires `FEE_MANAGER_SET_FEE_RECIPIENTS`. Dispatch pending fees first: old recipients lose anything uncollected. Targets must be sorted strictly ascending by address and shares must sum to 10,000 bps.

```solidity [Solidity]
feeManager.dispatchERC20(IERC20(usdc)); // pay out before changing the split

FeeManager.FeeRecipient[] memory newRecipients = new FeeManager.FeeRecipient[](2);
newRecipients[0] = FeeManager.FeeRecipient({ target: platformTreasury, shareBps: 8000 });
newRecipients[1] = FeeManager.FeeRecipient({ target: daoTreasury, shareBps: 2000 });

feeManager.setFeeRecipients(newRecipients);
```

## Pay the recipients

Management and performance fees accrue as Conduit shares minted to the Fee Manager, which never redeems them; you dispatch the share token like any ERC20 and each recipient redeems on its own schedule. Deposit and redeem fees arrive in the payout asset, so dispatch that too. Both calls require `FEE_MANAGER_DISPATCH_ERC20`, and the last recipient absorbs the rounding remainder.

```solidity [Solidity]
feeManager.dispatchERC20(IERC20(address(conduit))); // accrued share fees
feeManager.dispatchERC20(IERC20(usdc));             // deposit and redeem fees
```

Grant these roles through your EAC: see [Access control](/developers/contracts/access-control).

## Next steps

<Cards>
  <Card title="Fee Manager reference" description="Formulas, preview functions and the full contract surface." icon="calculator" to="/developers/contracts/fee-manager" />

  <Card title="Access control" description="Grant and scope the fee roles on your EAC." icon="lock" to="/developers/contracts/access-control" />
</Cards>
