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

# Filters

> A filter hides the rows you do not want to see right now, so you can pull 12 products out of 40,000 without changing a thing.

A filter narrows a table down to the rows you want to look at. You pick a column, pick a condition, and give it a value, and the table keeps only the rows that answer. It reads every row you have and not only the page you can see. So 12 matches out of 40,000 products come back together on one page, however far in they were.

Nothing is changed and nothing is deleted, so a filter is safe to play with. It decides what you see, and you take it off again whenever you want.

Most people filter to find a gap or to gather a group. Products with no cost on them, brands no one has used yet, imports that failed last week. Once the table shows only those rows you can work through them, change them all in one pass, or send the list to a teammate as a link.

Every list in the PIM is the same table, so what you learn on one works on the rest. That covers the four catalog lists, the three specification lists and your [asset library](/pim/assets). It also covers the imports, exports and data sources lists under `Uploads`, and the tables inside every report. The controls are in a toolbar directly above the rows, and the one that opens the filters is called `Filter`.

## Before you start

A filter changes no data on its own. What matters first is what happens to the rows it leaves you with.

<Warning>
  A bulk action runs on every row your filter matches, not only the rows you can see. Read your conditions before you select everything and confirm, because a bulk action has no undo.
</Warning>

## How to filter a table

<Steps>
  <Step title="Open the table you want to narrow">
    From `Catalog`, select `Products`, or open any other list. Directly above the rows is a toolbar with `Search`, `Columns`, `Filter` and `Density` on it.
  </Step>

  <Step title="Open the filter panel">
    Click `Filter` in that toolbar. A panel opens under it with one empty filter row waiting in it.
  </Step>

  <Step title="Choose the column to narrow on">
    Set `Filter by`, the first dropdown in the row, to a column such as `Status`.
  </Step>

  <Step title="Choose a condition">
    Set `Operator`, the dropdown beside it, to a condition such as `is`. Which conditions you get depends on the column you just picked.
  </Step>

  <Step title="Give the condition a value">
    Type or pick your answer in `Value`, the last box in the row. The table narrows as soon as you do, and clicking anywhere outside the panel closes it again.
  </Step>
</Steps>

That is the whole flow. Your table now shows only the rows that answered. Your filter is in the address bar too, so what you are looking at is already a link you can bookmark or send.

Everything below explains the toolbar one control at a time, then what goes into the link when you share the result. You do not need any of it to narrow a table.

## Every option in detail

The toolbar is the same above every table, so the sections below follow it from left to right, and then move on to the columns and the pages under it.

### The toolbar above every table

The toolbar is a single row between the page and the first row of data. It has four controls, plus whatever buttons that table adds of its own, such as `New Product` on the products table.

| Control | What it does |
| --- | --- |
| `Search` | Narrows the table by matching text, with no column and no condition to pick |
| `Columns` | Opens the list of columns, so you can hide the ones you are not using |
| `Filter` | Opens the filter panel, where you build a condition on one column |
| `Density` | Sets how tall the rows are. It is not on the toolbar on a narrow screen |

**`Search` and `Filter` both narrow the table, and they are worth telling apart.** Use `Search` when you roughly know the words you are after and want the answer in one keystroke. Use `Filter` when the question is exact, and always when you are looking for an absence. No amount of typing into `Search` can ask for a product with no cost on it.

### The search box

`Search` looks like a plain word in the toolbar until you click it, and then it turns into a box you type into. The table narrows a moment after you stop typing, and not on every letter. A `Clear` button appears beside the box once there is something in it, and pressing `Esc` empties the box and turns it back into the word.

What the box matches is decided by the table you are on. On `Products` it reads the product title and your identifier values, so a `SKU` or a barcode finds its product. On the smaller tables it reads across the columns you can see.

Whatever you type is matched as one phrase and not as separate words. So `open box` finds the rows with those two words together, and not every row with `open` somewhere in it.

There is no minimum length here. A single letter searches, which is a difference from the [search](/pim/search) over the whole product, where nothing runs below two characters.

### Building a condition in the filter panel

Click `Filter` in the toolbar and a panel opens under the button, with one filter row in it. A filter row is three dropdowns side by side and a small × for throwing the row away.

| Part of the row | What you do with it |
| --- | --- |
| `Filter by` | Pick the column to narrow on. Some tables also give you fields here that are not columns anywhere on screen |
| `Operator` | Pick the condition, such as `contains` or `is empty`. The list changes with the column |
| `Value` | Give the condition its answer. A condition like `is empty` needs none, so the box is not there |
| The × on the row | Removes that one row and leaves the others alone |

Two buttons are at the bottom of the panel. `Add filter` gives you another row, and `Remove all` clears every row in one click. There is no button that applies your work, because the table narrows while you build.

There is a second way into the same panel. Hover over a column header, click the menu at its right edge, and pick `Filter`. The panel opens with `Filter by` already set to that column, which saves you finding it in a long list.

You can put more than one condition on the same column. Two `contains` rows on `Title` are allowed, and a `greater than (>)` row plus a `less than (<)` row on `Cost` is how you ask for a range instead of a single limit.

### Combining two conditions

Add a second row to the filter panel and a small dropdown appears at its top left, reading `And`. It is the choice between narrowing and widening, and it applies to every row on the panel and not to one pair of them.

| Setting | A row is kept when |
| --- | --- |
| `And` | It answers every condition on the panel |
| `Or` | It answers at least one of them |

`And` is what you want most of the time, because every condition you add takes the list further down. Switch to `Or` when you are gathering instead of narrowing: draft products together with archived products, in one list, rather than the products that are somehow both at once.

The dropdown is not on the first row, since a single condition has nothing to combine with.

Conditions on different columns combine the same way conditions on one column do, and they can be of different kinds. So four rows on `And` give you every active product, in one category, with no cost on it, changed since a date you picked.

### The conditions you get on each kind of column

`Operator`, the middle dropdown on a filter row, does not give you the same list on every column. A date and a price cannot be asked the same questions, so the list is built from the kind of thing the column has in it.

| The kind of column | What you can ask of it |
| --- | --- |
| Text, like `Title` | Whether it contains, starts with, ends with, matches or is missing a piece of text |
| A number, like `Cost` | Whether it is equal to, above, below, or has no value at all |
| A count, like `Products` on a brand | The same as a number, without the empty conditions |
| A date, like `Updated at` | Whether it falls on, before or after a moment you pick |
| Yes or no, like `Has Variants` | Only which of the two it is |
| A fixed list, like `Status` | Whether it is one value, is not one value, or is any of several |
| A list of records, like `Brands` | Those three, and whether the row has any records at all |
| Who made a change, like `Created by` | A person by name, or the way the change arrived |

**A count is never missing**, because a brand with no products still has a count and that count is 0. So a count column drops the empty conditions, and you ask for `equals (=)` with a value of 0 instead.

**`is empty` and `is not empty` are the two worth learning first**, since they are the only way to ask for something that is not there. Variants with no cost, products in no category, brands no one has used. Each of those is one row on the panel, and without it you would build the same list by reading the whole table to the end.

<AccordionGroup>
  <Accordion title="Every condition a text column gives you, in the order they appear">
    `contains`, `does not contain`, `equals`, `does not equal`, `starts with`, `ends with`, `is empty`, `is not empty`, `is any of`.

    `is any of` is the one to know. It lets you enter several answers on one row and keeps a row matching any of them, which saves building three rows and switching the panel to `Or`.
  </Accordion>

  <Accordion title="Every condition a number column gives you, in the order they appear">
    `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`.

    A count column shows the same list without `is empty` and `is not empty`.
  </Accordion>

  <Accordion title="Every condition a date column gives you, in the order they appear">
    `is`, `is not`, `is after`, `is on or after`, `is before`, `is on or before`, `is empty`, `is not empty`.

    `is` and `is not` work to the minute, not to the day, since the picker takes a time as well as a date. To ask for a whole day, use `is on or after` its start and `is before` the next one.
  </Accordion>
</AccordionGroup>

### What you type into Value

`Value`, the last box on a filter row, is not always a box you type into. It changes with the column, so you are never typing a date yourself or guessing how a brand is spelled.

| On this kind of column | `Value` gives you |
| --- | --- |
| Text or a number | A box you type into |
| A date | A picker for the day and the time |
| Yes or no | A dropdown with `Yes` and `No` in it |
| A fixed list, like `Status` | A dropdown of the values you can pick from |
| A list of records, like `Brands` | A box that searches your records as you type and keeps what you pick as chips |
| A measurement, like `Weight` | A box for the number and a unit beside it |

**A measurement is the one that catches people out.** Your weights and sizes are shown in whichever unit your organization works in, so the filter puts that unit next to the box. Type 11, leave the unit on `lb`, and you get the rows over 11 pounds. Change the unit after that and the number is converted for you, so the filter keeps asking for the same physical size. Come back to a saved filter later and it opens in your organization's unit, whatever unit you first typed in.

**A dropdown never gives you the same value twice on one column.** Pick `Active` on one row, then add a second `is` row on `Status`. `Active` has dropped out of its list, so you cannot build two rows that ask the same thing.

### Sorting your rows

A filter decides which rows you get and a sort decides the order they come in. Click a column header once to sort it going up, and again to turn it around. Clicking never gets you back to no order at all, so for that, open the menu at the right edge of the column header and pick `Unsort`.

Keep `Shift` held while you click a second column header and both sorts apply, with the one you set first breaking the ties.

### Choosing which columns you see

`Columns` in the toolbar opens the list of every column you are allowed to turn off, each with a checkbox beside it. A search box is at the top for the long lists. Two controls are at the bottom: `Show/Hide All` flips every checkbox at once, and `Reset` puts the table back the way it arrived.

A column that is not in this list cannot be turned off. `Title` on `Products` is one of those, and the fields that only ever exist as filters are missing from it too.

Hiding a column does not take it out of `Filter by`. You can narrow on a column you cannot see, and that is what makes those filter-only fields usable at all.

### Moving, resizing and pinning a column

Drag a column header sideways to move it. Drag the line between two headers to make one wider or narrower, up to 400 pixels, and double-click that same line to fit the column to whatever is in it.

Pinning keeps a column still while the rest scroll under it, which is how you keep a name in view while reading columns off the far right. Open the menu at the right edge of the column header and pick `Pin to left` or `Pin to right`. You get 3 per side, and a fourth is rejected with `You can pin up to 3 columns per side`.

### Setting the row height and the page size

`Density` in the toolbar gives you three heights: `Compact`, `Standard` and `Comfortable`. Pick `Compact` when you want as many rows on screen as you can get, and `Comfortable` when you are reading them one at a time instead of scanning.

At the bottom right of the table you choose how many rows a page shows: 25, 50 or 100. The catalog and upload tables open at 50 and a report table opens at 25.

Changing a condition or a sort puts you back on page 1, because the page you were on may have nothing on it under the new filter.

### Filtering on a phone

On a narrow screen the toolbar keeps `Search`, `Columns` and `Filter` and drops `Density`. The panels stop floating beside their button and slide up from the bottom of the screen instead, over the table, and you tap outside them to close them. You get one page size instead of three, and it is 25.

### Limits

| What | Limit |
| --- | --- |
| Rows on a page | 25, 50 or 100 |
| Conditions on one table | No limit |
| Conditions on one column | No limit |
| Pinned columns | 3 per side |
| How wide you can drag a column | 400 pixels |
| Checked rows one link can include | 200 |

### What filters cannot do

| You cannot | Do this instead |
| --- | --- |
| Keep a filter without giving it a name | Save it as a [saved view](/pim/saved-views) |
| Send the filter on your table into an export | Build the same conditions inside the [export dialog](/pim/uploads/exports), which keeps filters of its own |
| Add up, group or chart the rows you matched | Open [reports](/pim/reports) |
| Narrow on every column, since a few are there only to be read | Narrow on a column beside it, or use `Search` |
| Undo one change at a time from the panel | Use your browser's back button, since every change is a step in the address |

## What goes into the link when you share a table

Everything you set on a table goes into the address, which makes the table you are looking at a link. Copy it out of the address bar, send it, and whoever opens it gets your conditions, your sort, your search and your page.

Not all of it goes in, though, and the split is worth reading before you send one.

### What goes into the link

| Goes into the link | Stays on your own computer |
| --- | --- |
| Every condition on the panel | Which columns you have showing |
| Whether they combine with `And` or with `Or` | How tall your rows are |
| Whatever is in the search box | How wide each column is |
| The sort, including a second one | The order you dragged the columns into |
| The page you are on, and how many rows it shows | Which columns you pinned |
| The rows you have checked | |

The left column is about which rows you are looking at and the right column is about how they are laid out. So a teammate opening your link reads exactly your rows, laid out in their own columns and not in yours.

Everything on the right is kept per browser and per table. That is why the same table can look one way on your laptop and another way on your phone, with nothing wrong in either.

### Sending someone a selection

The rows you check with the checkbox at the left of each row go into the link too, up to 200 of them. Past 200 the checked rows stay on your screen and never get into the address, and nothing says so. You keep your selection, and the person you sent the link to opens the same table with nothing checked.

The checkbox in the header row above them is different. That one selects every row your filter matches, however many there are. It does go in, because what the link stores is the filter and not the list of rows.

### Keeping a filter you build often

A link is right for sending something once. For the filter you rebuild every Monday, [saved views](/pim/saved-views) is the control that keeps it. It stores the whole address under a name you choose, and it is in the header bar above the table.

A filter is also what a bulk change runs on, so [bulk actions](/pim/bulk-actions) and the filter panel are usually used one after the other.

## When something goes wrong

### Your table came back empty

| What you see | What it means |
| --- | --- |
| `No results found`, with `Try adjusting your search or filter criteria` under it | Your conditions are sound and no row answers them. Loosen one, or switch the panel to `Or` |
| `No data to display` | Nothing was filtered out. The table itself is empty, so this is the message you get on a brand new catalog |

### A condition you forgot you set

The `Filter` button in the toolbar shows a small number beside it for how many conditions are on. A table that looks wrong to you is usually a table with a condition you left behind. Click `Filter` and read the rows, then use `Remove all` at the bottom of the panel to clear them all at once.

That number only counts a row that is finished. A row where you picked a column and stopped is not in the count, even though it is still on the panel.

### A row you only half filled in

A filter row whose condition needs a value and does not have one narrows nothing, and the table does not tell you. It also does not disappear. Click `Filter` in the toolbar, look for a filter row whose `Value` is empty, and either finish it or remove it with the × on that row.

### A column you cannot filter or sort

Some columns are there only to be read: a picture, or a summary built out of other columns. They have no menu on their header and they are missing from the `Filter by` dropdown inside the filter panel. Narrow on a column beside them instead, such as the name that goes with the picture.

## Where to go next

<Columns cols={2}>
  <Card title="Saved views" icon="bookmark" href="/pim/saved-views">
    Keeping a filter under a name instead of rebuilding it every week.
  </Card>

  <Card title="Bulk actions" icon="list-checks" href="/pim/bulk-actions">
    What you can do to the rows a filter left you with.
  </Card>

  <Card title="Products" icon="package" href="/pim/catalog/products">
    The biggest table, and the fields it lets you filter on that are not columns.
  </Card>

  <Card title="Search" icon="search" href="/pim/search">
    The other search, the one that covers every kind of record at once.
  </Card>
</Columns>
