Odoo is an open-source business platform that bundles inventory, point of sale, accounting, e-commerce, CRM, and more than 30 other applications into one system with a single database. For a retail business, the value is straightforward: one place to manage stock, sales, customers, and the books — instead of stitching together a separate POS, a separate inventory app, a separate accounting system, and a separate e-commerce platform that all need to be reconciled at the end of every month.
This guide walks through the complete setup of Odoo for a retail operation, in the order that the work actually has to happen. It is written for the operator or owner-manager driving the implementation, not the developer customizing the source code. Every step is what we'd configure on day one of a real engagement — and every pitfall section is a problem we've watched real retailers run into when they tried to skip ahead.
What Odoo gives a retail operation
Before configuring anything, it's worth being precise about what "Odoo for retail" means in practice. Odoo is not a POS that happens to come with extras — it's a platform with three layers that retail directly depends on:
- Operational apps: Point of Sale, Inventory, Sales, Purchase, and eCommerce handle the day-to-day flow of money and goods.
- Customer-facing apps: Website and Email Marketing manage your storefront and outreach.
- Back-office apps: Accounting, Inventory valuation, and Reporting close the books and surface what's actually happening in the business.
The competitive advantage over a separate POS + accounting stack is the shared data model. When a cashier rings up a sale at the counter, the inventory level updates immediately, the accounting entries post automatically, and the customer's purchase history extends — without any sync job, integration, or manual export. That removes an entire class of operational error.
Before you start: prerequisites and decisions
Three decisions need to be made before any configuration. Making them after the fact means redoing work.
1. Deployment model
Odoo runs in three modes. Use this decision table to pick before you sign up — switching later is possible but adds friction.
| Capability | Odoo Online (SaaS) | Odoo.sh (PaaS) | Self-hosted |
|---|---|---|---|
| Custom modules | No | Yes (Git-deployed) | Yes (full control) |
| SSH / database access | No | Limited (logs, shell) | Full |
| Auto-upgrades | Yes | Yes (with branches) | You manage it |
| Staging environments | Limited (one duplicate) | Yes (per-branch) | You manage it |
| Right for | Single-store, ≤100k SKUs, standard workflows | Custom integrations, niche payment processors, specialized workflows | Strict data residency, very large deployments, air-gapped requirements |
| Operational burden | Lowest | Medium | Highest |
2. Country and chart of accounts
Odoo's accounting localization is per-country. The chart of accounts, tax structure, and reporting formats are loaded from a country-specific package the first time you create a company. Choosing the wrong country or trying to switch later is painful — Odoo does not have a clean "change country" path on a database with transactions.
3. Number of stores and warehouses
If you operate one shop, one warehouse is enough. If you operate two or more shops, even small ones, configure each as a separate Warehouse in Odoo from the start. Adding a second warehouse to a single-warehouse database after months of operation requires reconciling stock that was tracked under "Main Warehouse" — clean up that no one wants to do.
Step 1: Create your company and chart of accounts
Sign up for Odoo Online (or provision your Odoo.sh project) and install three apps to start: Sales, Inventory, and Accounting. These three install the dependencies (CRM, Purchase, Stock) you'll need next.
Then configure the company:
- Navigate to Settings ‣ Users & Companies ‣ Companies and open the default company.
- Set the Country — this is the load-bearing decision. Odoo will install the localization package for accounting, taxes, and legal reports.
- Fill in Currency, VAT/Tax ID, and full address. The address appears on every receipt, invoice, and shipping label.
- Upload your logo. It propagates to receipts, invoices, the customer portal, and the storefront.
Once the country is set, the chart of accounts is loaded automatically. Verify it by navigating to Accounting ‣ Configuration ‣ Chart of Accounts. You should see country-specific accounts — for example, in the EU, separate accounts for intra-community VAT.
Step 2: Configure your warehouse and stock locations
A warehouse in Odoo is a physical location where stock sits. A stock location is a sub-zone within a warehouse — a shelf, an aisle, or a staging area. For most single-shop retailers, the default warehouse with three default locations (Stock, Output, Input) is enough on day one. You can refine later.
Configure the warehouse:
- Navigate to Inventory ‣ Configuration ‣ Warehouses and open the default WH (or rename it to your store).
- Set the Address to your physical store address. This drives shipping label calculations later.
- Set Incoming/Outgoing Shipments to Receive in 1 step / Deliver in 1 step to start. Multi-step routes (with quality control or staging) are a refinement, not a default.
Lot and serial number tracking
Decide whether you need lot or serial number tracking before creating products. Settings are at Inventory ‣ Configuration ‣ Settings ‣ Traceability. If you sell items where each unit must be traced (electronics with serial numbers, pharmaceuticals with lot expiry, jewelry), enable it now. Backfilling traceability onto an existing inventory is a project, not a setting change.
Step 3: Set up your product catalog
Products are the core data of any retail Odoo. Every sale, every stock movement, every accounting entry is a transaction against a product. Get the data shape right, and everything downstream works. Get it wrong, and you'll be cleaning up product master data for years.
Product types
Odoo distinguishes three product types:
- Storable — has stock levels Odoo tracks. This is what most retail items are.
- Consumable — bought and sold but not tracked (e.g., shopping bags). Saves overhead when stock count is irrelevant.
- Service — non-physical, no stock (e.g., gift wrapping fee, repair service).
Variants vs separate products
This is the most common modeling mistake. If you sell a t-shirt in 3 colors and 4 sizes, you have one product with 12 variants, not 12 products. Variants share the same base SKU template, the same description, the same price logic, and consolidate into one row in reports. Treating them as separate products produces unmanageable catalogs and broken POS workflows.
Creating products in bulk
For more than ~50 products, do not create them one by one. Use the import:
- Download the import template from Inventory ‣ Products ‣ Products ‣ Favorites ‣ Import Records.
- Fill it with:
name,default_code(internal SKU),list_price,standard_price(cost),type,categ_id,barcode,route_ids(for purchase/sell behaviors). - Re-upload. Errors are highlighted per row and exportable for fixing.
Product categories
Categories serve two purposes: organization in reports, and accounting policy. Each product category can specify its income account, expense account, inventory valuation method (FIFO/AVCO/Standard), and stock journal. This is how you keep apparel sales in one income account and homewares in another, automatically. Configure categories before you bulk-import products.
Step 4: Configure Point of Sale for retail
Once products and inventory exist, the POS configuration takes ~30 minutes. Install the Point of Sale app and open Point of Sale ‣ Configuration ‣ Point of Sale.
Each POS configuration is a register — a single till. A store with three counters has three POS configurations. They share products, customers, and inventory but each has its own session, journal, and receipt counter.
Critical settings, in order
- Stock Location: which location the POS sells from. For a single store, this is your main stock location. For a store-with-back-room model, this is the front-of-house shelf location.
- Pricelist: optional but powerful. A pricelist defines pricing rules — happy hour, member pricing, B2B vs B2C. POS uses the default pricelist unless you specify another.
- Receipt Header / Footer: legally required information varies by country (VAT number, fiscal codes, return policy). Configure once, applies to every receipt.
- Payment Methods: at minimum cash and card. Card is configured by linking a payment terminal (Adyen, Stripe Terminal, SumUp, Worldline depending on country). The terminal handshake is the only setup step that touches hardware on day one.
Hardware checklist
- POS terminal: any modern tablet or PC with a browser. Odoo POS runs entirely in the browser — no native installation.
- Receipt printer: thermal printer, ESC/POS compatible (Epson TM-T20III, Star TSP143 are well-tested).
- Barcode scanner: any USB or Bluetooth scanner that emits keystrokes works without configuration.
- Cash drawer: opens via the receipt printer. Trigger configured at the printer.
- Card reader: country-specific. The terminal model is dictated by your acquirer.
Step 5: Connect payments and sales channels
If you only sell in-store, payments are configured at the POS level (previous step) and you can skip this section.
If you also have an online presence, install the Website and eCommerce apps. Odoo's storefront is functional for simple catalogs and shares the same product database as the POS — meaning a sale online decrements the same inventory the cashier sees.
For retailers already running on Magento, Shopify, WooCommerce, or PrestaShop, the path is to integrate rather than replace. Odoo's commercial value in this configuration is as the back office: inventory truth, accounting, fulfillment, and unified reporting. The existing storefront stays as the customer-facing layer.
Payment processors
For online payments, Odoo includes connectors for Stripe, Adyen, PayPal, Mollie, and ~15 others. The configuration pattern is identical across processors:
- Navigate to Accounting ‣ Configuration ‣ Payment Providers.
- Open the provider, paste the API key from the processor's dashboard, and set the journal that captures the payments.
- Activate the provider and run a €1 test transaction in test mode before going live.
Step 6: Train staff and run your first day
The single biggest predictor of whether an Odoo go-live is smooth is whether the people using it understand what they're doing. The software is well-designed, but on the first day with real customers in front of the till is not when staff should be discovering how voids work.
Two training sessions, minimum
- Cashier training (60 minutes): open a session, scan/lookup products, apply discounts, accept multiple payment methods, void a line, void a sale, look up a customer, close the session. Have every cashier do all of this twice.
- Manager training (45 minutes): review session reports, handle a refund, adjust inventory after a count, run end-of-day reports, lock and reopen sessions.
The first-day checklist
- All POS configurations have valid sessions opened with a starting cash float.
- At least one practice transaction has been run end-to-end (sale, refund, return).
- Receipt printers print a test receipt successfully.
- Card terminals process a €1 test transaction successfully.
- The accountant has run a test journal entry and confirmed it posts to the expected accounts.
- A backup or export plan exists for the first week's transactions in case anything needs to be reviewed.
Common pitfalls in retail Odoo deployments
In retail Odoo implementations we have run, the failures cluster into the same five patterns. None of them are about the software being inadequate — they're about decisions made (or skipped) during setup.
1. Mismatched chart of accounts
Country was set incorrectly, or the wrong localization was applied, and the accounting reports do not match what the local tax authority expects. Fixing this post-go-live can take weeks of journal corrections. Verify the chart of accounts before recording the first transaction.
2. Products created without categories
If product categories are not configured, every product gets the default income/expense accounts. After 5,000 products and 6 months of sales, splitting reports by department becomes a manual SQL exercise. Configure categories before bulk-importing products.
3. POS sessions left open overnight
An open session accumulates transactions but does not post them to accounting until closed. A session left open for a week skews every interim report and produces a messy reconciliation when finally closed. Close sessions every day.
4. No barcode discipline
If half your products have barcodes and the other half don't, cashiers rely on product search. Search is slow, error-prone, and creates queueing. Either every retail product has a barcode or you commit to product search-only and remove the barcode field from the POS UI.
5. Inventory accuracy degrades silently
The biggest gap between Odoo's promise and Odoo's reality in retail. The system is only as accurate as the count. After 90 days without a physical count, the digital inventory and the actual shelf will diverge. Schedule cycle counts from week one. Inventory accuracy is a discipline, not a feature.
Reference notes
Sources verified against Odoo 19.0 documentation and standards bodies. Use these to confirm anything before applying it to your environment.
- Odoo Inventory — Odoo 19.0 documentation — inventory app overview and configuration
- Odoo Accounting localization — Odoo 19.0 documentation — country-specific chart of accounts and tax rules
- Odoo Point of Sale — Odoo 19.0 documentation — POS setup, hardware, payments
- Odoo Pricing & Editions — subscription pricing per user, app fees by region
- GS1 GTIN Management Standard — EAN-13 / UPC-A barcode standards for retail
Frequently Asked Questions
How long does it take to set up Odoo for a small retail store?
For a single store with one warehouse and standard workflows, plan on 2–4 weeks from kickoff to go-live. The actual configuration work is roughly 40–60 hours; the rest is data preparation (product import), staff training, and dry-run testing. Multi-store deployments add 1–2 weeks per additional location. E-commerce integration with an existing platform adds 4–8 weeks depending on the platform.
How much does Odoo cost for a retail business?
Odoo Enterprise is priced per user per month, plus app fees that vary by region. As of 2026, a typical small retailer with 3 users and the standard retail apps (POS, Inventory, Sales, Accounting, eCommerce) lands around €40–€70 per user per month on Odoo Online. Implementation cost from a partner like Magendoo is on top of subscription — typically €5,000–€15,000 for a single-store implementation, more for multi-store or integrated deployments. Odoo Community is free but does not include POS or full localization.
Can Odoo replace my current POS and accounting software completely?
Yes, for most retailers under ~€50M annual revenue. Odoo POS handles in-store sales, returns, multi-payment, gift cards, loyalty, and offline operation. Odoo Accounting covers invoicing, supplier bills, tax reports, and bank reconciliation for ~70 countries with localization packages. For very large retailers (€100M+) or highly regulated industries, the question is more nuanced and depends on specific compliance requirements rather than feature gaps.
Do I need a developer to set up Odoo for retail?
No, the standard configuration described in this guide is point-and-click in the Odoo UI. You need a developer when you want a custom integration with a non-supported payment processor, a custom module for a workflow Odoo doesn't support natively, or a complex data migration from a legacy system. For a typical small-to-mid retail deployment, an experienced functional consultant or implementation partner is more useful than a developer.
How does Odoo POS compare to Shopify POS or Square?
Odoo POS is part of an integrated business platform — its data lives in the same database as inventory, accounting, and e-commerce. Shopify POS and Square are excellent point-of-sale tools, but they are not full back-office systems. The choice depends on the business model: a pure retailer running 1–2 shops with a Shopify website is well served by Shopify POS plus separate accounting. A retailer with a warehouse, complex inventory, multiple sales channels, and a need to consolidate financials in one system gets more value from Odoo's integrated approach. The break-even point is typically around 2 stores or €1M annual revenue.
Can I migrate from my current system to Odoo without losing data?
Yes, with planning. Customers, products, suppliers, and historical sales can all be imported into Odoo. The strategy depends on the source system: structured CSV exports work for Shopify, SQL extracts work for Magento and self-hosted systems, and bespoke parsers are needed for legacy POS systems. Open inventory, open orders, and accounting balances are migrated as opening balances on a cutover date — not as historical transactions. For details on this approach, see Odoo Data Migration: Best Practices.