Taqnix POS Terminal – Offline-First Point of Sale PWA for Odoo 19: Next.js Source Code with Restaurant Tables, Kitchen Tickets, Loyalty and Arabic
A point of sale for Odoo 19 that runs in the browser as an installable app and keeps selling when the network is gone: every order is saved on the device first and sent to Odoo once, with the same call Odoo's own POS uses. Variants and combos, split payments, receipts with barcode and QR, restaurant tables and kitchen tickets, dashboard, stock lookup, layaway, loyalty, English and Arabic. Full Next.js source code; no Odoo module to install.
A point of sale for Odoo 19 that keeps selling when the network is gone.
Taqnix POS Terminal runs in the browser as an installable app (PWA). It keeps the catalogue, the customers and the open orders on the device, sells without a connection and sends every order to Odoo once, with pos.order.sync_from_ui, the call Odoo's own POS uses. No Odoo module to install: it works with the standard Point of Sale of Odoo 19. You get the ready-to-run web app (unzip it, start it with Node.js, open it in Chrome) and the full Next.js source code, for your company and as many terminals as you need.
For the cashier
Sell screen for the counter and the tablet: search by name, reference or barcode, categories in colour, favourites, a barcode scanner that types like a keyboard, keyboard shortcuts
Variants and combos with Odoo's price extras, exclusions and "1 of 2" groups; notes, line and order discounts, pricelists, fiscal positions
Customers: search, details, and new customers created offline when the Odoo user may create them
Payment: several methods, change in cash, cash rounding, customer account, invoice flag
Receipts 58 or 80 mm with tax letters like Odoo, a barcode and a QR code; printed by the browser
English and Arabic with a full right-to-left layout, 5 themes and your brand colour, PIN lock and a manager PIN for discounts, refunds and cancellations
Offline first
Every order is written to the device before the receipt is shown, then sent one at a time, oldest first; Odoo recognises an order it already has, so a lost answer never creates a duplicate
Network errors are retried (5 s up to every 15 minutes); refusals stay in the Sync screen with the reason and the missing right
Catalogue changes arrive as small updates every 5 minutes; the terminal starts offline from the first visit (service worker)
Totals like Odoo
Odoo stores the totals a POS sends, so the terminal computes them with a TypeScript port of Odoo 19's tax code and POS price rules (pricelists, fiscal positions, combos, variants, cash rounding, global discount). Checked against 667 scenarios computed by Odoo 19 itself (447 of them sent to Odoo) and 1,149 more orders sent to Odoo and recomputed with Odoo's Python and JavaScript. The cases where Odoo's own client and server disagree are documented.
Restaurant
When Odoo's Restaurant is installed and the point of sale is a restaurant: your Odoo floor plan with live table states, table orders with guests and presets, kitchen tickets per printer that send only what changed, split bill, transfer, merge and tips.
Pro screens included
Dashboard (sales, orders, average ticket, taxes, payment methods, top products), stock lookup in every warehouse, layaway with deposits, loyalty points and promo codes.
Measured
On one Apple Silicon Mac with Odoo, the app and the browser on the same machine (not a tablet; a tablet will be slower): 20,000 products and 20,000 customers downloaded in 24.5 s; warm start to a usable product grid in 0.78-0.87 s; product search about 80 ms; add to cart 1.7 ms (median); 1,000 orders queued offline sent in 169 s, in order, without duplicates.
Tested
3,336 automated tests (unit, integration with a simulated Odoo, the tax engine against Odoo's numbers), plus 66 live tests that run against a real Odoo 19 database.
Honest limits
Printers, barcode scanners and cash drawers were not verified on real hardware; printing is browser printing only (no raw ESC/POS, no IoT box, no Epson ePOS network printing driven by the terminal); no payment-terminal integration
Tested in Chromium-class browsers (Chrome, Edge); Safari and Firefox not verified
Tested on Odoo 19 Community; Odoo Enterprise not tested. A Dockerfile is provided; the image was not built in our tests
The ready-to-run app was started on macOS with Node.js 24; its Windows launcher, Linux, and Node.js 20 and 22 were not tried
A plain cashier cannot create customers, save custom attribute values or sell lot / serial products without the matching Odoo rights (the Setup screen shows the missing rights it can check)
Not included: restaurant courses, floor editing (done in Odoo), gift cards and eWallet (their products are hidden from the catalogue when such a program is active, because the terminal cannot credit them), multi-company, employee login (pos_hr), self-order
The lock PIN is a convenience lock, not protection against someone who copies the browser profile
What's included
taqnix-pos-terminal-webapp.zip: the ready-to-run web app, already built, with a launcher for Windows, macOS and Linux (only Node.js 20.9 or newer needed)
taqnix-pos-terminal.zip: the source code (Next.js app with its tests, Dockerfile, nginx examples), recorded Odoo answers, the demo-shop seed and browser test scripts
Illustrated documentation in English and Arabic (HTML and PDF), licence, changelog
Requirements
Odoo 19.0 with Point of Sale (Restaurant, Loyalty and Discount optional), Node.js 20.9 or newer (all the ready-to-run app needs; or Docker), HTTPS, and Chrome or Edge on the till.
What's in the download
The files in the archive you can download after you buy.
No reviews yet. Bought this item? Be the first to review it.
Usage
Install and use it in a few lines.
# in the folder taqnix-pos-terminal-webapp (unzipped from taqnix-pos-terminal-webapp.zip); only Node.js 20.9+ is neededsh start.sh https://your-odoo.example.com # Windows: start.bat https://your-odoo.example.com# then open http://localhost:3000 in Chrome or Edge (tills on other devices: put HTTPS in front, see README.txt)
# the application is in src/pos-terminal/ of the packagecd src/pos-terminalnpm cinpm run buildcp .env.example .env # set POS_ALLOWED_ORIGINS=https://your-odoo.example.com (and POS_DISABLE_JSONRPC=1)npm start # http://localhost:3000 - put it behind HTTPS (deploy/nginx.conf.example)npm test # the unit, integration and tax-engine tests (no Odoo needed)
Documentation
Setup, settings and troubleshooting, written by the author.
Offline-first point of sale for Odoo 19 as an installable progressive web app (Next.js 16, React 19, TypeScript): no Odoo module to install.
Setup with a connection test (JSON-2 with API key or JSON-RPC, proxy or direct mode), point-of-sale picker, opening cash count and session closing with cash difference and closing report.
Sell screen: search, categories, favourites, barcode scanner, variants, combos, notes, discounts, pricelists, customers (also created offline when the user may), held orders.
Payment with several methods, change, cash rounding, customer account and invoice flag; receipts 58 / 80 mm with tax letters, barcode and QR; browser printing.
Offline data in IndexedDB with delta downloads; orders sent once, in order, with retries; Orders and Sync screens with reprint, refund, retry, export and diagnostics.
Tax and price engine ported from Odoo 19, checked against 667 scenarios computed by Odoo and 1,149 orders sent to Odoo.
Restaurant (when Odoo's Restaurant is installed): floor plan, table orders, kitchen tickets per printer, split bill, transfer, merge, tips.
Pro screens: dashboard, stock lookup across warehouses, layaway with deposits, loyalty points and promo codes.
Settings: 5 themes and brand colour, density, text size, English and Arabic (right to left), lock PIN, manager PIN.
Security: allow-listed proxy with address checks and a failed-login limit, Content-Security-Policy, encrypted key with a lock PIN.
Ready-to-run web app with launchers for Windows, macOS and Linux (only Node.js needed), and the complete source code.
3,336 automated tests; Dockerfile and nginx examples; documentation in English and Arabic.
Frequently asked questions
What do I get?+
The ready-to-run web app (start it with Node.js alone, with launchers for Windows, macOS and Linux) and the complete source code of the terminal (Next.js 16, React 19, TypeScript, Tailwind CSS 4, IndexedDB) with its 3,336 automated tests, a Dockerfile and nginx examples, the seed of the demo shop shown on the pictures, and an illustrated guide in English and Arabic. One purchase covers one company and an unlimited number of terminals.
Do I need an Odoo module or Odoo Enterprise?+
No module: the terminal talks to the standard Point of Sale of Odoo 19 with the calls Odoo's own POS uses. It was tested on Odoo 19 Community. Odoo Enterprise was not tested. Restaurant, Loyalty and Discount are used when they are installed.
How does it work offline?+
The catalogue, customers, taxes, prices and the open orders are kept in the browser (IndexedDB). A paid order is saved on the device before the receipt appears, then sent to Odoo one at a time, oldest first, and Odoo recognises an order it already has, so a lost answer never creates a duplicate. Network errors are retried; refusals (for example a missing right) stay in the Sync screen with the reason. Closing a session needs the connection.
Are the totals the same as in Odoo?+
Odoo stores the totals a POS sends, so the terminal computes them with a TypeScript port of Odoo 19's tax code and POS price rules. It was checked against 667 scenarios computed by Odoo 19 itself (447 of them sent to Odoo) and 1,149 more orders sent to Odoo and recomputed with Odoo's Python and JavaScript. The few cases where Odoo's own client and server disagree are listed in the guide.
Do I get the restaurant screens?+
Yes, when Odoo's Restaurant (pos_restaurant) is installed and the point of sale is a restaurant: floor plan, table orders, kitchen tickets per printer, split bill, transfer, merge and tips. A retail point of sale shows none of it. Courses and floor editing are not in the terminal (edit floors in Odoo).
Which printers, scanners and cash drawers work?+
Printing is done by the browser (receipts 58 or 80 mm, kitchen tickets), on any printer the operating system can print to; Chrome can print without a dialog with --kiosk-printing. There is no raw ESC/POS, no IoT box and no Epson ePOS network printing, and no payment-terminal integration. Barcode scanners that type like a keyboard are read anywhere. Printers, scanners and cash drawers were not verified on real hardware.
Is it secure?+
The browser calls the app's own server, which forwards only a fixed list of Odoo routes, refuses link-local and cloud-metadata addresses, limits failed logins and never forwards cookies. Use one API key per terminal with only the Point of Sale group. The lock PIN encrypts the stored key, but it protects against casual access, not against someone who copies the browser profile. The server has no login of its own: on the internet put it behind HTTPS and a VPN, SSO or an IP allow-list.
Is it available in Arabic?+
Yes. Every screen is in English and Arabic with a full right-to-left layout, and the guide is in both languages. Product and category names come from Odoo in the user's language.
What do I need to host it, and how do updates work?+
Node.js 20.9 or newer (all the ready-to-run app needs; or Docker: a Dockerfile is provided, the image was not built in our tests), HTTPS, and Chrome or Edge on the till (Safari and Firefox were not verified). Updates of version 1.x are included; a new version is installed on the server and the terminal offers "Update" without reloading in the middle of a sale.
More from TAQNIX
ModuleNew
UAE E-Invoicing (PINT AE) for Odoo 19 Community – PINT AE XML for Your ASP, Readiness Checks, UBL XSD and Schematron Validation, E-Invoice Outbox
Prepare UAE e-invoices and credit notes in the PINT AE format (Peppol PINT AE Billing 1.0.4, UBL 2.1) for your Accredited Service Provider: TIN, TRN and tax categories, readiness checks per invoice and per batch, validation against the official XSD and Schematron, an outbox with statuses, a log and XML / ZIP export. It does not send anything. Arabic included.
AI Support Reply Drafts for WooCommerce – Order-Aware Customer Reply Drafts with Fact Checks
Draft replies to customer messages on the WooCommerce order screen with your AI model, from the order facts and your own shop texts only. Missing facts become [CHECK] placeholders; nothing is sent without a click and a confirmation.
AI Product Recommender and Bundles for WooCommerce – Related Products, Complete the Look & Add All to Cart
Related products and “complete the look” bundles ranked by AI meaning similarity and what your customers bought together, with Add all to cart, a preview with the reasons, pins and exclusions.
AI Post and Product Translator for WordPress & WooCommerce – Linked Drafts, Glossary & hreflang
Translate posts, pages and WooCommerce products with your own AI into linked drafts: block-safe placeholders, a glossary and do-not-translate list, a structure check that refuses broken results, outdated detection, bulk runs with a cost estimate, a language switcher and hreflang links.
Odoo ePOD & Last-Mile Dispatch – Offline Flutter Driver App with Photo, Signature, OTP & GPS Proof of Delivery, Route Optimizer and COD Settlement for Odoo 19 Community
Plan daily delivery runs, optimize the stop order, and get a complete electronic proof of delivery from an offline-first Flutter driver app: geofenced arrival, GPS and time stamp, watermarked photos, signature, customer one-time code and failure reasons. Deliveries validate automatically with backorders, and cash on delivery is settled and reconciled. Odoo Community module included.
Odoo Mobile WMS & Barcode Scanner (Paperless Warehouse) – GS1 Engine, Wave Picking, Cycle Counts and Rugged-Scanner Flutter App for Zebra, Honeywell and Datalogic on Odoo 19 Community
Replace the Enterprise Barcode app on Odoo Community: a GS1-aware barcode engine, receipts, deliveries and bin-to-bin moves with lots, serials and expiry, wave picking along a snake path with bin check digits, blind cycle counts with manager approval, labels, an audit log, and the Flutter scanner app source for Zebra DataWedge, Honeywell and Datalogic with camera fallback.
Odoo Construction Daily Site Diary & Punch List – Flutter Offline Jobsite App, Subcontractor Manpower, Blueprint Pins, Delivery GRN and Budget vs Actual for Odoo 19 Community
The foreman writes the daily log, drops defect pins on the blueprints and receives deliveries against purchase orders, on a phone, with or without signal. The project office sees labor, equipment and material against the budget the same day. Odoo Community module plus an offline-first Flutter app.
Odoo Restaurant Waiter App & Kitchen Display (KDS) – Flutter Table-Side Ordering, Hold & Fire Courses, Split Bills, QR Payment and Recipe Stock for Odoo 19 Community
Take orders at the table and show them on the kitchen screens in milliseconds: live floor map, forced modifiers and add-ons, hold and fire courses, station routing with SLA timers, split bills, QR payment, ESC/POS receipts and automatic recipe consumption. Odoo Community module plus one Flutter app for waiters and kitchen tablets.