Inventory management for card dealers — the 10,000-card mental model
Inventory above 5,000 cards breaks the brain of anyone using a spreadsheet. Here is the mental model that scales — batches, locations, and the four states every card lives in.
Around 3,000-5,000 cards, the spreadsheet starts to break. You forget which long box has the Crown Zenith bulk. You list a card you already sold on another channel two weeks ago. You spend more time finding the card than packing it.
I know because I went through this. I had a Google Sheet that was fine at 800 cards, painful at 2,500, and unusable at 4,000. The way I got past it wasn't better software — it was a better mental model. The software just made the model executable.
This is the model.
The model in one sentence
A card is in a batch, lives at a location, and is in one of four states: Raw, Identified, Listed, or Sold.
That's it. Three nouns, four states. Every card lives at the intersection of those three.
Batches — the unit of work
A batch is a group of cards you processed together. A box from a card show. A binder you bought from a guy on Facebook. A 500-card breakers' lot. The Wednesday-night purge of "let me finally list all those Pikachus."
A batch has:
- A name that means something to you ("2026-05-09 breakers box," "Brian's binder buy," "Pavilion show floor").
- A date it entered the vault.
- A count of cards in it.
- A cost basis (what you paid for the whole batch).
- An acquisition source (LCS, show, online, breakers, gift, found).
Why batches matter:
- Cost basis tracking. If I bought 500 cards for $1,200, my per-card cost is $2.40. I need that number for margin math and for tax season.
- Sourcing pattern analysis. After a year, I can see that breakers' boxes returned 18% margin on average while card-show floor buys returned 34%. That changes my buying behavior.
- Pricing context. A card in the "breakers box" batch is priced to clear because I have hundreds more like it. A card in the "Brian's binder buy" batch is priced patiently because each one was hand-picked for value.
In the vault, batches are first-class. Every card belongs to exactly one. You can filter your entire inventory by batch.
Locations — five dimensions
Once you cross 2,000 cards, a single "box number" stops scaling. I use a five-dimension location system that anyone can adopt:
- Building — which physical site (home office, garage, storage unit).
- Furniture — which shelf / drawer / cabinet.
- Container — which long box, binder, or storage carton.
- Section — which divider within the container.
- Position — the index within that section.
A location string looks like: home/shelf-A/box-12/section-C/position-47.
This sounds excessive at 500 cards. It's exactly right at 5,000. Above 10,000, it's the only thing that lets you find a card in under 90 seconds when a buyer pays.
Two operational rules:
- Cards don't move without an update. If I pull a card to ship and put a replacement card in the slot, the replacement gets the now-empty location. The vault enforces this with a single "move" action.
- Locations are reusable, not permanent. When a card sells, its location becomes available for the next card going into that batch.
The four states
Every card is in exactly one of these states. There are no in-betweens.
State 1 — Raw
The card exists physically but isn't in the vault yet. It might be photographed but not identified. It might not even be photographed.
What's true:
- I can't ship it (I don't know what it is).
- I can't price it (the AI hasn't run yet).
- I can't list it.
What I can do:
- Move it to a batch.
- Photograph it.
- Sort it (sorting is the cheap, valuable work that sets up everything downstream).
Cards typically spend hours-to-days in Raw. The goal is to move them to Identified fast.
State 2 — Identified
The AI has run. The card has a set, number, parallel, rarity, condition (assumed NM unless overridden), and a suggested price. It's not on the market yet.
What's true:
- I know what it is and what it should sell for.
- It's in my inventory database, but a marketplace shopper can't see it.
What I do here:
- Review the title / price / category. The AI is right 97-98% of the time on confident matches. The 2-3% wrong calls I catch in the inspector.
- Decide channel routing: eBay today (live), with TCGPlayer / Whatnot / CollX / Shopify queued for the day each integration ships. For now, "eBay only" or "eBay + flag for [other channel]" with manual export.
- Decide listing format: BIN, BIN with Best Offer, auction, fixed-price with Promoted Listing.
Cards can sit in Identified for a long time on purpose. If I'm building inventory for a Whatnot show three weeks out, I'll keep the show cards in Identified until two days before stream so I'm not double-listed.
State 3 — Listed
The card is live on at least one marketplace. Buyer can see it. Buyer can buy it.
What's true:
- I have channels to monitor for sales.
- The card might sell on any of them at any time.
- I need cross-channel conflict detection or I will, at some point, double-sell.
The vault tracks listed-on-which-channels per card. The conflict-resolution daemon — pull the listing from other channels when one sells, with a 60-second conflict window — is built and shipping on the eBay leg today. As Phase 5 multi-channel ships, the daemon activates per-channel automatically.
State 4 — Sold
The card has sold. It needs to ship. After it ships, the cost basis is realized and the margin is calculated.
What's true:
- I owe a buyer a card by some shipping deadline.
- The card needs to leave its location, get sleeved/top-loaded, get into an envelope or bubble mailer, and get tracking applied.
What I do:
- Print the label (the vault talks to a Dymo 30334 over PrintNode).
- Pull the card from its location (the location string is on the label).
- Sleeve / top-load.
- Drop in the mailer.
- Mark shipped.
A card stays in Sold until delivery confirms, then moves to an archive state for tax / reporting purposes.
The state diagram
[Raw] → [Identified] → [Listed] → [Sold] → [Archive]
↓ (manual edit)
← [back to Raw if AI mismatch is catastrophic]Most cards flow Raw → Identified → Listed → Sold linearly. Some cards loop: a card listed for 90 days at $50 might get re-priced and re-listed; it stays in Listed but the state internals change.
A small number of cards skip stages: a slab with a known cert number bypasses Identified because the grading API returns the card spec directly. A bulk lot of $0.10 commons might skip Listed entirely if I dump them to a card-show bulk buyer.
The dashboard view
What I look at every morning:
| Metric | What I want to see |
|---|---|
| Cards in Raw | Should be ≤ 10% of total inventory. Anything more means I'm photographing faster than I'm identifying. |
| Cards in Identified, not Listed | Should be < 200. Anything more means I'm leaving inventory off the market. |
| Cards Listed, age > 60 days | Re-price candidates. Above 90 days I move them to bulk or relist with a price cut. |
| Cards Sold but not Shipped | Should be 0 at end of day. |
| Inventory turn (last 30 days) | Sold count / total inventory. Target: 8-15%/month for my mix. |
These five numbers describe the health of the operation. I can be away from the desk for 12 hours and tell whether things are in order in about 30 seconds.
The 10,000-card threshold
There's a specific size where the mental model becomes load-bearing instead of optional: about 5,000 active listings or 10,000 total cards including unlisted inventory.
Below that, you can muddle through with spreadsheets and a long memory.
Above that, you cannot. The number of items in flight at any given moment exceeds working memory, and your error rate on shipping, pricing, and cross-channel conflicts spikes. The mental model isn't theory — it's a survival tool.
What changes above 10,000:
- You can't sort by memory. You need indexed search across the entire inventory in under 200ms.
- You can't catch double-listings by eye. You need the conflict-resolution daemon.
- You can't reconstruct cost basis from receipts. Batches with cost-basis fields are the only honest way to do margin math.
- You can't physically find a card in 30 seconds without locations. You'll spend an hour a day looking for cards that buyers have paid for.
I'm at about 11,400 cards across active inventory + unlisted bulk as of this morning. The model holds.
How to adopt this if you're starting cold
If you're at 500 cards on a spreadsheet, you don't need any of this yet. Use the spreadsheet.
If you're at 2,000 and feeling friction:
- Start tracking batches with cost basis. Even on the spreadsheet.
- Add a "state" column (Raw / Identified / Listed / Sold).
- Add a location string column (any format, just be consistent).
If you're at 5,000 and the spreadsheet is broken:
- It's time. Move into actual inventory software. (You knew this was coming.)
- Pick something that lets you keep your batches / states / locations conceptually. Don't pick something that forces you to think in its abstractions.
- One-day migration. One-day adjustment. Two days to feel like the vault is yours.
— Jamie
The vault implements this exact model — batches, locations, four states, conflict daemon. The mental model came first; the software came second. Both ship at every tier.