S&T Card Manager — User Guide

Edition 4.0 · August 29, 2026

Everything the app does, in the order you would actually do it: put cards in, price them, sell them, reconcile the money, and keep the books honest. Every screen in this guide is drawn from the live app, with the exact button labels and messages you will see on screen. Screens and examples show the example organization “BK Cards 71”; your organization’s name appears in its place.

1Quick start

S&T Card Manager is one database with five front doors. Which door you use depends on what you are doing — showing cards off, working the inventory, running the books, or feeding new cards in.

1.1The five tabs

The tab bar sits in the sticky header and never scrolls away. Each tab has its own accent colour, and that colour follows you through the whole screen — amber means Ledger, teal means Collection, and so on.

BK Cards 71 CARD MANAGER COLLECTION FINANCIALS ACCOUNTING LEDGER SCAN 🛡 Clean ? Kevin partner Sign Out 1 2 3 4 1 · The active tab is the one whose bottom edge merges into the page — the accent bar runs across its top. 2 · The integrity badge. Always visible. Click it to jump straight to the Integrity tab. 3 · “?” is the one entrance to Help & Support — guides, issue reports, and your password. 4 · The gear opens the Admin Console. (Its tooltip still reads “Settings (coming soon)” — ignore it, the console works.) Financials and Accounting appear only if your account has finance access.
Figure 1 — The app header: wordmark, five folder tabs, integrity badge, Help, gear, your name, role chip and Sign Out.
TabColourWhat it is forWho sees it
CollectiontealThe showcase. Big card images, price, grade badges. Read-only — nothing is edited here.Everyone. It is the landing tab.
FinancialsvioletExecutive dashboard for the card business: revenue, COGS, gross profit, ROI, aging, dead money, grading lift.Finance access only
AccountingemeraldThe books: the non-card expense ledger, the P&L, the partner capital waterfall, tax schedule, distributions.Finance access only
LedgeramberThe card inventory grid — 64 columns, filters, saved views, editing, selling, CSV export.Everyone
ScanskyIntake. Photograph a shoebox or paste PSA certs; AI proposes what each card is; you approve.Everyone can upload; managers scan and bring in
Naming note Two tabs are named differently in the code from what you see on screen, and one word is used for two different things. The tab labelled Financials is built from a file called Insights, and its page heading still reads Executive Dashboard. The tab labelled Accounting still shows the heading Finances, and it contains a sub-view also called Ledger — that inner Ledger is the non-card expense register, nothing to do with the card grid on the Ledger tab. When this guide says "the Ledger" without qualification, it means the card grid.

1.2Ten things, ten clicks

You want to…Do this
Record a saleLedger → click the card's name → Status = Sold → platform → total + net → Proceeds To → Confirm Sale
Sell a stack as one lotLedger → Select to Sell → tick the cards → Sell N selected →
Price a stack for a showLedger → filter down to the stack → read the live rollup line: You have $X across N cards
Add one card by handLedger → + Add Card → fill in → Save → then attach a photo
Turn a shoebox into inventoryScan → upload → pairs/fronts → Scan selected → review → Bring into App
Month-end eBayGear → Data Import → eBay → Sales → drop the orders report → review buckets → Bring in N sale(s)
Fix a bad number everywhereGear → Bulk Edit → filter → select → Edit selected
See what the business owes youAccounting → Statements → Total Owed (All Sources)
See where the books are wrongClick the integrity badge in the header
Totals look staleHard-refresh (Cmd/Ctrl + Shift + R) — the app caches aggressively for speed

1.3House rules the app enforces

2Signing in & accounts

2.1Sign in

One screen, two fields. The error message you see on a failed attempt is passed straight through from the authentication service, so Invalid login credentials is its wording, not ours.

BK Cards 71 Sign in EMAIL kevin@bkcards71.com PASSWORD •••••••••• Sign In 1 Amber focus ring = the login accent There is no “forgot password” link here — a manager sends you a reset from the Admin Console.
Figure 2 — The sign-in screen. Amber is the login accent; the same amber appears on your role chip in the header.

2.2Setting or changing a password

You will meet the password screen in three ways: from an invitation e-mail, from a reset e-mail a manager sent you, or from Help & Support → Account → Password → Change password….

Four rules, shown live as you type. Each turns from to a green as it is satisfied:

  1. At least 8 characters
  2. One uppercase letter
  3. One lowercase letter
  4. One number

There is no symbol requirement and no maximum length. If the two boxes differ you get Passwords do not match.; if a rule fails, Password does not meet the requirements.

BK Cards 71 SET YOUR PASSWORD NEW PASSWORD ••••••••••• ✓ At least 8 characters ✓ One uppercase letter ✓ One lowercase letter ○ One number CONFIRM PASSWORD Set password On success the form is replaced by “Password set. Signing you in…” and the token is stripped from the URL, so a refresh cannot re-trigger the screen.
Figure 3 — Setting a password. The checklist updates on every keystroke; all four rules must be green.

2.3Roles and what they unlock

There are five roles. Three of them — Company, Partner, Admin — are collectively "managers" and can do everything. Finance access is automatic for managers and is a per-person switch for everyone else.

RoleMeaningManage users & dropdownsEdit cardsFinancials & Accounting
CompanyBKCards71 — the entityYesYesAlways
PartnerFull access, manages usersYesYesAlways
AdminFull access, manages usersYesYesAlways
UserCan edit cardsNoYesOnly if the finance switch is on
ViewerRead-onlyNoNoOnly if the finance switch is on

Your role is printed in the header as a lowercase mono chip beside your name — literally partner, admin, viewer and so on.

Guardrail If you do not have finance access, the Financials and Accounting tabs are not rendered at all — there is no greyed-out tab to tempt you, and forcing the address does not mount the view either. Permanent deletion of a person is also gated: only User and Viewer accounts can ever be deleted, and only when no card references them.

2.4The account status ladder

Every person's account moves through a documented ladder. You will see these words on the Users tab.

StatusHow you get thereCan sign in?
invitedA manager sent an invitationOnly via the invite link
acceptedThe invitee set a password (a manager pressing Refresh on the Users tab confirms it)Yes
activeThey signed in and the app actually loadedYes
suspendedA manager suspended themNo — banned until reactivated
removedA manager removed the login; the accounting identity survivesNo login exists

Suspended and removed accounts are also rejected by the server on any privileged action, with Account is not active.

3The app shell

The header is sticky: the tabs, your identity, the health light and Sign Out stay on screen no matter how far a view scrolls.

3.1The header, left to right

  1. WordmarkS&T Card Manager over the small caps line CARD MANAGER.
  2. The five folder tabs (see 3.2).
  3. The integrity badge — the health light (3.3).
  4. ? — Help & Support. Every role sees it.
  5. — the Admin Console.
  6. Your name and the amber role chip.
  7. Sign Out — no confirmation; you drop straight back to the sign-in screen.

There is deliberately no password control in the header. Password changes live inside Help & Support, under Account.

3.2The tab bar

All tabs sit on one baseline — selecting a tab never makes it hop. The active tab is painted in its accent colour, wears a 3-pixel accent bar across the top, and its bottom edge merges into the page below. Inactive tabs sit slightly dimmed. Hovering any tab shows Go to Ledger, Go to Scan, and so on.

Switching tabs does not re-fetch your cards. The whole inventory is loaded once when you sign in and shared by every view — which is exactly why an edit made in the Ledger instantly changes the numbers on Financials and Accounting.

3.3The integrity badge — your health light

The badge is always visible, on purpose. An earlier draft hid itself when everything was clean; that was wrong, because a badge that disappears cannot be told apart from a badge that broke. Green has to be shown as loudly as red.

It is driven by severity, not volume. One contradiction lights it red no matter how many amber items sit behind it. It is deliberately not a percentage — twelve broken records against 3,000 cards would read as 0.4% and look green while the books were wrong.

THE FOUR STATES (PLUS ONE SETTLING STATE) 🛡 Clean Every invariant reads zero. “Books clean — no sale-money residue, no status/disposition conflicts, every sold card attributable.” ⚠ 7 Needs attention — incomplete, not wrong. Sold cards with no platform or no sale year. The money is right; the metadata is not. ⛔ 3 Books broken — a contradiction. Sale money on an unsold card, or a status that disagrees with its Sale Type. Fix this first. ? — Check unavailable. The check itself failed. Reported honestly rather than shown as a false all-clear. ? ·· First run in flight — “Checking integrity…”. The slot is held so the header never jumps.
Figure 4 — The integrity badge. Four silhouettes — shield, triangle, octagon, question mark — so the state reads at a glance even in grayscale.

Hovering the badge lists exactly what is wrong, one line per non-zero item, in the form 2 × Sale data on a card that isn't sold. Clicking it opens the Admin Console already on its Integrity tab — the gear means "settings", the badge means "show me the problem". When you close the console, the check re-runs, because that is where the fixes happen.

The badge watches exactly three things (full detail in 15.7):

Watched itemSeverityWhat it means
Sale data on a card that isn't soldbrokenA half-reversed sale — phantom revenue, or a hole where revenue should be.
Status and disposition disagreebrokenThe Status says one thing and the Sale Type says another.
Sold, missing platform or sale yearattentionRevenue that cannot be attributed. Losses and gifts are excluded — they are legitimately $0 with no platform.
Guardrail Archived and deleted cards can never light the badge. And if the disposition lookup cannot be read, the badge reports unknown rather than either a false all-clear or a screen full of false alarms.

3.4Help and the gear

? opens the Help & Support overlay (see §16) — guides, issue and feature forms, contact, and your password. Clicking the dark backdrop closes it.

opens the Admin Console. Its tooltip still reads Settings (coming soon) — that string is simply out of date; the console is fully built. Anybody can press the gear, but a non-manager sees only their own My Account profile pane. Everything else is manager-only and is gated again on the server.

4Collection

The showcase — an image-first gallery, teal, and the front door of the app. It is a pure show-off surface: the only "insight" is the stat line in the header. Nothing is edited here.

4.1Grid and list

A segmented control at top left switches between Grid view (a 2/3/4-column photo grid depending on screen width) and List view (a compact row with a thumbnail). Beside it, a search box: Search items — player, set, year, brand…. Search matches card id, description, player, cert number, brand, card type, card year, grader and location — a plain substring match, no fuzzy logic.

Search items — player, set, year, brand… FOR SALE 1,125 $75.6K NOT FOR SALE 28 $3.1K SOLD 822 $85.4K Sort: All ▾ For Sale Not For Sale Sold Price: All ▾ Graded Rookie Autographed Category: All ▾ Year: All ▾ × Clear 1,125 cards 2024 PSA 10 Case A2 card image 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PINK /399 $184.00 2023 SOLD SGC 8 card image 2023 BOWMAN CHROME PROSPECTS #BCP44 JACKSON HOLLIDAY $412.75 2021 RAW card image 2021 PANINI PRIZM #325 JOSH ALLEN SILVER No price set 2020 PSA 9 card image 2020 TOPPS CHROME #201 BO BICHETTE RC $64.50 1 2 3 4 1 · Year badge, top-left. Every card of the same year wears the same neon colour. 2 · Grade badge, bottom-left — colour-laddered by grade (10 emerald, 9 teal, 8 sky, 6–7 amber, below 6 orange, RAW slate). 3 · SOLD badge, top-right — only on sold cards. 4 · Show-location badge, bottom-right — “Case A2” or “Bin 3, B, 12”, only when a location is set. Cards with no photo show the built-in BK placeholder (“BK / Cards 71 / No photo yet”) — it never fails to load.
Figure 5 — Collection, grid view: sticky control region, the three stat blocks, and four tiles with their corner badges.

4.2The filter rail

The rail scrolls sideways on a phone and always keeps this order:

ControlOptions
SortNewest added (default) · Player A–Z · Year (newest) · Year (oldest) · Price (high → low) · Price (low → high) · Sold for (high → low) · Sold for (low → high) · Grade (high → low)
Status pillsFor Sale · Not For Sale · Sold — independent toggles, not a radio group. They union together.
PriceUnder $15 · $15 – 25 · $25 – 50 · $50 – 100 · Over $100
Attribute pillsGraded · Rookie · Autographed
Category / YearBuilt from what you actually hold — categories alphabetically, years newest first
× ClearAppears only when something is filtered. Resets search, price, status, the three attribute pills, category and year — but not the sort or the grid/list choice.

Collection opens showing only for-sale cards. Turning all three status pills off falls back to "everything held except Sold" rather than showing an empty screen. Archived cards never appear in Collection at all — there is no archived view here.

How Rookie and Autograph are decided here Collection reads them out of the card's description text ("RC", "(RC)", "rookie"; anything starting "auto"), not from the database flags. They are only as good as the card name. The Ledger's Rookie / Auto / Relic columns are the real stored flags.

4.3Badges, prices, stat blocks

A tile shows the description on two lines and a price beneath it. The price is the sold price for a sold card and the asking price otherwise; with neither, the line reads No price set in grey italics. List rows omit the price line entirely when there is none.

The three stat blocks in the header are computed over everything you hold:

That asymmetry is intentional: unsold positions are worth what you paid, sold ones are worth what you got.

4.4The flip-card detail

Clicking any tile or row opens a read-only detail modal. The left half is a card that flips in 3D when clicked — every card flips, whether or not it has a back photo; without one the back face shows the placeholder No back photo / yet available. A teal hint pill reads Click card to flip, then Back · click to flip.

card front image PSA 10 Click card to flip CARD #1042 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PINK /399 $184.00 asking Rookie Autograph StatusFor Sale PlayerLuis Arraez Year2024 CategoryBaseball BrandTopps GradePSA 10 Cert #104214318 LocationMonroe Edit details in the Ledger view. Close ×
Figure 6 — The Collection detail modal. Strictly read-only: the footer hint “Edit details in the Ledger view.” is the entire editing story here.

The right half lists only facts that exist — any blank row is dropped entirely. The price line reads one of three ways: $412.75 sold, $184.00 asking, or No asking price set.

5Ledger — the card grid

The Ledger is where the work happens. Every card the business has ever owned lives here, in a grid of up to 64 columns with 57 filters, saved layouts, live money totals, and one click into the full card editor.

5.1Anatomy of the screen

Top to bottom: a toolbar, the KPI band, the filter row (status facet, card-type chips, the live rollup), the grid itself, and a sticky footer carrying the row count and the data-integrity badge.

Search ID, description, player, cert, brand… VIEW Show floor ▾ + Add Card Select to Sell Recent Sales Export View CSV Export Full DB CSV NET RETURN TOTAL -$4,717.42 CARDS SOLD 822 TOTAL SOLD $ $85,426.58 INVENTORY COUNT 1,125 MONEY IN INVENTORY $75,603.83 YEARS SOLD All 2025 2026 Status All 1,958 For Sale 1,125 Not For Sale 28 Sold 822 Archived 15 | You have $12.4K across 184 cards ☐ Show archived (15) Available: 1,125 Baseball: 642 · $41.2K Football: 288 · $19.8K Basketball: 141 · $9.6K ITEM IDENTITY STATUS & LOCATION GRADING COSTS VALUATION ID ▲ ⏷ CARD NAME STATUS ⏷ LOCATION ⏷ GRADE ⏷ CERT TOTAL COST ⏷ ASKING ⏷ NET RETURN ⏷ 1042 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PINK /399 For Sale Monroe10 Pristine 104214318 $96.40 $184.00 1043 2023 BOWMAN CHROME PROSPECTS #BCP44 JACKSON HOLLIDAY Sold 8 0278119 $310.15 $425.00 $102.60 1044 2021 PANINI PRIZM #325 JOSH ALLEN SILVER Not For Sale Safe $45.00 set price 1045 2020 TOPPS CHROME #201 BO BICHETTE RC For Sale Show box 29 88214077 $52.75 $64.50 1046 2019 PANINI DONRUSS OPTIC #158 JA MORANT RC HOLO Sold 9.5 61120944 $188.00 $150.00 -$47.35 Showing 1,958 of 1,958 live rows. ✓ Data integrity · 1,958 live 1 2 3 4 5
Figure 7 — The Ledger, whole screen. 1 saved view · 2 Years Sold toggles · 3 the live filtered rollup · 4 the frozen ID + Card Name pair, with the grouped category band above · 5 the data-integrity count.

5.2The toolbar

ControlWhat it does
Search boxMatches seven fields — ID, SKU, description, player, cert number, brand, card type. (The placeholder only advertises five; SKU and card type are searched too.)
View nameOpens Columns & Views. Reads Built-in view until you apply a saved one.
+ Add CardOpens the card editor empty, in insert mode, defaulted to For Sale.
Select to SellTurns on multi-select for a lot sale. Becomes Done selecting.
Recent SalesAll sold cards, newest first, sortable — unaffected by every grid filter.
Export View CSVExports exactly what you are looking at, post-filter and post-sort.
Export Full DB CSVPulls the entire database live, including archived rows.
Show archived (n)Far right. Appears only when archived cards exist.

