S&T Card Manager — User Guide
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.
| Tab | Colour | What it is for | Who sees it |
|---|---|---|---|
| Collection | teal | The showcase. Big card images, price, grade badges. Read-only — nothing is edited here. | Everyone. It is the landing tab. |
| Financials | violet | Executive dashboard for the card business: revenue, COGS, gross profit, ROI, aging, dead money, grading lift. | Finance access only |
| Accounting | emerald | The books: the non-card expense ledger, the P&L, the partner capital waterfall, tax schedule, distributions. | Finance access only |
| Ledger | amber | The card inventory grid — 64 columns, filters, saved views, editing, selling, CSV export. | Everyone |
| Scan | sky | Intake. Photograph a shoebox or paste PSA certs; AI proposes what each card is; you approve. | Everyone can upload; managers scan and bring in |
1.2Ten things, ten clicks
| You want to… | Do this |
|---|---|
| Record a sale | Ledger → click the card's name → Status = Sold → platform → total + net → Proceeds To → Confirm Sale |
| Sell a stack as one lot | Ledger → Select to Sell → tick the cards → Sell N selected → |
| Price a stack for a show | Ledger → filter down to the stack → read the live rollup line: You have $X across N cards |
| Add one card by hand | Ledger → + Add Card → fill in → Save → then attach a photo |
| Turn a shoebox into inventory | Scan → upload → pairs/fronts → Scan selected → review → Bring into App |
| Month-end eBay | Gear → Data Import → eBay → Sales → drop the orders report → review buckets → Bring in N sale(s) |
| Fix a bad number everywhere | Gear → Bulk Edit → filter → select → Edit selected |
| See what the business owes you | Accounting → Statements → Total Owed (All Sources) |
| See where the books are wrong | Click the integrity badge in the header |
| Totals look stale | Hard-refresh (Cmd/Ctrl + Shift + R) — the app caches aggressively for speed |
1.3House rules the app enforces
- The card row is the truth about money. History, events and audit trails record what happened; they never feed a total.
- Derived numbers are computed by the database, never typed. Total Cost, Net Return, Year Sold and the projected profits are calculated. The editor previews them live as you type, but the database's answer is what gets stored.
- Nothing an importer or the AI proposes is written until a human approves it. Scan writes to a holding table; the PSA matcher writes nothing at all; every importer has a review step and an explicit Apply.
- Photos are always copied into our own storage. The app never keeps a long-term link to PSA's, CDP's or anybody else's server, so an expired third-party link can never blank your images.
- Green means you type it. Grey means the database did. That colour convention runs through the card editor and the Accounting tab.
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.
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:
- At least 8 characters
- One uppercase letter
- One lowercase letter
- 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.
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.
| Role | Meaning | Manage users & dropdowns | Edit cards | Financials & Accounting |
|---|---|---|---|---|
| Company | BKCards71 — the entity | Yes | Yes | Always |
| Partner | Full access, manages users | Yes | Yes | Always |
| Admin | Full access, manages users | Yes | Yes | Always |
| User | Can edit cards | No | Yes | Only if the finance switch is on |
| Viewer | Read-only | No | No | Only 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.
2.4The account status ladder
Every person's account moves through a documented ladder. You will see these words on the Users tab.
| Status | How you get there | Can sign in? |
|---|---|---|
| invited | A manager sent an invitation | Only via the invite link |
| accepted | The invitee set a password (a manager pressing Refresh on the Users tab confirms it) | Yes |
| active | They signed in and the app actually loaded | Yes |
| suspended | A manager suspended them | No — banned until reactivated |
| removed | A manager removed the login; the accounting identity survives | No 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
- Wordmark — S&T Card Manager over the small caps line CARD MANAGER.
- The five folder tabs (see 3.2).
- The integrity badge — the health light (3.3).
- ? — Help & Support. Every role sees it.
- ⚙ — the Admin Console.
- Your name and the amber role chip.
- 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.
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 item | Severity | What it means |
|---|---|---|
| Sale data on a card that isn't sold | broken | A half-reversed sale — phantom revenue, or a hole where revenue should be. |
| Status and disposition disagree | broken | The Status says one thing and the Sale Type says another. |
| Sold, missing platform or sale year | attention | Revenue that cannot be attributed. Losses and gifts are excluded — they are legitimately $0 with no platform. |
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.
4.2The filter rail
The rail scrolls sideways on a phone and always keeps this order:
| Control | Options |
|---|---|
| Sort | Newest 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 pills | For Sale · Not For Sale · Sold — independent toggles, not a radio group. They union together. |
| Price | Under $15 · $15 – 25 · $25 – 50 · $50 – 100 · Over $100 |
| Attribute pills | Graded · Rookie · Autographed |
| Category / Year | Built from what you actually hold — categories alphabetically, years newest first |
| × Clear | Appears 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.
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:
- For Sale — count of cards that are neither sold nor Not-For-Sale, valued at cost.
- Not For Sale — count and cost of the keeper pile.
- Sold — count and the realised sale total.
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.
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.
5.2The toolbar
| Control | What it does |
|---|---|
| Search box | Matches seven fields — ID, SKU, description, player, cert number, brand, card type. (The placeholder only advertises five; SKU and card type are searched too.) |
| View name ▾ | Opens Columns & Views. Reads Built-in view until you apply a saved one. |
| + Add Card | Opens the card editor empty, in insert mode, defaulted to For Sale. |
| Select to Sell | Turns on multi-select for a lot sale. Becomes Done selecting. |
| Recent Sales | All sold cards, newest first, sortable — unaffected by every grid filter. |
| Export View CSV | Exports exactly what you are looking at, post-filter and post-sort. |
| Export Full DB CSV | Pulls 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).
| Tile | What it counts | Follows the year toggles? |
|---|---|---|
| Net Return Total | Sum of Net Return over sold, non-archived cards. Red below zero, green above. | Yes |
| Cards Sold | Count of sold, non-archived cards. | Yes |
| Total Sold $ | Sum of the sale proceeds on those cards. | Yes |
| Inventory Count | Cards in for-sale inventory. Excludes sold, archived and Not-For-Sale. | No |
| Money in Inventory | Total Cost of that same set — what you are into the stock for. | No |
| Not For Sale | Count · 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.
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.
- Set the grid up the way you want it — tick columns, drag widths, click a header to sort.
- Open View … ▾, type a name in the box, press Save current. You get Saved "Show floor" ✓ in green.
- Click the ☆ beside a view to make it your default — it becomes ★ and that layout loads automatically next time you open the app.
- Click a view's name to apply it (Applied "Sales only"); Delete removes it.
- Reset to built-in restores the 34-column default layout, re-fits every column to its content and sorts by ID.
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.
| # | Column | Group | Filter | Default | Notes |
|---|---|---|---|---|---|
| 1 | ID | Item | Photo coverage | ✓ | Frozen and locked. Its funnel is the Has Photo / No Photo filter. Hovering pops the card image. |
| 2 | Card Name | Item | — | ✓ | Frozen and locked. Click it to open the card editor. |
| 3 | Player | Identity | — | Searchable, not filterable | |
| 4 | Card Year | Identity | Min–max | ✓ | Type 2024 in both boxes to pick one year |
| 5 | Brand | Identity | Checklist | ✓ | From the managed Brand dropdown |
| 6 | Item Type | Identity | Checklist | The card_types lookup | |
| 7 | Card Type | Identity | Checklist | ✓ | The sports lookup — Baseball, Football, … This is what the chips filter |
| 8 | Set | Identity | Checklist | Set/product name only, no year or brand | |
| 9 | Subset | Identity | Checklist | ||
| 10 | Parallel | Identity | Checklist | ||
| 11 | Card Number | Identity | Checklist | ||
| 12 | Intake Title | Identity | Checklist | The name the card arrived with | |
| 13 | Intake Source | Identity | Checklist | scan, ebay, cdp-inventory, psa_return, app, reintake | |
| 14 | Name Source | Identity | Checklist | canonical, intake, user, grader | |
| 15 | Print Run | Identity | Min–max | Renders as /399 | |
| 16 | Rookie | Identity | Checklist (Yes/No) | Amber badge | |
| 17 | Auto | Identity | Checklist (Yes/No) | Sky badge | |
| 18 | Relic | Identity | Checklist (Yes/No) | Fuchsia badge | |
| 19 | Name Locked | Identity | Checklist (Yes/No) | Locked names are skipped by Generate names | |
| 20 | SKU | Identity | Checklist | ✓ | The importers' match key |
| 21 | Listing Name | Identity | Checklist | The title used on the marketplace | |
| 22 | Purchase Name | Identity | Checklist | ||
| 23 | CDP Name | Identity | Checklist | Card Dealer Pro's title | |
| 24 | Status | Status & Location | Checklist | ✓ | Pill: Sold / For Sale / Not For Sale |
| 25 | Location | Status & Location | Checklist | ✓ | Where the card physically is |
| 26 | Listed On | Status & Location | Checklist (multi) | ✓ | A card can be listed in several places; a row passes if any ticked platform matches |
| 27 | Showcase | Status & Location | — (none) | Sortable only — there is no funnel on this column | |
| 28 | Damaged | Status & Location | — (none) | Shows ⚠ Damaged; hover for the damage note. Sortable only | |
| 29 | Purchase Date | Acquisition | — | Sortable, not filterable | |
| 30 | Purchase Year | Acquisition | Min–max | ||
| 31 | Purchase Platform | Acquisition | Checklist | ||
| 32 | Owned By | Acquisition | Checklist | ✓ | Profit follows ownership |
| 33 | Paid By | Acquisition | Checklist | ✓ | Cost recovery and losses follow the wallet |
| 34 | Pay Method | Acquisition | Checklist | ✓ | |
| 35 | Platform Purchase Order ID | Acquisition | Checklist | ✓ | The buy-side order number |
| 36 | Grader | Grading | Checklist | ✓ | PSA / SGC / BGS / … |
| 37 | Grade | Grading | Checklist | ✓ | Shown combined, e.g. 10 Pristine; sorts numerically |
| 38 | Cert Number | Grading | — | ✓ | Searchable, not filterable. The photo importers' join key |
| 39 | PSA Order # | Grading | Checklist | ||
| 40 | Grading Paid By | Grading | Checklist | Drives the cross-partner grading rows in the waterfall | |
| 41 | Grade Fee | Costs | Min–max | ✓ | |
| 42 | Base Cost | Costs | Min–max | ✓ | What you paid for the card itself |
| 43 | Tax | Costs | Min–max | ||
| 44 | Shipping | Costs | Min–max | Inbound shipping you paid | |
| 45 | Handling | Costs | Min–max | Also where return costs land after a refund | |
| 46 | Total Cost | Costs | Min–max | ✓ | Calculated: base + tax + shipping + handling + grade fee |
| 47 | Comp As Is | Valuation | Min–max | ✓ | What it comps at in its current state |
| 48 | Projected Profit As-Is | Valuation | Min–max | ✓ | Calculated: comp − total cost. Red/green |
| 49 | Expected Sale (10) | Valuation | Min–max | ✓ | What it would fetch as a 10 |
| 50 | Projected Profit (10) | Valuation | Min–max | ✓ | Calculated. Red/green |
| 51 | Asking Price | Valuation | Min–max | ✓ | A blank asking price sorts and filters as 0, so a 0…0 range finds every unpriced card |
| 52 | Projected Profit (Sale) | Valuation | Min–max | ✓ | Calculated. With no asking price it reads set price rather than a fake number |
| 53 | Sale Type | Sale | Checklist | ✓ | The disposition — Sold – Straight Sale, Gifted, Lost, … |
| 54 | Date Sold | Sale | — | Sortable, not filterable | |
| 55 | Year Sold | Sale | Min–max | ✓ | Drives the tax buckets |
| 56 | Sold Platform | Sale | Checklist | ✓ | FB displays as Facebook |
| 57 | Proceeds To | Sale | Checklist | Which account the money landed in | |
| 58 | Platform Sale Order ID | Sale | Checklist | ✓ | Traceability back to eBay/CollX |
| 59 | Platform Sale Item ID | Sale | Checklist | ✓ | eBay item number — stamped by the Listings importer |
| 60 | Sold Price | Sale | Min–max | The gross the platform reported | |
| 61 | Net Proceeds | Sale | Min–max | ✓ | What actually landed after fees |
| 62 | Net Return | Sale | Min–max | ✓ | Calculated: net proceeds + shipping margin − total cost. Blank on anything not sold |
| 63 | Home | Storage Location | Checklist | ✓ | Where it lives when it is not at a show |
| 64 | Show | Storage Location | Checklist | ✓ | Derived: Case A2 or Bin 3, B, 12 |
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.
| Filter | Count | Where |
|---|---|---|
| Global search fields | 7 | Toolbar box |
| Status facet buttons | 5 | All / For Sale / Not For Sale / Sold / Archived |
| Card-type chips | 1 + N | Available plus one per card type in stock |
| Photo-coverage funnel | 1 | On the ID column header |
| Per-column checklist funnels | 37 | Column headers |
| Per-column min–max funnels | 19 | Column headers (numeric columns) |
| Show archived | 1 | Far right of the toolbar |
| × Clear all filters | 1 | Appears only when something is filtered |
Status facet and card-type chips
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.
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
- Sort — click a header label. Click again to flip direction. The active column turns amber and shows ▲ or ▼. Blanks always sink to the bottom, in both directions.
- Resize — drag the right edge of any header (Drag to resize · double-click to reset). Double-clicking re-fits that one column to its content.
- Auto-fit — on first load every column is measured against your real data and sized to fit, between 60 and 420 pixels. Any column you have resized by hand is never touched again by that process.
- Frozen pair — ID and Card Name stay pinned to the left while everything else scrolls under them. They are locked, so they can never be hidden — even if a saved view forgets them, they are put back.
- Virtualised rows — only the rows near your viewport exist in the page, which is why 1,958 rows scroll smoothly. Filtering and sorting are unaffected.
5.8Rows: hover, open, select
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.
5.10CSV export
Two buttons, two very different scopes:
- Export View CSV (teal) — exactly the rows you are looking at, after every filter and in your current sort order.
- Export Full DB CSV (indigo) — ignores the grid entirely and pulls the whole database live from the server, including archived rows. This is always the true current database, never a stale copy in your browser.
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.
6.2Green, grey and sky — the colour language
| What you see | What it means |
|---|---|
| Green border, focus turns brighter green | Editable. 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 editable | Temporarily locked while the platform's fee table computes it (Mark Sold's Net Sale). |
| Sky-blue bordered block at the bottom | The 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:
- Total Cost = base cost + tax + shipping + handling + grade fee (blanks count as zero).
- Projected Profit As-Is = comp − total cost. (10) = expected sale at 10 − total cost. (Sale) = asking price − total cost.
- Net Return = net proceeds + shipping margin − total cost, where shipping margin is what the buyer paid for shipping minus what the label actually cost. If you never record an external label cost, shipping washes to zero margin.
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.
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.
| Qualifier | Meaning |
|---|---|
| MC | Miscut (PSA) |
| MK | Marks (PSA) |
| OC | Off-Center (PSA) |
| OF | Out of Focus (PSA) |
| PD | Print Defect (PSA) |
| ST | Staining (PSA) |
| Pristine | CGC / BGS 10 |
| Black Label | BGS all-10 |
| Gold Label | SGC |
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.
| Provenance chip | Means |
|---|---|
| canonical | Built from the card's own attributes. It follows along automatically as you edit those attributes. |
| intake | The name the card arrived with, restored by Use intake. |
| user | You typed it. Locked — nothing overwrites it, including bulk Generate names. |
| PSA / SGC | Grader-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
6.7Save, Update, Cancel
| Button | Behaviour |
|---|---|
| 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 area | If 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.
6.8Archive, Restore, Delete
- Archive (amber) — hides the card from working views. Confirms with Archive this card? It will be hidden from working views. Sold cards still count in fiscal totals. Archiving is also how you retire a duplicate: archived cards are excluded from every integrity check, so archiving genuinely resolves a flag rather than hiding it.
- Restore (sky) — brings it back. The one state change with no confirmation, because it is harmless and reversible.
- Delete Permanently (red) — appears only when the card is already archived and you are an admin. Confirms with Permanently delete card #1042? This cannot be undone. It also removes the front image file.
6.9The eBay What-If pad
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 Sale | A one-line confirm: Change status to "For Sale"? |
| Not For Sale | Change status to "Not For Sale"? — the keeper pile |
| Sold | The 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.
7.2Mark Sold
- Open the card and set Status → Sold.
- Pick Straight Sale or Trade.
- Set Date Sold — Year Sold is derived from it, and Year Sold is what drives your tax buckets.
- Pick the Sold Platform. Net Sale fills itself immediately.
- Type the Total (the gross). Net Sale recomputes.
- Optionally set Proceeds To — which account the money landed in.
- 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.
- Tiered platform (a fee ladder by price) — the bracket is chosen by the sale price; net = total × (1 − fee%) − flat fee. Tiers always beat the flat rate.
- Flat platform — net = total × (1 − fee%) − per-order fee.
- No fee data — Net Sale is left for you to type, pre-filled equal to the Total.
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:
- Date Sold is required.
- Sold Platform is required.
- Sale Type is required.
- Total (gross) is required.
- Net Sale is required — pick a platform and it fills itself.
- Net Sale can't be negative — money received is never below $0.
- 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.
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
Confirmation: Written off — Lost. Full cost books as this year's loss.
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.
| Story | What it does to the money | Confirmation |
|---|---|---|
| Strike the sale | Every sale field is cleared. Nothing else moves. | Sale struck — clean, no ledger trace (audit kept). |
| Returned & refunded | Sale 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 & refunded | Sale cleared. The card never left inventory. | Order canceled — sale reversed, card never left inventory. Recorded in the card journey. |
| We kept the money | The 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. |
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.
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.
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.
The three safety layers
- Tick to arm. Nothing is written for a field you did not tick.
- 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.
- 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.
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.
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.
- In the Ledger, press Select to Sell and tick the cards (filter and sort freely — the selection follows the cards, not the rows).
- Press Sell N selected →.
- 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.
- Set the date, pick the platform, type the Total Sale (Gross), and optionally the order id.
- Check the preview table — the Totals row must equal your order.
- 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."
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.
10.2Uploading photos
- Front + back pairs (default) — photos pair in order: first is a front, second is its back, and so on.
- Fronts only — every photo becomes its own front-only card.
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
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
- Press Review & add → on a tile.
- Correct anything the AI got wrong — or, if it offered alternatives, click a closer match and the fields plus the name rebuild themselves.
- 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.
- 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."
- 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."
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:
- Open Intelligence → My Card Values.
- 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.
- Narrow further with the search box, the grader filter, or the value-state filter (never valued / stale / recent).
- Tick individual rows or use Select all, then click Check Value (n) — the button shows how many you selected.
- 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:
- Sample size — how many sales the value stands on, plus a low–high range.
- Confidence — strong (8+ sales), fair (3+), or thin. Thin values are honest guesses; treat them that way.
- The last three sales, with links — click through and see for yourself.
- The true window — “No sales in last N days” always states the real number of days the data covered, never a guess.
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.
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.
11.1Scope — the single most important thing on this page
| Visual | Follows the year pill? |
|---|---|
| Revenue · COGS · Gross Profit · ROI · Avg Days to Sell | Yes |
| Invested Capital · Unrealized P/L · Top-Card Concentration | No |
| Gross Profit by Platform | Yes |
| Gross Profit by Year · Revenue vs COGS by Year · Units Sold Over Time · ROI Distribution · Grade Lift · Best & Worst Flips | No — they show every year on purpose |
| Everything in Inventory & Velocity, Mix & Exposure, Buying Discipline, Grade Distribution, Grading Spend, Data Quality | No |
11.2The eight KPIs
| Tile | What it is | How to read it |
|---|---|---|
| Revenue | Gross sales of the cards sold in scope | Sub-line gives the card count |
| Cost of Goods Sold | Total cost of those same cards — basis + grading + shipping | The gap to Revenue is gross profit |
| Gross Profit | Revenue − COGS | Green above zero, red below; margin shown beneath |
| ROI | Gross profit ÷ COGS | Lifetime, not annualised — a one-week flip and a three-year hold count the same |
| Invested Capital | Cost basis tied up in unsold, for-sale inventory | Excludes Not-For-Sale |
| Unrealized P/L | Comp − cost across only the inventory that has a comp | If coverage is 42%, the number describes 42% of the book. Directional, never a balance-sheet figure |
| Avg Days to Sell | Mean purchase-to-sale time | Your cash conversion speed |
| Top-Card Concentration | Biggest single card as a share of invested capital | Single-name risk |
11.3The seven sections
| Section | Contains | What it is for |
|---|---|---|
| Capital Health | Gross Profit by Year · Capital Position (six mini-stats) | The shape of the business over time and where the money sits right now |
| Sales Performance | Revenue vs COGS by Year · Gross Profit by Platform · Units Sold Over Time · ROI Distribution | Which 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 Discipline | Avg 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 & Velocity | Inventory Aging · Money in Inventory by Sport · Dead Money | The red 90+ d bar is your problem. Aging counts from purchase, not from listing |
| Grading Performance | Pipeline chips · Grade Distribution · Grade Lift · Grading Spend by Payer | The Raw bar in Grade Lift is the control group — the case for grading is every bar that clears it |
| Mix & Exposure | Value by Sport · Value by Brand · Asking-Price Bands · Top 10 Cards by Cost Basis | Concentration risk in plain sight |
| Best & Worst Flips | Top Winners · Worst Losers, eight rows each | Ranked by absolute profit, not ROI — a $2 card that returned 900% will never appear here |
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
- $0 total cost inflates ROI and Grade Lift — those cards are skipped by the ROI histogram, so the bars will not add up to your sold count.
- Sold, missing Date Sold degrades Avg Days to Sell and pushes stray points onto the bare-year positions of Units Sold Over Time.
- Inventory w/o comp is exactly the gap behind the Unrealized P/L coverage percentage.
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: Ledger — Entry surface — you type it; Statements — Computed — finance & tax. Green means you type it; computed screens are read-only.
12.1The Ledger sub-view
The five summary stats plus the total:
| Stat | What it collects |
|---|---|
| Operating Exp | Business, counts-in-books entries whose category starts with "Operating Expense" |
| Capital Equip | Categories flagged as capital equipment (CapEx) |
| Write-Off | Categories whose name contains "Write-Off" |
| Owner Capital | Categories flagged as capital contributions |
| Personal (excl.) | Every personal-scope entry, whatever its category — counted here and nowhere else |
| Total · in books | Everything 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
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.
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.
- The current, in-progress month is not counted until it ends. A monthly bill started in January and viewed in mid-August counts 7, not 8.
- To stop a rule, set an End Date. Occurrences after that month stop counting immediately, in every year scope.
- Prior-year / this-year / all-time totals come from flipping the year toggle, not from an in-row breakdown.
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.
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.
The three rules that drive every partner number
- Cost recovery → the payer. Whoever fronted the money is credited back what they put in, capped at cost.
- 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).
- 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.
| # | Block | What it tells you |
|---|---|---|
| 1 | Four KPI tiles | Gross Profit · Net Ordinary Income · Capital Recovered · Total Still Out |
| 2 | P&L Bridge | Five magnitudes: Sales, COGS, OpEx, Write-Off, Net Income |
| 3 | Net Owed by Company → Partner | One bar per partner |
| 4 | Capital: Recovered vs Still Out | Stacked, by purchase cohort |
| 5 | Operating Expenses by Category | Donut of the OpEx mix |
| 6 | Business Accounting · P&L | The six-line statement. CapEx and owner capital sit outside it, on purpose |
| 7 | Cards Only · Capital Waterfall | Cost advanced → grading adjustments → recovered → still out, per partner |
| 8 | Shipping Ledger (Both Legs) | Collected from buyers, less what labels cost, = shipping margin |
| 9 | Write-Offs | Gifted · Lost · Forgery · Ripped Off · Destroyed, with a separate amber watch line for damaged-but-still-held cards |
| 10 | Non-Card Position (Ledger) | Out-of-pocket unsettled + capital contributions = non-card owed |
| 11 | Total Owed (All Sources) | Card capital still out + non-card owed − distributions taken |
| 12 | Reconciliation | Why the three partners do not sum to zero |
| 13 | Distributions | Money actually taken out. + Record to add one |
| 14 | Out-of-Pocket by Payer & Owner | The payer × owner matrix |
| 15 | Loss Carried by Partner | The figure that flows to a personal return |
| 16 | Partner Accounting · Tax pass-through | Profit kept − losses carried = net to personal return |
| 17 | Profit Gifts | Every gift of partner profit into the company pool |
| 18 | Profit Distribution | Sliders that split the company pool by percentage, per year |
| 19 | Tax Schedule | Per-card gain/loss, sorted biggest-loss-first — the harvesting worklist |
Recording a distribution
+ Record opens a small drawer: Date (drives fiscal year), Partner, Amount Taken, Kind and a note. Kind matters:
- Payout — reduces the partner's total owed, but is invisible to the Profit Distribution table.
- Capital Return — reduces total owed and is tracked as capital taken.
- Profit Draw — the only kind that reduces Profit still owed on the split table.
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:
- P&L Summary — the six lines, plus CapEx, owner capital and the sold count
- Tax Schedule — per card, with owner and payer, and a TOTALS row
- Partner Positions — still out, non-card owed, distributions, net owed
- Out-of-Pocket — the payer × owner matrix
- Partner Tax — recovered, realized loss, profit kept, profit gifted, net to return
- Capital Waterfall — the six lines per partner, with the cohort label
- Non-Card Ledger — the raw entries
- Distributions — year-filtered
- Profit Gifts — the gift trail with a total
12.7Numbers that must tie
These are the internal identities the app maintains. If one of them fails, something is wrong and worth raising:
| Assertion | Where you can see it |
|---|---|
| Per-card gain/loss adds up to Gross Profit | The Tax Schedule footer literally prints Gross Profit as its column total |
| Gross Profit = Gross Sales − COGS + shipping margin | P&L block |
| Net Ordinary Income = Gross Profit − OpEx − Write-Off | P&L block (CapEx and owner capital excluded by design) |
| Adjusted capital advanced = cost advanced + grading for others − grading by others | Waterfall rows 1–4 |
| Still out = adjusted advanced − recovered | Waterfall rows 4–6 |
| Grading paid for others totals the same as grading others paid for you | Waterfall rows 2 and 3 — if they differ, a partner name failed to match |
| Cost out − recovered = loss, in every matrix cell | Out-of-Pocket footnote |
| Total owed = non-card owed + still out − distributions taken | Total 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.
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:
| Group | What happens and why |
|---|---|
| Transfers | Skipped. A credit-card payment appears in both accounts — that is the same money twice, not an expense. |
| Income already on cards | Skipped. Marketplace payouts are your sale proceeds; they already live on each sold card as its Net Sale. |
| Card costs | Skipped. Card purchases and grading charges ride on the cards themselves — booking them here would double-count. |
| Shipping labels | Skipped as expenses. Label costs belong on the sale they shipped (the Shipping Ledger), never in OpEx. |
| Covered by a recurring rule | Marked “covered,” never booked twice. The matching rule is named on the line. If the amount ever drifts from the rule, it is flagged. |
| Bank fees | Pre-ticked, ready to book under Bank Fees with the bank as vendor. |
| New — needs review | Everything else. Titles are editable in place; pick a category, tick, book. |
Three guardrails you will notice:
- Duplicates arrive un-ticked. A line whose amount matches an existing entry within a few days (banks post late) is flagged already in ledger and needs a deliberate tick to book.
- Repeating amounts get recognized. The same amount in different months raises a banner — “looks like a monthly bill” — with a one-click Create recurring rule.
- An unknown card offers to introduce itself. A last-4 the app has never seen shows an amber bar: name it, and it becomes a payment method on the spot.
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 Photos → Choose Photos… and
pick up to ten screenshots or photos — Amazon order summaries, store receipts, anything readable.
- 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.
- 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.
- Quantities survive: “2 @ $15.94” is shown on the line and saved into the entry’s description along with the order number — permanently searchable.
- 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.
- An unknown card offers the full introduction: name it, choose whether purchases on it are always reimbursable and to whom — answered once, remembered forever.
- 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.
| Confidence | Meaning |
|---|---|
| high | The gate matched and most of the columns that importer reads are present. Only high-confidence single-importer drops are loaded for you automatically. |
| medium | The gate matched but fewer than half the useful columns are there — the import will be thin. |
| low | The 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. |
| none | Nothing matched. |
Three things the drop layer will tell you honestly:
- Single importer, high confidence: "Switched to eBay orders report below and loaded the file — review it there, nothing is written yet."
- Single importer, lower confidence: "Not loaded automatically because the match wasn't high confidence — check the warning above, then load it by hand if it's right."
- Mixed drop: nothing is switched at all, and you get the breakdown. Guessing which half of a pile you meant is exactly the kind of helpfulness that loses money.
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.
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."
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:
- Map Cert Number or Card Name first. — a mapping that could not match anything.
- Map at least one field to write (a price, date, cert) — or tick the rename box. — a mapping that could match but could not write.
How rows are matched
| Tier | Test |
|---|---|
| CERT | The cert number matches exactly |
| SKU | The SKU matches exactly |
| EXACT | The normalised card name is identical |
| STRONG | A close fuzzy name match (0.80 or better) |
| MAYBE | A weaker fuzzy match (0.45 or better) |
| NO MATCH | Nothing |
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.
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.
| Bucket | Meaning | Auto-ticked? |
|---|---|---|
| NEW SALE | A matched card that is not yet sold — this is the sale to book | Yes, unless it was a weak guess or two rows claim the same card |
| MISMATCH | The card is already Sold under a different order, and the numbers differ. Every difference is listed old → new | No — never written unless you tick it |
| DONE | Already sold under this order. Left alone | n/a |
| NOT IN APP | No card matched. Tick it and the card is created from the sale, already marked Sold | No |
| ⛔ SKIPPED | Refunded, canceled, $0 gross, or a net that computes to zero or less. Shown so you know they were seen | Never — they can never be written |
| 🚨 REFUND BOOKED AS SALE | This file proves the order was refunded and a card is booked against that exact order | Never |
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.
- Fill match only fills blanks — base cost when it is zero or empty, purchase date when empty, purchase order number when empty. It never overwrites a cost you already recorded.
- Create new makes a card at For Sale with the raw eBay item name as the intake name, the item price as base cost, the order number, and the eBay image pulled into our own storage.
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."
| Concept | What CollX does |
|---|---|
| Gross | The item price on the page — what the card actually sold for. |
| Net | Seller's Proceeds — what CollX actually paid you. Shipping Protection is already inside it; never subtract it again. |
| Never the CSV | The 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 ladder | SKU exactly → cert number → name + set + grade → the picker → typing a card id. |
| Multi-item orders | The order's net is split across the cards weighted by item price, to the penny. |
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."
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."
- Drop the PSA order CSV. The order number auto-fills from the file name if it contains a long number.
- Type the Total grading bill $ — you will see the per-card spread appear.
- Set the destination location for the returning cards.
- Press Run AI match. Each cert gets a suggested card and a confidence.
- Fix anything wrong: pick a different card, choose ➕ Create as NEW card, or leave it — skip / unassigned —.
- Pin any individual grading fee that differs; the rest re-spread automatically.
- 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.
13.9Things that can never be written, anywhere
- Refunded eBay orders — excluded from the apply list and re-checked during the apply itself.
- Canceled, $0-gross, or negative-net eBay rows.
- Refunded or canceled CollX orders.
- Any CollX order that already carries cards.
- Sold Price or Date Sold onto a card that is not already Sold (Generic CSV).
- Archived cards — never matched, never created against.
- Two rows onto one card in the same run.
- A dropdown value that does not already exist — you get a picker instead.
- A listing removal — CDP's Listed On is additive only.
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.
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
| Action | Shown when | What happens |
|---|---|---|
| Edit | Always | Inline first/last name, role and finance switch. Promoting to a manager role forces finance access on. |
| Resend | Status is invited | Sends the invitation again. |
| Reset pw | They have an email and are not removed | Sends them a password-reset email. |
| Suspend | Not you, status active | Confirms "Suspend dana@example.com? They will not be able to sign in." |
| Reactivate | Not you, status suspended | Lifts the block. |
| Remove login | Not 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. |
| Delete | Not you, and role is User or Viewer | "PERMANENTLY delete sam@example.com? This cannot be undone." Blocked if any card references them. |
Inviting someone
- + Invite user.
- First name, last name, email. (First name and email are required.)
- 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.
- Set Finance & Insights access — for a manager role this is replaced by Always granted for Partner.
- Send invitation → Invite 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.
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.
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:
- cert 104214318 → card 1042: photo set ✓
- cert 88214077 (card 1045): PSA has no front image — recorded, won't retry
- STOPPED: PSA daily quota reached — run again tomorrow.
- Nothing left to process. 🎉
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:
- A checkbox means the matched card has no photo yet and can be attached.
- 📷 means the matched card already has a photo and is protected — never overwritten.
- — means no card matched.
- multi-match rows are skipped by the bulk buttons; tick them individually after checking which CSV row is the right one.
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:
- 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 ✓.
- 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."
- Flat table — one row per sold platform: Fee %, Per-order $, a Tiers cell reading 3 tier(s) — tiers govern or —, and Save. Retired platforms still appear, marked retired. Saving tells you eBay saved — new sales estimate with 12.35% + $0.40 immediately.
- Tiers — a sub-table per platform with From $, Fee %, Flat $, plus an add-tier row. Each tier runs from its "From $" up to where the next begins. If a platform has tiers, they override its flat numbers entirely.
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."
15.1Sale & financial consistency — 6 checks
| Check | What it means | What 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
| Check | What it means | What 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
| Check | What it means | What 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
| Check | What it means | What 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
| Check | What it means | What 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
| Check | What it means | What 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 line | Severity | Tab equivalent |
|---|---|---|
| Sale data on a card that isn't sold | broken | Check 2 |
| Status and disposition disagree | broken | Check 3 |
| Sold, missing platform or sale year | attention | A 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
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).
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.
Guides
- Open the User Guide ↗ — this document, in a new tab.
- Open the Function Reference ↗ — "The whole product listed by category — what you click and what runs quietly in the background."
Beneath them sit six quick recipes, the same ones reproduced in §1.2.
The three forms
| Form | Use it when | Extra 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
- Net Return never appears on a card that is not sold — not in the grid, not in a sort, not in a filter, not in a CSV. A stale number cannot leak into a total.
- Net Sale can never be negative, and never exceeds the gross. Enforced in the editor, the bulk sale, the journey form and the database itself.
- Projected Profit (Sale) never shows a number without an asking price — it says set price instead.
- Fees are data. Every sale estimate reads the platform fee table; nothing hardcodes a rate except the clearly-labelled What-If scratchpad.
- Derived values are computed by the database. Total Cost, Net Return, Year Sold and the projections cannot be typed, only driven.
- A bulk-sale split is penny-exact. The per-card shares always sum to the order total.
Sales and reversals
- Leaving Sold always goes through the un-sell chooser. There is no plain confirm.
- Nothing is wiped without being photographed first. The full sale snapshot lands in the audit log and the card's own timeline.
- A status change never acts on a stale copy of the card — the app re-reads it first and refuses if it changed elsewhere.
- You cannot write off a card that is already Sold.
- History is append-only. A correction is a new event, never an edit.
Imports and AI
- Detection routes, it never applies. Nothing is parsed or written by the drop layer.
- Refunded orders can never be applied — they are excluded from the apply list and re-checked during the apply itself.
- Sold Price and Date Sold can only be written to a card already marked Sold.
- Archived cards are never matched, and never created against.
- Two rows can never land on one card in the same run.
- Dropdown values are never invented — you get a picker instead.
- Listings are only ever added, never removed, by an importer.
- Scan writes to a holding table, never to inventory, and the PSA matcher writes nothing at all. A person confirms everything.
- An existing photo is never overwritten by any importer, and front and back use separate paths so one can never clobber the other.
- Photos are always downloaded into our own storage — the app never keeps a long-term link to a third party.
People and data
- You cannot suspend, remove or delete your own account.
- The last active manager can never be removed.
- Company, Partner and Admin identities are permanent — their login can go, the accounting record stays.
- A person referenced by any card cannot be deleted — you are told the count and pointed at "remove their login instead".
- Dropdown values are retired, never deleted, so no card ever loses its value.
- Permanent card deletion requires Archive first, and an admin.
- The finance tabs are hidden, not disabled, for anyone without access.
Display and totals
- KPIs are whole-dataset and immune to grid filters — filtered figures only ever appear in the separate rollup line.
- The rollup line is facet-aware, so "You have $X" always means the right thing.
- Deselecting every year falls back to all years — the KPI band can never go blank.
- Blank values always sort last, in both directions.
- ID and Card Name can never be hidden — even a saved view that forgot them gets them back.
- The data-integrity badge fails closed — red unless the counts match exactly.
- The health badge reports "unknown" rather than a false all-clear when its own check cannot run.
18Troubleshooting & known quirks
| Symptom | Cause and fix |
|---|---|
| The grid is suddenly empty | Check 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 import | Hard-refresh: Cmd/Ctrl + Shift + R. The app caches aggressively for speed. |
| The integrity count badge is red | The 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 0 | Expected. 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 filters | Views store layout only — columns, widths and sort. Filters, search and the archived tick are never saved. |
| My column order jumped around | Any column toggle re-orders the grid into the canonical order. Column order is not user-controllable. |
| Recent Sales does not show everything | It caps at 400 rows with a notice. The net total in the header still covers every sale. |
| A recurring cost is one occurrence short | The 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 nothing | Correct — that checkbox is inert. Set an End Date to stop a rule. |
| A "Fully reimbursed" entry still shows as owed | The balance follows the amount, not the label. Type the reimbursed amount. |
| Financials and Accounting show different Gross Profit | They differ by exactly the shipping margin, by design. See §12. |
| The Accounting year toggle has no 2027 | That list is fixed in the code and needs a developer to extend. |
| A newly added Frequency behaves as one-off | A 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 screen | Known: that sheet exports unit amounts for recurring entries. Use the P&L Summary sheet for totals. |
| An importer refuses my file | Read 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 it | Look 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 stopped | PSA 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 skipped | Every 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
| Term | Meaning |
|---|---|
| Asking Price | What 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 Cost | What you paid for the card itself, before tax, shipping, handling and grading. |
| Card Type | The sport or product family — Baseball, Football, Pokémon. This is what the Ledger chips filter. |
| Canonical name | The 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 Is | What the card comps at in its current condition. Feeds Unrealized P/L and Projected Profit As-Is. |
| Counts in Financials | A per-card switch for whether it belongs on the books at all. |
| Disposition / Sale Type | How 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 Overwrite | Importer 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 Profit | Revenue minus cost of goods sold. In Accounting it also carries the shipping margin. |
| Item Type | The kind of item — card, pack, lot. Distinct from Card Type. |
| Live card | Any card that is not archived. Every KPI in the app is computed over live cards. |
| Net Proceeds / Net Sale | What actually landed in your account after the platform's fees. |
| Net Return | Profit 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 By | Who owns the card. Profit follows ownership. |
| Paid By | Who fronted the money. Cost recovery and losses follow the wallet. |
| Potential card | A row in Scan's holding area. Not inventory, not money, until you bring it in. |
| Print Run | The serialled quantity — the 399 in /399. Not a cert number. |
| Proceeds To | Which account a sale's money landed in. |
| Shipping margin | What the buyer paid for shipping, less what the label actually cost. Already inside every card's Net Return — never add it again. |
| Showcase | A flag marking a card for display in Collection. |
| SKU | Your own stock number, e.g. BFL-EB14261. A match key for the eBay and CDP importers, which is why collisions matter. |
| Sold Price | The gross the platform reported, before fees. |
| Still out | A partner's money that has not come back yet: adjusted capital advanced minus what they have recovered. |
| Total Cost | Base cost + tax + shipping + handling + grade fee. Database-calculated. |
| Year Sold | Derived from Date Sold, and the field that drives every tax bucket. |
20Index of figures
S&T Card Manager — User Guide · Edition 3.0 · August 2026
Kevin · Brian · BKCards71