Odoo for Distribution & FMCG
Van sales, route, promotions, returns.
FMCG distribution: van sales, route planning, dealer schemes, returns, and secondary-sales dashboards.
Odoo ships no van sales application and no route optimiser. Nothing in 17, 18 or 19 holds a journey plan, a beat, an outlet visit or a target per rep. What it does hold is the machinery those things are built from: a warehouse per vehicle, internal transfers for load-out, lots with expiration dates, pricelists with quantity breaks, promotion programs that sit on the sales order, and a point of sale that keeps taking orders when the mobile signal drops. An FMCG build is assembly, not installation.
The value shows up in two numbers most distributors cannot produce today. The first is cost to serve, which needs vehicle cost, driver time and load-out value tagged to a route rather than pooled in one delivery expense account. The second is stock in the field, meaning the cases sitting on vans and with reps at close of business. Both are outputs of decisions taken during configuration, and neither can be bolted on later without reworking the stock design.
The edition question has a clear answer here. Community covers multi-warehouse inventory, lots and expiry with FEFO removal, pricelists, discount and loyalty programs on sales orders, point of sale, landed costs, analytic accounting and the customer credit limit warning. Enterprise buys the Barcode app, Studio, Field Service, Planning, the dynamic accounting reports including aged receivable, automated follow-ups, and the IoT app that drives dock scales and label printers. A distributor scanning cartons at the dock and chasing collections daily normally ends up on Enterprise.
Who this fits
- → Distributors carrying several principals through one warehouse and one delivery fleet, where each brand wants its own margin and its own stock view.
- → Importers holding a local agency, where duty, excise and clearing charges have to sit inside the cost of a case before any margin figure means anything.
- → Manufacturers selling through a distributor tier who need sell-out visibility rather than another sell-in report.
- → Cash van and pre-sell operations where a vehicle leaves loaded in the morning and is reconciled against cash, returns and damages at night.
- → Not for a single-warehouse brand shipping to consumers through couriers, where standard Sales and Inventory already do the job without a distribution layer.
- → Not for a contract logistics operator billing clients for storage and handling. Odoo can hold stock owned by a third party under a consignment setting, but it has no tariff engine for pallet days, handling in and handling out, so the billing side is a build rather than a configuration.
Core features
- ✓ Van sales mobile app
- ✓ Route planning
- ✓ Dealer schemes
- ✓ Returns & expiry
- ✓ Secondary-sales reporting
- ✓ Credit limits
- ✓ Gift-pack & combos
- ✓ KPI per van/rep
How Odoo covers Distribution & FMCG
The van as a stock location
Each vehicle becomes a warehouse or an internal location, and the morning load-out is an internal transfer from the depot to that location. Stock on a van is then company stock in a place, visible on the same forecast report as the racking. The nightly return is a transfer back, damages are a scrap from the van location, and what is left is the variance a supervisor signs off. This is the single design decision the rest of an FMCG build rests on.
Pre-sell and cash van, configured differently
In pre-sell, the order is taken at the outlet and delivered on the next visit, which is an ordinary sales order with a delivery from the van warehouse. In cash van, the sale happens at the shelf, and a point of sale session tied to that van operation type serves it better, because a loaded session carries on taking orders when the signal drops and syncs on return. Two limits come with that. The Odoo web client does not work offline and no configuration changes it, and an order taken offline cannot carry a cleared invoice number, so anywhere the tax authority clears documents in real time the invoice is issued on sync rather than at the shelf.
Trade schemes, slabs and free goods
Discount and loyalty programs in Sales cover buy X get Y, a free case above a quantity, a percentage on a product category and coupons issued per outlet, each with its own date window. A program can be gated on a minimum quantity, a minimum order value or a code the rep keys in, and the reward is either a discount or a product taken out of stock. Volume slabs belong on pricelists as quantity break rules instead. Free goods have to ride on the order as lines so stock is relieved from the right lot and the cost lands against the outlet that received it. Off-invoice claims settled with a principal later are not modelled by Odoo.
Expiry, FEFO and near-expiry stock
With lots and expiration dates switched on, a lot carries four dates: expiration, best before, removal from sale and alert. FEFO reserves against the removal date, so the oldest saleable lot goes out rather than the nearest pallet. Near-expiry stock is worked by filtering lots on removal date and either pushing it through a scheme or moving it to a quarantine location. Dates have to be captured at goods receipt, which is a discipline question at the dock rather than a configuration one. A receiving clerk keying the batch code is what makes every expiry report downstream true.
Returns, damages and write-off
A return is a reverse transfer raised against the original delivery, and the credit note is created from the invoice so the two stay linked. Saleable cases go back into stock. Damaged and expired cases are scrapped, which moves them out to a scrap location and posts the write-off at their valuation, so the loss carries a value against the product rather than disappearing into a stock adjustment. Odoo has no returns authorisation app, so the approval step, the reason codes and the recovery claim against the principal are configured work rather than a switch.
Credit control and collection
Credit limits sit on the customer and only do anything once the credit limit setting is switched on in Accounting. The check runs against the commercial partner, so branches of a chain roll up into one exposure figure, and it compares the total receivable plus the order on screen against the limit. What it produces is a warning on the quotation. Confirming the order, picking the goods and invoicing all still happen. Payment terms carrying an early settlement discount are standard, so are down payments taken on the order and terms set per outlet. Automated dunning through follow-up levels sits in Enterprise, and so does the aged receivable report a collections meeting actually runs on.
Route, rep and outlet reporting
Salesperson, sales team and customer tags carry the rep, the channel and the territory, so outlets invoiced per rep, lines per invoice and average drop size come out of pivot views on orders and invoices without custom tables. Analytic distribution on fuel, vehicle cost and driver time gives cost per route against the revenue that route produced. What no pivot gives you is coverage against a plan, because there is no visit record to count calls made, so a strike rate has to come from whatever the field team uses. Secondary sales, meaning what the distributor sold onward, is not in Odoo at all.
How the rollout runs
Settle the unit of measure and the case first
Odoo converts inside a unit of measure category on a fixed ratio, so a case of twenty four is a unit whose ratio to the piece never changes. That suits most FMCG and fails anything sold by variable weight, because there is no catch weight on a product. Decide the stock keeping unit, whether pricing runs per piece or per case, and how a pack size change from a principal will be handled, before the first product is loaded.
Warehouse and route topology
Fix the number of receipt and delivery steps, the van warehouses and how they are resupplied, and whether a fast line cross-docks from receipt straight onto a vehicle instead of being put away. Putaway rules route incoming goods by product, product category or package type into a location or a storage category, and a storage category can be capped by product quantity or by package count. That is what keeps a chilled line out of ambient racking and stops a bay being over-filled. A van warehouse can be set to resupply from the depot, which builds the internal route for you. A storage category also carries a maximum weight alongside its product and package caps, which putaway respects when it chooses a destination, though treat it as a guide rather than a hard block on a manual move. Adding a van later is easy. Moving from one step to three after a year of movements is not.
Pricelist and scheme architecture
Build the layers deliberately: a base price per channel, a customer pricelist above it, then promotion programs for anything with a start and an end date. Schemes belong in programs rather than in permanent pricelist rules, because a rule nobody removes keeps discounting long after the campaign closed. Decide who may key a manual discount on a line. The per-line discount field only exists when the Discounts setting is on in Sales, and it is granted by a user group, so restricting it to a named list is settings and access rights rather than a customisation. An open discount field is where distributor margin quietly leaves.
Master data and the outlet file
Outlets are the largest and dirtiest data set in a distribution project. The same shop appears three times under three spellings, and each copy carries a balance. Deduplicate before load, set a parent company on chain accounts so a group statement is possible, and agree the fields that hold channel, territory and visit frequency. Load customers, products and prices first, opening balances second and stock last, on separate days with a reconciliation between each.
Landed cost, duty and excise inside the case
Set the costing method on the product category before the first receipt, because changing it afterwards revalues everything on hand. Landed costs only apply where that category is costed FIFO or average with automated valuation, so a category left on standard price cannot absorb them at all. The landed cost document then pushes freight, clearing, duty and demurrage onto the receipt, split across the lines equally or by quantity, weight, volume or current cost, and a case carries what it really cost to put on the floor. Freight by volume and duty by value rarely share a split, so most importers post more than one landed cost against a single receipt. Excise and sugar levies paid at import behave the same way. Where a principal reimburses part of that spend, the recovery is income against the brand and does not reverse the landed cost.
Cut over on a real count, vans included
Take the count at close of business with every vehicle back at the depot and unloaded, or the opening balance is wrong on day one and no report is believed afterwards. Opening stock needs lot numbers and expiry dates keyed rather than skipped, because FEFO cannot sort lots that have no dates. Open invoices, credit notes and customer balances come in as one journal, and the aged position is agreed with the accountant before go-live.
Where these projects go wrong
Free goods booked outside the order
The most common scheme error is handing out free cases and recording them nowhere, or as a manual stock adjustment three weeks later. Stock is then wrong all month and the scheme has no cost attached to it. Free goods belong on the sales order as lines at zero price, so the delivery relieves the correct lot and the cost of goods lands against the same outlet. Margin per outlet then includes the scheme, which is the number a sales manager needs.
A credit limit that stops nothing
Buyers see the credit limit field and assume the system refuses delivery once an outlet is over. It does not. If the business rule is that an overdue outlet gets no stock, that is an approval state on the order or a hold on the delivery, with a named role able to release it and a record of who released what. Decide as well whether the block bites at confirmation or at picking, because a van already loaded is a different conversation from a quotation on screen. Small work, but it has to be scoped and priced rather than discovered during user testing.
Van stock nobody reconciles
Making each vehicle a location is only half the design. Without a signed load-out and a nightly return, the location becomes the place stock goes to disappear. What makes it work is a daily count of the vehicle, scrap postings with a reason code, and a variance report a supervisor closes each morning. Where the same person sells and collects, cash and stock have to reconcile against the same route on the same day.
Turning on lot tracking after stock exists
Tracking by lot with expiry is a product-level decision, and it is painful to take late. Odoo refuses the change while untracked quantities are on hand and points you at an inventory adjustment to assign lot numbers, so the sequence is fixed: zero the stock, switch the setting, then bring the same quantities back with lot numbers and dates keyed line by line. That is a weekend of work on a live catalogue and a month of valuation noise afterwards. Anything left on hand without a lot also sits outside every expiry report until it is cleared. Agree the tracking level per product category at design time, and accept that not every line needs a lot. A sachet and a chilled dairy line do not deserve the same discipline.
Expecting the field team to work offline
The Odoo web client needs a connection. On a route through weak coverage the order screen stalls, the rep goes back to paper, and the project dies quietly three months in. Decide early which roles genuinely work outside coverage and for how many hours a day, because the honest answers are usually the cash van and about two hours. Anything a point of sale session cannot carry means a mobile build against the API, and that build has to answer awkward questions. Which price applies when the tariff changed while the device was out. Who wins when two reps commit the last pallet. How a rejected e-invoice gets back to the rep who raised it.
Principal claims handled after the fact
Distributors recover promotion spend, damage allowances and listing fees from their principals, months later and rarely in full. Odoo has no deduction or claim settlement feature. Left unmodelled, the recovery lands as a stray credit nobody can match to the campaign that earned it. Raise the claim as a receivable against the principal while the scheme is running, then settle it against what is actually recovered, so the shortfall per brand is visible.
What it works with
- + Inventory, for van warehouses, lots and expiry, putaway rules, storage categories and FEFO removal
- + Sales with discount and loyalty programs, for schemes, coupons and buy X get Y on the order itself
- + Point of Sale, for cash van selling that has to keep working without a signal and sync later
- + Purchase, with vendor pricelists and blanket agreements held against each principal
- + Accounting, for landed costs, analytic distribution per route and the customer credit limit
- + Barcode and Studio in Enterprise, for dock scanning and the short van forms a field team will actually use
- + Country e-invoicing connectors, which decide whether an invoice can legally be issued at the shop door
- + Third-party routing, telematics and a secondary sales portal, which sit outside Odoo and need a named integration owner in the project plan
Country considerations
Saudi Arabia (KSA)
ZATCA Phase 2 clears a standard business invoice through Fatoora before it is valid, while a simplified invoice at the shop door carries a QR code and is reported within 24 hours. A van selling offline still owes that report once it reconnects. Excise on carbonated and energy drinks sits inside the case cost at import, and merchandiser wages run through WPS.
United Arab Emirates
The Commercial Agencies Law makes a registered agency exclusive, so parallel-imported stock of the same brand is a legal question before it is a pricing one. A warehouse inside a VAT designated zone is treated as outside the country for VAT until the goods enter the mainland, so location design and tax mapping have to be settled together. Electronic invoicing moves to a Peppol-based model routed through accredited service providers.
Pakistan
Third Schedule items are taxed on the printed retail price rather than on what the distributor actually charges, so sales tax on a case does not follow the invoice value and has to be configured against the retail price. FBR digital invoicing integrates FMCG importers and manufacturers in real time, and advance tax under sections 236G and 236H is collected on sales to distributors, dealers and retailers.
India
A post-sale discount only reduces GST liability where the credit note links back to the original invoice, so quarterly and annual schemes have to stay traceable to the invoices they discount instead of passing as a lump sum. Goods above the value threshold need an e-way bill with the vehicle number in Part B, and it expires by distance, which limits how long a load can sit.
Turkey
Goods cannot leave the depot until an e-Irsaliye dispatch note has been issued and accepted through the tax authority channel, so the document belongs inside the loading process rather than after it. Invoicing then splits by counterparty, e-Fatura to a registered business and e-Arsiv to everyone else. Records are expected to be archived inside Turkiye, which decides where hosting is bought.
Egypt
Every invoice line needs a registered GS1 or EGS code, so a new pack size or a promotional bundle cannot be sold until its code exists, which turns item coding into a gating task on a large FMCG catalogue. Retail sales report through the e-receipt system. Imported stock clears through Nafeza on an ACID number raised before the vessel sails.
United Kingdom
Most food is zero rated while confectionery, crisps and soft drinks are standard rated, so the rating belongs on the product and not on the customer. The Soft Drinks Industry Levy is charged per litre by sugar band on producers and importers and sits in cost rather than VAT. Extended producer responsibility adds packaging weight by material, and Making Tax Digital requires digital links through to the return.
France
The Egalim rules cap promotions on food at 34 percent in value and set a minimum resale price of cost plus ten percent, so a scheme that is ordinary elsewhere can be unlawful here and has to be checked before it is loaded into a promotion program. Electronic invoicing runs through partner platforms on the national timetable, with Factur-X among the accepted formats.
Questions we get asked
Does Odoo have a van sales module?
No. There is no journey plan, beat, visit record or target per rep anywhere in Odoo 17, 18 or 19. Van selling is assembled from parts that do exist, which is what this page describes. The thing to test is the sales pitch. Any van sales module for Odoo is third-party or bespoke, so ask who maintains it against the next major version, whether it writes to standard stock moves and sales orders or to its own tables, and what happens to your data if the author stops publishing.
Can a distribution business run on Odoo Community?
Much of it, including the inventory, pricing, promotion and point of sale machinery described on this page. The more useful question is what Community costs you in workarounds. Dunning becomes a manual list or a mail template on a scheduled action. Aged receivable becomes a pivot on journal items that your accountant will argue with. Form changes go in as XML in a custom module rather than by drag and drop, so every small request carries a developer. Warehouse scanning has no guided flow. Price those over three years before deciding on the licence alone.
How does Odoo plan delivery routes?
It does not. There is no map, no drive time and no optimisation anywhere in the product. Deliveries are grouped into batch or wave transfers and sequenced by hand, or the day list goes out to a routing product and the sequence is written back. The shipping connectors are a separate thing and often mistaken for this. They rate and label parcels with a carrier, they do not plan your own fleet. Treat routing as its own purchase with its own integration cost.
Can Odoo block a delivery to a customer over their credit limit?
No, and the reason matters more than the answer. Odoo measures one thing and most credit policies mean another. Odoo looks at everything the customer owes today, plus the value of the quote in front of you. A collections team usually means the overdue portion, or days past due on the oldest open invoice. An outlet sitting inside its limit but ninety days late triggers nothing at all. The second thing to check is chain accounts, because the figure rolls up to the commercial partner, so ten branches under one parent share a single limit whether or not that is what the credit committee agreed. Settle which of those numbers the policy uses before anyone writes a line of code, because the block itself is the easy part.
How are trade schemes and free goods handled?
The order-level schemes are covered further up this page. The limit worth knowing at design time is that a promotion program only ever sees the order in front of it. A scheme measured across a quarter, a rebate paid back in cash, or a slab settled on a statement at year end is not a program, and forcing it into one hands discounts to orders that never earned them. Those belong as an accrual against the customer through the period, then a credit note once the volume is confirmed. The second trap is stacking, because two programs can land on the same order at once. Agree which combinations are allowed, and whether a scheme may sit on top of an already discounted pricelist, before any of them go live.
How do we handle gift packs and combo offers?
Two ways, and the choice matters. A bill of material set to Kit explodes into its components on the delivery, so nothing is held as the pack itself and its cost is the sum of what went in. That suits a combo assembled at the pick face. A pack carrying its own barcode, lot and expiry has to be built on a production order, which also consumes the sleeve and the shrink wrap. Both need Manufacturing installed, which is in Community.
Does Odoo handle expiry dates and FEFO picking?
Yes, and in Community. The mechanics are worth knowing because two of them bite. Each new lot takes its dates from day counts held on the product record: days to expiry, days to best before, days to removal from sale, and days to the alert. FEFO is then set as the removal strategy on the product category, or forced on a location, and reservation orders the quants by removal date, oldest first. First trap: a lot received with no date sorts last rather than first, so it quietly ages in the rack while newer stock ships. Second trap: reservation timing is a setting on the operation type, at confirmation, manually, or a set number of days before the scheduled date. On a fleet that choice decides whether the morning load-out can take a lot a pre-sell order has already reserved, and it is the setting most often left on the default and then blamed on FEFO.
Do we need Enterprise for barcode scanning?
The warehouse Barcode app is Enterprise. The underlying barcode support is not, which is why point of sale scanning works on Community and a scanner acting as a keyboard can fill a field on a form. What Enterprise buys is the guided flow for receipts, picks, internal transfers and counts, where the screen tells an operator what to scan next and rejects the wrong pallet. For a warehouse picking cases at volume that flow is the whole difference, and it is the most common single reason a distributor moves to Enterprise.
Can we see what our distributors sell onward?
Not from Odoo alone, because secondary sales happen in someone else's system. The two workable routes are a scheduled import of a distributor sales file mapped onto your products and outlets, or a portal the distributor keys or uploads into. Both need a product mapping table, since distributor item codes never match yours, and both need somebody chasing the distributors who stop sending.
What drives the length of a distribution project?
Three things. The size and cleanliness of the master data, because outlet and product files are always worse than the first estimate. The number of vans and whether they sell or only deliver, since selling from a vehicle adds cash reconciliation and offline handling. And the country e-invoicing regime, which has to be tested against real documents before go-live rather than during it.