Kream Sneakers Resale Market Analysis

January 28, 2026 (6mo ago)

An Operations Analyst project on Kream sneakers resale: collect trade history by size, clean it into a sales fact, and analyze premiums and signals in Power BI.

Source code stays private. The live dashboard below is shared with Publish to web.

Problem

Resale decisions need how often a model×size trades, at what price, and at what premium to retail. A few recent rows on a product page are not enough for seasonality or size gaps. Histories are long and easy to interrupt, so a one-shot scrape is not enough.

How collection works

Playwright attaches to an already-logged-in Chrome and runs each product like this:

StepWhat happens
1Start from a product page or the queue
2Identify the model and expected volume per size
3Collect only sizes that are still incomplete
4Save size, price, date, delivery type to CSV
5Merge by model → sales fact → Power BI
Run typeDescription
SingleThe product open in the browser
BatchWalk a queue of products unattended
Queue adderPull model / URL from the current tab into the list

Resume, update, fill gaps

If there is no file yet, collect from newest trades downward.
If a file already exists, collect only newer trades and stop when they overlap the old data.
If a run was interrupted, resume from a temp file. If the newest side is filled but the oldest side is missing, fill that gap only.

“Done” is not just a raw row count. A size counts as complete when it is close to the expected volume on the page (~90%), so a temporary stall is not treated as finished.

When something blocks the run

SituationResponse
No new trades appearWait, reload, then retry remaining sizes
Session expiredLog in again and continue
Scroll looks stuckNudge upward; skip the size if it still fails
Wrong size or bad dateDrop those rows; stop that size if needed
Size volumes look wrongRe-run size analysis
Volume is extremely highSkip that size for safety

Batch mode: read the queue → fill missing sizes → merge and remove from the queue on success → notify on stalls or skips.

Keeping the data clean

RuleWhy
Size match checkKeep other sizes from mixing into a batch
Compare to expected volumeDecide whether a size is complete enough
Relative → absolute datesTurn “3 hours ago” into real dates at fact export
Deduplicate on re-runKeep only new trades
Master cacheReuse brand, release date, retail, size mix
Split size keysSame mm with different US labels stay separate

From CSV to fact

One row = one trade.

StepOutput
1CSV per size
2One merged file per model (+ SKU)
3Cross-model sales_fact (SKU, Size, Price, Date, DeliveryType)

Data modeling (star schema)

In Power BI, a trade fact joins product, brand, and date dimensions.

TableRole
fact_salesOne trade (SKU, Size, Price, DeliveryType, DateKey …)
dim_productModel, names, category, retail, release date
dim_brandBrand
dim_dateDate
What-ifAnalysis period, profit target, Sales/Qty, signal toggles

Key measures: %Average Premium, Daily Avg Price, Bollinger / RSI / Trend signals, KREAM Price Forecast.

Dashboard

Kream resale dashboard

Report pages:

PageContents
OverviewSales, quantity, average premium; sales by date and brand
Price trendDaily average price by brand / product / size
SignalsQuantity vs price, Bollinger bands, period / profit-target what-if
Premium by brandBrand premium, retail vs resale, weekday vs weekend
Size heatmapSize × brand premium, trend by delivery type

Sample observations:

  • About 3M trades, ~912bn KRW sales, ~59% average premium
  • Sales concentration: Jordan → Nike → Adidas
  • Jordan is a clear premium outlier versus retail
  • Premium also splits by size, delivery type, and collaboration

DAX / modeling notes

%Average Premium =
DIVIDE (
    [Daily Avg Price] - SELECTEDVALUE ( dim_product[Retail_Price] ),
    SELECTEDVALUE ( dim_product[Retail_Price] )
)
  • Attributes come through relationships; calculations live in measures.
  • Signals combine fact measures with what-if period and profit target.

Stack

LayerTools
CollectionPython, Playwright (attach to Chrome)
OpsResume, incremental update, wait/retry on stalls, re-login
ETLPer-size CSV → merge → sales_fact
AnalyticsPower BI (star schema, DAX, what-if)

Results

Built a trade collector that can resume and update by size, exported a sales fact, and connected it to a Power BI report for premium, price, and signals — embedded above.