Pricing
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 two inputs
The dormant/internal calculation starts from two inputs captured at the same moment. The method is public; the underlying observations and results are not.
- JPY listing price — what the card is listed at on CardRush, in Japanese yen. Read once a day, then frozen for 24 hours.
- GBP/JPY rate — our view of the exchange rate at the moment of capture. Stored alongside the JPY value, so that the rate used to compute today's prices is the rate we wrote them with — not the rate at the moment you happen to be reading.
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.
The channel multipliers
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 uses banker's-style nearest-rounding (JavaScript's Math.round); a preRound value of £5.14 with a roundTo of £0.10 yields £5.10, not £5.20.
The channels (internal or historical; none publicly priced)
| 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 we-buy desk closed 2026-07-06 — zero trade-ins were ever submitted — so these rows price nothing now; they are kept 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.
Worked example
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.
Freshness
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.
A null public price is the source-rights boundary, not a claim that the value is zero, stale, or temporarily unavailable.
What changes an internal stored value
- The daily snapshot found a new CardRush price. Most common. The cron at 02:00 UTC scrapes CardRush, pairs it with the current exchange rate, runs the formula, and writes a new row. Logged with
action = "snapshot". - An admin edited the price manually. Rare. Logged with
action = "admin_edit"and the operator's email. - The CSV upload sync ran. Bulk imports through the admin CSV path produce the same effect as a daily snapshot for the affected cards.
- The exchange rate moved overnight. Even if the JPY price is unchanged, a different rate produces a different GBP base.
What does not affect the internal formula
- Who is looking at it. The public boundary withholds the legacy value for everyone.
- Stock level. Low-stock cards do not auto-mark-up; high-stock cards do not auto-discount.
- Account standing or trust score. These affect commission and escrow routing, not the retail price.
Verifying the documented formula
The formula can be reproduced from hypothetical or independently licensed inputs:
- A JPY input you have the right to use; public card pages do not expose the stored CardRush value.
- The GBP/JPY rate on the snapshot date.
- The cambridgetcg channel constants in the table above.
- The formula above.
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 contact@cambridgetcg.com with the SKU and the snapshot date and we'll investigate.
Open changes
Some pricing aspects are still in motion. We name them rather than hide them:
- Channel parity is operator-set, not algorithmic. The eBay-vs-cambridgetcg-vs-Shopify multiplier difference is policy, not derived.