Pricing intelligence
Every card in SlabTrack carries multiple comp prices from different sources. The Strategist + buyer-facing UIs use a priority chain to pick "the" comp value — but you can audit, override, and tune which sources win when.
The price fields on a card
| Field | Source | Used for |
|---|---|---|
asking_price | Operator hand-set | Source of truth for sales price (winPrice/losePrice math) |
sportscardspro_psa10 | SCPro API, PSA 10 grade | Comp baseline for PSA 10 cards |
sportscardspro_psa9 ... sportscardspro_psa7 | SCPro API, lower grades | Comp for non-perfect graded |
sportscardspro_bgs10 / cgc10 / sgc10 | SCPro API, alt graders | Same but for BGS/CGC/SGC |
sportscardspro_raw | SCPro API, ungraded | Raw card baseline |
ebay_avg / ebay_low / ebay_high | eBay sold scrape | Live market comp; fallback when SCPro is empty |
ebay_sample_size | eBay scrape | How many sold listings the avg is based on (confidence indicator) |
comp_value (computed) | Pricing service priority chain | The "canonical" comp price — what the Strategist uses |
The comp_value priority chain
Computed by backend/services/channel-scoring/index.js via cardCompValue(card):
- If card is graded AND grading_company + grade are set → use the matching SCPro field
- PSA 10 →
sportscardspro_psa10 - BGS 10 →
sportscardspro_bgs10 - etc.
- PSA 10 →
- If no SCPro grade match → try
sportscardspro_raw - If still 0 →
ebay_avg - If still 0 →
asking_price(operator's hand-set) - If still 0 → 0 (card has no pricing — flagged as
needs_reviewin Strategist)
Price audit page
/admin/price-audit shows pricing health across your whole inventory:
- Cards with
comp_value = 0(never priced) - Cards with stale SCPro data (last fetched > 30 days ago)
- Cards where asking_price > 2× comp_value (overpriced — won't sell)
- Cards where asking_price < 0.5× comp_value (underpriced — leaving money on table)
Bulk actions: refresh all SCPro, bulk-update asking from comp, mark cards "no comp available".
Quick-price (one-card AI)
/quick-price: paste cert OR upload card image → SlabTrack identifies the card via vision/PSA → fetches all comp sources → suggests an asking price. Used for receipts ("how much should I list this for?") + manual price overrides.
Comp refresh schedule
- SCPro: nightly cron refreshes all active inventory (cards not sold, not personal-keeper)
- eBay: weekly cron because of rate limits — focuses on cards with SCPro = 0
- On-demand: any card detail page has a "Refresh comps" button that triggers an immediate fetch
Operator price overrides
asking_price is the operator's source of truth. Even if SCPro says $100, if you hand-set asking to $80, that's what the satellite sees and the buyer pays. The comp fields stay informational — they don't auto-overwrite asking unless the operator triggers it via "bulk update asking from comp".
Code references
- Comp computation:
backend/services/channel-scoring/index.js(cardCompValue,cardCompSource) - SCPro API integration:
backend/services/pricing/sportscardspro.js - eBay scrape:
backend/services/pricing/ebay-scraper.js - Price audit:
frontend/src/pages/PriceAudit.jsx - Quick-price:
frontend/src/pages/QuickPrice.jsx