Morning repricing console for Shopify with margin-safe rules

By General Input

Pick a repricing rule, send an assistant out to check competitor pages, then approve the new prices that clear your margin floor.

Integrations

  • Hyperbrowser
  • Shopify
  • Google Sheets

Type

App

Categories

  • Operations
  • Finance

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads