B2B Product Intelligence & Stock Monitoring Platform
A private B2B application that normalizes product, price and stock observations across sources, preserves history and supports controlled product matching and comparison.
Technologies Used
A private B2B application that normalizes product, price and stock observations across sources, preserves history and supports controlled product matching and comparison.
Technologies Used
This project is a private B2B product intelligence application designed to consolidate product availability, pricing and stock movement data from multiple external product sources into a single operational interface.
The system goes beyond periodically collecting product information. It maintains a normalized internal product catalog, discovers and updates external products, records historical snapshots, detects stock and price changes, associates equivalent products across different sources and turns those records into searchable reports and decision-support views.
One of the core engineering challenges was converting independently structured product data into a consistent model that could answer practical questions such as where an item is available, how its price has moved, whether stock has increased or decreased, how an internal price compares with external alternatives and which records actually represent the same physical product.
When the same or comparable products appear across multiple data sources, manually checking availability and pricing quickly becomes impractical. Product names can differ, stock codes may follow different conventions, categories may not align and prices can change independently throughout the day.
A simple spreadsheet provides only a temporary snapshot. It cannot reliably preserve historical state, identify meaningful changes, recover interrupted updates or establish durable relationships between equivalent products.
Product names, codes, prices, stock quantities and category structures arrive in different formats and require normalization before they become comparable.
Current stock alone is not enough. The system also needs to understand what changed since the previous observation and preserve that history.
The same item may be represented differently across sources, requiring controlled matching rather than assuming identical names mean identical products.
Thousands of asynchronous update operations require queues, retries, checkpoints and recovery logic rather than a single long-running request.
The application maintains an independent internal product catalog that acts as the reference layer for product comparison. This separates the business's own product identity from the constantly changing structures used by external sources.
Product catalogs can be imported from CSV or XLSX files. During import, common column variations are normalized so product names, codes, SKUs, categories, regular prices, discounted prices and stock quantities can be inserted or updated without rebuilding the catalog manually.
Product codes, SKUs and normalized names provide stable identifiers for matching and reporting.
Category names and hierarchical category paths allow large catalogs to be filtered and compared by business-relevant groups.
Internal price, discounted price and stock values become the baseline against which matched external records can be evaluated.
External product information is collected through source-specific adapters. Each adapter understands how to discover products and convert its source data into the application's canonical product representation.
The rest of the application does not need to understand those individual source formats. Once processed, products enter a shared data model containing normalized attributes such as product identity, category, current stock, stock status, regular price, discounted price, effective price, currency and discount information.
Discovery Runs
Periodic discovery identifies products that are not yet part of the monitored catalog.
Scheduled Updates
Existing records are refreshed automatically so price and stock data remain operationally useful.
Manual Product Processing
Individual product records can be added to the processing pipeline when an immediate check is required.
Source Isolation
Source-specific processing remains isolated so one integration does not dictate the behavior of another.
Current values are useful for answering what is available now. Historical snapshots are required to understand what changed.
The platform records a new snapshot when relevant product state changes, including stock, stock status, price, discounted price, effective price, discount percentage or currency. This creates a compact event history instead of repeatedly storing identical observations.
| Tracked Signal | Stored State | Operational Use |
|---|---|---|
| Stock | Previous and current quantities | Detect decreases, replenishment and availability changes |
| Stock status | Structured availability state | Distinguish confirmed quantities from unknown availability |
| Regular price | List price history | Identify commercial price movement |
| Discounted price | Active reduced price | Separate temporary commercial changes from standard pricing |
| Currency | Currency associated with the observed price | Prevent invalid comparisons between incompatible price values |
Each new snapshot is compared with the previous observation. This allows the application to derive additional operational signals from otherwise static product data.
Stock Change
Difference between the current and previous observed quantity.
Stock Increase
Positive inventory changes can be isolated as replenishment signals.
Estimated Sales
A decrease between two known stock observations can be treated as an estimated movement signal.
Estimated Value
Movement quantities can be evaluated against the effective observed product price.
These values are intentionally treated as derived intelligence rather than authoritative transaction data. A stock decrease can indicate product movement, but the system does not misrepresent an inferred quantity as a confirmed sales order.
Reliable comparison depends on identity resolution. Comparing two similarly named items without confirming that they represent the same product can produce misleading price and stock conclusions.
The matching layer therefore supports both assisted suggestions and explicitly confirmed relationships. Internal products can be connected to corresponding external products, while equivalent external products can also be grouped together across multiple data sources.
Internal codes and SKUs are normalized before being compared with external stock codes, providing a strong first-level matching signal.
When no exact code relationship exists, normalized product-name tokens are used to generate similarity candidates for review.
Confirmed product mappings are persisted so the system does not need to rediscover the same relationship every time a report is generated.
Equivalent products from several sources can be grouped into one comparison row, making side-by-side availability and movement analysis possible.
Once equivalent product records have been grouped, they can be represented as a single logical product row with source-specific values displayed side by side.
This makes it possible to inspect stock, estimated movement and replenishment activity without manually opening each individual product record.
| Logical Product | Source A | Source B | Source C | Aggregated Signal |
|---|---|---|---|---|
| Confirmed product group | Stock / Price | Stock / Price | Stock / Price | Movement / Comparison |
Matched products are also used to evaluate the position of the internal catalog against comparable external prices.
For compatible currencies, the reporting service calculates the lowest, highest and average observed external price and compares those values with the internal effective price.
Identifies the lower boundary of comparable matched pricing.
Shows the upper range of observed pricing for the same matched item.
Provides a reference point between available comparable prices.
Measures the difference between the internal effective price and the lowest matched price.
The reporting layer combines the internal product catalog with confirmed matches, allowing the application to produce business-oriented summaries rather than exposing raw collected records.
| Metric | Meaning |
|---|---|
| Product Count | Number of internal products within the selected filters |
| Stock Quantity | Aggregate internal stock quantity |
| Stock Value | Effective internal price multiplied by current stock |
| Potential Revenue | Current internal inventory evaluated at its effective price |
| Match Coverage | Number of external product relationships available for comparison |
| Price Position | Whether the internal price sits below, above or within the matched price range |
Large monitoring datasets become useful only when operators can move quickly from an aggregate signal to the individual product records responsible for it.
Product Search
Search by product name, product code, SKU or external stock code.
Category Filters
Filter products using normalized hierarchical category relationships.
Match Status
Separate products with confirmed external relationships from records still requiring matching.
Historical Product View
Drill into individual products to review recent stock and price snapshots.
Snapshot data is aggregated into time-series datasets for dashboard visualization. The application can represent stock, pricing and estimated movement over selected periods instead of limiting analysis to a single current value.
Review inventory movement across a selected reporting period.
Follow observed price movement while retaining currency context.
Aggregate estimated product movement from historical stock changes.
A major part of this project is the background-processing architecture. Product discovery and updates are not executed as one monolithic request. Work is distributed through Redis-backed queues so independent data sources can process jobs concurrently.
Each integration can have its own worker capacity and processing behavior. A slow source therefore does not need to block every other active data pipeline.
Independent Queues
Source-specific workloads remain isolated from each other.
Configurable Concurrency
Worker capacity can be adjusted according to workload and system resources.
Background Scheduling
Recurring update, discovery, retry and maintenance jobs run without manual intervention.
Workload Isolation
A long-running operation in one integration does not create a global single-job bottleneck.
Long-running data pipelines eventually encounter network failures, unavailable records, process interruptions or stale queue jobs. The application therefore treats recovery as part of normal system behavior.
Application-level locking prevents a second bulk run for the same data source from starting while an active run is still in progress.
A long-running job is not automatically considered failed. Recovery is triggered when progress itself becomes stale.
Temporary network or processing failures can be retried according to a controlled policy rather than being immediately discarded.
Processing checkpoints allow interrupted workloads to continue from their existing state instead of unnecessarily rebuilding an entire discovery run.
Background automation is useful only when its health can be verified. The application includes a dedicated system-health layer that provides visibility into the infrastructure responsible for keeping the data pipelines running.
Redis Health
Confirm that the queue infrastructure required by background processing is reachable.
Worker Health
Detect missing or stale worker supervisor heartbeats.
Scheduler Health
Verify that recurring automation is still being triggered as expected.
Pipeline Health
Monitor pending, active, stale and failed processing records.
Although the application replaces repetitive spreadsheet-based monitoring, spreadsheets remain useful as an interchange and analysis format.
Product views can therefore be exported to XLSX while the internal catalog itself can be maintained through structured CSV/XLSX imports. This allows the application to integrate into existing operational workflows without making Excel the primary database.
The application is designed as a private operational system rather than a public storefront. Application screens require authentication, and there is no public self-registration workflow.
It can operate in a controlled local or private environment where background workers, Redis and scheduled tasks start automatically, allowing non-technical users to interact with the browser-based interface without manually managing command-line processes.
Layer 1
Source adapters, product discovery and scheduled refresh operations.
Layer 2
Redis queues, isolated workers, retries, locking and recovery.
Layer 3
Normalization, snapshots, matching, stock movement and price metrics.
Layer 4
Comparison matrices, product reports, charts, filtering and exports.
Layer 5
Authentication, health monitoring, scheduling and maintenance.
PHP 8.3+ & Laravel 13
Application services, domain models, scheduling, authentication and background workloads.
Livewire
Interactive server-driven application interfaces.
Redis & Dedicated Queues
Parallel asynchronous data processing and workload isolation.
TailwindCSS 4 & Flowbite 4
Responsive operational interface and reusable UI components.
Chart.js
Historical stock, price and movement visualization.
CSV / XLSX Integration
Internal catalog import and operational report export workflows.
Snapshot-Based History
Change-aware historical persistence for price and stock state.
Runtime Monitoring
Worker, scheduler, Redis, queue and stale-processing health visibility.
The most important part of this project is not data collection itself. The engineering value comes from turning independently structured and continuously changing product records into a stable operational model.
Product normalization creates a common language. Snapshot history makes change measurable. Product matching makes cross-source comparison trustworthy. Queue isolation makes the acquisition layer scalable. Recovery mechanisms keep the system useful when individual operations fail. Reporting then converts those technical capabilities into information that can support inventory, pricing and purchasing decisions.
This architecture is particularly relevant to B2B operations that need supplier inventory visibility, product availability monitoring, purchasing intelligence, price comparison, catalog normalization or automated stock tracking across systems that do not provide one consistent data interface.
Explore more projects showcasing CRM, ERP, and API integration work.
A deep-dive into TermiNode and GIS application architecture for geofencing, delivery zones, logistics, field operations,...
View details
Vinoks is a large factory in Istanbul, Turkey, that produces stainless steel kitchen and bathroom equipment. A web appli...
View details
Savory Cafe is a multi-tenant digital management platform for F&B businesses. It delivers real-time order processing, ca...
View detailsShare the current workflow and systems involved to get a practical direction for scope, integrations and a useful first release.
Typical response within 24 hours · Clear scope & timeline · Documentation included