The Bangladesh Cold Storage Business Model
Bangladesh has one of the world's more distinctive cold storage sectors, built almost entirely around a single crop: potato. The country has roughly 400 registered cold storages with a combined capacity well past 5 million metric tons, concentrated in Munshiganj, Bogura, Rangpur, Joypurhat, and Comilla, and the overwhelming majority of that capacity is potato-only, seasonal, single-purpose. The Bangladesh Cold Storage Association (BCSA) and the Department of Agricultural Marketing (DAM) both track capacity and tariff data by district, and the Bangladesh Agricultural Development Corporation (BADC) has its own certified seed potato storage requirements that some larger facilities also serve.
The business model is fundamentally a bailment, not a sale. A farmer or a potato trading intermediary (locally called a faria or arotdar in the broader agri trade sense, though cold storage depositors are typically farmers and small traders directly) harvests or buys potato in March and April, deposits it in bags at a himagar, and pays a season-long storage rent, typically withdrawing between August and November when market prices for stored potato rise well above the harvest-glut price. The storage operator never buys or sells the potato itself, its revenue is entirely the per-bag storage fee, sometimes supplemented by loading, weighing, and bag-handling charges.
This is a meaningfully different operating pattern from the agro-processing plants covered in Odoo for Food, Beverage & Agro-Processing Bangladesh, which own their raw material and convert it into a finished product. A cold storage operator converts nothing. Its entire value proposition is safekeeping, temperature control, and honest recordkeeping across a single, intensely seasonal seven-to-eight-month cycle.
The storage operator's ledger is not an inventory record. It is closer to a bank's deposit book, where every bag is someone else's asset and the operator's only job is proving, on demand, exactly whose it is.
Why Standard Inventory Ownership Breaks Here
Odoo's inventory module, like nearly every ERP inventory model, defaults to the assumption that stock sitting in your warehouse is your stock: it hits your balance sheet, your valuation layer, your stock ledger. That assumption is correct for a trading company or a manufacturer and completely wrong for a cold storage operator. If a himagar's Odoo instance is configured naively, with potato simply received into stock like any purchased raw material, two things go wrong quickly. First, the storage company's balance sheet inflates with inventory value it does not own and has no right to sell, which distorts every financial ratio and makes bank financing conversations (cold storages are frequently financed against seasonal working capital lines from Bangladesh Krishi Bank and commercial bank agri-lending desks) harder to have cleanly. Second, and more dangerous operationally, there is no structural separation between "stock the company owns" and "stock the company merely holds," which means a data entry mistake can genuinely blur whose potato is whose.
The correct configuration uses Odoo's consignment stock capability: under Inventory > Configuration > Settings, enabling the "Consignment" / multi-owner stock feature allows every stock quant and stock move to carry an owner field distinct from the company operating the warehouse. Every intake transaction records the depositor as the owner of that specific quant from the moment the bags cross the gate. The storage company's own books show zero inventory value for potato stock (correctly, since it owns none), while Inventory > Reporting still gives full visibility into what physically sits in each chamber, filterable by owner. This is the single most important configuration decision in a cold storage Odoo build, and it is also the step most local "quick Odoo setup" vendors skip, because it does not show up as a problem until the first bank auditor or the first depositor dispute forces the question.
Note: Consignment/multi-owner stock in Odoo requires the underlying warehouse routes and valuation settings to be configured consistently across every chamber location, not just enabled globally. A partial rollout (some chambers configured for owned stock, others for consignment) is a common cause of reporting confusion during early implementations, and the fix is a deliberate one-time location audit before go-live rather than a patch after the first season closes.
The Farmer Deposit/Bond Ledger in Odoo
Every depositor's intake becomes a lot record under Inventory > Products > Lots/Serial Numbers, created at the weighbridge or intake counter with the depositor set as the stock owner, the intake date, the gross weight, the bag count, and the chamber/rack location assigned. In practice, this lot is the digital equivalent of the paper bond slip (locally often called a rosid or deposit receipt) that Bangladesh cold stores have issued to farmers for decades, except the lot record in Odoo can be looked up instantly, cross-referenced against the depositor's running balance, and cannot be physically lost or altered the way a paper slip in a farmer's pocket can.
Because Odoo lots support partial delivery, a depositor who brought in 300 bags in April and wants to withdraw 80 in September is processed as a partial delivery against that lot, correctly leaving 220 bags still attributed to him at his original intake weight basis (adjusted for the shrinkage allowance discussed below), still in the same chamber and rack. This lot-per-depositor structure is what makes season-end reconciliation, matching total intake against total withdrawal plus remaining stock plus documented shrinkage, an actual report instead of a week of manual register cross-checking that historically consumed himagar office staff every November.
Depositor as Partner
Every farmer/trader is a contact record with a running deposit and withdrawal history visible on their partner ledger, not a name scribbled in a register.
Lot per Intake Batch
Each intake transaction is its own lot, tagged by chamber, rack, weight, and bag count, never merged with another depositor's stock.
Partial Withdrawal Support
Depositors rarely withdraw everything at once. Odoo tracks the remaining balance per lot after each partial pickup.
Digital Bond Slip
A printable deposit receipt generated from the lot record replaces the handwritten rosid, reducing disputes at withdrawal.
Chamber and Room Capacity Tracking
A cold storage facility is physically organized into chambers (rooms), each with a fixed capacity measured in bags or metric tons and a specific temperature/humidity band appropriate for potato (typically maintained around 2 to 4 degrees Celsius with controlled humidity to slow sprouting and moisture loss). In Odoo, each chamber is modeled as a stock location under Inventory > Configuration > Locations, structured as a child of the warehouse with its own capacity attribute tracked either through a custom field or through a simple maximum-quantity rule enforced at putaway.
This matters commercially, not just operationally: cold storage tariffs are a function of capacity utilization, and a facility operating at 60 percent of chamber capacity mid-season while turning away new depositors because the intake team lost track of which racks are actually free is a real, recurring revenue leak in facilities still running paper-based intake. Odoo's putaway rules can direct incoming lots to the least-utilized available chamber automatically, and Inventory > Reporting gives management a live capacity utilization view per chamber rather than a physical walk-through count, which during peak April intake (when trucks queue at the gate and every hour of delay costs the farmer additional field-drying risk) is the difference between smooth intake and a bottleneck.
| Chamber Attribute | Odoo Configuration Point | Why It Matters |
|---|---|---|
| Capacity (bags/MT) | Location custom field + putaway max-qty rule | Prevents overbooking a chamber past its safe physical/thermal load |
| Temperature zone | Location tag/category | Some chambers run different setpoints for seed potato vs table potato |
| Rack/row position | Sub-location under chamber | Lets staff and depositors locate a specific lot physically without a manual search |
| Utilization % | Inventory > Reporting, filtered by location | Live view of sellable remaining capacity during intake season |
Do not model every physical rack as its own Odoo location on day one. Model at the chamber level first, get one full season of clean data through the system, then subdivide into racks in year two if the operational team genuinely needs rack-level granularity. Over-modeling location hierarchy before staff are comfortable with the basic intake and withdrawal flow is the most common reason cold storage Odoo rollouts stall during their first peak season.
Shrinkage and Weight Loss During Storage
Potato loses weight in storage through moisture evaporation and respiration, a physical reality every depositor and every storage operator in Bangladesh already understands informally, typically discussed as a shrinkage allowance in the 8 to 12 percent range across a full seven-to-eight-month season, varying with chamber humidity control quality and how long a specific lot actually sits before withdrawal. The dispute this creates without proper records is predictable: a farmer who deposited 300 bags at 50 kg each expects close to 15,000 kg back (minus a shrinkage he accepts as normal), and if the storage operator cannot show a documented, dated shrinkage calculation, an argument over exact withdrawal weight is inevitable, and in a business built on repeat annual depositors, unresolved disputes cost the facility its next season's customers.
In Odoo, shrinkage should be recorded as a scheduled, documented inventory adjustment rather than left to surface as an unexplained discrepancy at withdrawal. A practical approach: run a monthly or bi-monthly scrap/adjustment entry against active lots under Inventory > Operations > Adjustments, applying an agreed shrinkage percentage (ideally validated against periodic sample re-weighing of a subset of lots) tagged with a reason code and date. This produces an audit trail showing exactly when and why each lot's recorded weight declined, which the storage operator can show a depositor at withdrawal time as a defensible, non-adversarial number rather than a number that only appears the day the farmer comes to collect his stock.
The Seasonal Billing Cycle
Cold storage rent in Bangladesh is charged per bag (or per maund, in facilities still using the traditional unit) for the storage period, with the tariff typically set for the full standard season and a different, usually higher, per-bag rate applied for early withdrawal within the first months or extended storage beyond the standard season end. This creates two accounting realities that a naive monthly-subscription billing setup handles badly. First, most cash actually arrives in a concentrated window between August and November as depositors settle their bill at withdrawal, not evenly across the year. Second, the rent income was genuinely earned month by month as the potato sat in the chamber, which matters for an accurate profit and loss statement rather than one that shows eight months of near-zero revenue against fixed electricity, refrigeration, and staff costs, followed by one enormous month.
The correct Odoo structure ties each depositor's lot to a sales order line with a defined per-bag tariff and a deferred revenue schedule, so accounting recognizes rent income progressively across the storage duration under Accounting > Configuration > Deferred Revenue, while the actual customer invoice and cash collection happen at withdrawal against the accumulated balance. For depositors who pay a partial advance at intake (common practice at several larger facilities to secure the season's capacity commitment), that advance is recorded against the sales order as a deposit rather than immediate revenue, drawn down at final settlement.
Refrigeration compressor electricity is the single largest recurring operating cost for a Bangladesh cold storage and runs continuously through the season regardless of when depositors pay, which means the facility's cash flow position between April and July (potato sitting, compressors running, almost no cash coming in) is structurally tight even for a profitable operator. Odoo's cash flow forecast reporting, built from the deferred revenue schedule against the known fixed cost run rate, gives management an honest picture of this seasonal trough rather than being surprised by it every year.
Withdrawal, Gate Pass, and Settlement
Withdrawal is the highest-stakes operational moment in the whole cycle: potato bags physically leave the facility, and once they do there is no undoing an error in quantity, weight, or billing. A disciplined Odoo withdrawal flow requires the outstanding balance on the depositor's account (accumulated rent plus any handling charges) to be settled, or a clearly agreed partial-settlement exception approved, before the delivery order for that lot is validated and a gate pass generated. Building this as a hard sequence, rather than a soft reminder a busy gate clerk can skip during the November withdrawal rush when trucks are queued and depositors are impatient, is what prevents the recurring problem of stock leaving the facility against an unpaid or under-paid balance.
The gate pass itself, generated from the validated delivery order, should show the depositor name, lot reference, original intake weight and bag count, applied shrinkage, net withdrawal quantity, and settled amount, giving both the depositor and any checkpoint or transport documentation a single verifiable document instead of a hand-written chit. For facilities also handling seed potato under BADC certification requirements, this same document trail supports the additional traceability BADC periodically requests during certification audits.
Reporting Owners Actually Need
Beyond individual lot tracking, the reports that matter to a himagar owner or the managing partners of a cold storage company are aggregate ones: total capacity utilization by chamber across the season, total tonnage still outstanding (deposited but not yet withdrawn) as a running liability figure that matters for season-end financial close, revenue recognized versus revenue collected (the deferred revenue gap discussed above), and a depositor concentration report showing whether the facility's business is spread across many small farmers or concentrated in a handful of large traders, which matters for credit risk if the facility itself extends any storage-on-credit arrangements. These are standard Odoo reporting views (Inventory > Reporting and Accounting > Reporting) once the underlying lot-owner and deferred-revenue structure is correctly built, and the dashboards approach covered in Odoo Dashboards & KPI Bangladesh applies directly to building a single-screen season view for a himagar's management.
For groups operating multiple cold storage facilities under one company, which is increasingly common as successful operators add a second or third himagar in a neighboring district, the same structure trading companies use for multi-warehouse stock visibility, detailed in Odoo for Trading Companies Bangladesh, and the valuation discipline in the Odoo Inventory Valuation Cheatsheet both apply, since consolidated ownership tracking across facilities is exactly the same problem as consolidated stock visibility across warehouses, just with the added constraint that the stock itself is never the company's own.
Rolling It Out Before Intake Season
Cold storage is one of the least forgiving businesses to implement ERP mid-season for, because once April intake starts, the facility cannot pause operations to fix a data model mistake, and a single wrong ownership configuration compounds across thousands of bags before anyone notices. The realistic implementation sequence:
- Configure and test the ownership/consignment model in January or February, well before the first truck arrives, including a dry run of a full intake-to-lot-creation cycle with real staff.
- Set up chamber locations and capacity rules before intake begins, not during the first busy week, since retrofitting location structure onto already-received stock is significantly harder than starting clean.
- Train the weighbridge and intake counter staff specifically, since they are the ones creating lot records under time pressure with a truck queue behind them, and their data entry accuracy determines every downstream report's accuracy for the entire season.
- Run the deferred revenue and billing configuration through a finance walkthrough with the facility's accountant before the first invoice is due, since this is usually the least familiar part of the system to staff who have only ever billed depositors at withdrawal from a paper register.
- Reconcile the first full season's shrinkage figures against physical spot checks at least twice during the season, adjusting the documented shrinkage percentage if the pattern diverges meaningfully from the assumed rate.
If you operate a potato or agri cold storage facility in Bangladesh and are still reconciling farmer deposits from a paper register every season, I can design and implement the Odoo consignment stock, chamber capacity, and seasonal billing structure this business model actually requires, before your next intake season starts. Contact me for a strategy session →
Frequently asked questions
Why doesn't standard Odoo inventory work for a cold storage business?
Standard Odoo inventory assumes the company operating the warehouse owns the stock sitting in it, which is true for a manufacturer or trader but not for a Bangladesh cold storage (himagar) operator. In cold storage, the potato bags belong to the depositing farmer or trader, and the storage company is only a custodian charging rent. Configuring this correctly means using Odoo's owner field on stock quants and moves (consignment stock, tracked under Inventory > Configuration > Settings with Multiple Owners enabled) so every bag stays attributed to its depositor throughout its stay, rather than being absorbed into the storage company's own stock valuation. Get this wrong and the storage operator's balance sheet ends up overstating inventory it does not own and cannot sell.
How do you track individual farmer lots in Odoo cold storage?
Each depositor's intake is recorded as a separate lot/serial number under Inventory > Products > Lots, tagged with the depositor as the stock owner, the intake weight and bag count, and the chamber and rack location assigned. Because Odoo lot tracking supports partial withdrawals against a lot, a farmer taking out 40 of his 200 deposited bags mid-season is handled as a partial delivery against that specific lot, keeping the remaining 160 bags correctly attributed and located. This lot-per-depositor discipline is what makes the season-end reconciliation between what was deposited, what was withdrawn, and what remains auditable rather than a manual register cross-check.
How is potato storage shrinkage recorded in the system?
Natural moisture and weight loss during storage is recorded as a scheduled inventory adjustment against the affected lots, typically as a scrap or negative adjustment tied to a documented shrinkage percentage rather than an unexplained stock discrepancy. Bangladesh cold stores commonly apply a shrinkage allowance in the 8 to 12 percent range across a full storage season depending on chamber humidity control and storage duration, and recording it as a deliberate, dated adjustment (rather than letting it surface as a surprise at withdrawal) is what lets the operator show depositors a defensible number instead of a dispute at the gate.
How does seasonal billing work for cold storage rent in Odoo?
Rent is normally charged per bag per storage period (commonly a per-maund or per-bag rate for the full March to November storage season, sometimes with a slab rate for early or late withdrawal), and in Odoo this is modeled as a recurring or milestone-based sales order line tied to each depositor's lot rather than a flat monthly subscription invoice. Most of the actual cash collection happens at withdrawal time when the depositor settles the accumulated rent before the gate pass is issued, which means the accounting setup needs deferred revenue recognition (accruing rent income month by month even though cash arrives in a concentrated window) to avoid a profit and loss statement that looks empty for eight months and enormous in one.
What does an Odoo cold storage implementation cost in Bangladesh?
A single-facility cold storage implementation (one himagar with multiple chambers, 5,000 to 40,000 metric ton capacity) typically runs BDT 6 to 14 lakh for Odoo configuration covering the deposit ledger, chamber/location structure, lot tracking, and seasonal billing setup, with a further BDT 2 to 5 lakh per year for support during peak intake and withdrawal seasons when transaction volume and staff error rates both spike. Multi-facility groups running several cold stores under one company naturally cost more due to the added complexity of consolidated reporting across chambers that may have different capacity, tariff, and shrinkage profiles.