5.3The KPI band

Every KPI is whole-dataset. The tiles are computed over every live (non-archived) card and are completely independent of your search, chips and column filters. That is deliberate: the headline never silently changes meaning under you. Filtered numbers appear separately, in the rollup line (5.6).

NET RETURN TOTAL -$4,717.42 2025: -$6.1K 2026: $1.4K CARDS SOLD 822 2025: 582 2026: 240 TOTAL SOLD $ $85,426.58 2025: $58.9K 2026: $26.5K INVENTORY COUNT 1,125 MONEY IN INVENTORY $75,603.83 NOT FOR SALE 28 · $3,142 BK: 12 ($1.4K) Kevin: 9 Brian: 7 Year toggles scope the first three tiles only. Inventory Count, Money in Inventory and Not For Sale are point-in-time — a card in stock today has no sale year, so a year filter would be meaningless for it. Not For Sale renders only when the count is above zero, and always carries an owner split.
Figure 8 — The KPI band with two years enabled. Per-year sub-lines appear whenever more than one year is showing.
TileWhat it countsFollows the year toggles?
Net Return TotalSum of Net Return over sold, non-archived cards. Red below zero, green above.Yes
Cards SoldCount of sold, non-archived cards.Yes
Total Sold $Sum of the sale proceeds on those cards.Yes
Inventory CountCards in for-sale inventory. Excludes sold, archived and Not-For-Sale.No
Money in InventoryTotal Cost of that same set — what you are into the stock for.No
Not For SaleCount · cost of the keeper pile, split by owner (BK, Kevin, Brian, then anyone else).No

Years Sold toggles

At the right of the band. All resets to every year. Clicking a single year from the "All" state narrows to just that year; after that each click adds or removes a year.

Guardrail Deselecting the last remaining year silently falls back to all years. You can never end up staring at an empty KPI band.

5.4Columns & Views

The View … ▾ button opens one popup that does two jobs: choose which of the 64 columns are visible, and save that arrangement as a named view you can come back to.

Columns & Views 34 shown Reset to built-in × MY VIEWS ★ marks the view that loads automatically when you open the app. Show floor • active Delete Sales only Delete Grading queue Delete Name this view (e.g. Sales only)… Save current Saved “Show floor” ✓ ITEM ☑ ID (locked) ☑ Card Name (locked) IDENTITY ☐ Player ☑ Card Year ☑ Brand ☐ Item Type ☑ Card Type ☐ Set ☐ Subset ☐ Parallel ☑ SKU STATUS & LOCATION ☑ Status ☑ Location ☑ Listed On ☐ Showcase ☐ Damaged COSTS ☑ Grade Fee ☑ Base Cost ☐ Tax ☐ Shipping ☐ Handling ☑ Total Cost 1 2 3
Figure 9 — Columns & Views. 1 the star sets your default view · 2 save the current layout under a name · 3 ID and Card Name are locked and cannot be unticked.
  1. Set the grid up the way you want it — tick columns, drag widths, click a header to sort.
  2. Open View … ▾, type a name in the box, press Save current. You get Saved "Show floor" ✓ in green.
  3. Click the beside a view to make it your default — it becomes and that layout loads automatically next time you open the app.
  4. Click a view's name to apply it (Applied "Sales only"); Delete removes it.
  5. Reset to built-in restores the 34-column default layout, re-fits every column to its content and sorts by ID.
What a saved view stores Only the layout: which columns are visible, their widths, and the sort. Filters, search text, the card-type chip, the status facet, the photo filter and “Show archived” are not saved — a view called "Sales only" still needs its filters set by hand. Saving under an existing name updates that view rather than making a duplicate, and each partner has their own views and their own single default.
Column order is not user-controllable The moment you tick or untick any column, the grid re-orders itself into the canonical column order shown in 5.5. Applying a saved view does the same. So a view remembers which columns you had, not the order you dragged them into.

5.5All 64 columns

Columns live in nine coloured groups, and the group band above the header shows which is which. The 34 marked Default below are the ones the built-in view shows. "Filter" tells you what kind of funnel that column's header offers.

#ColumnGroupFilterDefaultNotes
1IDItemPhoto coverageFrozen and locked. Its funnel is the Has Photo / No Photo filter. Hovering pops the card image.
2Card NameItemFrozen and locked. Click it to open the card editor.
3PlayerIdentitySearchable, not filterable
4Card YearIdentityMin–maxType 2024 in both boxes to pick one year
5BrandIdentityChecklistFrom the managed Brand dropdown
6Item TypeIdentityChecklistThe card_types lookup
7Card TypeIdentityChecklistThe sports lookup — Baseball, Football, … This is what the chips filter
8SetIdentityChecklistSet/product name only, no year or brand
9SubsetIdentityChecklist
10ParallelIdentityChecklist
11Card NumberIdentityChecklist
12Intake TitleIdentityChecklistThe name the card arrived with
13Intake SourceIdentityChecklistscan, ebay, cdp-inventory, psa_return, app, reintake
14Name SourceIdentityChecklistcanonical, intake, user, grader
15Print RunIdentityMin–maxRenders as /399
16RookieIdentityChecklist (Yes/No)Amber badge
17AutoIdentityChecklist (Yes/No)Sky badge
18RelicIdentityChecklist (Yes/No)Fuchsia badge
19Name LockedIdentityChecklist (Yes/No)Locked names are skipped by Generate names
20SKUIdentityChecklistThe importers' match key
21Listing NameIdentityChecklistThe title used on the marketplace
22Purchase NameIdentityChecklist
23CDP NameIdentityChecklistCard Dealer Pro's title
24StatusStatus & LocationChecklistPill: Sold / For Sale / Not For Sale
25LocationStatus & LocationChecklistWhere the card physically is
26Listed OnStatus & LocationChecklist (multi)A card can be listed in several places; a row passes if any ticked platform matches
27ShowcaseStatus & Location— (none)Sortable only — there is no funnel on this column
28DamagedStatus & Location— (none)Shows ⚠ Damaged; hover for the damage note. Sortable only
29Purchase DateAcquisitionSortable, not filterable
30Purchase YearAcquisitionMin–max
31Purchase PlatformAcquisitionChecklist
32Owned ByAcquisitionChecklistProfit follows ownership
33Paid ByAcquisitionChecklistCost recovery and losses follow the wallet
34Pay MethodAcquisitionChecklist
35Platform Purchase Order IDAcquisitionChecklistThe buy-side order number
36GraderGradingChecklistPSA / SGC / BGS / …
37GradeGradingChecklistShown combined, e.g. 10 Pristine; sorts numerically
38Cert NumberGradingSearchable, not filterable. The photo importers' join key
39PSA Order #GradingChecklist
40Grading Paid ByGradingChecklistDrives the cross-partner grading rows in the waterfall
41Grade FeeCostsMin–max
42Base CostCostsMin–maxWhat you paid for the card itself
43TaxCostsMin–max
44ShippingCostsMin–maxInbound shipping you paid
45HandlingCostsMin–maxAlso where return costs land after a refund
46Total CostCostsMin–maxCalculated: base + tax + shipping + handling + grade fee
47Comp As IsValuationMin–maxWhat it comps at in its current state
48Projected Profit As-IsValuationMin–maxCalculated: comp − total cost. Red/green
49Expected Sale (10)ValuationMin–maxWhat it would fetch as a 10
50Projected Profit (10)ValuationMin–maxCalculated. Red/green
51Asking PriceValuationMin–maxA blank asking price sorts and filters as 0, so a 0…0 range finds every unpriced card
52Projected Profit (Sale)ValuationMin–maxCalculated. With no asking price it reads set price rather than a fake number
53Sale TypeSaleChecklistThe disposition — Sold – Straight Sale, Gifted, Lost, …
54Date SoldSaleSortable, not filterable
55Year SoldSaleMin–maxDrives the tax buckets
56Sold PlatformSaleChecklistFB displays as Facebook
57Proceeds ToSaleChecklistWhich account the money landed in
58Platform Sale Order IDSaleChecklistTraceability back to eBay/CollX
59Platform Sale Item IDSaleChecklisteBay item number — stamped by the Listings importer
60Sold PriceSaleMin–maxThe gross the platform reported
61Net ProceedsSaleMin–maxWhat actually landed after fees
62Net ReturnSaleMin–maxCalculated: net proceeds + shipping margin − total cost. Blank on anything not sold
63HomeStorage LocationChecklistWhere it lives when it is not at a show
64ShowStorage LocationChecklistDerived: Case A2 or Bin 3, B, 12
Guardrails in the columns themselves Net Return is suppressed for anything not sold — blank in the grid, sinks to the bottom on sort, excluded from its own range filter, and blank in the CSV. A card carrying a stale net return can never leak into a total. Projected Profit (Sale) never shows a number computed against a missing asking price. Blank values always sort last, in both directions.
Two names, three money columns Sold Price is the gross the platform reported. Net Proceeds is what you actually received. Net Return is profit. The Total Sold $ KPI sums the proceeds figure, so on a card where gross and net differ, the column and the KPI describe different things by design.

5.6All 57 filters

Filters stack in a fixed order — archive scope, then search, then the status facet, then the card-type chip, then the photo funnel, then each column funnel. Everything ANDs across filters; within one funnel, the ticked values OR.

FilterCountWhere
Global search fields7Toolbar box
Status facet buttons5All / For Sale / Not For Sale / Sold / Archived
Card-type chips1 + NAvailable plus one per card type in stock
Photo-coverage funnel1On the ID column header
Per-column checklist funnels37Column headers
Per-column min–max funnels19Column headers (numeric columns)
Show archived1Far right of the toolbar
× Clear all filters1Appears only when something is filtered

Status facet and card-type chips

Status All 1,958 For Sale 1,125 Not For Sale 28 Sold 822 Archived 15 Has Photo 1,004 × | You have $12.4K across 184 cards × Clear all filters Available: 1,125 Baseball: 642 · $41.2K Football: 288 · $19.8K Basketball: 141 · $9.6K Hockey: 38 · $2.1K Pokémon: 16 · $1.8K 1 2 3 4 1 · Facets are mutually exclusive and click-again-to-clear. Counts reflect the current search. 2 · When the photo funnel is narrowed, an echo pill appears here — click it to reset to all. 3 · The rollup is facet-aware: under Sold it totals sale proceeds, under For Sale it totals cost basis. 4 · “Available” always equals the sum of the per-type chips — count and dollars describe the same set. Sold, Not-For-Sale and archived cards never appear in a card-type chip.
Figure 10 — The filter row: status facet, active-photo echo pill, the live rollup callout, and the card-type chips with their money badges.

Column funnels

Every filterable column header carries a small funnel icon. It turns amber when that column is filtering, and the photo funnel turns teal. Clicking the funnel opens the popover; clicking the header label still sorts.

CHECKLIST FUNNEL — 37 COLUMNS Sold Platform All Clear × ☑ eBay ☑ CollX ☐ Facebook ☐ Whatnot ☐ Card Show ☐ Private Sale ☐ (none) 2 selected Apply MIN–MAX FUNNEL — 19 NUMERIC COLUMNS Asking Price Clear × Min 100 Max Leave a box blank for open-ended. Apply PHOTO COVERAGE — ON THE ID COLUMN Photo coverage Clear × ☑ Has Photo 1,004 ☑ No Photo 954 Counts reflect the current search. Clicking the ID label still sorts. Enter in either box applies. Bounds are inclusive, and a card with no value in that column is excluded as soon as either bound is set — a blank cannot satisfy a range. Trick: Asking Price min 0 / max 0 finds every unpriced for-sale card, because a blank asking price counts as zero. Ticking everything (or nothing) in a checklist is treated as “no filter”.
Figure 11 — The three kinds of funnel: a value checklist, a numeric min–max range, and the photo-coverage filter that lives on the ID column.
One sharp edge In the photo funnel, unticking both boxes shows zero rows, not everything. The echo pill in the status row does label that state honestly — No Photos Shown 0 — so if the grid goes empty, look there first.

Clearing filters

× Clear all filters appears on the right of the status row whenever anything is filtering. It resets the search, the status facet, the card-type chip, the photo funnel and every column funnel. It deliberately leaves your columns, widths, sort, active saved view and the "Show archived" tick alone.

5.7Sorting, resizing, freezing

5.8Rows: hover, open, select

HOVER THE ID CELL 1042 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ 1043 2023 BOWMAN CHROME PROSPECTS #BCP44 HOLLIDAY card image A 200 × 280 preview follows the cursor. It flips to the other side of the cell rather than running off screen, and cards with no photo show the BK placeholder. Click the Card Name instead and the full editor opens. SELECT TO SELL 4 selected Select all 184 in view Clear Sell 4 selected → Exit
Figure 12 — Hovering an ID pops the card image; clicking a Card Name opens the editor. In select mode the ID column grows a checkbox and the emerald banner appears.

In select mode, clicking a row toggles its checkbox instead of opening the editor, and the hover preview is switched off. Your selection is stored by card id, so it survives filtering, sorting and scrolling — you can select five cards, change the filter completely, and select five more.

5.9Recent Sales

A violet modal listing every sold card, newest first, completely independent of the grid's filters. Useful for "what did we sell last week" without disturbing your working view.

Recent Sales 822 sold · net $85,426.58 Filter by card, id, platform… × DATE SOLD ▼ YEAR CARD GROSS NET SALE PROFIT PLATFORM 2026-08-192026 #10432023 BOWMAN CHROME PROSPECTS #BCP44 JACKSON HOLLIDAY $425.00 $372.60 $102.60 eBay 2026-08-172026 #10462019 PANINI DONRUSS OPTIC #158 JA MORANT RC HOLO $150.00 $140.65 -$47.35 CollX 2026-08-142026 #09182022 TOPPS UPDATE #US47 JULIO RODRIGUEZ RC $88.00 $76.72 $21.14 Facebook 2026-08-112026 #07712018 PANINI PRIZM #12 LUKA DONCIC RC $0.00 -$212.00 🎁 gift Click any card to close this modal and open it in the editor. Sortable by Date Sold, Year, Card, Gross, Net Sale, Profit and Platform — click a header, click again to flip. The list caps at 400 rows: “Showing the first 400 of 822 — use the filter to narrow.” The net headline still covers all of them.
Figure 13 — Recent Sales. A gifted card shows 🎁 gift in place of a platform.

5.10CSV export

Two buttons, two very different scopes:

Export View CSV 184 rows (current view) · 34 columns × Build your export here — it's independent of the grid. Choose a photo filter and which columns to include: Match visible columns Select all Clear ITEM ☑ ID ☑ Card Name PHOTO ◉ Both (all cards) ○ Has photo only ○ No photo only SALE ☑ Sale Type ☑ Year Sold ☑ Sold Platform ☐ Proceeds To ☑ Net Proceeds ☑ Net Return Header row uses column titles (e.g. “Cert Number”), then one line per card. Cancel Download View CSV Every export also carries two extra columns at the end — Front Photo URL and Back Photo URL. File name: bkcards71_view_184rows_2026-08-21.csv
Figure 14 — The export popup. The photo radios sit inside the Item group; the column list is grouped exactly like the grid's category bands.
Export guardrails Money exports as a plain number (1234.56), never as "$1,234.00", so a spreadsheet can add it up. Column order is always canonical no matter what order you ticked them in. Net Return is blank for anything not sold, exactly as in the grid. And every file always carries the front and back photo links so a file handed to CDP or a marketplace never loses its images.

5.11The footer and the integrity count

The sticky footer reads Showing 184 of 1,958 live rows. — or rows (incl. archived) when the archived tick is on. On the right sits a small badge: ✓ Data integrity · 1,958 live.

That badge compares the number of live cards the database reports against the number the app actually loaded. Green means they match exactly. It fails closed: if the count cannot be verified, or the two numbers differ by even one, it goes red with Mismatch: database has N live, app loaded M. If you ever see red there, refresh before you trust anything else on screen.

6Editing a card

There is exactly one card panel in this app, and every route leads to it: clicking a Card Name in the Ledger, clicking a description in Bulk Edit or an Integrity drill-down, or finishing a card that just came out of Scan. What you learn once works everywhere.

6.1Opening the panel

It slides in from the right over a dimmed page. The header shows Card #1042 (or New Card when adding) above the card's name, plus the Status dropdown and the 🕘 History button. The action bar at the bottom is sticky, so Save is always reachable.

