Skip to main content
Odoo POS Offline Mode: What Works, What Does Not, and How to Test It
13 min read
Odoo

Odoo POS Offline Mode: What Works, What Does Not, and How to Test It

Learn what Odoo POS can do offline, where payment terminals and hardware change the picture, and how to test internet outages before retail go-live.

Odoo Point of Sale can keep a shop selling when the internet connection drops, but that sentence needs one important qualification: offline POS is not the same thing as an entirely offline Odoo database.

The checkout interface may continue processing sales while the backend is temporarily unreachable, and Odoo’s current Point of Sale feature page states that offline orders are synchronized when connectivity returns. But payment terminals, printers, stock visibility, invoicing, customer data, and custom extensions all have their own dependencies.

That means the correct question is not simply:

Does Odoo POS work offline?

It is:

Which parts of our checkout flow still work during an outage, which parts degrade, and what happens when the connection comes back?

For a retail rollout, that distinction should be answered in staging before the first store opens.

Official reference: Odoo Point of Sale features

What Odoo currently promises about offline POS

Odoo’s current Point of Sale feature page describes POS as a browser-based application and explicitly lists an Offline mode. It also states that orders made offline are automatically synchronized when the connection is restored.

That gives us two useful baseline facts:

  1. Temporary loss of internet connectivity does not necessarily stop the cashier from creating sales.
  2. Offline orders are intended to synchronize back to Odoo after reconnection.

Those are product-level capabilities. They do not prove that every POS feature, payment device, custom module, or connected service behaves the same way while the server is unreachable.

That is why an offline acceptance test must cover the complete store workflow instead of stopping after one successful cash order.

Offline checkout is not offline ERP

A POS terminal has a very specific job: keep the retail transaction moving.

The rest of Odoo may still depend on server access for live information and business operations. During an outage, you should therefore treat the cashier interface as a temporarily disconnected client rather than assume that Accounting, Inventory, CRM, invoicing, payment providers, and every integration are independently available offline.

This matters especially when a store expects the POS to make real-time decisions such as:

  • checking current stock across branches;
  • creating or updating customer records;
  • applying server-side custom pricing logic;
  • checking a customer credit limit;
  • requesting an invoice immediately;
  • validating loyalty information from another service;
  • calling a payment gateway;
  • creating an external delivery or kitchen ticket;
  • checking a promotion implemented by a custom backend method.

Some of those flows may continue, some may degrade gracefully, and some may need the server.

The implementation rule is simple: anything important enough to block a sale deserves an outage test.

Payment terminals are a separate dependency

Card payments are often where an “offline POS” assumption breaks down.

Odoo 20’s official payment-terminal documentation states that if a connection issue occurs between Odoo and the payment terminal, the transaction is automatically canceled. Odoo supports multiple terminal integrations, but the terminal itself still has network and provider dependencies.

Official reference: Odoo 20 Payment terminals

This means you should not equate:

text
POS screen works offline

with:

text
integrated card terminal will authorize payments offline

Those are different systems.

For each configured payment method, test what the cashier actually sees when connectivity disappears:

  • Does the payment option remain selectable?
  • Does the terminal request fail immediately or time out?
  • Can the cashier cancel the failed payment cleanly?
  • Can another payment method be selected without duplicating the order?
  • What happens if the terminal approved the payment but the POS did not receive the confirmation?
  • How is the transaction reconciled after reconnecting?

The last case is especially important. A network boundary can create an unknown outcome: one side may have completed an operation while the other side never received the response.

Do not solve that scenario with a “retry everything” button unless the payment integration is explicitly designed to be idempotent.

Printing can work differently from card payments

Receipt and kitchen printing have a different dependency model.

Odoo’s current restaurant hardware page states that printing can continue offline when the Point of Sale and the printer remain on the same local network. Odoo 20’s receipt-printer documentation also distinguishes network ePOS printers from printers that require an IoT system.

Official references:

Odoo 20’s printer documentation also notes that Bluetooth printers are not compatible with Odoo.

That gives a useful architecture lesson: local hardware can sometimes continue working even while the remote Odoo server is unavailable, provided the local network path still exists.

But do not assume all printers behave this way. Test the exact model and connection method you plan to deploy:

Hardware pathOutage question to test
Network receipt printerCan the browser/POS still reach it on the LAN?
Kitchen printerDoes the kitchen ticket still print during WAN loss?
IoT-connected printerWhich part requires the server and which part remains local?
USB printerDoes the device route through IoT or another local bridge?
Bluetooth printerOdoo 20 documentation says it is not compatible.

The store network and the internet connection are separate failure domains. A WAN outage does not necessarily mean the local Wi-Fi or Ethernet network is down.

