.reveal{opacity:1!important;transform:none!important}
01Data & analytics

Retail competitor price monitoring system

The retail chain sees competitor prices and its own market position — without manual exports or false matches.

The system collects competitor prices, checks them against our own assortment, and turns the observations into a verifiable view of market position.

Context
The same product is named differently by different retail chains, and price and availability depend on the region and the specific store — matching without human review can produce misleading analytics.
Business problem
Bring data about our own and competitor assortments into one verifiable model without losing the accuracy of product matching.

A pipeline from data collection to manual verification of product pairs and reporting — an automated match is never treated as a final fact.

From problem boundary to production

  1. 01 Data model and integration design
  2. 02 Competitor data collection adapters
  3. 03 Product matching and manual verification workflow
  4. 04 Analytics, reporting, and operational monitoring

Problem

  • The same product is named differently across retail chains and cannot be matched by simple text similarity.
  • Price and availability depend on the region and the specific store, not just the retail chain as a whole.
  • Automated product matching can produce misleading analytics if the result is not verified by a person.
  • A competitor data source can become unavailable or change format, and promotional and regular prices carry different meaning.

Users and context

  • A business user works with the dashboard, category and competitor analytics, and a specific product view.
  • A data operator manages sources and stores, runs collection and matching, and reviews candidate product pairs.
  • The client's external system sends its own assortment, prices, and stock through a protected API in idempotent batches.
  • Own-catalog import of prices and stock through a token-protected API with idempotent batch operations.
  • Separate adapters for several competing retail chains with region and store-level detail.
  • Verified matching product attribute normalization and a matching algorithm that requires manual confirmation before a pair reaches business reports.
  • Price-position analytics price history, a per-product view, and Excel export.
  • One shared pricing engine the dashboard, analytics workspace, reports, and product view all calculate market position through the same module, not separate independent calculations.
  1. Collection & normalization

    Adapters collect competitor prices, availability, and promotions per store and region, and bring them into a common format without re-saving duplicate observations.

  2. Matching

    The algorithm proposes candidate matches between our product and a competitor product based on text and structural similarity.

  3. Manual review

    An operator confirms or rejects the proposed match; only confirmed pairs are used in reports.

  4. Analytics & reporting

    Confirmed comparisons form the price position and history, available in the interface and exportable to Excel.

Anonymized market-position dashboard on synthetic data
Dashboard: aggregated market position (screen reconstruction, synthetic data)
Category and competitor analytics screen on synthetic data
Analytics: breakdown by category, competitor, and region (screen reconstruction, synthetic data)
Manual product matching review screen on synthetic data
Matching: manual review of proposed product pairs (screen reconstruction, synthetic data)
Product view with price history on synthetic data
Product view: price, history, and market minimum (screen reconstruction, synthetic data)

Try it yourself: manual matching review

The same screen as the screenshot above, made interactive. Confirm or reject the pairs — the state lives only on this page, nothing is sent or stored anywhere.

Pending: 4 · Confirmed: 0 · Rejected: 0

  • Product #4471, 0.5 vol.Listing "Product 0.5 standard"
    96
  • Product #4472, 0.7 vol.Listing "Product 0.7 line A"
    88
  • Product #4473, 1.0 vol.Listing "Product 1.0 version B"
    74
  • Product #4474, 0.33 vol.Listing "Product 0.33 pack"
    69

A web application, a background worker, and a scheduler run as separate processes around a shared database; competitor adapters plug into one common contract, while the own assortment arrives through a separate protected import.

  • Web application and server-rendered interface
  • Background worker and scheduler
  • Competitor data collection adapters
  • Own-assortment import
Shared database: current prices and history

Reliability and security

  • Separate web, worker, and scheduler processes with recovery of unfinished jobs after a restart.
  • User roles, an audit log, and brute-force login protection.
  • A defined backup and update procedure before any schema change.
  • Security headers and a content security policy are enforced at the application level, not left to web-server configuration.
Only a manually confirmed match is used in working reports.

Challenge Automated product matching can be wrong and distort business analytics.

Why it matters Automation speed is not traded for the accuracy of the data decisions rely on.

Current state and price history are stored separately.

Challenge Current prices need to be shown quickly while price history must still be preserved.

Why it matters Analytics stays fast without losing the change history.

Own-price import is idempotent by batch identifier.

Challenge A client system may resend the same price batch after a network error.

Why it matters A repeated request cannot create duplicate or conflicting data.

Collection concurrency is controlled separately per source.

Challenge Several competitor sources cannot be collected the same way without risking overload or blocking.

Why it matters Data collection does not put unnecessary load on competitor sources.

Automatic confirmation is disabled entirely: every candidate match, regardless of its score, waits for an operator decision.

Challenge A high similarity score from the algorithm does not guarantee it is genuinely the same product.

Why it matters No automated matching result reaches the reports without a human decision.

A confirmed match applies at the competitor level as a whole, not per individual store.

Challenge Verifying a match separately for every competitor store and region would make manual review unworkable as the network grows.

Why it matters Manual review scales across many store locations without a proportional increase in operator workload.

  • Python
  • Flask
  • PostgreSQL
  • SQLAlchemy / Alembic
  • RapidFuzz
  • Chart.js
  • Gunicorn / Nginx / systemd

Selected work

Tell us where the operation no longer fits the tools.

Name the process owner, what is breaking, what it costs in time or money, and which systems are already in place. We will first test whether custom software is justified.

Or directly

By submitting the form, you accept the data processing terms.