the Ledger, dimmed behind the drawer CARD #1042 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PINK /399 × Status For Sale ▾ 🕘 History Cost basis $96.40 · Comp $210.00 Card Name canonical Generate from attributes Use intake Intake: 2024 Topps Chrome Update Luis Arraez Pink · from cdp-inventory ▸ Name history front photo Front · Replace front No back photo yet Back · Upload back IDENTITY Card Name 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PINK /399 SKU BFL-EB14261 Brand Topps ▾ COSTS Base Cost $72.00 Grade Fee $18.99 Total Cost $96.40 (calc) VALUATION Asking Price $184.00 Proj. Profit (Sale) $87.60 (calc) Cancel Archive Update Save 1 2 3 4 1 · The Status dropdown starts every exit — sale, gift, write-off, or a simple flip. 2 · The provenance chip: canonical, intake, user, PSA or SGC. 3 · Grey with “(calc)” = the database computes it. There is no input to type into. 4 · Update saves and stays open; Save saves and closes.
Figure 15 — The card editor drawer. Green-bordered fields are yours to type; grey ones marked (calc) belong to the database.

6.2Green, grey and sky — the colour language

What you seeWhat it means
Green border, focus turns brighter greenEditable. You type it.
Grey box, mono grey text, suffix (calc)Calculated. Read-only — there is no input element at all.
Grey, "not allowed" cursor, tooltip Computed from the platform fee — not editableTemporarily locked while the platform's fee table computes it (Mark Sold's Net Sale).
Sky-blue bordered block at the bottomThe eBay What-If pad. Nothing there is ever saved.

The five calculated fields are Total Cost, Projected Profit As-Is, Projected Profit (10), Projected Profit (Sale) and Net Return. They update live as you type — the panel mirrors the database's own formula so you can see the effect immediately — but what finally gets stored is the database's answer, not the preview.

The formulas, in plain English:

6.3Every field, group by group

Identity

Card Name · SKU · Player · Card Year · Brand · Set / Product · Subset / Insert · Parallel / Variety · Card # · Print Run (/#) · Item Type · Card Type · Rookie (RC) · Autograph · Relic / Patch.

Ten of these are name drivers — change one and an unlocked canonical name rebuilds itself as you type (see 6.4).

Status & Location

Location · Listed On (multi-tick) · Showcase · Damaged · Damage Note.

Damaged is a condition, not an exit Ticking Damaged means the card is still in hand and still sellable — no money moves, and the cost stays in inventory. It only becomes a loss on the day it is actually discarded, via Status → Write Off… (lost / destroyed)Destroyed.

Acquisition

Purchase Date · Purchase Year · Purchase Platform · Owned By · Paid By · Pay Method · Platform Purchase Order ID.

Owned By and Paid By are the two most consequential dropdowns in the app: profit follows ownership, cost recovery and losses follow the wallet. Leaving either blank breaks the partner split, which is why Integrity has a check for it.

Grading

Grader · Grade (the ladder) · Grade Qualifier · Cert Number · PSA Order # · Grading Paid By.

Grade is a 19-step ladder — 1, 1.5, 2 … 9.5, 10 — and a blank option shown as -. There is no free-text grade anywhere in the app. Grade Qualifier is a combo box: pick a suggestion or type your own.

QualifierMeaning
MCMiscut (PSA)
MKMarks (PSA)
OCOff-Center (PSA)
OFOut of Focus (PSA)
PDPrint Defect (PSA)
STStaining (PSA)
PristineCGC / BGS 10
Black LabelBGS all-10
Gold LabelSGC

Costs

Base Cost · Tax · Shipping · Handling · Grade Fee · Total Cost (calc). The $ inside a money box is chrome — do not type it.

Valuation

Comp As Is · Expected Sale (10) · Asking Price · and the three calculated projected profits.

Sale

Sale Type · Date Sold · Year Sold · Sold Platform · Proceeds To · Sold For (Gross) · Net Sale · eBay Shipping Collected · External Shipping Collected · Gifted To · Platform Sale Order ID · Platform Sale Item ID · Net Return (calc).

You normally never touch these by hand — the Mark-Sold flow fills them all. Two behaviours to know: changing Sold Platform or Sold For (Gross) re-estimates Net Sale; and editing eBay Shipping Collected on an eBay platform corrects the net by exactly the fee on the shipping difference.

Names · Notes · Storage Location

Listing Name · Purchase Name · CDP Name — the titles other systems know this card by. Notes is free text. Storage is Home · Show · Box · Show · Column · Show · Divider · Show · Display Case, which is what produces the Case A2 / Bin 3, B, 12 badge you see in the grid and in Collection.

6.4The Card Name engine

Card names in this app follow the PSA slab layout. The engine can build one for you, remember where a name came from, and refuse to overwrite one you typed yourself.

Card Name canonical Generate from attributes Use intake Intake: 2024 Topps Chrome Update Luis Arraez Pink /399 · from cdp-inventory ▾ Name history canonical · 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PINK /399 · 2026-08-20 intake · 2024 Topps Chrome Update Luis Arraez Pink /399 · 2026-08-14 HOW THE CANONICAL NAME IS ASSEMBLED 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PINK /399 PSA 10 year · brand · set · #card number · player · subset · parallel · /print run · grader · grade Blanks drop out, everything is uppercased, and repeated words collapse — brand BOWMAN + set BOWMAN CHROME gives one BOWMAN. The card number goes before the player and the variety after — confirmed against real PSA slabs. Typing in the Card Name box by hand marks it user and locks it. A locked or grader-set name is never silently rewritten.
Figure 16 — The Card Name block, with the name history expanded, and the canonical assembly order beneath.
Provenance chipMeans
canonicalBuilt from the card's own attributes. It follows along automatically as you edit those attributes.
intakeThe name the card arrived with, restored by Use intake.
userYou typed it. Locked — nothing overwrites it, including bulk Generate names.
PSA / SGCGrader-authoritative. You can still override it by typing, which locks it as your override.

6.5Listed On — the one field that is not a card column

A card can be live on several marketplaces at once, so Listed On is a set of tick boxes rather than a dropdown. Unticking everything is how you say "not listed". If no platforms have been set up you will see No platforms defined — add them in Admin Console → Dropdowns → Listing Platform. A failure to save the listings never fails the card save, and toggling a platform on its own is enough to make the panel "dirty".

6.6Photos

front photo Replace front Front Remove front BK · Cards 71 No back photo yet Back · Upload back What happens on upload The file is stored in our own bucket, not linked from elsewhere. Front and back use separate paths and separate columns, so one can never overwrite the other. Removing a photo asks first — “Remove the front photo?” — and only clears the link; the stored file itself stays. In Add mode the tile reads “Save the card first, then click here to add a photo.” — a photo needs a card to belong to.
Figure 17 — The two photo tiles. Hovering shows Upload / Replace; Uploading… appears while it works.

6.7Save, Update, Cancel

ButtonBehaviour
Update (sky)Saves and stays open, then re-reads the row so the calculated fields show the database's real answer. Message: Updated ✓ — saved, still editing.
Save (green)Saves and closes.
Cancel / × / clicking the dim areaIf anything changed: Discard unsaved changes? Your edits will be lost. A clean panel closes silently.

Adding a card

+ Add Card opens the same panel empty. The only requirement is Description is required to add a card. On insert the card lands as For Sale, all five cost boxes default to 0, and the id is minted by the database. The panel then switches onto the real card in place and tells you Added card #1974 ✓ - you can add a photo now or Close.

Two guards worth knowing Net Sale can never be negativemoney received is never below $0 — and Net Sale can never exceed the grossfees only ever reduce the sale price. These mirror a rule in the database itself, so you get plain English instead of a database error.

6.8Archive, Restore, Delete

There is no shortcut to deletion Every path to a permanent delete goes through Archive first, and only an admin sees the button. Note also that a hard delete leaves no audit row — the card is simply gone. Prefer Archive.

6.9The eBay What-If pad

eBay Net What-If Projected eBay price 220.00 Fee % 12.35 +$/order 0.40 Shipping $ 6 Tax % 6 eBay fee -$29.66 Net proceeds $190.34 Projected net profit $93.94 Fee on price + shipping + tax, + $/order. Assumes you charge shipping ≈ your cost. Preview only — nothing saved. This is the only place in the editor with hard-coded rates. Real sale estimates use the platform fee table in Admin → Settings.
Figure 18 — The What-If pad. A scratchpad for "what would this net me on eBay at $220?" — it never writes anything.

7Selling, gifting, un-selling

Every card leaves inventory through the same door: the Status dropdown at the top of the editor. What differs is which story you tell it.

7.1The Status dropdown

Choose…What opens
For SaleA one-line confirm: Change status to "For Sale"?
Not For SaleChange status to "Not For Sale"? — the keeper pile
SoldThe Mark Sold form (7.2)
Gifted (free — write-off)The Gift this card form (7.4)
Write Off… (lost / destroyed)The Write off this card form (7.5)

Under the dropdown is a live status line: for a sold card, Cost basis $96.40 · Sold for $184.00 · Net Sale $161.28 · Profit $64.88; for an unsold one, cost basis and comp. A damaged card always shows ⚠ Damaged.

The stale-tab guard Changing status never acts on what your browser happens to be holding. The app re-reads the card first. If it cannot reach the database you get "Couldn't reach the database to verify this card…" and nothing happens. If somebody changed the card elsewhere you get "This card changed elsewhere — it's actually 'Sold' now. The panel has been refreshed; pick again if you still want to change it." This exists because a stale tab once skipped the un-sell chooser entirely and stranded ghost sale data on a card.

7.2Mark Sold

Mark Sold Card #1042 Sale Type Straight Sale ▾ Date Sold 2026-08-21 Sold Platform eBay ▾ Total 184.00 Net Sale (−12.35% − $0.40) 160.87 🔒 computed from the platform fee Proceeds To BK MTB ▾ Enter Total (gross). eBay and CollX compute Net Sale for you (locked); all other platforms pre-fill Net = Total and stay editable. eBay's exact payout trues up on the next importer run. Net Return = Net Sale − Total Cost. Year Sold derives from Date Sold. Cancel Confirm Sale 1 2
Figure 19 — Mark Sold. 1 the platform drives the fee · 2 a platform with fee data locks Net Sale so it cannot drift from the maths.
  1. Open the card and set StatusSold.
  2. Pick Straight Sale or Trade.
  3. Set Date SoldYear Sold is derived from it, and Year Sold is what drives your tax buckets.
  4. Pick the Sold Platform. Net Sale fills itself immediately.
  5. Type the Total (the gross). Net Sale recomputes.
  6. Optionally set Proceeds To — which account the money landed in.
  7. Confirm Sale. You get Marked sold ✓ and the grid, KPIs, chips and rollup all re-tally instantly.

How the net is worked out

Fees are data, not code. They live in Admin Console → Settings, and any change there takes effect on the very next sale with no deploy.

The label grows a live suffix showing the maths — (−12.35% − $0.40) or (−8% tier) — so you can always see why the number is what it is. These are estimates; the exact payout trues up when you run the eBay importer.

Validation runs in this order, and stops at the first failure:

  1. Date Sold is required.
  2. Sold Platform is required.
  3. Sale Type is required.
  4. Total (gross) is required.
  5. Net Sale is required — pick a platform and it fills itself.
  6. Net Sale can't be negative — money received is never below $0.
  7. Net Sale can't exceed Total (gross) — fees only ever reduce the sale price. Check the two amounts.

7.3Gift profit to BKCards71

Immediately after a profitable sale on a card owned by Kevin or Brian, a second modal offers to move some or all of that profit into the company pool.

Gift Profit to BKCards71? Kevin owns this card and keeps the profit of $64.88. Optionally gift some or all of it to the BKCards71 profit pool. Gift Amount 32.44 25% 50% All Note (optional) The gift moves that amount from Kevin's kept profit into the company pool. Editable later in the Financial tab. No Gift Save Gift
Figure 20 — The sale-time profit gift. It appears only when the owner is a partner (not BKCards71) and the sale actually made money.
Two different “gifts” Gift Profit to BKCards71 moves money between partners on a sale that really happened. Gifted (free — write-off) in the Status dropdown gives the card away for nothing. They share a word and nothing else.

A gift can never exceed the card's profit (Gift cannot exceed the profit of $64.88.), and the owner must match exactly one contributor in the Accounting tab — otherwise you are told to record it there instead.

7.4Gifting the card

Status → Gifted (free — write-off). Two fields: Gift Date (defaults to today) and Gifted To. The explainer is blunt:

"Gifts are always free — if money changed hands, it's a sale. This books a $0 sale: the card leaves inventory and its full cost writes off as a loss in the gift year, on the owner's books. No platform, no proceeds."

Confirmation: Gifted to Marcus — cost written off.

7.5Writing a card off

Write off this card What happened to it? ◉ Lost It's gone — can't find it, can't recover it. ○ Forgery Turned out fake — worthless, removed. ○ Ripped Off Stolen or scammed away from us. ○ Destroyed Damaged beyond sale and discarded. Date 2026-08-21 This card is gone — it books a $0 sale and its full cost ($96.40) writes off as a loss this year. Just damaged but still in hand? Cancel and tick the Damaged box instead. Cancel Confirm Write-Off
Figure 21 — Writing a card off. The story you pick is what appears in the Accounting tab's Write-Offs block.

Confirmation: Written off — Lost. Full cost books as this year's loss.

Refusal You cannot write off a card that is already Sold: "This card is Sold — its exit is already booked. Un-sell it first if the sale was wrong."

7.6The un-sell chooser — four stories

Moving a card off Sold is never a plain confirm. The app first restates what is on file — "Recorded sale: $161.28 net on 2026-08-11. What actually happened?" — and makes you pick the story, because the four stories have four different financial consequences.

Un-sell card #1042 → For Sale Recorded sale: $161.28 net on 2026-08-11. What actually happened? ◉ Strike the sale — it was a mistake No money ever moved. Wipes the sale completely; the ledger takes zero penalty. Old values stay in the audit log. ○ Returned & refunded Buyer got their money back, card is back with us. Anything the round trip cost adds to this card's cost basis. Return cost to us 0.00 ○ Order canceled & refunded — the card never shipped Money came in and went straight back out. The card was never out of inventory. This is what eBay's “canceled” orders are. ○ We kept the money AND got the card back The sale stays on the books exactly as is. The card re-enters as a NEW card at $0 basis — no double counting either way. Cancel Un-sell
Figure 22 — The un-sell chooser. Picking Returned & refunded reveals the return-cost box.
StoryWhat it does to the moneyConfirmation
Strike the saleEvery sale field is cleared. Nothing else moves.Sale struck — clean, no ledger trace (audit kept).
Returned & refundedSale cleared and the return cost you type is added to the card's Handling, raising its cost basis. A note is appended to the card.Sale reversed — back in inventory, basis up $12.40 for return costs.
Order canceled & refundedSale cleared. The card never left inventory.Order canceled — sale reversed, card never left inventory. Recorded in the card journey.
We kept the moneyThe original card is untouched — the sale stands. A brand-new card row is created at $0 cost basis carrying the identity, grading, photos and ownership.Sale kept on the books. Physical card re-entered as new card #1974 at $0 basis — open it to adjust.
Nothing is lost when a sale is wiped Before any sale field is cleared, the app photographs all twelve of them — price, net, dates, platform, order and item numbers, shipping, gifted-to — and files that snapshot into both the audit log and the card's own journey. The card's columns lose the numbers; the timeline is where they survive forever.

8Card journey — the history timeline

The 🕘 History button in the editor header opens the card's whole life: bought, sent to grading, graded, listed, sold, reversed, archived. It is a record, never a calculation — nothing in the P&L, the tax schedule or the partner waterfall reads it.

CARD JOURNEY · #1042 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PINK /399 × 🛒 Bought · eBay 2026-03-04 cost $72.00 order 15-14761-19242 · by Kevin 📮 Sent to grading 2026-04-11 fee $18.99 🏅 Graded 2026-06-02 PSA 10 · cert 104214318 🏷 Listed · eBay 2026-06-19 💰 Sold · eBay 2026-08-11 gross $184.00 net $161.28 Returned & refunded 2026-08-15 $12.40 Buyer returned it; label and fees added to basis. added by hand + Add event History is a record, not a calculation — the card's own fields remain the source of truth for all money.
Figure 23 — The card journey. Reversed money is struck through in amber: it was recorded, then reversed.

Events are sorted by lifecycle position first, then by date, so the story reads in order even when a date is missing (those show date unknown in italics rather than jumping to the top). Every event type the app can draw:

  • 🛒 Bought
  • 📮 Sent to grading
  • 🏅 Graded
  • 🏷️ Listed
  • 💲 Asking price changed
  • 💰 Sold
  • ↩️ Sale struck (mistake)
  • ↩️ Returned & refunded
  • 🚫 Order canceled & refunded
  • 🔧 Sale corrected
  • 🔁 Kept payment, card back
  • 🎁 Gifted
  • Written off
  • Damaged
  • 📦 Archived / ♻️ Restored
  • 🔍 Found / ❓ Lost
  • 🤝 Loaned out / 🎪 At a show
  • 📝 Note

Adding an event by hand

+ Add event records things the app cannot infer, or history that predates the log. It carries the warning ⚠ Events can't be edited or deleted afterwards — check before you add. — history is append-only in the database; a correction is a new event, never an edit.

The offered types are deliberately a subset: Note, Found, Lost, Loaned out, At a show, Damaged, Sent to grading, Graded, Listed, Asking price changed, plus five "— historical" variants (Sold, Returned & refunded, Order canceled & refunded, Sale corrected, Sale struck). Bought, live Sold, Gifted, Written off, Archived and Restored are not offered — those are only ever written by the flow that actually performs the action.

Money-bearing types add Gross $, Net $ and Order #, policed by the same rule as everywhere else: Net can't exceed gross — fees only ever reduce a sale.

Two small badges tell you where an event came from: reconstructed from card record means it was rebuilt from the card's own data when history was first seeded; added by hand means a person typed it. Events written by the app's own flows carry no badge.

9Bulk tools

Two different jobs share the word "bulk". Bulk Edit changes fields across many cards at once and lives in the Admin Console. Bulk Sale sells many cards as one order and lives in the Ledger.

9.1Bulk Edit — the picker

Gear → Bulk Edit. Filter down to the cards you mean, tick them, then act. Archived cards are excluded from the list entirely.

Filter and select cards, then Edit selected to change one or more fields across all of them at once. Or click a card's description to open just that card in the full editor. Archived cards are excluded. Derived values are never bulk-editable. Search ID, SKU, description, player… Refresh Edit selected (42) Generate names (42) Status ▾ 1 Card Type ▾ Item Type ▾ Brand ▾ Grader ▾ 1 Location ▾ Owner ▾ Card Year ▾ Clear all filters ID ▲ DESCRIPTION CARD TYPE STATUS OWNER GRADE LOCATION COST 1042 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PINK /399 BaseballFor Sale KevinPSA 10 Monroe$96.40 1045 2020 TOPPS CHROME #201 BO BICHETTE RC BaseballFor Sale BrianPSA 9 Show box 2$52.75 1046 2019 PANINI DONRUSS OPTIC #158 JA MORANT RC HOLO BasketballSold BKCards71PSA 9.5 $188.00 1051 2023 PANINI PRIZM #201 CJ STROUD RC SILVER FootballFor Sale Kevin Monroe$41.00 Showing 128 of 1,958 · 42 selected clear selection 1 2 1 · Facets AND across, OR within · 2 · Clicking a description opens that one card in the full editor.
Figure 24 — Bulk Edit. The header checkbox selects everything in the current filter, and your selection survives changing that filter.

Eight facets are available: Status, Card Type, Item Type, Brand, Grader, Location, Owner and Card Year. Each is a multi-select with Select all / Clear, per-value counts, and blanks grouped under (blank).

9.2The bulk edit popup

Edit selected (N) opens the shared popup: "Tick the fields to change. Untouched fields are left alone. Blank = clear the value." A control stays disabled and grey until you tick its box — nothing can be changed by accident.

Edit 42 cards Tick the fields to change. Untouched fields are left alone. Blank = clear the value. ACQUISITION ☑ Owned By Kevin ▾ ☐ Paid By — (clear) ☑ Purchase Date 2026-02-14 COSTS ☑ Base Cost 12.50 ☑ Notes (nothing typed) 💰 12 of these 42 cards are already SOLD. You're changing Base Cost, which rewrites Total Cost → Net Return → the P&L, the tax-year totals and the partner waterfall for sales already on the books. ☐ I understand and want to change the cost basis anyway. 🧨 This will ERASE values on all 42 card(s): Notes is ticked with nothing typed in, so it will be cleared. Untick the field if you didn't mean to. ☐ I want to clear this value. 4 fields selected Cancel Apply Apply stays disabled until both boxes above are ticked.
Figure 25 — The bulk edit popup with both acknowledgements showing. Neither can be dismissed; Apply is blocked until each is ticked.

The three safety layers

  1. Tick to arm. Nothing is written for a field you did not tick.
  2. Two acknowledgements. The amber cost-basis warning appears whenever you touch Base Cost, Tax, Shipping, Handling or Grade Fee and the selection contains — or might contain — a sold card. The red clear warning appears whenever a ticked field has nothing typed in it, because that means erase.
  3. A final itemised confirm. Every Label → new value, with (clear) for blanks and Yes/No for switches, plus an overwrite estimate and every warning restacked.
Honest counting When Bulk Edit is opened from an Integrity drill-down the rows are only partially loaded. Rather than pretending an unseen row is safe, the popup counts it as unknown, still demands the cost acknowledgement, and says so plainly in the confirm: "(Estimate only: 8 of the 42 selected rows aren't fully loaded here, so the overwrite count above may be low.)"

What can and cannot be bulk-edited

