The competitor price tracking spreadsheet, and its limits

Copy this column layout and you have competitor price tracking running today, for free. Here is the setup, the formulas, and the four ways a sheet quietly breaks.

8 min read

Almost every shop that tracks competitor prices starts in a spreadsheet, and that is the right place to start. A sheet costs nothing, you already know how to use it, and it forces you to decide which products actually matter. This guide gives you the exact layout to copy, the two formulas that do the work, and an honest account of where the approach stops.

The column layout

One row per competitor product. Not one row per product with competitors in columns — that looks tidier and becomes unusable the moment you add a third competitor.

  • A — My SKU. Your internal product code, so the sheet can be matched back to your catalogue later.
  • B — Product name. Your name for it, not the competitor's.
  • C — My price. Typed in, or pulled from your store export.
  • D — Competitor. The shop's name, repeated per row.
  • E — Competitor URL. The full product page link.
  • F — Competitor price. The formula cell (below).
  • G — Difference. =F2-C2, formatted as currency.
  • H — Difference %. =(F2-C2)/C2, formatted as a percentage.
  • I — Last checked. The date the price in F was read.
  • J — Flag. The alert formula (below).

Keep one sheet tab per competitor if you have more than about fifty rows. Filtering one long tab works, but a tab per competitor makes it obvious when one of them has silently stopped returning prices.

Pulling the price automatically

In Google Sheets, IMPORTXML reads a value out of a page. Most online stores publish their price in a structured data block for Google, and that block is far more stable than the visible page markup:

=IMPORTXML(E2, "//meta[@itemprop='price']/@content")

If that returns nothing, try the visible element instead, using the price element's own class name from the competitor's page:

=IMPORTXML(E2, "//*[contains(@class,'price')][1]")

Wrap either one so a failure does not fill the sheet with errors: =IFERROR(IMPORTXML(...), "check"). A column of "check" cells is information — it tells you which competitor changed their page.

The alert formula

A sheet cannot email you, but it can shout. Put this in column J and set conditional formatting to colour any cell containing UNDERCUT:

=IF(F2="", "no data", IF(F2 < C2*0.97, "UNDERCUT", IF(F2 > C2*1.03, "we are cheaper", "in line")))

The 3% band matters more than it looks. Without it, every row flickers between states on rounding noise and you stop trusting the column. Pick the band from your category, the same way you pick check frequency — see how often to check competitor prices.

Keeping a history

This is where sheets get uncomfortable. Column F holds one number: today's. Overwrite it tomorrow and last week is gone, so you can never answer "was this competitor always cheaper, or only since Friday?" The usual workaround is a second tab where you paste today's prices as a new column each morning, dated. It works, and it is a manual step you must not forget, forever. Why that history is worth having is covered in price history tracking.

Four ways the sheet quietly breaks

  • JavaScript prices. Many modern stores render the price after the page loads. The import formula reads the raw page and finds nothing — permanently, not intermittently.
  • Blocking. Larger retailers refuse requests that do not look like a browser. The cell returns an error and there is no setting to fix it.
  • Redesigns. A class name changes on the competitor's side and your formula returns the shipping cost, or a struck-through old price, with no error at all. This is the dangerous one: wrong data looks like data.
  • Volume. Sheets refresh import formulas on their own schedule and slow down badly past a few hundred of them. Around 200 rows the file becomes something you avoid opening.

Use the sheet, then stop using it

The spreadsheet is genuinely the right tool for the first few weeks. It costs nothing and it teaches you which twenty products decide your month. Move on when one of these is true: you have more than about fifty competitor rows, you need history you can look back through, or you want to be told about a change instead of going to look for it.

That last one is the real difference. A sheet is something you check; monitoring is something that checks for you. Prizeee reads each product page and each competitor category page on a schedule, keeps the full price history, and emails you only when a price actually moves past your threshold — including for products the competitor lists after you set it up. The 7-day free trial is enough to run both side by side and compare what the sheet was missing.

If you would rather see the full range of approaches first, start with how to monitor competitor prices automatically.