Guides & articles

Odoo for wholesale businesses in Australia

What wholesale actually stresses in an ERP

Retail software is mostly about the till. Wholesale is about the middle bit: buying in cartons and selling in eaches, giving Customer A 12% off list and Customer B a flat rate, promising a delivery date you can actually hit, and knowing what a container really cost you once freight and duty land. Odoo Community handles all of that out of the box — Sales, Purchase and Inventory are the same modules in Community as in Enterprise. Where it gets thin is the accounting reporting layer and warehouse hardware, and we'll be specific about that below.

Products: cartons in, eaches out

Turn this on first: Inventory → Configuration → Settings, tick Units of Measure, Storage Locations, Multi-Step Routes, Lots & Serial Numbers and Landed Costs. Save, then reload the menu.

Under Inventory → Configuration → Units of Measure, create a category such as "Beverage – 330ml" with Units as the reference measure, then add "Carton of 24" as a Bigger unit with a ratio of 24. On the product, set the Purchase UoM to Carton of 24 and the Unit of Measure to Units. Now a PO for 40 cartons receives 960 units into stock, your sales team quotes in eaches, and stock reports stay in one consistent number.

A few product fields that matter more in wholesale than people expect:

Customer-specific pricing without the spreadsheet

Go to Sales → Configuration → Settings and set Pricelists to Advanced price rules (discounts, formulas). Then under Sales → Configuration → Pricelists you can build rules that compute from the product's list price or its cost — for example, "Product Category = Fittings, based on Cost, margin 35%, min quantity 1" and a second line for "min quantity 50, margin 22%" to create a volume break. Assign the pricelist on the customer record under Sales & Purchase → Pricelist and every quote for that account picks it up automatically.

While you're on the customer form, set a Credit Limit (enable it in Accounting → Settings → Customer Invoices). Odoo then shows a warning banner on new orders once the account's outstanding balance passes the limit. It doesn't block the order — it just makes sure nobody ships another pallet to a debtor by accident.

Reordering, lead times and honest delivery dates

Set the supplier lead time on the product's Purchase tab (each vendor line has its own Delivery Lead Time), and add a company-wide buffer under Inventory → Configuration → Settings → Advanced SchedulingSecurity Lead Time for Purchase and for Sales. Two or three days of purchase buffer is normal for a Sydney importer dealing with customs delays.

Then build reordering rules in Inventory → Operations → Replenishment. Set min/max per product per warehouse, run the scheduler, and Odoo drafts the POs. For seasonal lines, the Forecasted report on the product shows the projected stock curve including confirmed sales orders and inbound POs — that's the screen to check before a trade show.

If you pick and pack separately, switch the warehouse to Pick + Pack + Ship under Inventory → Configuration → Warehouses. Receipts can go to two steps (Input → Quality/Stock) so damaged pallets never reach saleable stock. Partial deliveries create a backorder automatically — keep them; they're your open-order report.

Landed costs on imported containers

This is the feature that pays for the migration for most importers. First, inventory valuation must be Automated with FIFO or Average Cost on the product category (Inventory → Configuration → Product Categories). Then create service products for "Sea Freight", "Customs Duty" and "Customs Broker" with Is a Landed Cost ticked on the Purchase tab. When the freight invoice arrives, go to Inventory → Operations → Landed Costs, pick the receipt, add the cost lines and choose a split method — by weight for freight, by value for duty — then Compute and Validate. Your unit cost now reflects reality, and so does your gross margin report.

Buying in USD or CNY? Enable multi-currency in Accounting settings, add the currency, and record rates against the date of the bill. Odoo revalues the payable when you pay it, so the FX gain or loss lands in its own account instead of quietly distorting COGS.

GST, exports and what Community actually gives you

Install the Australian localisation when you create the database (chart of accounts, GST 10% sales and purchase taxes, GST-free codes). For export customers, create a Fiscal Position that maps GST 10% to GST Free Export and set it on those contacts — the tax then drops off automatically on every quote and invoice, which is safer than trusting a salesperson to remember.

Here's the limit, plainly: the polished, one-click BAS/tax return report is an Odoo Enterprise feature, and it isn't part of what we host. In Community you get invoices, bills, payments, taxes and journal entries, and you can pivot invoice lines by tax code and export to a spreadsheet to fill the BAS. Plenty of Australian wholesalers run Odoo for sales, purchasing and stock, and keep Xero or MYOB for BAS lodgement, payroll and STP Phase 2 — Community has no Australian payroll either. Moving summary invoice data across is either a periodic CSV export or a piece of custom integration work. Decide which side of that line you want before you migrate, not after.

Other Enterprise-only things worth knowing

The full breakdown is in Community vs Enterprise.

Where to start

Build a demo from the chat on our homepage — it takes about five minutes — and load twenty real products, two customers with different pricelists and one supplier. Run a PO through receipt, a sales order through delivery and invoice, then add a landed cost. If that flow fits how you trade, hosting is flat: $29/month up to 5 users, $79/month up to 15 (AUD +GST, never per user), on AWS in Sydney with nightly backups and SSL — see hosting details. If you need EDI, an accounting bridge or a customer portal for standing orders, send us the scope and we'll quote it fixed-price in writing first.

See your Odoo running in five minutes. No card, no sales call — a chat, a verified email, and a live instance.

Start the demo →