31 fields across eight groups are editable in bulk: Identity (Card Year, Card Type, Item Type, Brand, Player, Listing Name, Purchase Name, CDP Name), Status & Location (Location, Showcase), Acquisition (Purchase Date, Purchase Platform, Pay Method, Owned By, Paid By, Purchase Order #), Grading (Grader, Grade, Grade Qualifier, Grade Fee, PSA Order #, Grading Paid By), Costs (Base Cost, Tax, Shipping, Handling), Valuation (Comp As Is, Expected Sale (10), Asking Price), Storage (Home, Show · Box, Show · Column, Show · Divider, Show · Display Case) and Admin (Counts in Financials, Notes).

Deliberately not bulk-editable: Card Name, SKU, Status, Sale Type, every sale field, cert number, damaged flags, photos, the listings, and all five calculated values. Sales are made one card at a time in the editor, or as a lot in Bulk Sale.

9.3Generate names

Generate names (N) rebuilds the canonical PSA-style Card Name for the selected cards from their own attributes — the same format the editor's Generate from attributes button produces.

Locked names are never clobbered Any card whose name is locked — a PSA/SGC-authoritative name, or one you typed by hand — is skipped and counted. If nothing is eligible you get "Nothing to generate: the selected cards are all locked/authoritative or have no attributes to build from." The confirm spells out the numbers, and finishes: "This overwrites the current Card Name on the N unlocked card(s)." Result: Generated 34 canonical name(s) · 8 locked skipped.

Generation only runs one way — attributes → name. There is no reverse tool that reads a card name and fills in Brand, Set and Player from it.

9.4Bulk Sale — selling a lot

From the Ledger: Select to Sell → tick cards → Sell N selected →. You type the single total you actually received for the whole lot, and the app splits it across the cards proportionally by asking price, to the penny.

Bulk Sale · 4 cards Date Sold 2026-08-21 Platform Card Show ▾ Total Sale (Gross) $500.00 Order ID platform order # Gross$500.00 Platform fee-$0.00 Net proceeds $500.00 # CARD ASKING GROSS NET 1042 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PINK /399 $184.00 $213.87 $213.87 1045 2020 TOPPS CHROME #201 BO BICHETTE RC $64.50 $74.97 $74.97 1051 2023 PANINI PRIZM #201 CJ STROUD RC SILVER $95.00 $110.42 $110.42 1063 2022 TOPPS UPDATE #US47 JULIO RODRIGUEZ RC $86.00 $100.74 $100.74 Totals $429.50 $500.00 $500.00 The allocated gross and net land exactly on the order totals — no rounding leak, ever. One order incurs one fee: a per-order charge is applied once for the lot, not once per card. Book 4 sales Every card must have an asking price — the split is weighted by it.
Figure 26 — Bulk Sale. The Totals row is the proof: the per-card shares add up to the order exactly.
  1. In the Ledger, press Select to Sell and tick the cards (filter and sort freely — the selection follows the cards, not the rows).
  2. Press Sell N selected →.
  3. If any card has no asking price, an amber panel appears: "N cards in this lot have no asking price. Set them to continue — the split is weighted by asking price, so every card needs one." Type prices inline. Until you do, the rest of the form is dimmed and unusable.
  4. Set the date, pick the platform, type the Total Sale (Gross), and optionally the order id.
  5. Check the preview table — the Totals row must equal your order.
  6. Book N sales → confirm "Book 4 cards as SOLD for a total of $500.00 (net $500.00) on 2026-08-21? This marks every selected card sold."
Differences from selling one at a time A bulk sale writes no Proceeds To, offers no Trade sale type, and never raises the profit-gift prompt. It also records the whole lot in each card's journey, so any one card can reconstruct the order it was part of. If a card fails mid-way the run stops there — earlier cards stay booked, so fix the failing card and re-run the rest.

10Intelligence — scan, values & research

The intake pipeline. Every photo you upload becomes a potential card in a holding area, completely isolated from your real inventory. Nothing touches the Ledger until a person presses Bring into App.

"Upload photos of cards that aren't in the system yet — a folder or a multi-select. Each becomes a potential card; nothing touches inventory until you review it and click Bring into App. Only fronts go to AI detection; backs ride along."

10.1Add by PSA cert #

For graded cards not yet in the app. Paste one cert or fifty — commas, spaces or new lines all work. The app pulls the card's details and its front and back photos straight from PSA.

AI Scan Scan Value Add by PSA cert # For graded cards not yet in the app. Paste one or many PSA cert numbers — we pull the card's data and front/back photos straight from PSA, and they appear below as potential cards to review and bring in. Certs already in the app are skipped. 148836033, 145091168, 111820077 Look up on PSA or upload photos Front + back pairs Fronts only Photos pair in order: 1st = front, 2nd = back, and so on. Drag & drop photos here, or Choose photos Choose folder JPG / PNG / HEIC · one card per photo · processed in filename order Result line: “Added 3 card(s) from PSA · 1 already in the app · 1 had no PSA image.” — each clause only appears when it applies.
Figure 27 — Scan intake. Two ways in: paste PSA certs, or drop photos. Both land in the same holding area.
Manager-gated actions Anyone can upload photos and delete uploads. Look up on PSA, Scan selected and both Bring into App paths require a manager account — the tooltip on a disabled button says Requires a manager account, or AI detection requires a manager account. These are enforced on the server too, so the greyed button is a convenience, not the actual lock.

10.2Uploading photos

Files are sorted by filename using natural number order, so img2 comes before img10. That is what makes "processed in filename order" trustworthy for a whole folder drop. Non-images are silently ignored, and a single bad file never aborts the batch — you get Upload failed for IMG_2213.HEIC: … and the rest continue.

10.3Scanning and reviewing

☐ Select all 8 card(s) · 3 selected Scan selected (3) Bring selected into App (3) Delete selected scanned Front Back 2024 TOPPS CHROME UPDATE #US200 LUIS… Baseball · RC · slab · Review & add → pending Front IMG_2207.HEIC uploaded, not yet scanned scanned Front No match — enter manually Basketball · Review & add → accepted 2023 BOWMAN CHROME #BCP44 HOLLIDAY Baseball · added #1974 Status pills: pending uploaded · scanning in flight · scanned a proposal exists · error the scan failed · accepted already brought in. Deleting asks first: “Delete 3 card(s) (5 photo(s))? This removes the uploads only — no real card is affected.”
Figure 28 — The Scan gallery. Each tile is one future card; an accepted tile shows the real card id it became.

Scan selected sends only the fronts to AI detection — backs never leave the holding area. While in flight the pill pulses sky. When it comes back you get a proposed name in green, or the honest amber line No match — enter manually.

10.4Reviewing and bringing cards in

Review potential card front back Card Name 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PINK Player Luis Arraez Year 2024 Brand Topps Set Chrome Update Card # US200 Grade 10 ☑ Rookie ☐ Auto ☐ Relic detected as a graded slab Not right? Pick a closer match: 2024 Topps Chrome Update Pink Refractor #US200 Luis Arraez 2024 Topps Chrome #147 Luis Arraez ▸ raw Ximilar output Nothing here touches inventory. “Bring into App” creates the real card, copies the photos into our own storage, and opens the full editor so you can finish it. Cancel Bring into App
Figure 29 — The review panel. Every field is editable; rebuilds the card name from the fields beneath it.
  1. Press Review & add → on a tile.
  2. Correct anything the AI got wrong — or, if it offered alternatives, click a closer match and the fields plus the name rebuild themselves.
  3. If the name box is empty, press to build one from the fields. A blank name blocks the button: A Card Name is required — type one or hit ↻ to build it from the fields.
  4. Press Bring into App and confirm: "Bring this into the app as a real card? It will be added to your inventory (For Sale), its photos copied into your bucket, and open in the full editor to finish."
  5. The full card editor opens on the brand-new card. Add cost, owner and payer, then Save.

The bulk path — Bring selected into App — skips the editor and trusts the detection: "Bring 6 card(s) into the app? They'll be created from the detected details (For Sale) with photos copied into your bucket. You can edit any of them afterward in the Ledger."

What a card born in Scan looks like Status For Sale, all money fields zero (Scan knows what a card is, never what you paid), intake provenance recorded, and the photos physically copied into our own storage so the card never depends on PSA's or the upload bucket's links. In the bulk path, a card that has not been scanned yet has no name and is skipped rather than guessed at: · 2 skipped (no name yet — Scan them first).

The second sub-tab, Value, is a placeholder: "Market value comes from SportsCardsPro (per grade), not from the scan. This lives here so it's clearly separate from detection. Wiring it up is Phase C."

10.5My Card Values — market values in bulk

The My Card Values sub-tab prices your cards from real recent sales of the same card at the same grade. To value a batch:

  1. Open IntelligenceMy Card Values.
  2. The status chips default to For Sale — deliberate, so you never spend valuation budget on cards that already sold. Switch chips to widen the set.
  3. Narrow further with the search box, the grader filter, or the value-state filter (never valued / stale / recent).
  4. Tick individual rows or use Select all, then click Check Value (n) — the button shows how many you selected.
  5. Watch each row fill in live as it is valued. The run ends with counts: valued · no sales found · on cooldown · failed. If the day’s vendor budget runs out, the run stops cleanly and tells you.

Hover a row to see the card’s big photo (it floats to the left, so your eye never travels); click the card’s name to open the full card editor. The Location column sits beside Grade so you can find the physical card.

10.6How a value is computed — and the 7-day rule

For each card the engine pulls sold listings that match the card at its grade, throws out outliers, and weights recent sales more heavily. What comes back with the number:

Each card can be re-checked after 7 days; the row shows the exact date it becomes eligible again (e.g. again 9/05). The cooldown is a feature, not a limit — it keeps vendor costs sane and the numbers meaningful.

Values are information, never bookkeeping. A market value never touches cost basis, net return, the ledger, the waterfall, or tax. It cannot change your books.

10.7Cards at the grader

A card with a grader chosen but no grade yet is at the grader. The app shows its grade as Pending (blue), Location says where it is, and the engine values it as a raw card — with the grader’s name stripped from the search — until the grade comes home. Why: a raw card titled “PSA” would otherwise soak up graded-copy prices and value itself at many times reality. The value carries the disclosure “At PSA for grading — valued as RAW until the grade comes home.”

10.8Prospect & Industry — coming

Prospect will analyze any card — owned or merely considered: what it sells for, whether grading pays, which grader pays best, and whether it is heating up or cooling down. Industry will follow with market-wide trends and movers. Both appear as sub-tabs the day they ship.

11Financials — the executive dashboard

Violet. Everything on this page is about cards only: what you bought, what you sold, what you are holding. Operating expenses, capital and partner payouts are not here — they live in Accounting.

Because there are no expenses at this layer, Revenue − COGS is exactly Gross Profit. That is why you will find a Gross Profit tile and no separate "Net Return" tile — they would be the same calculation under two names.

Executive Dashboard Card-trading performance only — operating expenses, capital, and partner distributions live in the Financial tab. SALES YEAR All 2025 2026 CFO Board Briefing · all sold history Get a CFO's open-the-meeting read across the whole dashboard — health, position, biggest opportunity, biggest risk, and where to focus. Brief the board ↗ REVENUE $85.4K 822 cards sold COST OF GOODS SOLD $90.1K GROSS PROFIT -$4.7K Margin -5.5% ROI -5.2% INVESTED CAPITAL $75.6K 1,125 in inventory UNREALIZED P/L $18.2K on 42% w/ comps AVG DAYS TO SELL 146d TOP-CARD CONC. 3.4% 1 2 3 1 · The year pill filters sold cards only. Inventory figures are always as-of-now — a card in stock has no sale year. 2 · Invested Capital, Unrealized P/L and Top-Card Concentration never move when you click a year. 3 · “on 42% w/ comps” is the honesty line: this number describes only the inventory that actually has a comp set.
Figure 30 — Financials: page header, the Sales-year pills, the CFO briefing panel and the eight KPI tiles.

11.1Scope — the single most important thing on this page

The year pill filters far less than it looks like it does Sales year narrows the set of cards sold in that year. It does not touch inventory — inventory has no sale year, so aging, dead money, the mix pies and the price bands are always whole-dataset and as-of-now. In total, only six figures on the whole page move when you click a year: five KPI tiles and the Gross Profit by Platform chart.
VisualFollows the year pill?
Revenue · COGS · Gross Profit · ROI · Avg Days to SellYes
Invested Capital · Unrealized P/L · Top-Card ConcentrationNo
Gross Profit by PlatformYes
Gross Profit by Year · Revenue vs COGS by Year · Units Sold Over Time · ROI Distribution · Grade Lift · Best & Worst FlipsNo — they show every year on purpose
Everything in Inventory & Velocity, Mix & Exposure, Buying Discipline, Grade Distribution, Grading Spend, Data QualityNo

11.2The eight KPIs

TileWhat it isHow to read it
RevenueGross sales of the cards sold in scopeSub-line gives the card count
Cost of Goods SoldTotal cost of those same cards — basis + grading + shippingThe gap to Revenue is gross profit
Gross ProfitRevenue − COGSGreen above zero, red below; margin shown beneath
ROIGross profit ÷ COGSLifetime, not annualised — a one-week flip and a three-year hold count the same
Invested CapitalCost basis tied up in unsold, for-sale inventoryExcludes Not-For-Sale
Unrealized P/LComp − cost across only the inventory that has a compIf coverage is 42%, the number describes 42% of the book. Directional, never a balance-sheet figure
Avg Days to SellMean purchase-to-sale timeYour cash conversion speed
Top-Card ConcentrationBiggest single card as a share of invested capitalSingle-name risk

11.3The seven sections

Capital Health Gross Profit by Year $4K $0 -$4K 2025 2026 A red bar is a year that lost money on realised sales alone. Gross Profit by Platform eBay $8.2K Card Show $4.4K Facebook $1.9K CollX -$5.1K Whatnot -$4.2K A long red bar is a channel whose fees or buyer mix is eating the margin. This is the one chart that respects the Sales-year pill.
Figure 31 — Two of the fourteen Financials charts. Bars are red below zero and green (or teal) above, everywhere on the page.
SectionContainsWhat it is for
Capital HealthGross Profit by Year · Capital Position (six mini-stats)The shape of the business over time and where the money sits right now
Sales PerformanceRevenue vs COGS by Year · Gross Profit by Platform · Units Sold Over Time · ROI DistributionWhich channel actually makes money, and the shape of your flipping strategy. A fat Loss bar beside a fat 300%+ bar is a barbell — a few home runs paying for many strikeouts
Buying DisciplineAvg Acquisition Cost by Brand and by Platform (top 10 each)Average ticket size, not performance. A brand bought fewer than three times does not appear at all — absence is not zero
Inventory & VelocityInventory Aging · Money in Inventory by Sport · Dead MoneyThe red 90+ d bar is your problem. Aging counts from purchase, not from listing
Grading PerformancePipeline chips · Grade Distribution · Grade Lift · Grading Spend by PayerThe Raw bar in Grade Lift is the control group — the case for grading is every bar that clears it
Mix & ExposureValue by Sport · Value by Brand · Asking-Price Bands · Top 10 Cards by Cost BasisConcentration risk in plain sight
Best & Worst FlipsTop Winners · Worst Losers, eight rows eachRanked by absolute profit, not ROI — a $2 card that returned 900% will never appear here
Dead Money — inventory 90+ days old (214 cards · $18,442.90) # CARD AGE COST ASKING SUGGESTED ACTION 0771 2018 PANINI PRIZM #12 LUKA DONCIC RC 412d $620.00 $899.00 Reprice — above comp 1102 2021 TOPPS CHROME #220 WANDER FRANCO RC 288d $188.00 Set an asking price 0944 2022 PANINI SELECT #44 JAYSON TATUM SILVER 201d $142.50 $165.00 Promote / discount Showing the 40 largest by cost · 174 more. Data Quality These flags don't break anything — they tell you where the numbers above lean on incomplete data. Cleaning them sharpens every metric. 17 Listed with no asking price A buyer can see it on a marketplace with no price — fix now. 263 For sale, no asking price (unlisted) Backlog inventory to price when you list it. 9 Sold, missing Date Sold Weakens time-to-sell + monthly trend. 4 Sold for $0 Drags revenue + margin down. 122 $0 total cost Inflates ROI on those cards. 652 Inventory w/o comp No unrealized P/L for these.
Figure 32 — The Dead Money worklist (with its suggested-action column) and the six Data Quality tiles. Red tiles are the ones actively distorting a number above.

11.4The AI analyst

Two flavours of the same thing. Brief the board ↗ at the top writes a whole-dashboard CFO briefing; each section also carries its own Ask the analyst ↗ button. Both become Regenerate ↻ once text exists.

The analyst is instructed to cite only the figures it was handed and never to invent one, to write three to five tight sentences, and to stay inside this tab's scope — it is explicitly forbidden from commenting on net income after expenses, because that data is not on this page. Changing the year pill clears every paragraph, so a briefing can never describe a scope other than what is on screen.

Data Quality is the one section with no analyst panel.

11.5How the flags feed back

The page footer is your fastest sanity check: Card-trading performance · computed live from 1,958 live cards · 822 sold · 1,125 in inventory. Those three counts should tie to the Ledger footer.

12Accounting — the books

Emerald. This is where everything that is not a card gets typed in, and where the whole business — cards plus expenses plus capital — is turned into a P&L, a partner waterfall and a tax schedule.

Two sub-views, and their hints tell you the convention: LedgerEntry surface — you type it; StatementsComputed — finance & tax. Green means you type it; computed screens are read-only.

Financials vs Accounting — the one number that legitimately differs Financials' Gross Profit is revenue − COGS. Accounting's Gross Profit is revenue − COGS plus the shipping margin (what buyers paid for shipping, less what the labels actually cost). They differ by exactly that term. It is not a bug, and chasing it is a waste of an afternoon.

12.1The Ledger sub-view

Finances BUSINESS BOOKS · NON-CARD + Add Entry All 2025 2026 Ledger Entry surface — you type it Statements Computed — finance & tax OPERATING EXP $18,204.55 CAPITAL EQUIP $3,410.00 WRITE-OFF $1,286.44 OWNER CAPITAL $17,637.11 PERSONAL (EXCL.) $842.00 TOTAL · IN BOOKS $40,538.10 DATE ▲ TITLE CATEGORY ⏷ VENDOR ⏷ PAID BY ⏷ UNIT COST FREQ ⏷ REIMB ⏷ TOTAL 2025-01-15 Card Dealer Pro subscription Operating Expense (Non-Card) – Software CDP Kevin $49.00 Monthly ×7 Y $343.00 2025-02-02 Card show table — Monroe Operating Expense (Non-Card) – Shows Monroe Expo Brian $220.00 Y $220.00 2025-03-18 Card scanner + light box Capital Equipment Amazon BKCards71 $3,410.00 $3,410.00 2025-04-04 Dinner with Marcus personal Operating Expense (Non-Card) – Meals Kevin $84.00 $84.00 2025-05-09 Owner capital — Kevin Owner Capital Contribution Kevin $12,000.00 $12,000.00 54 entries · business, counts-in-books total $40,538.10 1 2 1 · “Monthly ×7” means this one rule has produced 7 occurrences in the selected year — Unit Cost × 7 = Total. 2 · A personal entry is dimmed, chipped, excluded from every business total, and shown separately in the summary band.
Figure 33 — The Accounting ledger. The summary band recomputes live as you filter the table beneath it.

The five summary stats plus the total:

StatWhat it collects
Operating ExpBusiness, counts-in-books entries whose category starts with "Operating Expense"
Capital EquipCategories flagged as capital equipment (CapEx)
Write-OffCategories whose name contains "Write-Off"
Owner CapitalCategories flagged as capital contributions
Personal (excl.)Every personal-scope entry, whatever its category — counted here and nowhere else
Total · in booksEverything business + counts-in-books, including CapEx and Owner Capital. It is "what hit the books", not an expense total — so the four stats above it will not add up to it.

Four columns carry funnels — Category, Vendor, Paid By, Freq and Reimb — with Select all / Clear and an Apply link. Blanks show as (blank). Clicking anywhere on a row opens it for editing; there is no separate edit button.

12.2Adding an entry

the ledger, dimmed behind the drawer Add Entry DATE 2026-08-21 TITLE Card Dealer Pro subscription DESCRIPTION CATEGORY Operating Expense (Non-Card) – Software ▾ + VENDOR CDP ▾ + PAID BY (CONTRIBUTOR) Kevin ▾ PAID BY METHOD BK Amex ▾ AMOUNT 49.00 FREQUENCY Monthly ▾ START DATE 2025-01-15 End Date (blank = runs until stopped) SCOPE Business ▾ COUNTS IN BOOKS Yes ☑ Reimbursable REIMBURSED? Partial ▾ REIMBURSED AMOUNT 98.00 TO Kevin ▾ Add Entry Cancel
Figure 34 — The entry drawer. The recurring block appears only for a recurring frequency; the reimbursement fields appear only when Reimbursable is ticked.

Required fields, checked in this order: Title is required. · Category is required. · Frequency is required. · Recurring entries need a start date.

The five managed dropdowns

Category, Vendor, Paid By (Contributor), Paid By Method and Frequency are all add-as-you-go: press +, type a name, press Add or Enter. Two levels of duplicate protection: an exact match (ignoring case) silently selects the existing one, and a near match warns first — Did you mean "Card Dealer Pro"? Click Add again to create new.

Two dropdowns need a follow-up when you add them here A category created from this panel has no capital/CapEx flags set, so it will not land in any summary bucket until those flags are set in the database. A frequency created here has no month interval, so it behaves as a one-off no matter what you call it — type "Quarterly" and you will get a single occurrence. Ask an admin to finish either one.

The New Cards block

When the category is exactly New Cards, an extra block appears: "Bulk lot: keeper cards are already in the card P&L. Enter how much of this lot went to keepers; the leftover becomes business COGS." Type the keeper allocation and the live read-out Leftover → COGS shows the remainder.

12.3Recurring entries

One row, not many. A recurring cost is stored once, carrying the per-occurrence amount, the interval, a start date and an optional end date. The table shows the multiplier inline — Monthly ×7 — and the Total column is amount × occurrences.

There is no Active checkbox (Edition 4). Dates are the whole system: no End Date means the rule is running; an End Date stops it after that month. The entry panel states which is true in plain words — green “Active — runs every period until you set an end date,” or “Ends {date} — stops generating after that month.”

Note also that the year toggle offers only All, 2025 and 2026 — that list is fixed in the code and will need a developer to extend it when 2027 arrives.

12.4Reimbursements

Tick Reimbursable and the block opens: Not yet (owed) / Partial / Fully reimbursed, plus Reimbursed Amount, Reimbursed To and Reimbursed Date.

The balance follows the amount, not the label The outstanding figure is amount paid − amount reimbursed. The three-way state is a human label only. Marking an entry Fully reimbursed while leaving the reimbursed amount at $0 leaves the whole thing showing as owed. Always type the number. Over-reimbursement clamps at zero — it never becomes a debt back to the company — and Reimbursed To and Reimbursed Date are an audit trail only, not part of any sum. Recurring reimbursables are not properly supported: the cost multiplies by the occurrence count but the reimbursed amount does not.

Any reimbursable entry counts, whatever its category — supplies, capital, opex. The result shows up in Statements under Out-of-pocket paid (reimbursable, unsettled).

12.5Statements, block by block

Nineteen blocks in a fixed order. Two frames are used and never mixed: the business P&L is sold-year (revenue recognised at sale, the IRS basis), and the capital waterfall is purchase-year cohort — everything before 2026 is one lump called 2025 & before.

GROSS PROFIT -$3,982.10 NET ORDINARY INCOME -$23,473.09 CAPITAL RECOVERED $85,426.58 TOTAL STILL OUT (COHORT) $44,218.93 P&L Bridge Sales COGS OpEx Write-Off Net Income Business Accounting · P&L (sold-year, IRS basis) · All Years Gross Sales (cards sold) $85,426.58 Cost of Goods Sold -$90,143.62 Gross Profit -$3,982.10 Operating Expenses (non-card) -$18,204.55 Inventory Write-Off -$1,286.44 Net Ordinary Income -$23,473.09 CapEx $3,410.00 (amortized in capital, not expensed here) · Owner capital contributions $17,637.11 Cards Only · Capital Waterfall · Purchase Cohort: All purchase years KEVIN BRIAN BKCARDS71 Cost advanced (cards bought) $96,428.10 $41,204.55 $28,112.30 + Grading paid for others $1,842.00 $0.00 $612.44 − Grading others paid for you -$0.00 -$1,842.00 -$612.44 = Adjusted capital advanced $98,270.10 $39,362.55 $28,112.30 − Recovered on sale (to receiver) -$49,879.04 -$18,918.25 -$52,729.29 = Still out (your money on the table) $48,391.06 $20,444.30 -$24,616.99
Figure 35 — Statements: the four headline tiles, the P&L bridge, the six-line P&L, and the per-partner capital waterfall.

The three rules that drive every partner number

  1. Cost recovery → the payer. Whoever fronted the money is credited back what they put in, capped at cost.
  2. Profit → the owner. Gain above cost goes to whoever owns the card. If BKCards71 owns it, the gain goes into the company pool; if a partner owns it, they keep it (less anything they gifted).
  3. Loss → the payer. A shortfall is charged to whoever paid, always, even when somebody else owns the card. That is a real out-of-pocket loss and it flows to their personal return.

Upside follows ownership; downside follows the wallet. That asymmetry is the whole model.

#BlockWhat it tells you
1Four KPI tilesGross Profit · Net Ordinary Income · Capital Recovered · Total Still Out
2P&L BridgeFive magnitudes: Sales, COGS, OpEx, Write-Off, Net Income
3Net Owed by Company → PartnerOne bar per partner
4Capital: Recovered vs Still OutStacked, by purchase cohort
5Operating Expenses by CategoryDonut of the OpEx mix
6Business Accounting · P&LThe six-line statement. CapEx and owner capital sit outside it, on purpose
7Cards Only · Capital WaterfallCost advanced → grading adjustments → recovered → still out, per partner
8Shipping Ledger (Both Legs)Collected from buyers, less what labels cost, = shipping margin
9Write-OffsGifted · Lost · Forgery · Ripped Off · Destroyed, with a separate amber watch line for damaged-but-still-held cards
10Non-Card Position (Ledger)Out-of-pocket unsettled + capital contributions = non-card owed
11Total Owed (All Sources)Card capital still out + non-card owed − distributions taken
12ReconciliationWhy the three partners do not sum to zero
13DistributionsMoney actually taken out. + Record to add one
14Out-of-Pocket by Payer & OwnerThe payer × owner matrix
15Loss Carried by PartnerThe figure that flows to a personal return
16Partner Accounting · Tax pass-throughProfit kept − losses carried = net to personal return
17Profit GiftsEvery gift of partner profit into the company pool
18Profit DistributionSliders that split the company pool by percentage, per year
19Tax SchedulePer-card gain/loss, sorted biggest-loss-first — the harvesting worklist
Never add the shipping margin twice The Shipping Ledger is a breakdown of a number that is already inside every card's Net Return and inside Gross Profit. The block says so itself: "(already inside each card's Net Return — this is the breakdown, not an extra line)".
Why the partner totals do not sum to zero The Reconciliation block explains it in the app: "If every dollar were just owed between partners, this would be $0. It isn't — it equals the realized gain/loss: money truly made or lost on cards. A negative figure is value that left the system entirely, not a debt between partners."

Recording a distribution

+ Record opens a small drawer: Date (drives fiscal year), Partner, Amount Taken, Kind and a note. Kind matters:

Setting the profit split

Sliders appear only when a specific year is selected. Drag each partner's percentage, watch the target dollars move live, then press Save Split. The total is shown in emerald at exactly 100% and amber otherwise, with (should equal 100%) appended — but nothing forces it. A split summing to 90% simply leaves 10% of the pool unallocated.

12.6Excel export

