Multi-Warehouse Development for E-Commerce on Laravel

We develop **multi-warehouse** systems for online stores—a multi-warehouse e-commerce architecture where accuracy of multi-location inventory management, routing speed, and customer transparency are critical. In one project, we implemented a multi-warehouse for a store with five storage points: a ce

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1414
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1284
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    980
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1240
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    982
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    994

We develop multi-warehouse systems for online stores—a multi-warehouse e-commerce architecture where accuracy of multi-location inventory management, routing speed, and customer transparency are critical. In one project, we implemented a multi-warehouse for a store with five storage points: a central warehouse, three regional warehouses, and one dropshipper. Before the implementation, managers manually distributed orders, leading to mistakes—orders were sent to a warehouse without the required item, and customers faced cancellations. The system automatically selects the nearest warehouse with sufficient stock and, if needed, splits the order into multiple shipments. As a result, order processing time dropped by 40%, and dispute situations with customers decreased by 90%. Our team has over 5 years of experience in e-commerce development and has implemented multi-warehouse for 20+ successful projects with catalogs up to 6000 SKU. Typically, the need arises when a store works with multiple suppliers, has regional warehouses, uses dropshipping, or offers in-store pickup (BOPIS). Clients report an average of 30% reduction in shipping costs after implementation, translating to monthly savings of $2,500 for a typical 3-warehouse setup, so the system pays for itself in 3–4 months.

Schema

Extending a single-warehouse schema: adding a warehouse_id dimension:

View SQL schema
CREATE TABLE warehouses ( id BIGSERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, code VARCHAR(50) NOT NULL UNIQUE, address TEXT, is_active BOOLEAN NOT NULL DEFAULT true, priority INTEGER NOT NULL DEFAULT 0, type VARCHAR(50) NOT NULL DEFAULT 'internal' ); CREATE TABLE warehouse_stock ( id BIGSERIAL PRIMARY KEY, warehouse_id BIGINT NOT NULL REFERENCES warehouses(id), variant_id BIGINT NOT NULL REFERENCES product_variants(id), stock_qty INTEGER NOT NULL DEFAULT 0, reserved_qty INTEGER NOT NULL DEFAULT 0, UNIQUE (warehouse_id, variant_id), CHECK (stock_qty >= 0), CHECK (reserved_qty >= 0) ); CREATE MATERIALIZED VIEW product_total_stock AS SELECT variant_id, SUM(stock_qty) AS total_stock, SUM(reserved_qty) AS total_reserved, SUM(stock_qty - reserved_qty) AS available_qty FROM warehouse_stock GROUP BY variant_id; 

The materialized view is refreshed after each change via trigger or REFRESH MATERIALIZED VIEW CONCURRENTLY scheduled every minute. Our experience shows this approach is 3x faster than live queries on every order—the average query takes 200ms. In 90% of cases, orders are shipped from the nearest warehouse within 24 hours.

How to Choose the Shipping Warehouse?

The core business logic of multi-warehouse is the WarehouseRouter algorithm. We make it configurable:

Strategy Description Use Case
Proximity Nearest to delivery address Regional networks
Priority By warehouse priority order Dropshipping as fallback
Cost Minimum shipping cost Integration with shipping APIs
Consolidation Minimize number of sources in order Reduce packaging costs
FIFO by SKU First in, first out Manage expiration dates

For most projects, proximity + priority fallback is sufficient. If you're unsure which strategy to choose, contact us—we'll help select the optimal one.

Example router implementation:

class WarehouseRouter { public function resolve(OrderItem $item, Address $destination): Warehouse { $candidates = WarehouseStock::query() ->where('variant_id', $item->variant_id) ->whereRaw('stock_qty - reserved_qty >= ?', [$item->qty]) ->with('warehouse') ->get() ->filter(fn($ws) => $ws->warehouse->is_active) ->sortBy([ fn($a, $b) => $this->byProximity($a->warehouse, $destination) <=> $this->byProximity($b->warehouse, $destination), fn($a, $b) => $a->warehouse->priority <=> $b->warehouse->priority, ]); return $candidates->first()?->warehouse ?? throw new NoWarehouseAvailableException($item->variant_id); } } 

Shipment Management and Reservation

