> ## Documentation Index
> Fetch the complete documentation index at: https://docs.readyforcommerce.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Ready for Commerce is an ecosystem that currently contains two products, PIM and Repricer, standing on one shared foundation: one identity, one organization, one team, one bill. Do not call it a platform with features, and never hint at an unreleased product.
> PIM connects to Shopify, Amazon, Square, Google Merchant Center and BigCommerce. Repricer connects to Amazon, Walmart, Shopify, BigCommerce, eBay and Square. The two products do not share one list, and each integration is authorized separately inside each product. The roster grows on purpose, so describe what the product does and let a table carry which integrations do it today, instead of counting them or writing that only one does something.
> Integration is the word this product uses, and it is the default in the documentation: the connection, the account, the Integrations screen, the per-account settings and the sync state are all integrations. Channel is reserved for the narrow sense of a destination where a listing lives, as in a product being live on a channel or archived on the channel.
> Newegg is not a supported channel. Do not describe it.
> On Amazon, PIM manages the offer only: price, availability and condition. It does not publish listing content such as titles, descriptions, images or specifications.
> Sign-in is passwordless: a single-use code emailed to the user, or Google. There are no passwords anywhere, so never describe a password, a sign-up with a password, or an email confirmation link.
> There is no public API for customers and no customer-facing webhooks. There is no organization-wide activity feed and no audit export, but the PIM does keep version history on products, brands, categories, tags and specifications, with who changed what and a restore, so never write that changes are not recorded or that an edit cannot be undone. Do not describe capabilities that are not documented here.
> Never write that the products have no AI, and never write that anything is AI-powered. Both are wrong. The PIM's image Optimizer runs AI-backed transforms the seller starts on purpose: Upscale, Remove background, and the region selection behind Refine. The Repricer reads competitor prices off web pages on the server. No control, badge or tooltip in either product names AI, and the seller never writes a prompt, so describe what the buttons do in the app's own words instead of reaching for the word.
> A PIM product, brand, category or variant can be switched off per connected integration account. Hover the channel badge and the switch is beside the account name in the card that opens. It carries no visible caption, so never call it the Sync switch: Sync is only its accessible name. On a variant-grained provider, Amazon today, the switch moves into the variant editor. On a product it asks whether to delete it from the channel, archive it there, or leave it live. Disabling stops publishing, not reading. There is still no per-field sync toggle.
> The PIM's image Optimizer replaced a feature called Squarify, which no longer exists. It resizes to an aspect ratio or to exact dimensions, removes backgrounds, upscales, trims the transparent margin around a cutout and re-centers it, pads, fills and re-encodes, and it always publishes a new asset instead of changing the original. Nothing crops into the picture: the subject is always contained whole.
> The PIM has no repricing engine and never reacts to a competitor's price. It does build the price it publishes to each integration account from the seller's own fields, configured in that account's settings, so do not write that the PIM has no pricing rules.
> Neither product has an in-app notification center, bell or inbox. Notifications are delivered by email only.
> Billing is per organization and per product, and only the organization owner can see or change it. Team members are free and uncounted, so never describe seats or per-user pricing.
> The seller never picks a plan. Each product has twelve price tiers assigned automatically from usage: the PIM from catalog product count, which includes drafts and archived products, and the Repricer from trailing 30-day sales. Nothing is feature-gated by plan and exceeding a tier never blocks work, so never write that a feature requires a higher plan.
> A subscription that is past due or paused makes the product read-only, which stops repricing and blocks edits without deleting data. Only a canceled subscription locks the seller out. Nothing is ever charged without a payment method on file.
> Pages containing the text 'This page has not been written yet', or its Spanish equivalent 'Esta página todavía no está escrita', are placeholders. Do not treat their headings as documented behavior.

# Pricing

> Pricing is where you record what an item cost you and what you charge for it, and it is where every integration you connect gets the price it publishes.

Pricing is where you set what an item costs you and what you sell it for. Every item has five money fields: a price, a compare price, a cost, a MAP, and an MSRP. The price each connected integration publishes for you is built from these fields. So this page is where your price starts, even when the number that ships gets adjusted or rounded on the way out.

