Resale Desk
Inventory and profit tracking for second-hand resellers, from purchase to sale.
Try it: the live demo has a "Try the demo account" button on the login screen, preloaded with sample data.
I buy second-hand items and resell them on Vinted, eBay and OLX, and tracked it all in a spreadsheet until the spreadsheet couldn't keep up. Resale Desk replaces it with a web app that follows each item's life cycle: purchase (single items or bundles), shelf location, listings on several platforms at once, sale with shipping and fees, and any refunds or write-offs.
A dashboard pulls it together: realized profit, a monthly profit chart, sell-through rate, ROI and margin, inventory by status, most profitable purchases, and items in stock with no active listing. Existing spreadsheet data comes in through a validating CSV importer that reports every skipped row and why.
Notable technical decisions
A normalised data model. Purchases, items, listings and sales are separate tables rather than one spreadsheet-style row, because one purchase can hold many items and one item can be listed on several platforms. Profit, ROI and margin are calculated as properties on the SQLAlchemy models, so every page shows the same numbers.
Money is Decimal, never floats. Amounts are stored as fixed-point Numeric columns and handled as
Python Decimal values. This was a later change, made after floating-point rounding errors showed up in totals.
Bundle costs aren't split. Any way of dividing €50 across ten items would be invented, so a bundle's cost stays on the purchase and its profit is total revenue minus total cost.
Losses are events, not statuses. Early versions had "Refunded" and "Not Sold" statuses that didn't affect the numbers, so losses quietly vanished from profit. Refunds now belong to their sale, and write-offs remove stock and count its cost as a loss, the way sales software treats returns. "Sold" and "Written Off" can't be set by hand, so an item can never look sold without a sale behind it.