Lines Management Trader console β live board control
{{ linesGroupedCount }} matches Β· {{ lines.length }} selections
{{ group.away_team_name }} @ {{ group.home_team_name }}
{{ group.sport_name }} Β· {{ fd(group.start_time) }} LIVE| Market | Selection | Side | Odds | Point | Status | Source | Tickets | Last Updated | Action |
|---|---|---|---|---|---|---|---|---|---|
| {{ sel.market_type }} | {{ sel.selection_name }} | {{ sel.side||'β' }} | {{ fa(sel.american_odds) }} | {{ sel.point_value!==null ? fp(sel.point_value) : 'β' }} | {{ sel.selection_status===1&&!sel.blocked?'Open':'Suspended' }} | Manual Feed | {{ sel.open_ticket_count }} 0 | {{ sel.last_changed_at ? fd(sel.last_changed_at) : 'β' }} | |
| No active selections for this match | |||||||||
Cutoff override
min
No matches found for this filter
Manual Line Override
{{ lineOverrideTarget?.selection_name }} Β· {{ lineOverrideTarget?.market_type }}
American Odds
Point Value
Reason
{{ lineMatchDrill?.match?.away_team_name }} @ {{ lineMatchDrill?.match?.home_team_name }}
Trader Notes
{{ n.note }}
{{ n.admin_username }} Β· {{ fd(n.created_at) }}
No notes yet
All Selections
{{ sel.selection_name }}
{{ fa(sel.american_odds) }}
{{ sel.market_type }} Β· Manual override activeFeed-controlled
Price History
{{ h.american_odds_before ?? 'β' }} β {{ h.american_odds_after ?? 'β' }}
{{ h.source }}
{{ h.admin_username||'system' }} Β· {{ fd(h.changed_at) }} Β· {{ h.reason }}
No history yet for this selection
Risk Dashboard Live exposure
Open Bets
{{ dd.headline?.open_bets_count||0 }}
{{ dd.headline?.bets_today||0 }} today
Open Handle
${{ fm(dd.headline?.open_handle) }}
${{ fm(dd.headline?.handle_today) }} today
Total Liability
${{ fm(dd.headline?.open_liability) }}
Max payout
Net Exposure
${{ fm(dd.headline?.net_exposure) }}
Liability β Handle
Players Won
${{ fm(dd.headline?.total_won_by_players) }}
All-time settled
House Retained
${{ fm(dd.headline?.total_lost_by_players) }}
Player losses
Active Players
{{ dd.headline?.active_players||0 }}
{{ dd.headline?.new_players_today||0 }} new today
Exposure by Sport
| Sport | Bets | Players | Handle | Liability | Net Exp | Largest Win | Bar |
|---|---|---|---|---|---|---|---|
| {{ s.sport_name }} | {{ s.open_bets }} | {{ s.unique_players }} | ${{ fm(s.total_handle) }} | ${{ fm(s.total_liability) }} | ${{ fm(s.net_exposure) }} | ${{ fm(s.largest_payout) }} | |
| No open bets | |||||||
π₯ Biggest Open Bets
| Player | Type | Wager | To Win |
|---|---|---|---|
| {{ b.player_name }} | {{ b.bet_type }} | ${{ fm(b.bet_amount) }} | ${{ fm(b.potential_win-b.bet_amount) }} |
| No open bets | |||
π Recent Bets
| Player | Type | Wager | Status |
|---|---|---|---|
| {{ b.player_name }} | {{ b.bet_type }} | ${{ fm(b.bet_amount) }} | {{ bsl(b.status) }} |
π 7-Day Handle
| Date | Bets | Handle | Paid Out |
|---|---|---|---|
| {{ d.day }} | {{ d.bet_count }} | ${{ fm(d.handle) }} | ${{ fm(d.paid_out) }} |
Open Bets {{ bt }} open
Open Bets
Click row to drill down| # | Player | Type | Legs | Sports | Wager | To Win | Placed | |
|---|---|---|---|---|---|---|---|---|
| {{ b.bet_id }} | {{ b.player_name }} {{ b.player_email }} |
{{ b.bet_type }} | {{ b.leg_count }} | {{ b.sports }} | ${{ fm(b.bet_amount) }} | ${{ fm(b.potential_win-b.bet_amount) }} | {{ fd(b.placed_at) }} | |
| No open bets found | ||||||||
{{ bets.length }} of {{ bt }}
Grade Bets Matches with open wagers
Auto-Grade Output
{{ agLastForced?'Forced run':'Normal run (same as cron)' }}
β This confirms it: auto-grading is turned off (system_setting.auto_grade_enabled=0). That's why cron hasn't been settling anything β it's been running on schedule and exiting immediately every time, not actually broken.
{{ agOutput }}
Matches Ready to Grade
Enter final scores to settle bets| Match | Sport | Start | Open Bets | Handle | Liability | Away Score | Home Score | Action |
|---|---|---|---|---|---|---|---|---|
{{ m.away_team_name }} @ {{ m.home_team_name }} βΊ Rolled back β was {{ m.away_score }}β{{ m.home_score }}, needs re-grading Suggested score: {{ m.away_score }}β{{ m.home_score }} β confirm below |
{{ m.sport_name }} | {{ fd(m.start_time) }} | {{ m.open_bets }} | ${{ fm(m.total_handle) }} | ${{ fm(m.total_liability) }} | |||
| No matches with open bets needing grading | ||||||||
Grading History Every grade, void, and rollback β fully auditable
{{ {daily:'Daily',weekly:'Weekly',monthly:'Monthly'}[ghPeriod] }} Summary
| {{ ghPeriod==='daily'?'Date':ghPeriod==='weekly'?'Week Of':'Month' }} | Batches | Bets Settled | Won | Lost | Push | Handle | Paid Out | House Result | Auto / Manual |
|---|---|---|---|---|---|---|---|---|---|
| {{ row.grade_date || row.week_start || row.period_key }} | {{ row.batches }} | {{ row.bets_settled }} | {{ row.bets_won }} | {{ row.bets_lost }} | {{ row.bets_push }} | ${{ fm(row.total_handle) }} | ${{ fm(row.total_paid_out) }} | ${{ fm(row.house_result) }} | {{ row.auto_graded_count }} auto / {{ row.manual_graded_count }} manual β |
| No grading activity yet | |||||||||
Grading Batches
{{ ghTotal }} total Β· click a row to drill down| # | Match | Action | Source | Score | Bets | Handle | Paid Out | House Result | By | When | Status | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ b.batch_id }} | {{ b.away_team_name }} @ {{ b.home_team_name }} | {{ b.action }} | {{ b.source }} | {{ b.away_score }}β{{ b.home_score }} β | {{ b.bets_settled }} | ${{ fm(b.total_handle) }} | ${{ fm(b.total_paid_out) }} | ${{ fm(b.house_result) }} | {{ b.admin_username || (b.source==='auto'?'System':'β') }} | {{ fd(b.created_at) }} | Rolled Back Active | |
| No grading history found for this filter | ||||||||||||
{{ ghBatches.length }} of {{ ghTotal }}
Players
Player Accounts
| Username | Balance | Bets | Open Exp | Status | Joined | ||
|---|---|---|---|---|---|---|---|
| {{ p.username }} | {{ p.email }} | ${{ fm(p.balance) }} | {{ p.total_bets }} | ${{ fm(p.open_exposure) }} | {{ p.status?'Active':'Suspended' }} | {{ fd(p.created_at) }} |
Feed Control
Quota Used
{{ fd2.quota?.requests_used||0 }}/{{ fd2.quota?.requests_limit||500 }}
{{ fd2.quota?.month_key }}
Monthly Quota
{{ fd2.quota?.pct_used }}% used
{{ (fd2.quota?.requests_limit||500)-(fd2.quota?.requests_used||0) }} remaining
Feed Providers
Each provider's API key and status β dormant providers do nothing until activated here
API Key
{{ p.auth_header }}
{{ (fd2.quota_by_provider.find(q=>q.provider_id===p.id)?.requests_used)||0 }} / {{ (fd2.quota_by_provider.find(q=>q.provider_id===p.id)?.requests_limit)||'β' }} requests this month
Sports
{{ s.nick_name }}
{{ s.in_season?'In Season':'Off' }}
Unverified
{{ s.published?'Published':'Hidden' }}
Cutoff
min
{{ s.active_matches }} matches
{{ s.last_polled_at?fd(s.last_polled_at):'Never' }}
Recent Poll Log
| Time | Sport | HTTP | Events | Quota | Duration | Error |
|---|---|---|---|---|---|---|
| {{ fd(l.polled_at) }} | {{ l.sport_key }} | {{ l.http_status }} | {{ l.events_returned }} | {{ l.quota_used }} | {{ l.duration_ms }}ms |
System Settings
βοΈ Auto-Grading Engine
{{ st['auto_grade_enabled']?.value==='1' ? 'β Auto-Grading ENABLED' : 'Auto-Grading Disabled β Manual Only' }}
Cron checks every 15 minutes for matches ready to grade. Grades once enough sources agree β see quorum setting below.
Score Sources to Check
Grade once at least
source(s) agree on the same score
The Odds API source matches by exact event ID against our own paid feed β the most reliable option. ESPN uses their scoreboard JSON. Yahoo/Google are HTML-scraped and may return "No data found" often since both sites actively block scrapers β keep them as extra opinions, not primary sources.
Configuration
Superadmin only{{ key }}
{{ item.description }}
{{ item.value }}
Cashier Setup Payment methods & keys
π§ͺ Sandbox / Test Mode
{{ cashierSettings['cashier_sandbox_mode']==='1' ? 'π§ͺ SANDBOX MODE ON β No real money' : 'β
LIVE MODE β Real money active' }}
Toggle to switch between sandbox testing and live processing
βΏ NOWPayments (Crypto)
{{ key.replace('nowpayments_','').replace(/_/g,' ') }}
π Ώ PayPal REST API
{{ key.replace('paypal_','').replace(/_/g,' ') }}
π² P2P Handles
{{ key.replace(/_handle/,'').toUpperCase() }}
π¦ Bank Wire
{{ key.replace('wire_','').replace(/_/g,' ') }}
π° Limits
{{ key.replace('global_','').replace(/_/g,' ') }}
π Bonus Defaults
{{ key.replace('welcome_bonus_','').replace(/_/g,' ') }}
Audit Log
Admin Activity
| Time | Admin | Action | Entity | Details | IP |
|---|---|---|---|---|---|
| {{ fd(l.created_at) }} | {{ l.admin_username }} | {{ l.action }} | {{ l.entity_type }} {{ l.entity_id }} | {{ l.ip_address }} |
Users Employee accounts & module access
| User | Role | Modules | Status | Created | Action |
|---|---|---|---|---|---|
{{ u.username }}{{ u.id===admin.id?' (you)':'' }} {{ u.email }} |
{{ u.role }} | All (superadmin) None assigned {{ u.modules.map(m=>moduleLabel(m)).join(', ') }} | {{ u.is_active?'Active':'Disabled' }} | {{ fd(u.created_at) }} | |
| No users found | |||||
{{ auForm.id?'Edit User':'Add User' }}
Username
Email
{{ auForm.id?'New Password':'Password' }}
Role
Module Access
Superadmin has full access to every module β no assignment needed.
Agents PPH referral agents & per-head rates
| Agent | Referral Code | Rate/Head | Players | Status | Action |
|---|---|---|---|---|---|
{{ a.name }} {{ a.email||'β' }}{{ a.phone?' Β· '+a.phone:'' }} |
{{ a.referral_code }} | ${{ fm(a.effective_rate) }}{{ a.rate_per_head===null?' (default)':'' }} | {{ a.active_players }} active / {{ a.total_players }} total | {{ a.status }} | |
| No agents yet | |||||
{{ paForm.id?'Edit Agent':'Add Agent' }}
Name
Email
Phone
Referral Code
Rate/Head
Note
{{ paPlayersAgentName }} β Players
{{ pl2.username }} {{ pl2.email }}
${{ fm(pl2.balance) }}{{ pl2.status!==1?' (suspended)':'' }}
No players yet
Billing & Reconciliation Weekly active-head invoicing
Generate Billing
Period Start
Period End
Created {{ pbGenResult.created.length }} bill(s){{ pbGenResult.skipped_already_exists.length?', skipped '+pbGenResult.skipped_already_exists.length+' (already billed for this period)':'' }}.
| Agent | Period | Active Heads | Rate | Amount Due | Status | Action | ||
|---|---|---|---|---|---|---|---|---|
| {{ c.agent_name }} | {{ c.period_start }} β {{ c.period_end }} | {{ c.active_head_count }} | ${{ fm(c.rate_per_head) }} | ${{ fm(c.amount_due) }} | {{ c.status }} | Ref: {{ c.payment_reference }} {{ fd(c.reconciled_at) }} |
||
| No billing cycles found | ||||||||