Marketplace Cart

Full-stack system for collecting, organizing, and sharing secondhand marketplace listings with normalized data, role-based lists, and accurate cost calculations.

Node.jsExpressMongoDBMongooseEJSPassport.jsPuppeteerCheerioAxios

Why this project exists

Marketplace Cart turns scattered marketplace links into structured, shareable lists.
It’s built for real planning workflows—tracking availability, comparing prices, and collaborating—while hiding the messiness of scraping and inconsistent third-party data.


What the system does

🔗 Ingest listings reliably

  • Scrapes OfferUp and Facebook Marketplace listings
  • Uses a two-step preview → confirm workflow to validate data before saving
  • Cached previews prevent unnecessary re-scraping

🧠 Normalize messy marketplace data

  • Standardizes raw condition strings into five canonical values
    (New, Like New, Good, Fair, Poor)
  • Keeps filtering, sorting, and totals consistent across platforms

🗂️ Organize with flexible, shareable categories

  • Create custom categories for projects, rooms, or plans
  • Assign items to multiple categories without duplicating data
  • Share categories with explicit roles:
    • Viewer (read-only)
    • Editor (can add items)
  • Toggle categories between public and private

💰 Calculate totals without double-counting

  • Platform-based subtotals
  • Automatic deduplication when items appear in multiple categories
  • Accurate grand totals for planning and budgeting

Backend architecture highlights

  • Modular scraper registry routes URLs to the correct scraper
    • Static pages via Axios + Cheerio
    • Dynamic pages via Puppeteer
  • Service-layer item pipeline centralizes preview, normalization, and persistence
  • Ownership-aware data models enforce permissions on shared lists
  • Shared Puppeteer browser instance reduces overhead and manages lifecycle cleanly

UI shaped by backend structure

The UI stays intentionally simple:

  • playlist-style item cards
  • inline category assignment
  • filter, sort, and search powered by normalized data

This keeps the interface usable even as collections grow.


Engineering challenges

  • Scraping dynamic marketplaces without polluting core logic
  • Enforcing collaboration rules without breaking data integrity
  • Keeping totals correct across shared, overlapping categories

Each challenge pushed the architecture toward clearer boundaries and stricter normalization.


Tech stack

  • Backend: Node.js, Express
  • Database: MongoDB + Mongoose
  • Auth: Passport.js (session-based)
  • Scraping: Puppeteer, Axios, Cheerio
  • Frontend: EJS + vanilla JavaScript

Why it stands out

Marketplace Cart is less about scraping and more about engineering around unreliable inputs.
It reflects a backend-first mindset: validate early, normalize once, and design systems that stay correct as features and users scale.