# Competitor Price Watch

> Tracks competitor prices on landed cost with variant and stock context, and reports movement against recorded history. Never changes your prices.

- Agent: Claude Code
- Plan: Starter (1 vCPU, 2 GiB RAM, 10 GiB disk)
- Forks: 0 · Stars: 0
- Creator: https://www.jurniti.com/creator-ca0ff2
- Tags: claude-code, competitive-intel, e-commerce, ecommerce, monitoring, pricing
- Requires config (you provide): ANTHROPIC_API_KEY
- Skills: competitor-price-watch

**To fork:** open https://www.jurniti.com/templates/competitor-price-watch and use the Fork action — it starts a Stripe Checkout for a new VM seeded with this template's persist disk (same flat plan price, no fork fee).

## README

# A competitor "undercutting" you by $4 — out of stock, $9 shipping

That's not undercutting you. And a bare price comparison is exactly what makes
sellers cut prices they never needed to cut.

## It records landed cost, not a number

Every observation captures price **plus** currency, whether tax is included,
shipping, the exact variant, and stock state. Ask how you compare and you get
landed cost per matched variant — not a naked price next to yours.

A price with no variant match is reported as a **DIFFERENT PRODUCT** rather than
compared. A target without a variant to match gets refused rather than guessed at.

## The value is the delta, so it keeps history

Every run appends to a CSV with a UTC timestamp. Then the report leads with:

- **MOVED** — old → new, delta and percent, both dates
- **NEW LOW / NEW HIGH** — against *your recorded history*, not against your price
- **STABLE** — named explicitly, not omitted
- **STALE** — couldn't fetch this run, with the last known price clearly dated so
  nobody mistakes it for current

That last one matters. Silently carrying yesterday's price forward is how a watch
list starts lying to you.

## It fetches politely or not at all

`robots.txt` is checked **first**. Disallowed path means BLOCKED, skipped, and it
stays blocked — no working around it. One request per target per run, no
catalogue crawling, honest user agent, public product pages only. Never a
logged-in page, never a checkout flow.

## The guard is a file, not a promise

`~/pricewatch/policy/WATCH-RULES.md` carries `NEVER_AUTOPRICE`, the politeness
rules and the context requirements. The skill reads it before every run.

Automated price matching is how margin races to zero, so this must never be wired
into a repricer — and it refuses if you ask.

## What you supply

Your own Claude Code login. Nothing else; targets are public product pages.

List them in `~/pricewatch/targets/targets.md` as
`label | URL | your SKU | variant to match`.

## Where this stops

It records and reports. It does not change your prices, and it won't recommend
matching — that's a business decision the rules deliberately leave to you.

It won't guess their margin (it sees a price, not a P&L) or why they moved (it has
no visibility into their reasoning).

The first run is a baseline, not a briefing.

Verified on build: the skill, the working tree, the `NEVER_AUTOPRICE` guard, the
robots rule and the stale-price rule are present on a fresh fork. Running it on
your own targets is yours to do.
