| Month | Expenses | Investment | eBay Sales | Off-eBay | Total Sales | Earnings | Profit | Margin | Orders | Units |
|---|
| Month | Ad Spend | eBay Sales | Ad % of eBay | Ad Transactions |
|---|
| # | Type | Invested | Earnings | P/L |
|---|
| Card | Paid | Earned | P/L |
|---|
| Category | 2025 | 2026 | Total | Share |
|---|
| Year | Card Expenses | Biz Expenses | Total Expenses | Sales | Earnings | P/L | Margin |
|---|---|---|---|---|---|---|---|
| Month | Expenses | Sales | Earnings | P/L | Margin |
|---|---|---|---|---|---|
| Band | Listings | Total Quantity | Value | Avg / Card |
|---|
| Img | SKU | Title | Lot | Qty | Price | TCGP MKT | MP MKT | Sold | Listed | Status | Actions |
|---|
| Title | Qty | Price | Match |
|---|
This page only counts what you own — it never changes your listings.
No scan run yet
Click "Scan Active Listings" to find combine candidates among your existing eBay inventory.
| Rec# | Date (PST) | Title | SKU | Qty | Earnings | Shipping | Total | Buyer / Platform | Lot |
|---|
How this page works
Each row is an archived combine whose children were never absorbed into an active parent. For each row you can:
Absorb — splice this archived combine's children into a selected active combine (recommended when you find the right target).
Un-archive — restore as a standalone active combine (use if the eBay listing for this SKU still exists and just got incorrectly archived).
Dismiss — hide from view this session only (no DB write). Use for rows you've decided to leave alone.
Every absorb / un-archive is logged to combine_recovery_audit; click Undo Last to reverse the most recent action.
Not loaded yet
Click Refresh to load archived combines and compute candidate matches.
Combine Flow
New Uploads – Exact Matches — same-title duplicates, safe to approve. Similar — near-matches to review. Approve the ones you want, then Push to eBay — the kept listing's quantity goes up and the extras end.
Already listed the same card more than once? Open the Existing Duplicates tab — it finds every duplicate across your live listings so you can merge each into one.
| Parent SKU + Title | Child SKU + Title | New Qty | Lot | Action |
|---|
| Existing Parent | New Listing | Match Score | Lot | Action |
|---|
| Parent SKU | Child SKU | Title | Action |
|---|
| SKU | Title | Price | Qty | Lot | Status | Action |
|---|
| Card A | Card B | Action |
|---|
Lot Backfill — what this does
Fills in missing lot assignments everywhere at once — on combines, inventory rows, and past orders — so the Lots tab attributes profit to the right physical box going forward.
Safety: it only ever fills blanks, never overwrites an existing lot. Every write is logged under one batch and any batch reverts with one click (Audit Trail below).
SKU convention: new lots use SKUs starting with "Box ". Anything else is legacy and can be assigned to the old lot with the one-click below.
orders.assigned_child_sku → orders.lot_id pair, then (b) live ST.inv.lot_id where the child sku still exists in inventory. Free wins, no patterns required.
^(?!Box ).+ → lot old. Sweeps every SKU not prefixed with "Box " (B1-/B2- shorthand, COMBINED-, SV/SWSH set SKUs, CDP-, etc.) into the legacy bucket. Single batch, fully revertable.
| Pattern | Lot | Last Applied | Writes | Action |
|---|
| Bucket | Inv | Children | Orders | Total | Assign to lot | Action |
|---|
| When | Source / Pattern | Lot | Writes | Status | Action |
|---|
| Order | Item | Pull SKU | Buyer | Date (PST) | Price |
|---|
| Month | Expenses | Investment | Sales | Earnings | Profit | MoM | Margin | Orders | Units | Listed $ | Sell-Thru | Multi-Card% |
|---|
| Item | Category | Type | Date | Cost | Docs | Repeat |
|---|
| Year | Type | Invested | Sales | Earnings | Unsold Value | P/L | ROI |
|---|
| Card | Purchased | Paid | Copies | MKT | Value Now | If-Sold Gain | Sold Date | Sales | Earnings | P/L | Status | Actions |
|---|
| Item | Copies | Invested | MKT | Value Now | If-Sold Gain | Sold | Sales | Earnings | P/L | Status | Actions |
|---|
Search by card name, set, SKU — inventory + orders + combine groups
Start typing to search
Results across inventory, orders, and combine groups
{title} {set_name} {card_number} are filled per card)Account and billing
Your plan, starting over from zero, and closing your account.
Sidebar & toolbar
Choose which features show in your sidebar and their tabs — add any feature to any section, reorder, or hide what you don't use.
Brand
Your name + logo replace the in-app wordmark. (The browser-tab name stays "Leumas Live".)
Colors & Text
Brand-accent, sidebar, and background. (Profit/loss reds & greens stay fixed so P&L always reads right.)
Labels
Rename the sidebar sections to match how you work. Blank = the default name.
Feature Store
Turn optional features on or off for your account.
eBay listing defaults
Cards brought in from TCGplayer or ManaPool don't come with an eBay description or photos. Set a default here and they list without you touching each one — any card that already has its own description or photos keeps them.
These fill in per card: {title} {set_name} {number} {rarity} {condition} {game}
Good for a store banner or a grading-scale card. They're added after the card's own photo. Cards with no photo of their own list with their catalog picture automatically.
Add Item to Inventory
Sealed product, sleeves, accessories, or any item not from CardUploader.
Recently Added (Manual)
No manual entries yet
CardUploader Export
Export from carduploader.com. Cards added to inventory. Assign lot after import. Multiple files supported — drop or pick several at once.
*Title CustomLabel *StartPrice *Quantity · slabs also read grade + Certification NumberCard Dealer Pro Export
Export from carddealerpro.com (eBay Bulk Upload format). Cards added to inventory. Multiple files supported — same parser as CardUploader with the CDP metadata prefix stripped.
*Title CustomLabel *StartPrice *Quantity · skips Info,Version=... lineTCG Automate Export
Export from TCG Automate (eBay Bulk Upload format). Cards added to inventory. Multiple files supported — same parser as CardUploader.
*Title CustomLabel *StartPrice *QuantityTCGplayer Inventory → eBay
Upload your TCGplayer MyPricing export to cross-list your TCGplayer stock to eBay. Cards bind automatically (no matcher), pull a product image, and price with your eBay markup. Staged in New Imports — review before listing. One file.
TCGplayer Id Product Line Total Quantity TCG Market PriceTCGplayer Scan & Identify
Just scanned a pile with TCGplayer's Scan & Identify? Upload its CSV to bring those cards into Leumas. Each row binds to its card automatically from the file's own TCGplayer Id (no matcher), pulls a product image and prices with your markup. Staged in New Imports — review before listing. This never changes what you have listed on TCGplayer, and the count comes from Add to Quantity. One file.
Product ID TCGplayer Id Product Line Printing Add to Quantity TCG Market PriceCardbot - TCGplayer (Kiosk)
Scanned a stack with your CardBot? Upload its export for TCGplayer CSV to bring those cards into Leumas. Each row binds to its card automatically from the file's own TCGplayer Id (no matcher), pulls a product image and prices with your markup. Staged in New Imports — review before listing. This never changes what you have listed on TCGplayer, and the count comes from Add to Quantity. One file.
TCGplayer Id Product Line Condition Add to Quantity TCG Market PriceMigrate Inventory (CardUploader)
Switching from CardUploader (or a similar platform)? Upload your full inventory export. Each Catalog SKU is matched to its eBay listing as the combine parent; User SKUs become child SKUs (not on eBay) and appear in the Existing tab. Quantities, prices & TCGplayer bindings from this file become the source of truth. One file.
Catalog SKU User SKU Title TCGplayer SKU Price Qty · no eBay listings revised/endedCardCatalyst Export
Switching from CardCatalyst? Upload the itemized in-stock export. Each row is one physical copy — quantities come from counting the rows, so nothing is guessed. Cards bind to the catalog from the file's own TCGPlayer ID, titles and prices fill in automatically, and Bin + Position become the card's box SKU. Staged in New Imports as unlisted on-hand stock — review before listing. One file.
Bin Position Card Name Condition Printing TCGPlayer ID · quantity = count of itemized rows · no listings touchedSortSwift Inventory
Moving over from SortSwift? Upload your inventory export. Every card binds straight to the catalog from the file's own SKU Id — the exact per-condition TCGplayer SKU — so nothing is matched on the card's name and nothing is guessed. Your Remarks bin labels become each card's box SKU, and each box becomes a lot carrying its cost. Staged in New Imports as unlisted on-hand stock — review before listing. One file.
Your sales do not come from this file. Import those with the Leumas TCGplayer extension instead — it pulls TCGplayer's real fees and net per order, which this export does not contain.
SKU Id Name Quantity Your Price Remarks Cost · binds on SKU Id, never on the title · no listings touchedTCGTracking Export
Switching from TCGTracking? Upload either inventory export — the per-location file or the aggregate one; the importer tells them apart automatically. Cards you already track here are recognised, not duplicated — if your eBay (or any platform) is already connected, those cards keep their existing quantity and simply gain their box location, so nothing doubles. Anything genuinely new is staged as unlisted on-hand stock. Your location labels (A-1-A…) become each card's box SKU, so every slot stays findable on the pick list. Reserved copies (pending TCGTracking orders) are skipped and counted. One file, either version.
Product Name Condition Finish Location(s) TCGPlayer SKU ID Quantity Reserved My Price · no listings touchedRestore SKU mapping
Does your pull sheet show codes like CS-XXXXXX instead of your own SKUs? Upload the same CardUploader inventory export here. This restores only which of your SKUs each card belongs to, so pull sheets name the right box. It does not change quantities, prices, listings or anything on eBay, and it will not add cards back into your inventory. Safe to run more than once.
Catalog SKU (or Custom Label) + User SKU · columns are detected and shown before anything is saved · no inventory, listing or eBay changesHistorical Sales (any platform)
Import past sales from eBay, TCGplayer, Cash, Discord, Mercari, or anywhere else. Download CSV template
Date Platform Item Name Quantity Sold Price Fees Net Buyer SKU Lot Cost Basis Marketplace Order ID Item ID Item URLHistorical Expenses
Import past expenses (supplies, shipping costs, fees, subscriptions, etc.). Download CSV template
Date Type Amount Description NotesTCGplayer Order History
Import past TCGplayer orders for your records. On TCGplayer go to Orders → Export Shipping and drop that CSV here. This records order history only — it does not change inventory. Re-importing is safe (deduped by order #).
TCGplayer's export carries the order's date, buyer and value — it does not contain the individual cards, which TCGplayer only puts on the packing slips.
Importing here first is safe: if you later upload that order's packing-slip PDF on the TCG Orders page, it takes the order over — matches the cards, adjusts your stock and updates the eBay listing.
Order # Order Date FirstName LastName Value Of Products Shipping Fee Paid Item Count — and Product Set Condition Quantity Price if your file has them| Time | Type | Rows | Status | Files |
|---|---|---|---|---|
| Loading... | ||||
| Time | Type | Records | Status | Notes |
|---|---|---|---|---|
| No imports yet | ||||
inventory.quantity against the sum of child quantities. Flags mismatches. Phantom-containing combines are skipped — you can't honestly sum kids that no longer exist locally. Same sweep also available on Combine Recovery page; mirrored here for general diagnostics use.ebay-webhook Edge Function — sales, listing created/revised/closed, auction checkout. Without this, the app only learns of new sales via the periodic syncOrders poll; with it, sales appear within seconds via Supabase Realtime. One-time setup; idempotent if you click again. Per ef-security-audit notes: never been called → 0 events received in DB ever.tcg_eligible_inventory for drift between local and TCGplayer. Shows decrement candidates (sold on eBay since last push), increment candidates (restocked / new combine pulls), ghost listings (cards on TCG you don't have anymore), and total cards diverged. If decrements or ghosts are non-zero, the next CSV export will reconcile them.tcg_orders + tcg_order_lines and re-projects them into ST.ord as synthetic off-eBay rows so dashboards reflect any commits since boot AND any lot_id changes on the matched inventory. Idempotent — safe to click repeatedly. Cancelled/refunded/voided parents are excluded from the projection.tcg_catalog for the newest updated_at across all rows, plus per-game freshness, plus running count of tcg_order_lines with match_status='no_match'. Color bands: ≤7d green / 8-30d yellow / >30d red. New TCG sets release roughly monthly — refresh the catalog if it's been a while, especially before high-volume sales.tcg_listed_qty > 0 (what local thinks is live on TCG), sum of cards listed, pending drift to reconcile on next CSV push, and last successful export from tcg_sync_log. Mentally diff the "Cards on TCG" number against your TCG seller dashboard's count — if they disagree materially, you have ghost listings TCG didn't reconcile.combines.child_lot_map entries are populated, how many inventory rows have a lot_id, how many orders are attributed. Click Check to compute against current in-memory ST. Mirrors the KPI strip on the Lot Backfill tab; surfaced here so you can monitor progress without leaving Diagnostics.webhook_events table to confirm the subscription above is actually pushing. Shows total events ever, last 24h count, last event timestamp, and per-event-type breakdown. If you just registered, give eBay a few minutes — they don't backfill, only push events that fire AFTER subscription is active.8d9c4cbf-…) this should sit at 0. Any drift indicates future imports / manual edits re-introducing duplicates. Re-run after CSV imports to confirm cleanliness.child_skus.length against parent quantity. Surfaces the 4,047-style backlog from the v2.16.33 audit (68% under-recorded). Companion to Combine Qty Integrity: that one checks sum-of-child-quantities; this one checks count-of-recorded-locations.child_skus elements with structural problems: trailing dash (the "Box 11 - M1 -" class from v2.16.31), leading/trailing whitespace, empty strings, non-string types, double-dash. Each becomes a manual fix candidate. Per v2.16.31's note, the app renders these as-is — auto-cleanup is a separate workflow.lot_backfill_audit, tcg_collision_cleanup_audit, dup_sku_rename_audit. Shows table, batch_id (first 8 chars), row count, reverted count, source/reason. Surfaces dup_sku_rename_audit which has no other UI today.ST.lots, ST.ord, ST.inv, ST.ebayTx, etc.), compares in-memory length against DB COUNT(*). Smoking gun = ST length stuck at 1000 while DB has more (PostgREST default cap signature). Caught the v2.16.52 silent truncation bugs; will catch the next one too. ST.ord + ST.inv legitimately exceed DB count (synthetics + carduploader staging).(tcgplayer_id, condition) groups with 2+ active rows. This was the trigger for the 2026-05-25 Umbreon over-sell — pre-v2.16.14 the CSV dedupe summed wrong on these and inflated TCG state. v2.16.14 fixed the math, but multi-listing remains operationally fragile (hard to allocate when TCG sells one). Run before any TCG CSV push; consolidate flagged groups via the Combine Listings page first.tcg_listed_qty model. Upload a fresh TCGplayer MyPricing CSV export (Pricing → Generate Pricing Custom Export → download). We parse the Total Quantity column, aggregate by (tcgplayer_id, condition), and surface every drift bucket. This is the only path to detect TCG state corruption. Run after every kill-switch + push cycle to confirm TCG agrees with us.tcg_listed_qty under-counted (e.g., post-kill-switch stragglers from pre-v2.16.14 dedupe drift). Generate, upload to TCG, then re-run Drift Check to verify.
pending. Click 4×6 Label per row to print a pick/pack slip (works on thermal printers — Rollo/Munbyn/DYMO 4XL). Pull the cards using the SKU + LOT chips on the label. Attach the TCG-supplied shipping label and ship. Click Mark Shipped to drop the row from the queue. Filter switches between Pending (default), Shipped (history), and All.
AUTO END & RELIST
Record a mismatch
| Channel | Revenue | Fees + Shipping | COGS | True Net | Cost basis |
|---|---|---|---|---|---|
| Schedule C line | Amount |
|---|
| Schedule C line | Fed by | Amount |
|---|---|---|
Help & Guides
ADD LOT
ASSIGN SKUs TO LOT
ASSIGN ORDER TO LOT
Links sale revenue to selected lot for P/L tracking.
PUT THIS BOX IN A LOT
A lot is the purchase these cards came from — it is what the Lots page uses to work out profit. This changes the cards in this box, not the sale.
RECORD SALE
Manual sale record. In Leumas Live with eBay API, this will push a real-time quantity update to eBay.
SUGGESTION
REPORT AN ISSUE
ADD ROADMAP ITEM
ADD UPDATE
NEW POLL
COST BREAKDOWN —
Customize your inventory table
NEW CARD SHOW
RECORD SALE
TRADE
| Card name | Card # | Value ($) |
|---|
PULL IN INVESTMENTS
NEW PURCHASE
Are these new copies?
0 card(s) in this file (0 copies) are already in your inventory. Leumas cannot tell whether you just scanned more copies of cards you already own, or whether this is the same stock counted again — so it is asking you rather than guessing.
| Card | You have | In file | Would be |
|---|
BULK PURCHASE
| Name | Count | Rate | Total |
|---|
SHOW EXPENSE
CONSIGNMENT
RECORD SALE
BIND TO CATALOG
ADD PRODUCT
MATCH TO CATALOG
NEW BATCH
REMATCH INVENTORY
ADD EXPENSE
DOCUMENTS
CATEGORIES & TYPES
Drag a type into a bucket, or pick one from the dropdown on the chip. Any type can sit in any bucket, and moving it re-files every expense that uses it — nothing is rewritten in your ledger. Removing a bucket keeps its types; they return to Uncategorized.
RETARGET PARENT
AUTO-MATCH PARENTS
QUEUE HEALTH AUDIT
EDIT LISTING
More: shipping · package · quantity · Best Offer · item specifics
Photos — add / remove
BULK FIELDS
BULK EDIT TITLES
$ BULK EDIT PRICES
LIST SELECTED CARDS
EDIT PRICING
• Only cards you match or correct are used, and only after you opt in.
• Your prices, costs, orders, and account details are never used.
TRACK PLATFORM