Quick scan before the full breakdown.
Goal
Compare MacBook offers across three sources and surface the biggest resale margin gaps
Stack
FastAPI, React, Docker, SQLite, n8n
Result
MVP built in 25 hours, syncing on a schedule with no manual step in the loop
A reseller wanted one answer before buying anything: which MacBook on a supplier’s spreadsheet is actually worth buying once resale value, fees, and shipping are accounted for. Three separate places held pieces of that answer, and none of them talked to each other.
I built a private price monitoring app that pulls offers from all three, matches them against the same MacBook, and ranks the gaps by margin.

The setup: a supplier spreadsheet, a public resale catalog, and a B2B site with Cloudflare’s bot detection sitting between me and the data I needed.
The spreadsheet and the catalog were straightforward — a scheduled read and a REST call. The B2B site was not. My first scraping attempts got blocked immediately by Cloudflare, and finding a way through took real trial and error. What worked was a Python scraper I built myself, running in its own Docker container on the same remote MacBook that hosts the rest of the app. It’s the one piece of the system dedicated entirely to getting past a single site’s bot checks, and the piece I expect will need the most upkeep going forward.
Once the data was flowing, the harder problem was matching: the same MacBook described three different ways, with model, year, chip, storage, RAM, and grade worded slightly differently source to source. Get the match wrong and the margin number underneath it stops meaning anything.
Two screens carry the actual decision-making.
Match review puts each offer next to its full price breakdown: purchase price, marketplace commission, payment processing fee, and two line items I hadn’t planned for at first — adapter and shipping. A MacBook with no charger, or one shipped internationally, isn’t the same purchase as one that ships domestically with everything included, and a margin calculated without those costs is wrong in a way that only shows up after the laptop’s already bought. Those corrections live in per-item settings, so the same setup handles a unit missing its charger and one that isn’t.
Wholesale dashboard takes everything confirmed, filters it by grade and chip, and ranks it by margin in euros and margin percent, so the biggest gap sits in the first row instead of something you have to go dig for.
FastAPI backend, React frontend, SQLite for storage, and the Docker-based Python scraper handling the protected source. n8n runs the scheduled sync that keeps all three sources current without anyone triggering it by hand. Claude did a lot of the groundwork on the FastAPI endpoints and the matching logic, which is a big part of why the whole build fit into 25 hours.
The MVP shipped in 25 hours. Getting past Cloudflare on one source, and building a price model that doesn’t lie about margin the moment a laptop shows up without its charger, is what actually took the effort.
Three nearby case studies worth reading next.

Aug 22, 2026
An 11-workflow n8n system that reconciles refunds across WooCommerce, Mollie and e-Boekhouden, with duplicate protection, retries, an independent audit, and alerts.

Aug 22, 2026
What it actually costs to run an AI chatbot day to day, why the agent model wasn't worth it, and how ticket-based state beats keeping everything in the prompt.

Aug 10, 2026
A conversational n8n assistant that qualifies leads for a bookkeeping firm, scores them against admin-editable thresholds, and starts fresh for every new conversation.
If you have a manual workflow between tools, I can help map the logic, design the system, and automate it in a way your team can actually use.
Hire Me on Upwork