> ## 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.

# Field priorities

> A field priority is the rule you write when two of your data sources send the same field, and it tells the PIM which of the two numbers to believe.

Two of your data sources send a cost for the same product, and the two numbers disagree. One says 12.40 and the other says 11.90. A field priority is where you tell the PIM which one to believe.

Without a rule, you get whichever source changed the number most recently. That is a sensible default, and it is often not what you meant. A rule lets you say something better: take the lowest cost, trust one supplier ahead of the rest, or take your cost and your stock together from whichever supplier is cheapest. That last one keeps your two numbers describing the same warehouse.

Your rule covers your whole organization and one kind of record. It is not a setting on a single data source, which is why you never see it in the data source dialog. One rule applies to every source you have feeding that field.

You will find all of this under `Uploads`, in the `Data Sources` tab. Look on the toolbar above the table, to the right of `Create data source`, and click `Field priorities`. You get a dialog listing every field your sources feed, with a `Manage` button on each row.

## Before you start

### What your role lets you do

| Role | Field priorities |
| --- | --- |
| Admin | Opens it, and can change anything on it |
| Manager | Opens it, and can change anything on it |
| Editor | Does not see it |

An Editor does not see the `Data Sources` tab at all, so you will not find the `Field priorities` button there either. You set roles in [team, roles and permissions](/team#what-each-pim-role-can-do).

### A field appears here only once a source feeds it

You see a field here when at least one of your data sources maps a column to it. A field nothing feeds is not a row, and a kind of record nothing feeds is not in your picker.

So build your [data sources](/pim/uploads/data-sources) first, map your columns, and come back. You get the button either way. Until something is mapped, your dialog opens on a short explanation instead of a list.

## How to set a field priority

<Steps>
  <Step title="Open the field priorities dialog">
    From `Uploads`, select the `Data Sources` tab and click `Field priorities` on the toolbar above the table. You get a list of every field your sources feed.
  </Step>

  <Step title="Open the field you want to settle">
    Find your field in that list and click `Manage` on the right of its row. You get a second dialog on top, named for the field you picked.
  </Step>

  <Step title="Pick a strategy">
    Under the `Strategy` heading, click one of the radio buttons. Start with `Manual order`, because you get it on every field.
  </Step>

  <Step title="Put your sources in order">
    Under `Source order`, drag each source by the handle on its left edge. The source you put at the top is the one used.
  </Step>

  <Step title="Save it">
    Click `Save` at the bottom right of the dialog. Then click `Back` at the bottom left to return to your list.
  </Step>
</Steps>

That is the whole flow. The line under your field name now reads `Manual order`, and your catalog is re-decided on that field right away, without waiting for your next sync.

Everything below explains the other three strategies, the filters, the field groups, and how to check the result on one of your products. You do not need any of it to settle one field.

## Every option in detail

The dialog works as a stack. Your list of fields stays open under it, and everything you open goes on top of it. `Back`, at the bottom left of any dialog, returns you to your list. The × at the top right closes the whole stack. Your browser's back button steps you back one dialog at a time.

`Save` stays gray until you change something, and it saves only the dialog you are in. It also leaves that dialog open, so `Back` is how you leave. Try to leave with an unsaved change and you are asked to confirm first, where `Discard` is the button that throws your change away.

### Switching between kinds of record

Your rule covers one kind of record, and the dialog works on one at a time. A dropdown beside the dialog title switches you between them. You only get that dropdown when more than one kind of record has something to show, so a plain title is normal.

| In the dropdown | One record is |
| --- | --- |
| `Products` | one product, or one of its variants |
| `Brands` | one brand |
| `Categories` | one category |
| `Tags` | one tag |
| `Spec Groups` | one specification group |
| `Spec Definitions` | one specification |
| `Spec Values` | one allowed value of a specification |
| `Assets` | one image or document |

### Reading a row before you open it

The field priorities dialog sorts your fields under two headings. `Field groups` comes first, then `Individual fields`. A field you have put in a group appears under the group, never on its own.

Under each name you get one line saying what that row does today. It lets you read the whole list without opening anything.

| The line reads | Your field goes to |
| --- | --- |
| `Most recent value` | the source that changed the value most recently |
| `Manual order` | the first source in the order you dragged |
| `Lowest of supplier_cost` | the source with the smallest number in that column |
| `Highest of supplier_cost` | the source with the largest number in that column |

Those last two name the column the way your file spells it, not the label you picked it by. So the field you know as `Supplier Cost` reads as `supplier_cost` there.

Click a group card anywhere except its `Manage` button and it opens to show you its fields as small tags. A field in the group that no source feeds right now is grayed out with a dashed edge, and hovering it tells you so. Your group keeps working for the fields that do arrive.

### Choosing a strategy

`Manage` opens a dialog with a `Strategy` heading and one radio button per choice.

| Strategy | What decides your field |
| --- | --- |
| `Most recent value` | the source that changed the value most recently |
| `Manual order` | the first source in your order that has a row for this record |
| `Lowest value` | the source with the smallest number |
| `Highest value` | the source with the largest number |

`Most recent value` is what all your fields start on. Pick it again and you throw your rule away, so a field you set back to it is a field with no rule. Two sources that changed at the very same moment are settled the same way on every run, so your winner never flips back and forth.

**You only get the strategies your field can support.** `Lowest value` and `Highest value` compare numbers, so you get them on a number field and nowhere else. Every number field in the PIM is on a product. So you never see those two on brands, categories, tags, specifications or assets. There you get `Most recent value` and `Manual order`, and that is the whole choice.

**Pick `Manual order` when you trust one supplier more than the others.** It is your only rule for text. Use it on a title, a description, a brand name or a set of tags, where there is no smaller or larger value to take.

**Pick `Lowest value` on a cost and `Highest value` on stock** when you want the best number rather than a particular supplier. Both usually want a filter with them, because a supplier reporting `0` otherwise beats every real number in a `Lowest value` contest.

Leave `Most recent value` alone on a field only one of your sources feeds. There is nothing to settle, and your rule would never fire.

### Putting your sources in the order you want

`Manual order` gives you a `Source order` list under the strategy. Each row is one of your data sources, with a drag handle on its left edge. Drag the rows up and down to set your order. You can also move a row with your arrow keys once its handle has focus.

The first time you open it, your list is in the order you created the sources, oldest first. A source you add later goes to the bottom and stays there until you move it. A source that is paused or in trouble shows `Paused` or `Error` beside its name, so you can spot a source that has stopped delivering.

**The first source in your order that has a row for the record is the one used, even when its cell is blank.** Manual order picks a source for you, not a value. Say your top source sends the product and leaves the cost column empty. You get an empty cost, and the source underneath it is never consulted. [Data sources](/pim/uploads/data-sources) covers what an empty cell does to each of your fields.

If none of your sources maps the field, the list tells you so instead of showing you an empty box.

### Taking the lowest or the highest number

On an individual field, `Lowest value` and `Highest value` compare the field with itself. You have nothing to choose and you get no extra dropdown. Pick the strategy, and the source with the smallest or largest number in that column is the one used.

A group works differently, because it has several fields and the PIM has to know which one to compare. You get a `Decider field` dropdown above `Filters`, listing the number fields of that group and nothing else. The first one is filled in for you, and you see `Decider field is required` if you clear it. A group with no number in it never gets these two strategies at all.

A source whose value in the deciding column is not a number drops out of the contest instead of counting as zero.

### Narrowing which sources count

You get filters under `Lowest value` and `Highest value` only. `Manual order` has no filter panel, and `Most recent value` gives you nothing to fill in at all.

A filter says which of your sources are allowed to be used. The usual reason to add one is a supplier reporting `0`. On `Lowest value`, zero beats every real price you have. So you add a condition saying the cost has to be greater than zero, and your contest goes on without that supplier.

Each condition is a row of three controls under the `Filters` heading. `Filter by` is a dropdown of fields, `Operator` is a dropdown of comparisons, and `Value` is a box you type into. `Add condition`, under your last row, adds another. The × at the end of a row removes it.

**A condition can only test what your rule already covers.** On an individual field, `Filter by` gives you that one field and nothing else. On a group it gives you the group's own fields. You cannot decide one field by looking at another.

Four things about these rows catch people out the first time:

| What you see | Why |
| --- | --- |
| `Match`, a pair of chips reading `All conditions (AND)` and `Any condition (OR)`, only after you add a second condition | One condition has nothing to join |
| `Add condition` gray | Your row above it is not finished. Fill in its `Value` and the button comes back |
| No `Value` box | `is empty`, `is not empty`, `is true` and `is false` need no value |
| A tag box instead of a `Value` box | You picked `is any of`. Type each value and press Enter, and each one becomes a tag |

Change `Filter by` and your `Operator` resets and your `Value` clears, because a comparison that suits a number rarely suits text. Text comparisons match capital letters exactly, so `ACME` and `Acme` are two different values to your filter.

<Accordion title="Every comparison you can pick, by kind of field">
  | Kind of field | What `Operator` gives you |
  | --- | --- |
  | A number | `equals (=)`, `not equal to (≠)`, `greater than (>)`, `greater than or equal to (≥)`, `less than (<)`, `less than or equal to (≤)`, `is empty`, `is not empty`, `is any of` |
  | Text | `contains`, `does not contain`, `equals`, `does not equal`, `starts with`, `ends with`, `is empty`, `is not empty`, `is any of` |
  | Yes or no | `is true`, `is false` |

  A number field and a text field name the same test differently, so `equals (=)` and `equals` do the same thing on your two kinds of field. These are the same comparisons you get above the columns of your product table.
</Accordion>

### Making several fields arrive from one source

A group is a set of fields that have to come from the same source. The winner is chosen once, and every field in your group is taken from that one source.

You build one because some numbers only make sense together. Take the cheapest supplier's cost and the largest supplier's stock and you have a cost from one warehouse and a quantity from another. Neither supplier is selling on those terms. Put `Supplier Cost` and `Supplier Stock` in a group and one source answers both for you.

Your group's candidate sources are the ones mapping every field in it. A source that maps half your group cannot hand you the whole thing at once, so you never see it in the drag list or in the comparison.

Your group stays in the list as long as one of its fields is still fed. Fields nothing feeds stay inside it, grayed out, and your group keeps working for the rest.

### Building and deleting a group

`Manage Groups`, at the top right of the field priorities dialog, opens the group editor for you. You do not get it while nothing is mapped, because there would be nothing to put in a group.

Each group is a card with a `Group name` box, a `Fields in this group` picker and a trash icon that removes the card. `New group`, under your last card, adds another. `Save` at the bottom right saves your whole screen at once.

| Rule | What it means |
| --- | --- |
| A group needs a name | 1 to 100 characters, and no two groups on the same kind of record share one |
| A group needs at least 2 fields | one field on its own is an individual priority already |
| A field goes in one group | fields another group has taken are not listed in this one |
| Only fed fields are listed | the picker lists the fields at least one source maps |

<Warning>
  `Save` here rebuilds every group on that kind of record. Any strategy you set on a group goes back to `Most recent value`, including on the groups you did not touch.
</Warning>

So name your groups and choose their fields first, then set their strategies. Rename one group and you lose the strategies on all of them.

**Put a field into a group and you throw away the priority it had on its own.** Your field is settled by its group or by itself, never by both. The group is the one that counts.

Delete a group and its fields go back to your `Individual fields` list, each with no rule of its own. Their values keep whatever your last run wrote.

`New group` goes gray when you have fewer than 2 free fields left to fill a new one. Hover it and you are told which of the two reasons it is: nothing is mapped yet, or every mapped field is already in one of your groups.

### Limits

| What | Limit |
| --- | --- |
| Group name | 100 characters |
| Fields in a group | at least 2 |
| Groups one field can go in | 1 |
| Rules on one field | 1 |
| Conditions in one filter | No limit |
| Kinds of record | 8 |

### What field priorities cannot do

| You cannot | Do this instead |
| --- | --- |
| Give one product a rule of its own | Set the rule once, for every record of that kind |
| Set a different rule per data source | Set one rule and put your sources in the order you want |
| Decide one field by looking at another | Put both fields in a group and set a `Decider field` |
| Compare text with `Lowest value` or `Highest value` | Use `Manual order` |
| See what would change before you save | Save it, then read the result on one record |
| Stop a source feeding one field and leave its others alone | Clear that column on the source's `Fields` screen |

## What the winner writes to your catalog

### When your change gets to your catalog

Saving a rule does not wait for your next sync. The PIM re-decides that field on every record of that kind and writes the new answer into your catalog right away. Setting a rule back to `Most recent value` does the same for you, and so does saving your group editor.

So a rule you get wrong gets to your catalog without you doing anything else. A rule you fix repairs itself the same way.

### What the chosen source writes, and what it leaves alone

Once one of your sources has been picked, you get its whole answer.

| The chosen source sends | Your catalog gets |
| --- | --- |
| A value | that value |
| The column, but blank | the blank |
| Nothing at that column | whatever it already had |

Your rule decides which source answers, and never whether the answer is any good. A source that is picked with an empty cell empties your field.

**A field with no rule treats you more gently.** There, the most recently changed value that is not empty is the one used. So a source sending the column blank cannot wipe out what another of your sources wrote. The only way a blank clears an unruled field is when none of your sources sends a value for it. Know that before you set your first rule, because a rule is the stricter of the two.

### When a rule cannot pick anyone

A rule that comes up empty does not leave your field stuck. The PIM works down a fixed order until something answers, and your record tells you which step answered.

1. Your strategy as you set it, filters and all.
2. The same strategy with your filters ignored, when they excluded every source.
3. The source that changed most recently and has something to say about your field.

Step 2 is the one that surprises people. A filter matching no one is dropped instead of blocking your field, which is the opposite of what your filters do elsewhere. A group falls down all three steps as a whole, so its fields never split across your sources on the way.

Only when none of your sources sends a value does your field escape all three. Then the ordinary rules take over. A column at least one source sends blank is applied blank, and a column no one sends keeps what your catalog already had.

### Reading the result on one record

Open the record and click `Data Sources` in its top row, beside your integration logos. You get that button only once a source has fed the record, so a missing button is your answer and not a fault. You will find it on a product and on a variant, on brands, categories and tags, on the three kinds of specification record, and on an asset.

The dialog is called `View Data Source`. A dropdown at the top switches you between the fields and groups that record is covered by. The table under it gives you one row per source, with its name, what it is sending for each field, and `Last Updated`. A source that has never sent you a value there reads `Never`.

Your winner gets a badge, and the badge is the part to read.

| Badge | What it tells you |
| --- | --- |
| `Selected` | your rule picked this source, or there is no rule and this source changed most recently |
| `Fallback` | your rule could not pick, and this source answered a step further down |

Hover `Fallback` and you are told which of the two lower steps it was. Both are worth acting on, because a rule that keeps falling back is a rule describing something your files do not contain.

The two timestamps there are different things. `Last run` is when that source last went to look at your file. `Last Updated` is when the value last changed, and it is the one `Most recent value` compares for you. A file that arrives identical to yesterday's does not move `Last Updated`, so a supplier who has stopped updating keeps your field until someone else updates it.

## When something goes wrong

### Messages you can get

| Message | What to do |
| --- | --- |
| `Name is required` | Type a name in that card's `Group name` box |
| `Name must be 100 chars or less` | Shorten your group name |
| `Duplicate name "{name}"` | Two of your cards share a name. Rename one of them |
| `Add at least 2 fields` | Open that card's `Fields in this group` picker and add one |
| `"{field}" is already in group "{groupName}"` | Take it out of your other group first |
| `A group with that name already exists or a field is in more than one group` | The same two problems, caught when you click `Save` |
| `Decider field is required` | Pick a field in the `Decider field` dropdown |
| `Permission denied` | Your role is below Manager |
| `Field group not found. It may have been deleted in another tab.` | Someone deleted the group while you had it open |
| `Failed to load candidate sources` | Close the dialog with `Back` and open it again |
| `Failed to save field priority` | Click `Save` again |
| `Failed to save groups` | Click `Save` again |
| `Failed to load field priorities` | Reload the page |

### When the source list comes up short

Your `Source order` list shows only the sources that map the field you are looking at. A shorter list than you expected means fewer of your sources feed that column than you thought. Open the source on your `Data Sources` tab and check its `Fields` screen.

A group is stricter, because it shows only the sources mapping every field in it. A group whose list comes out empty is a group none of your sources can fill on its own. Split it into smaller groups, or map the missing column on one of your sources.

## Where to go next

<Columns cols={2}>
  <Card title="Data sources" icon="rss" href="/pim/uploads/data-sources">
    Where a field gets mapped in the first place, and what a blank cell does.
  </Card>

  <Card title="Sync history" icon="history" href="/pim/uploads/data-sources/sync-history">
    What each run matched, and the report that explains it row by row.
  </Card>

  <Card title="Inventory" icon="warehouse" href="/pim/catalog/inventory">
    The stock column a feed owns, and the one no priority can touch.
  </Card>

  <Card title="Pricing" icon="tag" href="/pim/catalog/pricing">
    What a cost and a price mean here, and why a zero is read as nothing.
  </Card>
</Columns>
