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

# Schedules

> A schedule is an import that runs itself, so the costs and price limits your supplier publishes go into your listings without you uploading anything.

A schedule is an import that runs itself. You point it at a price file on the web and say which of its columns your costs and your price limits are in. Then you pick how often it runs, and from then on the Repricer downloads that file on its own and imports it for you.

People set one up because the numbers come from somewhere else. A supplier publishes a cost list every night, or your own system writes one out every morning, and those costs are what a strategy builds a price from. A schedule keeps them current, so nobody has to open a spreadsheet and upload it.

You find all of this under `Uploads` in the left sidebar, in the `Schedules` entry of the second list. The `Create schedule` button above the table opens a dialog over the page with four steps in it. The table under it lists every schedule your organization has, with a status on each one.

## Before you start

### What your role lets you do

| What you want to do | The lowest role that can |
| --- | --- |
| Read the schedules table | `Analyst` |
| Create, edit, pause, run or delete a schedule | `Manager` |

Roles are set in [team, roles and permissions](/team#what-each-repricer-role-can-do). Below `Manager` there is no `Create schedule` button and no `Delete` in a row. `Pause` and `Run now` still appear in the row, and clicking either one gives you a message about permission.

### Deleting a schedule is permanent

<Warning>
  `Delete` in a row removes the schedule and everything you set up in it, and there is no undo. You are asked to confirm first. Pause it instead if you only want it to stop for a while.
</Warning>

## How to create a schedule

<Steps>
  <Step title="Open the schedule dialog">
    Click `Uploads` in the left sidebar, click `Schedules` in the second list, and click `Create schedule` above the table.
  </Step>

  <Step title="Name it">
    The first screen inside the dialog is called `Basics`. Type a name in the `Name` box. That name is what you look for in the table later.
  </Step>

  <Step title="Point it at your file">
    On `Source`, leave `Source Type` on `URL (HTTP/HTTPS)` and paste the web address of your file into `Source URL`. Click `Next` and the Repricer downloads the file.
  </Step>

  <Step title="Match your columns">
    On `Map Columns`, check that `SKU / Product ID` on the left has the right column of your file beside it, and do the same for every number you are sending.
  </Step>

  <Step title="Choose how often it runs">
    On `Schedule`, set `Frequency` to `Interval`, `Daily` or `Weekly`, fill in the boxes it opens, and click `Save`.
  </Step>
</Steps>

That is the whole flow. Your schedule appears in the table right away, reading `Active`, with its first run in the `Next Run` column. Every run after that puts a row in the [imports](/repricer/uploads/imports#reading-the-imports-table) table, which is where you read what actually changed.

Everything below explains those four screens one at a time. You do not need any of it for a simple schedule.

## Every option in detail

The dialog has four screens of its own: `Basics`, `Source`, `Map Columns` and `Schedule`. The sections below follow them in order. You can always click `Back` at the bottom left, or click an earlier step marker at the top of the dialog, to change something.

Closing the dialog loses everything you set up. The × at the top right is the only way to close it. Clicking outside the dialog and pressing Escape both do nothing here, and nothing asks you to confirm first.

### Step 1: Name your schedule

`Basics` is the first screen inside the schedule dialog. It is where you say what this schedule is and which of your listings it is allowed to touch.

| Box | What it does |
| --- | --- |
| `Name` | What the schedule is called in the table. `Next` stays gray until you type one |
| `Description (optional)` | A longer note for your team, with a character count under the box |
| `Integration Account` | Limits the schedule to one of your accounts |
| `Integration Region` | Limits it further to one region of that account |

**Set the account and the region whenever you have more than one.** The two dropdowns only appear when there is a choice to make. An organization with a single account and a single region never sees them.

Leaving them on `All Accounts` and `All Regions` matches your file against every listing you have. A SKU you sell in two regions then has no single answer, and those rows come back as errors on the import telling you to narrow the scope.

### Step 2: Point it at your file

`Source` is the second screen of the schedule dialog, and it is where the file comes from. `Source Type` is a dropdown at the top of it with three choices, and the boxes under it change with the one you pick.

<Warning>
  A run can only download from a web address. `FTP` and `SFTP` read your file inside this dialog, so you can map its columns, but a run cannot use either one and the schedule fails and stops itself.
</Warning>

**Pick `URL (HTTP/HTTPS)`.** It takes one box, `Source URL`, and what goes in it is the full web address of a CSV or Excel file, starting with `http://` or `https://`. The address has to open on its own, with no sign-in and no address inside your own network.

`FTP` and `SFTP` take five boxes instead:

| Box | What it does |
| --- | --- |
| `Host` | The server name or its IP address |
| `Port` | Starts at 21 for `FTP` and 22 for `SFTP` |
| `Username` | `FTP` connects as anonymous when you leave it empty, and most SFTP servers need one |
| `Password` | The password for that server. Click the eye at the right of the box to read what you typed |
| `File Path` | The full path to the file on that server, such as `/exports/daily/prices.csv` |

The password is the one your file server gave you, and it never leaves this box. When you reopen a schedule to edit it the box is empty, and leaving it empty keeps the password you saved before.

`Next` downloads the file and reads the first rows of it, which is why it takes a moment. A file it cannot get gives you a message and leaves you on this screen. Change the address, the path or any connection box and the Repricer forgets the file it already read, so the next `Next` fetches it again.

### Step 3: Match your columns

`Map Columns` is the third screen of the schedule dialog, and it is where you say which column of your file is which number in the Repricer. It is a split screen: your fields down the left, and a `Live Preview` down the right showing three rows of your own data as the Repricer reads them.

Each field on the left has a dropdown beside it listing every column heading in your file, plus `(Skip)`. The Repricer fills these in for you first, matching common column names, so the work here is usually checking rather than picking. `Clear All`, above the list, empties every one of them.

| What you see | What it means |
| --- | --- |
| A `Required` badge | Only on `SKU / Product ID`, which is the column that matches a row to a listing |
| A field with a colored border | A value in your sample rows is wrong for that field. Hover the count to read why |
| `2 errors` on a field | Those rows would fail. `Next` stays gray until you fix or skip the field |
| `1 warning` on a field | The Repricer thinks the number looks odd and imports it anyway |
| `File has headers?` | Turn it off and the dropdowns show a sample value beside each column name |
| `+2 more` | Your file has more rows than the three shown |

`Next` needs `SKU / Product ID` mapped, at least one other field mapped, and no errors left. A field you have no column for is fine on `(Skip)`.

<AccordionGroup>
  <Accordion title="The full list of fields you can map">
    | Field | What goes in the column |
    | --- | --- |
    | `SKU / Product ID` | Your SKU, or the ID the sales channel uses, such as an ASIN |
    | `Cost` | What the item costs you |
    | `Min Price` | The lowest price a strategy is allowed to publish |
    | `Max Price` | The highest price a strategy is allowed to publish |
    | `MAP` | Your minimum advertised price |
    | `MSRP` | Your recommended retail price |
    | `Manual Price` | One fixed price that replaces everything a strategy would calculate |
    | `Strategy` | The name of a strategy, which has to match one you already have |
    | `Paused` | Whether repricing is off for that listing |
    | `B2B Price` | A fixed business price |
    | `B2B Minimum Price` | The lowest business price |
    | `B2B Maximum Price` | The highest business price |
    | `Compare Price` | The struck-through price beside your selling price |

    The last four only work on a listing whose strategy is set up for them, and the dialog tells you so on the field when nothing you have qualifies.
  </Accordion>

  <Accordion title="How the Repricer guesses your columns for you">
    Every field knows a handful of column names people use for it. `Cost` matches a heading called `cost`, `unit_cost`, `cogs`, `cost_price` or `landed_cost`, and `Min Price` matches `floor`, `min_price`, `minimum_price` or `min`. Capital letters and spaces make no difference.

    A heading it does not know is left for you to pick, and no column is used twice. Guessing only happens on a file the Repricer has not read before, so reopening a schedule you already saved keeps the columns you chose.
  </Accordion>
</AccordionGroup>

### Step 4: Choose how often it runs

`Schedule` is the last screen of the schedule dialog. `Frequency` is a dropdown at the top of it with three choices, and each one opens different boxes.

| `Frequency` | What you set | When it runs |
| --- | --- | --- |
| `Interval` | `Run Every` | Over and over, on a gap you pick |
| `Daily` | `Run at` | At those times, every day |
| `Weekly` | `Days of the week`, then `Run at` | At those times, on those days |

**`Run Every` has six choices**, from `Every 1 hour` to `Every 24 hours`, going through 2, 3, 6 and 12 hours.

**`Run at` is a list of times you check, on the half hour**, and you can pick up to 4 of them. On `Weekly` it stays grayed out until you pick a day, because a time with no day has nothing to run on.

**Pick `Interval` when the file is rewritten all day.** Pick `Daily` or `Weekly` when it is written once, at a time you know. A supplier who publishes at 2 in the morning wants a `Daily` schedule at 3. An hourly one would spend 23 of its runs importing the same numbers.

<Accordion title="Which time of day a daily or weekly schedule uses">
  `Run at` reads in your own time, taken from `Timezone` under `Profile` in your settings when you save the schedule. That timezone is saved onto the schedule, so a teammate in another country reads the same run time you set. Changing your own timezone later leaves your saved schedules alone.

  To move a schedule to a different timezone, change your `Timezone` first, then open the schedule and save it again.
</Accordion>

### Reading the schedules table

The table under the `Create schedule` button, on `Schedules` in the `Uploads` list, is every schedule your organization has, one row each.

| Column | What it shows |
| --- | --- |
| `Name` | What you called it |
| `Description` | Your note, cut off at the width of the column |
| `Source` | `URL`, `FTP` or `SFTP` |
| `Job Type` | `Import` on every schedule you can make |
| `Frequency` | How often it runs, written out, such as `Every 6 hours` or `Mon, Thu at 9:00 AM` |
| `Account` and `Region` | What you set on `Basics`, or `All Accounts` and `All Regions` |
| `Status` | Whether it is running, and whether the last run worked |
| `Last Run` | When the Repricer last downloaded the file |
| `Next Run` | When it is due again. Empty on a schedule that is not running |

The toolbar above the table has the same `Search`, `Columns`, `Filter` and `Density` as every other table in the Repricer, and [filters](/repricer/filters#the-toolbar-above-every-table) explains all four. This table cannot be saved as a [view](/repricer/saved-views).

### Editing, pausing and running a schedule

Click any row of the schedules table and it opens in the same four-step dialog, with every step already filled in. You can click straight to the step you want at the top, change one thing, and click `Update`. Editing changes nothing about the runs that already happened.

Everything else you can do to a schedule is in the actions at the right end of its row.

| Action | What it does |
| --- | --- |
| `Pause` | Stops the schedule. `Next Run` empties and nothing runs until you turn it back on |
| `Enable` | Starts it again, and clears the count of failures behind it |
| `Run now` | Downloads the file and imports it once, without touching the schedule |
| `Delete` | Removes the schedule, after a confirmation |

`Run now` spins while it works and stops when `Last Run` changes, so a slow file leaves the button spinning for up to 30 seconds. Your schedule keeps its own timing, so the run you already had coming still happens.

### Limits

| What | Limit |
| --- | --- |
| File formats | CSV and Excel |
| File size | 250 MB |
| Shortest interval | 1 hour |
| Longest interval | 24 hours |
| Times on a daily or weekly schedule | 4 |
| Name | 100 characters |
| Description | 500 characters |
| Failures before a schedule stops itself | 5 |
| Schedules per organization | No limit |

### What a schedule cannot do

| You cannot | Do this instead |
| --- | --- |
| Have a run read from an FTP or SFTP server | Publish the file to a web address and use `URL (HTTP/HTTPS)` |
| Schedule an export | Run an [export](/repricer/uploads/exports) yourself each time |
| Create listings, or change a SKU, a title or an ASIN | Nothing you send here creates anything. A row with no listing behind it is an error |
| Read a file behind a sign-in page | Publish it at an address that opens on its own |
| Get an email when a run finishes | Read the `Status` column, or the imports table |
| See what a past run did, from this table | Open [imports](/repricer/uploads/imports), where every run left a row |
| Send a copy of the file to a teammate | Download it from your own source |

## What happens on each run

Each run does the same three things. It downloads the file from your address, it turns that file into an ordinary import, and it updates the schedule's own row.

The import it creates is exactly the one you would get by uploading the file yourself. It appears in the [imports](/repricer/uploads/imports#reading-the-imports-table) table under a name built from your schedule, such as `scheduled_Supplier_costs_20260816_030000.csv`. It counts its rows, reports its errors and emails you the same way, and your columns and your account and region come across from the schedule.

**`Active` is not the same as a successful import.** The `Status` on your schedule says whether the file was handed over, and nothing more. A run that downloaded the file and started the import reads `Active` even when every row in that file then failed. To see what changed on your listings, open the imports table and read the row that run created.

### When your next run happens

**The first run is one full cycle away.** Save an hourly schedule and it runs in an hour. Save a daily one at 4 in the afternoon and it runs at 4 tomorrow, whatever times you set. From the second run on it settles onto the times you chose, so a daily schedule set to 9:00 AM runs at that time from then on.

`Enable` on a paused schedule works the same way and puts the next run one full cycle out. Click `Run now` if you do not want to wait for it.

An interval schedule counts from when it was due, not from when it finished, so a run that takes 4 minutes does not push the following one 4 minutes later.

## When something goes wrong

### The four statuses

The `Status` column of the schedules table has four answers in it.

| Status | What it means |
| --- | --- |
| `Active` | Running on its own timing, and the last run handed its file over |
| `Paused` | You turned it off. Nothing runs |
| `Error` | The last run could not get the file. It will try again on the next one |
| `Disabled` | 5 runs failed one after another, so the Repricer stopped it |

`Error` is one bad run and it clears itself the moment a good one goes through. `Disabled` needs you: click `Enable` in the row, which clears the count and starts it running again.

### A schedule that stopped on its own

A run that cannot get the file counts as a failure, and 5 in a row is what turns a schedule off. That is roughly 5 hours on an hourly schedule and 5 days on a daily one. A supplier who moves a file on a Monday can leave you with a `Disabled` schedule by Friday.

The row does not tell you which of the 5 went wrong. Open the schedule, go to `Source`, and click `Next`: the Repricer downloads the file while you watch, and the message it gives is the same one the run got. Work through these in order.

| What to check | How |
| --- | --- |
| The address still works | Paste it into a browser tab. A file should download |
| It opens without signing in | Try it in a private window |
| The file is still a CSV or an Excel file | An address that answers with a web page instead is the common cause |
| The columns still have the same headings | The preview on `Map Columns` shows you what the Repricer reads today |
| It is under 250 MB | Read the file size where you download it |

Fix the schedule, click `Update`, then click `Enable` in the row.

### Error messages

| Message | What to do |
| --- | --- |
| `Please enter a valid URL.` | The address needs a scheme. Start it with `http://` or `https://` |
| `That URL points to a restricted address.` | The address is inside a private network. Use one that opens from anywhere |
| `Request timed out. Check the URL is accessible.` | The server took too long. Try again, then check it in a browser |
| `Failed to download file. Check the URL is accessible.` | Nothing answered at that address |
| `The server returned an error (404 Not Found).` | The address is right and the file is not there. The status is the one your own server gave |
| `File exceeds the 250 MB size limit.` | Split the file, or publish a smaller one |
| `The file does not contain any data.` | The file downloaded and had no rows in it |
| `The first row of the file is empty.` | Delete the empty rows above your headings |
| `That host points to a restricted address.` | Your `Host` is inside a private network |
| `Connection failed: {message}.` | The server did not accept the connection. The message is the one it gave |
| `The downloaded file is empty.` | The path is right and the file has nothing in it |
| `Some fields are invalid. Please review and try again.` | The dialog moves you to the step that has the problem |
| `Failed to create schedule. Please try again.` | Nothing was saved. Click `Save` again |
| `Schedule not found, or you don't have access to it.` | Somebody deleted it while you had the table open. Reload the page |
| `You don't have permission to run schedules.` | Your role is below `Manager` |

## Where to go next

<Columns cols={2}>
  <Card title="Imports" icon="upload" href="/repricer/uploads/imports">
    The same file uploaded yourself, and where every scheduled run reports what it changed.
  </Card>

  <Card title="Cost, fees and profit" icon="receipt" href="/repricer/listings/costs-and-fees">
    What the Repricer does with the cost a schedule sends it.
  </Card>

  <Card title="How a price is decided" icon="route" href="/repricer/how-pricing-works">
    Where your minimum and maximum prices come into the calculation.
  </Card>

  <Card title="Exports" icon="download" href="/repricer/uploads/exports">
    Your pricing data going the other way, into a file you download.
  </Card>
</Columns>
