Andrew Joji
← Back to home

Wholesale Pricing Platform

itsWorthIt Solutions — UBC Entrepreneurship Co-op · Jan 2025 – Aug 2025
0:00 / 0:00

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.

Supplier CSV exportsinconsistent formatseBay APIlistings · orders · inventoryAdapter layernormalize + map fieldsPostgreSQLvia PrismaDashboardfilters · FX · offers

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.

Schema comparison
FieldQuickFlips (premiumlistallsystems.csv)CATRP (catrp_buylist_091126.csv)
TitleTitleTitle
Platform/CategoryPlatform (flat)Category + Subcategory (split)
Condition tiersNew / Complete / MM / LooseNew / CIB / CIB(Excellent) / CIB(Average) / CIB(Poor) / No Manual / Loose
Price format$18.00 (dollar sign)18.00 (plain float or -- for N/A)
UPCYesNo
Catalogue stats
SourceSKUsUnique platforms/categoriesDate
QuickFlips2,89943Sep 11, 2026
CATRP34,51640Sep 11, 2026
Overlap (title match)1,111 items——
Price comparison — loose condition, 10 matched items
ItemPlatformQF Loose (USD)CATRP Loose (USD)Delta
Chrono TriggerSNES$150.00$37.50QF +$112.50
Pokemon PlatinumNintendo DS$117.00$86.11QF +$30.89
Kid DraculaGameboy$140.00$100.79QF +$39.21
Super Mario RPGSNES$37.00$11.31QF +$25.69
Silent Hill 3PS2$50.00$50.73~Equal
MiitopiaNintendo Switch$15.00$15.99~Equal
Super BowlingNintendo 64$275.00$407.39CATRP +$132.39
Mega Man 5NES$87.00$144.35CATRP +$57.35
Godzilla 2NES$52.00$116.58CATRP +$64.58
Haunting GroundPS2$100.00$132.75CATRP +$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.

Key insight

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.

Sourcemarketplace finds + full collectionsListpricing + inventory toolingSelleBay + local + conventionsTrackKPIs in Python + Sheetsbuyer feedback loops back into pricing + sourcing decisions

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.