res-price-compare
Price Comparison — Polish Market
Iterative 5-round product price research on the Polish e-commerce market with warranty verification, shipping costs, and B2B analysis.
IMPORTANT: Load references/polish-market.md at startup — it contains the shop database, price comparators, and search patterns.
Architecture
| Tool | Purpose | Cost |
|---|---|---|
WebSearch |
Search for shops, prices, offers | Free |
WebFetch |
Verify prices on shop pages (primary) | Free |
scrapling |
Fallback for sites that block WebFetch | Free |
No xAI — price comparison doesn't need X/Twitter.
Requirements
No external dependencies required. Skill runs on built-in Claude Code tools.
Optional dependencies:
scrapling— fallback for sites that block WebFetch (403, CAPTCHA, empty responses). Install:uv tool install 'scrapling[all]'uv— to runuv run --with openpyxl python3 -c "..."for XLSX export
Workflow Overview
| Step | Action | Purpose |
|---|---|---|
| 1 | Parse query | PRODUCT, BUYER_TYPE, CATEGORY |
| 2 | Round 1: Discovery | Ceneo, Allegro, Amazon.pl, general and specialist shops |
| 3 | Gap analysis | Missing shops, unverified prices, missing data |
| 4 | Round 2: WebFetch shops | Confirm prices, stock levels, shipping |
| 5 | Round 3: Warranty and shipping | Verify warranty type, delivery costs |
| 6 | Round 4: B2B and distributors | B2B portals, official distributors, statutory warranty |
| 7 | Round 5: Final verification | Re-check cheapest, stock, coupons |
| 8 | Synthesis | Comparison table, recommendation, summary |
| 9 | Export | TXT, XLSX, HTML on request |
| 10 | Expert mode | Answers from cache, no new searches |
WebFetch with Scrapling Fallback
Every WebFetch call in this skill follows a two-tier pattern:
-
Try WebFetch first (fast, no file I/O):
WebFetch(url, prompt) -
If WebFetch fails (403, empty content, CAPTCHA page, or blocked response), retry using the auto-escalation protocol from cli-web-scrape:
scrapling extract get "URL" /tmp/scrapling-fallback.md→ Read → validate content- If content is thin (JS-only shell, no data, mostly nav links) →
scrapling extract fetch "URL" /tmp/scrapling-fallback.md --network-idle --disable-resources→ Read → validate - If still blocked →
scrapling extract stealthy-fetch "URL" /tmp/scrapling-fallback.md --solve-cloudflare - All tiers fail → skip shop and label "scrapling blocked"
Detection heuristics for blocked/thin responses:
- HTTP 403 or "access denied" in response
- Response body is empty or contains only navigation/cookie banners
- Response contains CAPTCHA challenge (reCAPTCHA, hCaptcha, Cloudflare challenge page)
- Response is a "please enable JavaScript" page or JS-disabled warning
- HTTP 200 but no prices, specs, or product names — only nav links and footer (JS-rendered SPA)
If scrapling is not installed, fall back to the original behavior: skip the shop and label "WebFetch blocked".
Step 1: Parse Query
Extract from user query:
1a. PRODUCT
Product name to search. Include model, variant, part number.
1b. BUYER_TYPE
| Type | Detection | Consequences |
|---|---|---|
| B2C | "for home", "personal", no indication | Statutory warranty 24 mo. + voluntary warranty |
| B2B | "for company", "VAT invoice", "business", "B2B" | Statutory warranty may be excluded, manufacturer warranty is critical |
Default: B2B (safer assumption — triggers more analysis)
1c. CATEGORY
Auto-detect based on product name. Load the appropriate specialist shop list from references/polish-market.md:
| Category | Detection Patterns | Examples |
|---|---|---|
| VoIP/Telephony | Yealink, Grandstream, Fanvil, SIP, DECT, VoIP | Yealink W76P |
| IT/Networking | MikroTik, Ubiquiti, switch, router, AP, firewall | MikroTik hAP ax3 |
| Electronics | monitor, laptop, computer, printer, tablet | Dell U2723QE |
| Office | chair, desk, shredder, projector | Ergohuman Elite |
| General | (no match) | Nespresso Vertuo |
Step 2: Round 1 — Discovery
Query Generation
Generate 6-8 parallel queries:
- Ceneo:
site:ceneo.pl "{PRODUCT}" - Allegro:
site:allegro.pl "{PRODUCT}" - Amazon.pl:
site:amazon.pl "{PRODUCT}" - General prices:
"{PRODUCT}" cena kupić - Specialist shops:
"{PRODUCT}" sklep(from category list) - Price comparator:
"{PRODUCT}" porównanie cen - Reviews:
"{PRODUCT}" opinie recenzje - B2B:
"{PRODUCT}" dystrybutor hurtownia(if BUYER_TYPE = B2B)
Parallel Execution
Run all WebSearch queries simultaneously (parallel tool calls).
Internal Notes After Round 1
Record (internally, NOT in output):
SHOPS_FOUND: [list of shops with prices]
SHOPS_MISSING: [from references/polish-market.md, not found]
PRICES_TO_VERIFY: [prices from snippets — need WebFetch]
WARRANTY_TO_CHECK: [shops without warranty type info]
LEADS: [URLs worth checking via WebFetch in Round 2]
Step 3: Gap Analysis
After Round 1, perform gap analysis:
| Gap | Check | Action |
|---|---|---|
| No comparator data | Do we have Ceneo data? | If not → WebFetch ceneo.pl |
| No specialist shops | How many shops from category in polish-market.md? | Search for missing ones |
| Prices from snippets only | Any price confirmed via WebFetch? | Plan WebFetch for top 10 |
| No warranty data | How many shops have warranty type info? | Plan verification |
| No shipping data | How many shops have delivery costs? | Plan WebFetch of shipping pages |
| No marketplace data | Were Allegro / Amazon checked? | Additional queries |
Plan Round 2
Select top 8-12 URLs for WebFetch verification. Priority:
- Cheapest offers (price verification)
- Ceneo (lists many shops at once)
- Specialist shops without price
- Pages with warranty information
Step 4: Round 2 — WebFetch Shops
Rules
- Never repeat queries from Round 1
- WebFetch specific product pages — not homepages
- In parallel — run 4-6 WebFetch simultaneously
- Maximum 8-12 WebFetch in this round
Execution
For each URL from the list, apply the WebFetch with Scrapling Fallback pattern:
WebFetch(url, "Podaj: 1) dokładną cenę brutto, 2) dostępność/stan magazynowy,
3) koszty wysyłki, 4) informacje o gwarancji (producenta czy sprzedawcy)")
If WebFetch returns 403, empty content, CAPTCHA, or a blocked response, follow the auto-escalation protocol (HTTP → validate content → Dynamic → Stealthy). Extract the same data points from the scrapling output.
If Ceneo is available, WebFetch the Ceneo page first — it provides a list of many shops at once.
Confidence Update
| Source | Price Confidence |
|---|---|
| WebSearch snippet | LOW — price may be outdated |
| Ceneo listing | MEDIUM — aggregator, but delays |
| WebFetch of shop page | HIGH — directly confirmed |
| Scrapling fallback of shop page | HIGH — directly confirmed (same as WebFetch) |
Step 5: Round 3 — Warranty and Shipping
Goal
For each shop, establish:
- Warranty type: manufacturer / distributor / seller / unknown
- Shipping costs: courier, Paczkomat, free shipping (threshold)
- Delivery time: 24h, 48h, on order
Where to Look for Warranty
- Product page — "Gwarancja" (Warranty) or "Informacje dodatkowe" (Additional info) section
- Shop terms of service — search for "gwarancja", "gwarant", "rękojmia"
- Warranty card — PDF or description in specs
- WebSearch:
site:{shop} gwarancjaorsite:{shop} regulamin
Warranty Classification
| Indicator | Type |
|---|---|
| "gwarancja producenta", "producent: [brand]" | MANUFACTURER |
| "gwarancja dystrybutora", distributor name as guarantor | DISTRIBUTOR |
| "gwarantem jest [shop name]", "gwarancja [shop]" | SELLER |
| No information | UNKNOWN |
Load references/warranty-guide.md if deeper B2B or statutory warranty analysis is needed.
Shipping Costs
WebFetch the "Dostawa" (Delivery) or "Wysyłka" (Shipping) page for top 10 shops, using the WebFetch with Scrapling Fallback pattern:
WebFetch(shipping_url, "Podaj wszystkie opcje dostawy z cenami:
kurier, Paczkomat, Poczta Polska, odbiór osobisty, darmowa wysyłka (od jakiej kwoty)")
On blocked response, follow the auto-escalation protocol (HTTP → validate content → Dynamic → Stealthy) and extract delivery options from the scrapling output.
Step 6: Round 4 — B2B and Distributors
Goal
- Identify official distributors of the brand in Poland
- B2B portals — wholesale prices, business terms
- B2B statutory warranty — do shops exclude statutory warranty for businesses
Queries
WebSearch: "{BRAND} dystrybutor Polska"
WebSearch: "{BRAND} importer Polska"
WebSearch: "{BRAND} autoryzowany sprzedawca"
WebSearch: "{PRODUCT}" site:ab.pl OR site:action.pl OR site:also.pl
B2B Statutory Warranty Verification
For top 5 cheapest shops, apply the WebFetch with Scrapling Fallback pattern:
WebFetch(terms_url, "Czy regulamin wyłącza rękojmię dla przedsiębiorców?
Szukaj: Art. 558 KC, wyłączenie rękojmi, przedsiębiorca, firma")
On blocked response, follow the auto-escalation protocol (HTTP → validate content → Dynamic → Stealthy) and search the scrapling output for statutory warranty exclusion clauses.
Distribution Chain
Establish the chain: Manufacturer → PL Importer → Distributor → Reseller → Customer
For each distributor record:
- Company name
- Role (importer / distributor / authorized reseller)
- Website
- Service contact details (if available)
Step 7: Round 5 — Final Verification
Goal
Final verification before synthesis. Verification only, no discovering new shops.
Checklist
- Re-check top 3 cheapest — WebFetch again, price may have changed
- Stock — is the product in stock (not "on order")
- Coupons/promotions —
"{PRODUCT}" kupon zniżka promocja - Alternative offers on Allegro — check 2-3 offers from different sellers
- Compare Allegro vs direct shop — price, warranty, safety
Budget
Maximum 6-8 WebFetch in this round.
Step 8: Synthesis
Main Table
Sort by total price (price + cheapest shipping):
# | Shop | Gross Price | Shipping (cheapest) | Price+Shipping | Mfr. Warranty | Availability
--+--------------------+-------------+---------------------+----------------+-------------------+------------------
1 | shop.pl | 489.00 PLN | InPost courier 12 | 501.00 PLN | YES — service.pl | Yes (1987 pcs)
2 | morele.net | 496.30 PLN | FREE from 399 PLN | 496.30 PLN | YES — "Manufacturer" | Yes (11 pcs)
Warranty Legend
YES = confirmed manufacturer warranty (verification source)
NO = seller's own warranty (not manufacturer)
? = not verified at source
n/a = no data
Report Sections
-
TOP 3 — with confirmed manufacturer warranty
- Table: Shop, Price incl. shipping, Warranty, Notes
-
Full comparison table
- All found shops, sorted by price+shipping
-
Allegro — offers
- Seller, Price, Manufacturer warranty, Link
-
Warranty — key findings
- Manufacturer policy (global)
- PL Distributor (extended warranty?)
- Service center in Poland
- Manufacturer vs seller warranty (shop list)
- B2B: statutory warranty and its exclusion
-
Official distributors in Poland
- Table: Company, Role, Website
-
Product specifications
- Key technical parameters
-
Purchase recommendation
- For B2C: top 3 with price, warranty, reasoning
- For B2B: top 3 considering statutory warranty and manufacturer warranty
- What to avoid and why
Confidence Indicators
Label each piece of information:
| Confidence | When |
|---|---|
| [HIGH] | Confirmed via WebFetch or scrapling from shop page |
| [MEDIUM] | From Ceneo/comparator or single source |
| [LOW] | From WebSearch snippets only |
Step 9: Export
Generate files on user request:
TXT
Fixed-width column file, same format as synthesis tables.
XLSX
Load references/export-formats.md and generate an Excel spreadsheet with:
- Conditional coloring (green=manufacturer warranty, red=seller)
- Filters and frozen headers
- Multiple sheets (comparison, warranty, distributors, specifications)
HTML
Load references/export-formats.md and generate standalone HTML with:
- Dark theme, embedded CSS
- Tabs for report sections
- Colored badges for warranty types
- Responsive layout
Step 10: Expert Mode
After delivering the report, switch to Expert Mode:
- Answer questions from collected data
- No new searches unless user requests
- Compare offers, advise
New search triggers (exit Expert Mode):
- "Search again..."
- "Find more about..."
- "Update the data..."
- "Check also..."
Parameters
Always deep mode — 5 rounds, 25-40 shops, 20-30 WebFetch.
| Parameter | Value |
|---|---|
| Rounds | 5 |
| Shops | 25-40 |
| WebFetch | 20-30 |
Constraints (DO/DON'T)
DO:
- Always start from Ceneo.pl — best price comparator in PL
- WebFetch to verify prices — search snippets are unreliable
- Distinguish manufacturer warranty from seller warranty — this is critical
- Include shipping costs in ranking — price without shipping is incomplete
- Search for official brand distributors in Poland
- For B2B: check statutory warranty exclusion in terms of service
- Run WebSearch in parallel (parallel tool calls)
- Cite the source of each piece of information (shop URL)
- Load
references/polish-market.mdat startup
DON'T:
- Don't trust snippet prices without WebFetch verification
- Don't skip shipping costs in comparison
- Don't assume "24 months warranty" = manufacturer warranty
- Don't repeat queries from previous rounds
- Don't discover new shops in Round 5 — verification only
- Don't quote more than 125 characters from a single source
- Don't run queries sequentially when they can be parallel
Error Handling
| Error | Resolution |
|---|---|
| WebFetch 403/CAPTCHA/empty | Follow auto-escalation protocol from cli-web-scrape: HTTP tier → validate content → Dynamic tier → Stealthy tier. If scrapling unavailable or all tiers fail, skip shop and label "blocked" |
| Ceneo returns no results | Search directly in shops from polish-market.md |
| Allegro blocks scraping | Use WebSearch site:allegro.pl, not WebFetch |
| No price on page | Label "n/a", skip in ranking |
| Conflicting prices (snippet vs WebFetch) | Always trust WebFetch (or scrapling if WebFetch was blocked) |
References
references/polish-market.md— Shop and comparator database (loaded ALWAYS)references/warranty-guide.md— Statutory vs voluntary warranty, Polish law, B2B checklistreferences/export-formats.md— TXT/XLSX/HTML templates with generation instructions