> ## Documentation Index
> Fetch the complete documentation index at: https://docs.railnet.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Configure fees & revenue

> Set fee structures and revenue distribution for your Conduit

export const FeeLayers = () => {
  const CSS = `
    .fl-bg{fill:#F8F8F8;rx:4;ry:4}.dark .fl-bg{fill:#141414}
    .fl-t{fill:#374151;font-family:"Inter Tight","Inter",system-ui,sans-serif}.dark .fl-t{fill:#D1D5DB}
    .fl-tm{fill:#6B7280;font-family:"Inter Tight","Inter",system-ui,sans-serif}.dark .fl-tm{fill:#9CA3AF}
    .fl-h{fill:#111827;font-family:"Inter Tight","Inter",system-ui,sans-serif}.dark .fl-h{fill:#E5E7EB}
    .fl-c{fill:#FFE4D2;rx:3;ry:3}.dark .fl-c{fill:#3D2510}
    .fl-s{fill:#D4E8E0;rx:3;ry:3}.dark .fl-s{fill:#1E3A2F}
    .fl-ln{stroke:#ACACAC;fill:none;stroke-width:1.5;color:#ACACAC}.dark .fl-ln{stroke:#666;color:#666}
    .fl-dash{stroke:#ACACAC;fill:none;stroke-width:1;stroke-dasharray:3 2}.dark .fl-dash{stroke:#666}
    .fl-ann{fill:#9CA3AF;font-family:"Inter Tight","Inter",system-ui,sans-serif;font-style:italic}.dark .fl-ann{fill:#6B7280}
  `;
  return <div className="not-prose w-full my-6 overflow-x-auto" style={{
    padding: '2px'
  }}>
      <style>{CSS}</style>
      <svg viewBox="0 -15 600 260" style={{
    width: '100%',
    height: 'auto',
    maxWidth: '620px',
    display: 'block'
  }} role="img" aria-label="Fee layer stacking: Conduit fees on top of Strategy fees">
        <defs>
          <marker id="fl-a" viewBox="0 0 10 7" refX="9" refY="3.5" markerWidth="8" markerHeight="6" orient="auto">
            <polygon points="0 0,10 3.5,0 7" fill="currentColor" />
          </marker>
        </defs>
        <rect x="0" y="-15" width="600" height="260" className="fl-bg" />

        <text x="190" y="22" textAnchor="middle" className="fl-h" fontSize="13" fontWeight="600">User deposits 10,000 USDC</text>
        <line x1="190" y1="30" x2="190" y2="48" className="fl-ln" markerEnd="url(#fl-a)" />

        <rect x="30" y="54" width="320" height="68" className="fl-c" />
        <text x="50" y="76" className="fl-t" fontSize="12" fontWeight="600">Conduit</text>
        <text x="50" y="94" className="fl-tm" fontSize="11">FeeManager: 0.5% management fee</text>
        <text x="50" y="110" className="fl-tm" fontSize="11">Recipients: Platform treasury</text>
        <line x1="350" y1="88" x2="378" y2="88" className="fl-dash" />
        <text x="384" y="84" className="fl-ann" fontSize="10.5">Your platform's</text>
        <text x="384" y="97" className="fl-ann" fontSize="10.5">distribution fee</text>

        <line x1="190" y1="122" x2="190" y2="144" className="fl-ln" markerEnd="url(#fl-a)" />

        <rect x="30" y="150" width="320" height="68" className="fl-s" />
        <text x="50" y="172" className="fl-t" fontSize="12" fontWeight="600">Strategy (MultiVehicle)</text>
        <text x="50" y="190" className="fl-tm" fontSize="11">FeeManager: 2% mgmt + 15% perf</text>
        <text x="50" y="206" className="fl-tm" fontSize="11">Recipients: Platform + AM</text>
        <line x1="350" y1="184" x2="378" y2="184" className="fl-dash" />
        <text x="384" y="180" className="fl-ann" fontSize="10.5">Strategy-level fee</text>
        <text x="384" y="193" className="fl-ann" fontSize="10.5">(platform + AM split)</text>
      </svg>
    </div>;
};

