Wholesale Pricing Platform
The problem
Once I was working with multiple wholesale buyers at once, deciding where a given batch of inventory should go became a real analytical problem, not a gut call. Every supplier's data showed up differently — inconsistent CSV exports, different category names, different currencies — and comparing offers by hand didn't scale past a handful of listings.
I built this as my UBC Entrepreneurship Co-op placement, operating my own registered business as the co-op itself: half reselling operations, half technical automation and consulting work on the systems behind it.
The pipeline
Supplier exports and eBay's own API both feed into one normalized layer. Supplier-specific adapters handle the inconsistent formats — standardizing naming, merging product variants — before anything lands in PostgreSQL via Prisma. On the eBay side, listing, order, and inventory data sync in the same way, so the internal tools are always working off current state instead of a stale export.
That shared data powers a Next.js dashboard with pagination, category filters, real-time currency conversion, and competitive offer detection — the actual decision-making surface I used every week to figure out where inventory should go.
Live Data Snapshot
A real run of the normalization layer — one piece of the wider pipeline built during this co-op — against two live supplier exports: premiumlistallsystems.csv (QuickFlips) and catrp_buylist_091126.csv (CATRP), ingested Sep 11, 2026, before pricing logic runs on top.
| Field | QuickFlips (premiumlistallsystems.csv) | CATRP (catrp_buylist_091126.csv) |
|---|---|---|
| Title | Title | Title |
| Platform/Category | Platform (flat) | Category + Subcategory (split) |
| Condition tiers | New / Complete / MM / Loose | New / CIB / CIB(Excellent) / CIB(Average) / CIB(Poor) / No Manual / Loose |
| Price format | $18.00 (dollar sign) | 18.00 (plain float or -- for N/A) |
| UPC | Yes | No |
| Source | SKUs | Unique platforms/categories | Date |
|---|---|---|---|
| QuickFlips | 2,899 | 43 | Sep 11, 2026 |
| CATRP | 34,516 | 40 | Sep 11, 2026 |
| Overlap (title match) | 1,111 items | — | — |
| Item | Platform | QF Loose (USD) | CATRP Loose (USD) | Delta |
|---|---|---|---|---|
| Chrono Trigger | SNES | $150.00 | $37.50 | QF +$112.50 |
| Pokemon Platinum | Nintendo DS | $117.00 | $86.11 | QF +$30.89 |
| Kid Dracula | Gameboy | $140.00 | $100.79 | QF +$39.21 |
| Super Mario RPG | SNES | $37.00 | $11.31 | QF +$25.69 |
| Silent Hill 3 | PS2 | $50.00 | $50.73 | ~Equal |
| Miitopia | Nintendo Switch | $15.00 | $15.99 | ~Equal |
| Super Bowling | Nintendo 64 | $275.00 | $407.39 | CATRP +$132.39 |
| Mega Man 5 | NES | $87.00 | $144.35 | CATRP +$57.35 |
| Godzilla 2 | NES | $52.00 | $116.58 | CATRP +$64.58 |
| Haunting Ground | PS2 | $100.00 | $132.75 | CATRP +$32.75 |
Both sources priced in USD. Delta is a direct comparison — the pipeline normalizes price format (CATRP omits the dollar sign; QuickFlips includes it) before matching.
Of 1,111 matched items, QuickFlips offered a higher loose price on 706 (63%), CATRP on 375 (34%), with 30 equal — average delta $0.90 USD.
1,549 items exist only in QuickFlips; 21,574 only in CATRP — the adapter layer prevents false negatives when a supplier drops or renames an item.
Closing the loop
Dashboards only help if you notice when something's actually broken. I built automated tracking and reporting in Python and Google Sheets to monitor account and pipeline KPIs, flagging where a workflow or conversion step was quietly failing before it became a real problem.
I also went back through buyer feedback and sales data to find friction points in the customer journey — where a listing was clear but a follow-up wasn't, mostly — and fed what I found back into pricing and sourcing decisions. That loop is what actually moved the repeat customer rate, not any single feature.
Where it's headed
The system was built with more than just my own business in mind — clean adapter boundaries, a normalized schema, and enough separation between the pricing engine and the eBay integration that it could plausibly grow into a small SaaS tool for other resellers running the same wholesale-comparison problem.