Sync prices with your sales channels
Two systems can hold a price for the same product, and only one of them can be right. Master of price is the setting that decides which. Once you've chosen, SKU.io either sends your price out to the channel or reads the channel's price back in — and when it sends, a set of guardrails checks every price on the way out, so a mistake in a spreadsheet can't reprice your whole catalogue on a live marketplace.
You set this per channel, so Amazon can follow your prices while eBay keeps its own.
Before you begin
- The channel must already be connected. See Connect a Shopify store for what connecting looks like.
- You need permission to change that channel's settings.
- If you want SKU.io to send prices out, you need a pricing tier to send them from.
Choose which side owns the price
- Go to Apps & Integrations and open the channel.
- Open Settings, then the Pricing Sync tab.
- Under Pricing Settings, set Master of Price:
| Choice | What happens |
|---|---|
| SKU.io | Your prices are sent out to the channel. |
| The channel's own name (for example Amazon) | The channel's prices are read back in, and the marketplace stays in charge. |
| Neither | Nothing moves in either direction. |
- If you chose SKU.io, pick a Pricing Tier. That tier supplies the actual number that gets sent, so this is required — without it there's no price to send.
- Click Save Changes.
Set the guardrails
Everything below is on the same tab, in the Push prices to [channel] card.
Guardrails are checked immediately before every price is sent — on every path. That includes a tier change, an imported price, and an automatic repricing rule. There's no way to send a price that skips them.
Price floor
Refuses anything cheaper than the amount you set.
- None — no lower limit.
- Fixed amount — a hard minimum in your currency, for example
$5.00. - Margin % — a minimum margin over the product's cost, so the floor moves as your costs do.
Price ceiling
The same idea at the top end.
- None — no upper limit.
- Fixed amount — a hard maximum.
- Markup % — a maximum markup over cost.
Maximum change
This is the one that catches the mistake nothing else will. It measures each new price against the price you last sent to that channel, and refuses anything that moves further than the percentage you allow. A misplaced decimal in an import is caught here even when the resulting price sits comfortably between your floor and your ceiling.
When exceeded decides what happens next:
- Block the whole run — nothing is sent, so a bad import can't get halfway in.
- Skip that listing — everything else is sent, and the one at fault is left alone.
Choose how often it runs
How often sets the schedule: every 15 minutes, every 30 minutes, hourly, every 3 hours, every 6 hours, every 12 hours, or daily.
Between runs, only prices that have actually changed since the last successful send are included. A catalogue that's already correct costs nothing to keep in sync.
Preview before your first push
Click Preview changes. Every check runs and every outcome is recorded, and nothing is sent to the channel.
The result appears under the buttons as a count of what would have happened — pushed, skipped, blocked, failed — and the whole run is saved, so you can open it and read it line by line before you commit to anything. On a catalogue of any size this is the step that turns a leap into a decision.
When the preview looks right, click Push prices now to send for real, or just let the schedule pick it up.
Letting one large change through
Maximum change compares against the price you last successfully sent, and a refused price is never sent — so the baseline doesn't move, and the same change is refused again on every later run. It won't creep upward in steps; it stays blocked until you act.
When a large move is deliberate, use the arrow beside Push prices now and choose Push with a higher change limit. Set the limit for that run and push.
- It applies to that run only — your saved limit is untouched.
- It's raise-only: a value at or below the saved limit is ignored.
- It cannot relax the price floor, the price ceiling, or the rule that refuses a zero or negative price.
The run history records the limit that was actually enforced, not the one saved in settings, so a one-off exception is still visible afterwards.
On a non-production connection, Push prices now is unavailable and the card says so. Preview changes still works, because a preview never transmits.
Read the pricing comparison
Every channel also has its own Pricing page — open the channel and choose Pricing. Listing by listing, it puts your price next to the price the channel last reported, so you find a disagreement before your customer does.
Four cards along the top summarise it:
| Card | Meaning |
|---|---|
| Out of sync | The two prices disagree. The Difference column shows by how much, in both dollars and percent. |
| In sync | The two match. |
| Channel price unknown | The channel hasn't reported a price yet, so there's nothing to compare. |
| Never pushed | SKU.io has never sent this listing's price — whatever state it's currently in. |
Each card is also a filter: click Out of sync and the table narrows to just the listings that disagree. Clear it again with Clear, or by removing the chip under the search box.
You can also filter by Status, Master, Push state and Last pushed, search by SKU or product, add columns from Columns, and save any combination as a view with Save current so it's one click next time.
Two buttons at the top of the page save you a trip: Pricing Settings jumps straight to the tab above, and Push Prices Now sends from here.
Refresh what the channel says
The comparison is only as current as the last time the channel reported in. Fetch from [channel] re-reads prices from the marketplace now, so the table reflects what the channel says at this moment. It runs in the background — you can leave the page.
This button appears only on channels that can report their live listing state: Amazon, BigCommerce, eBay, Shopify, Walmart and WooCommerce. On the others there's no way to re-read the channel's price on demand, so no button is offered rather than one that would do nothing.
When one listing needs different rules
The guardrails you set on the Pricing Sync tab govern the whole channel. A single listing can carry an exception instead, replacing them for that listing only.
The Guardrails column on the Pricing page shows which applies to each row — Channel for the defaults, Listing where an exception is in force — so you never have to guess which rules are governing a price.
An exception replaces the whole set — floor, ceiling, maximum change and the exceeded action — not just the field you came to change. A floor left as None in an exception means no floor for that listing; it does not fall back to the channel's floor.
This is deliberate: it means any refused price traces to exactly one rule, rather than to a combination of scopes each supplying different fields.
Add or edit an exception
From the Pricing page:
- Click the Listing chip in the Guardrails column to open the exception governing that row.
- Right-click any row and choose Set guardrail exception.
- Tick several rows and use Set guardrail exception to apply one set of values to all of them, or Clear exceptions to return them to the channel's guardrails.
The same dialog also sets that listing's master of price and pricing tier, so you can hand one listing to the marketplace — or price it from a different tier — without leaving the page. Those two go together: choosing to override means setting both.
Two combinations are refused when you save, because they'd block every push for that listing: a floor above the ceiling, and a floor or ceiling whose type isn't None but has no value.
Review every exception
The Exceptions tab beside Comparison lists all of them for the channel — what each applies to, the values it sets, and who set it and when. When a price is behaving oddly, this is the shortest route to the rule responsible. Search by exception ID, and edit or remove from the same table.
Read a run
Click View history on the Pricing Sync tab. Each run shows when it started, what triggered it (scheduled or manual), whether it was a live push or a preview, and how many listings were pushed, skipped, blocked, or failed.
Click Details on any run to see every listing it touched, one row each, with its old price, its new price, and what happened to it. Filter that list with All, Pushed, Blocked, Failed and Skipped.
The Detail column is the useful part:
- A blocked row names the guardrail that refused it and shows the numbers — "Below the $5.00 price floor", or "Changes by 50%, over the 25% limit" — so you can judge whether the fault was the price or the limit.
- A failed row carries the channel's own reply, in the channel's words.
- A skipped row usually just says "Price unchanged" — the normal, healthy majority on a settled catalogue.
A scheduled run only keeps a row for each listing whose price changed or was refused. If a run's detail view is empty, it did nothing that needed recording — the unchanged listings are counted on the run itself rather than listed.
Nothing is being sent — what to check
Work down this list in order:
- Master of Price isn't SKU.io. If the channel owns price, SKU.io reads instead of sends. Nothing going out is the correct behaviour.
- No pricing tier is set. With SKU.io as master and no tier, there's no price to send.
- The schedule is paused, or price sync is off for that channel. The card tells you which of these applies.
- Everything really is in sync. Only changed prices are sent, so a run that reports all skipped is a run with nothing to do. The Never pushed card on the Pricing page tells you whether anything has genuinely never gone out.
- The connection isn't a production one. Previews work; live pushes don't.
If prices are being refused rather than not sent, the run history names the guardrail and the numbers — start there. If those numbers don't match the settings on the Pricing Sync tab, that listing has an exception: check the Guardrails column on the Pricing page, or the Exceptions tab.
Which channels support this
Amazon, BigCommerce, eBay, Faire, Magento 1, Magento 2, Shopify, Square, Temu, TikTok Shop, Walmart and WooCommerce each have their own Pricing Sync tab and Pricing page. The settings and the pages work the same way on every one of them.
Next steps
- Manage a connected app — control what else a channel syncs.
- Map channel fields to products — line up the rest of the data behind those prices.
Video transcript
Two systems, one number. Something has to decide which of them is in charge, and that setting is called master of price. You choose it per channel, on the Pricing Sync tab of the channel's own settings. Make SKU.io the master, and your prices go out. Hand it to the marketplace instead, and what it charges becomes the source of truth. Neither, and nothing moves at all. One more thing is needed on the way out: a pricing tier, which supplies the actual number. Below that sit the guardrails. Every value is checked the moment before it leaves SKU.io — no matter what produced it, whether a tier change, a spreadsheet import, or an automatic repricing rule. A floor refuses anything cheaper than the amount you set. A ceiling does the same at the top end. Maximum change catches a different kind of mistake. It measures each new value against the one you last sent, and refuses anything that jumps further than you allow. That is what stops a bad import from repricing an entire catalogue. You decide: block the whole run, or skip only the listing at fault. How often decides the schedule. Between runs, only prices that have actually changed since the last successful send are included, so a catalogue that is already correct costs nothing. The first push has to be previewed. Every check runs, every outcome is recorded, and nothing at all is sent. On a catalogue of any size, that is the difference between a decision and a leap. Every channel also has its own Pricing page. Listing by listing, it sets your figure beside the one the marketplace last reported — so a disagreement reaches you before it reaches your customer. Four cards along the top carry the summary. Out of sync means the two disagree, and the difference column shows by how much. In sync means they match, to the cent. Channel price unknown is the marketplace staying silent — it has not reported a figure yet. And never pushed counts everything SKU.io has yet to send for the very first time. Every one of those cards is also a filter — click Out of sync, and the table narrows to just the listings that disagree, each gap spelled out in both dollars and percent. After a push, the run history tells you what happened to every listing. Not just how many succeeded — which ones were refused, and by which rule. Open any run from that list, and every single listing it touched is accounted for, one row each. A blocked row names the guardrail that refused it, with the numbers, so you can judge where the fault really lies. A failed row carries the marketplace's own reply.