The PIM keeps money on the variant, never on the product, because two variants of the same product can sell at different prices. On a product without options you never notice: the product editor shows the money fields, and they are set on its one variant. Once a product has options, the product editor drops its `Pricing` section and every variant gets one of its own.

You open the fields from `Catalog` in the sidebar: open `Products`, click a product, and scroll to the `Pricing` section of the editor that opens. The section changes shape twice as you use more of the PIM: once when you pick another currency, and once when you connect a second account. Both changes are explained below.

## Before you start

### What your role lets you do

Whatever your role, you can edit every money field on this page, including the per-currency and per-account values. Nothing here is above your level. Roles are set in [team, roles and permissions](/team#what-each-pim-role-can-do).

## How to set a price

<Steps>
  <Step title="Open the product">
    From `Catalog` in the sidebar, open `Products` and click the product. The product editor opens over the list.
  </Step>

  <Step title="Find the money fields">
    Scroll to the `Pricing` section. If the editor has no `Pricing` section, the product has options. Scroll to `Variants` and click a variant row: the variant editor opens with a `Pricing` section of its own.
  </Step>

  <Step title="Type the price">
    Type what you sell it for into `Price`. The other four fields can stay empty until you need them.
  </Step>

  <Step title="Save">
    Click `Update` at the bottom of the dialog, or `Create` if the product is new.
  </Step>
</Steps>

That is the whole common case. The amount you typed is now the price every connected integration starts from, and an empty money field simply does nothing. The rest of this page explains the five fields, the costs, other currencies, per-account prices, and the rules that check your numbers. You do not need any of it to put one price on one product.

## Every option in detail

### The five money fields

All five fields are optional, and every amount you type is in your organization's currency. Your amounts take as many decimal places as the currency has, so two in dollars and none in yen.

| Field | What it is for |
| --- | --- |
| `Price` | What you sell the variant for. Unless an integration's settings say otherwise, this is the price it publishes |
| `Compare Price` | A higher reference price, the kind a shopper sees crossed out beside the real one. You cannot save it below the price |
| `Cost` | What one unit costs you. It is three inputs plus a number the PIM calculates, and the next section explains which one counts |
| `MAP` | Minimum Advertised Price, the lowest price you are allowed to advertise |
| `MSRP` | Manufacturer's Suggested Retail Price, a reference value an integration can publish from instead of your price |

**`MAP` does nothing on its own.** Typing one does not keep any price above it. Each connected account decides that for itself with its `Never publish below MAP` setting, which is with the rest of its settings on the `Integrations` page. What typing a MAP does give you is warnings, because the rules near the end of this page compare your other numbers against it.

If you fill one field, fill `Price`. Fill `Cost` second if you want to be warned before you sell at a loss, since both the rules and the [pricing report](/pim/reports/pricing) compare price against cost. The other three matter when a shopper should see a crossed-out price, when a brand limits what you advertise, or when an integration publishes from a suggested price.

<Info>
  A `0` you type here is a real zero, not an empty field, so a price of `0` still sets off the rules below. In an import or a data source, a `0` clears the field instead.
</Info>

### Which of the three costs counts

There are three cost inputs, and a fourth field the PIM fills by itself.

| Field | Who fills it | Can you type in it |
| --- | --- | --- |
| `On-hand Cost` | You, an import, or the cost a connected store reports | Yes |
| `Supplier Cost` | Your data source feed | No |
| `Fallback Cost` | You | Yes |
| `Effective Cost` | No one. The PIM works it out from the other three and your stock | No |

**`Supplier Cost` is written by your feed.** You cannot type into it in either editor, and an import cannot fill it. When a supplier cost is wrong, fix it at the [data source](/pim/uploads/data-sources) that sends it.

**`Effective Cost` is the cost of the cheapest source that actually has stock.** It answers one question: if you sold one unit right now, what would it cost you. So the number follows your stock instead of your typing, and it moves when your stock moves. Which sources have stock is covered in [inventory](/pim/catalog/inventory).

<Accordion title="How the effective cost is picked, case by case">
  - Your on-hand stock and your supplier stock both have units: the cheaper of `On-hand Cost` and `Supplier Cost`.
  - Only one of those two has units: that source's cost, or the other one's when it has no cost of its own.
  - Neither has units, but your fallback stock does: `Fallback Cost`.
  - Nothing has units at all: `On-hand Cost`, or `Supplier Cost` when on-hand is empty.
</Accordion>

Two places treat `Effective Cost` specially. On the products table, the `Cost` column shows the effective cost and is the only cost you can filter by. And your exports include the three inputs and leave `Effective Cost` out.

### Prices in another currency

Your whole catalog uses one currency, the one your organization is set to. There is no per-product currency and no per-variant currency. Changing the organization's currency is an Owner or Admin decision made in your organization settings, and [organizations](/organizations) covers where that happens.

You can still save real amounts in other currencies. At the top of the `Pricing` section is a `Currency` dropdown with 164 currencies. Pick one that is not your own and the whole section switches to that currency alone:

| What you picked | What the fields show | What you can do |
| --- | --- | --- |
| Your organization's currency | Your real amounts | Edit them as usual |
| Another currency, nothing saved for it | Your amounts converted at the current rate | The field is locked. Click `Edit` at the end of the field to unlock it and type a real amount for that currency |
| Another currency, with a saved amount | The amount you saved | Click `Reset` at the end of the field to drop your amount and lock the field back onto the converted amount |

In another currency the three cost inputs fold into one `Effective Cost` field, so you keep one cost per currency instead of three. And until you connect an account, another currency shows no `Price` or `Compare Price` field at all, only cost, `MAP`, and `MSRP`. The next section explains where your prices went.

<Warning>
  Your product and your currency amounts are saved in two steps. When the second step fails, the product is saved, the amounts are not, and a message starting `Master prices saved` tells you so.
</Warning>

That message promises to retry on the next save, and it means the next time you save this product. Reopen it and click `Update` again, because the retry never runs on its own.

Three more things about currency catch people out:

- A converted amount is only as fresh as the exchange rates behind it, which refresh every 4 hours, and nothing warns you about a stale one.
- Switching your organization's currency and switching it back does not restore your old amounts. Each switch converts your amounts again, and the rounding sticks.
- A recurring data source cannot write these per-currency amounts; only your organization's currency goes in. Per-currency amounts in bulk come from an [import](/pim/uploads/imports).

### Prices per connected account

**Connect a second account and the `Price` and `Compare Price` fields disappear.** In their place you get a table, one row per account, with the columns `Integration`, `Price`, and `Compare price`. A row is labeled with the integration and the account, like `Shopify · My Store`, and every cell has the same `Edit` and `Reset` controls the currency fields use. Your price is not gone: it is now set per account, on the row for the account you mean.

A cell you never edited shows your organization's price, converted when you are looking at another currency. Every account starts from the same number until you type one of its own.

These rows set the price and the compare price only. `Cost`, `MAP`, and `MSRP` never vary per account: they keep one value per variant, plus the per-currency amounts above. Per-account prices are saved in the same second step as the currency amounts, and they fail with the same `Master prices saved` message.

**A row managed by [Repricer](/repricer/index) is read-only in every currency.** Instead of `Edit` it shows `Managed by Repricer`. Once the variant has a saved SKU, those words are a link to the listing in the Repricer. The PIM shows you the live price on that account instead of publishing one of its own, and undoing the pairing is the only way to get the row back. Rows can even appear for integrations you never connected in the PIM, because the Repricer prices listings on integrations of its own; those rows are read-only too.

<Accordion title="When the table appears, and when the two fields stay">
  - The table needs a product that has been saved at least once. A product you are still creating shows the two fields, however many accounts you have connected.
  - With no account connected there is no table, and the two fields have your organization's own amounts.
  - With exactly one account the two fields stay, and in another currency they edit that account's row instead of your organization's amount.
  - One account plus Repricer-managed rows in the currency you are looking at brings the table up too, so everything about the price is in one place.
</Accordion>

### Reading prices from the products table

You do not need to open a product to read its prices. The products table under `Catalog` shows `Price`, `Cost`, `Compare Price`, `MAP`, and `MSRP` as columns you can sort and filter, where `Cost` is the effective cost. A product with one variant shows the amount itself, and a product with several shows the range across them.

Three more columns start hidden: `On-hand cost`, `Supplier cost`, and `Fallback cost`. Once shown, you can sort by them, and they are the three you cannot filter by.

### Changing many prices at once

Nothing on the products table changes a price in bulk: its four bulk actions cover status, tags, integration sync, and deleting, and none of them touches money. To change many prices at once, send the new amounts through an [import](/pim/uploads/imports), or let a [data source](/pim/uploads/data-sources) deliver them on its own schedule. An import can write the per-currency amounts too; a data source cannot.

### Limits

| What | Limit |
| --- | --- |
| The most a money field takes | `21,474,836.47` in a currency with cents |
| Currencies in the `Currency` dropdown | 164 |

### What pricing cannot do

| You cannot | Do this instead |
| --- | --- |
| Give a product or a variant its own currency | Save per-currency amounts from the `Currency` dropdown |
| Give one account its own cost, MAP, or MSRP | Only the price and the compare price vary per account |
| Type into `Supplier Cost` | Correct it at the data source that feeds it |
| Change prices in bulk from the products table | Send an import, or use a data source |
| Export the `Effective Cost` amount | Export the three cost inputs it is picked from |
| Make a price watch a competitor | Use [Repricer](/repricer/index), which reacts to competitors for you |

## What your integrations get

The price you type is an input, not the number that ships. Every connected account has its own publishing settings, in its settings dialog on the `Integrations` page, and it builds the price it sends in a fixed order:

1. `Price source priority` takes the first of your `Price`, `MAP`, and `MSRP` that has a value. The compare price can never be a source, because a crossed-out price is not a selling price.
2. `Price adjustment` raises or lowers the result by a percentage or a fixed amount.
3. `Rounding` gives it the ending you chose, such as .99.
4. `Never publish below MAP`, when it is on, lifts the result back up to your MAP. It runs last, so nothing rounds the price back under.

When none of the sources has a value, the product is not published at zero. It is flagged on that integration's badge on the product instead, and you get a message naming it, like `No price is available for Shopify (none of the configured price sources has a value).`

The compare price has settings of its own. `Compare-at price source` picks where it comes from, and a compare price that is not higher than the price being published is cleared on the channel instead of sent. Every one of these settings is worked through in [integrations](/pim/integrations).

Each integration takes different pieces of the money you keep here:

| Integration | What it gets about price |
| --- | --- |
| Shopify | The price and the compare price, once per enabled market. The effective cost, `MAP`, and `MSRP` go once each, in your organization's currency, because Shopify keeps a single value for each |
| Amazon | The price only, inside your offer on an existing ASIN, next to the condition, the SKU-to-ASIN link made on the first push, and the quantity you fulfill yourself. No compare price, no cost, and no product content in either direction |
| Square | The price only; Square has no compare price field. The effective cost goes out as vendor information, which needs a Square plan that accepts it, and after one rejection the PIM stops sending it to that account until you reconnect |
| Google | The price and the compare price, as Google's own sale price pair, plus the effective cost. Your `MAP` becomes the floor for Google's automated discounts. No `MSRP` |
| BigCommerce | The price and the compare price as its sale pair, your `MSRP` and `MAP` into BigCommerce's fields of the same names, with `MAP` set on the product rather than each variant, plus the effective cost |

Shopify adds one hard requirement: your organization's currency has to match the store's own base currency. Until they match, publishing to the store and reading from it both stop, and you see a sync error. Prices for Shopify's other markets are the one exception to your single currency, and only the price and the compare price can vary per market. A market you saved no amounts for keeps Shopify's own converted price.

**Nothing on this page reacts to another seller.** The PIM builds every published price from your own fields and never reads a competitor's price. It also never changes a price on its own. The product that watches competitors and moves prices is [Repricer](/repricer/index).

## When something goes wrong

### The rules that check your prices as you type

Nine rules compare your money fields against each other while you type, in both editors. Three of them are errors: while one shows, `Create` and `Update` are disabled and you cannot save the product. The other six are warnings that never block you.

| The rule | Blocks saving | Shows under | Message |
| --- | --- | --- | --- |
| Compare price below the price | Yes | `Compare Price` | `Compare-at price must be greater than or equal to the price` |
| Price below your cost | Yes | `Price` | `Price is below cost (negative margin)` |
| MAP above MSRP | Yes | `MAP` | `MAP cannot be greater than MSRP` |
| Price below MAP | No | `Price` | `Price is below MAP (minimum advertised price)` |
| Price above MSRP | No | `Price` | `Price is above MSRP` |
| Cost above MAP | No | `On-hand Cost` | `Your cost is above MAP` |
| Cost above MSRP | No | `On-hand Cost` | `Your cost is above MSRP` |
| Cost above MAP | No | `MAP` | `Lower than your cost` |
| Cost above MSRP | No | `MSRP` | `Lower than your cost` |

When your cost is above MAP and MSRP at once, the two warnings under `On-hand Cost` merge into one, `Your cost is above MAP and MSRP`. These messages are not translated, so they appear in English whatever language you use the app in.

Five details make the rules predictable:

- Equal always passes. You can save a compare price equal to the price, a MAP equal to the MSRP, and a price equal to the cost.
- An empty field skips every rule, and a `0` is not empty: a price of `0` against any cost is a negative margin like any other number.
- The cost the rules compare is `On-hand Cost`, or `Supplier Cost` when on-hand is empty, and never `Effective Cost`. That is why `Effective Cost` never shows a rule message, and why a product can be blocked while the effective cost beside it looks fine.
- In another currency the comparison forgives a difference of one cent, so conversion rounding alone can never block a save. In your organization's currency it forgives nothing.
- A variant is checked in the variant editor, where a failing rule disables its own `Update`. Back on the product, saving does not re-check the variants.

<Note>
  A feed can leave a product the editor will not save. A supplier cost that climbs above your price always goes in, and `Update` stays blocked until you raise the price or the cost comes down.
</Note>

The reason is direction. A cost is a fact about your business, and a price is a decision you make. So a feed reporting a higher cost is never blocked by a rule about your decision. The product starts losing money with no message and shows up in the report below. A price the PIM reads back from a channel works the same way. It goes in as it is, and a rule it breaks becomes a warning on the product's integration badge.

### The pricing report catches what is already saved

The rules watch your typing and never re-read the catalog. Finding saved problems is the [pricing report](/pim/reports/pricing)'s job, under `Reports` in the sidebar. You get a `Guardrail violations` count, a `Negative margin` count, and a `Needs attention` table naming each variant, its issue, and the numbers behind it. Click a product there and it opens so you can fix it.

The report measures margin against `Effective Cost`; the editor's rules measure it against `On-hand Cost` or `Supplier Cost`, as above. A variant can therefore appear under `Negative margin` in the report and still save without complaint, or the other way around, and neither side is wrong.

### Error messages

| Message | What it means |
| --- | --- |
| `Amount can't exceed $21,474,836.47` | The most a money field takes, shown while you type with your own currency's number. Enter a smaller amount |
| `This value is too large. Please enter a smaller amount.` | The same limit, caught at save |
| `Master prices saved. Currency overrides could not be saved: {error}. Will retry on next save.` | The product saved; your per-currency or per-account amounts did not. Reopen the product and click `Update` again |
| `No price is available for Shopify (none of the configured price sources has a value).` | Every price source for that account is empty. Fill one of them, or reorder `Price source priority` in its settings. The name matches the integration |
| `Your Shopify store currency ({shop_currency}) does not match your organization currency ({org_currency}). Prices can't be pushed until they match. Reconnect the correct store, or change your organization's default currency, then retry.` | The currency requirement above. Nothing syncs with that store until the two match |

## Where to go next

<Columns cols={2}>
  <Card title="Inventory" icon="warehouse" href="/pim/catalog/inventory">
    Which stock numbers pick the effective cost, and where each number comes from.
  </Card>

  <Card title="Variants" icon="layers" href="/pim/catalog/variants">
    What an option is, and why money moves to the variants when a product has them.
  </Card>

  <Card title="Integrations" icon="plug" href="/pim/integrations">
    The per-account settings that turn the price you typed into the one that ships.
  </Card>

  <Card title="Getting started with Repricer" icon="trending-up" href="/repricer/index">
    The product that does watch competitors and move prices.
  </Card>
</Columns>
