Import against a local card mirror, and never guess
The way in is a ManaBox CSV export. Each row is matched against a local mirror of Scryfall's card data, and a row that will not resolve is held in a review queue instead of being admitted. A wrong match would carry the wrong printing, price and location into everything downstream, so an ambiguous row waits for a person.
Model the copy, not the card
Finish, condition and language are recorded on each holding rather than on the card, and each copy is placed in a container: a binder page and slot, or a labelled box. That is what lets the app say where a card is, not only whether it is owned.
Price each printing, and keep the history
Prices are refreshed from Scryfall nightly for every individual printing. A daily snapshot of the whole collection's value is stored alongside them, so the trend can be charted from what was recorded rather than reconstructed after the fact.
One search grammar across the whole inventory
A single query language — t:creature c>=WU set:mh3 tradebinder:true, with OR, parentheses, quoted phrases and exclusions — runs over everything a user owns, so a search learned in one place works in every other.
Decks, trades and listings share one inventory
The deck builder, the trade binder and marketplace listings all read from the same holdings. A deck shows what each card costs and which copies are already owned, trades run on friend codes and trade requests, and visibility is chosen per item: public, unlisted or private.
Selling stays in the seller’s hands
Pro accounts connect their own CardTrader and ManaPool seller accounts. Only inventory marked for sale is pushed out as live listings, and every sale is confirmed before a copy leaves the shelf.