Settings
Global deposit, withdrawal, and transfer configuration.
Overview
Treasury Settings allow you to configure deposits, withdrawals, transfers, vouchers, and payment methods to match your business requirements.
Admin URL: /admin/treasury/settings
Settings Categories
Deposit Settings
Location: Treasury > Settings > DepositsURL: /admin/treasury/settings/deposits
Configure deposit behavior:
- Availability controls (enable/disable, maintenance mode)
- Verification requirements (KYC above threshold, email verification above threshold)
- Notification settings
- Custom messages
Note: Deposit limits (min/max amounts), fees, and payment proof requirements are configured per Deposit Method, not globally. See the Deposit Settings section below for details.
Withdrawal Settings
Location: Treasury > Settings > WithdrawalsURL: /admin/treasury/settings/withdrawals
Configure withdrawal behavior including limits, verification requirements, security controls, and notifications. See the detailed Withdrawal Settings section below.
Transfer Settings
Location: Treasury > Settings > TransfersURL: /admin/treasury/settings/transfers
Configure internal transfers:
- Enable/disable transfer types
- Minimum/maximum amounts
- Transfer fees
- Instant vs delayed processing
Deposit Settings (Detailed)
Location: Treasury > Settings > DepositsURL: /admin/treasury/settings/depositsController: App\Http\Controllers\Admin\Treasury\SettingsController@depositsStorage: Uses generic Setting model with deposit_* prefix
Availability Controls
| Setting | Key | Type | Description | Default |
|---|---|---|---|---|
| Deposits Enabled | deposit_enabled | boolean | Master switch to enable/disable all deposits | true |
| Maintenance Mode | deposit_maintenance_mode | boolean | Temporarily disable deposits for maintenance | false |
| Maintenance Message | deposit_maintenance_message | string | Message shown to users during maintenance | empty |
Verification Requirements
Threshold-based verification - set to 0 to disable.
| Setting | Key | Type | Description | Default |
|---|---|---|---|---|
| Require KYC Above | deposit_require_kyc_above | integer | Require KYC for deposits above this amount | 0 |
| Require Email Verification Above | deposit_require_email_verification_above | integer | Require email verification above this amount | 0 |
Notifications
| Setting | Key | Type | Description | Default |
|---|---|---|---|---|
| Notify Admin | deposit_notify_admin | boolean | Notify when deposit is submitted | true |
| Notify User | deposit_notify_user | boolean | Notify when deposit is approved/rejected | true |
| Notify Staff via Email Above | deposit_notify_staff_above_amount | integer | Send email to staff with "Receive Email Notifications" permission for deposits above this amount. 0 = disabled. | 0 |
Note: Staff email notifications are sent to Treasury staff whose role includes the "Receive Email Notifications" permission. Configure roles in Settings > Teams & Roles.
Messages
| Setting | Key | Type | Description | Default |
|---|---|---|---|---|
| Processing Message | deposit_processing_message | string | Shown when deposit is pending | "Your deposit is being processed." |
| Success Message | deposit_success_message | string | Shown when deposit is approved | "Your deposit has been approved!" |
Important Notes
- No deposit limits in global settings - Min/max amounts are configured per Deposit Method
- No auto-approval settings - Auto-approval happens via payment gateway webhooks
- No payment proof settings - Configured per Deposit Method
- Uses integers - All amount thresholds are whole numbers (no decimals)
Withdrawal Settings (Detailed)
Location: Treasury > Settings > WithdrawalsURL: /admin/treasury/settings/withdrawalsController: App\Http\Controllers\Admin\Treasury\SettingsController@withdrawalsModel: App\Models\WithdrawalSettingDatabase Table: withdrawal_settings
Technical Architecture
The withdrawal system uses two main models:
- WithdrawalSetting - Global settings (singleton pattern, cached for 24 hours)
- UserWithdrawalLimit - Per-user overrides
Limit enforcement happens in:
App\Services\WithdrawalMethodService::validateWithdrawal()App\Services\WithdrawalMethodService::checkCumulativeLimits()
Availability Controls
| Setting | Database Column | Type | Description | Default |
|---|---|---|---|---|
| Withdrawals Enabled | enabled | boolean | Master switch to enable/disable all withdrawals | true |
| Maintenance Mode | maintenance_mode | boolean | Temporarily disable withdrawals for maintenance | false |
| Maintenance Message | maintenance_message | text | Custom message shown to users during maintenance | null |
Default User Limits
These limits apply to all users unless overridden at the user level. Set to 0 for unlimited.
| Setting | Database Column | Type | Description | Default |
|---|---|---|---|---|
| Daily Limit | default_user_daily_limit | integer | Maximum withdrawal amount per day | 0 (Unlimited) |
| Weekly Limit | default_user_weekly_limit | integer | Maximum withdrawal amount per week | 0 (Unlimited) |
| Monthly Limit | default_user_monthly_limit | integer | Maximum withdrawal amount per month | 0 (Unlimited) |
Important: Values are stored as integers (whole numbers). No decimal amounts for limits.
Verification Requirements
| Setting | Database Column | Type | Description | Default |
|---|---|---|---|---|
| Require KYC Above | require_kyc_above | integer | Require KYC for amounts above this. 0 = disabled. | 0 |
| Require 2FA Above | require_2fa_above | integer | Require 2FA for amounts above this. 0 = disabled. | 0 |
Security & Fraud Prevention
| Setting | Database Column | Type | Description | Default |
|---|---|---|---|---|
| Suspicious Amount Threshold | suspicious_amount_threshold | integer | Flag withdrawals above this for review | 10000 |
| Flag New Accounts (Days) | flag_new_accounts_days | integer | Flag withdrawals from new accounts | 7 |
| Cooldown Between Requests | cooldown_between_requests | integer | Minutes between requests. 0 = no cooldown. | 0 |
Whitelisting Settings
| Setting | Database Column | Type | Description | Default |
|---|---|---|---|---|
| Require Global Whitelisting | whitelist_enabled | boolean | Users must whitelist addresses | false |
| Whitelist Approval Required | whitelist_approval_required | boolean | Admin must approve addresses | true |
| Whitelist Cooldown (Hours) | whitelist_cooldown_hours | integer | Hours before address can be used | 24 |
Request Limits & Notifications
| Setting | Database Column | Type | Description | Default |
|---|---|---|---|---|
| Max Pending Per User | max_pending_per_user | integer | Max pending requests per user | 5 |
| Notify Admin on Request | notify_admin_on_request | boolean | Notify on new withdrawal | true |
| Notify User on Status Change | notify_user_on_status_change | boolean | Notify on approval/rejection | true |
| Notify Admin on Large Amount | notify_admin_on_large_amount | integer | Alert threshold | 5000 |
Per-User Withdrawal Limits
Location: Admin > Users > [User Profile] > Withdrawal Limits (sidebar card)URL: /admin/users/{id} (sidebar card with settings modal)Controller: App\Http\Controllers\Admin\UserController@updateWithdrawalLimitsModel: App\Models\UserWithdrawalLimitDatabase Table: user_withdrawal_limitsRoute: PATCH/admin/users/{user}/withdrawal-limits
Purpose
Override default withdrawal limits for individual users:
- VIP clients who need higher limits
- High-risk accounts that need restrictions
- Temporarily restricting a user's withdrawals
Database Schema
user_withdrawal_limits
├── id
├── user_id (FK to users)
├── daily_limit (integer, nullable) - null = use default
├── weekly_limit (integer, nullable) - null = use default
├── monthly_limit (integer, nullable) - null = use default
├── auto_approve_enabled (boolean, nullable)
├── auto_approve_max_amount (integer, nullable)
├── max_pending_requests (integer, nullable)
├── withdrawals_enabled (boolean, default: true)
├── restriction_reason (string, nullable)
├── restricted_until (datetime, nullable)
├── trust_level (string: standard|trusted|vip)
├── skip_cooldown (boolean)
├── skip_whitelist_approval (boolean)
├── admin_notes (text, nullable)
└── timestamps
Available Per-User Settings
| Setting | Database Column | Type | Description |
|---|---|---|---|
| Withdrawals Enabled | withdrawals_enabled | boolean | Enable/disable for this user |
| Daily Limit (Custom) | daily_limit | integer/null | Override daily limit. null = use default. |
| Weekly Limit (Custom) | weekly_limit | integer/null | Override weekly limit. null = use default. |
| Monthly Limit (Custom) | monthly_limit | integer/null | Override monthly limit. null = use default. |
| Max Pending Requests | max_pending_requests | integer/null | Override max pending for this user |
| Restriction Reason | restriction_reason | string | Message shown when disabled |
How Limits Are Resolved
The UserWithdrawalLimit model has methods to get effective limits:
// Get effective daily limit for a user
$userLimits = UserWithdrawalLimit::getForUser($userId);
$effectiveDaily = $userLimits->getEffectiveDailyLimit();
// Returns: custom limit if set, otherwise default from WithdrawalSetting
Priority Order:
- User's custom limit (if set and not null)
- Global default limit from
withdrawal_settingstable - 0 = Unlimited
Limit Enforcement Logic
Limits are checked in WithdrawalMethodService::checkCumulativeLimits():
- Daily limit: Sum of withdrawals (pending + processing + success) created today
- Weekly limit: Sum of withdrawals created this week (Monday to Sunday)
- Monthly limit: Sum of withdrawals created this month
Statuses counted toward limits: pending, processing, success
API Reference
Update Withdrawal Settings
PUT/admin/treasury/settings/withdrawals
Parameters:
- enabled: boolean
- maintenance_mode: boolean
- maintenance_message: string (optional)
- default_user_daily_limit: integer (0 = unlimited)
- default_user_weekly_limit: integer (0 = unlimited)
- default_user_monthly_limit: integer (0 = unlimited)
- require_kyc_above: integer (0 = disabled)
- require_2fa_above: integer (0 = disabled)
- suspicious_amount_threshold: integer
- flag_new_accounts_days: integer
- cooldown_between_requests: integer (minutes, 0 = disabled)
- whitelist_enabled: boolean
- whitelist_approval_required: boolean
- whitelist_cooldown_hours: integer
- max_pending_per_user: integer
- notify_admin_on_request: boolean
- notify_user_on_status_change: boolean
- notify_admin_on_large_amount: integerUpdate Per-User Withdrawal Limits
PATCH/admin/users/{user}/withdrawal-limits
Parameters:
- withdrawals_enabled: boolean
- daily_limit: integer|null (null = use default, 0 = unlimited)
- weekly_limit: integer|null
- monthly_limit: integer|null
- max_pending_requests: integer|null
- restriction_reason: string|nullCommon Issues & Troubleshooting
Issue: User hitting 5000 limit but settings show 0 (unlimited)
Cause: Old database value from before the migration to unlimited defaults.Solution: Run migration or manually update withdrawal_settings table:
UPDATE withdrawal_settings SET default_user_daily_limit = 0;
Issue: User has custom limit but still using default
Cause: Custom limit field is empty/null, so default is used.Solution: Check user_withdrawal_limits table - null values use defaults. Set explicit value if needed.
Issue: Limits not taking effect immediately
Cause: WithdrawalSetting model is cached for 24 hours.Solution: Clear cache after updating settings:
Cache::forget('withdrawal_settings_singleton');
Or run: php artisan cache:clear
Issue: User sees "Daily limit exceeded" but hasn't withdrawn today
Cause: Pending and processing withdrawals count toward limits.Solution: This is expected behavior. Limits include all non-failed withdrawals.
Related Files
Models
app/Models/WithdrawalSetting.php- Global withdrawal settingsapp/Models/UserWithdrawalLimit.php- Per-user limit overridesapp/Models/WithdrawalMethod.php- Withdrawal payment methods
Controllers
app/Http/Controllers/Admin/Treasury/SettingsController.php- Settings CRUDapp/Http/Controllers/Admin/UserController.php- Per-user limits
Services
app/Services/WithdrawalMethodService.php- Withdrawal validation & limits
Views
resources/views/admin/treasury/settings/withdrawals/index.blade.php- Settings UIresources/views/admin/users/show.blade.php- User profile with limits card
Migrations
database/migrations/2026_01_04_163800_create_withdrawal_settings_table.phpdatabase/migrations/*_create_user_withdrawal_limits_table.phpdatabase/migrations/2026_01_26_112021_update_withdrawal_settings_limits_to_unlimited.php
Best Practices
- Start unlimited, add limits as needed: Default to 0 (unlimited) and add restrictions only when required
- Use per-user limits for exceptions: Don't change global settings for individual cases
- Enable notifications: Keep admin notifications enabled for large amounts
- Consider whitelisting: For high-security environments, require address whitelisting
- Set reasonable cooldowns: Prevent rapid successive withdrawals with cooldown periods
- Document restrictions: Always add a reason when restricting a user's withdrawals
- Review settings periodically: Adjust limits based on business growth and risk assessment
- Clear cache after changes: Run
php artisan cache:clearafter direct database updates - Use integers only: Limits are stored as integers, no decimal amounts
Quick Reference
To Remove All Withdrawal Limits
Treasury > Settings > Withdrawals
Set all limits to 0 (Daily, Weekly, Monthly)
Save
To Restrict a Specific User
Admin > Users > [Select User]
Sidebar > Withdrawal Limits > Settings icon
Disable "Withdrawals Enabled"
Add restriction reason
Save
To Set VIP Limits for a User
Admin > Users > [Select User]
Sidebar > Withdrawal Limits > Settings icon
Set custom Daily/Weekly/Monthly limits (higher than default)
Save
To Enable Maintenance Mode
Treasury > Settings > Withdrawals
Enable "Maintenance Mode"
Enter maintenance message
Save
Next Steps
- Deposits — Managing and approving deposit requests
- Withdrawals — Processing withdrawal payouts
- Payment Methods — Configure per-method limits, fees, and smart filters
- Transfers — Internal and external transfer management
- Vouchers — Pin-based recharge code system