Files
pokemon-inventory/docs/PRICING.md
T
fragginwagon 4effebd2f8
Quality / test (push) Canceled after 0s
feat: add pricing provider boundary
2026-09-09 11:19:27 -04:00

3.1 KiB

Pricing Architecture

Goals

Provide a defensible calculated market value while retaining provider provenance and uncertainty.

Provider abstraction

All providers implement a common conceptual interface:

PricingProvider

A provider returns normalized observations containing:

  • provider/source
  • Product or Inventory Item context
  • price
  • currency
  • condition
  • timestamp
  • source URL/identifier
  • quality/confidence information

Provider adapters own provider-specific API behavior and normalization.

The application uses a validated provider registry. A refresh request selects a registered provider, normalizes its observation array through the existing pricing service, and recalculates the item valuation. Missing providers return an explicit unavailable response; the application never fabricates observations or values.

Use officially supported APIs or permitted sources. Do not invent APIs or bypass restrictions.

Provider Product Mapping

Mapping occurs during new Product creation.

Workflow:

Create Product → Search Providers → Candidate Matches → Admin Confirms Mapping

The admin can also search/refine manually.

Mappings are persistent Product-level records and are reused for future physical copies.

Provider mapping is not required.

A provider can be:

  • linked to a canonical product
  • linked to a search/query
  • marked Not Applicable
  • left unlinked

Mapping types

PRODUCT

  • specific provider/catalog entity

SEARCH

  • provider search/query definition

eBay supports both.

Pricing pipeline

Raw Provider Data
  ↓
Normalized Observations
  ↓
Quality / Confidence Analysis
  ↓
Valuation Strategy
  ↓
Calculated Market Value
  ↓
Optional Manual Override
  ↓
Display Currency Conversion

Valuation

Default strategy: median.

Supported strategies should include:

  • average
  • median
  • weighted average

The strategy is configurable.

Outliers remain in the underlying observations and are flagged with a reason. The valuation engine may account for outlier status according to the selected strategy, but raw observations are not silently discarded.

One valid source can produce a market value with low confidence.

No reliable condition-specific value means unavailable; never fabricate a value.

Refresh

Refresh:

  • one Inventory Item
  • Product-level copies
  • bulk selected inventory

Bulk refresh runs through BullMQ in the worker.

Provider failure should not invalidate other valid observations. The failed provider is recorded for admin diagnostics.

Overrides

Admin can manually override market value.

Override requires:

  • value
  • currency
  • private reason
  • actor
  • timestamp

Overrides are never exposed publicly as provider-level information.

Currency

Canonical stored/calculated market values use USD.

Visitor currency conversion occurs at presentation time using cached exchange rates.

The original USD value remains authoritative.

Staleness

Pricing freshness is configurable. Dashboard and admin inventory can identify stale values. The exact default threshold is a configuration decision during implementation, not a hard-coded domain invariant.