Do not design around undocumented storage assumptions

Older Odoo documentation and community discussions often describe browser-side caching and local storage behavior in detail.

Those explanations are useful for understanding the general idea, but a production design should not assume a specific browser-storage implementation unless it has been verified in the exact Odoo version being deployed.

For the current rollout, focus on observable behavior:

  • Can a session continue selling during internet loss?
  • Can the browser be refreshed safely?
  • Can the device be restarted?
  • How many unsynchronized orders can accumulate?
  • What does the cashier see while orders are pending?
  • What happens when connectivity returns?
  • Can the same offline order be submitted twice?

Those are business requirements. The underlying storage mechanism is an implementation detail unless your customization needs to interact with it directly.

Reconnection is part of the feature, not an afterthought

A successful offline sale is only half of the test.

The real risk appears during recovery.

When the connection returns, the POS must reconcile the local transaction with the backend without:

  • losing the order;
  • creating it twice;
  • assigning the wrong customer;
  • losing the selected payment method;
  • posting inventory twice;
  • generating duplicate invoices;
  • applying a promotion differently from the original checkout;
  • creating inconsistent custom records.

Odoo’s product page states that offline orders synchronize after reconnection. Your job during implementation is to prove that your configured and customized transaction survives that synchronization path.

A custom POS module can make the online flow look correct while accidentally introducing a failure only during replay or synchronization.

That is why every POS customization should be tested in both states:

text
online sale

and

text
offline sale -> reconnect -> synchronized backend sale

Custom POS code needs an explicit offline policy

If you extend Odoo POS with custom JavaScript/OWL components or backend methods, classify every feature into one of three categories.

1. Offline-safe

The feature has everything it needs locally and does not depend on a server decision before the sale can continue.

Examples might include purely local UI behavior or calculations based on data already available in the POS client.

2. Offline-degraded

The feature can continue with reduced capability and finish the missing work later.

For example, a business may allow a sale to continue but defer an external notification until the connection returns.

3. Online-required

The feature must stop or clearly block because continuing would create an invalid transaction.

A real-time authorization, server-only eligibility check, or payment-provider call may fall into this category.

Do not let a network error decide this policy accidentally.

The POS should know how to behave before the outage happens.

Be careful with promotions and custom pricing

Retail projects often add custom promotion logic to Odoo POS.

If that pricing rule exists only in a backend Python method, the POS may not be able to evaluate it while disconnected. If the logic is duplicated independently in the frontend, the two implementations can drift.

Before approving an offline-capable promotion, document:

  • where the pricing rule is evaluated;
  • what input data it requires;
  • whether that data is available to the POS while offline;
  • how rule changes are propagated to open sessions;
  • what happens if the rule changes centrally while a store is disconnected;
  • which value wins after synchronization.

The same principle applies to loyalty programs, coupons, membership pricing, employee discounts, and customer-specific rules.

Offline support increases the importance of deterministic business rules because the server is temporarily unavailable to correct the client in real time.

Stock shown in the POS should be treated carefully during outages

A disconnected store cannot assume that stock elsewhere in the business is standing still.

Even if the POS can continue selling, another branch, warehouse, website, marketplace, or sales team may also be changing inventory.

That means any stock quantity displayed during an outage may have a different freshness guarantee than the same value online.

If inventory availability affects whether the cashier is allowed to sell an item, define the policy explicitly:

  • allow sale based on the last known quantity;
  • allow sale but warn that live stock is unavailable;
  • block selected products while disconnected;
  • keep a store-specific buffer;
  • require online confirmation for scarce or serialized items.

There is no universal correct answer. The right policy depends on the cost of overselling versus the cost of stopping checkout.

For stores with more complex warehouse flows, the offline POS decision should be designed together with Inventory—not as an isolated frontend setting.

Large catalogs need a realistic outage test

A test database with 40 products does not represent a retailer with 30,000 SKUs.

Community discussions continue to show operators asking how offline POS behaves with large product sets and unstable connections. Treat those discussions as a signal that the problem matters, not as technical proof of a particular Odoo limit.

For your own database, measure:

  • time to open a POS session;
  • product-search responsiveness;
  • memory use on the actual device class;
  • how much relevant product/customer data is available after disconnection;
  • offline transaction speed;
  • reconnection and synchronization duration.

Run the test on the same tablets, browsers, network, peripherals, and catalog size that the stores will use.

A desktop browser on fiber is not a meaningful substitute for an entry-level Android tablet at a branch with unstable connectivity.

A production outage test matrix

Before go-live, disconnect the store from the internet intentionally and execute a controlled test.

