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

# Competitor URLs

> Nobody else sells on your own store, so you paste the web address of a competitor's product page onto a listing and the Repricer reads that price for you.

On a marketplace, the channel tells the Repricer what every other seller is charging. On your own store nobody else is selling next to you, so no such list exists. A strategy that prices against a competitor has nothing to read.

A competitor URL closes that gap for you. You paste the web address of a competitor's product page onto one of your [listings](/repricer/listings). From then on the Repricer opens that page every few hours, reads the selling price off it, and keeps the latest one. Your strategy prices against the cheapest of the pages you added, the same way it would price against the cheapest offer on a marketplace.

You do this on the listing itself. Click `Listings` in the sidebar, click the product title on a row to open the listing, and click `Competitors` in the row of tabs at the top of that dialog. On a listing from your own store, that tab is your list of competitor URLs, one row each, with the last price read off every one.

## Before you start

### What your role lets you do

Adding, pausing, renaming or removing a competitor URL needs your Admin, Manager or Editor role in the Repricer. An Analyst gets the same table with no buttons on it. Your role is set per product in [team, roles and permissions](/team#what-each-repricer-role-can-do).

### Which listings can have competitor URLs

Only your listings on your own store, which means Shopify, BigCommerce, eBay and Square. Your Amazon and Walmart listings get the competing offers from the channel itself, so there is nothing to add and no place to add it.

There is a second condition, and it catches people. The `Competitors` tab, in the row of tabs at the top of the listing dialog, appears on an own-store listing only while the strategy you assigned to it prices against a competitor. Assign a strategy set to `Cost-based pricing` and your tab goes away. That strategy builds a price from your cost and never looks at anybody else. See [competitors](/repricer/listings/competitors#which-listings-have-a-competitors-tab) for what the tab shows on each kind of listing.

## How to add a competitor URL

<Steps>
  <Step title="Open the listing">
    Click `Listings` in the sidebar, then click the product title on the row you want. Your listing opens in a dialog over the table.
  </Step>

  <Step title="Open your competitor list">
    Click `Competitors` in the row of tabs across the top of that dialog, after `Insights`.
  </Step>

  <Step title="Start a new one">
    Click `Add URLs` in the toolbar above the table. On a listing with nothing on it yet, you get the same button in the middle of the empty table instead.
  </Step>

  <Step title="Paste the web address">
    A dialog opens with two boxes side by side. Put the full address of the competitor's product page in the wide box on the left. In the narrow box on the right, give that competitor a short name if you want one.
  </Step>

  <Step title="Save it">
    Click `Add` at the bottom right. The dialog closes and your row appears in the table.
  </Step>
</Steps>

That is the whole task. Your new row starts at the status `Pending`. The Repricer reads the page within the next few minutes, and your price and both date columns fill in on their own. Your strategy starts counting that price as soon as the first reading works.

Everything below explains the table, the six statuses and the timing one at a time. You do not need any of it to add a competitor.

## Every option in detail

### Adding several competitors at once

The dialog that opens from `Add URLs`, in the toolbar above your competitor table, takes more than one row. Click `+ Add another` under the last row for another pair of boxes. You can also paste a list of addresses, one per line, into any address box, and each line becomes its own row. The line above the boxes tells you how many more you can add, and rows stop appearing once you get there.

The × at the right end of a row takes that row back out before you save. Press Enter in a filled last row and you get another row. Press Enter anywhere else and your rows are saved.

`Add` at the bottom right saves every row at once, and it counts what you filled in, so two rows give you a button reading `Add 2`. Nothing is saved until you click it, so `Cancel` at the bottom left loses whatever you typed. A row with a problem in it stops your whole save. You get a message under that address saying what is wrong, and those messages have their own section further down.

### Reading the competitor URL table

The table on the `Competitors` tab has one row per competitor page. Your rows are sorted by price, cheapest first, so the top row is the lowest price you know about.

| Column | What it shows |
| --- | --- |
| `URL` | The address you added, shortened to fit. Click it to open that page in a new tab |
| `Label` | The name you gave that competitor, or a dash when you gave none |
| `Status` | How your readings are going. Hover the badge for a sentence telling you what to do |
| `Price` | The price read off the page on the last try |
| `Last Checked` | How long ago that reading happened |
| `Next Check` | How long until the next reading, and how often it repeats |

Directly above the rows you get the same toolbar every table in the Repricer has, with `Search`, `Columns`, `Filter` and `Density` on it. See [filters](/repricer/filters) for what each one does. Click a column header to sort by that column instead of by price.

A price on a page in another currency gets converted for you. You get the price the way that page shows it, then what it comes to in your listing's currency, on the same line.

### What each status means

The `Status` column of that table is one badge with a tooltip on it. You can get six values, and the Repricer works them out from your last few readings rather than from anything you set.

| Status | What it means |
| --- | --- |
| `Pending` | The page has not been read yet. You get it in the next round |
| `Active` | The last reading worked and your next one is on schedule |
| `Retrying` | The last reading failed. The Repricer tries the page again on its next round |
| `Failing` | Three or more readings in a row have failed. Open the page yourself and check that it still exists |
| `Stale` | More than twice the usual gap has passed since your last reading |
| `Paused` | Nothing is being read. Either you paused it, or it was paused for you after repeated failures |

A row keeps its last price on screen whatever the status says, so you can get an old number under a `Failing` badge. `Last Checked` is how you tell how old that number is.

### How often each page is checked

Every competitor page is on its own clock, and your first reading happens within minutes of adding it. After that the gap depends on how much work that page takes to read. A page that answers quickly gets read every 4 hours, and a heavy one gets read every 12. Most are in between, at 6 or 8 hours.

The `Next Check` column shows you both halves of that. On the left is a countdown to your next reading, and beside it is the gap it settled into, written as `Runs every 6h`. Hover the gap for a sentence saying why that page got that number. A page you have never had a reading for shows nothing here, because the gap is decided by the first one.

When a reading is late, the countdown is replaced by `Overdue` in orange. A few minutes of that is normal, because readings are collected in rounds. Hours of it, with a `Stale` status beside it, is worth a look.

<Accordion title="Why one competitor is read every 4 hours and another every 12">
  Some product pages give up a price the moment you open them. Others put the price behind a lot of other content, and reading one of those takes real work. The Repricer remembers how much work each of your pages took last time, and it sets the gap from that. So two competitors you added on the same day can end up on different clocks.

  You cannot choose the gap, and you cannot shorten it for a page you care about more. The one thing that changes it is the page itself changing.
</Accordion>

### Pausing a competitor without losing it

Every row of your competitor table has its own actions at its right end. On a narrow window you get them behind a button of three dots in the same place.

`Pause` stops the readings on that one row and takes its price out of what your strategy compares against. Your row stays where it is, the last price it read stays on screen, and the status becomes `Paused`. `Resume` in the same place starts your readings again. It also sets the failure count back to zero, so a page you have fixed gets a fresh run of tries.

Pause a competitor when their page is no use to you for now. A competitor out of stock, with their price cut to something you would never match, is the usual reason. Remove one when you are done with it for good.

### Renaming a competitor

`Edit label`, in the actions at the right end of the row, opens a small dialog with a `Label` box, up to 100 characters. This is only a name for your own reading of the table, so nothing about the price or the schedule changes when you save it. Clear the box and save, and you get an empty cell.

### Removing a competitor

`Delete`, in the actions at the right end of the row, asks you to confirm first, and the button on that dialog reads `Remove`. Removing takes the row off your listing, and your strategy stops counting that price from that moment.

Nothing else on your listing is touched, and you can add the same address again at any time. A page you add back starts over at `Pending` with no price on it. Removing and adding is also how you get a page read sooner than its schedule would.

### Limits

| What | Limit |
| --- | --- |
| Competitor URLs on one of your listings | 10 |
| Length of a web address | 2,048 characters |
| Length of a label | 100 characters |
| Failed readings before your URL is paused for you | 5 |

Your `Add URLs` button disappears once a listing has 10, and you get a message reading `Competitor limit reached` above the table instead. Remove one to make room.

### What competitor URLs cannot do

| You cannot | Do this instead |
| --- | --- |
| Have the Repricer find competitors for you | Add each page yourself. There is no list to pick from and no discovery |
| Add one to your Amazon or Walmart listings | Read the offers those channels report on the [competitors](/repricer/listings/competitors) tab |
| Track a page whose address starts with `http://` | Use the same page's `https://` address |
| Choose how often your page is read | The Repricer sets that from the page itself |
| Copy your list from one listing to another | Add the addresses again on the other listing |
| Import or export a list of competitor URLs | An [import](/repricer/uploads/imports) writes your costs and price limits, not your competitors |
| See what a competitor charged last month | Read [pricing activity](/repricer/pricing-activity) for what your own price did |

## How your price uses these prices

Your strategy never reads a single row. It reads one number, the lowest price among the competitor URLs on that listing, and prices against that.

Three kinds of row are left out of that number. A `Paused` row is left out. So is a row that never returned a price, and so is a row in a currency the Repricer has no conversion rate for. Everything else counts, whatever its status says, because a `Failing` row still has the last price it managed to read.

**A change you make here reprices your listing right away.** Pause a competitor, resume one, or remove one, and the lowest price is worked out again on the spot. If that number moved, repricing runs on your listing without waiting for the next reading. Adding a competitor is the one exception, because your new row has no price on it until its first reading works.

The same number fills the `Lowest` column on your listings table for own-store listings. It also fills the `Market Position` card on the `Insights` tab of the listing dialog. See [insights](/repricer/listings/insights) for the rest of that card.

<Note>
  A listing with no competitor URLs gives a competitor-based strategy nothing to price against, so your price stays where it is and your repricing status says so.
</Note>

## When something goes wrong

### A page the Repricer cannot read

Pages break. A competitor rebuilds their site, an address stops answering, or a page starts turning away anything that is not a person with a browser. Here is what you see as that plays out.

| After | What happens |
| --- | --- |
| Your first failed reading | The status becomes `Retrying`. The page is tried again 6 hours later |
| Three failed readings | The status becomes `Failing` |
| Five failed readings | Your URL is paused for you and stops counting toward your price |

When a URL is paused that way, you get a warning above the table: `Some competitors were automatically disabled after repeated failures. You can reactivate them to retry.` That warning stays until you resume the URL or remove it. The owners and admins of your organization also get an email about it. You can turn that email off under `Sync errors` in `Settings`, then `Notifications`.

| Why a page stops working | What to do |
| --- | --- |
| The competitor took the product down, or moved it | Open the address yourself. If it is gone, remove your row. If it moved, remove it and add the new address |
| The page now asks for a sign-in or a country before it shows a price | Nothing on your side fixes that. Remove your row and use a different competitor |
| Your address had a typo in it | Remove it and add the correct one, because an address cannot be edited |
| The page is fine and you had a bad run | Click `Resume`. That clears the failure count and puts your page back on its schedule |

### Why a URL is rejected

You get these under the box you typed in, inside the dialog you opened from `Add URLs`. Your save does not go through until every row is clean.

| Message | What to do |
| --- | --- |
| `URL is required` | You left an address box empty. Fill it or take that row out with the × |
| `Must be a valid URL` | Paste the whole address, starting with `https://` |
| `Must use HTTPS` | Your address starts with `http://`. Try the same page on `https://` |
| `URL must be 2048 characters or fewer` | Cut the tracking parameters off the end |
| `Duplicate in this list` | You have the same address on two rows of this dialog |
| `Already added to this listing` | That address is already in the table behind the dialog |
| `URL cannot point to localhost` | Your address points at your own computer |
| `Cannot monitor your own Repricer pages as competitor URLs` | Your address is a Ready for Commerce page. Use the competitor's own site |

A few addresses are turned down after you click `Add` instead of while you type. The message is `The URL is not allowed for security reasons.` and it covers addresses pointing at private networks, and addresses carrying a name and a password in them.

### Messages after you save

| Message | What it means |
| --- | --- |
| `Competitor URL added`, `2 URLs added` | Your save worked |
| `Tracking updated` | Your `Pause` or your `Resume` worked |
| `Label updated`, `Competitor removed` | Your edit or your delete worked |
| `This URL is already tracked.` | Somebody else added the same address while your dialog was open |
| `Maximum 10 competitor URLs per listing reached.` | Your listing filled up while the dialog was open |
| `You do not have permission to perform this action.` | Your role is Analyst. See [team, roles and permissions](/team#what-each-repricer-role-can-do) |
| `Failed to load competitor URLs` | Your table could not be read. Close the listing and open it again |
| `An unexpected error occurred.` | Reload the page and check your table before trying the same thing again |

Every one of these actions shows on screen before it is saved. So a row can appear, move or vanish, and then come back if your save did not go through. When you get one of the failure messages above, the table you are looking at is the truth and your change did not happen.

## Where to go next

<Columns cols={2}>
  <Card title="Competitors" icon="users" href="/repricer/listings/competitors">
    What the same tab shows on a marketplace listing, and which offers your strategy counts.
  </Card>

  <Card title="Targets and modes" icon="crosshair" href="/repricer/strategies/targets-and-modes">
    Pricing against a competitor instead of against your cost, and what your strategy aims at.
  </Card>

  <Card title="Listing and repricing status" icon="signal" href="/repricer/listings/statuses">
    What your listing says when there is no competitor price to work from.
  </Card>

  <Card title="Insights" icon="chart-line" href="/repricer/listings/insights">
    The `Market Position` card, and where you stand against the prices on this page.
  </Card>
</Columns>