Export to Excel (All Years) — or the selected year — appears in the Statements sub-view and produces BKCards71_Accounting_All-Years.xlsx with nine sheets:

  1. P&L Summary — the six lines, plus CapEx, owner capital and the sold count
  2. Tax Schedule — per card, with owner and payer, and a TOTALS row
  3. Partner Positions — still out, non-card owed, distributions, net owed
  4. Out-of-Pocket — the payer × owner matrix
  5. Partner Tax — recovered, realized loss, profit kept, profit gifted, net to return
  6. Capital Waterfall — the six lines per partner, with the cohort label
  7. Non-Card Ledger — the raw entries
  8. Distributions — year-filtered
  9. Profit Gifts — the gift trail with a total
One export caveat The Non-Card Ledger sheet exports the unit amount for a recurring entry and handles the year scope differently from the screen. That sheet will not foot to the on-screen ledger total. Use the P&L Summary sheet for totals.

12.7Numbers that must tie

These are the internal identities the app maintains. If one of them fails, something is wrong and worth raising:

AssertionWhere you can see it
Per-card gain/loss adds up to Gross ProfitThe Tax Schedule footer literally prints Gross Profit as its column total
Gross Profit = Gross Sales − COGS + shipping marginP&L block
Net Ordinary Income = Gross Profit − OpEx − Write-OffP&L block (CapEx and owner capital excluded by design)
Adjusted capital advanced = cost advanced + grading for others − grading by othersWaterfall rows 1–4
Still out = adjusted advanced − recoveredWaterfall rows 4–6
Grading paid for others totals the same as grading others paid for youWaterfall rows 2 and 3 — if they differ, a partner name failed to match
Cost out − recovered = loss, in every matrix cellOut-of-Pocket footnote
Total owed = non-card owed + still out − distributions takenTotal Owed block

And the external reconciliation targets the whole system has been checked against: 822 cards sold (582 / 240) · Net Return −$4,717.42 · Total Sold $85,426.58 · 1,125 in for-sale inventory · $75,603.83 money in inventory · 1,958 live, 15 archived.

12.8The Ledger toolbar & CSV export

The Ledger header carries four buttons: Export CSV, Import Receipt Photos, Import Statement, and + Add Entry. The two importers are activators: click one and its panel opens as a pop-up over the ledger with the button lit; opening the other closes the first. The only ways out are the panel’s red Cancel ✕ or switching panels — the buttons never change their labels on you.

Finances BUSINESS BOOKS · NON-CARD Export CSV Import Receipt Photos Import Statement + Add Entry All · 2025 · 2026 A lit (blue-ringed) button means its panel is open. Cancel ✕ inside the panel closes it.
Figure 51 — The Ledger toolbar. Importer buttons are activators: fixed labels, lit while open, one panel at a time.

Export CSV downloads the ledger you are looking at — <org>_Ledger_2026.csv for a year, …_All-Years.csv for everything — with one row per entry: dates, titles, categories, vendors, who paid, pay method, unit cost, frequency, how many occurrences the year scope generated, the total in scope, and the reimbursement fields. It foots to the on-screen totals to the penny, which makes it the file you hand an accountant or paste to an assistant.

12.9Importing a bank statement

Click Import Statement, then Choose CSV Files… and pick your bank’s exports — several at once is fine (checking and credit card together). The app reads each line and sorts every one into a labeled group with its reason printed beside it:

GroupWhat happens and why
TransfersSkipped. A credit-card payment appears in both accounts — that is the same money twice, not an expense.
Income already on cardsSkipped. Marketplace payouts are your sale proceeds; they already live on each sold card as its Net Sale.
Card costsSkipped. Card purchases and grading charges ride on the cards themselves — booking them here would double-count.
Shipping labelsSkipped as expenses. Label costs belong on the sale they shipped (the Shipping Ledger), never in OpEx.
Covered by a recurring ruleMarked “covered,” never booked twice. The matching rule is named on the line. If the amount ever drifts from the rule, it is flagged.
Bank feesPre-ticked, ready to book under Bank Fees with the bank as vendor.
New — needs reviewEverything else. Titles are editable in place; pick a category, tick, book.
NEW — NEEDS REVIEW · 3 titles are editable — click to reword 08/03 AMAZON MKTPL*562SQ9FA0 $81.86 — category — already in ledger BANK FEES · 2 ✓ 2 booked successfully 08/10 M&T Service Charge - 0898 $3.00 ✓ booked ✓ 2 booked successfully. Book 1 ticked entry
Figure 52 — The statement review. Skips are explained, booked rows go green and can never be sent twice, duplicates arrive un-ticked.

Three guardrails you will notice:

Booking talks back loudly: a green banner (top and bottom) counts successes; failures stay red and active with a plain-English reason on the exact row (“pick a category”), and already-booked rows are never re-sent — click Book as many times as you like.

12.10Importing receipt photos

A bank line like AMAZON MKTPL*562SQ9FA0 tells you nothing. The receipt tells you everything. Click Import Receipt PhotosChoose Photos… and pick up to ten screenshots or photos — Amazon order summaries, store receipts, anything readable.

  1. The app reads each image and proposes ledger lines: vendor, date, order number, total, and which of your cards paid, read straight off the receipt’s last four digits.
  2. A receipt with several items becomes several lines — one per item, each with its own price and its own category. Tax or shipping hiding in the total is spread across the items fairly, to the penny, and labeled on each line (“incl. $1.27 tax/ship”) so nothing is invented silently.
  3. Quantities survive: “2 @ $15.94” is shown on the line and saved into the entry’s description along with the order number — permanently searchable.
  4. If the paying card is a personal one, the line arrives pre-marked reimbursable to its owner (see 12.11). A company card arrives unmarked. Either way you can flip it.
  5. An unknown card offers the full introduction: name it, choose whether purchases on it are always reimbursable and to whom — answered once, remembered forever.
  6. Review every line, adjust titles/dates/amounts/categories in place, tick, and Book. Same feedback rules as the statement importer: green ✓ booked rows are final and never re-sent; failures stay active in red with the reason in plain words.

12.11Payment methods that know themselves

Every payment method can carry three facts beyond its name: the card’s last four digits, its kind (credit, debit, checking, cash, PayPal…), and its reimbursement default — whether purchases on it are business-reimbursable and to whom. The house naming style makes methods self-explanatory: BK CC (Kevin) - 0881 is the company credit card Kevin carries; Kevin 9486 is his personal Discover.

This is what makes the importers feel telepathic: a statement or receipt that mentions …0881 files itself against the right method, brings the right paid-by, and pre-answers the reimbursement question. Set the last-4s up once — in the ledger or right inside an import — and every statement afterward sorts itself.

13Data Import

Gear → Data Import. Manager-only. Seven importers behind one screen, plus a drop layer that reads a file's header row and takes you to the right one. Every importer follows the same shape: load → match → review → apply, and nothing is written until you press Apply.

13.1Drop a file and let it route you

Drag any file anywhere onto this screen. The app reads its header row and tells you which importer it belongs to. Nothing is parsed or written by the detection layer — the verdict only moves you to the right screen; the importer still asks for your approval before a single row is written. Routing, never applying.

Drop to identify eBay · CollX · CDP · PSA — I'll read the header and open the right importer Detected 3 file(s) Clear eBay-OrdersReport-2026-08-01.csv eBay orders report HIGH CONFIDENCE books money Data Import → eBay → Sales — Books sales — gross, net, shipping and order number onto matched cards. matches the EbaySales.jsx header test (9/11 known columns) — sales record number,order number,item number,custom label,… inventory-export.csv CDP batch export MEDIUM CONFIDENCE Data Import → CDP — Matches by cert or SKU and fills attributes and photos. ⚠ only 6 of 17 columns CDP reads are present — the import will be thin Screenshot 2026-08-19.png Unrecognised file NO CONFIDENCE Nothing in this file matched a known importer signature. no header row in the first 40 lines matched a known importer These don't all belong to one importer, so nothing was switched — pick the importer you want above, then drop the matching files onto its own panel.
Figure 36 — The drop overlay and the verdict panel. Colour follows confidence, so "I'm sure" and "I'm guessing" never look alike.
ConfidenceMeaning
highThe gate matched and most of the columns that importer reads are present. Only high-confidence single-importer drops are loaded for you automatically.
mediumThe gate matched but fewer than half the useful columns are there — the import will be thin.
lowThe gate matched but a required column is missing. Low means the importer will still refuse the file. You are routed there to look, never auto-loaded.
noneNothing matched.

Three things the drop layer will tell you honestly:

Each importer keeps hold of the files dropped for it until you press Clear — so you can drop Listings, then PSA, and Listings is still there when you go back: Files still held: ebaysales (1) · cdp (2) — each importer keeps its own until you press Clear.

IMPORT Generic CSV PSA PSA Grading Return EBAY Purchases Listings Sales COLLX Sales CDP CDP Batch The eBay order is deliberate and matches the life of a card: Purchases → Listings → Sales, not alphabetical. Only the active importer is loaded, so switching modes puts its file away — which is why each keeps its own hand-off.
Figure 37 — The seven importers, grouped under coloured band lines exactly like the Ledger's category bands.

13.2Generic CSV — any file, propose → review → approve

"Upload any CSV. Confirm what each column means, review every proposed change old-beside-new, and nothing writes until you approve it. Sold Price / Date Sold only ever write to cards already marked Sold — this tool never changes a card's status."

CSV Import — any file, propose → review → approve Tell the tool what each column means. Known headers are pre-mapped — check them. At minimum map Cert Number or Card Name so rows can match. august-repricing.csv · 214 data rows Start over CSV COLUMN SAMPLE VALUES MEANS Certification Number 104214318 · 0278119 · 88214077 Cert Number (matching + fill if empty) Title 2024 Topps Chrome Update #US200 Luis Arraez… Card Name (matching + optional rename) Start Price 184.00 · 64.50 · 425.00 Asking Price Serial Number 150 · 399 · 75 — ignore — Player Luis Arraez · Bo Bichette · Jackson Holliday Player (improves matching) ☑ Also propose adopting the CSV's card name as the description (name normalisation — every rename is shown for review) Match & review 1 1 · “Serial Number” is the print run (/150), not a certification number — it is left unmapped on purpose.
Figure 38 — The mapping screen. A mapped column turns emerald; each role can only be used once.

The eleven roles: — ignore — · Card Name (matching + optional rename) · Cert Number (matching + fill if empty) · SKU / Custom label (matching + fill if empty) · Purchase Price (base cost) · Asking Price · Sold Price (sold cards only) · Date Sold (sold cards only) · Order ID (marketplace order number) · Year (improves matching) · Player (improves matching).

Two gates stop you before you can do damage:

How rows are matched

TierTest
CERTThe cert number matches exactly
SKUThe SKU matches exactly
EXACTThe normalised card name is identical
STRONGA close fuzzy name match (0.80 or better)
MAYBEA weaker fuzzy match (0.45 or better)
NO MATCHNothing

A matching Year adds a small bonus, and so does a matching Player — which is why mapping those two columns is worth doing even though they never get written.

Select FILLS · CERT+SKU+EXACT Select FILLS · STRONG Select OVERWRITES · CERT+SKU+EXACT Clear selection Apply selected (42 changes on 38 cards) Every change has its own checkbox — nothing is pre-selected. FILL = the field is empty and gets a value; OVERWRITE = an existing value would be replaced. MAYBE rows and multi-match rows are always manual. TIER CSV ROW MATCHED CARD PROPOSED CHANGES (TICK EACH ONE TO APPLY) CERT 2024 Topps Chrome Update #US200 Luis Arraez #1042 2024 TOPPS CHROME UPDATE #US200… ☑ Asking Price: (empty) → $184.00 fill SKU 2020 Topps Chrome #201 Bo Bichette RC #1045 2020 TOPPS CHROME #201 BO BICHETTE RC ☐ Asking Price: $64.50 → $72.00 overwrite STRONG 0.87 2023 Bowman Chrome BCP44 Holliday #1043 2023 BOWMAN CHROME PROSPECTS #BCP44… Sold Price: (card is not Sold) → $425.00 (skipped) MAYBE 0.52 2021 Prizm Josh Allen Silver #1044 2021 PANINI PRIZM #325 JOSH ALLEN SILVER multi-match tick individually NO MATCH 2016 Topps Update Anderson Matched: CERT 118 · SKU 41 · EXACT 22 · STRONG 19 · MAYBE 8 · no match 6. Proposed changes: 96 fills · 14 OVERWRITES. There is deliberately no “select overwrites · STRONG” button, and MAYBE can never be bulk-selected at all.
Figure 39 — The Generic CSV review. Every change carries its own checkbox and its own fill/overwrite chip.
Generic CSV guardrails Nothing is pre-selected. Overwrites are only ever selected by their own button or your own tick. Sold Price and Date Sold only write to cards already marked Sold — on any other card the value is shown greyed with (card is not Sold) and a trailing (skipped), so you can see the tool saw the value and refused it. This tool never changes a card's status. Archived cards are never matched. And when two CSV rows land on one card, both are chipped multi-match and excluded from every bulk selection.

Applying asks first: Write 42 selected change(s) to 38 card(s)? This INCLUDES 6 overwrite(s) of existing values. Writing a Date Sold also sets the Year Sold from it.

13.3eBay Sales — the money importer

This is the only eBay importer that books money. Upload the eBay orders report; it matches by eBay item number first, then base SKU, then title, and uses the file's real Sold For and Shipping — no guesses.

eBay Sales 🚨 2 REFUNDED ORDERS ARE BOOKED AS REVENUE Refunds are detected by arithmetic, not by a column — eBay's report has none. An order whose Sold For + Shipping + Tax add up while its Total Price is $0.00 was refunded in full. Checked per order, never per line. Refunded lines can never be applied. These cards are booked against the very order eBay refunded, so revenue is overstated by roughly $412.60. Open each one and un-sell it. Lines: 514 New sale: 128 Mismatch: 11 Done: 351 Not in app: 6 ⚠ Two new sales claim one card: 2 ⛔ Skipped (refunded / canceled / $0): 18 Bring in 128 sale(s) STATUS HOW EBAY TITLE → CARD GROSS NET SHIP DATE 🚨 REFUND BOOKED AS SALE 2022 Topps Chrome #150 Paul Skenes → #1188 $212.60 2026-08-02 ⛔ SKIPPED 2021 Prizm #325 Josh Allen — REFUNDED — the buyer was made whole ($88.00 returned) NEW SALE Item# 2024 Topps Chrome Update #US200 Luis Arraez → #1042 $184.00 $160.87 $5.62 2026-08-11 MISMATCH Title 86% 2019 Optic #158 Ja Morant → #1046 Order #: 12-98221-44112 → 15-14761-19242 · Sold $: $150.00 → $162.00 NOT IN APP 1984 Fleer #7 Jim Dwyer — tick to create the card from the sale, marked Sold $12.00 NEW SALE Title 41% 1984 Fleer #9 Dan Ford → #2303 ⚠ Another row in this file also matched card #2303. At most one of them is right. Auto-ticked: only NEW SALE rows matched better than a guess and not competing with another row for the same card.
Figure 40 — eBay Sales. Six buckets, a permanent refund sweep, and a duplicate-target warning.
BucketMeaningAuto-ticked?
NEW SALEA matched card that is not yet sold — this is the sale to bookYes, unless it was a weak guess or two rows claim the same card
MISMATCHThe card is already Sold under a different order, and the numbers differ. Every difference is listed old → newNo — never written unless you tick it
DONEAlready sold under this order. Left alonen/a
NOT IN APPNo card matched. Tick it and the card is created from the sale, already marked SoldNo
⛔ SKIPPEDRefunded, canceled, $0 gross, or a net that computes to zero or less. Shown so you know they were seenNever — they can never be written
🚨 REFUND BOOKED AS SALEThis file proves the order was refunded and a card is booked against that exact orderNever
Zero-total refund detection eBay's report has 82 columns and not one of them says "refunded". A full refund is only visible arithmetically: the order's parts (Sold For + Shipping + Tax) add up to a real number while Total Price is $0.00, because eBay zeroes the total when the money goes back to the buyer. The check runs per order, never per line — a multi-item order carries its total on one line only — and it ignores old orders whose money columns are simply blank. The sweep is shown even when the answer is none: ✓ Refund sweep: no refunded orders in this file. A silent screen cannot tell you it checked.

