India
ProjectsDecember 1, 2025

A competitor price monitor for Shopify

A Shopify app that tracks what competitors charge for the products a merchant also sells, and adjusts the merchant's prices according to rules they set. It is around 21,000 lines with 16 Prisma models and 13 test files. The client is not named here pending sign-off. Fetching competitor prices is straightforward. Knowing which of their products corresponds to which of yours is not. The same item is listed under different titles, different SKUs, sometimes different pack sizes. Two listings that look identical to a string comparison can be a 200ml bottle and a 500ml bottle. Matching on title similarity alone produces confident, wrong matches, and a confident wrong match is worse than no match, because it feeds a repricing rule. So matching produces a candidate with a confidence level rather than a verdict, and low-confidence matches wait for a human instead of flowing into pricing. No rule changes a live price on its own. A rule produces a proposed set of changes, the merchant sees exactly what would happen, and it applies only once they approve it. This was a deliberate constraint rather than a missing feature. Automated repricing that runs unattended has a bad failure mode: a bad match or a competitor's pricing error propagates into real prices on a real storefront within minutes, and the merchant finds out from their margin report. Keeping a person in the loop costs very little in a workflow that already runs on a daily rhythm. The app also collects price-drop and back-in-stock signups from the storefront. Putting those next to competitor movements turns out to be the more useful half of the product: a merchant can see that eleven people are waiting on an item and that a competitor just went out of stock on it, and price accordingly. Those two facts usually live in separate tools.

Related projects

bouncer, CI gates that let anyone contribute

bouncer, CI gates that let anyone contribute

Five checks that sit at the door of your main branch, written as pure functions so the same modules run in CI, in a Cloudflare Worker, on Railway and in the browser. Pointed at a real 1,209 file repository it went from 45 blocking findings to 13, all 13 genuine.
estate, a linter for your repositories

estate, a linter for your repositories

Checks every repository you own against declarative rules and exits non-zero, so the problems nobody notices for months fail a build instead. One Go binary, no dependencies, no dashboard.