Card VaultAI← Home

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.

Jamie Budesky·February 24, 2026·The Vault

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:

  1. 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.
  2. 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.
  3. 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:

  1. Building — which physical site (home office, garage, storage unit).
  2. Furniture — which shelf / drawer / cabinet.
  3. Container — which long box, binder, or storage carton.
  4. Section — which divider within the container.
  5. 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:

MetricWhat I want to see
Cards in RawShould be ≤ 10% of total inventory. Anything more means I'm photographing faster than I'm identifying.
Cards in Identified, not ListedShould be < 200. Anything more means I'm leaving inventory off the market.
Cards Listed, age > 60 daysRe-price candidates. Above 90 days I move them to bulk or relist with a price cut.
Cards Sold but not ShippedShould 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:

  1. Start tracking batches with cost basis. Even on the spreadsheet.
  2. Add a "state" column (Raw / Identified / Listed / Sold).
  3. 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.