The inventory system that runs a real card business.
I sell thousands of cards a month on eBay and TCGplayer. Spreadsheets broke and off-the-shelf software didn't understand how card sellers actually work, so I built my own. Live eBay sync, combine listings, lot-level profit tracking, pick lists, and a photo-to-listing matcher. Public access opens August 2026.
Public registration opens August 2026. Drop your email and I'll let you know the moment it's live — waitlist members get first access and grandfathered pricing.
Create your account — 14 days free, no card required.
Multi-tenant access — coming August 2026.Join the waitlist for first access and grandfathered pricing.
62,900
Active eBay Listings
179,000
Cards Tracked
6,200
Combine Listings Managed
12,800
Orders Tracked
$116K
2026 Sales Tracked
Live, platform-wide numbers across every seller on the system · updated in real time
What it does
Everything I needed to run the business, in one place.
Every feature here is live in my own store today — not a roadmap promise. This is the system that handles thousands of cards a month.
Live eBay sync
Listings, orders, and fees pulled straight from eBay's Trading and Finances APIs, with webhooks for near-real-time updates. Your numbers match eBay, automatically. Works with both eBay.com (US) and eBay.ca (Canada), in your own currency.
Live now
Combine listings
Merge a pile of the same card into one listing and keep a full breadcrumb of what went in. Pick lists route by storage location so you find every card fast.
Live now
TCGplayer cross-listing
Export to TCGplayer with delta-aware quantity sync, and guards that catch a mispriced card before it sells for a fraction of its value.
Live now
One inventory, every channel
Your inventory is the source of truth. List, sell, and reconcile the same stock across eBay and TCGplayer without overselling a card you only own once.
Live now
Lot & profit tracking
Real per-lot profit and loss, split down to the child SKU, with a full audit log. Know what each box actually made — not a rounded guess.
Live now
Automated repricing
Set your own pricing rules and let nightly market-based repricing keep your listings competitive while protecting your floor.
Live now
Card shows & buy-back
Run a card show from your phone — sell, trade, and buy on the table. Take in bulk collections with rate-based quotes that flow straight into inventory.
Live now
Reporting & audit trail
Dashboards, year-over-year, dead-stock aging, and a revert path on every bulk operation. Trust your own numbers when it counts.
Live now
Where it's going
Built feature by feature — and still building.
What's connected today, and what's next. Priorities come from real seller demand, not a pitch deck.
Connected today
eBay · TCGplayer · Discord · YouTube
Full eBay integration (US and Canada), TCGplayer cross-listing, a community on Discord, and the build journey on YouTube.
Next
More marketplaces
Mercari, Cardmarket (EU), and COMC are on deck once the multi-tenant core is rock solid.
Next
Sports cards at scale
A first-party sports catalog with visual parallel identification — the part no free data source does well.
Next
In-app shipping
Buy labels and close out orders without leaving the app, built around what card sellers actually ship.
See it in action
A full walkthrough is landing on the Leumas Card Craze YouTube channel — subscribe to catch it.
Target: August 2026
I'm finishing the multi-tenant foundation: per-seller data isolation, per-account eBay sign-in, encrypted tokens, and webhook routing for each seller. Get one of those wrong and one account could see another's data, so I'm not opening signups until it's verified airtight. Waitlist members get first access the day it's ready.
What will pricing look like?
Three tiers: Starter (≤500 active listings), Pro (sellers running TCGplayer and eBay together), and Enterprise (custom integrations, dedicated support). I'll lock final pricing before the August 2026 launch. Waitlist members get grandfathered rates — if prices go up later, you stay at your original tier price as long as you stay subscribed.
How is my inventory data isolated from other users?
Every business table (inventory, orders, combines, lots) carries a user_id and a row-level security policy enforced at the database layer, not in app code. So even if a future bug forgot to filter by user, the database itself would refuse to hand back another seller's row. That's the foundation I'm finishing now, and it's exactly why signups aren't open yet — I won't flip them on until it's proven airtight.
What data do you share with eBay or TCGplayer?
None. Leumas is a client of those marketplaces, not a data broker for them. Your inventory and sales data lives in a Postgres database only you can read. I use your eBay sign-in (OAuth, stored encrypted) to sync your own listings and orders — and I never aggregate or sell your data to anyone.
What if I'm coming from a spreadsheet?
Onboarding imports your active eBay listings automatically through eBay's API — no spreadsheet upload needed. Past sales backfill from eBay's Finances API, and TCGplayer comes in by CSV. I migrated thousands of my own listings off spreadsheets when I built this, so the import flow is made for the messy reality of a high-volume operation.
Do you support marketplaces besides eBay and TCGplayer?
Not yet. eBay and TCGplayer cover most US trading-card commerce, so they came first. Mercari, Cardmarket (EU), and COMC are on the roadmap but won't ship until the multi-tenant core is rock solid. If your business needs a specific marketplace, tell me on Discord — demand sets my priorities.
Can I export my data if I leave?
Yes, always. You can export your full inventory, orders, combines, lots, and audit log to CSV any time, right from the app. I don't believe in data lock-in — if Leumas ever stops working for you, your data leaves with you in a format you can take anywhere.
Who is behind Leumas Live?
That's me — Sam, eBay seller leumas1993, moving high volumes of Pokémon, baseball, basketball, football, Yu-Gi-Oh, and One Piece. Leumas started as my own inventory system after years of fighting spreadsheets, sync gaps, and paid software that didn't get how card sellers actually work. There's more in the founder story below.
Founder story
Built by a high-volume seller, not a VC-funded startup.
Hi, I'm Sam — eBay seller leumas1993. I move thousands of Pokémon, baseball, basketball, football, Yu-Gi-Oh, and One Piece cards every month across eBay and TCGplayer.
Leumas Live started as my own inventory system. Spreadsheets broke around 5,000 listings, and the paid tools I tried didn't understand combine listings, lot tracking, or the audit trails I needed to trust my own numbers. So I built what I needed, one feature at a time.
As you read this, my own store is running 15,999 active listings, 5,232 combine listings, and 4,610 tracked orders — pulled live from the system right now. It runs my entire business. Next, it runs yours.
Every feature here is one I built to fix a real problem in my own store — and one I still use every single day.
Community
Sellers are already in the room.
Seller testimonials go here as beta opens up. Until then, the conversation is live on Discord and YouTube — come watch the system get built in real time.
Sharing Mode ON — financials, order amounts, expenses & buyer names are hidden.
Dashboard
Year-to-date · 2026 · Leumas Live
eBay Connected
WELCOME TO LEUMAS
Get your account set up in 5 steps — should take under 3 minutes. Each step unlocks the next feature. You can come back here from Dashboard top anytime.
Shipping & Return Addresses
Return Address (TCG Labels)
Ship-From Address (eBay listings)
eBay AddItem requires a city + ZIP for every listing. This is your default ship-from. CSV imports can override per-row.
eBay Business Policies
Required to list on eBay. Click Load from eBay to pull your shipping, payment & return policies, pick one of each, then Save. (Requires Connect eBay first.)
Real-time card values via TCGPlayer + eBay Sold Listings. Listed price replaced by market price. Portfolio value updated daily.
TCGPlayer PlannedeBay Sold Listings PlannedPSA Pop Report Planned
Historical
Multi-year financials
Year over Year
All-time combined · one final number
Year Over Year Performance
Expenses
Sales
Earnings
Year-by-Year Breakdown
Year
Card Expenses
Biz Expenses
Total Expenses
Sales
Earnings
P/L
Margin
Month-by-Month
Month
Expenses
Sales
Earnings
P/L
Margin
All-Time Net Result
—
Total earnings minus all expenses across all years
Snapshot
Real-time business view · YTD 2026
Inventory Value by Price Band—
Band
Listings
Total Quantity
Value
Avg / Card
Data sources: Avg daily deposit = (CREDITs − DEBITs − marketplace fees + refunded fees) over last 90 days ÷ 90, from ebay_transactions. Operating P/L = eBay net YTD − operating expenses (ST.expenses table, no investments). Cash P/L = eBay net YTD − all expenses YTD (expenses_full rollup, includes card investment spend). Delta between the two = capital spent acquiring inventory this year. Activity YTD = ST.ord rows with sale_date in 2026, all channels.
Inventory
Loading from database...
Never synced
Listings
Pricing Tool
Multi-SKU comma-string rows detected
Listings
Img
SKU
Title
Lot
Qty
Price
MKT
Sold
Listed
Status
Actions
Pricing Tool — market price in → your list price out
eBay
TCGplayer
Editing rules for eBay
Try it — see what a card lists for
1 · Where your price starts
Pick how the starting price is set. Bands give you the most control; the other two are one-rule shortcuts.
Prices the card just under its market value (never below your floor). Matching the literal lowest active listing needs a live TCGplayer feed — on the roadmap.
2 · Your price bands — a card's market price lands in a range → it lists for that
The first range that contains a card's market price wins. Each rule lists at a fixed $ price or a ±% off market — pick with the $/% toggle on the row. +20 = 20% above market, −15 = 15% below; a % rule never drops below your floor.
Market minMarket maxList price ($ fixed or ± % off market)
3 · If a card's outside every band
Cards outside every band list at max(Floor, Market × Multiplier).
4 · Safety rails — applied after, to every card
Card floors — never list a matching card below $X (raise only). Each row targets cards by any mix of game, rarity, printing (Reverse Holo / Holo / Normal), and name has… (a subtype like ex, V, VMAX). Blank = any. A card matches when every set field matches; the highest matching floor wins.
Swing cap clamps how far a price can move from its current price in one apply (composes with the built-in large-move review). Blank = no cap.
5 · Custom markup — a flat $ added ON TOP of the final price (the very last step, after rounding)
Markup adds on top of your computed price, so it only moves existing listings if a pricing source is set — price bands above, or "Let prices move with the market" below. With neither, new listings still get the markup but existing ones won't reprice.
e.g. 1 = list everything $1 higher
Markup rules — add more for specific cards (by game, rarity, printing, name has…). The most specific matching rule wins; otherwise the global amount above applies.
TCGplayer export eligibility
Which matched cards go into your TCGplayer sync (not a pricing rule). Eligible to export = matched & active with qty ≥ Min and eBay price < Max — unless "list every matched card" is on. Already-listed rows always stay included.
Display value adjustment — does NOT change list price
Display / analytics only. The inventory MKT column and Mkt-Value totals scale each card's market price by its condition. These are display/analytics estimates (TCGplayer has no free per-condition price feed) and do not change your eBay or TCGplayer list prices. Near Mint = 1.00 (base); enter a fraction of NM for each played grade. Graded, sealed, or unknown-condition cards show the base NM value. A * on a MKT value marks a condition-adjusted estimate.
Playable Sets
Top-25 competitive Pokémon decks — your stock vs market
Card Matching
TCG cards that need a catalog match
Needs Review
Title
Qty
Price
Match
Fix Duplicates & Reconcile
Verify duplicate listings and reconcile your inventory to your ledger
Duplicate listings
Review each — the same card listed under different box SKUs should merge into one listing. If two rows are actually different cards (a mis-bind), do not consolidate — use Card Matching to fix the binding instead. Consolidating keeps one listing (highest qty), sets its quantity to the group total, and ends the others on eBay. This fires real eBay Revise/End and is confirm-gated.
Reconcile to ledger
Compare each listing's live quantity to your inventory ledger truth (imports minus sales). This is a dry run — nothing changes until you apply.
Read-only diff first; an Apply button appears below if anything differs.
Platform drift — eBay vs Leumas
Leumas is the source of truth. Syncs no longer overwrite your data — they just report what eBay shows. These are the SKUs where eBay and Leumas disagree: a sale you didn't record, a quantity or price you changed on eBay directly, or a listing that ended on eBay while you still hold stock. Resolve each: push Leumas's number to eBay, or accept eBay's into Leumas.
Read-only. Each row has explicit actions; nothing changes until you click one.
Reconcile from an import
Leumas is your master inventory, and your import is the truth. Upload your current inventory export (from whatever tool you use) and Leumas will show every card whose count disagrees, then — only for the cards you approve — set each one to your file's count. This heals an over-count and makes a re-import a no-op instead of adding again. Matched by card (not by SKU), so the changing SKUs don't matter. Preview-first; it revises live eBay listings, so nothing happens until you approve each card.
Reads your file locally; compares to Leumas. No change until you review & approve.
Platform Drift
Where eBay disagrees with Leumas — re-assert your truth in bulk
eBay vs Leumas
Leumas is the source of truth. Syncs no longer overwrite your data — they just report what eBay shows. These
are the listings where eBay and Leumas disagree on quantity or price. Tick the ones to fix and
Push selected to eBay — Leumas's number is written to each live listing (ReviseItem), then the flag clears.
This fires real eBay writes and is confirm-gated; nothing changes until you push.
Set Lots
Track set completion across your TCGs — pick a game, series & set
Pick a series and set above to load the master-set completion grid. Phase 1 — read-only dashboard. Phase 2 (Create Lot wizard) + Phase 3 (instant on-sale chain) coming next.
Common / Uncommon / Holo Set
—
/ — cards
Complete sets sellable: 0 · 0 currently listed
Reverse Holo Set
—
/ — cards
Complete sets sellable: 0 · 0 currently listed
Cards in this set — 0 total
Card #
Name
Rarity
Normal Qty
Reverse Holo Qty
Set Lots Snapshot
Loading every configured set…
Series Rollup
TCG
Series
Sets
Avg Normal %
Avg RH %
Avg Combined %
Complete Buckets
Loading…
Per-Set Detail
TCG
Series
Set
Normal %
RH %
Combined %
Cards
Loading…
Create Set Lot Listing
—
Edit if needed. eBay rejects titles > 80 chars.
Single Buy It Now price. You set it.
Auto-generated cover image rendered locally. On submit, uploaded to 0x0.st (anonymous free host) and referenced in the eBay listing's PictureURL. If upload fails, you'll be prompted for a manual URL. You can replace the photo via eBay seller hub after the listing is created.
These are required by eBay AddItem. Set them once — values are saved to localStorage and reused on every future SETLOT listing. Find profile IDs in eBay Seller Hub → Account → Business Policies.
Donor Plan — what happens on submit
Show all donors (0)
Combine Scanner
Find existing eBay listings that look like the same card and could be combined
Scans active eBay listings and clusters them by extracted card # + matching set name.
Only listings with BOTH a detectable card number AND a detected set name are eligible.
Listings with grading prefixes (PSA, BGS, SGC, CGC) or "signed/auto" markers are skipped.
Each proposed cluster shows the listings — you pick which one is parent, check the box to include, then click Queue Selected.
Queueing pushes to the same approval queue used elsewhere — nothing combines on eBay until you click Push.
No scan run yet
Click "Scan Active Listings" to find combine candidates among your existing eBay inventory.
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.
—
Reset
Not loaded yet
Click Refresh to load archived combines and compute candidate matches.
Combine Listings
Parent/Child SKU management · pick tracking
Combine Flow
1. Import CardUploader CSV on Import page → cards appear in Active Listings
1. Come here → New Exact shows exact title matches → Approve individually or all at once
2. Similar — Review shows near-matches → Approve or Deny each one
3. Click Push to eBay → parent quantities update on eBay instantly
4. Click End Children → child listings ended on eBay
Already synced your eBay store and want to merge cards you've listed more than once?
Those are existing listings, not imports — the tabs below stay empty for them. Use
Consolidate Duplicate Listings (button at the top of this page, or on the Inventory page):
it finds every card you've listed multiple times and merges each into one listing.
Existing (0)
New Exact (0)
Similar — Review (0)
Queue (0)
New Imports (0)
Manual Combine
Denied (0)
Lot Backfill (0)
Combined Groups — 0 parent SKUs
Duplicate Listings — combine-aware (admin test)
Finds cards listed more than once across all your active listings — including combine parents/children, which the New Exact list below can't see. Keeps the combine parent (or highest-qty listing), sums quantities into it, ends the rest (each recorded as a combine child). Dry-run first; runs in small batches.
Exact Duplicate Titles — 0 pending
Parent SKU + Title
Child SKU + Title
New Qty
Lot
Action
Similar Titles — Manual Review — 0 pending · —
Existing Parent
New Listing
Match Score
Lot
Action
Approval Queue — 0 waiting to push
These combines have been approved and will push to eBay on the next Push. If a combine
fails (parent delisted, eBay rejection, etc.) it stays in the queue and re-fails on retry.
Use to remove a single stuck approval without wiping the whole queue, or to point
it at a different parent SKU when the original parent has been absorbed elsewhere.
Parent SKU
Child SKU
Title
Action
Pre-Combine Groups — 0 duplicate set${'\u00A0'}(list once, combine in-place)
Title
Copies
Parent SKU
Child SKUs
Lot
New Imports — Unmatched Cards — 0 pending
SKU
Title
Price
Qty
Lot
Status
Action
Pick a lot to tag listings as they're created
Manual Combine — Search and combine any two listings
PARENT SKU (keep this listing)
CHILD SKU (merge into parent)
Select a parent and child SKU above
Denied Combines — these will never be re-suggested
SKU A
SKU B
Action
Lot Backfill — what this does
Backfills lot_id across three tables in one shot per rule:
combines.child_lot_map · inventory.lot_id · orders.lot_id.
Order sales pick up the lot via assigned_child_sku chain, so the Lots tab P/L attributes correctly going forward.
Safety: the engine never overwrites an existing lot value — only fills nulls / empty map keys. Every write is logged to lot_backfill_audit under one batch_id. Revert any batch with one click.
SKU convention: new lots use SKUs starting with "Box ". Anything else is legacy → assignable to lot old via the one-click below.
Quick Actions
Phase A — Auto-pass
For every unmapped combine child, fill from existing data: (a) 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.
Click "Preview" to scan…
Non-Box → Lot 'old'
Pattern ^(?!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.
Click "Preview" to scan…
SKU Rule Engine — 0 rules
Type a regex pattern + pick a lot. Live match preview before commit. Each Apply runs across all three tables under one batch_id. Stored rules persist between sessions — re-running an already-applied rule is a no-op for rows already tagged.
Match preview will appear here
Pattern
Lot
Last Applied
Writes
Action
SKU Bucket Browser — 0 buckets unmapped
Buckets are auto-extracted from currently-unmapped SKUs across combines + inventory + orders. Click a bucket's Apply button to create a rule for that prefix and run it immediately. Buckets only show "Box "-prefixed SKUs — use the Non-Box one-click above for legacy formats.
Bucket
Inv
Children
Orders
Total
Assign to lot
Action
Audit Log — 0 batches
Showing most recent ~1000 rows of audit history (PostgREST cap). Each row = one Apply click. Revert undoes exactly that batch's writes (clears the lot_id back to null wherever this batch had filled it). Manual edits made after a batch are preserved — revert only touches values this batch wrote.
When
Source / Pattern
Lot
Writes
Status
Action
Pick List
Orders awaiting fulfillment · pull and ship
Pending Orders
Order
Item
Pull SKU
Buyer
Date (PST)
Price
Card Lots
Purchase tracking · P&L per lot · SKU assignment
Unassigned SKUs
Loading...
Monthly Report
Operations P&L · investment spend on Master Dashboard
All Months Summary — Operations P&L
Month
Op Expenses
Investment
Sales
Earnings
Op P/L
Margin
Orders
Units
Listed $
Sell-Thru
Multi-Card%
Expense Ledger
Business expenses · all channels
Recurring Costs Auto-added to the ledger each month/year
Item
Type
Cost
Frequency
Since
Expenses
Date
Item
Type
Cost
Filtered Total: $0.00
Investments
Singles & Sealed · by year
Combined — Singles + Sealed
Singles
Sealed Product
Investment P/L by Year
Year
Type
Invested
Sales
Earnings
Unsold Value
P/L
ROI
Singles
Individual card investments
Singles
Card
Purchased
Paid
Copies
MKT
Tot MKT
Unreal P/L
Sold Date
Sales
Earnings
P/L
Status
Actions
Sealed Product
Sealed product investments
Sealed Items
Item
Copies
Invested
MKT
Tot MKT
Unreal P/L
Sold
Sales
Earnings
P/L
Status
Actions
CARD SEARCH
Search by card name, set, SKU — inventory + orders + combine groups
Start typing to search
Results across inventory, orders, and combine groups
Widget Lab
Build your own pages from widgets — Orders, Pick List, KPIs, Inventory on one grid. Saved pages appear under "My Pages".
Scan & Identify
Upload card images — we match them automatically
1 Configure2 Upload3 Review
Setup
Saved title / description / images / policies — edit via Configurations
Catalog we match your scans against
Listing defaults
Default for every card (editable per card later)
Default starting price
Auto-increments if it ends in a number
Scheduling (optional — stagger listings)
Start time (blank = now)
All listings go live immediately.
Database: English Pokémon
Front only — one image per card
Store category
2nd category
Click to upload or drag & drop files or a folder
Up to 500 cards per batch
Front + Back pairs by filename (name-front.jpg / name-back.jpg). Stock = catalog image on the listing.
Review & list
Upload cards to begin.
Scan Configuration
Title format, description, images, platform policies & categories
Configuration profile
Profile
Name
Set as default
Title generator
Capitalize Each Word Abbreviate Condition Abbreviate Rarity Use NM/M wording Artist Last Name Only
Variables — click to add to the title; AA forces that variable uppercase
Structure — drag to reorder (or use ); × to remove
Preview
Description & images
Description template (sent to eBay — variables like {title}{set_name}{card_number} are filled per card)Extra images (up to 4 — added to every listing after the card photo)
Platform & business policies
Platform
Payment policy
Shipping policy
Return policy
Store categories — each maps to its own business policies
Category name
eBay category ID (optional)
Map a store category to its payment / shipping / return policies. When a card is filed under a category, those policies apply automatically.
Listing store categories — eBay allows up to 2 per listing
Primary
Secondary (optional)
Scan Batches
Drop big batches, work the matching & pricing as you have time
Your batches
Loading…
Match Accuracy
Auto-match accuracy & manual corrections by TCG — all tenants (admin)
Accuracy by TCG
Loading…
Inconsistency reports (beta)
Loading…
Consolidate duplicate listings
Find every card you've listed more than once and merge each into a single listing — keep one (the highest-quantity, or your combine parent), bump its quantity, and end the rest on eBay. Same card + same printing only; graded slabs and different printings are never merged. This is a dry run — nothing fires until you review and run a batch.
Fix / Replace match
YOUR SCAN
CURRENT MATCH
Suggestions — pick a different card
Combine
Combine duplicates now so inventory gets one clean listing per card. Children's SKUs are kept as combine children; quantities roll into the parent.
Import data
Pick a source, then drop or choose your CSV.
Import options
Auto-combine exact-title matches — route identical-title cards to New Exact. Off = keep in New Imports for manual combining.Auto-list imports to eBay — list imported cards automatically (already-listed skipped). Off = land unlisted; list with +eBay.Require a catalog match before listing — a card can't be listed until it's matched (or marked “no catalog match”). Keeps every live listing identity-clean so counts reconcile reliably. Off = list anything.Split comma-separated User SKUs (CardUploader migrate) — a cell like E1695,E1696 imports as two child SKUs. Off = comma kept as part of the SKU.
Recently imported
eBay Ads
Promoted Listings — promote your listings; eBay charges an ad fee only when an ad leads to a sale.
Customize
Make it yours — brand, colors, text size. Live preview; nothing changes for anyone else.
Brand
Your name + logo replace the in-app wordmark. (The browser-tab name stays "Leumas Live".)
Brand name
Logo (PNG/JPG/WebP, ≤2 MB)
Colors & Text
Brand-accent, sidebar, and background. (Profit/loss reds & greens stay fixed so P&L always reads right.)
Primary / accent
Highlight
Sidebar
Background
Font
Text size
Default landing page (after login)
Changes preview live as you edit. Save makes them stick across devices.
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.
Manual Listing
Add an item to inventory — eBay-ready (photos, policies, description). Added to inventory, not auto-listed.
Add Item to Inventory
Sealed product, sleeves, accessories, or any item not from CardUploader.
Title *
SKU (auto if blank)
Category
Quantity *
Price ($) *
Cost Paid ($)
Assign to Lot
Condition
Notes
Description (eBay)
Photo
Click to add a photo
Add this photo + title to my internal catalog
Recently Added (Manual)
No manual entries yet
Import Data
CSV exports from eBay & CardUploader
CardUploader Export
Export from carduploader.com. Cards added to inventory. Assign lot after import. Multiple files supported — drop or pick several at once.
Raw Cards
Click or drop raw CSV(s)
Graded Slabs
Click or drop slab CSV(s)
Captures grader, grade & cert #. Excluded from combines.
Reads: *TitleCustomLabel*StartPrice*Quantity · slabs also read grade + Certification Number
Card 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.
Click or drop CSV(s)
Reads: *TitleCustomLabel*StartPrice*Quantity · skips Info,Version=... line
TCG Automate Export
Export from TCG Automate (eBay Bulk Upload format). Cards added to inventory. Multiple files supported — same parser as CardUploader.
Click or drop CSV(s)
Reads: *TitleCustomLabel*StartPrice*Quantity
TCGplayer 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.
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.
Click or drop your inventory CSV
Reads: Catalog SKUUser SKUTitleTCGplayer SKUPriceQty · no eBay listings revised/ended
Historical Sales (any platform)
Import past sales from eBay, TCGplayer, Cash, Discord, Mercari, or anywhere else. Download CSV template
Click or drop Sales CSV
Cols: DatePlatformItem NameQuantitySold PriceFeesNetBuyerSKULotCost BasisMarketplace Order IDItem IDItem URL
Import past TCGplayer orders for your records. This records order history only — it does not change inventory. Re-importing is safe (deduped by order #).
Click or drop TCGplayer Orders CSV
Reads: Order #DateProductSetConditionQuantityPriceBuyer
Recent Imports (last 10)
Time
Type
Rows
Status
Files
Loading...
Import Log
Time
Type
Records
Status
Notes
No imports yet
API Status
Connected services · sync status
eBay Developer API
Listings sync, order fulfillment, finances, combine push · per-tenant OAuth
Connected
eBay Sync Controls
Last sync: Never — click Test Connection first
TCGPlayer API
Real-time card market prices for Singles & Sealed investments
Planned
️
Supabase Database
leumas-live · cxyjpfdpmvcfjpqbaigp · East US
Connected
Domain — inventory.leumascc.com
DNS setup pending · will point here after Netlify deploy
DNS Pending
Domain — leumascardcraze.com
Brand domain · parked for future storefront
Parked
When eBay API connects — what happens automatically:
→Your eBay listings sync to database
→New orders appear in real time
→Pick list activates for every order
→eBay fees tracked exactly via Finances API
→Combine push: parent qty updated on eBay
→April 30–today orders backfilled automatically
→Parent hits zero → unpulled children flagged
→Weekly eBay store fee auto-import to ledger
Diagnostics
Read-only audits across inventory and combines data. Run any anytime.
Note: All buttons here are READ-ONLY. They scan local state and report findings — no database writes, no eBay calls. Cleanup scripts (which DO write) remain console-paste-only by design.
Fire every read-only card in sequence (~30s end-to-end). Each card's verdict renders inline; scroll to review.
Connect eBay (Multi-Tenant OAuth) PHASE 3
Connects your eBay account via OAuth. Required for the multi-tenant sync path. After connect, your encrypted refresh_token lands in ebay_credentials. Phase 3-part-2 will refactor ebay-proxy to use this per-user creds path instead of env-var creds. Until then, your current ebay-proxy v41 stays the active path.
Account Settings PHASE 3-P2
Per-tenant return address (printed top-left on every 4×6 TCG shipping label) + eBay proxy version flag (controls whether eBay calls use v1 env-var creds or v2 per-user OAuth creds). Click Load to fetch your current values.
eBay AddItem requires a city + ZIP for every listing. This is your default ship-from. CSV imports can override per-row.
City
State
ZIP
Country
eBay Business Policies (listings)
Enter the exact policy names from your eBay account (Account → Business policies). Required to cross-list TCGplayer imports to eBay.
Shipping policy
Payment policy
Return policy
eBay Proxy Version
Current path:v1 Connected via OAuth:— Connected seller:— Token expires:—
All eBay calls use per-user OAuth (v2). The legacy shared-creds proxy (v1) is retired. Connect eBay is required before eBay features work.
Quick Test
Webhook Subscription
Calls SetNotificationPreferences on your OAuth token. Routes to v1 or v2 based on the flag above. Required after Connect eBay for events to flow.
Admin-only operational audits below. New users won't see this block.
Self-Loop Audit
Scans combines for any parent_sku that appears in its own child_skus, and pending approvals for parentSku===childSku. Verifies the v2.9.88 chokepoint is holding the line. Expected: 0 findings.
Year-Boundary Patterns Audit
Hard deadline: Dec 31, 2026. Scans local state for any field/value that still references "2026" — `totals2026`, `months2026`, `ord2026`, etc. Documents the pattern surface for the eventual refactor session. Past Dec 31 these become silent misclassification bugs.
Combine Integrity Audit
Scans combines table for structural anomalies: duplicate parent_skus (two combine rows pointing to the same parent), empty child_skus arrays (combine with no children), non-string elements in child_skus, and parent_skus with no matching inv row (orphan parents). Expected: 0 across all four categories.
Combine Qty Integrity
For every active combine where all kids have an inv row (no phantoms), compares parent 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 Subscription
Registers your eBay account to push real-time notifications to the 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.
Queries 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 Projection Refresh
Reloads 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 Freshness
Queries 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 Reconciliation
Shows the count of inventory rows where 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.
Lot Attribution Coverage
Snapshot of Lot Backfill progress — how many 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 Delivered
Queries the 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.
Data HealthSKU drift · combine recording · audit batches
Dup-SKU Drift Monitor
Counts SKUs shared by 2+ active inventory rows. Post the 2026-05-25 cleanup (930 rows renamed under batch 8d9c4cbf-…) this should sit at 0. Any drift indicates future imports / manual edits re-introducing duplicates. Re-run after CSV imports to confirm cleanliness.
Combine Recording Health
For every active combine whose parent has a live inv row, compares 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.
Malformed Combine Children
Counts 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.
Historical-Overlap SKU Tracker
Counts the SKU collision categories intentionally skipped in the 2026-05-25 dup-SKU cleanup: 1 active + N historical (functionally fine — single live SKU) and all-historical (audit noise only). Plus surfaces any new active-vs-active collisions that might appear later. Lets you decide later if/when to clean up historical overlap.
Recent Audit Batches
Merges the most recent batches across three audit tables: 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 Length Sanity
For every boot-loaded ST array (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).
Multi-Listed Cards Scanner
Scans inventory for (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 State Readback (drift detector)
Compares TCG's actual listed inventory against our local 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.
Force-Drain CSV: uses TCG's exported Total Quantity per row to compute negative deltas. Drains TCG to 0 even when our local 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.
Admin
Cross-tenant operational view · admins only
You don't have admin access. This page is only visible to administrators.
Create Beta AccountProvisions a confirmed tenant (free tier). Share the credentials with the user.
Email
Temp password (≥10 chars)
Display name (optional)
Buy-Back Rates — Sell to LeumasPick a TCG tab → set price, toggle ON/OFF, reorder. Shown on leumascc.com. Prices start blank.
Subscription TiersEdit price + calls/day inline; saves on blur
When a tenant types a card name to match it and the database has no result, it's logged here so you can add the missing card. Ranked by how often it's been searched.
Searched
Times
Tenants
Where
Last
Inventory Health — cross-tenant drift & integrity
The nightly sweep that watches every tenant's inventory. Grouped by tenant, worst problems first. Click a tenant to expand; each finding explains what it means and what to do. Newest run shown.
Beta Testers
Email
Source
Signed up
Action
Signup Waitlist
Email
Source
Signed up
Action
Edit Tenant Subscription
—
Tier
Subscription Status
Beta Grandfather (50% off effective price for life)
Catalog Contributor (may submit cards to the catalog queue)
Billing State (for sales tax)
Marketplace / Region
Sets this tenant's eBay site, currency & default timezone. US is the default; switching to Canada makes their eBay reads, dashboards & financials run in CAD and their local time. Takes effect on their next hard-reload + Sync.
Timezone (financial bucketing)
Pick-List Start Date
Orders sold BEFORE this date won't appear in this tenant's pick list (prevents already-shipped history from flooding it + being mis-picked into combines). Auto-set to their go-live day on first sync. Blank = show the normal last-30-days.
API Calls / Day Override
Custom per-user daily call cap, independent of the tier. Blank = inherit the tier's limit.
Admin Notes
Security
Flags the account so a non-dismissible "set a new password" box appears the next time they log in. Applies immediately — no Save needed.
For a tenant who FORGOT their password (can't log in to change it). Sets a temporary password you give them; they're forced to choose their own on next login. Applies immediately — no Save needed.
Permanently removes the login + every row of this tenant's data. Cannot be undone — asks you to type DELETE. Blocked for admins / yourself.
TCG Catalog
TCGplayer reference data · upload monthly Pricing Custom Export CSVs
Upload one CSV per game (TCGplayer · My Account · Pricing · Generate Pricing Custom Export). Re-uploading replaces existing rows on conflict — safe to refresh anytime.
Matching is now automatic — new inventory binds to the catalog on its own; anything ambiguous waits for a one-click review under Card Matching.
Match Inventory
Matching now runs automatically — no button to press
Inventory now binds to the TCG catalog automatically. The moment cards land in your inventory (after listing/approval or manual entry) the safe matcher runs on your rows, and a nightly job re-checks everything as catalog data and prices change. Safe, unambiguous matches bind silently; the rare ambiguous card is held for a one-click Confirm / Reject under Card Matching. Nothing here needs your attention unless you want it.
Sync to TCGplayer
Generate TCGplayer MyPricing CSV from eligible inventory
Pushes every eligible card (new + needs_update) to TCGplayer in MyPricing format. Listing prices and export eligibility come from your Pricing Tool rules; after a sync, rows are marked so the next one only carries drift.
⬇ Download the Sync extension (.zip)Unzip → chrome://extensions → Developer mode → Load unpacked. Full steps in Help & Guides → "TCGplayer Sync".
Recent Sync History
TCG Orders
Ingest + commit TCGplayer orders — Phase 2c.1b
PREVIEW + COMMIT. Upload your Shipping CSV + Packing Slips PDF, click Run Preview Match to see catalog matches, inventory allocations, tripwires, and unmatched lines. Then click Commit OK Orders to: (1) insert tcg_orders + tcg_order_lines rows, (2) decrement Leumas inventory for matched SKUs, (3) revise eBay listing quantities (or end listings that hit zero), (4) log results to tcg_sync_log. Idempotent on tcg_order_number — re-running on already-committed orders is a no-op. Only 'ok' status orders commit by default; 'review' and 'hold' orders stay for manual decision.
1. Shipping CSV
No file selected
2. Packing Slips PDF
No file selected
Shipping Queue
Committed TCG orders awaiting fulfillment — print labels, mark shipped
SHIPPING WORKFLOW. After committing TCG orders on the TCG Orders page, they land here as 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.
Status:Search:
Card Shows
Card-show events — pull SKUs, sell on the floor, reconcile after.
Add Listings
Hide sold
What's New
Roadmap, recent updates, and your feedback.
Roadmap
Recent Adds / Fixes
Suggestions & Issues
Dead Stock
Active listings sitting longest with no sale — and the cash tied up in them.
Listed over
days
Charts
Visual view of the same figures as Monthly / Master / Year Over Year
Monthly Sales · Earnings · Expenses
Cumulative P/L Trend
Tax Summary
Your year mapped to IRS Schedule C lines (sole proprietor / single-member LLC)
Informational summary — not tax advice. This maps your tracked sales, card/lot purchases and expense ledger to the closest Schedule C lines for the selected year. Numbers come straight from your dashboards and may need adjustment for items the app doesn't track (vehicle/home-office/depreciation, personal-use splits, inventory timing). Always confirm with your tax professional before filing.
Income & Cost of Goods Sold
Schedule C line
Amount
Part II — Expenses
Schedule C line
Fed by
Amount
Line 31 — Net profit (or loss)
Line 1 gross receipts − Line 4 COGS − Line 28 total expenses
Break-Even Calculator
How many sales / how much revenue to hit a target — pre-filled from your data
Inputs
Target amount (e.g. monthly costs / a goal)Average sale valueAverage net margin %
Per-Platform Card Economics — admin only · real revenue, modeled net · where you're at
Links sale revenue to selected lot for P/L tracking.
RECORD SALE
Manual sale record. In Leumas Live with eBay API, this will push a real-time quantity update to eBay.
Sale Date *
Quantity Sold *
Sale Price ($) *
Platform
Buyer / Notes
SUGGESTION
What would you like to see added?
REPORT AN ISSUE
Describe the problem
Steps we captured automatically (your recent clicks)
ADD ROADMAP ITEM
Item (high-level, tenant-facing)
ADD UPDATE
Date
Type
What changed (major only)
NEW CARD SHOW
Event name
Start date
End date
RECORD SALE
Sale price ($)
Qty sold
Payment method
TRADE
Cards received (you can add several)
Card name
Card #
Value ($)
Cash
Direction
Gives away 1 unit of the card above (its eBay listing is decremented or ended). Each received card becomes a sellable line. Cash received books as card-show income; cash paid books as a New Purchase cost.
PULL IN INVESTMENTS
Liquidating? Pull held investments onto the floor. Selling one books to the investment tab (decrements qty-on-hand) — it does NOT touch the card-show P/L; the "Investment Sold" tile is a visual aid only.
NEW PURCHASE
Title
Card number
Purchase value ($)
Does not touch eBay. Counts as a New Purchase (lowers show P/L + books to your Expense Ledger → monthly/yearly P&L). If it sells, it books to Orders. Export "New Cards" after the show to scan in.
BULK PURCHASE
Category
Rate is per-card (decimal). Total = Count × Rate. Tier abbreviations (C / UC / RH / H / IR…) come later.
Name
Count
Rate
Total
Rows to add
Grand Total: $0.00
SHOW EXPENSE
Label
Amount ($)
Books to your Expense Ledger (tagged to this show) → flows into monthly/yearly P&L.
CONSIGNMENT
Consignor name
Split model
Your commission %
RECORD SALE
Type
Item
Sale Date
Platform
Qty
Sale Price ($)
Earnings After Fees ($)
BIND TO CATALOG
Search TCGplayer catalog (TCGCSV)
Click a result to bind it to every copy of this item and set its market value.
ADD PRODUCT
Search TCGplayer catalog (TCGCSV)
Click a result to match it (sets market value + product id). Then enter what you paid and how many copies you're holding.
Paid ($)
Copies held
Purchase date
MATCH TO CATALOG
Search TCGplayer catalog
Pick the exact card + set + condition — binds this listing's identity.
REMATCH INVENTORY
ADD EXPENSE
Date *
Cost ($) *
Item / Description *
Type
ADD RECURRING COST
Item / Description *
Cost ($) *
Frequency
Type
Start date *
Auto-populates the ledger from the start date forward — monthly on that day-of-month, yearly on that month/day. Months already passed since the start date are filled in too.
EXPENSE TYPES
Add custom categories. Click × to remove unused types.
RETARGET PARENT
Search inventory for new parent SKU
AUTO-MATCH PARENTS
QUEUE HEALTH AUDIT
EDIT LISTING
Title0 / 80
Price
$
Lock this price — exclude from automatic market repricingStore category (primary)Store category (secondary — optional)