- Three sales channels, one stock pool: the roastery, the branches and the online store all draw from the same balance.
- Roasting is production, not a transfer. Green in, roasted out, and the loss between them recorded.
- The branches run either through a Foodics connection or on Odoo POS. Both are real options and the choice depends on how much of the business is the cafe.
- A cup costs what its components cost, and the coffee line has to be costed on roasted weight rather than green weight.
- One accounting close instead of three exports and a reconciliation.
Why this is the hardest model in coffee
A roastery that also runs cafes and also sells online is three businesses wearing one name. It manufactures, because green coffee goes in and finished bags come out. It runs retail, because a barista sells a cup across a counter. It runs ecommerce, because a customer in another city orders a bag and a courier collects it. Most systems are built for one of those three and bolted onto the other two.
That is why the stock figure is usually wrong. Not because anyone is careless, but because the same kilo of roasted coffee is being counted by a point of sale system at the branch, by a store dashboard online, and by a spreadsheet at the roastery, and none of the three knows what the other two did today. If you are still weighing up whether any of this applies to you, does your store need an ERP is the place to start. Barlina is the same operating shape in a different category: production, warehouses and an online store on one system.
Three channels, three systems: the usual starting point
The setup we meet most often looks like this. A cloud point of sale at each branch, holding the menu, the shifts and the daily takings. A storefront on Salla or Zid, holding products, orders and shipping. Accounting in a separate tool, fed by whatever gets exported at month end. And the roastery itself running on a spreadsheet, because no tool in the stack understands that 60kg of green beans becomes roughly 50kg of roasted coffee and then becomes bags, kilos for the branches, and wholesale sacks.
Each tool is good at its job. The failure is in the gaps between them. Stock is counted three times and reconciled once a month. A bag sells online and at a branch on the same afternoon and both systems think it is still available. Nobody can say what a cup actually costs, because the beans in it were never linked to the roast batch they came from. And the monthly close starts with three exports and a manual adjustment.
Roasting as production
The step that turns three systems into one is treating the roast as production rather than as a transfer.
Green coffee is purchased and received as stock in its own unit, usually kilos. A roast batch consumes green coffee and produces roasted coffee, and the difference between the two weights is the loss, which is around 15 to 18 percent depending on the profile. That loss has to be recorded, because it is the difference between a cost you can trust and one that flatters every product you sell.
From the roasted coffee, a bill of materials produces what each channel actually sells. A 250g retail bag consumes 250g of roasted coffee plus the bag, the valve and the label. A 1kg branch pack consumes a kilo. A wholesale sack consumes whatever the account buys. Each roast becomes a lot carrying its roast date, so freshness is an attribute of the stock rather than a note on a label, and the oldest lot can be picked first automatically. Running an online coffee brand covers that mechanism in detail, and manufacturing is where the bill of materials and the recorded loss live.
Once a roast is booked, the finished bags are stock in one pool that all three channels draw from. That single change is most of the value in this project.
The branches: Foodics with Odoo, or Odoo POS
This is the decision every roastery with cafes has to make, and it is a real choice rather than a foregone conclusion.
Keep Foodics and connect it. Foodics is built for food service and your staff already know it. The kitchen display, the table flows and the shift reporting are strong, and nobody has to be retrained. Foodics publishes an API and runs a marketplace of integration partners, so the connection to Odoo is real. What it is not is a one-click app published by Foodics itself. In practice you are either deploying one of the third-party connectors listed on the Odoo App Store or having the integration built against the Foodics API for your setup, which is what Naqlah does. Either way, ask one question before you start: who maintains it when Foodics ships an API change or you upgrade Odoo.
Move the branches onto Odoo POS. One system, one login, no connector to maintain, and stock deducts the moment a cup is rung up rather than on a sync cycle. The trade is that you are replacing a tool built specifically for restaurants with a general one, and your baristas have to learn a new screen. For a roastery whose cafes are retail counters rather than full kitchens, that trade is usually easy. For a group running full service dining, it is not. Odoo's point of sale application is the page to read next.
The honest summary: if the cafes are the heart of the business, keep Foodics and connect it. If the cafes exist to sell the coffee you roast, Odoo POS removes a moving part you would otherwise maintain forever.
How to work out the cost of a cup
This question comes up in every discovery session, and the answer is mechanical once the roast is modelled as production.
A drink is a product with its own bill of materials, set as a kit, which means selling one explodes into its components and deducts each of them from stock rather than deducting a phantom "cappuccino" that was never produced. A cappuccino looks like this.
| Component | Quantity | Where its cost comes from |
|---|---|---|
| Roasted coffee | 18g | Share of the roast batch, costed on roasted weight |
| Milk | 180ml | Purchase price per litre |
| Cup and lid | 1 each | Purchase price per unit |
| Sleeve and stirrer | 1 each | Purchase price per unit |
The only line that is hard is the first one, and it is hard for exactly one reason: if the coffee is costed on the green weight rather than the roasted weight, every cup you sell is understated by the roast loss, and the error compounds quietly across the year. Cost the batch on what came out of the roaster, not what went in, and the margin you read is the margin you have.
One caveat worth settling early. If the branches stay on Foodics, both systems can hold a recipe, and only one of them should be the source of truth for what a cup consumes. Pick it during setup rather than discovering the disagreement in your first month end.
One inventory, one close
With production modelled and the channels connected, the daily picture changes shape.
The roastery holds finished stock. Branches receive it as internal transfers, which means a branch request is a stock movement with a record rather than a message on WhatsApp. The online store draws from the same pool, and reservation rules decide what online orders may commit so a large web order cannot silently empty the shelf a branch is counting on. Wholesale accounts draw from the same pool too, on their own price lists.
The close changes more than the day does. Instead of three exports and a reconciliation, revenue from the branches, the store and wholesale already sits in one ledger against one stock valuation. Inventory and accounting are the two applications carrying that.
Separate tools versus one system
A comparison of the two setups, on the things that actually cost money.
| What you are judging | POS, store and accounting separately | One system |
|---|---|---|
| Stock accuracy | Three counts, reconciled monthly | One balance, updated per transaction |
| Overselling | Possible on any day two channels sell the same lot | Prevented by reservation rules |
| Cost of a cup or a bag | Estimated, usually from green weight | Calculated per batch from roasted weight |
| Monthly close | Exports, mapping and manual adjustment | One ledger, one stock valuation |
| Reporting by channel | Rebuilt by hand each time | Standing reports on shared data |
| What breaks on growth | Each new branch adds a count and a reconciliation | A new branch is a location |
A rollout in phases
Nothing here needs a big bang, and it should not have one. The sequence that works, with each phase going live before the next begins.
- Discovery. Products, recipes, roast profiles, branches, price lists and the current close.
- Roastery and inventory. Green purchasing, roast batches with lots and loss, finished stock in one pool.
- Branches. Either the Foodics connection or Odoo POS, with transfers from the roastery and stock deducting on sale.
- The online store. The platform connection, so web orders reserve from the same pool.
- The first close. Run one month end on the new ledger with the old one alongside it, then stop the old one.
The order matters. Inventory before branches, branches before the store, and the close last, because every later phase depends on the stock model being right.
Where to go next
If your store is on one of the Saudi platforms, the connection is covered on its own: connecting a Salla store and connecting a Zid store. If you sell online only and have no branches yet, running an online coffee brand is the closer fit.