Competitor pricing, treated as a system.
A custom embedded Shopify app for competitor-price monitoring across a multi-brand DTC sleep portfolio — an operator UI for managing price targets, scheduled selector-based scraping, historical snapshots, and competitor prices written back into Shopify metafields, maintained across runtime and Shopify API changes.
Constraint confirmed · outcome not claimed
- Industry
- Anonymised multi-brand DTC sleep portfolio / commerce-ops tooling
- Platform
- Shopify
- Engagement
- Since March 2021
Built with.
- Shopify embedded app
- Scheduled scraping
- Koa / Node
- Next / React admin UI
- Firebase persistence
- Shopify Metafields
Pricing intel stuck in a spreadsheet.
A multi-brand direct-to-consumer sleep portfolio needed competitor pricing treated as a commerce-operations capability, not a manual chore. The constraint was never "fetch a price" — it was keeping that data *operable*: owned by operators, kept current, reviewable over time, and available to the Shopify surfaces themes and campaigns actually read.
Checking competitor prices by hand left the data disconnected and stale the moment a rival moved. The real problem was the absence of a system around the number, not the number itself.
Design it as an embedded app, not a script.
The fix is a proper embedded Shopify app, not a detached script bolted to the side of the store. Three design choices drive it: give non-engineers durable control of the watch-list, keep a clean historical record, and land the data in metafields where the storefront and campaigns consume it.
Price extraction is selector-based by design — a transparent approach for operator-maintained targets, where each target carries a label, a source URL and a selector path.
An operator UI wired to Shopify.
The app sits behind embedded-app authentication with verified routes — it installs and runs as a real app, not a side script. A server fetches each target page and reads the visible price from a configured selector, on a schedule plus on-demand manual refresh, so the data stays fresh on a cadence and re-pulls the moment a competitor moves.
An admin UI gives operators direct control: add, edit and remove competitor price targets, so the people who own pricing own the watch-list. Persistence holds both the live entries and a running series of historical snapshots, surfaced in a history view of charts and tables so price movement is reviewed over time rather than read once and lost. Competitor prices are written back into Shopify metafields — the bridge that turns a scraping job into commerce-operations data the rest of the stack can use.
Kept alive across years.
The unglamorous work is what keeps an internal tool alive instead of rotting: the app was carried across runtime changes and Shopify metafield type and API updates across years. That maintenance — not any single screen — is the durable part of the capability.
The reusable point is capability, not a result: a maintained, embedded app that joins an operator UI, scheduled and manual scraping, persistent history, a review surface and metafield write-back is a stronger claim than "a scraper was written." We make no pricing-accuracy, margin, conversion or current-production-usage claim — selector-based scraping is inherently fragile, and its live state is not verified here. That restraint is the discipline; the evidence is the implementation record itself.
Scope confirmed · lift not claimedRecognise this in your store? Bring this page to the call.
We'll tell you in 20 minutes whether the same constraint applies to your situation — and what the right next step would be.