Cambridge TCG stores legacy wholesale observations and derived channel values, but it does not publish those price magnitudes today. The rows predate field-level source-rights receipts. Public card surfaces return null for legacy prices and images, and price-history routes return status without values. Authentication and mathematical transformation do not reopen that boundary.
Public visibility does not grant redistribution or training rights. API consumers must inspect the response license and source-rights fields.
This page documents the internal and shop-era formula so its existence is understandable. It is not evidence that any computed value is publicly available.
Where this lives in code. The canonical implementation is atpackages/pricing/src/index.ts(functioncomputePrice). Channel constants and observations remain internal on the wholesale substrate. The public boundary is enforced in the wholesale price routes and storefront field-withholding helpers. Formula tests do not grant publication rights.
The dormant/internal calculation starts from two inputs captured at the same moment. The method is public; the underlying observations and results are not.
From these two, we derive a third — the wholesale base:
baseGbp = cardrush_jpy / gbp_jpy_rateThis was the shop-era internal base before margin, fee, VAT, or channel uplift.
Each channel has six numbers that translate the internal wholesale base into a derived value. No derived legacy card value is customer-facing today. The channels remain documented for code review and the historical record.
| Number | What it is | Example (cambridgetcg.com) |
|---|---|---|
marginMultiplier | Our gross-margin uplift. 1.08 = 8% on top of base. | 1.08 |
flatFeeSingles | Per-card flat fee for single cards. | £0.22 |
flatFeeSealed | Per-product flat fee for sealed product. | £2.20 |
vatMultiplier | UK VAT multiplier. 1.20 = 20%. | 1.20 |
retailMultiplier | Channel-specific retail uplift. | 1.15 |
roundTo | Final rounding step. | £0.10 |
The full formula:
exVat = (baseGbp × marginMultiplier + flatFee) × retailMultiplier
vat = exVat × (vatMultiplier - 1)
preRound = exVat + vat
price = round(preRound / roundTo) × roundToThe final round selects the nearest step (JavaScript's Math.round, with positive ties rounded upward); a preRound value of £5.14 with a roundTo of £0.10 yields £5.10.
| Channel | Margin × | Flat singles | VAT × | Retail × | Round |
|---|---|---|---|---|---|
| wholesale (B2B base) | 1.08 | £0.22 | 1.20 | 1.00 | £0.01 |
| cambridgetcg.com (Next.js) | 1.08 | £0.22 | 1.20 | 1.15 | £0.10 |
| Shopify | 1.08 | £0.22 | 1.20 | 1.15 | £0.10 |
| eBay | 1.08 | £0.22 | 1.20 | 1.25 | £0.10 |
| Cardmarket | 1.08 | £0.22 | 1.20 | 1.20 | £0.01 |
| Trade-in (cash) | 0.55 | £0 | 1.00 | 1.00 | £0.01 |
| Trade-in (store credit) | 0.77 | £0 | 1.00 | 1.00 | £0.01 |
The trade-in channels (historical) inverted the margin: the shop paid 55% of the wholesale base for cash, 77% for store credit, with no flat fee, no VAT, and no retail uplift. The dated close-out decision records zero trade-in submissions on 2026-07-06; this page does not live-query production history. The rows price nothing now and remain only so old numbers stay reproducible.
The retail channels (historical: Shopify, eBay, Cardmarket; and the shop-era cambridgetcg price) all charged VAT. The retail multiplier differed per channel: eBay's was highest because eBay's seller fees were higher and the shop recovered them via the price. The cambridgetcg formula remains in code and internal records; its result is not emitted as a public reference value.
A ¥600 listing today (¥/£ rate = 185):
baseGbp = 600 / 185 = £3.24
cambridgetcg.com:
exVat = (3.24 × 1.08 + 0.22) × 1.15 = £4.28
vat = 4.28 × 0.20 = £0.86
preRound = 4.28 + 0.86 = £5.14
price = round(5.14 / 0.10) × 0.10 = £5.10The same listing priced £5.60 on eBay, £1.78 on trade-in cash, and £2.50 on trade-in credit in the shop era. These exact numbers are locked as regression tests in packages/pricing/src/__tests__/pricing.test.ts — if the formula drifts, the tests fire. The £5.10 above is a worked formula example, not a value published for a current card.
Internal collection jobs may retain observations and timestamps. Public structural catalog freshness describes the returned structural row, not a published price. No freshness label should be read as permission to disclose a withheld magnitude.
The legacy observation archive has a single source, CardRush. Its acquisition is disabled by source policy, so the archive no longer refreshes. The latest stored snapshot date is computed on /prices/coverage and in /api/v1/coverage (summary.latest_snapshot).
A null public price is the source-rights boundary, not a claim that the value is zero, stale, or temporarily unavailable.
action = "snapshot". CardRush acquisition is now disabled and no scheduled job runs; see /prices/coverage for the latest stored snapshot date.action = "admin_edit" and the operator's email.The formula can be reproduced from hypothetical or independently licensed inputs:
If the pure formula does not match its documented worked examples within £0.01 rounding tolerance, that is a code or documentation bug. Email us at [email protected] with the SKU and the snapshot date and we'll investigate.
Some pricing aspects are still in motion. We name them rather than hide them: