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

# Imports

> An import writes the costs and the price limits from your own spreadsheet onto listings you already have, a thousand of them in one pass.

An import takes a spreadsheet of your own and writes the numbers in it onto listings you already have. It can set your cost, the lowest and the highest price you will sell at, and the manufacturer's MAP and MSRP. It can also set a fixed price, which strategy a listing is on, and whether repricing is paused. All of that comes out of one file, one row per listing.

It only ever changes listings that are already here. A row for a SKU you do not have is an error on that row and never a new listing, because your listings come from the accounts you connected.

Most people import after a supplier sends a new cost list, or when a few thousand listings need a minimum price before they will reprice at all. The other way to change many listings at once is [bulk actions](/repricer/bulk-actions), which needs no file and covers only the strategy and the pause switch.

You get to all of it from `Uploads` in the sidebar down the left. `Imports` is the first of three entries in the second list, and `Create import` above the table opens your file picker. The table under it is every import your team has run.

## Before you start

### What your role lets you do

| What you want to do | The lowest role that can |
| --- | --- |
| Read the imports table and download an error report | `Analyst` |
| Run an import, or cancel one | `Manager` |

Below `Manager` there is no `Create import` button on the toolbar at all, so there is nothing grayed out to find. Roles are set in [team, roles and permissions](/team#what-each-repricer-role-can-do).

### An import cannot be undone

<Warning>
  An import writes over the numbers on your listings and nothing puts the old ones back. Run an [export](/repricer/uploads/exports) first when you want a copy of what you are about to replace.
</Warning>

## How to import a file

<Steps>
  <Step title="Pick your file">
    From `Uploads` in the sidebar down the left, stay on `Imports` and click `Create import` above the table. Your file picker opens on its own. Pick a CSV or an XLSX.
  </Step>

  <Step title="Check what it matched for you">
    A dialog opens over the page with your file already read. `Map Columns` is the panel on the left, one row per field you can write, each with a dropdown beside it. Every field whose name matched one of your headers is filled in already.
  </Step>

  <Step title="Say which column names your listings">
    The first row of `Map Columns` is `SKU / Product ID`, marked `Required`. Open the dropdown beside it and pick the column with your SKU in it.
  </Step>

  <Step title="Map the numbers you are changing">
    Work down the rest of the list and pick your column beside each field you want to write, such as `Cost` or `Min Price`. Leave every other field on `(Skip)`. You need at least one field besides the identifier.
  </Step>

  <Step title="Read the preview and import">
    `Live Preview`, the panel on the right, shows the first 3 rows of every field you mapped. When it is clean, click the import button at the bottom right, with your row count on it, and answer anything it asks you.
  </Step>
</Steps>

That is the whole flow. Your import appears at the top of the table right away and moves through a few statuses while it runs. It ends with a count of the rows that worked and the rows that did not, and you get an email when it finishes.

Everything below goes through that dialog and that table one piece at a time. You do not need any of it for a simple import.

## Every option in detail

The dialog is two panels and never more than one screen. `Map Columns` is on the left and `Live Preview` is on the right, and every decision you make is on one of them. The sections below follow you from the file you pick to the button you click.

### What an import can write

| Field | What it sets on the listing |
| --- | --- |
| `SKU / Product ID` | Which listing the row is about. Required |
| `Cost` | What the item costs you |
| `Min Price` | The lowest price the repricer may publish |
| `Max Price` | The highest price it may publish |
| `MAP` | The lowest price you are allowed to advertise |
| `MSRP` | The price the manufacturer suggests |
| `Manual Price` | A fixed price that stops the strategy on that listing |
| `Strategy` | The strategy the listing is priced by, named in words |
| `Paused` | Whether repricing is stopped on that listing |
| `B2B Price` | One fixed price for business buyers |
| `B2B Minimum Price` | The lowest price for business buyers |
| `B2B Maximum Price` | The highest price for business buyers |
| `Compare Price` | The crossed-out price your own store shows |

What each of those numbers then does to a price is on [pricing on a listing](/repricer/listings/pricing), one field at a time.

**Four of them depend on the strategy.** `B2B Price`, `B2B Minimum Price`, `B2B Maximum Price` and `Compare Price` only work on a listing whose strategy has that feature switched on. Map one of the four when no strategy of yours has it, and the dialog stops the import and names the setting you are missing. Map one when some of your strategies have it and some do not, and the rows on a strategy without it come back as errors.

### Choosing your file

`Create import` is above the imports table, and it opens your file picker. There is no template to download and no order your columns have to be in, because you say which column is which in the dialog that follows.

What your file needs is one row per listing and one column that names it. Every other column is yours to map or ignore, so a supplier file with 40 columns in it works as well as one with 2.

A workbook with several sheets opens on the first one, and a dropdown appears next to the file name at the top of the dialog. Pick another sheet and the dialog reads that one instead. One import covers one sheet.

**Save an older `.xls` as `.xlsx` before you import it.** The file picker takes `.xls` and the import then ends on `Failed`.

If the dialog cannot read what you picked, it shows you a drop area in place of the two panels, and you drag another file onto it.

### Mapping your columns

`Map Columns` is the left panel of the dialog. Every field you can write is a row in it, with a dropdown listing your own column headers. Pick your header beside the field you want it to fill, and leave `(Skip)` on the rest.

The dialog fills in what it recognizes the moment it opens, by reading your header names. It knows more names than the ones it prints, so a column headed `cogs` comes out as `Cost` and a column headed `floor` comes out as `Min Price`. Those names are English whatever language you use the app in, so read what it did before you trust it.

`Clear All`, at the top right of the same panel, empties every dropdown at once. That is quicker than undoing a bad guess one field at a time.

Two things turn the import button on: `SKU / Product ID` has to be mapped, and one more field besides it. Hover the button while it is off and it tells you which of the two you are missing.

<AccordionGroup>
  <Accordion title="What to do when your file has no header row">
    `File has headers?` is a switch at the top right of `Map Columns`, and the dialog sets it for you by reading your first row. Turn it off and your first row counts as data instead of names.

    Your columns are then called `Column A`, `Column B` and so on, and each dropdown shows you a couple of real values from that column so you can tell them apart.
  </Accordion>

  <Accordion title="What happens when two of your columns have the same name">
    The second one gets a number after it, so two columns headed `Price` come out as `Price` and `Price (2)`. Both are in the dropdown and you pick whichever you meant.
  </Accordion>
</AccordionGroup>

### Reading the live preview

`Live Preview` is the right panel of the dialog, and you get one card in it per field you map. Each card is the field name and the first 3 values from your column, with `+1,247 more` beside them so you know how much you are not looking at.

**The preview shows the number that will be stored, not the number you typed**, and that is what makes it worth reading. Type `19,99` and the card shows `1999.00`, because a comma is read as a thousands separator and removed. Write your prices with a period.

A card turns red when a value in that column cannot be used, with a count of how many rows are like it, and the import button goes off. A card turns amber for something that is worth knowing and stops nothing.

### Clearing a price instead of setting one

A cell in a price column has three meanings, and the empty one is the one people get wrong.

| What is in the cell | What happens to the listing |
| --- | --- |
| Nothing at all | It keeps the number it already has |
| `0`, in any form | Its stored number is erased |
| Any other number | It gets that number |

**An empty cell changes nothing**, so a file only needs the columns you are actually changing, and a gap in one of them is safe. That is also why clearing a number takes a deliberate `0` and cannot happen by leaving a cell out.

A file with a zero anywhere in a price column asks you first. `Clear price values?` tells you how many cells will be erased, `Yes, continue` runs the import, and `Go back` returns you to the dialog.

### Choosing which listings the import can touch

A row finds its listing by name, and one name can be on two listings when you sell the same SKU on two accounts. Deciding which of them an import may touch is what the scope is for.

With more than one connected account, or one account with more than one region, a small dialog called `Confirm import scope` appears when you click import. It asks `Which listings should this import update?` and gives you an `Account` dropdown, plus a region dropdown under it when that account has several.

**Pick the account when the same SKU sells on two of them.** Left on `All Accounts`, a row matching two listings is an error and neither one is written. Narrowing the scope is the fix, and the message on that row says so.

With one account and one region you never see this dialog, and your import is scoped to them anyway. Whatever it ended up as, you get it back in the `Account` and `Region` columns of the imports table.

### Limits

| What | Limit |
| --- | --- |
| File types | CSV and XLSX |
| File size | 250 MB |
| Rows in a file | No limit |
| The highest number a price cell takes | 9,999,999.99 |
| Sheets read per import | 1 |
| Imports in the table | The 50 most recent |
| How long error detail lasts | 7 days |

### What an import cannot do

| You cannot | Do this instead |
| --- | --- |
| Create a listing | Connect the account it sells on, which is where listings come from |
| Change a SKU, a title, a brand or an ASIN | Change it on the channel. Those come to you, not from you |
| Create or edit a strategy | Build it on the [strategies](/repricer/strategies) page, then name it in your file |
| Undo an import | Import the old numbers again |
| Have a failed import retried for you | Fix the file and import it again |
| Import a PDF, a JSON file or a Google Sheet | Save it as a CSV or an XLSX |
| Repeat this import every morning | Set up a [schedule](/repricer/uploads/schedules), which fetches the file for you |
| Write cost, MAP or MSRP onto a listing the PIM owns | Change them on the matched product in the PIM |

## What an import does to your listings

### Matching a row to a listing

`SKU / Product ID` takes either one. The Repricer looks for a listing with that SKU, and for a listing with that channel product ID, which on Amazon is the ASIN. One column covers both, so a file of ASINs and a file of SKUs both work and you do not tell it which you sent.

The match is exact, capital letters included. Nothing is matched on part of a name, so `ABC-1` never finds `abc-1` and never finds `ABC-10`.

Two kinds of row are worth knowing about. A row whose name matches nothing gets `No listing found with SKU 'ABC-1'` and counts as an error. A row with an empty name cell is skipped with a warning and no error.

### What changes the moment a row is written

An import is not a note for later. Every row that goes in does the same thing an edit on the listing would.

| What you wrote | What happens next |
| --- | --- |
| A cost or a price limit | The listing goes back in line to be repriced, without waiting for a scheduled run |
| A `Manual Price` | The listing reads `Manual` and stays at your number until the field is cleared |
| A `0` in `Manual Price` | The number is erased and the listing goes back to `Working` |
| `Paused` as true | Repricing stops on that listing, exactly as the switch on it does |
| `Paused` as false | A listing that was paused starts again. One that is `Not working` for another reason is left alone |
| A `Strategy` name | The listing moves onto that strategy and is repriced by it |

A strategy name has to match one built for that listing's region, and it is matched on the name you gave it. A name that exists somewhere else in your organization gets its own message, so you can tell a typo from a strategy in the wrong region.

### Cost, MAP and MSRP on a listing the PIM owns

A listing matched to a product in your PIM gets those three numbers from the PIM, and an import cannot write them there. It skips those three cells, writes the rest of the row as normal, and leaves you a warning: `Cost, MAP and MSRP on this listing are managed by your PIM connection and were skipped. Edit them in the PIM instead.`

Nothing else about the row is affected, so a minimum price in the same row still goes in. See [the PIM connection](/repricer/integrations/pim) for which listings are matched and how to unmatch one.

## When something goes wrong

### Watching your import run

Your import appears in the table right away and moves through these statuses on its own, with no page to refresh.

| Status | What it means |
| --- | --- |
| `Pending` | Uploaded, and waiting to start |
| `Validating` | Your file is being read |
| `Processing` | Rows are being written. You get a percentage |
| `Completed` | It finished, whether or not rows failed |
| `Failed` | The file could not be read, so nothing was written |
| `Cancelled` | You stopped it partway |

**`Completed` does not mean every row worked.** A file where 900 rows of 1,000 failed still ends `Completed`. A bad row is counted and does not fail the import around it, and `Failed` is for a file that could not be read at all. So read the `Success` and `Errors` columns, never the status on its own.

Whoever started the import gets an email when it finishes, with the same counts in it. Nobody else on your team is told. You can turn that email off under `Import complete` in your notification settings.

### Reading the imports table

| Column | What it shows |
| --- | --- |
| `File` | The name of the file you uploaded |
| `Account` and `Region` | The scope you picked, or `All Accounts` and `All Regions` |
| `Size` | How big the file was |
| `Fields` | How many fields you mapped besides the identifier. Hover for the list |
| `Status` | Where it is, with a percentage while it runs |
| `Success` | How many rows were written |
| `Errors` | How many were not, in red. An amber number means warnings and no errors |
| `Created` | When you started it |

Newest is at the top, and the toolbar above the table has the same search and [filters](/repricer/filters#the-toolbar-above-every-table) as every other table here.

### Errors the dialog stops you on

The dialog reads every row of your file before anything is uploaded, and the import button stays off until all of them are clean. Hover it and the count is in the tooltip, as `Fix 12 validation errors to import`.

That is stricter than it sounds, because one unusable cell anywhere in the file stops all of it. You have two ways out, and both are quick. Fix the cell in your file and pick it again, or set that field back to `(Skip)` and import everything else.

| What it caught | What to do |
| --- | --- |
| `is not a valid number` | A price column has a word, a symbol or a stray character in it |
| `Price cannot be negative` | Take the minus sign off |
| `Price exceeds maximum` | The cell is over 9,999,999.99 |
| `Invalid value` | `Paused` takes `true`, `false`, `yes`, `no`, `1` and `0`, and nothing else |
| `not found. Check the name matches an existing strategy for this region.` | A `Strategy` cell names a strategy that does not exist in that region |
| `rows have Max Price < Min Price` | Your two limits are the wrong way around on that many rows |
| `rows have MAP higher than MSRP` | Same, on the two manufacturer numbers |
| `rows have Cost higher than` | Your cost is above one of the prices in the same row |
| `rows have Manual Price below Cost` | Amber, and it stops nothing. You are selling at a loss on those rows |

<Accordion title="The messages you get when the dialog cannot read your file at all">
  `No data found in file` and `First row is empty` mean the sheet you picked has nothing in it to import. On a workbook, both messages name the sheet, so check the dropdown at the top of the dialog before you go looking in the file.

  `Sheet "Prices" not found in file` means the sheet was renamed or removed since you last saved. `Failed to read file` and `Failed to parse file` mean the file itself is unusable, and a file saved again from your spreadsheet app is usually enough.
</Accordion>

### Errors that only show up after it runs

The dialog checks your file. It cannot check your file against your listings, so a second set of problems only appears once the import is running. Every one of these is one row, and the rest of the file still imports.

| What comes back | What happened |
| --- | --- |
| `No listing found with SKU` | Nothing here has that SKU or product ID |
| `matches listings in multiple accounts or regions` | The same name is on two listings. Import again with the scope narrowed |
| `does not belong to this listing's region` | That strategy exists, on another region |
| `Floor Price skipped` | A warning. That listing's strategy calculates the minimum from your cost, so your number would be ignored |
| `requires a strategy with B2B enabled` | A B2B column on a listing whose strategy does not price business buyers separately |
| `requires the strategy's Compare Price mode set to "Set Manually"` | A `Compare Price` on a listing whose strategy calculates it |
| `cannot exceed` | Your number is on the wrong side of a number already on that listing |
| `were skipped. Edit them in the PIM instead.` | A warning. Cost, MAP or MSRP on a listing the PIM owns |

`cannot exceed` is the one that surprises people, because the dialog had said your file was fine. It was fine. That message compares what you sent against what the listing already had, and only the listing knows that.

### Getting the error report

An import that ends with any errors or warnings gets an `Error file` action in its row, at the right edge of the imports table. Click it, pick `CSV` or `Excel` in `Select file format`, and the file downloads.

**The report is your own file back with one column added.** Every row that had a problem is in it, with your own columns untouched. A column called `Error message` at the end says what went wrong on that row. So you fix the rows where they are and import the same file again, which touches only the rows in it. The added column is one you never map, so it does nothing on the way back in.

That report is kept for 7 days after the import finishes. After that the counts stay in the table, the action is grayed out, and hovering it tells you the detail is gone.

### Canceling an import

`Cancel` is in every row of the imports table, and you can use it while an import is `Pending`, `Validating` or `Processing`. Click it and you get `Import cancellation requested`. The row turns `Cancelled` when the import actually stops.

Canceling stops the rest of your file. It does not take back the rows already written, and a few more can still go in between your click and the stop. On a finished import the action is grayed out and tells you which way it finished.

### The messages in the corner of the screen

| Message | What to do |
| --- | --- |
| `File is too large. Maximum size is 250 MB.` | Split the file in two and import each half |
| `Invalid file type. Allowed: .csv, .xlsx, .xls.` | Save your file as one of those |
| `Failed to upload file. Please try again.` | Pick the file again. Nothing was started |
| `Failed to create import job` | Try again. Nothing was queued, so you are not creating a duplicate |
| `The import already finished and can no longer be cancelled.` | It finished between the page loading and your click. Read its counts |
| `Error details are no longer available.` | The import is more than 7 days old |
| `You don't have permission to do that.` | Your role is below `Manager`. Ask an `Admin` on your team |

## Where to go next

<Columns cols={2}>
  <Card title="Pricing on a listing" icon="tag" href="/repricer/listings/pricing">
    What each number you just imported does to the price that goes out.
  </Card>

  <Card title="Bulk actions" icon="list-checks" href="/repricer/bulk-actions">
    Changing the strategy or pausing many listings without a file at all.
  </Card>

  <Card title="Schedules" icon="clock" href="/repricer/uploads/schedules">
    The same import on a timer, fetched from a web address or an FTP server.
  </Card>

  <Card title="Exports" icon="download" href="/repricer/uploads/exports">
    Your listings as a spreadsheet, which is where an import file usually starts.
  </Card>
</Columns>
