Strategy Pipeline (Strategist)
The Strategist is your primary operator tool — a whole-portfolio allocator that proposes how every card in your collection should be routed across channels. You review the proposal, approve, and one click ships hundreds of cards to their assigned destinations with the right metadata.
What it does
- Reads every card in your
personalchannel that's not already engaged elsewhere - Scores each card across multiple dimensions (price, recency, sport, comp confidence, sales velocity)
- Routes each card to the recommended channel using configurable thresholds
- Builds lots from the routed cards (city, team, player, set, sport groupings)
- Renders the proposal in a 4-quadrant view (eBay / ToT / Showcase / Repack pools)
- One click commits — every card lands on its target channel with theme metadata, transfer codes, and webhook fan-out
The macro presets
| Preset | Behavior | When to use |
|---|---|---|
| MIX | Balanced default. Cards routed by score across all channels. Lots built where natural groupings exist. | Most weeks. Lets the engine decide. |
| STOREFRONT | Premium-first. High-value cards route to Storefront direct-buy. ToT gets mid-tier. Repacks absorb low-value. | You have a strong storefront and want it loaded with hero cards. |
| AGGRESSIVE PULL | Sub-$15 cards route as Pull-only singles (lots disabled). ToT gets max volume. | You're building Pull stack inventory for a marketing push. |
Each preset stamps a default config; every field is editable before commit. Think of presets as "give me a sane starting point" — then tune the thresholds for your shop's specifics.
The four quadrants
1. eBay pool
Cards scored as best-fit for eBay (typically: high comp confidence, mid-tier price band, broad
buyer appeal). Default range: $0 - $15 individual, lots up to $75 total. Adjustable via
ebay_min / ebay_max.
2. ThisOrThat pool
Cards scored for the marketplace games (singles + lots). Default range: $10 - $50 per card. Lots are built when 4+ cards share city/team/player/set theme.
thisorthat_make_lots: bool, defaulttrue— turn off to send only singlesthisorthat_lot_min: minimum total value for a lot to qualify ($15 default)tot_target_singles: cap on singles after lots are built (null = no cap)tot_target_lots: cap on lots
3. Showcase Breaks pool
Cards reserved for break-style sales. Operator picks a preset (Starter / Standard / Premium) and quantity. Strategist fills each break with a balanced card mix.
4. Repack pool
Sealed-pack candidates. Cards under tot_min_value with too little theme-density to lot
(scattered teams, single-card-per-set) flow here. Operator picks pack templates and quantities.
The allocator engine
Lives at backend/services/strategist/allocator.js. The flow:
- Score every card via
backend/services/channel-scoring/index.js(returnsrecommendedchannel +confidence) - Filter to cards with valid pricing (
asking_priceorcomp_value> 0) - Bucket by recommendation
- Run
buildLots()on the ToT bucket: city → team → player → set → sport priority - Run
buildLots()on the eBay bucket separately (different sizing) - Apply target caps if set
- Return four buckets + portfolio_economics rollup
The commit
Hits POST /api/curator/strategist/commit with this payload shape:
{
channels: ['thisorthat', 'ebay', 'showcase', 'repack'],
thisorthat: {
singles: [{ card_id, asking_price, comp_value, ... }, ...],
lots: [{
kind: 'city',
label: 'Dallas Multi-Sport Lot',
card_ids: [12, 47, 89, ...],
total_value: 84.50,
theme_key: 'dallas',
theme_label: 'Dallas',
theme_sports: ['football', 'basketball'],
theme_teams: ['Dallas Cowboys', 'Dallas Mavericks'],
}, ...],
spread: 0.25,
},
ebay: { singles: [...], lots: [...] },
showcases: [{ template, card_ids, ... }, ...],
repacks: [{ template, card_ids, ... }, ...],
spread: 0.25,
pull_singles_eligible: true,
pull_lots_max_eligible: 5,
flip_eligible_floor: 15,
}
The endpoint:
- Validates — duplicate card_ids across groups → 400; cards already on a non-personal channel → 409
- Generates a transfer code (e.g.
ST-A7BX9KQR) - For each channel, calls the satellite's webhook (
POST {satellite}/api/webhook/ingest) - Each satellite stages cards into its local schema AND auto-publishes Listings (since the latest update — see ToT app)
- Inserts
card_channelsrows for every committed card with the appropriate channel slug - Returns a per-channel results summary with transfer codes + webhook ack status
Triage + Lot Builder — focused entry points
The Strategist is comprehensive. For day-to-day work, two narrower tools branch off it:
- Triage — view personal-collection cards by price band, bulk-pick singles to commit to ToT
- Lot Builder — propose city/team/player/set lots, bulk-commit to ToT with sub-$15 fallback math
Production gotchas
- Pricing missing: cards without
asking_priceorcomp_valueare dropped from the allocation. Run a price audit + comp refresh first. - Lot value floor: lots whose
total_value< 15 are skipped. Lot Builder shows the floor explicitly. - Sale-locks during commit: if a card is already in a Stripe checkout flow on Storefront when commit fires, the engagement fails for that one card and continues for the rest. The skipped card stays in personal.
- Ship-from + Stripe must be configured: a successful commit creates listings on the satellite, but the satellite needs Stripe + Shippo working to actually settle sales. See the first-deploy checklist.
Code references
- UI:
frontend/src/pages/Strategist.jsx(2700 lines — comprehensive) - Allocator:
backend/services/strategist/allocator.js - Lot builder:
backend/services/strategist/lot-builder.js - Auto-allocator:
backend/services/strategist/auto-allocator.js(preset-driven) - Routes:
backend/routes/curator.routes.js(/strategist/allocate,/strategist/auto-allocate,/strategist/commit) - Channel scoring:
backend/services/channel-scoring/index.js