Home/Blog
Guides

ERP for a coffee roastery with cafes and an online store: one inventory from roaster to branch to store

The roastery produces, the branches sell, the store ships, and each counts stock its own way. This guide is about bringing them into one balance.

ERP for a coffee roastery with cafes and an online store: one inventory from roaster to branch to store
In short
  1. Three sales channels, one stock pool: the roastery, the branches and the online store all draw from the same balance.
  2. Roasting is production, not a transfer. Green in, roasted out, and the loss between them recorded.
  3. 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.
  4. A cup costs what its components cost, and the coffee line has to be costed on roasted weight rather than green weight.
  5. 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.

ComponentQuantityWhere its cost comes from
Roasted coffee18gShare of the roast batch, costed on roasted weight
Milk180mlPurchase price per litre
Cup and lid1 eachPurchase price per unit
Sleeve and stirrer1 eachPurchase 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 judgingPOS, store and accounting separatelyOne system
Stock accuracyThree counts, reconciled monthlyOne balance, updated per transaction
OversellingPossible on any day two channels sell the same lotPrevented by reservation rules
Cost of a cup or a bagEstimated, usually from green weightCalculated per batch from roasted weight
Monthly closeExports, mapping and manual adjustmentOne ledger, one stock valuation
Reporting by channelRebuilt by hand each timeStanding reports on shared data
What breaks on growthEach new branch adds a count and a reconciliationA 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.

  1. Discovery. Products, recipes, roast profiles, branches, price lists and the current close.
  2. Roastery and inventory. Green purchasing, roast batches with lots and loss, finished stock in one pool.
  3. Branches. Either the Foodics connection or Odoo POS, with transfers from the roastery and stock deducting on sale.
  4. The online store. The platform connection, so web orders reserve from the same pool.
  5. 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.

FAQ

Frequently asked questions

What is the best system for a roastery that sells online and has branches?

The one that can hold all three at once: production for the roast, retail for the branches, and ecommerce for the store, on a single stock pool and a single ledger. A point of sale tool will not model a roast batch, and a store platform will not model a branch transfer, which is why three good tools side by side still leave you reconciling by hand.

Do I need an ERP if I already use Foodics?

Foodics runs your branches well, and nothing here suggests replacing it for that. What it does not do is roast a batch, hold green coffee, cost a bag from roasted weight, or fulfil an online order from the same stock as the counter. If your business is only the cafes, Foodics and an accounting tool are enough. The moment you roast your own coffee and sell it through more than one channel, something has to sit behind Foodics and hold the whole picture.

How do I unify inventory between the roastery, the branches and the online store?

Make the roastery the source of finished stock, then treat everything else as a movement out of it. Branches receive by internal transfer, the online store reserves from the same pool, and wholesale draws from it on its own price list. One product record, one balance, and reservation rules deciding what each channel may commit.

How do I work out the cost of a cup of coffee?

Give the drink a bill of materials set as a kit, so selling one deducts its components rather than a finished product that was never produced: the dose of roasted coffee, the milk, the cup, the lid and the sleeve. The only difficult line is the coffee, and it is only difficult if you cost it on green weight. Cost it on what came out of the roaster and the cup figure is real.

Foodics with Odoo, or Odoo POS: which one?

If the cafes are the business, keep Foodics. It is built for food service, your team knows it, and the connection to Odoo is deliverable. If the cafes exist mainly to sell the coffee you roast, Odoo POS is usually the better answer: one system, no connector to maintain, and stock deducting the moment a cup is sold rather than on a sync. Neither is wrong. The question is which side of the business you are optimising for.

Can the same system handle wholesale accounts?

Yes, and it is one of the better reasons to do this. Wholesale accounts draw from the same finished stock as the branches and the store, on their own price lists and payment terms, so a cafe client ordering 20kg is a sales order against the same balance rather than a separate ledger. Without that, wholesale is the channel most likely to be invisible until something runs out.

What does the monthly close look like once everything is on one system?

Shorter, and different in kind. Branch takings, online orders and wholesale invoices are already posted against one stock valuation, so the close is a review rather than a reconstruction. There are no exports to map and no adjusting entry to explain the gap between three stock counts. The usual pattern is one parallel month end, run on both the old setup and the new one, and then the old one stops.

How long does a rollout take, and what drives the cost?

It runs in phases rather than in one cutover: discovery, then the roastery and inventory, then the branches, then the online store, then the first close. What drives both the timeline and the cost is the number of branches, whether the branches stay on Foodics or move to Odoo POS, how clean your product and recipe data is, and how many wholesale price lists exist. A scoped quote after a discovery session is the only honest number.

Keep reading

Related articles

Ready to run your business on one system?

Free consultation. Meet the team and get a clear roadmap in one call.

Book your consultation