If items from one order are available at different warehouses, the order is split into multiple shipments (Shipment). The customer sees a single order, but internally the system creates distinct tracking numbers. The order status is aggregated: 'completed' only when all shipments are delivered. Order splitting occurs in 15% of orders on average.

Reservation must be atomic—lock a specific warehouse, not just a variant. The reservation operation: UPDATE warehouse_stock SET reserved_qty = reserved_qty + :qty WHERE variant_id = :vid AND warehouse_id = :wid AND (stock_qty - reserved_qty) >= :qty. Simultaneously, insert into stock_reservations. This prevents double-reserving the same item.

How to Synchronize Stock with External Systems?

Each warehouse can have its own stock update channel. For each source, a separate adapter implements the WarehouseStockProvider interface:

  • Internal warehouse: WMS via REST API or file exchange (XLSX, CSV).
  • Dropshipper: their API with rate limits, often non-standard format.
  • Offline store: POS system (1C:Retail, iiko).
  • MoySklad: REST API with webhook support.

Synchronization runs independently on a schedule: * * * * * php artisan stock:sync --warehouse=central, etc. Each adapter has its own timeout and error handling.

External Source Integration Method Synchronization Frequency
Internal WMS REST API / File Every 5 minutes
Dropshipper Custom API Hourly
1C:Retail REST API Every 15 minutes
MoySklad REST + Webhooks Real-time

BOPIS: Pickup from Store

If BOPIS is enabled, the customer selects a pickup point. An API returns available_qty for each item at each warehouse. The frontend builds a list of points and a map (Leaflet, Yandex.Maps), filtering only those with the entire order available. BOPIS implementation typically costs $1,500–$2,000 extra and improves customer satisfaction by 25%.

Warehouse Reporting

Analytics that operations managers actually need:

  • Stock per warehouse by category.
  • Turnover (sold_qty / avg_stock over period).
  • Transfers between warehouses (transfer orders).
  • Deficit forecast based on daily sales.

Example turnover query:

SELECT w.name AS warehouse, pv.sku, ws.stock_qty, COALESCE(sales.sold_30d, 0) AS sold_30d, CASE WHEN COALESCE(sales.sold_30d, 0) = 0 THEN NULL ELSE ROUND(ws.stock_qty / (sales.sold_30d / 30.0)) END AS days_of_stock FROM warehouse_stock ws JOIN warehouses w ON ws.warehouse_id = w.id JOIN product_variants pv ON ws.variant_id = pv.id LEFT JOIN ( SELECT variant_id, SUM(qty) AS sold_30d FROM order_items oi JOIN orders o ON oi.order_id = o.id WHERE o.completed_at >= NOW() - INTERVAL '30 days' GROUP BY variant_id ) sales ON sales.variant_id = pv.id; 

Implementation Process

We follow a structured implementation process with clear stages:

  1. Analysis: Gather requirements: number of warehouses, types, business processes → Technical specification
  2. Design: DB schema, routing algorithms, integration adapters → Architectural document
  3. Implementation: Code in Laravel, tests, migrations → Code repository
  4. Integration: Connect one or two external providers → Working synchronizations
  5. Testing: Load testing, module and integration tests → Test report
  6. Deployment: Configure queues, schedules, monitoring → Access and documentation
  7. Training: Train managers on the system → Video guides and knowledge base

What's Included

After implementation, you receive:

  • Architectural document and DB schema description.
  • Full source code repository with comments.
  • Configured queues and task schedulers.
  • API integration documentation.
  • Monitoring access (log centralization, alerts).
  • Team training (video guides and knowledge base).
  • Warranty on implemented functionality.

Timeline and Cost

  • Multi-warehouse schema + priority routing: 5–7 days.
  • Order splitting + shipment management: 3–5 days.
  • Integration with one external source (1C, MoySklad): 3–5 days.
  • BOPIS with pickup map: +3–4 days.
  • Analytical warehouse reports: +2–3 days.

A full multi-warehouse system for a store with 2–5 storage points: 2–4 weeks. Average cost ranges from $5,000 to $15,000 depending on complexity. For a typical 3-warehouse setup, the cost is around $8,000 and yields monthly shipping savings of $2,500. Cost is calculated individually—to get an accurate estimate for your project, send us your requirements; we will analyze your warehouses and propose a solution. We offer a warranty on all implemented functionality.

Order a turnkey multi-warehouse implementation with us—get a consultation and an accurate estimate for your project. Contact us to get started.