Collectibles current limitations
Card-shop flows, providers, and operational work that the current source does not provide.
This page lists gaps found in the current source. It is not a complete readiness checklist for running a card shop.
Catalog and pricing
- Pokémon English only. The bundled checklists cover 19 English sets plus one upcoming pre-order set. Other games and Japanese or other-language catalogs are not bundled. The
cardLanguagefield exists, but there is no import for other languages. - New sets need a code change.
importCardCatalogreads checklists bundled in the repository. Adding a set means adding its JSON file tofeatures/keystone/lib/pokemon/checklists. - No condition-level market prices. TCGCSV provides prices per card and finish. Conditions are priced as a percentage of the NM reading through
PricingRule. - No graded market comps. Slab prices are set by the shop; there is no graded-price source.
- No scheduled refresh. Market prices refresh and repricing happen only when staff run them on Market & Repricing. There is no cron job or worker.
- Manual review for big moves. Rule prices that exceed a rule's maximum change are listed for review and are not applied automatically; staff change those prices by hand.
Buying, consignment, and payouts
- Trade-in payouts are status changes. Marking a trade-in
paidrecords status only. There is no cash payout integration and no store-credit balance or ledger; the cash or store credit choice is stored asdisposition. - Consignment settlements are not generated.
ConsignmentSettlementandSettlementLinecan be read but no code creates them, and generic GraphQL create and update are denied. Consignor payouts must be handled outside the application. - Transition rules are enforced in the dashboard. Trade-in, consignment, dispute, and seller status maps are checked in server actions. A direct GraphQL client with the list's manage permission can write other status values.
Selling
- Auctions and offers are disabled.
placeCollectibleBidandsubmitCollectibleOfferthrow whileAUCTION_LIFECYCLE_RELEASEDandOFFER_LIFECYCLE_RELEASEDarefalse. Auction, Bid, Offer, and OfferRevision lists are read-only desks. - No pre-order deposits. Pre-orders are paid in full at checkout. Guest pre-order limits apply per cart only, because guests have no order history to count.
- No alerts. The want list shows which wants the shop can fill when the customer visits. There are no restock, price-drop, or saved-search emails.
- No POS, events, or tournaments. The product is an online storefront and back office.
- No marketplace channel sync. Stock is not pushed to TCGplayer, eBay, or other channels.
Tenancy and access
- One shop per deployment. Collectibles commands require exactly one
Storerecord. There is no multi-store isolation in one database. - Store memberships are not enforced.
StoreMembershiprecords staff roles, but access checks use role permissions. - No identity, grading, or risk provider.
SellerProfileidentity state,GradeObservationverification state, andRiskAssessmentare set by staff or left unset. No external service verifies them.
Provenance and compliance
- Grades, certificates, provenance, and valuations are recorded observations with disclaimers. The software does not authenticate cards or slabs.
- The demo seed uses labelled sample slab certificates and a fictional shop. Replace seed data before real use.
- The application does not provide PCI DSS or any other certification. Payment card handling is delegated to Stripe or PayPal when configured.
Deployment
npm run devapplies migrations to the configured database.npm run builddoes not; runnpm run migrateas a separate release step.- Background delivery (webhook retries, notification intents) runs only when triggered. A serverless deployment gets no persistent worker from the source.
- Empty route folders exist for
/api/ucp/*,/api/lifecycle-outbox/dispatch, and/api/webhooks/payment/[provider]without route handlers; payment webhooks use/api/payment-webhooks/[providerId].