Before writing anything, a collision check runs across everything you have ticked: Two or more ticked rows write to the same card (#2303, #2486). Only one can be right — the second would overwrite the first. Untick all but one for each, then apply.

Result: Applied. Brought in 128 sale(s), created 6 new card(s), skipped 18, 0 failed. Reload the Ledger.

13.4eBay Listings — stamping item numbers

Books nothing. Upload the Active Listings report and it stamps the permanent eBay Item Number onto each card, so every future sale matches exactly instead of by fuzzy title. The checkbox only cards missing an item # is on by default. SKU and strong title matches are auto-ticked; weak ones are not. Result: Stamped 84 item number(s), 0 failed.

13.5eBay Purchases — filling the buy side

The only importer that reads a real Excel workbook as well as CSV. Each purchase is fuzzy-matched by name to an existing card. Each row gets a dropdown: ✓ Fill match, ➕ Create new, or Skip.

Result: Applied. Created 14 new card(s), filled 63 existing, skipped 9, 0 failed. New-card photos pull in the background.

13.6CollX Sales — saved order pages

"Drop saved CollX order pages — as many at once as you like. In Chrome, open an order and press Cmd-S; either 'Webpage, Single File' (.mhtml) or 'Webpage, Complete' (.html) works. Gross and net come from the page, never from the CSV."

CollX — Sales 1,958 cards loaded · platform “CollX” 3 orders 4 ready to book 1 needs a card Net to book $482.44 Apply 4 sale(s) 7VWGJW2CHYBK 2026-08-14 · Marcus T (@mtcards) · COMPLETED gross $228.00 · fee $22.80 · protection $0.00 · net $205.20 ✔ Just booked — 2 card(s) written to the ledger by this import. Locked. COLLX ITEM GRADE GROSS NET CARD IN THE LEDGER Luis Arraez — 2024 Topps Chrome Update sku BFL-EB14261 PSA 10 $184.00 $165.60 ✔ SKU #1042 2024 TOPPS CHROME UPDATE #US200… cert 104214318 · cost $96.40 · asking $184.00 · Monroe Bo Bichette — 2020 Topps Chrome CollX id 88214 — not ours raw $44.00 $39.60 choose the card → Search by anything — card id, cert number, player, set, sku. Pick exactly one. e.g. 157190099 · 1789 · marcelo mayer lunar glow Best guesses · radio-select one · already-SOLD rows dim and warn
Figure 41 — A CollX order. The green banner distinguishes "you just booked this" from "this was booked before".
ConceptWhat CollX does
GrossThe item price on the page — what the card actually sold for.
NetSeller's Proceeds — what CollX actually paid you. Shipping Protection is already inside it; never subtract it again.
Never the CSVThe orders CSV carries a list price, not the sale price. Drop it only for the checklist of orders whose pages you have not saved yet — it books nothing.
Matching ladderSKU exactly → cert number → name + set + grade → the picker → typing a card id.
Multi-item ordersThe order's net is split across the cards weighted by item price, to the penny.
CollX guardrails An order that already carries cards is locked and cannot be re-booked: ✅ Already in the ledger — 2 card(s) already carry this order number, booked before this import. Locked so it can't be double-booked. A refunded or canceled order books nothing, ever. One card may serve exactly one line across the whole batch. A card that is already Sold can still be chosen, but it shouts first. And auto-ticking only happens when one candidate is clearly ahead of the next — anything closer than that is a decision, and decisions belong to a human.

13.7CDP Batch — attributes and photos

"Upload a Card Dealer Pro batch export. It matches every row to a card by cert number (SKU as backup), then proposes eBay platform, asking price, the CDP/eBay listing name, and the card attributes. Blank fields are pre-ticked; anything that would overwrite an existing value is shown old→new and left for you to approve. Dropdown values are never created."

Cards: 831 Fills: 1,204 Overwrites: 214 Review: 11 No match: 56 Apply 1,204 selected #1042 2024 TOPPS CHROME UPDATE #US200 LUIS… 6/6 Asking Price FILL (empty) → $184.00 Set FILL (empty) → Chrome Update Listed On FILL (empty) → eBay · CollX Grader FILL (empty) → PSA ☐ Asking Price OVERWRITE $210.00 → $184.00 ☐ Card Type REVIEW CDP category “Tcg” has no dropdown match — pick one ▾ Photos 56 matched card(s) are missing a front or back that this file can supply. Attach 56 missing …16/56 processed (12 fronts, 9 backs) DONE. fronts=41 backs=15 failed=0 Only the missing side is ever sent — an existing image is never overwritten. Not in the app — 56 row(s) 52 of these look like cards you already have. A SKU can drift, so a miss on the exact keys is not proof a card is new. Those rows show the likely existing card and can't be ticked — creating one would make a duplicate. If a suggestion is genuinely wrong, use “different card” on that row to unlock it. ☐ (locked) 2020 Topps Chrome #201 Bo Bichette RC PSA 9 · BFL-EB99201-d2z7v · $64.50 ↳ looks like #1045 2020 TOPPS CHROME #201 BO BICHETTE RC · BFL-EB99201 · 87% [different card]
Figure 42 — CDP proposals. Fills are pre-ticked, overwrites are not, and a REVIEW change has no value at all until you pick one.
CDP guardrails Dropdown values are never invented. If CDP sends a Card Type or Brand that is not in your dropdown, you get a picker and a hint, not a guess. Listed On is additive only — the importer can add a marketplace but never remove one, because removing a listing is a destructive edit and this importer only ever adds. A card that matched but is archived is refused, with the note matched #1188 but it is ARCHIVED — skipped. And the duplicate guard above is the big one: a miss on cert and SKU is not proof a card is new, so the row is blocked and the likely existing card is shown. Creating a duplicate is the single worst outcome this importer could produce.

New cards created here land as For Sale with cost $0 — CDP only knows what a card is listed at, never what you paid — and their front and back images are pulled into our own storage in one batch.

13.8PSA Grading Return

"Upload the PSA order CSV. It matches + parses every returned cert (AI) against the cards at 'PSA Grading'. Assign each to an existing card or create it new, then Apply. Nothing writes until you Apply. You can Save the review as a draft and Resume it later."

PSA Grading Return PSA order # 26599795 Total grading bill $ 1420.00 Destination (all cards) MONROE ▾ = $47.33/card · 3 set manually Pool: 42 Auto: 26 Cluster: 4 New: 3 Low: 2 Unassigned: 1 Apply 29 to cards CERT # GR FEE $ PSA NAME → BECOMES ASSIGN APP CARD DEST. CONF. 104214318 10 47.33 2024 TOPPS CHROME UPDATE #US200 LUIS ARRAEZ PSA 10 #1042 2024 TOPPS CHROME UPDATE… MONROE high 104214319 9 62.00 auto 2023 BOWMAN CHROME PROSPECTS #BCP44 HOLLIDAY PSA 9 #1043 2023 BOWMAN CHROME… medium 104214320 10 2021 PANINI PRIZM #325 JOSH ALLEN SILVER PSA 10 #1042 2024 TOPPS CHROME UPDATE… low 104214321 8 2019 PANINI DONRUSS OPTIC #158 JA MORANT PSA 8 ➕ Create as NEW card will be inserted, graded ⛔ Two certs are assigned to the same app card — fix the highlighted rows first. 💾 Save draft · Resume: 26599795 · 2026-08-20 14:22 ▾ · ⤓ Pull PSA photos now The candidate pool is only cards sitting at the “PSA Grading” location — the cards you actually sent in. The grading bill is spread evenly across the certs; type a fee on any row to pin it and the rest re-spread around it.
Figure 43 — PSA Grading Return. A duplicate assignment tints the row and disables Apply entirely.
  1. Drop the PSA order CSV. The order number auto-fills from the file name if it contains a long number.
  2. Type the Total grading bill $ — you will see the per-card spread appear.
  3. Set the destination location for the returning cards.
  4. Press Run AI match. Each cert gets a suggested card and a confidence.
  5. Fix anything wrong: pick a different card, choose ➕ Create as NEW card, or leave it — skip / unassigned —.
  6. Pin any individual grading fee that differs; the rest re-spread automatically.
  7. Apply N to cards. Then ⤓ Pull PSA photos now fills in the images.

Half-finished? 💾 Save draft stores the whole review — assignments, fees, destinations — and Resume: brings it back, re-reading the pool so cards you have added since are assignable.

The AI proposes; you dispose The matcher is told to ignore grades when judging identity (the cards you sent in are ungraded, after all), to use each candidate card at most once, and to answer "no confident match" rather than guess. It writes nothing at all — the app applies only what you confirm.

13.9Things that can never be written, anywhere

14The Admin Console

The gear opens a full-screen console with nine tabs. Managers see all nine; everybody else sees one — their own profile, and the console is titled My Account instead of Admin Console.

Admin Console CONFIGURATION · USERS · DATA My Profile Users Dropdowns Photo Import Data Import Purchases Integrity Bulk Edit Settings Managers land on Users; everyone else lands on My Profile and sees nothing else. Clicking the header's integrity badge instead opens this console pre-navigated to Integrity.
Figure 44 — The Admin Console tab bar. A non-manager can never be dropped onto a manager pane, even by a deep link.

14.1My Profile

Everybody's own pane. You can edit your first and last name and nothing else — email, role, finance access and account status are read-only and set by a manager. Press Save name for Saved.; a blank first name gives First name is required.

The footer explains why the name matters: "Your name appears throughout the app, including Owned By and Paid By on cards." Changing it here changes it on every card that references you.

14.2Users

+ Invite user Activity log Refresh Refresh also promotes anyone who has just set their password from “invited” to “accepted”. NAME EMAIL ROLE FINANCE STATUS ACTIONS Kevin Reid you kevin@bkcards71.com Partner Yes active Edit Reset pw Brian Doyle brian@bkcards71.com Partner Yes active Edit Reset pw Suspend Remove login Dana Whitfield dana@example.com User No invited Edit Resend Reset pw Sam Ortega sam@example.com Viewer Yes suspended Edit Reactivate Delete Company, Partner and Admin always have Finance & Insights access, and their accounting identity is permanent — their login can be removed but the record stays so historical cards keep their owner and payer. Only User and Viewer accounts can be permanently deleted. Server guardrails you cannot click past · You cannot suspend, remove or delete your own account. · “Cannot remove the last active manager.” — the system is never left without one. · “This user is referenced by 412 card(s) and cannot be deleted. Remove their login instead.” · Every action is written to the activity log with who did it, to whom, and when.
Figure 45 — The Users tab. Row actions change with each person's status; the destructive ones all confirm first.
ActionShown whenWhat happens
EditAlwaysInline first/last name, role and finance switch. Promoting to a manager role forces finance access on.
ResendStatus is invitedSends the invitation again.
Reset pwThey have an email and are not removedSends them a password-reset email.
SuspendNot you, status activeConfirms "Suspend dana@example.com? They will not be able to sign in."
ReactivateNot you, status suspendedLifts the block.
Remove loginNot you, they have a login"Accounting history is preserved and this cannot be undone without re-inviting." The person's accounting identity survives so old cards keep their owner and payer.
DeleteNot you, and role is User or Viewer"PERMANENTLY delete sam@example.com? This cannot be undone." Blocked if any card references them.

Inviting someone

  1. + Invite user.
  2. First name, last name, email. (First name and email are required.)
  3. Pick a role from the five chips — the hint under each explains it: BKCards71 — the entity, Full access, manages users, Can edit cards, Read-only.
  4. Set Finance & Insights access — for a manager role this is replaced by Always granted for Partner.
  5. Send invitationInvite sent to dana@example.com.

14.3Dropdowns

Nine managed lists feed the dropdowns everywhere else in the app. Add a value here and it appears in the card editor, Bulk Edit and the importers immediately.

Brand Card Type Purchase Platform Pay Method Grader Location Listing Platform Sold Platform Proceeds To Add a new Brand… Add ☐ Show retired values 14 value(s) Topps Active Rename Retire Panini Active Rename Retire Bowman Active Rename Retire Sage Retired Rename Restore There is no delete. Retiring hides a value from future dropdowns without touching cards that already use it. Renaming updates the label in place — every card that used it follows along. Adding a duplicate is refused: “Topps” already exists. Sale Type (disposition) is deliberately not managed here — it carries accounting behaviour.
Figure 46 — Dropdowns. Nine lists, retire instead of delete, and duplicates are caught case-insensitively.

The nine lists: Brand, Card Type, Purchase Platform, Pay Method, Grader, Location, Listing Platform, Sold Platform, Proceeds To.

14.4Photo Import

Four panels that between them get an image onto every card. Everything here copies the image into our own storage — no path in this tab leaves a card pointing at somebody else's server.

WITH FRONTS 1,004 MISSING FRONTS 954 MISSING BACKS 1,420 PSA CERTS READY TO TRY 137 Photo Coverage by Grader CARDS COMPLETE (F+B) FRONT ONLY BACK ONLY NO PHOTOS READY TO TRY (PSA) PSA 642 318 204 6 114 137 SGC 188 60 98 0 30 Raw 1,128 112 206 0 810 TOTAL 1,958 490 508 6 954 137 Buckets are mutually exclusive: Complete + Front Only + Back Only + No Photos = Cards. Click any count to see exactly which cards it includes (with a CSV download). Ready To Try = PSA cards with a cert, no front photo, and no recorded PSA verdict yet. PSA Cert Photos 100 free PSA calls per day · progress is remembered CDP CSV Photos (by cert) Cards that already have a photo are never overwritten Raw Photo Matching propose → review → approve · nothing attaches until you say so
Figure 47 — Photo Import: the live counts, the coverage table (every number is clickable), and the three loaders.

PSA Cert Photos

Finds every PSA-graded card with a cert and no photo, asks PSA for the image, and attaches it. Set Calls this run (default 90, max 100) and press Run today's batch; it becomes a red Stop while it runs. The log tells you exactly what happened per cert:

Quota discipline PSA allows about 100 calls a day. Every definitive answer — image found, no image exists, hard error — is recorded so that cert is never asked again. Transient failures are deliberately not recorded, so they retry. And the back image rides along on the same call, free.

CDP CSV Photos (by cert)

Upload a Card Dealer Pro export. Rows with a certification number and an image are matched by cert (or by base SKU) and the image is copied into our storage. Only the missing side is ever sent; rows already covered are counted as fully covered and skipped.

Raw Photo Matching — propose → review → approve

For cards with no cert. Upload a CSV with a title and a front image; the tool scores every row against the ledger and sorts them into EXACT, STRONG, MAYBE and NO_MATCH. Then:

Approve all EXACT and Approve all STRONG do the obvious ones and report what they skipped. There is deliberately no bulk approve for MAYBE — those are yours, row by row. Attach approved (N) confirms before it writes.

14.5Data Import

Covered in full in §13.

14.6Purchases

Your eBay purchase history, in the app, matched to cards by hand — nothing here is automatic. A search box (Search name, order #, seller…), a four-way filter (all | unmatched | matched | converted) and a counter. Hovering a thumbnail pops the full purchase: order number, item id, date, item price, order total, quantity, seller, tracking and any note.

Two actions once you have selected rows:

  1. Match N to card → — search for a card by description, SKU or id and link all the selected purchases to it. Confirmation: Matched 3 to card ✓.
  2. Turn N into Live Card(s) — creates brand-new cards from the purchases. Each gets a fresh sequential SKU, the item name as the description, the order date as the purchase date, the order total as base cost, the order number, the purchase image, and status For Sale. Already-converted purchases are filtered out first. Result: Created 4 card(s) ✓ — find them in the Ledger to finish details.

The match column shows one of ★ new card #1974 (converted), ✓ #1042 … with an to unmatch, or unmatched.

14.7Integrity

Covered in full in §15.

14.8Bulk Edit

Covered in §9.1.

14.9Settings — platform fees

The tab is called Settings and contains exactly one subject: Platform Fees. Its intro is the model in one line:

"These rates drive every Mark-Sold estimate and the eBay importer — live, no deploy needed. Flat model: net = gross × (1 − fee%) − per-order fee. Platforms with tiers pick the bracket by sale price instead. Estimates are always trued up by the real payout."

Everything must be a number of zero or more — eBay: fees must be numbers ≥ 0. — and deleting a tier confirms: Delete the eBay tier starting at $250? Every change is written to the activity log.

15Integrity — every check, and what to do

The Integrity tab runs 18 standing checks in six categories over every live card. Archived cards are excluded from all of them — archiving genuinely resolves an issue, so it never nags. Every count is clickable, every list downloads as CSV, and seven of the checks can be fixed inline without leaving the screen.

"Standing data-quality checks, grouped by area. Archived cards are excluded. Click any count to see the exact cards, with a CSV download."

Standing data-quality checks, grouped by area. Archived cards are excluded. Click any count to see the exact cards, with a CSV download. 1,284 total flagged. Refresh Sale & financial consistency 31 flagged Sold, missing details 14 SOLD cards missing a sale year, price, or platform. (An exact day is optional — the year drives accounting.) View 14 cards → Sale data on unsold card 2 Not-sold cards still carrying a sale — price, net, date, year, platform, or marketplace order number. View 2 cards → Status and disposition disagree clean ✓ Every card's status matches its disposition. Sold with no order number 9 Sold on a marketplace but no order number recorded — a refund on it would never be spotted. View 9 cards → Wrong sale year 3 Year Sold does not match the Date Sold — this corrupts your 2025/2026 tax buckets. View 3 cards → Sold for $0 or less 3 SOLD cards with a $0 or negative sale price — confirm gift vs. data error. View 3 cards → Cost & acquisition 1,183 flagged Grading 44 flagged Ownership & references 22 flagged Impossible / sanity all clean Collection-facing 1 flagged Scanned 1,958 live cards (1,973 incl. archived). Colour is category identity, not severity — inside this tab every flagged check is amber and every clean one is emerald.
Figure 48 — The Integrity tab. A flagged check is amber with a count; a clean one is slate with an emerald clean pill and the reassuring sentence.

15.1Sale & financial consistency — 6 checks

CheckWhat it meansWhat to do
1. Sold, missing details A sold card with no sale year, no price, or no platform. "An exact day is optional — the year is what drives accounting." Open each card and supply the missing piece so the revenue can be attributed. inline fix: Sold $
2. Sale data on unsold card A not-sold card still carrying a sale — price, net, date, year, platform or marketplace order number. "A reversed sale should leave none of these behind." This is a half-reversed sale. Either finish the reversal (un-sell it properly through the chooser) or put the card back to Sold. This is one of the two red-badge conditions.
3. Status and disposition disagree The Status says one thing and the Sale Type says another — e.g. a card marked For Sale that still carries "Sold – Straight Sale". "This is what a half-reversed sale looks like." Decide which is true and fix the other in the card editor. The second red-badge condition.
4. Sold with no order number Sold on a marketplace but no order number recorded. "The sale can't be traced back to eBay or CollX, so a refund on it would never be spotted." Paste the eBay/CollX order number onto the card. Gifts and write-offs are excluded — they have no marketplace order.
5. Wrong sale year Year Sold does not match Date Sold. "This corrupts your 2025/2026 tax buckets." Correct whichever is wrong. This one directly moves money between tax years.
6. Sold for $0 or less A sold card with a zero or negative sale price. "Confirm gift vs. data error." If it really was a gift or a write-off, set the Sale Type accordingly. Otherwise type the real price. inline fix: Sold $

15.2Cost & acquisition — 3 checks

CheckWhat it meansWhat to do
7. Missing / $0 cost A blank or $0 base cost — the acquisition price is missing. Enter what you paid. This is the biggest backlog bucket in the app, and it is a data-entry queue, not an alarm — it deliberately never lights the header badge. inline fix: Base Cost
8. Bad purchase date No purchase date, or a Purchase Year that does not match it. Set the purchase date; the year must agree with it. inline fix: Purchase Date
9. Negative money Any of base cost, tax, shipping, handling, grade fee, asking price or sold price is below zero. Correct the sign. A negative cost component silently distorts Total Cost, and therefore Net Return.

15.3Grading — 3 checks

CheckWhat it meansWhat to do
10. Duplicate certs Two or more live cards share a cert number — "the same physical card entered more than once." Work out which row is the real one and archive the other. A duplicate double-counts both cost and inventory.
11. Graded without cert The card looks graded (a grader or a grade is set) but has no cert number. Cards sitting at the grader are excluded — their cert is legitimately still pending. Enter the cert when it comes back. A missing cert also blocks the PSA photo backfill. inline fix: Cert #
12. Cert but not graded A cert number exists but the card is not marked graded. "A cert implies a graded card." Set the grader and the grade. inline fix: Grade

15.4Ownership & references — 2 checks

CheckWhat it meansWhat to do
13. Missing owner or payer No Owned By or no Paid By — "breaks partner splits." Assign both. Without them the capital waterfall and the profit split cannot be computed for that card. This is a good candidate for the drill-down's Edit selected bulk fix.
14. SKU collisions Two live cards share a SKU (case-insensitively). Re-SKU one of them. SKU is a match key for the eBay and CDP importers, so a collision misroutes imports onto the wrong card.

15.5Impossible / sanity — 3 checks

CheckWhat it meansWhat to do
15. Sold before bought The sale date is earlier than the purchase date. One of the two dates is wrong — usually a typed year.
16. Future date A purchase or sale date after today. Correct it. A future sale date lands the revenue in the wrong tax year.
17. Impossible card year The card year is blank, before 1900, or further out than next year. Set the print year. Next year is allowed, for pre-release product. inline fix: Card Year

15.6Collection-facing — 1 check

CheckWhat it meansWhat to do
18. Showcased, no photo A card set to show in Collection with no front image. Attach a front photo (via Photo Import or the card editor), or untick Showcase.

15.7The badge and the tab are not the same thing

The header badge watches only three of these eighteen, because the other fifteen are a data-entry queue rather than an alarm. A badge permanently reading "1,284" is a badge nobody reads.

Badge lineSeverityTab equivalent
Sale data on a card that isn't soldbrokenCheck 2
Status and disposition disagreebrokenCheck 3
Sold, missing platform or sale yearattentionA narrower version of check 1 — it ignores a missing price and excludes losses and gifts, which are legitimately $0 with no platform

Inside the tab there is no broken/attention distinction at all: every flagged check is amber, every clean one emerald. The category colours are identity, not severity.

15.8Fixing what a check found

Missing / $0 cost 1,183 cards · Click an ID/Description to edit, or fix inline. Edit selected (3) Download CSV × ID DESCRIPTION FIX: BASE COST CERT GRADE STATUS SOLD $ #1102 2021 TOPPS CHROME #220 WANDER FRANCO RC 42.00 Save For Sale #1144 2022 PANINI SELECT #44 JAYSON TATUM SILVER 0.00 For Sale #1188 2022 TOPPS CHROME #150 PAUL SKENES 0.00 104219981 10 Sold $212.60 Three ways to fix from here: 1 · Type in the emerald Fix column and press Save (or Enter) — the row disappears from the list as it resolves. 2 · Click an ID or description to open that card in the full editor. 3 · Tick several and press Edit selected for a bulk change across all of them. Empty state: “All fixed — nothing left in this check.”
Figure 49 — An Integrity drill-down. The seven fixable checks show an emerald Fix column; every check offers CSV, click-to-edit and bulk edit.

The seven checks with a one-field inline fix: Sold for $0 or less and Sold, missing details (Sold $), Missing / $0 cost (Base Cost), Bad purchase date (Purchase Date), Impossible card year (Card Year), Graded without cert (Cert #) and Cert but not graded (Grade).

Opening a card from here is safe Clicking through to the editor fetches the whole card first, precisely so that pressing Save cannot blank a column the drill-down did not show.

16Help & Support

The ? in the header is the one entrance. Everyone can reach it. Every form you submit lands in a tracked queue you can watch from the same panel.

Help & Support GUIDES · REQUESTS · ACCOUNT × GUIDES User Guide Function Reference ASK Submit an Issue Request a Feature CONTACT Contact Us ACCOUNT Password Something broken, wrong, or confusing? Describe it and it goes straight onto the fix list. Area of the app Ledger ▾ How bad is it? Annoying — there's a workaround ▾ Card ID(s) — optional e.g. 1042, 877 Subject Net Return blank on a card I just sold What happened What did you do, what did you expect, and what happened instead? Submit issue Submitting as Kevin · your name and role ride along automatically. MY REQUESTS In progress Issue Export View CSV missing Net Return Ledger · 8/19/2026
Figure 50 — Help & Support. Four groups, three forms, and a live status list of everything you have submitted.

Guides

Beneath them sit six quick recipes, the same ones reproduced in §1.2.

The three forms

FormUse it whenExtra field
Submit an Issue"Something broken, wrong, or confusing? Describe it and it goes straight onto the fix list."How bad is it?Blocking — I can't work / Annoying — there's a workaround / Cosmetic — looks wrong, works fine
Request a Feature"Wish the app did something it doesn't? Pitch it — capability requests drive the roadmap."
Contact Us"General questions — how a number is computed, where something went, how to do a thing."

All three take an Area of the app (General, Collection, Ledger, Card Editor, Scan, Data Import, Financials, Accounting, Photos, Admin Console, Other), optional Card ID(s), a subject and a description. Both subject and description are required — A subject and a description are both required. On success: ✓ Submitted — it's on the list. Track it under "My requests" below.

My requests

Your twenty most recent submissions, newest first, each with a status chip: New Seen In progress Done Declined. Empty state: Nothing submitted yet — your requests will show up here with their status.

Account → Password

Change password… closes Help and opens the change-password box. The copy warns: "You'll stay signed in here; other devices will need the new password next time they sign in."

17Guardrails — things that can never happen

These are the promises the app keeps whether or not anybody is watching. They are worth knowing, because they tell you which mistakes you do not have to worry about.

Money

Sales and reversals

Imports and AI

People and data

Display and totals

18Troubleshooting & known quirks

SymptomCause and fix
The grid is suddenly emptyCheck the photo funnel on the ID column. With both boxes unticked it shows zero rows. The echo pill in the status row reads No Photos Shown 0. Click it to reset.
Totals look stale after an importHard-refresh: Cmd/Ctrl + Shift + R. The app caches aggressively for speed.
The integrity count badge is redThe database and the app disagree on how many live cards exist. Refresh before trusting any number on screen.
Under the Archived facet every status chip reads 0Expected. The chips count live rows only, and the facet has narrowed the grid to archived ones. The footer's wording is also imprecise in that state.
My saved view lost its filtersViews store layout only — columns, widths and sort. Filters, search and the archived tick are never saved.
My column order jumped aroundAny column toggle re-orders the grid into the canonical order. Column order is not user-controllable.
Recent Sales does not show everythingIt caps at 400 rows with a notice. The net total in the header still covers every sale.
A recurring cost is one occurrence shortThe current, in-progress month is not counted until it ends. A monthly bill viewed in mid-August counts seven, not eight.
Unticking Active on a recurring entry changed nothingCorrect — that checkbox is inert. Set an End Date to stop a rule.
A "Fully reimbursed" entry still shows as owedThe balance follows the amount, not the label. Type the reimbursed amount.
Financials and Accounting show different Gross ProfitThey differ by exactly the shipping margin, by design. See §12.
The Accounting year toggle has no 2027That list is fixed in the code and needs a developer to extend.
A newly added Frequency behaves as one-offA frequency added from the entry panel has no month interval until an admin sets one. Same for a new category's capital flags.
The gear's tooltip says "Settings (coming soon)"Stale text. The Admin Console behind it is fully working.
A card reads Sold in the Ledger but not in Collection (or vice versa)Collection decides "sold" from the sale year; the health badge uses the sale status. A card with one but not the other is exactly what the badge is designed to catch — check Integrity.
The Excel Non-Card Ledger sheet does not match the screenKnown: that sheet exports unit amounts for recurring entries. Use the P&L Summary sheet for totals.
An importer refuses my fileRead the detection card: low confidence means a required column is missing and the importer will refuse it. Re-export from the source with all columns.
CDP says a card is "not in the app" but I know we have itLook for the ↳ looks like #1234 suggestion under the row — the exact keys missed but the name matched. Do not create; if the suggestion really is wrong, press different card to unlock the row.
PSA photo pulls stoppedPSA daily quota reached — run again tomorrow. Definitive answers are remembered, so tomorrow's run picks up where this one stopped.
A bank line I expected to book was skippedEvery skip prints its reason beside it. The usual answer: that money is already counted somewhere else — on a card, as a transfer between your own accounts, or by a recurring rule.
An import row failed with a red ✕The reason is written in plain English on that exact row (e.g. “pick a category”). Fix what it names and click Book again — rows already booked are never sent twice.
Do I need to refresh to see changes?Your own edits appear instantly. Changes from another device or partner stream in live on supported screens (coverage is expanding). After an app update is deployed, hard-refresh twice — the app caches hard.

19Glossary

TermMeaning
Asking PriceWhat you are asking for an unsold card. Drives Projected Profit (Sale) and the bulk-sale split. A blank counts as zero for sorting and filtering.
Base CostWhat you paid for the card itself, before tax, shipping, handling and grading.
Card TypeThe sport or product family — Baseball, Football, Pokémon. This is what the Ledger chips filter.
Canonical nameThe PSA-style card name built from the card's own attributes: year, brand, set, #number, player, subset, parallel, /print run, grader, grade.
Cohort (purchase cohort)The purchase-year bucket used by the capital waterfall. Everything before 2026 is one bucket, 2025 & before.
Comp As IsWhat the card comps at in its current condition. Feeds Unrealized P/L and Projected Profit As-Is.
Counts in FinancialsA per-card switch for whether it belongs on the books at all.
Disposition / Sale TypeHow a card left (or is sitting in) inventory: Sold – Straight Sale, Sold – Trade, For Sale – In Inventory, Not For Sale, Gifted, Lost, Forgery, Ripped Off, Destroyed. It carries accounting behaviour, which is why it is not editable from the Dropdowns tab.
Fill vs OverwriteImporter language. A fill puts a value into an empty field; an overwrite replaces something that is already there. Fills are safe, overwrites need your tick.
Gross ProfitRevenue minus cost of goods sold. In Accounting it also carries the shipping margin.
Item TypeThe kind of item — card, pack, lot. Distinct from Card Type.
Live cardAny card that is not archived. Every KPI in the app is computed over live cards.
Net Proceeds / Net SaleWhat actually landed in your account after the platform's fees.
Net ReturnProfit on a sold card: net proceeds + shipping margin − total cost. Database-calculated.
Not For Sale (NFS)A keeper. Excluded from for-sale inventory, the card-type chips and Money in Inventory; it gets its own KPI tile with an owner split.
Owned ByWho owns the card. Profit follows ownership.
Paid ByWho fronted the money. Cost recovery and losses follow the wallet.
Potential cardA row in Scan's holding area. Not inventory, not money, until you bring it in.
Print RunThe serialled quantity — the 399 in /399. Not a cert number.
Proceeds ToWhich account a sale's money landed in.
Shipping marginWhat the buyer paid for shipping, less what the label actually cost. Already inside every card's Net Return — never add it again.
ShowcaseA flag marking a card for display in Collection.
SKUYour own stock number, e.g. BFL-EB14261. A match key for the eBay and CDP importers, which is why collisions matter.
Sold PriceThe gross the platform reported, before fees.
Still outA partner's money that has not come back yet: adjusted capital advanced minus what they have recovered.
Total CostBase cost + tax + shipping + handling + grade fee. Database-calculated.
Year SoldDerived from Date Sold, and the field that drives every tax bucket.

20Index of figures

Fig.TitleSection
1The app header, tabs and right cluster1.1
2The sign-in screen2.1
3Setting a password2.2
4The integrity badge — four states3.3
5Collection, grid view4.1
6The Collection detail modal4.4
7The Ledger, whole screen5.1
8The KPI band5.3
9The Columns & Views popup5.4
10Status facet, rollup callout and card-type chips5.6
11The three kinds of column funnel5.6
12Hover thumbnail and the Select-to-Sell banner5.8
13The Recent Sales modal5.9
14The CSV export popup5.10
15The card editor drawer6.1
16The Card Name block and canonical assembly6.4
17Front and back photo tiles6.6
18The eBay Net What-If pad6.9
19The Mark Sold modal7.2
20Gift Profit to BKCards717.3
21The write-off modal7.5
22The un-sell chooser7.6
23The card journey timeline8
24The Bulk Edit picker9.1
25The bulk edit popup and its acknowledgements9.2
26Bulk Sale and the penny-exact split9.4
27Scan intake — PSA certs and the dropzone10.1
28The Scan gallery10.3
29The Review potential card panel10.4
30Financials — header, briefing and the eight KPIs11
31Gross Profit by Year and by Platform11.3
32Dead Money and the Data Quality tiles11.3
33The Accounting ledger and summary band12.1
34The Add Entry drawer12.2
35Statements — P&L bridge, P&L and the capital waterfall12.5
36The drop overlay and detection verdicts13.1
37The seven importers and their group bands13.1
38Generic CSV — the mapping screen13.2
39Generic CSV — the review screen13.2
40eBay Sales — buckets and the refund sweep13.3
41A CollX order and its card pickers13.6
42CDP proposals and the duplicate guard13.7
43PSA Grading Return review13.8
44The Admin Console tab bar14
45The Users tab14.2
46The Dropdowns tab14.3
47Photo Import — coverage by grader14.4
48The Integrity tab15
49An Integrity drill-down with inline fixes15.8
50The Help & Support overlay16
51The Financial Ledger toolbar & importer activators12.8
52Bank statement review groups & booking feedback12.9

S&T Card Manager — User Guide · Edition 3.0 · August 2026
Kevin · Brian · BKCards71