Per-Cycle Payout Strategy Override
Overview
The per-cycle payout strategy override feature allows admins to set different payout strategies for individual users in specific cycles, overriding their opportunity-level default.
Use Cases
- Flexible Profit Management: Users can compound profits in one cycle and withdraw in another
- Conditional Strategies: Apply different strategies based on cycle performance
- Testing: Test different strategies without changing account defaults
- Special Arrangements: Custom profit handling for specific investors in specific cycles
Technical Implementation
Database Schema
Model: CycleInvestment
payoutStrategyId(optional): Foreign key to PayoutStrategy- When null: Uses opportunity default strategy
- When set: Overrides opportunity default for this cycle only
API Endpoint
PATCH /api/admin/users/{id}
Request body:
{
"action": "update_cycle_strategy",
"cycleInvestmentId": 123,
"payoutStrategyId": 456
}
Set payoutStrategyId to null to clear override and revert to opportunity default.
Validation Rules
- Cycle Status: Only works for unsettled cycles (draft, open, active, closed)
- Settled Cycles: Cannot modify strategy after cycle is settled (prevents post-distribution changes)
- Ownership: Cycle investment must belong to the specified user
- Strategy Ownership: Strategy must be either:
- System-wide (userId = null), OR
- Belong to the user
Frontend UI
Location: /admin/users/{id} → Investments tab
Features:
- Dropdown selector showing current strategy
- "Use Opportunity Default" option (clears override)
- Only visible for unsettled cycles
- Shows active override with green checkmark
- Immediate save on selection change
- Loading indicator during update
How It Works
Profit Distribution Flow
-
During Distribution (
distribute_cycle_profits()):- System checks
CycleInvestment.payoutStrategyId - If set: Uses cycle-specific strategy
- If null: Falls back to opportunity default strategy
- System checks
-
Strategy Evaluation:
- Compound: Profits →
capitalAvailable(auto-reinvest) - Payout: Profits →
profitAvailable(manual withdrawal) - Conditional: Evaluated based on profit percentage thresholds
- Compound: Profits →
Example Scenario
User: Maria (investor in Reprise Cycle #2)
Opportunity Default: Compound (auto-reinvest all profits)
Cycle #2 Override: Payout (withdraw profits)
Result:
- Cycle #2 profits go to
profitAvailable(can withdraw) - Future cycles without override will use Compound strategy
- Cycle #1 (already settled) cannot be changed
Setting a Per-Cycle Override
Via Admin UI
- Navigate to
/admin/users/{userId} - Click "Investments" tab
- Find the cycle investment
- Use "Cycle-Specific Strategy Override" dropdown
- Select desired strategy or "Use Opportunity Default"
- Changes save immediately
Via API
curl -X PATCH https://app.opportunitydao.com/api/admin/users/9 \
-H "Content-Type: application/json" \
-d '{
"action": "update_cycle_strategy",
"cycleInvestmentId": 42,
"payoutStrategyId": 7
}'
Best Practices
- Set Before Settlement: Always configure overrides before closing/settling cycles
- Communication: Inform users when setting non-standard strategies
- Documentation: Note in admin logs why specific overrides were applied
- Testing: Test with small amounts first to verify behavior
- Review: Check overrides before each distribution
Limitations
- Cannot Modify Settled Cycles: Once distributed, strategy is locked
- Admin Only: Users cannot set their own per-cycle overrides
- No Bulk Operations: Each cycle must be set individually
- No History: Previous overrides aren't tracked after cycle settlement
Troubleshooting
Override Not Applied
Symptom: Profits distributed using opportunity default instead of override
Causes:
- Override not saved before distribution
- Override cleared accidentally
- Database transaction rollback
Solution: Re-distribute cycle if possible, or manually adjust balances
Cannot Select Strategy
Symptom: Dropdown disabled or strategy not available
Causes:
- Cycle already settled
- Strategy doesn't belong to user
- Strategy is inactive
Solution: Verify cycle status and strategy ownership
Related Documentation
- Reprise Opportunity Guide - Includes payout strategies and profit distribution
- Cycle Investment Analysis - How cycles and investments work
Version History
- v0.7.0 (2025-11-05): Initial implementation
- Added
payoutStrategyIdto CycleInvestment - Created API endpoint
- Built admin UI with dropdown selector
- Added validation for settled cycles
- Added