Your Conduit can have its own Fee Manager to charge distribution-layer fees — independent of any fees configured on the underlying Strategy. This guide covers how to design your fee model, deploy a Fee Manager for your Conduit, and configure recipient splits.

<Note>
  For the full fee calculation reference (formulas, preview functions, view functions), see [Fee Manager reference](/developers/contracts/fee-manager).
</Note>

## Fee types

| Fee type            | Typical use                                                  | When applied                         |
| ------------------- | ------------------------------------------------------------ | ------------------------------------ |
| **Management fee**  | Platform distribution revenue — annualized, prorated by time | Before new deposits (`onOperations`) |
| **Performance fee** | Optional platform share of yield — earned on new gains       | Before new deposits (`onOperations`) |
| **Deposit fee**     | Optional — deducted from deposit amounts                     | During `unlock` (STEAM state)        |
| **Redeem fee**      | Optional — deducted from redemption amounts                  | During `unlock` (STEAM state)        |

All fees are in **basis points** (bps), where 10,000 bps = 100%.

## Understanding fee layers

Railnet supports fees at two independent levels. Each level has its own Fee Manager contract with its own rates, caps, and recipients.

<FeeLayers />

* **Strategy-level fees** handle revenue distribution for the strategy operator. If you followed [Use a Strategy](/conduits/use-a-strategy), you already configured these during deployment.
* **Conduit fees** (this page) are your platform's additional distribution-layer fees. They are applied on top of the Strategy's fees.

Users experience the combined effect of both fee layers in the Conduit's share price.

<Tip>
  Consider the total fee load when designing your Conduit-level fees. If the underlying Strategy already charges a 2% management fee, adding another 2% at the Conduit level may be uncompetitive.
</Tip>

## Design your fee model

A typical Conduit fee structure is lighter than the Strategy's, since the asset manager is already compensated at the Strategy level:

| Fee             | Rate              | Recipient | Purpose                                              |
| --------------- | ----------------- | --------- | ---------------------------------------------------- |
| Management fee  | 0–0.5% annualized | Platform  | Distribution revenue, covers platform infrastructure |
| Performance fee | 0%                | —         | Typically zero (AM compensated at Strategy level)    |
| Deposit fee     | 0%                | —         | Usually zero for growth                              |
| Redeem fee      | 0–0.25%           | Platform  | Optional exit friction                               |

<Info>
  **No fees at all?** Pass `address(0)` as the Fee Manager when deploying your Conduit. You can still earn revenue from the Strategy-level Fee Manager configured during [Use a Strategy](/conduits/use-a-strategy).
</Info>

### Common configurations

<Tabs>
  <Tab title="Zero-fee distribution">
    No Conduit-level fees — rely entirely on Strategy-level fee distribution.

    Pass `address(0)` as the Fee Manager during [Conduit deployment](/conduits/quick-start).
  </Tab>

  <Tab title="Platform margin">
    Small management fee for distribution revenue.

    <CodeGroup>
      ```solidity Solidity theme={null}
      FeeManager.Fees({
          performanceFeeBps: 0,
          managementFeeBps: 50,   // 0.5% annual
          depositFeeBps: 0,
          redeemFeeBps: 0
      })
      ```

      ```typescript TypeScript theme={null}
      // Coming soon
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Full-featured">
    Management fee plus a small exit fee.

    <CodeGroup>
      ```solidity Solidity theme={null}
      FeeManager.Fees({
          performanceFeeBps: 0,
          managementFeeBps: 50,   // 0.5% annual
          depositFeeBps: 0,
          redeemFeeBps: 25        // 0.25% exit fee
      })
      ```

      ```typescript TypeScript theme={null}
      // Coming soon
      ```
    </CodeGroup>
  </Tab>
</Tabs>

## Deploy the Fee Manager

Deploy a Fee Manager for your Conduit. This is separate from any Fee Manager attached to the underlying Strategy.

<CodeGroup>
  ```solidity Solidity theme={null}
  // All Conduit-level fees go to the platform
  FeeManager.FeeRecipient[] memory recipients = new FeeManager.FeeRecipient[](1);

  recipients[0] = FeeManager.FeeRecipient({
      target: platformTreasury,
      shareBps: 10000  // 100% to platform
  });

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

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

  ```typescript TypeScript theme={null}
  // Coming soon
  ```
