Morning repricing console for Shopify with margin-safe rules
Pick a repricing rule, send an assistant out to check competitor pages, then approve the new prices that clear your margin floor.
Build me a repricing console my merchandiser opens every morning to decide which Shopify prices to move. The shape of the job is: look at where I sit against the competition, send a check out on the products that look wrong, let a rule propose a new price, and approve the handful I agree with. Two things must always be true. A rule proposes, a person applies, so no price in my store ever changes without someone ticking a row and pressing Apply. And every competitor number on screen is clickable through to the page it came from, because a price I cannot verify is a price I will not act on.
The main view is a dense grid of my products, one row per variant. Load the catalogue with Shopify List Products and Shopify List Variants, and show product title, variant name, SKU, my current price, my unit cost and my current margin percent. Next to that, show the competitor picture from the last check: the cheapest in-stock competitor price, which competitor it was, the gap in money in my store currency and the gap in percent, and when that competitor price was last checked, shown as a relative age like 2 hours ago or 9 days ago. Sort the grid by default so the products that most need attention float to the top, combining the size of the gap with the staleness of the check, so a big gap checked this morning and a product nobody has checked in two weeks both surface. Let me re-sort by percent gap, money gap, margin, or check age, and filter by collection, vendor and product type so a merchandiser can work one category at a time.
Margin needs a unit cost. Pull cost from Shopify with Get Inventory Item where the store already carries one, and let me enter or override a cost per variant inside the app, including pasting a list of SKUs and costs. Where no cost exists, still show the price gap but render the margin cell as Cost needed with an inline field to fill it in, and keep that variant out of any rule that depends on a margin floor until it has one.
Selecting rows and pressing Check competitors starts a background agent on that selection, and the grid shows those rows as checking while it runs. For each selected product the agent works through my registered competitor domains one at a time. If I have already pinned a competitor URL for that product and competitor, it goes straight to that page and skips searching. Otherwise it uses Hyperbrowser Search Web, scoped to that competitor domain, with the product title, brand and any identifying attributes, then uses Hyperbrowser Start Scrape Job on the promising results to read the candidate pages. It then runs Hyperbrowser Start Extract Job over the matching product pages, polling Get Extract Job Result, to pull back a structured price, currency, availability such as in stock, out of stock or preorder, and the page title. For a competitor site that resists a plain scrape, for example one that hides the price behind a size or region selector, the agent can fall back to Hyperbrowser Start Browser Use Task to drive the page and read the price the way a shopper would. Everything it finds writes back into the app against the product: competitor name, price, availability, page title, source URL and a checked-at timestamp, so the grid updates in place and every figure links out to the page.
Product matching is the hard part and the agent will sometimes be wrong, so treat confidence as a first-class state. When the agent is unsure it has the same product, for example a different pack size, a different colourway, a bundle rather than a single unit, or a page where the price it read looks ambiguous, mark that competitor reading as needs review with a short note explaining the doubt, keep it out of the pricing rule, and surface a needs review count at the top of the console. From a needs review item I can open the page, confirm it as the right match, correct the price by hand, or reject it. Confirming pins that URL to the product for that competitor so future checks go straight there instead of searching again, and I can also paste a competitor URL onto a product by hand at any time. Pinned URLs are the manual override that makes the console get better the more it gets used.
Competitors that are out of stock get flagged and excluded from the rule, since there is no point chasing a price nobody can actually buy. Show them on the expanded row, greyed out and clearly labelled sold out, so the merchandiser can still see the full picture, and let me toggle them back in for a specific product if I want to price against them anyway.
The console then proposes a new price for every row that has a usable competitor reading. I pick the rule: match the lowest in-stock competitor, undercut the lowest in-stock competitor by a percentage I set, or hold, meaning propose no change. Let me set a default rule in settings and override it for a selection of products, so I can undercut on the lines I compete hard on and hold on everything else. Every proposal is clamped by a margin floor I set: if the rule would produce a price that lands below the floor, propose the lowest price that still clears the floor instead and mark the row as clamped so I can see the rule was overruled by margin. Show the old price and the new price side by side on the row, with the resulting margin percent and a note of which competitor and which rule drove it. Rows where the proposal equals the current price should be visibly quiet so they do not compete for attention.
Only when I tick rows and press Apply does anything get written to my store. Show a confirmation step listing the ticked changes with old price, new price and resulting margin, and call out any clamped rows. On confirm, call Shopify Update Variant for each ticked variant to set the new price, and for every one that succeeds append a row to my price history tab with Google Sheets Append Values: timestamp, product title, variant, SKU, old price, new price, the competitor name, competitor price and competitor URL that drove the change, the competitor availability at the time, the rule that was used, whether it was clamped by the margin floor, the resulting margin, and the name of the person who approved it. If a Shopify update fails, say so clearly on that row and write nothing to the sheet for it, so the sheet only ever records changes that really landed. Give me a History view that reads the tab back with Google Sheets Get Values so I can see every price we have moved and filter it by product, by person and by date.
A settings area holds the competitor list as names paired with domains, used both to scope the searches and to label prices on the grid, plus the price history spreadsheet and tab, the margin floor, the default pricing rule and its undercut percentage, and how many days old a check can be before the row is called stale. Persist the competitor readings, the pinned competitor URLs, the unit costs and the needs review queue in the app, so the console is fully populated the moment someone opens it, before any check has run that morning.
Make it readable at a glance for someone standing with a coffee before the day starts. Dense table, money formatted the way the store shows it, a clear visual difference between a price checked this morning and one checked last month, obvious flags for sold out competitors, clamped proposals and needs review rows, and the tick boxes and Apply button always within reach. The measure of success is that a merchandiser opens it, reads the top of the grid, checks a dozen products, and applies five deliberate price changes in under ten minutes.
What does this prompt do?
- Opens on a grid of your Shopify variants showing current price, unit cost and margin right next to the competitor prices you last found, the gap in money and in percent, and how long ago each competitor was checked.
- Tick the products you care about and press Check competitors: an assistant searches the competitor sites you registered, opens the matching product pages, and reads back the price, whether it is in stock, and the page title, with a link to the exact page behind every number.
- Your chosen rule proposes the new price, whether that is matching the lowest in-stock competitor, undercutting by a percentage you set, or holding steady, and no proposal is ever allowed to break the margin floor you set.
- Nothing moves until you tick rows and press Apply, which writes the new prices to Shopify and appends every change to a price history tab in Google Sheets with the competitor that drove it and who approved it.
What do I need to use this?
- A Shopify store you can edit product prices in
- A Hyperbrowser account for reading competitor pages
- A Google Sheets file with a tab to hold price history
- The list of competitor websites you want checked
- Unit costs for the products you want margin figures on
How can I customize it?
- Switch the pricing rule per product group: match the lowest in-stock competitor, undercut it by a percentage you choose, or hold the current price.
- Set the margin floor no proposed price is allowed to break, and decide how many days old a competitor check can be before the row is called stale.
- Change the competitor sites that get searched, and pin the exact competitor page for a product so every future check goes straight to it.
FAQs
Will it change my prices on its own?
What happens when a cheaper competitor is out of stock?
How does it know which competitor page matches my product?
What if it is not confident about a price it read?
Where does the price history live?
Related templates
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.
See the projected bounce rate for any outbound send before it goes out, and keep the launch button locked until the list is clean enough to be safe.
Pick any date range and see what each device in your home actually cost to run, not just how many kilowatt-hours it used.
Search three months of global coverage on your topic, rank the outlets actually writing about it, and draft a tailored pitch for each one.
Stop picking models off leaderboards. Keep your own test set, shortlist candidates from Hugging Face, and run them side by side to see which one actually wins.
Stop guessing which prices to move this morning.
Open one console, check the competitors that actually matter, and apply only the price changes you approve.