- Wholesale is a different model, not retail in bigger quantities. The price sits on the relationship, not the product.
- A price list per customer, with quantity tiers and expiring contract rates, so nobody quotes from an old list.
- Credit terms and a credit limit that can hold a delivery before the coffee leaves the building, rather than a write-off three months later.
- The standing weekly order is the most valuable and least managed part of the business. Hold it as one recurring order, not as a habit.
- The margin leaks in four quiet places: forgotten prices, deliveries without proof, statements built by hand, and collection chased from memory.
A note on the title: this is about the system you run a wholesale roastery on, not about where to buy coffee wholesale. If you are looking for green beans or a supplier, this is the wrong page.
Wholesale is a different model, not a bigger one
A roastery that supplies cafes, hotels and offices looks from the outside like retail with larger bags. It is not. Four things change, and each one breaks a tool built for consumer selling.
The price is not on the product, it is on the relationship: this cafe pays one rate, that hotel pays another, and the rate was agreed in a meeting eight months ago. The payment does not arrive with the order, it arrives thirty days later, or sixty, or after three reminders. The order is not a decision, it is a habit: the same twelve kilos every Tuesday. And the delivery is not a courier tracking number, it is your own driver, your own route, and a question later about whether the third bag was actually left at the door.
If the roastery also runs its own cafes and an online store, a roastery with cafes and an online store covers that shape instead. And if you are still deciding whether any of this needs a system at all, does your business need an ERP is the place to start. Naqlah's trading and distribution page covers the wider category.
Where the margin leaks
In wholesale the margin rarely disappears in one visible place. It leaks in four small ones.
Prices agreed and then forgotten. A discount given to win an account, never written anywhere a system can read, so it is applied inconsistently or not at all until the customer notices.
Deliveries without proof. A driver leaves four bags and remembers five, or the customer remembers three. Without a record signed at the door, the argument is settled by whoever is more confident.
Statements built by hand. Someone rebuilds each account's position in a spreadsheet at month end, which means it is always slightly out of date and always disputable.
Collection chased from memory. The accounts that get chased are the ones somebody happens to remember, not the ones that are furthest overdue or closest to their limit.
None of these is dramatic. Together they are usually worth more than the discount you are arguing about with your biggest customer.
A price list per customer
This is the first thing to fix, and it is mechanical.
Instead of one price per product, each customer is assigned a price list, and that list is what the system uses when an order is entered for them. Inside a list you can hold a flat rate per product, a rate that changes by quantity so twenty kilos prices differently from five, and a contract price that applies for an agreed period and then expires.
| Customer type | How the price is set | What the system does |
|---|---|---|
| Standard cafe | Published trade list | Applies the list rate automatically |
| Volume account | Tiered by quantity ordered | Prices each line by its own quantity |
| Contract account | Agreed rate, fixed period | Holds the rate, then expires it on the end date |
| Hotel or group | Own list, several delivery addresses | One account, one price, many drop points |
The immediate benefit is not neatness. It is that a rep can no longer quote from an old list, because the rep does not type the price at all. Odoo's sales application is where this lives.
Credit terms, receivables and collection
This is the section that decides whether a wholesale business is healthy, and it is the one most often run on nerve.
Each account gets payment terms and a credit limit. The terms drive the due date on every invoice automatically, so the ageing report is a fact rather than an estimate. The credit limit does something more useful: it can hold a delivery when an account is already over its limit, which turns a difficult conversation into a system message before the coffee leaves the building rather than a write-off three months later.
What the finance view looks like, as a share of the total balance owed to you.
| Ageing bucket | Share of balance | What it means |
|---|---|---|
| Not yet due | Just over half | Healthy, within terms |
| 1 to 30 days late | About a quarter | Normal slippage, first reminder |
| 31 to 60 days late | Roughly a sixth | Needs a call, not an email |
| Over 60 days late | The remainder | One account over its limit, next delivery held |
Those proportions are illustrative rather than a benchmark. The point is the last row: a system that flags the account and holds the drop is doing collection work that otherwise depends on someone remembering. Statements go out from the same ledger, which means what you send matches what you booked. Accounting carries the terms, the ageing and the statements.
Recurring orders and a trade portal
The standing order is the most valuable and least managed part of wholesale.
If a cafe takes the same twelve kilos every Tuesday, that is not twelve separate decisions a year. It is a recurring order, and holding it as one means the delivery and the invoice are generated on schedule, the roast plan can be built on committed volume, and a missed week shows up as an exception rather than as silence.
The second half of this is letting the customer place and adjust their own order rather than sending it by WhatsApp to whoever answers. A trade portal gives each account a login where they see their own prices, their order history, their outstanding invoices, and a reorder button. Worth being precise about scope here: the portal where customers view their orders and invoices is standard, while a full self-service ordering experience with each account's own prices is a configuration decision to settle during the project. Ask for it explicitly rather than assuming it.
One boundary. If you also sell retail bags to consumers on Salla or Zid, that storefront stays where it is. A trade portal is for your wholesale accounts and is a separate thing from your consumer store.
Delivery, routes and proof
Your own van changes what the system has to do.
Orders for a given day are grouped into a route, the driver carries a delivery document per drop, and the delivery closes the line so the invoice reflects what was actually delivered rather than what was ordered. That much is standard. What is worth asking about specifically is how proof gets captured at the door: a signature, a photo, or a confirmation in an app. That capture is usually an addition rather than a checkbox, so it belongs in the scope conversation rather than being assumed. Without it you are back to settling disputes from memory, which is the leak described earlier.
Customer contacts, visit history and who promised what live in the CRM, which matters more in wholesale than in retail because a single account can be worth years of revenue and usually has three people involved in it.
Compliance on credit sales
Short, but not optional. An invoice on deferred payment is still an e-invoice, and it has to be issued and reported like any other.
Saudi Arabia's e-invoicing integration has rolled out in waves, and the twenty-fifth wave covers taxpayers whose taxable turnover exceeded SAR 187,500 in 2022, 2023, 2024 or 2025, with an integration deadline of 1 February 2027. At that threshold, very nearly every operating wholesaler is in scope. Check your own position and date on ZATCA's e-invoicing pages rather than taking a vendor's word for it, including ours.
The practical implication for a roastery is that the compliant invoice should come out of the same record that holds the order, the price list and the delivery, rather than being typed a second time into a separate tool.
What to switch on
Sales with price lists, inventory, purchasing for green coffee, and accounting with payment terms and credit limits. Add manufacturing if roast batches are tracked as production with a recorded loss. Add the CRM when accounts have more than one contact, which in practice is immediately. Add the portal when enough customers order often enough that taking orders by message has become a job in itself.