</CodeGroup>

<Warning>
  `initialMaxFees` are immutable caps. You can lower fees later but never exceed these maximums. Set them thoughtfully — leave room for future adjustments.
</Warning>

## Update fees

You can adjust fee rates at any time (within the max caps).

**Requires:** `FEE_MANAGER_SET_FEES` role scoped to the Fee Manager.

<CodeGroup>
  ```solidity Solidity theme={null}
  FeeManager.Fees memory newFees = FeeManager.Fees({
      performanceFeeBps: 0,
      managementFeeBps: 25,   // Reduce management fee to 0.25%
      depositFeeBps: 0,
      redeemFeeBps: 0
  });

  feeManager.setFees(newFees);
  ```

  ```typescript TypeScript theme={null}
  // Coming soon
  ```
</CodeGroup>

## Update recipients

Change how collected fees are split. Distribute pending fees first to avoid loss.

**Requires:** `FEE_MANAGER_SET_FEE_RECIPIENTS` role scoped to the Fee Manager.

<CodeGroup>
  ```solidity Solidity theme={null}
  // IMPORTANT: Distribute pending fees before changing recipients
  feeManager.dispatchERC20(IERC20(usdc));

  // Update the split: add a DAO treasury
  FeeManager.FeeRecipient[] memory newRecipients = new FeeManager.FeeRecipient[](2);

  newRecipients[0] = FeeManager.FeeRecipient({
      target: platformTreasury,
      shareBps: 8000  // 80% to platform
  });
  newRecipients[1] = FeeManager.FeeRecipient({
      target: daoTreasury,
      shareBps: 2000  // 20% to DAO
  });

  feeManager.setFeeRecipients(newRecipients);
  ```

  ```typescript TypeScript theme={null}
  // Coming soon
  ```
</CodeGroup>

<Warning>
  Changing recipients causes old recipients to lose access to uncollected fees. Always call `dispatchERC20` first.
</Warning>

## Fee collection workflow

Fees accumulate as Conduit shares held by the Fee Manager. To convert them into the underlying asset and distribute:

<Steps>
  <Step title="Redeem Conduit shares">
    Convert accumulated fee shares into the underlying asset.

    **Requires:** `FEE_MANAGER_REDEEM_VEHICLE_SHARES` role.

    <CodeGroup>
      ```solidity Solidity theme={null}
      feeManager.redeemVehicleShares(address(conduit));
      ```

      ```typescript TypeScript theme={null}
      // Coming soon
      ```
    </CodeGroup>
  </Step>

  <Step title="Distribute to recipients">
    Send the redeemed assets to each recipient according to their share.

    **Requires:** `FEE_MANAGER_DISPATCH_ERC20` role.

    <CodeGroup>
      ```solidity Solidity theme={null}
      feeManager.dispatchERC20(IERC20(usdc));
      ```

      ```typescript TypeScript theme={null}
      // Coming soon
      ```
    </CodeGroup>
  </Step>
</Steps>

## Role setup for fee management

As the Conduit owner, you retain fee configuration roles on your Conduit's Fee Manager. If you also own the Strategy's Fee Manager, you manage those roles separately.

| Role                                | Grant to           | Purpose                   |
| ----------------------------------- | ------------------ | ------------------------- |
| `FEE_MANAGER_SET_FEES`              | Platform admin     | Change fee rates          |
| `FEE_MANAGER_SET_FEE_RECIPIENTS`    | Platform admin     | Change recipient splits   |
| `FEE_MANAGER_DISPATCH_ERC20`        | Operator or keeper | Distribute collected fees |
| `FEE_MANAGER_REDEEM_VEHICLE_SHARES` | Operator or keeper | Redeem fee shares         |

See [Roles and permissions](/developers/contracts/roles) for the complete role setup guide.

## Next steps

<CardGroup cols={2}>
  <Card title="Deposits & withdrawals" icon="arrow-right-arrow-left" href="/conduits/deposits-and-withdrawals">
    Process deposits and withdrawals through your Conduit.
  </Card>

  <Card title="Fee reference" icon="calculator" href="/developers/contracts/fee-manager">
    Full fee calculation formulas, preview functions, and view functions.
  </Card>
</CardGroup>
