Market PnL
Market PnL
Open Operator Dashboard → Operations → Market PnL (/market-pnl). Both trades:read and redemptions:read are required, or *. Data is restricted to the authenticated operator.
This is user cash PnL, one row per user and resolved Opinion market. It is not open-position valuation, a payout forecast, an unpaid entitlement, operator profit, or the monthly settlement. Polyflight reporting is separate.
Select the evidence window
- Defaults to the last 30 operator-local calendar days, including today, newest resolved first.
- Filter by exact positive Market ID, market title/slug search, and exact external user ID.
- The date controls select market resolution dates, not operation/trade creation dates. Amounts cover each selected market's entire lifetime, including earlier buys and sells.
- Clear both dates for all resolved markets. Reset restores the last 30 days.
- Sort by newest/oldest resolution, highest/lowest user PnL, most spent, or most returned; choose 25, 50, or 100 rows per page.
- Select Apply filters before reading totals or exporting. The URL records applied filters, sort, and pagination, not pending edits.
Resolution time currently uses the market's recorded update timestamp (markets.updated_at), not a dedicated resolution-event timestamp. Later market updates can therefore affect date selection.
Read amounts correctly
Cash columns are exact integers in the labeled operator-currency minor units (currently IDR for Opinion wallet operations). Quoted Credits are a different unit.
| Column/card | Meaning |
|---|---|
| Spent / Balance spent | Successful buy debits less successful debit reversals; includes buy fees. |
| From sales | Successful order credits less credit reversals. Sales are net of trading fees. |
| From redemptions | Successful redemption wallet credits less credit reversals; a resolved winning position alone is not received cash. |
| Total returned / Balance returned | From sales + from redemptions. |
| User cash PnL | Total returned − spent; positive is a user cash gain, not an operator settlement receivable. |
| Acc. Quoted Fees (operator currency) | Buy and sell executed-trade fees converted per trade with its historical conversion and rounding. |
| Acc. Quoted Fees (Credits) | The same lifetime executed-trade fee reference in Credits, accumulated once per order rather than per wallet-operation row. |
Both accumulated quoted-fee columns are reference-only. They do not change PnL: buy fees are already in spent, and sell credits are already net. Do not subtract either column again or add Credits to external currency.
The three cards and row/user/market counts cover all filtered results, not the current page. Confirmed wallet movements remain in cash totals even if the source order/redemption status later fails or enters review. Distinct successful wallet keys are distinct cash movements; an accidental duplicate payment is not silently deduplicated out of PnL.
Pending and failed/unpaid warnings
- Pending / Cash flow needs review: unresolved wallet outcomes or a source-level blocker exist. PnL includes confirmed cash only; it is not final while unknown outcomes remain.
- Failed / unpaid: recorded failed payout work still leaves an amount owed. A terminal failed decision does not write off the debt.
- Confirmed cash: no current pending/failed-unpaid warning for that row; this does not certify bank settlement or all-time accounting closure.
With the additional balance_operations:read grant, banner buttons and row badges open Cash Flow Triage, preserving market/user/search and resolution dates. A row link narrows to that user and market. Without the extra grant, ask an authorized operator colleague to collect the wallet evidence. Operator access cannot record a completed/failed cash outcome or send a corrective payment.
Export and escalation
Export CSV (all filtered) fetches all matching pages. Copy as HTML copies only the current page, with or without headers. Exported cash/fee amounts are unformatted integers with units in their column headers; retain those headers. CSV also includes identities, market slug/outcome, pending counts, and failed/unpaid amounts.
For discrepancies, retain the applied filters, timezone, market ID, exact external user ID, and relevant source/operation IDs. Compare the original idempotency key against your wallet ledger, not only a timeout or source status. Send sanitized evidence through Operator Support; do not retry an unknown mutation under a fresh key.
Source API
GET /api/operator/market-pnl requires both reporting scopes. The dashboard uses market_id, search, external_user_id, resolved_from_date, resolved_to_date, sort, page, and page_size. Operator selectors are rejected; the session determines ownership. Monetary response fields are exact integer strings.
See the Market PnL API reference for the complete response fields and query rules.
