Multi-Warehouse Inventory Management: A Practical Guide for D2C & FMCG Brands
The day you open a second warehouse, every inventory question splits in two. A SKU no longer has one stock level — it has a stock level, a batch profile, a Days On Hand figure, and an ageing curve per location. This guide walks through the warehouse-level mechanics that keep a multi-warehouse operation honest: rack locations, batch and expiry tracking, FIFO picking, cycle counts, gatepasses, 3PL visibility, and the reports that tie it together.

Key Takeaways
- ✓A second warehouse does not add inventory work — it multiplies it. Every SKU now carries a stock level, a batch and expiry profile, and a Days On Hand (DOH) figure per location.
- ✓Rack locations turn picklists into walkable instructions: FilFlo allocates stock FIFO by inward date and tells the picker exactly which rack and which batch to pull.
- ✓The inventory ledger keeps one invariant at every warehouse — total = available + allocated, at product + rack + batch grain — so every cycle-count variance is explainable, not mysterious.
- ✓3PL warehouses stay visible through per-node stock refresh and status webhooks: FilFlo pushes order events to the 3PL's WMS, and the WMS's status updates drive order transitions back.
- ✓The Warehouse Insight report shows stock, billed, and ordered quantities per warehouse with DOH, so replenishment and inter-warehouse transfers are decided on consumption math, not gut feel.
Short Answer
Multi-warehouse inventory management works when every location keeps the same discipline: stock is inwarded with batch, MFG, and expiry dates; held at named rack locations; allocated FIFO by inward date when a picklist is created; verified at dispatch with case-level scanning; and counted on a cycle with maker-checker approval. Once that discipline exists, the network-level reports — DOH per warehouse, shelf-life buckets per SKU per warehouse, In-Transit Ageing — become trustworthy enough to act on.
This article walks through those mechanics in roughly the order a brand sets them up in FilFlo. If you are looking for the strategic picture — why quick commerce, modern trade, and GT distribution force a multi-node network in the first place, and how state-wise GSTIN invoicing fits in — read the companion piece on the multi-location inventory revolution.
Why Multi-Warehouse Inventory Gets Hard
With one warehouse, a spreadsheet almost works. The ops lead knows roughly what is on the floor, the picker knows where things are kept, and when a count looks wrong someone walks over and checks. With three warehouses — say an own facility in Haryana plus 3PL nodes in Bhiwandi and Bangalore — none of that transfers. The same SKU can be ageing toward expiry in one warehouse, selling out in another, and sitting inside a truck between the two. Nobody can walk over and check.
The failure pattern is predictable. Each warehouse keeps its own sheet, updated at its own rhythm. Stock levels are reconciled over WhatsApp. A Blinkit PO gets approved against stock that was actually dispatched yesterday, the shortfall surfaces at picking, the line gets cut, and the cut shows up weeks later as a fill-rate penalty. Meanwhile a batch of the same SKU crosses 50% of its shelf life in the other warehouse because nobody was watching its expiry date at that location.
The Four Questions Every Multi-Warehouse Operation Must Answer Daily
- Where exactly is it? Not just which warehouse — which rack, and which batch with which MFG/EXP dates.
- How much of it is actually promisable? Available vs allocated: stock reserved against open picklists cannot be promised again.
- How long will it last here? Days On Hand per warehouse, against that warehouse's own consumption — not a blended national average.
- Is it ageing out? Remaining shelf life per batch per warehouse, because a quick-commerce buyer will refuse stock past their acceptance window.
Step 1: Model the Network — Warehouse Locations, Rack Locations, Case Sizes
Everything downstream depends on master data. In FilFlo, each physical facility — your own warehouse or a 3PL ship-from node — is a Warehouse Location. Inside each warehouse, storage is broken into rack locations. A rack is not decoration: it is the address on every ledger entry and every picklist line. When the system later says "pick 12 cases of the 500ml SKU from rack A-14, batch expiring November," that instruction only exists because the rack was modelled up front.
The product master carries the fields that make warehouse math work: SKU code, EAN, HSN and tax rate, MRP, unit of measure, and — critically for B2B dispatch — case size. FilFlo tracks B2B quantities in case units and converts to unit items (quantity × case size) where the channel needs units, such as GRN entry. Get case size wrong on the master and every downstream count is wrong by a multiple.
Three Views of the Same Stock
FilFlo's Product Inventory screen shows each warehouse's stock three ways, because three different people need it three different ways:
Step 2: Batch, MFG/EXP, and Shelf-Life Buckets per Warehouse
For an FMCG brand, stock without a batch identity is a liability. Every inward into a FilFlo warehouse — whether entered manually, received against a procurement PO, or bulk-loaded by CSV — records the batch, manufacturing date, and expiry date alongside the rack. The Inventory Inward log keeps the full history: what came in, into which rack, against which reference, entered by whom.
Batch tracking earns its keep through shelf-life buckets. FilFlo compares each batch's MFG/EXP dates against the SKU's total shelf life and classifies the remaining life into four bands — 0–25%, 25–50%, 50–75%, 75–100% — per SKU, per warehouse. That table answers the question a supply planner actually asks: which stock, in which city, needs to move before it ages out? Quick-commerce buyers enforce acceptance windows on remaining shelf life, so a batch sliding toward the 25–50% band is a candidate to push to Blinkit or Zepto now, at full price, rather than write off later. Batches close to expiry show their EXP dates flagged in red, and a single order line can split across batches with different MFG/EXP dates when that is what it takes to fill it.
This is the working definition of FEFO/FIFO inventory software for food and beverage: first-in-first-out allocation by default (covered next), with expiry visibility per warehouse so the ageing exceptions get handled deliberately instead of being discovered at a channel's receiving dock.
Step 3: FIFO Picking and an Inventory Ledger That Cannot Drift
When an approved B2B order becomes a picklist, FilFlo generates FIFO rack allocations by inward date: the oldest inwarded stock is reserved first, across whatever racks and batches it sits in. The picker gets rack-by-rack instructions; if there is not enough stock, the shortfall is recorded per line — requested, allocated, shortfall — instead of being silently absorbed. Scan-verified picking modes (scan the EAN per line, or scan-first) exist for warehouses that want the extra guardrail.
Underneath all of it sits the inventory ledger, which enforces one invariant at every warehouse: total = available + allocated, tracked at product + rack + batch grain. Allocation moves stock from available to allocated; dispatch writes the outward; a cancelled picklist deallocates. Every one of those movements — inward, allocation, outward, deallocation, adjustment — lands in the Inventory Logger with the available-after balance and the person or process that caused it. When a number looks wrong, you do not re-count first; you read the ledger.
Move Stock: Rack-to-Rack Without Losing the Trail
Warehouses reorganize constantly — consolidating part-pallets, freeing fast-picking racks, staging for a big dispatch day. FilFlo's Move Stock action shifts quantities rack-to-rack inside a warehouse while preserving batch identity and writing both sides of the move to the ledger. The physical layout can change daily; the audit trail does not break.
Step 4: QR-Coded Cases and Dispatch Scan Verdicts
Picking errors are cheap to make and expensive to discover — a wrong case that leaves the warehouse comes back as a GRN mismatch, a deduction, or an RTO. FilFlo closes that gap at the dock. Physical cases carry QR codes, and each case moves through its own status chain: available → allocated → picked → dispatched.
At dispatch, the loader scans each case with a camera scanner (or keys in the case code manually). Every scan returns an immediate verdict:
Per-Scan Verdicts at the Dock
A successful dispatch scan flips the case to dispatched and writes the outward ledger entry in the same motion. Across multiple warehouses this matters doubly: the wrong-case error you prevent in Bhiwandi is one your Bangalore team never has to explain on a GRN call.
Step 5: Cycle Counts with Maker-Checker Approval
Even a disciplined warehouse drifts from its system numbers — damage, pilferage, miscounts at inward, expiry write-offs. The fix is not an annual stock-take that shuts the warehouse for two days; it is a rolling cycle count, and in a multi-warehouse setup it is the main instrument HQ has for trusting numbers it cannot physically see.
FilFlo's Count Adjustment flow is deliberately two-person. The counter enters the physical quantity for a product at a rack; the system computes the variance against the ledger automatically and requires a typed reason — damage, theft, count_error, expiry, other. The adjustment is submitted as pending; a second, senior user approves or rejects it, with before/after snapshots preserved. That maker-checker gate is what stops "adjust the number until it matches" from becoming warehouse culture. Over a quarter, the variance-reason distribution per warehouse is itself a management report: a site whose adjustments skew to theft or damage has a different problem from one that skews to count_error.
Step 6: Stock Transfers Between Warehouses — Gatepasses and In-Transit Ageing
Sooner or later the DOH numbers will tell you to move stock: 68 days of cover in Delhi, 6 in Bangalore. In FilFlo, non-order stock movements — transfers, samples — leave a warehouse through a gatepass, with its own lifecycle: Pending → Approved → Allocated → Picked. Nothing exits the building on a verbal instruction; the gatepass is the authorization, and the outward hits the source warehouse's ledger the moment it is picked.
While the truck is on the road, the shipment appears in In-Transit Ageing — the report that stops in-between stock from disappearing from everyone's mental model. In-transit visibility also protects your buying: FilFlo's replenishment math counts on-hand plus in-transit before recommending a purchase, so you do not double-buy stock that is already moving toward the warehouse that needs it. On arrival, the receiving warehouse inwards the goods with batch and rack details, and the network picture is whole again.
Step 7: 3PL Inventory Visibility Without Rip-and-Replace
Most growing brands do not own all their warehouses — they rent capacity from 3PLs, and each 3PL runs its own WMS. The practical question is not "which single system does everyone use" but "how does the brand keep one operating picture across systems it does not control." FilFlo handles this with two patterns, both live in production deployments:
Webhook Integration with the 3PL's WMS
For 3PLs on a modern WMS (an Emiza Atlas-style setup), FilFlo pushes order events outbound on status transitions, and the WMS's status webhooks drive order transitions back — the WMS marking a shipment shipped moves the FilFlo order to In Transit. Retries, dead-letter handling, and signature-validated inbound receipts are part of the webhook hub, so a dropped message is a logged exception, not a silent gap.
Per-Node Stock Refresh
For multi-node D2C fulfilment (Prozo/JWL-style), FilFlo pulls a stock refresh per 3PL node, so each node's inventory shows up as its own warehouse in the network view. One brand can run its own factory warehouse plus several 3PL nodes and see them side by side, each with its own stock, allocations, and DOH.
There is a third, lower-tech pattern that matters just as much: people. 3PL staff can work inside the brand's FilFlo workspace with scoped roles — they see and act on their warehouse only — and a scoped API key lets a 3PL confirm delivery or enter GRN programmatically without getting access to anything else. The brand's ops team and the 3PL's floor team end up looking at the same order, the same picklist, the same ledger.
Step 8: Read the Warehouse Insight Report — Days On Hand per Warehouse
With the mechanics in place, the network becomes readable. The Warehouse Insight report lays out, per warehouse: stock on hand, quantities billed, quantities ordered, and DOH — Days On Hand. DOH is the number that makes warehouses comparable: 300 units might be three weeks of cover in Delhi and three days in Mumbai, and only DOH tells you which.
The same consumption math drives buying. FilFlo's Procurement Alerts compute days left per SKU from actual run-rate — an alert reads "10.5 days left" with a suggested, editable order quantity and the default supplier's last price. The safety floor behind it is deliberately simple and inspectable: 2 × inward TAT × daily run-rate. If your supplier takes 15 days to deliver and the SKU sells 40 units a day, the floor is 1,200 units; when on-hand plus in-transit falls below two inward-TATs of demand, it is time to reorder, rounded up to MOQ or pack size. No black box — a formula your ops head can check on a napkin.
Read together, the reports settle the classic multi-warehouse arguments with data: whether to transfer or reorder (compare DOH against inward TAT — transfers fix imbalances faster than new POs), which warehouse gets constrained stock (the one whose DOH runs out first against committed orders), and which ageing batch goes to quick commerce this week (the shelf-life bucket table, per warehouse).
Putting It Together: A Typical Multi-Warehouse FilFlo Setup
Here is how D2C and FMCG brands with multiple warehouses typically structure their FilFlo workspace for B2B distribution:
| Location type | Who manages it | FilFlo features used |
|---|---|---|
| Own warehouse (Haryana) | HQ ops team | Procurement POs, supplier GRN, rack locations, cycle counts, gatepass transfers out |
| 3PL node (Bhiwandi) | 3PL staff, scoped role | Picklists with FIFO allocations, dispatch scanning, delivery confirmation via API key |
| 3PL node (Bangalore) | 3PL staff, scoped role | Per-node stock refresh, B2B order fulfilment, GRN entry |
| HQ / Finance | Finance team | Warehouse Insight (DOH), In-Transit Ageing, Sales Loss, fill-rate reports, party ledger |
Role scoping means each warehouse team only sees and acts on its own location's orders and stock — no risk of one site approving or dispatching another site's orders — while HQ keeps the consolidated view for reporting, replenishment, and transfer decisions. Brands like Jimmy's Cocktails run this pattern across state warehouses feeding modern trade and quick commerce; Anveshan runs it from its own factory through multiple 3PL fulfilment nodes.
A Working Checklist for Multi-Warehouse Discipline
- ✓Every inward carries batch, MFG date, expiry date, and a rack — no anonymous stock.
- ✓Picklists allocate FIFO by inward date; shortfalls are recorded per line, never absorbed silently.
- ✓Dispatches are scan-verified at case level; a wrong_picklist verdict at the dock beats a GRN mismatch two weeks later.
- ✓Cycle counts run weekly per zone with maker-checker approval and typed variance reasons.
- ✓Inter-warehouse transfers move on gatepasses and stay visible in In-Transit Ageing until inwarded.
- ✓Replenishment and transfer decisions start from DOH per warehouse and the 2 × inward TAT × run-rate safety floor.
Frequently Asked Questions
How does FilFlo track inventory across multiple warehouses?
Each warehouse is set up as a Warehouse Location (including 3PL ship-from locations), and inside each warehouse stock is held at rack locations with batch, MFG date, and expiry date. Product Inventory can be viewed By Rack, By Product, or By Age, and the Warehouse Insight report shows stock, billed, and ordered quantities per warehouse with Days On Hand (DOH) so you can compare cover across the network.
Can FilFlo track batch and expiry dates per warehouse?
Yes. Every inward records batch, manufacturing date, and expiry date, and the By Age view shows batch ageing per warehouse. Each batch is also classified into remaining shelf-life buckets (0-25%, 25-50%, 50-75%, 75-100%), per SKU per warehouse, which is the practical input for pushing ageing batches to quick-commerce channels before they cross a buyer's acceptance window.
How do stock transfers between warehouses work in FilFlo?
Non-order stock movements leave a warehouse through a gatepass, which goes through a Pending → Approved → Allocated → Picked lifecycle so nothing exits without authorization. The outward is written to the inventory ledger at the source, the shipment shows up in In-Transit Ageing while it moves, and the receiving warehouse records an inward with batch and rack details on arrival.
How does FilFlo get stock levels from a 3PL warehouse?
Two ways, depending on the 3PL. For 3PLs running their own WMS (an Emiza Atlas-style integration), FilFlo pushes order events outbound via webhooks and the WMS's status webhooks drive order transitions back — for example the WMS marking a shipment shipped moves the FilFlo order to In Transit. For multi-node D2C setups (Prozo/JWL-style), FilFlo pulls a per-node stock refresh from the 3PL. 3PL staff can also work inside FilFlo directly with scoped roles, or confirm delivery and enter GRN through a scoped API key.
What is the difference between available and allocated stock in FilFlo?
Available stock can still be promised to new orders; allocated stock is already reserved against a picklist. The inventory ledger enforces one invariant at every warehouse: total = available + allocated, tracked at product + rack + batch grain. Every movement — inward, allocation, outward, deallocation, adjustment — is a ledger entry with the available-after balance and the person who performed it.
Ready to Run Every Warehouse on the Same Ledger?
Rack-level stock, batch and expiry tracking, FIFO picking, cycle counts, and DOH per warehouse — with your 3PLs plugged in instead of ripped out.