Payout structure
Pay period
- Cycle: Friday to Thursday (weekly)
- Processing: Following business day
Calculation
- Placements count - Number of posts in the period
- PPP rate - Pay per post rate
Rate hierarchy
Payout rate is determined by:Campaign rate
Set per-campaign when rates vary by initiative.Contract rate
Default rate for all campaigns under a contract.Payout export
Admins export payouts via the admin console.Export contents
Export format
CSV with:- One row per placement
- Summary row per creator/campaign
- Totals at bottom
Sync warnings
Export includes warnings for:- Creators with sync issues
- Missing metrics data
- Attribution problems
Deduplication
Posts are deduped to prevent double-counting:
Same post never counts twice across:
- Multiple syncs
- Different social accounts
- Payout periods
Brand hub display
Creators see payout information on their brand hub:Placements bar
Visual progress toward targets:Paid amounts
Gamified pay display
Brand deals show gamified compensation:Base pay
Count-up animation on deal cards showing base rate.Bonus prizes
Top-3 cash bonuses per brand:- 1st place: $X
- 2nd place: $Y
- 3rd place: $Z
Processing workflow
1
Period closes
Thursday 11:59pm marks end of pay period
2
Export generated
Admin generates payout export CSV
3
Review
Review for anomalies, sync warnings
4
Process payment
Submit to payment processor (external)
5
Confirm
Update records as paid (manual)
Troubleshooting
Backend implementation
Key files:app/services/payouts/- Payout calculationsapp/services/creator_campaigns/hub_serializer.rb- Hub displayapp/controllers/api/internal/payouts_controller.rb- Export API
Future enhancements
Planned payout improvements:- Real-time payout display to creators
- Automatic payment processing
- Payment history in app
- Tax document generation