Core checkout

  • Start with a normal online session.
  • Disconnect internet/WAN access.
  • Add common products.
  • Search for less frequently used products.
  • Change quantity and discount where permitted.
  • Complete a cash sale.
  • Complete several consecutive offline sales.
  • Confirm the cashier can clearly tell that the system is offline.

Payments

  • Attempt every integrated payment terminal.
  • Record the exact error/cancel behavior.
  • Switch from failed card payment to cash without duplicating the order.
  • Test an interrupted payment where connectivity changes during authorization.
  • Reconcile the resulting provider transaction and Odoo order.

Printing and local hardware

  • Print a customer receipt.
  • Send a kitchen/bar ticket if applicable.
  • Test barcode scanner behavior.
  • Test scales or other IoT-connected devices.
  • Repeat with internet down but local LAN available.

Business data

  • Search an existing customer.
  • Test the intended behavior for new-customer creation.
  • Test product information the cashier relies on.
  • Test customer-specific pricing/loyalty rules.
  • Check how stock availability is presented while disconnected.

Recovery

  • Restore connectivity.
  • Wait for synchronization to finish.
  • Confirm every offline order exists exactly once in Odoo.
  • Check payments, taxes, discounts, customer assignment, and order totals.
  • Confirm stock moves and accounting consequences are correct.
  • Check custom models created by POS extensions.
  • Compare the POS session total with the expected offline sales total.

Failure recovery

  • Test loss of connectivity during checkout.
  • Test loss of connectivity during payment.
  • Test repeated reconnect/disconnect cycles.
  • Test browser refresh according to the behavior verified for your deployed version.
  • Test device restart according to the behavior verified for your deployed version.
  • Confirm support staff can identify unsynchronized or failed transactions.

The last two tests matter because a temporary internet outage and a cashier closing the browser are not the same failure.

When standard Odoo POS offline support is enough

Standard POS offline capability can be a good fit when the business mainly needs to continue straightforward checkout during short internet interruptions.

It is especially reasonable when:

  • cash remains an acceptable fallback payment method;
  • the product catalog and pricing needed for the sale are available to the POS;
  • the store can tolerate temporarily stale backend information;
  • recovery can happen after the connection returns;
  • custom POS extensions have been tested offline;
  • staff have a documented outage procedure.

In that scenario, the right project is often configuration, hardware validation, and testing, not custom development.

When a custom offline application may be justified

A custom mobile or web application becomes more reasonable when the business needs offline behavior beyond the retail POS boundary.

Examples include:

  • warehouse picking in locations with no connectivity;
  • field sales that can remain disconnected for hours or days;
  • complex offline forms and attachments;
  • device-specific scanning or camera workflows;
  • a large local dataset with explicit conflict resolution;
  • offline business operations that are not POS orders;
  • controlled background synchronization across several Odoo models.

That is a different architecture from “make the POS work when Wi-Fi drops.”

A true offline-first application needs local persistence, synchronization state, conflict rules, retries, idempotency, authentication behavior, and a clear answer for what happens when the device edits data that changed on the server while it was away.

Octivex builds both Odoo customizations and connected mobile applications, so the important first step is deciding whether the requirement belongs inside POS or outside it. See Octivex Mobile & Web services.

Monitor what happens after the sale

A retail team should not discover failed synchronization from a customer complaint.

Operational monitoring should make it possible to answer:

  • Which stores are currently disconnected?
  • Are there orders waiting to reach the backend?
  • Did any payment fail to reconcile?
  • Did a session close with unexpected totals?
  • Are order counts and revenue consistent with the store’s activity?

For management reporting once orders are posted, Octivex’s POS Dashboard aggregates sessions, sales, payments, refunds, discounts, customers, and cashier performance from Odoo records.

For the broader reporting approach, see Retail Analytics Dashboard for Odoo POS.

The dashboard is not a substitute for transaction-level synchronization monitoring, but posted-order reporting is a useful second control: if store activity happened but the backend totals do not move, someone should investigate.

Offline readiness is a test result, not a checkbox

Odoo POS includes offline capability, and Odoo explicitly advertises continued offline operation with order synchronization after reconnection.

That is the starting point—not the final architecture decision.

A production retail environment also has payment terminals, receipt printers, local networks, customer data, inventory, custom promotions, hardware bridges, and integration code. Each dependency changes what “offline” means.

Before go-live, disconnect the internet deliberately. Sell. Pay. Print. Reconnect. Reconcile. Then repeat the test on the actual store hardware.

If every critical transaction returns to Odoo exactly once and the cashier knows what to do while the connection is down, the store has an offline plan.

If the design only says “Odoo supports offline mode,” it does not yet.

If you are planning an Odoo POS rollout or extending an existing retail setup, Octivex Tech can review the POS, hardware, custom modules, payment integrations, and recovery path before the outage happens in production.