Vendors / Open source & self-hostable
Odoo POS + pos_restaurant
Odoo POS + pos_restaurant (Odoo S.A.)
dossier live legacy rubric
- Claims in scope
- 278
- Scored
- 278
- Assessed
- 276
- Unknown
- 2
- Not applicable
- 36
- Values challenged
- 81
Identity
- Owner
- Odoo S.A. (Belgium), independent. Not a subsidiary of a POS or payments company.
- Parent
- Odoo S.A.
- Founded
- Odoo S.A. founded 2005 in Belgium (as TinyERP, then OpenERP, renamed Odoo 2014). pos_restaurant ships in the core odoo/odoo repository.
- Scale
- unknown — Odoo publishes no audited restaurant-location count, POS ARR, or restaurant market share. Company-wide user counts appear only in marketing copy and were not treated as evidence.
- Who it is for
- SMBs and mid-market already standardizing on Odoo ERP; single-site to small-group independent restaurants, bars and fast-food; strong in EU, LATAM, MENA, India. Not a US enterprise chain buyer. Restaurant-specific store-count share is unknown.
- Site
- https://www.odoo.com/app/point-of-sale-restaurant
Pricing
transparency: published · unit: per-employee · processor lock-in: no
- Software
- Published on odoo.com/pricing: One App Free = $0, one app, unlimited users, Odoo Online only. Standard = $24.90/user/month promotional, $31.10/user/month regular annual; all apps, Odoo Online only. Custom = $49.00/user/month promotional, $61.00/user/month regular annual; all apps plus Odoo Studio, multi-company, and external API access; Odoo Online, Odoo.sh or On-Premise. Discount 'valid for 12 months, for initial users ordered.' Critical structural note: POS Restaurant alone qualifies for One App Free ('Free, forever, with unlimited users' on the product page), but the free and Standard tiers exclude external API access, and the UrbanPiper food-delivery connector requires an active Odoo Enterprise subscription (Community not supported). Community Edition is LGPL-3 and free to self-host with no user fee at all.
- Card processing
- n/a — Odoo is not a payment acquirer and publishes no card rates. Rates come from whichever of the 13 supported terminal providers the merchant contracts with.
- Contract
- Enterprise Subscription Agreement §1: 'The duration of this Agreement (the "Term") shall be specified in writing on conclusion of this Agreement... automatically renewed for an equal Term, unless either party provides a written notice of termination minimum 30 days before the end of the Term.' Monthly and annual pricing are both published; annual is the discounted default.
- Early termination
- unknown — no ETF or liquidated-damages figure found in the published ESA. The ESA does specify a penalty for continuing to use Enterprise Edition after termination: 'an extra fee equal to 300% of the applicable list price for the actual number of Users.' That is a post-termination license-breach penalty, not a cancellation fee.
API posture
public API: paid
- Cost to integrate
- Documentation states verbatim: 'Access to data via the external API is only available on Custom Odoo pricing plans. Access to the external API is not available on One App Free or Standard plans.' That means ~$49–61/user/month to use the API on Odoo Online. Self-hosted Community/Enterprise installs are not subject to this gate. No partner fee, rev share, or certification cost was found published; the app marketplace (apps.odoo.com) is open self-publish.
- Webhooks
- Outbound only via Studio automation rules: a 'Send Webhook Notification' action POSTs selected fields to a URL on any model trigger, and an 'External' trigger category accepts inbound webhooks. This is generic ORM plumbing, not a documented order-lifecycle event stream. No HMAC signing, retry/backoff policy, or replayable event log is documented. Studio requires the Custom plan.
- Data export on exit
- Strong. Odoo's SLA page states 'Users can download manual backups of their live data at any time' — a full Postgres database dump including orders, customers, loyalty and payments metadata. Every list view exports to CSV/XLSX. Community Edition is LGPL-3, so the operator can restore that dump onto their own server and keep running the identical software. For Enterprise the right is contractual rather than merely operational — ESA section 6.5(h) binds Odoo to 'permanently delete all copies of the Customer's database in possession of Odoo SA, or return such data, at the Customer's choice, upon termination of this Agreement, subject to the delays specified in Odoo SA's Privacy Policy' — a customer-elected return, which is what makes the Privacy Policy's three-week deactivation a retrieval window rather than only a retention period. This is the single best exit posture of any vendor in this category.
- Notes
- The API is the Odoo ORM exposed over /json/2 with bearer API-key auth — full read/write symmetry across every model (pos.order, product.template, res.partner, hr.employee, stock.quant). There is no OAuth 2.0 scoped-consent model for third-party apps and no published numeric rate limits. Self-serve docs are readable with no NDA or sales call.
Capabilities
Every claim is binary and checkable. Grades: A primary documentation · B product documentation · C pricing or feature page · D marketing claim · E third-party reporting · F inference with no source. A yes on a differentiator claim requires A or B.
Order capture & FOH workflow
Provides a graphical floor-plan editor where an operator can draw sections, place tables of varying shape/capacity, save multiple floor-plan layouts per location, and assign sections to servers.
order-capture-floor-plan-editor
Multi-floor editor in backend and POS frontend: table number, seats, square/round shape, size, color, background image, clone. No server-section assignment. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Order lines can be tagged to a seat number at entry, and the check can be split by seat afterward without re-keying items.
order-capture-seat-level
Split flow selects products, not seats. Presets capture a guest count only. No seat tagging on order lines documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Items can be assigned to courses and held, with a fire-next-course action available from a handheld or terminal that releases only that course to the kitchen.
order-capture-coursing-hold-fire
Course button splits the order; Order fires course 1; retrieve from floor plan and click Fire Course 2. Transfer course between courses. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Supports splitting a check by item, by seat, by even N-way, and by arbitrary dollar/percentage amount, and merging checks or tables back together, including after partial payment.
order-capture-split-merge
Split by product into a sub-order, transfer products to another table, merge by transferring onto an occupied table. No even N-way or arbitrary-amount split. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Opens a bar tab against a card pre-authorization with a configurable auth amount, supports incremental re-auth as the tab grows, and auto-closes stale tabs at end of day. differentiator
order-capture-bar-tab-preauth
Set Tab records only an open order name. No card pre-authorization, incremental re-auth, or stale-tab auto-close documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
An open check can be transferred between servers, tables, and devices, and the transfer is recorded in an audit log naming both employees.
order-capture-transfer-audit
Transfer/Merge documented; session report attributes each order to an Employee. No transfer-specific audit entry naming both employees. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Ships a first-party handheld ordering app running natively on the handheld device (not a remote/mirrored desktop session) that can send to kitchen and take a card payment tableside.
order-capture-native-handheld
POS is a browser app running on any tablet or phone, plus iMin Android devices. Odoo ships no first-party purpose-built handheld. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
With the internet down, terminals and handhelds can still create orders, apply modifiers, send to kitchen, and tender cash, and the vendor publishes what does and does not work offline.
order-capture-offline-order-entry
Docs claim it is 'built to maintain functionality even during temporary network outages'. No published list of what works offline. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale.html · retrieved 2026-08-01
Guest QR at-table ordering writes items onto the same open check as server-entered items, rather than creating a separate order ticket. differentiator
order-capture-qr-same-check
Per-table QR codes; guest orders assign a table and land in POS orders and the prep display. Merging onto an open server check is not stated. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-08-01
Offers a first-party self-order kiosk that renders the same menu and modifier tree as the POS with no separate menu build, and the vendor documents ADA/accessibility conformance for it. differentiator
order-capture-kiosk-first-party
First-party kiosk on the same product records. No ADA/WCAG conformance documented; kiosk payment limited to Adyen and Stripe terminals. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-08-01
Supports drive-thru-specific order flow: order-point/pay-window/pickup-window separation, order sequencing or tandem-lane assignment, and pull-forward or parking-spot assignment.
order-capture-drive-thru
UPHELD on re-run instruments. The POS index enumerates every documented POS area and the restaurant entry reads 'Features specific to restaurants: manage floors, tables, tips, and online delivery.' - no drive-thru area. Re-run over the FULL 696-document corpus with the fixed nav-stripping grep: drive.?thr(u|ough) 0, curbside 0. Doc-tree three-state probe (addendum 3b): .../point_of_sale/restaurant/drive_thru.html returns the 146-byte NEVER-EXISTED 404, identical to the fabricated control .../extra/zzq_fabricated.html and NOT the 132-byte retired stub, so no such page was ever built; and no drive-thru docname appears in the 1,159-page Sphinx build census. MODULE/EDITION: no lane, window-separation or pull-forward module exists in the 638 Community modules (.cache/q210/odoo-addons.txt) and none is documented for Enterprise either, so this is absent from BOTH editions - a proper 'no' under the addendum section 4 rule, not an edition gate. Falsified by any 19.0 module or page implementing lane assignment or order/pay/pickup window separation. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale.html · retrieved 2026-09-05 adversarially verified
Captures and reports drive-thru speed-of-service timers by segment (order, total, window) tied to individual orders.
order-capture-drive-thru-timers
RE-HOMED off reporting.html and upgraded to grade A, because the proposal's instrument was overclaimed: reporting.html says its statistics are 'available in a graph or pivot view that you can filter or group depending on your needs', and an open-ended pivot means that page enumerates one list view but NOT the reportable field set. The model does enumerate it. In Community point_of_sale, pos.order carries exactly one clock field, "date_order = fields.Datetime(string='Date', readonly=True, index=True, default=fields.Datetime.now)", plus "preset_time = fields.Datetime(string='Hour'" and "shipping_date = fields.Date('Shipping Date')". There is no elapsed-time field, no per-segment (order/total/window) duration and nothing to group a speed-of-service report by; 'speed of service' returns 0 over 696 docs. MODULE/EDITION: point_of_sale, Community, grade A source tree. The only elapsed-time instrument in the product is the 'Alert timer (min)' and the order card's waiting-time indicator of pos_preparation_display, which is Enterprise (absent from the 638 Community modules) and is a kitchen-stage timer, not a drive-thru window timer. Falsified by an Enterprise field storing per-order stage timestamps exposed to reporting. https://raw.githubusercontent.com/odoo/odoo/19.0/addons/point_of_sale/models/pos_order.py · retrieved 2026-09-05 adversarially verified
Vendor ships a first-party AI voice ordering agent for phone and/or drive-thru that injects orders directly as POS orders, or publishes a documented API partner program for third-party voice AI. differentiator
order-capture-voice-ai
UPHELD on limb one and the note CORRECTED, because the proposal never addressed the rubric's SECOND limb, 'or publishes a documented API partner program for third-party voice AI'. Limb one: this page is Odoo's whole voice surface and it is dictation - 'Odoo AI can transcribe spoken audio into text and generate summaries from that transcript.' - with no caller-facing agent and no order injection. Limb two, tested here for the first time: 'certified partner' 0 and 'conversational ai' 0 over 696 docs; legal/terms/partnership.html is the RESELLER partner programme, not an integration certification, and developer/reference/external_api.html is a generic ORM XML-RPC/JSON-RPC surface, not a voice-AI partner program - a third party could write pos.order over it, but Odoo publishes no programme for doing so. Vocabulary control run with the addendum's word-boundary trap avoided: voice ?(order|assistant|bot|agent) = 1 and it is 'invoice orders' on invoicing_policy.html; 'phone order' 0, 'answer.{0,20}call' 0, 'speech recognition' 0. MODULE/EDITION: no module named ai or *_ai is among the 638 Community modules, so the AI application is Enterprise - moot, because in NEITHER edition is this order capture, which is why this is a 'no' and not an edition-gated 'partial'. Falsified by a documented voice agent that writes pos.order, or by a named voice-AI partner programme. https://www.odoo.com/documentation/19.0/applications/productivity/ai/voice.html · retrieved 2026-09-05 adversarially verified
Supports order throttling: per-channel capacity limits per time slot with automatic quote-time extension when kitchen load exceeds a configured threshold. differentiator
order-capture-throttling
Presets support time slots plus a Preparation capacity limit per time frame. No automatic quote-time extension on kitchen load. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html · retrieved 2026-08-01
Accepts future-dated/scheduled orders with a per-channel lead time and automatically injects them into the make queue at a computed fire time rather than on receipt.
order-capture-scheduled-orders
Manage orders by time lets staff or guests pick a future slot. Auto-injection into the make queue at a computed fire time is not documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html · retrieved 2026-08-01
Provides a distinct catering order flow with quotes, deposits, balance-due tracking, and a delivery/event schedule separate from the standard order queue.
order-capture-catering
UPHELD after reading the page end to end and confirming all four mechanical limbs verbatim: quotes - the register opens 'the list of quotations and sales orders created from the sales application'; deposits - 'Apply a down payment (percentage) or Apply a down payment (fixed amount)'; balance due - 'Once a sales order is partially settled, the applied down payment is automatically deducted' from the order total; schedule - 'The Ship Later feature allows you to sell products and schedule delivery at a later date', with a shipping date, Warehouse and Specific route. The Sales-order queue is genuinely separate from the POS order queue, which answers the rubric's 'separate from the standard order queue'. What is missing is the catering flow as a distinct object: 'catering' returns 0 over 696 docs, no catering docname is in the 1,159-page census, and the doc-tree probe returns the 146-byte never-existed 404 for both .../point_of_sale/catering.html and .../restaurant/catering.html. MODULE/EDITION: point_of_sale plus pos_sale, both in the 638 Community modules, and the Sales app must be installed. Falsified to yes by a catering-specific order type or event-schedule view; falsified to no if down payments prove unavailable from the register. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/shop.html · retrieved 2026-09-05 adversarially verified
Pushes an order-ready signal back to third-party marketplaces (e.g. DoorDash) from POS or KDS state, rather than requiring a tablet tap. differentiator
order-capture-order-ready-signal
UPHELD, and the onward-transmission doubt the analyst self-reported is now resolved AGAINST the doubt by evidence they did not cite. The page keeps two distinct fields on one order: 'Order Status' (Placed to Acknowledged to Food Ready) and Odoo's own 'Status' (New/Ongoing/Done, switching to Paid). Only a platform-side lifecycle explains the first, and the Order rejection section proves those actions round-trip to the marketplace: 'Swiggy orders cannot be directly rejected. Attempting to reject one prompts Swiggy customer support to contact the restaurant. Similarly, Deliveroo, JustEat, and HungerStation do not allow order rejection.' Per-platform acceptance rules only bind if the action is sent to the platform. The signal is raised from POS state by an operator - 'Click the Mark as ready button.' - not by a marketplace tablet, which is exactly what the rubric asks. MODULE/EDITION: pos_urban_piper, ENTERPRISE ONLY - 'An active Odoo Enterprise subscription is required. Odoo Community does not support this integration.' - and the module is absent from the 638 Community modules. Partial, not yes, PURELY on the addendum section 4 edition rule (first-party plus documented plus Enterprise-only equals partial, matching the standing hardware-kds precedent); on merits alone for an Enterprise tenant it would be yes. Falsified if Food Ready is shown to be an Odoo-internal state only. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html · retrieved 2026-09-05 adversarially verified
Voids, comps, and discounts require a reason code and can be gated behind role-based manager approval, with all instances recorded in an exception report.
order-capture-void-comp-controls
Three fixed rights tiers gate discounts, price changes, refunds and cancels. No reason codes and no dedicated exception report. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/employee_login.html · retrieved 2026-08-01
Menu, modifiers & pricing engine
Payments & money movement
The POS operates with third-party payment processors of the merchant's choosing (documented list of supported processors/gateways) rather than requiring the vendor's in-house processing. differentiator
payments-processor-choice
All thirteen names verified on the terminals page exactly as listed. Processor neutrality is real and is the dossier's most defensible differentiator. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01 adversarially verified
Vendor publishes card-processing pricing publicly (a specific flat rate or interchange-plus markup) rather than quote-only. differentiator
payments-published-rates
Odoo takes no payment margin and publishes no card rates; pricing comes from the merchant's chosen terminal provider. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01
Native dual-pricing / cash-discount mode stores two prices per item and prints both cash and card totals on the guest check and receipt. differentiator
payments-dual-pricing
No dual-pricing or cash-discount mode in the payment or pricing documentation. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Surcharging engine automatically excludes debit and prepaid cards via BIN/product-code detection, enforces the network percentage cap, and can be enabled or disabled per location. differentiator
payments-surcharge-guardrails
No surcharging engine, no BIN/debit exclusion, no network cap enforcement documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods.html · retrieved 2026-08-01
All first-party payment terminals accept EMV chip and NFC contactless including Apple Pay and Google Pay.
payments-emv-nfc
EMV and NFC come from the third-party terminal (Adyen, Stripe, Worldline etc.). Odoo ships no first-party terminal, so acceptance depends on provider. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01
Accepts contactless payments directly on a phone (Tap to Pay on iPhone and/or Android tap-to-pay) with no separate card reader. differentiator
payments-softpos-tap-to-pay
UPHELD. Verified verbatim on the page: 'The viva.com Terminal app turns a smartphone with an NFC chip into a payment terminal', 'Viva.com payment terminals do not require an IoT Box to operate', and the Odoo side is a real first-party integration - a Payment Method where you 'Set the Integration field to Terminal' and 'Set the Integrate with field to Viva.com', with Merchant ID, API Key, Client ID, Client secret and Terminal ID, plus a generated 'Viva Com Webhook Endpoint'. MODULE/EDITION: pos_viva_com is PRESENT in the 638 Community modules, so this cell is not edition-gated and partial here is not the addendum section 4 rule. Partial for three independent reasons: the acquirer rule - the NFC acceptance happens inside Viva's own Terminal app over Viva's Cloud Terminal API, and a terminal provider's capability may never score an Odoo cell yes; the page's own hard limit, 'Odoo only supports the Euro currency with viva.com.'; and it is one provider among the supported terminals, with Odoo never naming Tap to Pay on iPhone or Android ('tap to pay' 0 and 'softpos' 0 over 696 docs). Falsified to yes by a second documented tap-on-phone provider or an in-POS softpos flow; falsified to no if the Viva app proves to be a wholly separate register. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals/viva_com.html · retrieved 2026-09-05 adversarially verified
Vendor ships a handheld that takes EMV/NFC payment at the table, including tip prompt and check splitting, without carrying the card away.
payments-pay-at-table
Odoo ships no handheld. The POS runs in a browser on any device, but no documented tableside handheld-plus-reader product exists. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01
Guest can scan a QR code on the printed check or table tent to view and pay the check from their own phone, with the payment closing the check in the POS automatically. differentiator
payments-qr-guest-pay
QR menu + Ordering lets guests order and pay from their phone; a separate QR code payments method exists. Not documented as scan-to-pay on a printed check. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-08-01
Supports both pre-auth-then-tip-adjust and on-device tip prompt flows, with a documented batch/adjust window and a manager screen for unadjusted tips.
payments-tip-adjust
On-device tip via Adyen terminal; Add tip after payment is US-only with Stripe or Adyen, offering 15/20/25%, No Tip or custom. No unadjusted-tips manager screen. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Configurable tip pooling and distribution rules (by hours worked, sales, role percentage, or points) that produce a per-employee tip allocation exportable to payroll. differentiator
payments-tip-pooling
Tips post as a single [TIPS] product line. No pooling or distribution rules documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Card payments can be captured while the internet is down via store-and-forward, with configurable per-transaction and cumulative offline limits. differentiator
payments-offline-store-and-forward
Terminal docs state a connection issue between Odoo and the terminal automatically cancels the transaction. The marketing 'offline payments' claim conflicts with this. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01
Vendor publicly documents who bears the loss when a stored offline transaction declines on reconnect, and surfaces a post-reconnect report of failed offline payments. differentiator
payments-offline-decline-liability
No offline card capture, therefore no published decline-liability position or post-reconnect failure report. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01
First-party gift cards with real-time balance tracking, redeemable across every location in the group and through the online-ordering channel.
payments-gift-cards
Promotions, Coupons, Gift Card & Loyalty Program setting; codes entered or scanned at the register and shared with eCommerce in the same database. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
House/on-account tabs with per-account credit limits, running balance, and periodic statement or invoice generation.
payments-house-accounts
Customer account payment method lets guests pay on account. Per-account credit limits and periodic statements are not documented in POS. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/customer_credit.html · retrieved 2026-08-01
A single check can be settled with multiple tenders and split by seat, by item, by even shares, or by arbitrary amount, with no hard cap below eight ways.
payments-split-tender
Multiple tenders per order are documented (order and tip on different methods) and splits create sub-orders. No even-N or arbitrary-amount split. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Voids, refunds, discounts, and no-sales require role-based authorization (manager PIN or approval) and write to an immutable audit log identifying the approver.
payments-refund-void-controls
Refunds, discounts and cancels gated by the basic/advanced rights tiers; orders carry the Employee. No immutable approver audit log documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/employee_login.html · retrieved 2026-08-01
In-product dispute/chargeback dashboard that lists open disputes and allows evidence submission assembled from the POS transaction record. differentiator
payments-chargeback-tooling
Odoo is not the acquirer; no dispute dashboard or evidence-submission tooling documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods.html · retrieved 2026-08-01
Tokenized card-on-file for a guest profile, reusable across online ordering, phone orders, and in-store, with no PAN stored by the merchant. differentiator
payments-card-on-file
UPHELD after reading the controller directly rather than trusting the note. Both quotes are verbatim in THIS file: it loads saved cards with "request.env['payment.token'].sudo()._get_available_tokens(" for the order's partner, accepts a payment whose "kwargs.get('flow') == 'token'", and raises "Tokenization is not available for logged out customers." under the comment '# Avoid tokenization for the public user.' MODULE/EDITION: pos_online_payment, Community (present in the 638-module list) - grade A source tree, the strongest instrument available for a Community question. Partial, not yes, because the rubric asks for reuse across online ordering, phone orders AND in-store: this is the guest-facing /pos/pay/<order_id> portal route only, tokenization is refused to the public user so the guest must be a logged-in portal user, there is no cashier-initiated charge of a stored token from the register (the in-store card path is a third-party terminal), and there is no phone-order flow in the product at all ('phone order' 0 over 696 docs). No PAN sits with the merchant: Odoo 'outsources tokenization and payment to external payment providers'. Falsified to yes if Odoo documents a cashier charging a stored token from the register. https://raw.githubusercontent.com/odoo/odoo/19.0/addons/pos_online_payment/controllers/payment_portal.py · retrieved 2026-09-05 adversarially verified
Vendor publishes its deposit schedule and offers a next-day or same-day/instant funding option. differentiator
payments-payout-timing
Odoo holds no merchant funds and publishes no deposit schedule; funding timing belongs to the chosen processor. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01
Vendor provides point-to-point encryption and a current PCI DSS 4.x Attestation of Compliance / P2PE listing available to merchants on request.
payments-p2pe-pci4
UPHELD - this is the strongest form a 'no' can take, an explicit vendor denial, and I confirmed it verbatim on the cited page under the heading 'PCI DSS and Attestation of Compliance': 'Odoo is not PCI DSS-certified because it does not store cardholder data or process payments. Instead, it outsources tokenization and payment to external payment providers, which means that as an Odoo customer, you only need to complete the minimal Self-Assessment Questionnaire (SAQ) with the provider to obtain the Attestation of Compliance (AoC) and achieve PCI compliance. Odoo should not be mentioned as a payment processor or a third-party service provider in the SAQ.' So Odoo publishes no AoC of its own and disclaims the role that would require one. P2PE half: 'point-to-point encryption' returns 0 over 696 docs and Odoo holds no PCI P2PE listing. MODULE/EDITION: the disclaimer is about Odoo S.A. as publisher and binds Community and Enterprise alike, so n/a rather than a gate. A merchant may still hold P2PE from Adyen, Stripe, Six, Worldline or Viva, but that is the terminal provider's listing and the rules bar it from scoring an Odoo cell. Falsified only if Odoo publishes its own AoC or a PCI P2PE listing. https://www.odoo.com/documentation/19.0/applications/finance/payment_providers.html · retrieved 2026-09-05 adversarially verified
Kitchen & production
Items route to specific KDS stations by item, category, order type, or revenue center, with routing rules configurable per location without vendor involvement.
kitchen-station-routing
DOWNGRADED from a standing 'yes' to reconcile it with the hardware-kds precedent, as addendum section 4 requires: the two rows cite the SAME Enterprise-only module and cannot both be right, and the standing note itself said 'Carry the same Enterprise-edition caveat as hardware-kds' while still scoring a full yes. On the merits the routing is real and operator-configurable per location: 'Select the Point of Sale that sends orders to this display. Leave the field empty to link it to all points of sale.' and 'Specify the POS product categories to be sent to this display. Leave the field empty to allow all categories.', with per-display stages, colors and an 'Alert timer (min)' - routing by category and by revenue centre, configured in the UI with no vendor involvement. MODULE/EDITION: pos_preparation_display, ENTERPRISE-only (absent from all 638 Community modules), so the Community self-host this record is framed on cannot route to KDS stations at all. What Community ships instead is PRINTER routing: point_of_sale/models/pos_printer.py defines "product_categories_ids = fields.Many2many('pos.category', 'printer_category_rel', 'printer_id', 'category_id', string='Printed Product Categories')" alongside pos_config_ids, i.e. per-POS, per-category kitchen and bar printers - station routing to paper, not to a KDS, which is why this is partial and not no. Falsified to yes if pos_preparation_display appears in a Community release. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-09-05 adversarially verified
An expo screen consolidates items from multiple prep stations into a single order view and only marks the order complete when every contributing station has bumped its items.
kitchen-expo-consolidation
Multiple displays plus a top bar tracking all orders across stages. No documented expo screen that completes only when every station has bumped. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-08-01
Items can be assigned to courses and held, then fired to the kitchen on demand from a server terminal, handheld, or expo screen. differentiator
kitchen-course-firing
Courses fire on demand from the register or by retrieving the order from the floor plan or Orders overview (Fire Course 2). https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Per-item cook times are configurable and the KDS staggers item start/display times so that all items on an order finish simultaneously. differentiator
kitchen-prep-time-pacing
Stages carry an alert timer only. No per-item cook times and no staggered start so items finish together. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-08-01
Kitchen load throttling automatically paces or delays release of incoming digital orders, or extends quoted prep times, once a configurable order-volume or ticket-time threshold is crossed. differentiator
kitchen-order-throttling
Throttling is at order intake via preset Preparation capacity per time slot, not driven by live kitchen ticket times. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html · retrieved 2026-08-01
Pausing a store or 86ing an item from the POS/KDS propagates the pause or availability change back to connected third-party marketplaces (DoorDash, Uber Eats, Grubhub) automatically. differentiator
kitchen-channel-pause-propagation
Store Timings control platform availability windows through UrbanPiper. No documented ad-hoc pause or item-level 86 push to marketplaces. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html · retrieved 2026-08-01
Bumping an order ready on the KDS sends an order-ready status event back to the third-party marketplace so couriers are dispatched on actual readiness. differentiator
kitchen-order-ready-callback
UPHELD on the merits but the EDITION GROUND STRIPPED - the proposal's 'doubly moot for Community' reasoning is exactly the edition-as-ground-for-no that the addendum section 4 rule forbids, and it is not needed. The Order flow section is a complete documented procedure and it routes the ready step AWAY from the KDS: an accepted order 'is automatically displayed on the preparation display', but then 'When the order is ready, Open the orders' list view. Select the order. Click the Mark as ready button.' A separate manual step, in a different view, documented after the order is already on the display, is affirmative evidence that a stage move on the display does not emit the event. preparation.html independently enumerates every control on the display - clicking items to cross them off, the automatic move to the next stage, Recall ('Undo the most recent order stage move'), Done, Clear All Orders and Reset - and none is described as emitting anything outward. MODULE/EDITION: pos_urban_piper and pos_preparation_display, both Enterprise-only (absent from the 638 Community modules); the capability is absent even in Enterprise, where BOTH modules are present, and that is what licenses the 'no'. Falsified by documentation or code showing a prep-display stage move emits Food Ready. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html · retrieved 2026-09-05 adversarially verified
KDS supports physical bump bars or programmable keypads in addition to touchscreen interaction, with documented supported models.
kitchen-bump-bar-hardware
Prep display runs in a browser on a mobile device or a USB/HDMI touchscreen, and 'IoT boxes are not supported'. No bump-bar models documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-08-01
An all-day view aggregates outstanding quantities per item (and per modifier) across all open tickets on the station.
kitchen-all-day-counts
The top bar shows order counts per stage, not aggregated outstanding quantities per item or modifier. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-08-01
Configurable target cook times per station or order type, with visual color escalation and/or audible alert when a ticket exceeds target.
kitchen-sla-alerts
Per-stage 'Alert timer (min)' highlights orders exceeding the target, with color-coded stage status and visible waiting times. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-08-01
If a KDS screen or kitchen printer goes offline, tickets automatically fail over to a designated backup printer or screen with no ticket loss. differentiator
kitchen-printer-fallback
Printer setup binds categories to a printer with no documented backup printer or screen failover. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
KDS continues to receive and display tickets from on-site POS terminals when the internet or cloud backend is unreachable. differentiator
kitchen-offline-operation
NEW SURFACE, held unknown. The live 19.0 use.html now carries an "Offline POS" section that was NOT in the q210 696-doc corpus (0 hits in the cached copy); also odoo/documentation master 05a1e9c6 (1,164 .rst, tree truncated:false) fetched in full via raw.githubusercontent.com, plus new general/offline_mode.rst. EVIDENCE: "Orders created offline are stored in the browser cache and synced to the backend when the connection is restored." "Many POS features rely on backend information and, therefore, are not available offline. These features include: Generating invoices ... Registering customers ... Accessing detailed product information ... Synchronizing stock in real time ... Using payment terminals ... Loading data on demand" and "Devices connected to the local network, such as printers and scales, continue to work offline". WHY STILL UNKNOWN: the list is OPEN ("include") and never names the preparation display; preparation.rst (master and 19.0 identical on this point) still never takes up connectivity. The architecture implies orders reach the display only after the backend sync (preparation.rst: orders placed in the register "are sent to the preparation display"; the POS queues offline orders locally), but no sentence states the display stops receiving, so a no would rest on inference. general/offline_mode.rst covers "apps and modules built using standard Odoo framework components" (cached views/records) and does not name the preparation display either. Kitchen PRINTERS on the LAN are documented to keep working offline (that is reliability-offline-kds-printing, not this KDS cell). SOURCE: pos_preparation_display is absent from odoo/odoo 19.0 (630ed4e8, 638 addons) and master (c3776940, 642 addons); api.github.com/repos/odoo/enterprise is 404; translate.odoo.com 403. Retrieved 2026-09-17. || 329th: 329th: the preparation-display doc has MOVED and the source route is now closed for good, but neither changes the verdict. (1) The 19.0 page the record's chain relies on is no longer at restaurant/preparation.html (404, 170 b); it is now extra/preparation.html, reached from the 19.0 Point of Sale index. Its full text (6,260 stripped chars) was re-read and tokenised controls over it are ZERO for offline, connectiv*, internet, network, sync, cache and unreach* -- the page takes up connectivity nowhere, so the open-list inference recorded on 2026-09-17 stands unchanged. (2) The source census is closed, not merely truncated: pos_preparation_display and pos_restaurant_preparation_display return 404 for __manifest__.py on raw.githubusercontent.com at 17.0, 18.0, 19.0 AND saas-18.4, and the RECURSIVE trees (api.github.com, truncated:false) of odoo/odoo 19.0 bcd36a80b0b1f3b56810440e2d180d40f0ff1a82 (48,224 blobs, 936 of them under addons/point_of_sale/) and 18.0 7950c5b47b8b8315a0eff73a1d242fdc72dddcdf (51,345 entries) contain ZERO files matching /prepar/i except addons/point_of_sale/static/tests/pos/tours/utils/preparation_receipt_util.js. So the display is Enterprise-implemented on every supported version and no community source can ever bound it (odoo/enterprise is 404 to anonymous API calls). (3) apps.odoo.com is not a route either: /apps/modules/19.0/<name> works (amazon_ept 200) but point_of_sale, pos_preparation_display and pos_urban_piper all 404, i.e. Odoo SA's own modules are not published there. The 19.0 release-notes page (101 KB) has 0 hits for 'kitchen' and 1 for 'offline' (Discuss chat status). Retrieved 2026-09-18. adversarially verified
Station screens can display item-level build/assembly detail (recipe steps, portioning, or full modifier breakout) rather than only the ticket line text. differentiator
kitchen-item-build-screens
Order cards show order detail including variant/attribute selections and notes. No recipe steps or portioning build screens. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-08-01
Sectioned/fractional topping placement (halves, quarters, specific sections) is rendered visually and unambiguously on the make-line screen or ticket. differentiator
kitchen-pizza-fractional-display
No fractional placement exists in the menu model, so nothing sectioned can be rendered on the make line. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
A bumped ticket can be recalled/unbumped, and an individual item can be refired or reprinted without re-entering the order.
kitchen-recall-refire
A Recall button undoes the most recent stage move, and the POS reprints a duplicate of the last kitchen order. No per-item refire documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-08-01
Edits made in the POS to an order already displayed in the kitchen visually flag the added, changed, or removed items on the live ticket. differentiator
kitchen-order-modification-alerts
pos_restaurant ships an order-change receipt template and prints a cancellation ticket, implying change tracking. On-screen flagging is not documented. https://github.com/odoo/odoo/blob/master/addons/pos_restaurant/__manifest__.py · retrieved 2026-08-01
Bumping an order ready triggers a guest-facing notification — SMS/text, app push, or an order-status display board — without a separate product purchase. differentiator
kitchen-guest-ready-notification
Presets support an Email Confirmation template and kiosk tracker numbers. No SMS-on-ready, app push, or status board documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html · retrieved 2026-08-01
Waste, spoilage, and remakes can be logged directly at the kitchen/KDS screen with reason codes, and the entry depletes inventory.
kitchen-waste-logging
Waste is handled by Inventory scrap in the back office, not logged with reason codes at the kitchen screen. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-08-01
Reports actual ticket and per-station times (average and percentile) sliced by daypart, station, and order channel, exportable to CSV or an API.
kitchen-speed-of-service-reporting
Prep display shows live waiting times, but POS reporting covers orders and sessions only — no per-station time percentiles by daypart. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Generates prep lists or predicted prep quantities from historical sales and forecast demand, surfaced to kitchen staff as a daily prep task list.
kitchen-prep-forecasting
UPHELD, with the vocabulary control widened beyond the proposal's single term. preparation.html enumerates the display's ENTIRE configuration (Name, Point of Sale, POS product categories, Auto clear, Stages with colors and 'Alert timer (min)') and its entire interface (top bar, side panel filtering by Time, Preset and POS categories, and order cards); every element is reactive to orders already placed. Re-run over 696 docs with the fixed grep: 'prep list' 0, 'prep(aration)? (sheet|task|quantit)' 0, 'par level' 0, 'production plan' 0. 'forecast' returns 7 and every one is the Inventory forecasted on-hand quantity or the CRM sales forecast (inventory configure/type.html, crm/performance/forecast_report.html, point_of_sale/products.html, point_of_sale/models/product_template.py) - stock replenishment, never a kitchen prep sheet and never surfaced to kitchen staff. MODULE/EDITION: the KDS this would live on is pos_preparation_display, Enterprise-only (absent from the 638 Community modules); the Inventory forecast is Community (stock) but is a different capability. Absent in BOTH editions, which licenses the 'no' rather than an edition gate. Falsified by a documented prep-list view fed by historical sales. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-09-05 adversarially verified
Delivery, dispatch & third-party channels
Product includes a native in-house driver module: drivers are first-class entities with clock-in/out, assignment state (in-store / on-run / returning), and per-driver run history reportable from the POS itself (not via a third-party add-on).
delivery-driver-roster
Restaurant docs cover floors, orders, printing, bills and tips. No in-house driver entity, clock state or run history exists. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Provides a dedicated dispatch/expo screen showing undispatched orders, driver availability, and elapsed time per order, with multi-order run batching (assigning 2+ orders to one driver as a single run).
delivery-dispatch-board
No dispatch or expo screen for delivery orders, driver availability, or multi-order run batching. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Dispatch includes a live map view with geocoded stops and system-generated route sequencing (turn order optimization) for a multi-stop run, not just a static address list. differentiator
delivery-route-map
No dispatch map or route sequencing; no delivery dispatch module exists to host one. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Captures live driver GPS position from a driver-facing mobile app and surfaces it back to the dispatch screen. differentiator
delivery-driver-tracking
No driver-facing mobile app and no GPS surfacing documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Delivery areas can be defined as arbitrary map polygons or by drive-time isochrones, not solely as a radius or a ZIP/postcode list. differentiator
delivery-zones-polygon
No delivery-zone geometry of any kind — polygon, isochrone, radius or ZIP list — documented for POS. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Each delivery zone carries its own independently configurable delivery fee, order minimum, and quoted promise time, applied automatically from the validated customer address.
delivery-zone-pricing
Delivery is a preset (pricelist plus fiscal position), not a zone with its own fee, minimum and promise time. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html · retrieved 2026-08-01
Address entry is validated/geocoded against a mapping service at order time and rejects or flags out-of-zone addresses before the order is accepted.
delivery-address-validation
Preset Identification can require a customer address, but no geocoding, validation or out-of-zone rejection is documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html · retrieved 2026-08-01
Tracks per-delivery driver compensation inputs — mileage or distance driven per run, per-delivery flat reimbursement, and driver-retained tips — and exports them to payroll as separate reimbursement vs. wage lines. differentiator
delivery-driver-comp
No mileage, per-delivery reimbursement, or driver-tip tracking exists because there is no driver module. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Provides a driver cash bank / settle-up flow that reconciles cash collected, orders assigned, and tips owed at end of shift, producing a per-driver over/short figure.
delivery-cash-reconcile
POS cash control reconciles the register session, not a per-driver bank with orders assigned and tips owed. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Can hand a first-party order to an on-demand courier marketplace (DoorDash Drive, Uber Direct, Nash, Relay or equivalent) natively from the POS, with the courier quote and status returning into the order record.
delivery-daas-dispatch
No native handoff to DoorDash Drive, Uber Direct, Nash or Relay from the POS is documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Supports hybrid dispatch: rules that automatically overflow an order to a DaaS courier when no in-house driver is available, out of zone, or past a wait threshold. differentiator
delivery-daas-fallback
No hybrid dispatch rules, since neither in-house drivers nor DaaS dispatch exist. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Offers direct, first-party certified API integrations with DoorDash, Uber Eats, and Grubhub marketplaces (vendor-owned, not solely resold through Otter/Deliverect/Chowly/ItsaCheckmate middleware). differentiator
delivery-3p-direct-integration
THE ADDENDUM'S PREMISE FOR THIS ROW IS WRONG and I am correcting it: s4 says this no's whole stated ground is the UrbanPiper Enterprise gate, but the standing note's operative ground is that marketplace access is exclusively via UrbanPiper middleware, and that is exactly the disqualifier the rubric writes into the claim, which requires vendor-owned certified integrations not solely resold through Otter, Deliverect, Chowly or ItsaCheckmate middleware (the rubric's own words in data/taxonomy/restaurant.yaml). UrbanPiper is such middleware and the page says so in Odoo's own words: "UrbanPiper is an order management system that integrates with multiple food delivery platforms.", with "A valid UrbanPiper subscription is mandatory." and "A registered reseller account is required with each delivery platform to be integrated" (e.g. Uber Eats, DoorDash, Careem, Deliveroo, Zomato). Three counterparties, and no direct Odoo-to-DoorDash certification anywhere. The verdict therefore stands on the merits and does NOT depend on the edition, so addendum s4's rule that edition-gating alone is not a ground for no does not reach this row. MODULE/EDITION: pos_urban_piper is Enterprise-only - absent from the 638 Community modules, the page stating "An active Odoo Enterprise subscription is required. Odoo Community does not support this integration." - so Community has no marketplace path at all and Enterprise has only a resold one. No first-party DoorDash, Uber Eats or Grubhub module exists among the 638, and no such page exists among the 1,158 census docnames. FALSIFIER: an Odoo-owned marketplace connector module, or a direct-certification announcement. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html · retrieved 2026-09-05 adversarially verified
Third-party marketplace orders inject automatically into the POS as normal tickets that fire to KDS/printers without tablet re-keying or manual accept.
delivery-3p-injection
This is the exact shape of cell the brief says to hold to the highest bar, and it is not native. Verified from the Odoo doc: 'an active Odoo Enterprise subscription is required. Odoo Community does not support' it; Enterprise 18.0+; a valid UrbanPiper subscription; plus registered reseller accounts with each platform. Three separate paid relationships and a middleware hop is a partner integration, not a yes. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html · retrieved 2026-08-01 adversarially verified
Marking an item or modifier 86'd in the POS pushes item-level out-of-stock status to connected third-party channels in near real time, and restores it on availability (DoorDash requires item and item-option 86ing of new POS partners).
delivery-86-sync
OVERTURNED from 'no' on two defects. First, the proposal's decisive clause, 'Community has no channel to 86 to at all', is edition-as-ground-for-no, which the addendum section 4 rule forbids: pos_urban_piper is first-party and documented, so the floor is partial. Second, its own evidence describes item-level availability reaching the platform. The page enumerates the product form's Urban Piper section as 'Available on Food Delivery', 'Meal Type', 'Is Recommended' and 'Is Alcoholic'; 'Available on Food Delivery' is settable per product and in bulk from the list view, then published to every connected platform by 'Click the Sync Menu button.' Clearing and restoring that field is item-level availability control that reaches the channel, so the rubric is part-satisfied. It is not a yes: the push is operator-initiated and whole-menu rather than event-driven, the page warns 'The synchronization process may take 2-3 minutes to reflect changes on the UrbanPiper Atlas platform', so it is not near-real-time; there is no stock-driven or automatic trigger; and there is no item-option 86ing, since 'Currently, UrbanPiper does not support combo products.' The only runtime control is Store Timings ('Week Day, Starting Hour, Ending Hour'), which closes the whole store. MODULE/EDITION: pos_urban_piper, Enterprise-only - 'An active Odoo Enterprise subscription is required. Odoo Community does not support this integration.' Falsified to yes by a documented on-demand or stock-driven item availability push covering item options. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html · retrieved 2026-09-05 adversarially verified
Store can be paused/deactivated on each connected third-party marketplace from inside the POS with a timed auto-reactivation, rather than only from each marketplace's own tablet or portal.
delivery-store-pause
Store Timings set weekly availability windows per POS. No ad-hoc pause with timed auto-reactivation from inside the POS. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html · retrieved 2026-08-01
Produces a third-party reconciliation report matching marketplace payout deposits to POS-recorded 3P sales, itemizing commission, marketing fees, refunds/adjustments, and identifying missing or unpaid orders. differentiator
delivery-3p-reconciliation
RE-HOMED off reporting.html; value upheld. The proposal called reporting.html 'the complete POS reporting surface', which it is not - it says its statistics are 'available in a graph or pivot view that you can filter or group depending on your needs', and an open-ended pivot cannot be an enumeration. The right instrument is the only third-party food-delivery connector Odoo documents, described here end to end: prerequisites, credentials, store creation, Store Timings, products, menu synchronization, go-live, order flow and order rejection. That complete integration enumeration contains no payout, deposit, commission, marketing-fee, adjustment or missing-order surface of any kind. Vocabulary re-run over 696 docs: 'settlement report' 0, 'marketing fee' 0; 'commission' returns 22 and every commercial hit is HR payroll commissions, sales-rep commission plans, the reseller partnership terms, or the Amazon, Lazada and Shopee e-commerce connectors - Odoo HAS built marketplace fee handling for e-commerce channels and has NOT built it for food delivery, which is the sharper form of this absence. MODULE/EDITION: pos_urban_piper, Enterprise-only (absent from the 638 Community modules); the capability is absent in Enterprise too, where the connector exists, and that is what licenses the 'no'. Falsified by a documented food-delivery payout or commission report. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html · retrieved 2026-09-05 adversarially verified
Vendor exposes integration health to the operator — failed/rejected order injections, connection status per channel, and alerts on failure — rather than failing silently. differentiator
delivery-injection-error-visibility
Successful sync triggers a notification and a Last Sync on timestamp updates. No per-channel connection status or failure alerting documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html · retrieved 2026-08-01
Guests receive a branded order status / driver tracking page or SMS link on the restaurant's own domain for first-party delivery orders, driven by real order and driver state.
delivery-tracking-page
RE-HOMED and DOWNGRADED from grade A. A single module's __manifest__.py (pos_sms) cannot carry a corpus-wide absence claim, and the proposal's premise that pos_sms is the guest-messaging channel is WRONG: preparation.html documents a different, richer one - 'Install the POS Enterprise SMS Whatsapp module', then 'Activate SMS Enabled and/or WhatsApp Enabled in the Communication tab. Select templates for Order received and Order is ready.' Guests DO receive order-state-driven SMS and WhatsApp notifications, which the proposal denied. It is still a 'no', on this page's own enumeration of that Communication tab: the templates are notifications, not a link or a page, and the two status surfaces Odoo documents are in-store screens - the 'Order Status Screen' showing orders 'Ready for pickup' and 'Almost there', used 'via a web browser on a mobile device or a screen connected via USB or HDMI'. Nothing is served on the restaurant's own domain, and no driver state exists to drive one (this record already scores delivery-driver-roster and delivery-driver-tracking 'no' because the POS model has no driver entity). Doc-tree probe: .../point_of_sale/extra/order_tracking.html returns the 146-byte never-existed 404. MODULE/EDITION: the notification templates need the Enterprise SMS/WhatsApp module (whatsapp is absent from the 638 Community modules); Community pos_sms sends only a receipt. Falsified by a documented per-order guest tracking URL. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-09-05 adversarially verified
Quoted delivery promise times adjust dynamically from current kitchen load, driver availability, and zone drive time, rather than a fixed per-store constant. differentiator
delivery-promise-time
Preset time slots and capacity are static configuration; no dynamic promise time from kitchen load or drive time. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html · retrieved 2026-08-01
Vendor documents explicit offline behavior for delivery: whether cash delivery orders, driver assignment, and driver settlement continue during an internet outage.
delivery-offline-behavior
No delivery offline behaviour is documented because no delivery dispatch module exists. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Digital ordering & guest-facing channels
Vendor ships a first-party, commission-free web ordering site on the restaurant's own branding/domain that writes orders directly into the POS with no per-order marketplace commission.
digital-first-party-web
QR menu + Ordering is first-party and commission-free, writing straight into POS; Odoo Website/eCommerce covers a branded domain in the same database. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-08-01
Vendor offers a branded native iOS and Android ordering app (published under the restaurant's own brand in the App Store/Play Store), not only a mobile web page or a shared multi-restaurant marketplace app. differentiator
digital-native-app
Self-ordering is a mobile web interface reached by QR code or a kiosk. No branded native iOS/Android ordering app documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-08-01
Guests can create an account with saved addresses, saved (tokenized) payment methods, and one-tap reorder of a previous order across first-party channels.
digital-account-saved-payment
Odoo portal/eCommerce accounts hold addresses and tokenized methods, but self-order and kiosk flows only collect name, phone or email per order. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html · retrieved 2026-08-01
Digital checkout presents configurable or algorithmic upsell/cross-sell suggestions (rules-based add-ons or personalized recommendations from order history), with attach-rate reporting on those suggestions. differentiator
digital-upsell-engine
POS Optional Products provides rules-based add-on suggestions. No personalization from order history and no attach-rate reporting. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Supports future/scheduled orders with per-daypart throttling — capacity limits on orders or items per time slot that automatically close slots when the kitchen is saturated.
digital-scheduled-pacing
Preset 'Manage orders by time' defines slots from a working schedule plus a Preparation capacity limit per time frame; guests pick a slot. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html · retrieved 2026-08-01
Single digital ordering flow supports pickup, curbside (with arrival check-in), dine-in/QR table ordering, and delivery, with mode-specific fees and prep timing.
digital-fulfillment-modes
Presets cover Dine In, Takeout and Delivery with per-mode pricelist and fiscal position; service at Table or Pickup zone. No curbside arrival check-in. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html · retrieved 2026-08-01
Supports guest-facing QR scan-to-order and/or scan-to-pay at the table that opens or attaches to the existing POS check, including splitting and tipping.
digital-qr-table
Verified verbatim on the restaurant page: 'To order free physical QR codes adapted to the floor plan, activate the QR menu setting, then click Get QR Codes in the Floor plan view. This offer is available worldwide and for all subscription types.' Rare case of a marketing-sounding claim that is actually in the product docs. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01 adversarially verified
Vendor ships a self-order kiosk running the same menu and modifier logic as the POS, with accessibility-compliant UI and unattended EMV payment. differentiator
digital-kiosk
First-party kiosk on the same menu, optionally on an IoT Box touchscreen. Unattended payment limited to Adyen/Stripe; no accessibility conformance published. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-08-01
Supports group ordering: a shareable link where multiple participants add their own items to one order under a per-person or total spend cap, with split or single payment.
digital-group-ordering
No shareable multi-participant group order link with per-person caps documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-08-01
Offers a distinct catering ordering flow with separate catering menu/minimums, lead-time rules, quotes or proposals, deposits, and invoice/house-account or ACH payment terms. differentiator
digital-catering-portal
No catering-specific ordering flow with minimums, lead-time rules, proposals, deposits or invoice terms documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-08-01
Vendor offers AI voice phone ordering (native or a named certified partner) that answers inbound calls and injects the completed order into the POS without staff transcription. differentiator
digital-voice-ai-phone
MODULE/EDITION: the whole 'ai' application is Enterprise-only (no ai, ai_* or *_ai module among the 638 Community modules in .cache/q210/odoo-addons.txt); Odoo Phone (ex-VoIP) is a separate app. Odoo AI's only voice surface is dictation, not telephony: "Odoo AI can transcribe spoken audio into text and generate summaries from that transcript." and "This feature supports both meeting recordings and real-time dictation". CORRECTION TO THE STANDING NOTE, which is wrong: this is NOT the only voice page in the census and call vocabulary is NOT corpus-absent - the 1,158-name docnames census carries a full 16-page Phone/VoIP book (applications/productivity/phone.html plus phone/axivox/*, didww, onsip, phone_widget, devices_integrations, sales_calls, support_calls) that is MISSING FROM THE 696-DOCUMENT CORPUS, so every corpus-wide zero-hit on 'inbound call' was an artefact of a corpus hole, not an absence. I fetched that book live (200, 419,487 b): Odoo Phone is a human softphone over SIP/WebRTC with three verified providers (Axivox, DIDWW, OnSIP), call queues and dial plans, and its own overview enumerates its feature set as linking calls to CRM and Helpdesk records, logging communication history, automating call routing, call recording and analytics - no AI answering agent, and Point of Sale is not among the apps it integrates with. Doc-tree three-state probe: applications/productivity/ai/phone.html returns the 146-byte never-existed 404. FALSIFIER: an Odoo page documenting an AI agent answering an inbound call and writing a pos.order. https://www.odoo.com/documentation/19.0/applications/productivity/ai/voice.html · retrieved 2026-09-05 adversarially verified
Supports AI voice ordering at the drive-thru lane, integrated with the POS menu/modifiers and with escalation-to-human handoff.
digital-drivethru-ai
No drive-thru support at all, so no drive-thru voice AI. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale.html · retrieved 2026-08-01
Supports conversational SMS or chat ordering/reordering (text-to-order or text-a-link) that lands in the POS.
digital-sms-ordering
Odoo ships SMS Marketing, but no conversational text-to-order path into the POS is documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-08-01
Supports Order with Google — the restaurant's direct ordering link is provisioned to the Google Business Profile as an ordering option (ideally set as 'Preferred by Business'), rather than leaving marketplace links as the only choice. differentiator
digital-google-order
MODULE/EDITION: pos_self_order IS among the 638 Community modules, so this is a product gap, not an edition split. Re-run against the corrected 696-document corpus: 'order with google' 0, 'google business profile' 0. Census control, which is the stronger instrument: the 1,158-name Sphinx docnames manifest contains exactly seven Google pages - google_oauth, google_translate, users/google, appointments/google_reserve, calendar/google, ecommerce/google_merchant_center and website/configuration/google_search_console - and no Google Business Profile page of any kind. Doc-tree three-state probe: .../point_of_sale/extra/google_order.html and .../general/integrations/google_business.html both return the 146-byte never-existed 404, not the 132-byte retired stub. The cited page is Odoo's own first-party ordering surface and enumerates how the ordering link reaches guests - printed or downloaded QR codes and a kiosk - with the operator told "To customize QR codes, scan the relevant QR code to acquire its URL, then use a QR code" generator, which is the opposite of provisioning that link into a listing. I also re-ran Odoo's OWN guest-surface nouns after the mid-run correction to the drive-thru control list (order status screen 1, ready for pickup 2, almost there 1, all on extra/preparation.html and extra.html): Odoo's guest-facing order surface is a merchant-operated in-store Order Status Screen, which is the opposite of a provisioned listing and does not touch this cell. FALSIFIER: an Odoo page pushing the self-order URL into a Google Business Profile ordering slot. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-09-05 adversarially verified
Supports Apple Business Connect ordering placement — an 'Order Food' custom action on the Apple Maps place card pointing at the vendor's first-party ordering flow.
digital-apple-business-connect
MODULE/EDITION: pos_self_order is in the 638-module Community list; a product gap, not an edition split. Re-run over the corrected 696-document corpus: 'apple business connect' 0, 'apple maps' 0. Census control: no docname among the 1,158 in .cache/q210/odoo-docnames.txt mentions Apple or Maps at all. Doc-tree three-state probe: .../point_of_sale/extra/apple_business_connect.html returns the 146-byte never-existed 404, matching the fabricated control .../extra/zzq_fabricated.html and unlike the 132-byte retired meta-refresh stub that .../productivity/voip.html returns, so the instrument does discriminate here. On the cited page the distribution channels for the first-party ordering link are enumerated as QR codes and a kiosk, the operator being told "To customize QR codes, scan the relevant QR code to acquire its URL, then use a QR code" generator; there is no place-card or custom-action provisioning of any kind. Following the mid-run correction to the drive-thru control list I re-ran Odoo's own guest-surface vocabulary rather than only the Apple proper nouns: the nouns order status screen, ready for pickup and almost there all resolve to a merchant-operated in-store Order Status Screen on extra/preparation.html, so the one guest surface Odoo does ship is not a map or listing placement. FALSIFIER: an Odoo page documenting an Apple Maps Order Food action pointing at the self-order URL. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-09-05 adversarially verified
Loyalty accrual and redemption work inside the first-party digital ordering flow using the same guest identity as in-store, not as a separate post-purchase enrollment.
digital-loyalty-attach
Loyalty programs are configured under Point of Sale and share res.partner with eCommerce; explicit loyalty accrual inside the self-order flow is not documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Supports guest subscription / membership programs (recurring billing for a delivery-fee waiver, a per-period item entitlement, or a paid loyalty tier) managed in the platform.
digital-subscriptions
Verified verbatim on the cited page: the app "is designed to manage recurring revenue through subscription-based" products or services, and its own integration sentence - "The app integrates with other Odoo modules such as" Invoicing, CRM, Sales and Helpdesk - is the completeness sentence, and Point of Sale is not in it. So a real recurring-billing engine exists but nothing it issues is redeemable at the register: 'recurring', 'membership' and 'subscription' return zero across the 45 point_of_sale pages and the loyalty, gift-card and eWallet pages, and I confirmed those books are FULLY present in the corpus (669 of the 1,158 census pages are missing from it, but none of the missing are POS, loyalty, marketing or SMS pages), so this zero is bounded by complete books rather than by the corpus hole that damaged other rows in this slice. MODULE/EDITION: ENTERPRISE-ONLY - no module matching 'subscription' appears among the 638 Community modules, so a self-hosted Community merchant has no subscription engine at all. Partial not no under this record's own edition precedent (hardware-kds, a standing verified partial for the Enterprise-only pos_preparation_display): an Enterprise-only, first-party, documented capability is partial, never no on edition grounds alone. FALSIFIER: a documented subscription entitlement redeemable in POS would make this yes. https://www.odoo.com/documentation/19.0/applications/sales/subscriptions.html · retrieved 2026-09-05 adversarially verified
Discounts, coupon codes, and loyalty offers are defined once and honored identically across POS, kiosk, and first-party digital channels, with channel eligibility controls.
digital-promo-parity
Discount and loyalty programs are defined once and shared across POS and eCommerce in one database. Per-channel eligibility controls not documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Vendor documents that the operator owns and can export first-party guest records (email, phone, consented marketing status, order history) in bulk, without a fee or vendor approval. differentiator
digital-guest-data-ownership
'With Odoo, the values can be exported from any field in any record' - select records in list view, Action > Export, CSV or XLS, no fee or ticket. Odoo's GDPR page puts ownership beyond doubt: on Odoo Cloud 'you are the controller for that database and Odoo SA is only a data processor'. The Cloud SLA adds 'Users can download manual backups of their live data at any time'. Self-hosting removes all gates. https://www.odoo.com/documentation/19.0/applications/essentials/export_import_data.html · retrieved 2026-08-08
Digital checkout uses vendor-hosted fields or a hosted payment page so card data never touches the restaurant's page, with the vendor publishing PCI DSS 4.0 compliance (including the client-side script-integrity requirements effective March 2025) and supporting 3DS.
digital-checkout-pci-sca
Both quoted strings verify verbatim on the cited page and nowhere else in the 696-document corpus. Hosted-field half met: "Odoo apps delegate the handling of sensitive information to the certified payment provider so" the merchant need not worry about PCI compliance, and no sensitive information such as credit card numbers is stored on Odoo servers, a unique reference number being used instead. Compliance half not met, and by explicit vendor denial rather than by silence - on the same page Odoo states it is "not PCI DSS-certified" because it does not store cardholder data or process payments, so there is no PCI DSS 4.0 attestation and nothing on the March 2025 client-side script-integrity requirements. 3DS/SCA: '3DS', '3D Secure' and 'strong customer authentication' return zero over 696 documents, and ALL 25 payment_providers census pages are present in that corpus, so this zero is bounded by a complete book. MODULE/EDITION: the payment framework and pos_online_payment are both Community, so edition is not the constraint here. Several supported providers offer 3DS themselves, but under the brief's rule a terminal or acquirer capability cannot score this Odoo cell yes. FALSIFIER: an Odoo PCI DSS 4.0 statement or a documented 3DS flow. https://www.odoo.com/documentation/19.0/applications/finance/payment_providers.html · retrieved 2026-09-05 adversarially verified
Digital channels support the same service-fee / dual-pricing / card-surcharge configuration as the POS, with the required guest-facing disclosure and correct handling of jurisdictions and card brands where surcharging is prohibited. differentiator
digital-surcharge-transparency
No surcharge, service-fee or dual-pricing engine exists in POS, so nothing to mirror into digital channels. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Guest data, loyalty & marketing
Maintains a single guest profile that automatically merges transactions from in-store POS, first-party web/app ordering, and kiosk under one identity (phone or email match), with documented dedup/merge behavior.
guest-loyalty-unified-profile
One res.partner record serves POS, self-order and eCommerce in the same database. Dedup is a separate Data Cleaning app; no documented merge behaviour for POS. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Orders arriving from third-party marketplaces (DoorDash, Uber Eats, Grubhub) attach to a native guest profile with usable guest identity rather than landing as anonymous tickets. differentiator
guest-loyalty-thirdparty-identity-attach
OVERTURNED FROM no. Addendum s5 asks whether the capability is absent or merely Enterprise-gated; the answer is that it is gated AND undocumented, which licenses no verdict either way. MODULE/EDITION: marketplace orders reach Odoo POS only through pos_urban_piper, absent from the 638 Community modules, and this page states "An active Odoo Enterprise subscription is required. Odoo Community does not support this integration." - and api.github.com/repos/odoo/enterprise is 404 private, so the implementing source cannot be read at any grade. I read this page end to end. It enumerates supported providers by region, prerequisites, UrbanPiper credentials, the POS setting, store timings, product exposure, menu synchronisation, go-live and the order lifecycle ("its Order Status switches from Placed to Acknowledged"), and it never takes up customer data in any form - no res.partner, no contact, no guest identity field, and no completeness sentence about what attributes the connector carries onto an order. Under the mandatory no-audit that is absence from a document that never took up the topic, which is unknown, not no. It cannot be rescued as partial either: the record's edition precedent (hardware-kds) makes an Enterprise-only capability partial only when it is DOCUMENTED, and this one is not documented on either edition. FALSIFIER: pos_urban_piper source, or an Enterprise page, showing the connector creating or matching a res.partner from platform customer data. || 321st: Re-checked on a new surface, held unknown. odoo/documentation master 05a1e9c6 (1,164 .rst, truncated:false, full fetch): restaurant/urban_piper.rst has zero word-boundary hits for customer/partner/contact/phone/email/guest in any customer-data sense (the only "customer" is "Swiggy customer support"; "name" only as the store/POS name), unchanged from 19.0. pos_urban_piper remains absent from odoo/odoo 19.0 (630ed4e8, 638 addons) and master (c3776940, 642 addons, incl. new pos_partner_autocomplete, which is a partner-lookup helper, not a marketplace connector); odoo/enterprise 404. No source or doc sentence says the connector creates or matches a res.partner. crt.sh not run: *.odoo.com certificates enumerate customer databases, not vendor surfaces. Retrieved 2026-09-17. || 329th: 329th: re-read the LIVE 19.0 urban_piper page (not the .rst) and probed the two surfaces that could still hold the connector's data model; nothing moves. The live page's article text is 8,391 stripped chars and the tokenised counts are: partner 0, phone 0, email 0, guest 0, address 0, loyalty 0, anonym* 0, customer 1 -- and that one hit is still "Attempting to reject one prompts Swiggy customer support to contact the restaurant" (the same sentence as the 321st), in a paragraph that now also names Deliveroo, JustEat and HungerStation as providers whose orders cannot be rejected. So the marketplace connector's page has still never taken up customer data. NEW NEGATIVE RESULTS on the two remaining routes: apps.odoo.com serves module pages at /apps/modules/19.0/<name> (control amazon_ept = 200) but pos_urban_piper 404s there, so the Enterprise connector has no public listing page or description to read; and the odoo-19-release-notes page (101,309 chars) has 0 hits for urban, piper, deliveroo and 2 for marketplace, neither about POS. The falsifier named in the record (pos_urban_piper source, or an Enterprise page showing the connector creating or matching a res.partner from platform customer data) remains unreachable: the module is absent from odoo/odoo 19.0 bcd36a80 (48,224 blobs, recursive, truncated:false) and odoo/enterprise 404s to anonymous api.github.com. Retrieved 2026-09-18. adversarially verified
Supports at least two of points-per-dollar, visit/punch-count, and spend-tier accrual as configuration, without custom development or a bolt-on loyalty vendor.
guest-loyalty-accrual-models
Loyalty cards with real-time points, plus promotions, coupons, next-order coupons, discount codes and Buy X get Y — all configuration, no bolt-on vendor. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Supports status tiers with automatic promotion and demotion driven by rolling-window spend or visit counts. differentiator
guest-loyalty-tiers
Loyalty documentation covers points, promotions and coupons. No status tiers with automatic promotion or demotion. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Documents explicitly what loyalty lookup, accrual, and redemption do when the POS loses connectivity (queue-and-reconcile vs blocked). differentiator
guest-loyalty-offline-behavior
Loyalty requires selecting a customer and shows points updated in real time; no offline behaviour is documented anywhere. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Offer/discount engine exposes explicit stacking and precedence rules (exclusive vs combinable, order of application) as configuration. differentiator
guest-loyalty-offer-stacking-rules
RE-HOMED to the source tree as addendum s5 directs, because the doc-page absence control was not vocabulary-complete ('combinable|stackable|stacking' 0 over 696 documents proves only that Odoo does not use those words). Settled at grade A by reading the three Community loyalty models field by field. The cited file declares the complete program-level field set - name, active, sequence, company_id, currency_id, pricelist_ids, rule_ids, reward_ids, communication_plan_ids, program_type, date_from, date_to, limit_usage, max_usage, applies_on, trigger, portal_visible, portal_point_name, is_nominative, is_payment_program, available_on - and NOT ONE of them expresses exclusivity, combinability or order of application against another program; the only volume control is 'limit_usage = fields.Boolean(string="Limit Usage")' with max_usage, a count. loyalty_rule.py and loyalty_reward.py add no such field either: their booleans and selections are reward_point_split, reward_point_mode, minimum_amount_tax_mode, mode, reward_type, discount_mode, discount_applicability, clear_wallet, and a COMPUTED is_global_discount that scopes one reward's own target rather than inter-program precedence. The nearest thing to precedence is this model's plain record ordering, "_order = 'sequence'" over an unlabelled sequence Integer - generic Odoo list ordering, not a configurable stacking or precedence rule, and I record it as the honest near-miss rather than suppress it. MODULE/EDITION: Community - loyalty, sale_loyalty, pos_loyalty and pos_restaurant_loyalty are all in the 638. FALSIFIER: an exclusivity or combinability field in the loyalty models, or documented precedence semantics for the sequence field. https://raw.githubusercontent.com/odoo/odoo/19.0/addons/loyalty/models/loyalty_program.py · retrieved 2026-09-05 adversarially verified
Offers can be issued to a dynamically defined audience (rules over recency, frequency, spend, or items purchased) rather than only broadcast to the whole list. differentiator
guest-loyalty-targeted-offers
Odoo Marketing Automation and Email Marketing can target audiences via domain filters over customer and order data; not a POS-native offer audience builder. https://www.odoo.com/documentation/19.0/applications/studio/automated_actions.html · retrieved 2026-08-01
Automatically computes recency/frequency/monetary or equivalent lifecycle segments (new, regular, at-risk, lapsed, VIP) without the operator building the queries. differentiator
guest-loyalty-rfm-segmentation
No automatic recency/frequency/monetary lifecycle segments; the operator must build pivot filters. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Ships triggered lifecycle automations (birthday, first-visit thank-you, lapsed win-back) as configurable always-on campaigns rather than one-off manual sends.
guest-loyalty-lifecycle-automation
Studio automation rules support date-field, after-creation and after-last-update triggers with email actions — generic, not shipped restaurant lifecycle campaigns. https://www.odoo.com/documentation/19.0/applications/studio/automated_actions.html · retrieved 2026-08-01
Sends both email and SMS campaigns natively from the platform, not solely by handing the list to a third-party ESP. differentiator
guest-loyalty-native-email-sms
First-party apps for both channels in the same database, documented in Odoo's manual. Email Marketing: create a mailing with New, set Recipients from in-database models (Mailing List, Contact, Event Registration, Lead/Opportunity, Mailing Contact, Sales Order) with customisable filter equations, then Send, Schedule or Test. SMS Marketing: same Recipients mechanism, message body with live character and SMS-segment count, and Send / Schedule / Test; sending is metered - "Credits must be purchased from Odoo in order to take advantage of the SMS Marketing app; SMS messages will not be sent without credits." Contacts captured in POS are res.partner records in the same database, so no export to a third-party ESP is involved; the per-app cost above the One App Free tier and the SMS IAP credits are commercial, not architectural, limits. https://www.odoo.com/documentation/18.0/applications/marketing/sms_marketing/create_sms.html · retrieved 2026-08-06
Captures per-channel marketing consent with timestamp and source of consent, and honors revocation received by any reasonable means (not just the STOP keyword) across all channels.
guest-loyalty-consent-management
Odoo mailing uses blacklist/opt-out per email and phone. Per-channel consent timestamp and source of consent are not documented for POS-captured guests. https://www.odoo.com/pricing · retrieved 2026-08-01
Handles or explicitly documents A2P 10DLC brand and campaign registration required for the operator to send SMS through the platform.
guest-loyalty-10dlc-registration
Both quotes verify verbatim on the cited page and nowhere else in the corpus: on the built-in IAP path, "Currently, Odoo registers itself when possible to avoid extra setup for its customers, however in some countries that is not enough and the client itself must do it.", and on the Twilio path the operator is explicitly on their own - "This can only be done by you, and not by Odoo." So the obligation is disclosed but the regime is never named and never handled in product: '10DLC' and 'A2P' return zero over the corrected 696-document corpus, and I confirmed the SMS Marketing book is FULLY present in that corpus (no sms page is among the 669 census pages missing from it), so this zero is bounded by a complete book rather than by a corpus hole. There is no brand object, no campaign object, no registration-status field and no submission flow. Disclosure without handling is partial, not yes and not no. WIDER SMS FOOTPRINT, checked after the mid-run correction and it does not change the value but does raise the stakes: POS itself has a second outbound A2P surface, since extra/preparation.html tells the operator to install the POS Enterprise SMS Whatsapp module and then select templates for Order received and Order is ready (strings verbatim on THAT page, not on the page cited here) - transactional order-state messaging to guests, with the same unhandled registration obligation and no 10DLC surface of its own. MODULE/EDITION: sms, sms_twilio, mass_mailing_sms and pos_sms are all Community, but that preparation-display messaging path rides pos_preparation_display and whatsapp, both Enterprise-only (absent from the 638). FALSIFIER: an Odoo IAP or SMS page naming 10DLC brand and campaign registration with a submission workflow. https://www.odoo.com/documentation/19.0/applications/marketing/sms_marketing/twilio.html · retrieved 2026-09-05 adversarially verified
Reports redemption and incremental sales attributable to a specific campaign or offer, tying redeemed offers to actual check totals. differentiator
guest-loyalty-campaign-attribution
Coupon and loyalty redemptions are order lines and can be pivoted against check totals; no packaged campaign-attribution report. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Provides self-serve export of the full guest list and transaction history, including contact PII, via CSV or API, without a vendor fee or support ticket. differentiator
guest-loyalty-data-export-portability
Select records in any list view, Action > Export, choose fields, export CSV or XLS - 'the values can be exported from any field in any record', with reusable export presets. Applies to contacts, POS orders and order lines alike. The Cloud SLA adds a full live-database backup 'at any time'. No fee and no support ticket; the docs' only caveat is to batch very large exports to avoid a timeout. https://www.odoo.com/documentation/19.0/applications/essentials/export_import_data.html · retrieved 2026-08-08
Triggers post-transaction feedback requests and routes responses by score, sending low scores to private service recovery and high scores toward public review sites. differentiator
guest-loyalty-review-capture-routing
Value upheld, but one sentence of the standing note is FALSE and is corrected here. On the cited page Helpdesk does trigger the request automatically - "To automatically request ratings from customers once their tickets have closed, an email template needs to be added to the appropriate stage" - and scores three ways, but every response lands in the ticket chatter plus a Customer Ratings report. The standing note's claim that there is no low-score branch anywhere is wrong: applications/websites/livechat/ratings.html, a census page that is MISSING from the 696-document corpus and which I fetched live (200), documents a genuine score-conditional branch - a smile shows a thank-you and a close link, while a neutral or frown opens a comment box that is sent to the operator - and it even publishes a channel's aggregate ratings to the operator's own website. That still fails this cell on two independent grounds: the destination is never a public review site (Google review, review site, NPS, Net Promoter, Trustpilot and Yelp are zero over 696 documents and no such page exists among the 1,158 census docnames), and neither surface is post-transaction - one is ticket-scoped, one is chat-scoped. A SECOND standing-note sentence also falls to the mid-run correction: the outbound POS message set is NOT just the pos_sms receipt - extra/preparation.html documents installing the POS Enterprise SMS Whatsapp module and selecting templates for Order received and Order is ready, plus an in-store Order Status Screen showing Ready for pickup and Almost there (all strings verbatim on THAT page, not on the page cited here). Odoo therefore does message the guest post-order; what it never does is ask for a rating afterwards or route one anywhere. MODULE/EDITION: helpdesk is Enterprise (absent from the 638), but im_livechat and survey ARE Community, so the edition split is not what decides this - the missing routing destination is. FALSIFIER: a documented action branching on rating score to different destinations, one of them a public review site. https://www.odoo.com/documentation/19.0/applications/services/helpdesk/overview/ratings.html · retrieved 2026-09-05 adversarially verified
Includes a native referral mechanic with per-guest codes or links, attribution of the referred guest's first order, and two-sided rewards.
guest-loyalty-referral-program
Loyalty offers next-order coupons but no two-sided guest referral mechanic with per-guest codes and first-order attribution. (Odoo Referrals is a recruiting app.) https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Issues an Apple Wallet or Google Wallet loyalty pass with push-updatable balance, as an alternative to requiring a branded app download. differentiator
guest-loyalty-wallet-pass
No Apple Wallet or Google Wallet loyalty pass documented; loyalty is looked up by selecting a customer at the register. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Provides admin tooling to fulfill guest data access and deletion requests (CCPA/CPRA-style) including deletion propagation to loyalty and marketing records.
guest-loyalty-privacy-rights-tooling
Odoo's GDPR page walks each right by hand: access/portability via the customer portal or Action > Export, rectification via the portal, opt-out by ticking a field, erasure by attempting to delete the contact - which the system blocks where business documents still reference it, leaving anonymisation as the fallback. No packaged DSAR workflow and no deletion propagation into loyalty or mailing-list records. https://www.odoo.com/gdpr · retrieved 2026-08-08
Enforces loyalty fraud controls such as redemption velocity limits, manager approval on manual point adjustments, and flagging of employee self-redemption, with an audit log.
guest-loyalty-redemption-fraud-controls
No redemption velocity limits, manual-adjustment approval, or employee self-redemption flagging documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Vendor documents AI/ML-generated recommendations for offer content, target audience, or send timing (claim-level; verify it is a shipped product feature, not a roadmap statement). differentiator
guest-loyalty-ai-offer-recommendation
Shipped, not roadmap: an AI prompt embedded in an email template is evaluated per recipient at send time, the generated content being inserted into the message automatically, and the shipped prompts adapt the message content to the current record using that record's data. That is genuine AI-generated message content in an outbound marketing surface, which is the offer-content half of the cell. The recommendation half is absent: the page's own example use cases are sales follow-ups, HR communication and project updates, nothing recommends a discount, a target audience or a send time, 'optimal send|best time to send' returns zero over 696 documents, and the loyalty program form has no AI-suggested field. I verified all 12 AI pages are present in the corpus (ai.html, agents, apikeys, default_prompts, document_sort, email-templates, fields, improve_text, live-chat, server-actions, support_operations, voice), so this shortfall is a bounded enumeration and not a corpus hole. MODULE/EDITION: ENTERPRISE-ONLY - no ai, ai_*, *_ai or llm/gpt/gemini/openai module exists among the 638 Community modules, and the AI book never labels itself Enterprise (the same unlabelled-Enterprise trap as pos_preparation_display), so a Community install gets none of it. Partial not no under this record's hardware-kds edition precedent. FALSIFIER: an AI page recommending offer targets or send timing. https://www.odoo.com/documentation/19.0/applications/productivity/ai/email-templates.html · retrieved 2026-09-05 adversarially verified
Offers native stored-value/gift card balances tied to the same guest profile and redeemable across all locations of the brand.
guest-loyalty-stored-value-gift
Native gift cards under the Promotions, Coupons, Gift Card & Loyalty Program feature, tied to customer records and shared across POS configs in one database. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Labor & workforce
Employees clock in and out at the POS terminal using a PIN, badge, or card, with no separate time-clock hardware required.
labor-clock-in-at-pos
Employees log in to the register by badge scan, name selection or PIN, with no extra hardware. True clock-in/out lives in the separate Attendances app. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/employee_login.html · retrieved 2026-08-01
Captures a photo at punch (or performs facial verification) attached to the timecard entry, with a photo-only mode available that stores no biometric template. differentiator
labor-photo-punch-verification
RE-HOMED from the doc page to Community source, which closes this far harder than prose can. The kiosk identification method is a CLOSED Selection of exactly three values - ('barcode', 'Barcode / RFID'), ('barcode_manual', 'Barcode / RFID and Manual Selection') and ('manual', 'Manual Selection') - optionally gated by attendance_kiosk_use_pin, labelled 'Employee PIN Identification'. The camera is bound to barcode reading and nothing else: attendance_barcode_source is a Selection of ('scanner', 'Scanner'), ('front', 'Front Camera') and ('back', 'Back Camera'), string='Barcode Source'. I also read hr_attendance/models/hr_attendance.py: the punch record's complete stored field set is employee_id, department_id, manager_id, attendance_manager_id, check_in, check_out, date, worked_hours, the overtime fields, in/out latitude, longitude, location, ip_address, browser and mode - there is NO image or binary field of any kind, so no photo can be attached to a timecard entry and the non-biometric-mode half of the claim never arises. 'facial|face recognition|buddy punch' returns zero over 696 documents. MODULE/EDITION: hr_attendance is Community and it is the punch device, NOT the POS - pos_hr scopes itself to employee login at the till by barcode or PIN with no punch record. FALSIFIER: an image field on hr.attendance, or a fourth kiosk mode. https://raw.githubusercontent.com/odoo/odoo/19.0/addons/hr_attendance/models/res_company.py · retrieved 2026-09-05 adversarially verified
Records time punches while the POS is offline and reconciles them on reconnect without loss or duplicate entries, with the behavior documented. differentiator
labor-offline-time-punch
RE-HOMED AND STRENGTHENED after bounding against the census rather than the corpus, which is what the coordinator's warning was for and it landed: applications/general/offline_mode IS in the 1,159-page Sphinx census and was ABSENT from the 696-document corpus, so my earlier 'offline mode = 0' was a corpus artefact and not a documentation zero. I fetched the page live (200, 408,600 bytes, 1,168 characters of article text) and it decides the cell against the vendor more firmly than absence ever could. Odoo does ship a platform-wide offline mode - it “makes certain data available offline for logged-in users”, and “views or records that were previously opened while online can be re-opened, regardless of whether they were active in the browser at the moment connectivity was lost” - but it is READ-ONLY, and the page says so in terms: “Previously opened records can be viewed but not modified while offline.” A time punch is a write (hr_employee.py's _attendance_action_change CREATES an hr.attendance record, stamped server-side with fields.Datetime.now()), so under Odoo's own documented offline behaviour a punch cannot be taken at all while disconnected, let alone queued and reconciled. The page also caps local data at 2 GB with oldest-first eviction and warns that a hard refresh removes all locally stored data - retention rules, not reconciliation rules; there is no queue, no replay and no duplicate suppression anywhere in it. MODULE/EDITION: hr_attendance and pos_hr are both among the 638 COMMUNITY modules, and the offline framework is web-client-wide, so this holds identically in Enterprise. BOOK COMPLETENESS: applications/hr/attendances is 10 of 10 census pages present in the corpus and applications/hr/payroll 27 of 27, so the 54 missing hr pages the coordinator flagged do not touch this cell. RECORDED AGAINST MYSELF: point_of_sale/controllers/main.py serves /pos/service-worker.js, so the POS REGISTER is a genuinely offline-capable PWA - but pos_hr is register login only and no POS module references hr_attendance, so the punch does not ride that buffer. FALSIFIER: an Attendances or offline-mode page describing writeable offline records or a punch queue. https://www.odoo.com/documentation/19.0/applications/general/offline_mode.html · retrieved 2026-09-05 adversarially verified
Permissions are grantable per discrete action (void, comp, discount, refund, drawer open, price change, report access) per role and per location, not limited to fixed cashier/manager/admin tiers.
labor-granular-rbac
POS rights are three fixed tiers — Minimal, Basic, Advanced — with a fixed action list per tier, not per-action grants per role and location. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/employee_login.html · retrieved 2026-08-01
Manager overrides and approvals are attributed to the individual approver and written to an immutable audit trail queryable after the fact.
labor-manager-override-audit
Session reports show who opened the register and the Employee on each order. No immutable, queryable override-approval trail documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Builds and publishes employee shift schedules inside the same platform that holds the timekeeping data, rather than requiring a third-party scheduling app. differentiator
labor-native-scheduling
True that Planning is first-party, but it is a separate app: unavailable on the $0 One App Free tier the dossier leans on, and it reaches the operator only via the all-apps Standard/Custom per-user subscription. It is also not a restaurant labor scheduler — no demand forecast from POS sales, no break/minor/fair-workweek rules (the dossier correctly scores all three 'no'), which makes an unqualified yes here inconsistent with its own neighbors. https://www.odoo.com/pricing · retrieved 2026-08-01 adversarially verified
Generates recommended staffing levels or labor hours by daypart from the operator's own POS sales history, not just a static template. differentiator
labor-demand-labor-forecast
Payroll consumes Planning, Attendances and Timesheets; no staffing recommendation generated from POS sales history is documented. https://www.odoo.com/documentation/19.0/applications/hr/payroll.html · retrieved 2026-08-01
Displays labor cost as a percentage of sales in real time during service on a manager view or POS, not only in end-of-day or next-morning reports. differentiator
labor-realtime-labor-percent
POS reporting covers orders and sessions only; no live labor-cost-to-sales view on a manager screen. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Warns or blocks at clock-in when an employee is approaching or would cross a configured overtime threshold, before the overtime is incurred. differentiator
labor-overtime-prevention
RE-HOMED off the doc page onto the model that enumerates the rule, because the cell asks about a capability rather than about documentation and the source is the stronger enumeration. hr.attendance.overtime.rule (module hr_attendance, one of the 638 COMMUNITY modules; identical in Enterprise) carries its complete field set here and the only outcome fields are paid = fields.Boolean("Pay Extra Hours"), amount_rate, employee_tolerance and employer_tolerance - there is no warn, block, notify or approval-gate field, and every condition field (base_off 'Quantity'/'Timing', timing_type, expected_hours, quantity_period) evaluates time ALREADY worked. The check-in path confirms there is no gate: hr_employee.py's _attendance_action_change creates the hr.attendance record unconditionally and its only raise is on a check-OUT with no matching check-in. The operator doc agrees and is itself enumerative: overtime.html (a different document, so its wording is reported rather than quoted to this url) says the Action section determines how approved extra time is handled and then offers exactly two checkboxes, Pay extra hours and Give back as time off. The two clock.?in hits at 696 documents are work_entries.html, where the phrase covers an employee who forgot to clock in and out for a shift - a retrospective correction and the Australian payroll page, neither a threshold gate. EDITION: Community and Enterprise alike; APP: Attendances, not point_of_sale. FALSIFIER: a rule field or kiosk prompt that warns on or refuses a check-in against a configured threshold. CENSUS BOUND: applications/hr/attendances is 10 of 10 census pages present in the corpus and applications/hr/payroll 27 of 27, so none of the 54 missing applications/hr census pages is an attendance or payroll page and this verdict is not standing on a hole; the primary instrument is in any case the source model, not a corpus count. https://raw.githubusercontent.com/odoo/odoo/19.0/addons/hr_attendance/models/hr_attendance_overtime_rule.py · retrieved 2026-09-05 adversarially verified
Configures meal and rest break rules per state or jurisdiction, prompts required break attestation, and flags missed breaks for premium pay. differentiator
labor-break-compliance-by-state
Working schedules and country localizations drive payroll rules; no US state-level meal/rest break prompts or missed-break premium flags documented. https://www.odoo.com/documentation/19.0/applications/hr/payroll.html · retrieved 2026-08-01
Enforces minor-labor restrictions (age-based maximum hours, prohibited time windows, school-day limits) at both scheduling and clock-in.
labor-minor-labor-rules
No age-based hour caps, prohibited windows or school-day limits enforced at scheduling or clock-in. https://www.odoo.com/documentation/19.0/applications/hr/payroll.html · retrieved 2026-08-01
Computes tip pooling and tip-outs automatically per shift from configurable rules (percentage of sales, hours worked, points, or role), rather than requiring a manual spreadsheet.
labor-tip-pooling-rules
Tips post as a single [TIPS] product line per order. No pooling or tip-out computation documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Retains a per-shift, per-employee record of tips received, amounts contributed to the pool, and amounts distributed from the pool, exportable for audit.
labor-tip-distribution-audit-trail
Tip lines are attached to orders, and orders carry the Employee, so tips received are traceable. No pool contribution or distribution record exists. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Payroll export separates cash from charged qualified tips and carries a Treasury tipped-occupation code, supporting the W-2 Box 12 code TP and Box 14b reporting required for tax year 2026. differentiator
labor-qualified-tips-w2-reporting
UPHELD, and the standing note's declared HONEST LIMIT is now closed against the vendor rather than left open. POS side: pos.order carries exactly two tip fields - "is_tipped = fields.Boolean('Is this already tipped?', readonly=True)" and "tip_amount = fields.Monetary(string='Tip Amount', readonly=True)" - one undifferentiated total with no cash-versus-charged split and no occupation code; module point_of_sale, one of the 638 COMMUNITY modules and identical in Enterprise. Community side: no module matching 'payroll' exists in the 638, so the open-source edition has nothing to export to. ENTERPRISE side, which the standing note could not reach: applications/hr/payroll/payroll_localizations/united_states.html is now a live 470,825-byte page (probed 2026-09-05) and I read its 23,881 characters of article text. Reported rather than quoted, because it is a different document from this row's url: it documents a W2 Report that produces a CSV for employees to e-file with third-party software, and a W-2 form section whose options it says correspond to checkboxes in box 13 of the W-2 form - box 13 only. Across that whole page 'Box 12' = 0, 'Box 14' = 0, 'occupation' = 0, 'qualified' = 0, and every 'tip' hit is a UI Tip callout, not a gratuity. So the Enterprise US payroll localisation is an ENUMERATING document for W-2 boxes and it enumerates box 13, never box 12 code TP, box 14b or a Treasury tipped-occupation code. The no therefore holds in BOTH editions, not just Community. FALSIFIER: a tipped-occupation field on hr.version or a box-12/14 mapping in l10n_us_hr_payroll. CENSUS BOUND: applications/hr/payroll is 27 of 27 census pages present, and the decisive page was in any case read LIVE off the census rather than off the corpus, so the applications/hr hole does not reach this cell. https://raw.githubusercontent.com/odoo/odoo/19.0/addons/point_of_sale/models/pos_order.py · retrieved 2026-09-05 adversarially verified
Vendor processes payroll itself as a first-party product (tax filing and direct deposit), as opposed to exporting to a third-party payroll provider only. differentiator
labor-native-payroll
Odoo Payroll computes payslips from contracts and work entries and pays by wire, SEPA or check. No evidence Odoo files payroll taxes as a service. https://www.odoo.com/documentation/19.0/applications/hr/payroll.html · retrieved 2026-08-01
Exports timecards, wages, and tips in documented formats or via direct integration for at least two major payroll providers (e.g. Gusto, ADP, Paychex, QuickBooks).
labor-payroll-export-formats
Odoo positions Payroll as the system of record rather than an exporter; no named Gusto, ADP, Paychex or QuickBooks payroll connector documented. https://www.odoo.com/documentation/19.0/applications/hr/payroll.html · retrieved 2026-08-01
Employees can request shift swaps or claim open shifts in a self-service app, subject to a manager approval workflow that enforces overtime and role eligibility. differentiator
labor-shift-swap-workflow
Odoo Planning supports open shifts employees can take, but a manager-approved swap workflow enforcing overtime and role eligibility is not documented. https://www.odoo.com/documentation/19.0/applications/hr/payroll.html · retrieved 2026-08-01
Reports per-employee sales performance metrics (average check, items or category attachment rate, void and comp rate) by server or cashier. differentiator
labor-server-performance-metrics
Orders carry the Employee and are analysable in graph/pivot views, so average check is derivable. No packaged void, comp or attachment-rate scorecard. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Inventory, purchasing & cost control
Supports multi-level recipe/BOM costing where a recipe can contain sub-recipes (prep items) and plate cost recalculates automatically when any component ingredient's cost changes.
inventory-recipe-bom-costing
Odoo Manufacturing provides multi-level BoMs with sub-assemblies and cost rollup natively, but POS docs never connect recipes to plate cost. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Stores purchase unit, recipe unit, and count unit per item with explicit conversion factors, plus a yield/waste percentage applied to raw-to-usable conversion.
inventory-unit-conversion-yields
Units of Measure & Packagings with conversion factors are native and surfaced in POS. No raw-to-usable yield or waste percentage documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Produces a theoretical-vs-actual usage variance report per item for a defined count period, showing theoretical usage from POS sales times recipe, actual usage from counts plus receipts, and the variance in both units and currency. differentiator
inventory-theoretical-vs-actual
Physical inventory adjustments produce counted-versus-system variance, but no theoretical usage from sales times recipe versus actual report is documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Depletes ingredient on-hand quantities in near real time as orders are fired at the POS, including depletion driven by modifier selections, not only in an end-of-day batch. differentiator
inventory-realtime-depletion
POS shows Free To Use units and sales move stock for tracked Goods and Combo products. Modifier-driven ingredient depletion needs BoM/kit setup not documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Automatically 86s (marks unavailable) menu items on the POS, online ordering, and connected third-party delivery menus when a component ingredient hits zero or a configured threshold. differentiator
inventory-86-auto-sync
No automatic 86 of menu items to POS, online ordering or delivery channels when a component hits zero or a threshold. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Supports full physical inventory, ad-hoc spot counts of a subset, and scheduled recurring cycle counts, with each count's variance recorded as separate history rather than overwriting prior counts.
inventory-count-modes
Odoo Inventory supports full physical inventory, partial adjustments and scheduled cycle counting with dated history — documented in Inventory, not POS. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Provides a mobile/tablet counting app supporting barcode or QR scanning that continues to accept counts with no network connectivity and syncs on reconnect.
inventory-mobile-count-offline
Odoo Barcode provides mobile scanning for counts; offline tolerance and reconnect sync are not documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Ships pre-built electronic vendor catalog and order-transmission integrations with named broadline distributors (e.g. Sysco, US Foods, Performance Food Group) that send purchase orders and receive invoices electronically rather than by emailed PDF. differentiator
inventory-vendor-catalogs-edi
Odoo supports vendor pricelist import and RFQ/PO email, but no pre-built Sysco, US Foods or PFG EDI catalog integration is documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Ingests supplier invoices from photo, PDF, or email and extracts line-item detail (item, quantity, unit, price) into the inventory ledger without manual line entry. differentiator
inventory-invoice-ocr
Odoo Accounting/Documents offers AI invoice digitization via IAP credits; line-item extraction directly into the inventory ledger was not verified. https://www.odoo.com/pricing · retrieved 2026-08-01
Tracks per-item purchase price history across invoices and alerts when a received price exceeds the prior or contracted price by a configurable threshold. differentiator
inventory-price-change-alerts
Vendor pricelists store prices, but no received-price-versus-prior alerting with a configurable threshold is documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Maintains par levels per item per location and generates suggested purchase order quantities from on-hand versus par, with at least one mode driven by a sales forecast rather than a static par. differentiator
inventory-par-auto-suggest
Odoo reordering rules (min/max) generate suggested purchase orders; a forecast-driven par mode from sales history is not documented for restaurants. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Provides a structured waste/spoilage logging workflow with reason codes that debits inventory and reports waste cost separately from usage variance.
inventory-waste-logging
Odoo Inventory Scrap records losses against a scrap location and debits stock; reason codes and a waste-cost report separate from usage variance are not documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Tracks expiration or use-by dates on received and prepped items and surfaces an expiring-soon report or alert before spoilage.
inventory-shelf-life-expiry
I could not re-verify that sentence on the cited POS products page; the rendered page's stock section is a stub linking out to Inventory. Expiry tracking is a real Odoo Inventory feature, but its POS surfacing — the thing the cell is scoring — is not confirmed on the cited source. Same caution applies to inventory-lot-traceability's stronger sub-claim that lots are 'imported automatically onto POS cart lines,' which I also could not verify. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01 adversarially verified
Supports partial-bottle liquid inventory by weight (scale integration) or by bottle fraction for bar and beverage counting.
inventory-bar-partial-bottle
POS supports To Weigh With Scale for by-weight sales, but no partial-bottle liquid counting by weight or bottle fraction is documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Exports period COGS and accounts-payable invoice detail in a named accounting system's import format (e.g. QuickBooks, Sage Intacct, NetSuite) with GL account mapping configurable per item category.
inventory-cogs-gl-export
Odoo Accounting is the GL, so COGS and AP post natively rather than exporting; no QuickBooks/Intacct/NetSuite import-format connector is shipped. https://www.odoo.com/pricing · retrieved 2026-08-01
Inventory and recipe costing are delivered natively by the POS vendor rather than requiring a separately-contracted third-party product (e.g. MarginEdge, MarketMan, Restaurant365) to function. differentiator
inventory-native-not-partner
Inventory installs automatically with POS and Manufacturing/Purchase/Accounting are all Odoo-built — no MarginEdge or MarketMan contract needed. Beyond one app, plan cost applies. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html · retrieved 2026-08-01
Reporting, BI & data access
Provides a live sales dashboard reflecting transactions within minutes of the sale, accessible from both a browser and a mobile app off-premise.
reporting-realtime-dashboard
POS dashboard plus Reporting > Orders in graph or pivot view, filterable and groupable; available in a browser and the Odoo mobile app. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Generates a daily close-out/EOD report reconciling gross sales, net sales, tax, tips, discounts, refunds, tender types, and expected cash deposit in one document.
reporting-eod-closeout
Closing the register produces a comprehensive session report covering all session activity, who opened it, and every order placed during it. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Provides a product mix (PMIX) report at individual menu item AND modifier level with quantity, gross and net sales, filterable by daypart and revenue center.
reporting-pmix-modifier-level
Order statistics pivot by product and variant. Modifiers are attribute values or combo lines, so true modifier-level PMIX is not a first-class report. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Produces an audit report of comps, voids, discounts, and price overrides attributed to the employee who applied them and the manager who approved them, with reason codes and timestamps.
reporting-comps-voids-audit
Orders list shows status, employee and totals, and discounts are order lines. No dedicated comps/voids audit report with reason codes and approver. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Reports cash over/short per drawer, per shift, and per employee, comparing counted cash to expected cash from tendered transactions and paid-outs.
reporting-cash-over-short
POS cash control with cash-in/cash-out and register close computes a session difference; per-employee over/short reporting is not documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/employee_login.html · retrieved 2026-08-01
Reports sales per labor hour and labor cost as a percentage of sales by hour, by department, and by employee, using actual clocked hours from the POS time clock.
reporting-labor-productivity
POS reporting is limited to order and session statistics; sales per labor hour and labor percent by hour are not produced. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Reports per-server metrics including average check, items per check, attachment rate for named categories, and tips as a percentage of sales. differentiator
reporting-server-scorecards
Orders are groupable by Employee in pivot/graph, giving average check and volume. No packaged attachment-rate or tips-percent scorecard. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Reports revenue and margin by fulfillment channel — dine-in, direct online, first-party delivery, and each third-party marketplace separately — net of marketplace commission fees. differentiator
reporting-channel-profitability
Orders can be grouped by preset (Dine In/Takeout/Delivery) and by point of sale. No revenue net of marketplace commission by channel. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html · retrieved 2026-08-01
Supports scheduling any report for automatic recurring delivery by email or to a shared destination on a defined cadence and recipient list.
reporting-scheduled-delivery
Studio automation rules with timing triggers can email records on a cadence; no built-in 'schedule this report to recipients' control in POS reporting. https://www.odoo.com/documentation/19.0/applications/studio/automated_actions.html · retrieved 2026-08-01
Publishes a documented public REST or GraphQL API covering orders, payments, menu, and labor data, with self-service developer credentials obtainable without a signed partner agreement. differentiator
reporting-public-api
External JSON-2 API at /json/2/<model>/<method> with bearer API-key auth and a per-database /doc page listing available models, fields and methods. https://www.odoo.com/documentation/19.0/developer/reference/external_api.html · retrieved 2026-08-01
Emits outbound webhooks for order and payment lifecycle events to a customer-supplied endpoint, with documented retry behavior and payload signature verification. differentiator
reporting-webhooks
'Send Webhook Notification' POSTs selected fields to a URL from any automation rule. No documented retry behaviour and no payload signature. https://www.odoo.com/documentation/19.0/applications/studio/automated_actions.html · retrieved 2026-08-01
API and raw-data access are included in the standard subscription rather than gated behind an additional per-location fee, revenue share, or enterprise-only contract. differentiator
reporting-api-not-upcharged
'Access to data via the external API is only available on Custom Odoo pricing plans... not available on One App Free or Standard plans.' Self-hosting is exempt. https://www.odoo.com/documentation/19.0/developer/reference/external_api.html · retrieved 2026-08-01
Core reporting beyond basic sales summaries — labor vs sales, PMIX, comps/voids audit, multi-location comparison — is available on the entry-level paid plan rather than requiring a higher tier or an add-on analytics SKU. differentiator
reporting-tier-paywall
POS reporting, pivot analysis and session reports ship with the app itself, including on the $0 One App Free plan. The paywall is on the API, not reporting. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Documents a historical retention window of at least 24 months of transaction-level detail queryable in the reporting UI, with no silent truncation or archive retrieval fee. differentiator
reporting-history-retention
Closed sessions and their orders stay in the reporting views ('access the comprehensive report to review all session activities'), filterable and groupable in graph or pivot; data sits in the operator's own database, which is downloadable as a ZIP at any time. No archiving, purge or archive-retrieval fee appears anywhere in the POS or database-management docs, but Odoo publishes no retention-window commitment at all, so a 24-month floor is not documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-08
Sends proactive push or email alerts when an operator-configured metric breaches a threshold or deviates from its historical pattern (e.g. void spike, sales below forecast, discount rate anomaly). differentiator
reporting-anomaly-alerts
Automation rules can fire emails when records match a domain condition. No statistical deviation-from-pattern alerting. https://www.odoo.com/documentation/19.0/applications/studio/automated_actions.html · retrieved 2026-08-01
Offers a natural-language query or AI assistant that answers ad-hoc questions against the operator's own sales and labor data and returns a figure or chart, not a generic help-article response.
reporting-nl-query
UPHELD and quote-checked verbatim at 696 documents. The capability is real and first-party: agents.html's preconfigured 'Natural Language Search' topic 'supports the interpretation of a user query to open the appropriate Odoo view with a set of tools necessary to perform the search', beside 'Information retrieval : a collection of tools to retrieve information about the models', and it runs read-only unless given tools - 'it is only able to provide information, not complete tasks or make changes to the database'. The sibling ai.html (a different document, so reported not quoted here) says the standard Ask AI agent can open views and display reports but cannot create leads or alter data, which is the figure-or-chart half of the rubric answered against the operator's OWN records rather than a help article. All five strings re-verified as single-document hits. EDITION: the AI application is ENTERPRISE - no module matching ai, ai_*, *_ai, llm, openai or gemini exists among the 638 Community modules (the standing note says 637; the oracle is 638), and the book itself only says 'creating and customizing agents requires that the AI application is installed'. Under the record's own precedent (hardware-kds, a standing verified row scoring the Enterprise-only pos_preparation_display as partial) an Enterprise-only, first-party, documented capability is partial - never yes, because Community lacks it, and never no, because it demonstrably exists. Second discount: ai.html's own enumerated list of common requests is translation, summarise, generate, improve and suggest, none of them a sales-or-labor figure. FALSIFIER: an ai module appearing in a Community module listing. CENSUS BOUND: applications/productivity/ai is 12 of 12 census pages present in the corpus, so the AI book is complete and this verdict does not rest on a corpus hole. https://www.odoo.com/documentation/19.0/applications/productivity/ai/agents.html · retrieved 2026-09-05 adversarially verified
Reports guest-level analytics including new versus returning guest counts, visit frequency, and lifetime spend cohorts tied to identifiable guest records from loyalty or online ordering. differentiator
reporting-guest-cohorts
Orders carry the Customer and are pivotable, so frequency and lifetime spend are derivable. No packaged new-versus-returning or cohort report. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Produces a forward sales forecast at daypart or hourly granularity from the location's own history, exposed in the reporting UI and consumable by scheduling or ordering workflows. differentiator
reporting-sales-forecast
POS reporting is historical only; no forward hourly or daypart sales forecast is exposed. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Generates payroll- and tax-ready tip reporting: declared versus charged tips per employee, tip pool distribution detail, and a tax liability summary by jurisdiction.
reporting-tip-tax-compliance
Charged tips are captured as order lines attributable to an employee. No declared-versus-charged split, pool detail, or jurisdiction tax liability summary. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Multi-location, franchise & enterprise governance
Supports a named organizational hierarchy of at least three levels (e.g. enterprise > region/group > location) as a first-class object that reporting and permissions can be scoped to, not just a flat list of locations.
multi-location-org-hierarchy
Multi-company (parent/child) plus many POS configs per company gives a hierarchy that reporting and record rules scope to, but multi-company requires the Custom plan. https://www.odoo.com/pricing · retrieved 2026-08-01
Supports price tiers/zones so one menu item carries different prices per location group, per order channel, and per daypart without duplicating the item record.
multi-location-price-zones
Pricelists give one product different prices per POS, per preset/channel, per customer and per date window without duplicating the product record. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Provides above-store reporting that aggregates sales, labor, discounts, voids, and item mix across any selected set of locations in one view, with store-vs-store ranking and variance flags.
multi-location-consolidated-reporting
Order statistics aggregate across POS configs via pivot grouping. No store-versus-store ranking or variance flagging, and labor is not in POS reporting. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html · retrieved 2026-08-01
Gift cards issued at one location are redeemable at any other location in the brand, with a reported outstanding-liability balance and inter-store settlement/redemption reconciliation between owners.
multi-location-cross-location-giftcard
Gift cards are database records usable at any POS in the company. No outstanding-liability report or inter-store redemption settlement documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
A single customer loyalty profile, balance, and stored order history is shared across all locations in the brand rather than being per-location.
multi-location-cross-location-loyalty
One res.partner and one loyalty card serve every POS in the database; cross-company sharing depends on multi-company record-rule configuration. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
A single location/terminal can operate two or more distinct brands or virtual brands with separate menus, receipts/branding, and separately reportable revenue, on the same hardware and drawer. differentiator
multi-location-multi-brand
Multiple POS configs with distinct product categories, pricelists and receipts can run on one device, but only one session at a time per register. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
Tax configuration is per-location with support for multiple simultaneous tax rates, jurisdiction-specific rules (e.g. prepared-food vs grocery, inclusive vs exclusive tax), and per-location tax exemptions.
multi-location-multi-tax-jurisdiction
Fiscal positions map taxes and accounts per POS, per customer and per preset, with country localization packages preconfigured and inclusive/exclusive handling. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Labor rules (overtime, break enforcement, predictive-scheduling compliance) are configurable per location or location group and enforced at the terminal, not just reported after the fact.
multi-location-central-labor-policy
POS rights tiers are per point of sale but labor rules (overtime, breaks, predictive scheduling) are not enforced at the terminal. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/employee_login.html · retrieved 2026-08-01
Hardware & physical footprint
The POS software runs on commodity off-the-shelf hardware (standard iPads, Android tablets, or PCs) that the operator can buy from a third party, rather than only on vendor-supplied proprietary terminals. differentiator
hardware-commodity-devices
Browser-based POS running on any device; peripherals are commodity Epson/ESC-POS printers and third-party iMin Android units bought from iMin partners. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
Vendor documentation names the specific client operating systems supported (iOS/iPadOS, Android, Windows, Linux/web) and states minimum OS versions and device specs.
hardware-os-platforms
Docs name Chromium 142+ browsers (Chrome, Brave, Edge, Vivaldi, Opera) for LNA and iMin Android devices, but publish no full OS/device minimum-spec matrix. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/pos_lna.html · retrieved 2026-08-01
Offers a purpose-built handheld ordering device with an integrated card reader (not a phone case add-on), with published drop rating and IP ingress rating.
hardware-handheld-purpose-built
Odoo sells no handheld. Hardware guidance is commodity browser devices, Epson printers and iMin Android POS units from third-party partners. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
The handheld supports hot-swappable or field-replaceable batteries, or the vendor publishes a rated battery life for a full shift. differentiator
hardware-handheld-battery-swap
No first-party handheld exists, so no battery rating or hot-swap claim is published. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
Handhelds support cellular/LTE connectivity as a documented fallback when store Wi-Fi drops, either built into the device or via a vendor-supplied failover.
hardware-handheld-lte
This page is Odoo's own enumeration of POS hardware AND network topics, which is the right instrument for this proposition: "Odoo Point of Sale supports integration with a variety of hardware, including" payment terminals, cash drawers, customer displays, scales, barcode scanners, receipt printers and in-store electronic shelf labels, and its only network entries are Local Network Access and the IoT system connection. No connectivity product and no failover appears. Re-run over the corrected 696-document corpus with the Sphinx nav stripped, the regex '\bLTE\b|\b4G\b|\b5G\b|cellular' returns ZERO - the standing note's claim of exactly one hit in an HR employee-record page does not reproduce at 696 and I have dropped it. MODULE/EDITION: point_of_sale is core Community, and Odoo ships no first-party handheld at all (the POS is a browser application on merchant-supplied devices), so there is no vendor-supplied failover that could exist to document. FALSIFIER: an Odoo page documenting cellular failover or a cellular-equipped POS device; a commodity phone running the browser POS has its own radio, but Odoo documents no failover behaviour for it. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network.html · retrieved 2026-09-05 adversarially verified
Terminals continue to take orders, print to kitchen, and record cash sales with the internet down, and the vendor documents explicitly which functions degrade (card auth, loyalty lookup, refunds).
hardware-offline-mode
Marketing and docs claim reliable online-and-offline operation, but no explicit list of which functions degrade is published. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale.html · retrieved 2026-08-01
Sells or supports a dedicated kitchen display system with bump-bar or touch input, station routing, and course/fire timing, as a first-party product rather than an integration-only dependency.
hardware-kds
It is genuinely first-party and the routing/stages/alert-timer/Recall features are all verbatim in the docs — but it is Enterprise-edition-only (module absent from the public odoo/odoo tree; docs treat it as an Enterprise app), so it is not available to the Community self-host the dossier's whole 'best at' thesis rests on. Also verified: 'IoT boxes are not supported.' https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html · retrieved 2026-08-01 adversarially verified
Offers a self-order kiosk running the same menu and modifier engine as the POS, in both countertop and freestanding form factors, with integrated payment and accessibility (ADA) compliance documented. differentiator
hardware-kiosk
First-party kiosk software on the same menu, optionally on an IoT Box touchscreen. No countertop/freestanding SKUs and no ADA documentation. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-08-01
Supports drive-thru-specific hardware: outdoor digital menu boards, order confirmation displays, and speaker/headset integration, with a documented timer/speed-of-service measurement.
hardware-drive-thru
Hardware docs cover printers, scales, customer displays, electronic labels and IoT. No menu boards, confirmation displays or headset integration. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale.html · retrieved 2026-08-01
Works with standard ESC/POS thermal receipt and kitchen printers from more than one manufacturer (e.g. Epson and Star), including LAN/Ethernet printers, rather than only vendor-branded printers.
hardware-printer-compatibility
'Epson printers are strongly recommended.' Network ePOS direct (Epson), any ESC/POS via an IoT system, LAN/Ethernet supported; Bluetooth explicitly not compatible. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
Supports the standard peripheral set — cash drawers (including multi-drawer per terminal), barcode scanners, scales for by-weight items, and customer-facing displays — with a published compatibility list.
hardware-peripherals
Documented pages for scales, customer displays, electronic shelf labels, barcode scanning and cash machines (Cashdro, Cashmatic, Glory). Multi-drawer per terminal not documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale.html · retrieved 2026-08-01
Card entry happens on a PCI-listed PTS device using validated point-to-point encryption, so the POS application and tablet stay out of PCI scope; the vendor states the merchant's SAQ type.
hardware-p2pe-terminal
Card entry happens on the third-party provider's PTS terminal, keeping Odoo out of the card path, but Odoo does not state the merchant's SAQ type. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01
Supports contactless acceptance directly on a commodity phone or tablet (Tap to Pay on iPhone / Tap to Pay on Android) with no separate reader. differentiator
hardware-tap-to-phone
Verified verbatim by re-reading the cited source file, line 35: module_pos_viva_com is declared with help="The transactions are processed by Viva.com on terminal or tap on phone." - Odoo's own words for tap-to-phone, in core Community source. MODULE/EDITION: the field lives in point_of_sale itself and pos_viva_com IS among the 638 Community modules, so the open-source edition gets it. Partial not yes: of the terminal-provider fields in this one file only Viva.com carries the tap-on-phone clause - the sibling help strings for Adyen, Stripe, Razorpay and Mercado Pago read only "The transactions are processed by" that provider - the acceptance runs in Viva's own application rather than in Odoo's browser POS, and Odoo never names Tap to Pay on iPhone or Tap to Pay on Android anywhere ('tap to pay' 0 and 'softpos' 0 over 696 documents; 'tap on phone' returns exactly 1, this file). It also could not be yes under the brief's rule that a terminal provider's capability never scores an Odoo cell yes. FALSIFIER: a second provider module gaining the same help text. https://raw.githubusercontent.com/odoo/odoo/19.0/addons/point_of_sale/models/res_config_settings.py · retrieved 2026-09-05 adversarially verified
Hardware prices are published per SKU on the vendor's public site, rather than quote-only. differentiator
hardware-pricing-transparency
Odoo publishes no POS hardware SKU prices; devices are sourced from third parties such as iMin business partners. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
Hardware can be purchased outright (owned) as an alternative to a mandatory lease or subscription-bundled rental, and the vendor states which. differentiator
hardware-ownership-vs-lease
CLAIM: hardware can be bought outright as an alternative to a mandatory lease/subscription-bundled rental, and the vendor states which. VERDICT: unknown -> partial/C. NEW SURFACE: www.odoo.com/app/iot-faq (HTTP 200; a fabricated sibling /app/zzq-fabricated-control returns 404, so not a catch-all), the page the IoT docs themselves link as "IoT system FAQ" (odoo/documentation master 05a1e9c6 content/applications/general/iot.rst). This is exactly the falsifier the standing row asked for: an Odoo page stating IoT box purchase terms. EVIDENCE (vendor FAQ, verbatim after tag-strip): "The IoT Box Subscription costs US$ 30.00 /month/box. For each IoT Box Subscription, you get an IoT Box for free (shipping fees included) (special temporary offer)." and "You can buy an IoT Box from our eCommerce for US$ 179.68 *." and "If the IoT Box is connected to a production database, the US$ 30.00 /month/box subscription will be added to the enterprise contract automatically." Docs (grade B, iot.rst / applications/general/iot.html): "An IoT box subscription is required for production use of IoT systems and generating the HTTPS certificate." SHORTFALL (why partial, not yes): (1) buying the box outright is NOT an alternative to the subscription - the US$30/month/box subscription is mandatory for production use whether the box was bought or came free with the subscription, so ownership does not escape the recurring fee; (2) the FAQ does not say whether the "free" subscription box is owned or remains Odoo's; (3) the FAQ's "eCommerce" link, /shop/iot-box-8937, now returns 404 and the live /shop listing holds only goodies and the Scale-Up game, so the outright-purchase offer may be retired (Wayback CDX was offline 2026-09-17, so not dated); (4) grade C, a marketing FAQ. CONTEXT: the POS itself runs in a browser on merchant-supplied devices, and the Windows virtual IoT (iot/windows_iot.rst) needs no Odoo hardware, but iot.rst requires the same subscription for "IoT systems" generally. Retrieved 2026-09-17. https://www.odoo.com/app/iot-faq · retrieved 2026-09-17 adversarially verified
Vendor documentation confirms whether hardware purchased from the vendor remains usable with other software after cancellation, i.e. it is not software-locked or remotely bricked. differentiator
hardware-usable-after-churn
Hardware is commodity third-party equipment Odoo never sold or provisioned, so it cannot be software-locked — but Odoo publishes no statement to that effect. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
Publishes a hardware warranty term and a replacement/advance-exchange SLA with a stated turnaround (e.g. next-business-day depot swap). differentiator
hardware-rma-sla
Odoo sells no restaurant hardware and publishes no warranty term or advance-exchange SLA. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
Staff can run the ordering or payment app on their own personal phone (BYOD) with a documented permission and security model.
hardware-byod
The POS runs in a browser on any phone, with employee badge, name or PIN login gating access. No documented BYOD security or device-management model. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/employee_login.html · retrieved 2026-08-01
Provides a remote device-management console showing each terminal, printer, and KDS as online/offline, with remote reboot, software-version visibility, and staged rollout of updates. differentiator
hardware-remote-device-management
The IoT app lists connected devices and the POS exposes an LNA Permission status popup. No fleet console with remote reboot or staged rollout. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/pos_lna.html · retrieved 2026-08-01
Integrates with specialty beverage hardware — self-pour tap walls, flow meters, or liquor pour spouts — such that pours post to a POS tab automatically.
hardware-selfpour-scales
Weighing scales are supported for by-weight products, but no self-pour tap wall, flow meter or pour-spout integration is documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/scale.html · retrieved 2026-08-01
Supports inbound caller ID hardware or a telephony integration that pops the customer record and order history at the POS on an incoming call.
hardware-callerid-integration
Odoo ships a VoIP app that surfaces the contact record on calls, but no documented POS caller-ID popup with order history. https://www.odoo.com/pricing · retrieved 2026-08-01
Integrations, API & extensibility
Public, self-serve API reference documentation is readable without a signed partner agreement, NDA, or sales call.
extensibility-public-api-docs
External JSON-2 API reference is fully public with no NDA or sales call, plus a per-database /doc page enumerating models, fields and methods. https://www.odoo.com/documentation/19.0/developer/reference/external_api.html · retrieved 2026-08-01
API access is included in the base subscription at no additional per-location fee, surcharge, or upgraded plan requirement. differentiator
extensibility-api-access-cost
Verified verbatim, and it appears consistently across the 15.0 through 19.0 and master docs — this is longstanding policy, not a 19.0 quirk. Note two refinements the dossier missed: /json/2 is flagged 'New in version 19.0', so anyone on 18.0 or earlier has only XML-RPC/JSON-RPC; and a forum thread claims read access works in practice on lower plans, which is not authoritative and should not be scored. https://www.odoo.com/documentation/19.0/developer/reference/external_api.html · retrieved 2026-08-01 adversarially verified
A free sandbox or test environment with seeded data is available to developers without owning a paid production account. differentiator
extensibility-free-sandbox
Odoo offers a free trial, a public demo database and runbot builds, and Community Edition self-hosts free — but no purpose-built seeded developer sandbox is documented. https://www.odoo.com/pricing · retrieved 2026-08-01
Third-party apps authenticate via OAuth 2.0 with scoped, operator-granted, individually revocable permissions (not shared static API keys or credential sharing).
extensibility-oauth-partner-apps
External API auth is 'bearer followed by an API key' — a static per-user key, not OAuth 2.0 with scoped, individually revocable operator consent. https://www.odoo.com/documentation/19.0/developer/reference/external_api.html · retrieved 2026-08-01
The platform pushes real-time webhooks for order lifecycle events (created, modified, paid, voided, refunded) rather than requiring polling.
extensibility-webhooks-push
Automation rules push a 'Send Webhook Notification' POST on model triggers, usable for pos.order lifecycle, but there is no packaged order-event webhook product. https://www.odoo.com/documentation/19.0/applications/studio/automated_actions.html · retrieved 2026-08-01
Webhooks are cryptographically signed (e.g. HMAC) AND documented to retry with backoff, with a replayable event log for missed deliveries. differentiator
extensibility-webhook-reliability
OVERTURNED from unknown/F. The standing row said the deciding document was missing from disk; both Studio webhook pages are now in the 696-document corpus and I read them in full. DIRECTION first, because the harm the rubric names - an unsigned, un-retried webhook silently dropping orders during a partner outage - is about Odoo PUSHING to a partner: the outbound feature is the 'Send Webhook Notification' server action, and THIS page is its reference. It enumerates the action's entire configuration and it is three items: "This action is used to send a POST API request with the values of the selected Fields to the webhook URL specified in the URL field. The Sample Payload provides a preview of the data included in the request". No signing secret, no HMAC, no retry policy, no backoff, no delivery log, no replay - the rubric needs all three and the enumerating document offers none. Vocabulary-complete absence control over Odoo's own nouns at 696 documents: backoff|back-off = 0, redeliver|re-deliver|replay = 1 and it is AI voice transcription, retr(y|ies|ied) = 5 and none is a webhook (deploy.html, email FAQ, email_marketing, amazon_connector, and a Python stack trace on external_api.html), and webhook = 0 on external_api.html itself. The contrast is the tell: the INBOUND page, webhooks.html, is a different document and I report rather than quote it - it does describe a Rotate Secret URL-secret and an optional Log Calls history reachable from a Logs smart button, so Odoo knows how to write these controls and writes them only for the direction that is not scored here. That is a URL-bearer secret and an inbound request log, not an outbound HMAC signature, a retry policy or a replay facility. DOC-TREE THREE-STATE PROBE, run this session at the coordinator's direction, four plausible paths, all returning the 146-byte / 33-char nginx NEVER-EXISTED control rather than the 132-byte retired meta-refresh stub: studio/automated_actions/webhooks/security.html, studio/automated_actions/webhooks/retries.html, studio/automated_actions/send_webhook.html and developer/reference/external_api/webhooks.html. So the webhook book is exactly the two pages on disk and no reliability page was ever published and retired. EDITION: base_automation IS in the 638 Community modules, so the automation-rule engine and this action ship in Community; only the Studio UI for creating them is Enterprise (web_studio is absent from the 638). Either way the answer is identical, so no edition split rescues the cell. FALSIFIER: a signing-header or retry-policy passage anywhere in the Studio or developer books. CENSUS BOUND, and I closed the developer-book hole the coordinator flagged rather than assuming it away. applications/studio is 8 of 8 census pages present, so the webhook book itself is complete. Of the 33 missing developer/reference docnames only two could bear on this cell - external_rpc_api and extract_api - and I fetched both live: external_rpc_api (200, 33,672 characters) mentions webhook, HMAC, signature, retry, backoff, replay and idempotency ZERO times; extract_api (200, 11,912 characters) exposes a THIRD outbound webhook surface and it has none of the controls either, describing only an empty POST request sent to the caller-supplied webhook_url plus the document token when the result is ready (reported, not quoted to this url, since extract_api is a different document), with hmac, signature, retry, backoff and replay all zero on that page. The remaining 31 missing developer/reference pages are the CLI, the upgrade scripts and view-architecture attribute stubs. So all three of Odoo's outbound webhook surfaces are now enumerated and none is signed, retried or replayable. https://www.odoo.com/documentation/19.0/applications/studio/automated_actions.html · retrieved 2026-09-05 adversarially verified
A public write API accepts externally originated orders into the POS as first-class tickets that fire to KDS/printers and land in reporting.
extensibility-order-injection-api
pos.order is writable through the ORM API, but Odoo does not document externally created orders firing to KDS and printers as first-class tickets. https://www.odoo.com/documentation/19.0/developer/reference/external_api.html · retrieved 2026-08-01
The vendor is a named DoorDash Preferred Integration Partner (DPIP) under the 2026 program requirements. differentiator
extensibility-doordash-preferred
DoorDash publishes its own complete provider registry at https://merchants.doordash.com/api/partner-integrations — 64 providers, each carrying a `qualityStatus` of PREFERRED (12), CERTIFIED (47) or AT_RISK_OF_SUSPENSION (5), plus a count of how many of the eight high-quality features the provider has built. It is served anonymously and merchants.doordash.com/robots.txt permits it (Allow: / with only /cdn-cgi/ and /monitoring barred). This is what the program page means when it says the roster is tracked in real time, and it is a CENSUS rather than a floor: every provider integrated with DoorDash appears in it with a tier, so a vendor that is absent altogether is not in the programme at any tier. This vendor appears nowhere in the 64 entries, under any provider id or friendly name — checked mechanically against both fields, with the only near-misses being substring coincidences (Speedline against Lightspeed, vroom_restaurant against Restaurant365) that were read and rejected. SUPERSEDES the 2026 announcement post most of this corpus cited: that post introduces its ten names with the word `include`, which makes it a floor and never a ceiling, and reading it as a ceiling is what produced this cell's prior grade. GRADE HARMONISED TO B, 2026-09-11: this URL was first written at grade A. The adversarial pass ruled E on the principle that the rubric grades by the publisher's relationship to the SCORED vendor, and DoorDash is not that vendor. B is the settlement, for two reasons that are not preference: 39 rows already graded a DoorDash-published document B on this claim before today, and one URL on one claim cannot carry two grades; and E is unworkable, because nine of the 47 rows are `yes` on a differentiator-weight claim, which the grade floor refuses below B. B reads as the product documentation of the programme's own publisher, which is what this registry is. The dissent is recorded in verification.jsonl. https://merchants.doordash.com/api/partner-integrations · retrieved 2026-09-11
Direct, first-party certified integrations exist with DoorDash, Uber Eats, and Grubhub without requiring a paid middleware layer (Otter/Chowly/Deliverect/Checkmate). differentiator
extensibility-first-party-delivery-integrations
'A valid UrbanPiper subscription is mandatory' and Odoo Community does not support the integration — marketplace access is middleware-mediated and paid. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html · retrieved 2026-08-01
The POS is a supported endpoint for at least two major aggregation middleware platforms (Deliverect, Chowly, Otter, Checkmate, ItsaCheckmate).
extensibility-middleware-compatibility
UrbanPiper is a documented first-class connector covering 25+ marketplaces. Support by Deliverect, Chowly, Otter or Checkmate was not verified. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html · retrieved 2026-08-01
Native, vendor-maintained connectors exist for QuickBooks Online and at least one other GL/accounting system, with mapped journal entries rather than CSV-only export.
extensibility-accounting-connectors
Odoo Accounting is the native GL with mapped journal entries from POS sessions, so no connector is needed — but no QuickBooks Online or Xero connector ships. https://www.odoo.com/pricing · retrieved 2026-08-01
Labor hours export natively to at least two named payroll providers (e.g. Gusto, ADP, Paychex, Paylocity) without manual re-keying.
extensibility-payroll-export
Odoo Payroll is positioned as the system of record; no native export or direct integration with two named third-party payroll providers is documented. https://www.odoo.com/documentation/19.0/applications/hr/payroll.html · retrieved 2026-08-01
The vendor operates a public integrations marketplace listing named third-party apps that operators can browse and self-install.
extensibility-app-marketplace
apps.odoo.com is a public, browsable third-party module marketplace with self-install, referenced directly from Odoo's own support forum and docs. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale.html · retrieved 2026-08-01
The vendor supports a headless/embedded mode where a third-party UI (kiosk, web ordering, drive-thru) drives the POS transaction engine via API.
extensibility-headless-embedded
UPHELD with one method name corrected. pos_self_order is one of the 638 COMMUNITY modules, so this is not an Enterprise-gated cell. The controller genuinely lets a non-Odoo client drive the transaction engine: the process-order route at line 10 is declared "auth=\"public\", type=\"jsonrpc\", website=True" and creates the order via sync_from_ui, while the kiosk payment route at line 155 calls _payment_request_from_kiosk to drive the terminal. CORRECTION to the standing note: process_order authorises through _verify_authorization(access_token, table_identifier, order); it is the sibling routes (get-order, remove-order, kiosk payment, get-user-data) that call _verify_pos_config. Either way the credential is a pos.config access_token, not a user login, so nothing binds the caller to Odoo's own PWA, and LGPL-3 lets a self-hoster replace the frontend outright. PARTIAL, not yes, because Odoo publishes no headless contract: 'headless' now returns 2 of 696 documents (up from 0) and BOTH are the test framework - backend/testing.html and the HOOT unit-testing page describing headless browsers - so the real doc count for a headless PRODUCT mode is still zero, and no docname in the 1,159-page Sphinx census carries it. These are unversioned private endpoints for Odoo's own kiosk, free to change. FALSIFIER: a published contract for these routes (yes), or a token check binding the caller to Odoo's client (no). CENSUS BOUND: all 44 point_of_sale census pages are present in the corpus, so the headless shortfall is measured against a complete book; the primary instrument is in any case the source controller. https://raw.githubusercontent.com/odoo/odoo/19.0/addons/pos_self_order/controllers/orders.py · retrieved 2026-09-05 adversarially verified
A complete historical data export (orders, customers, menu, payments metadata) is available to the operator on demand, in a documented machine-readable format, at contract end. differentiator
extensibility-data-portability-exit
'Download a ZIP file containing a database backup by clicking Download Backup', self-service from the database manager, and the docs advise downloading one before deleting a database. The dump restores into the same LGPL-3 code the operator may self-host, and per-model CSV/XLS export covers subsets. Caveat: 'If the Download Backup option is disabled, it means the database is too large to be downloaded using the database manager. Contact Odoo Support to request an alternative download solution.' https://www.odoo.com/documentation/19.0/administration/odoo_online.html · retrieved 2026-08-08
Reliability, offline & operations
Order entry, ticket routing, and check printing continue on-terminal when the internet connection is lost.
reliability-offline-order-entry
Vendor claims the POS is 'built to maintain functionality even during temporary network outages'. No documented guarantee for ticket routing or check printing. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale.html · retrieved 2026-08-01
Card payments can be accepted while offline via store-and-forward, not just cash-only fallback. differentiator
reliability-offline-card-auth
Verified verbatim on the terminals page, along with the Force done / Cancel manual overrides. No store-and-forward. payments-offline-store-and-forward and payments-offline-decline-liability are upheld on the same evidence. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01 adversarially verified
The vendor publicly documents who bears the loss when a store-and-forward transaction declines after connectivity returns, and states any per-transaction or cumulative offline cap. differentiator
reliability-offline-decline-liability
No store-and-forward exists, so no decline-liability position or offline cap is published. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01
Multiple terminals continue to share a single check/table state over the local network while the internet is down (LAN-only degraded operation, not per-terminal islands). differentiator
reliability-lan-degraded-multi-terminal
Local Network Access is documented purely as browser-to-printer/IoT device access. No LAN-only shared check state across terminals is documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/pos_lna.html · retrieved 2026-08-01
The vendor documents a local/on-premise transaction engine or edge server (not purely cloud-hosted request/response) for the ordering path. differentiator
reliability-local-transaction-engine
Odoo Online is pure cloud with no edge server, but On-Premise deployment (Custom plan or free Community) puts the whole transaction engine on the operator's LAN. https://www.odoo.com/pricing · retrieved 2026-08-01
Kitchen display and/or kitchen printer routing continues to function while offline.
reliability-offline-kds-printing
LNA lets the browser talk directly to an ePOS printer on the LAN, so kitchen printing may survive an internet outage. The preparation display is server-served. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/pos_lna.html · retrieved 2026-08-01
The system automatically fails over to a backup printer or KDS station when a configured kitchen printer is unreachable, and alerts staff.
reliability-printer-fallback
Printer configuration binds categories to a single printer with no backup printer or KDS failover and no staff alert on unreachable printers. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html · retrieved 2026-08-01
The vendor documents its conflict-resolution behavior for edits made on two devices during a network partition (e.g. last-write-wins, merge, or operator prompt).
reliability-sync-conflict-handling
UPHELD against the brief's invitation to cut it to no. Every quoted string verified at the line: sync_from_ui's docstring at line 1269 reads "If an order already exists with a status different from 'draft' it will be discarded, otherwise it will be saved to the database. If saved with 'draft' status the order can be overwritten later by this function" - last-write-wins on drafts, first-write-wins once paid; identity is a client uuid guarded at line 388 by _unique_uuid with the message "An order with this uuid already exists"; and _ensure_to_keep_last_preparation_change (line 396) keeps the newer serverDate and logs "Preparation changes were outdated, probably linked to a synching issue." (line 412). Module point_of_sale, one of the 638 COMMUNITY modules, identical in Enterprise. I decline to read the rubric's 'documents' as operator-facing-only: for an LGPL-3 product the published source IS the vendor's publication, and the peer group already scores this shape at partial on published-source evidence - thanx (partial, grade A, an API-doc delivery rule) and urbanpiper (partial, grade A, a webhook circuit-breaker rule) - while the peers scored no are those with NO rule at all (opensourcepos, sambapos, ury). PARTIAL not yes stands on the real shortfall: no 19.0 documentation page describes partition behaviour, and the code never addresses two devices editing one split check during a partition. FALSIFIER: a 19.0 page describing partition/merge behaviour. CENSUS BOUND: all 44 point_of_sale census pages are present in the corpus, so the finding that no operator-facing page documents partition behaviour is bounded by a complete book rather than by the 42% corpus. https://raw.githubusercontent.com/odoo/odoo/19.0/addons/point_of_sale/models/pos_order.py · retrieved 2026-09-05 adversarially verified
The vendor publishes an explicit list of which features are unavailable offline (gift cards, loyalty lookup, refunds, manual card entry, text-to-pay).
reliability-offline-feature-matrix
No published list of features unavailable offline. A long-standing community question about how offline mode works remains the operator's only reference. https://www.odoo.com/forum/help-1/how-is-the-point-of-sale-offline-mode-working-218314 · retrieved 2026-08-01
A public, per-component status page exists showing current and historical incident state without a login.
reliability-public-status-page
status.odoo.com exists with per-component sections and a 90-day uptime figure, but the fetched page contained unrendered template tags and Lorem Ipsum incidents. https://status.odoo.com/ · retrieved 2026-08-01
24/7/365 live human support by phone is included in the base subscription, not sold as a premium support tier.
reliability-247-live-support
Verified verbatim: 'unlimited access to our support by email ... 24/5, in English, French, Spanish or Dutch.' Monday to Friday only. https://www.odoo.com/pricing · retrieved 2026-08-01 adversarially verified
The vendor offers in-person on-site installation and go-live support (first-party or certified dealer network), not remote-only self-install. differentiator
reliability-onsite-install
Implementation runs through Success Packs or Odoo Partners; the ESA contemplates working with an Odoo Partner. First-party on-site go-live is not offered as a product. https://www.odoo.com/pricing · retrieved 2026-08-01
A hardware replacement/advance-exchange program with a stated turnaround time is included or purchasable.
reliability-hardware-replacement-sla
Odoo supplies no restaurant hardware, so there is no replacement or advance-exchange program. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
The vendor publishes a current PCI DSS v4.0/4.0.1 Attestation of Compliance or equivalent (e.g. validated P2PE listing) covering the post-March-2025 future-dated requirements.
reliability-pci-dss-4-attestation
UPHELD, and the audit brief's own accusation against this row is WRONG - the addendum is right that it is stale. The row never quotes the CSA STAR string to this url; it names www.odoo.com/security as a different document and deliberately leaves the string unquoted, which is correct practice, and the quote checker returns 0 MISATTRIBUTED. Verified verbatim on THIS page: 'PCI DSS and Attestation of Compliance Odoo is not PCI DSS-certified because it does not store cardholder data or process payments. Instead, it outsources tokenization and payment to external payment providers'. That is an explicit vendor denial, the strongest form a no can take, and it is exactly the proposition the cell scores - Odoo SA's OWN attestation, not the merchant's Adyen/Stripe/Worldline terminal. I read www.odoo.com/security in full myself (200, 16,413 chars): it offers only CSA STAR Level 1 participation in the CSA Security Trust Assurance and Risk Program plus the CAIQv3.1 questionnaire - a self-assessment, not a third-party attestation - and on that page SOC = 0, ISO 27 = 0, and its only PCI reference is to Odoo's PCI-compliant payment acquirers, i.e. someone else's compliance. I leave all of those unquoted deliberately, because they live in a document other than this row's url. At 696 documents 'P2PE' = 0 and 'PCI DSS' matches 1 document, this one. Doc-tree probe: /documentation/19.0/administration/security.html returns the 146-byte never-existed control, so no compliance page was ever retired either. EDITION-INDEPENDENT: Community is LGPL-3 software the operator hosts, so Odoo SA operates no cardholder data environment to attest; Enterprise/Cloud customers get the security page and nothing more. FALSIFIER: an Odoo-published AoC or a PCI SSC validated-P2PE listing naming Odoo SA. CENSUS BOUND: applications/finance/payment_providers is 25 of 25 census pages present, and no PCI, compliance or security page exists anywhere among the 1,159 census docnames, so the absence of a published attestation is census-bounded and not an artefact of the corpus holding only 42% of the documentation. https://www.odoo.com/documentation/19.0/applications/finance/payment_providers.html · retrieved 2026-09-05 adversarially verified
Multi-factor authentication is enforceable on back-office and POS administrative logins, with role-based permissions.
reliability-mfa-role-based-access
Backend uses Odoo user accounts with granular access groups and available two-factor auth; POS itself is limited to PIN/badge across three fixed rights tiers. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/employee_login.html · retrieved 2026-08-01
A public, free training library (video/LMS) and a practice/training mode on the terminal exist for staff onboarding.
reliability-self-serve-training
Free public documentation and video tutorials (including POS-specific ones referenced throughout the docs). No POS terminal training/practice mode documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale.html · retrieved 2026-08-01
Any terminal can assume the master/server role automatically if the designated primary terminal or local server fails. differentiator
reliability-failover-terminal-role
Terminals are browser clients of a central server; no master/primary terminal role exists to fail over. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/pos_lna.html · retrieved 2026-08-01
Terminals support an automatic cellular/LTE failover for connectivity, first-party or documented.
reliability-cellular-backup
Network guidance covers Wi-Fi and Ethernet for printers and devices; no cellular/LTE failover is documented. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
Commercial, compliance & data ownership
Vendor publicly offers a month-to-month subscription with no minimum multi-year term commitment for its core POS software tier. differentiator
commercial-month-to-month-contract
Score stays partial, but the note is factually wrong and must be corrected before it is quoted anywhere. $31.10 and $61.00 are the REGULAR ANNUAL rates. The published monthly rates are $48.90 (Standard) and $95.25 (Custom) regular, $38.90 and $76.20 promotional. The ESA term-and-30-day-notice reading is verified. https://www.odoo.com/pricing · retrieved 2026-08-01 adversarially verified
Vendor's published terms of service or MSA state no early termination fee / no liquidated damages for cancelling the software subscription before term end. differentiator
commercial-no-early-termination-fee
UPHELD after checking the precedent the brief pointed at. That precedent - the standing verified row on commercial-rate-increase-clause, which endorses leaving the ETF cell unknown - was written when the ETF cell was grade F and before anyone had read the ESA and the General Terms of Sale to the end; this row is a genuine F->B evidence upgrade and reverting it would replace better evidence with worse. My own absence control over the legal set at 696 documents, searching the terms early termination, termination fee, liquidated damages and cancellation fee: the pattern matches ONE document in the entire corpus and it is a Belgian payroll page - zero in the ESA, the General Terms of Sale and the Partnership Agreement. EDITION SPLIT is the whole answer. COMMUNITY self-host is LGPL-3 (pos_restaurant/__manifest__.py, 'license': 'LGPL-3'), no subscription and no counterparty, so no exit fee is possible - the same construction on which the open-source peers opensourcepos, tastyigniter and ury score yes. ENTERPRISE fails the rubric's affirmative test: the ESA (Version 12) nowhere STATES a no-ETF position and grants no mid-term cancellation right, the only exit being 'a written notice of termination minimum 30 days before the end of the Term', so the remaining Term's fees are the real exit cost. Every monetary penalty in the ESA is triggered by something other than cancelling - '300% of the applicable list price for the actual number of Users' for using Enterprise Edition after termination (verified verbatim), a EUR 30 000 non-solicitation sum, and 25% for running a non-Covered Version. FALSIFIER: an order form or Cloud-specific term naming a cancellation charge. CENSUS BOUND, run this session after the coordinator flagged 27 unread legal/terms pages: of the 28 legal docnames absent from the corpus, exactly THREE are English non-LaTeX documents (legal/coc, the legal/terms index, and legal/terms/odoo_sh_terms) and I fetched and read all three live; the other 25 are 22 i18n translations and 4 _tex renderings of the same three agreements already in the corpus. The legal/terms index is itself the publisher's enumeration of its terms and names exactly four: the Odoo.sh Beta Program, the Enterprise Subscription Agreement, the Partnership Agreement and the General Terms of Sale. All four have now been read. odoo_sh_terms is a 2017 Version 1 AS-IS beta disclaimer under which the customer assumes all risk of loss of information or data; it adds no fee, window or ownership clause. So the legal set is closed and this cell's zeros are census-bounded, not corpus-bounded. https://www.odoo.com/documentation/19.0/legal/terms/enterprise.html · retrieved 2026-09-05 adversarially verified
The auto-renewal term and the required cancellation notice window (e.g. 30/60/90 days) are stated in publicly accessible contract terms rather than only in a signed quote.
commercial-autorenew-terms-published
ESA §1: auto-renews for an equal Term unless either party gives written notice of termination at least 30 days before the end of the Term. Publicly readable. https://www.odoo.com/documentation/19.0/legal/terms/enterprise.html · retrieved 2026-08-01
The POS software can be purchased and operated with a third-party payment processor of the operator's choice (no mandatory in-house processing lock). differentiator
commercial-processing-not-bundled
Odoo is not an acquirer and documents 13 independent terminal providers; the merchant contracts payments entirely outside Odoo. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01
Vendor publishes an interchange-plus (cost-plus) processing rate option with the markup stated as a specific bps + per-transaction figure, rather than only blended/flat card-present rates. differentiator
commercial-interchange-plus-published
Odoo publishes no processing rates of any structure because it does not provide processing. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html · retrieved 2026-08-01
The processing agreement caps or prohibits unilateral vendor-initiated rate increases outside of pass-through interchange/network changes, or grants penalty-free exit on any increase. differentiator
commercial-rate-increase-clause
Verified, as are the 30-day auto-renewal notice (commercial-autorenew-terms-published, yes) and the 300%-of-list-price post-termination breach fee. The dossier is right that 300% is a breach penalty and not an ETF, and right to leave the ETF cell unknown. https://www.odoo.com/documentation/19.0/legal/terms/enterprise.html · retrieved 2026-08-01 adversarially verified
Per-location and per-additional-terminal software pricing is published as specific dollar figures on the vendor's public site (not 'contact sales' only).
commercial-pricing-published
Exact dollars are published, but the unit is per user per month, not per location or per terminal — terminal count is not a pricing dimension in Odoo. https://www.odoo.com/pricing · retrieved 2026-08-01
Individual modules (online ordering, KDS, loyalty, inventory, payroll, marketing) can be purchased à la carte and cancelled independently without repricing the base POS subscription. differentiator
commercial-module-unbundling
One App Free is a single app at $0; Standard and Custom are all-apps flat per user. No à la carte purchase or cancellation of individual modules. https://www.odoo.com/pricing · retrieved 2026-08-01
All required terminals, KDS screens, and printers can be purchased outright at a published price, with no mandatory multi-year hardware lease or rental.
commercial-hardware-purchase-outright
All hardware is third-party and bought outright with no Odoo lease, but Odoo publishes no prices for terminals, KDS screens or printers. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
Vendor documents support for at least one non-proprietary/third-party hardware option (e.g. standard iPad, Epson/Star ESC/POS printers, generic cash drawer) rather than requiring vendor-only devices. differentiator
commercial-hardware-not-locked
Documented non-proprietary options: any Chromium browser device, Epson ePOS network printers, any ESC/POS printer via IoT, and third-party iMin Android units. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html · retrieved 2026-08-01
Operators can self-serve export their full transactional history (orders, line items, payments, labor) to CSV or a documented API without contacting support or paying a fee.
commercial-data-export-self-serve
Any list view - POS orders, order lines, payments, employees, attendances - exports via Action > Export to CSV or XLS, with field selection and saved presets; 'the values can be exported from any field in any record'. No ticket, no fee. The Cloud SLA adds a full database backup 'at any time', and the JSON-2 external API is documented for programmatic pulls. https://www.odoo.com/documentation/19.0/applications/essentials/export_import_data.html · retrieved 2026-08-08
Guest/customer records, loyalty balances or point ledgers, and gift-card liability balances are exportable in machine-readable form by the operator. differentiator
commercial-export-customer-and-loyalty
'Generated gift cards can be accessed through the Gift Cards smart button' (and eWallets likewise), each issued card a record with Expiration Date, Partner and Balance. Loyalty cards appear the same way from the program form and via a Loyalty Cards smart button on the contact. Being ordinary models, they fall under Action > Export to CSV/XLS - 'the values can be exported from any field in any record' - and under the full database backup. https://www.odoo.com/documentation/19.0/applications/sales/sales/products_prices/ewallets_giftcards.html · retrieved 2026-08-08
Contract or documentation specifies a post-termination data retrieval window (a defined number of days during which the operator can still export their data) rather than immediate cutoff. differentiator
commercial-post-termination-export-window
OVERTURNED AND RE-HOMED, and the brief's challenge to this row is answered by a clause nobody had quoted. The brief asked whether the Privacy Policy's three-week deactivation period earns partial when it is framed as retention for reactivation rather than retrieval. It does not have to: ESA 6.5 Data Protection (h) binds Odoo SA to "permanently delete all copies of the Customer’s database in possession of Odoo SA, or return such data, at the Customer’s choice, upon termination of this Agreement, subject to the delays specified in Odoo SA’s Privacy Policy". That is a contractual RETRIEVAL right at the customer's election, and it incorporates by reference the very window the standing row cited: www.odoo.com/privacy states, in a different document that I therefore report rather than quote to this url, that a cancelled Odoo Cloud database is kept deactivated for three weeks as a grace period during which the customer can change their mind, and is then destroyed. Retrieval right plus a defined number of days, both published, is the rubric satisfied. Corroborating but weaker, and again a different document: www.odoo.com/security says manual backups of live data can be downloaded at any time from the control panel. EDITION: the ESA and the Privacy Policy bind ENTERPRISE / Odoo Cloud customers only; a COMMUNITY self-hoster is under LGPL-3 with no counterparty and already holds the database and its filesystem, so the cell is vacuous in their favour - the same construction on which opensourcepos scores yes. FALSIFIER: an ESA amendment or Cloud term stating that a deactivated database cannot be exported or returned. CENSUS BOUND, run this session after the coordinator flagged 27 unread legal/terms pages: of the 28 legal docnames absent from the corpus, exactly THREE are English non-LaTeX documents (legal/coc, the legal/terms index, and legal/terms/odoo_sh_terms) and I fetched and read all three live; the other 25 are 22 i18n translations and 4 _tex renderings of the same three agreements already in the corpus. The legal/terms index is itself the publisher's enumeration of its terms and names exactly four: the Odoo.sh Beta Program, the Enterprise Subscription Agreement, the Partnership Agreement and the General Terms of Sale. All four have now been read. odoo_sh_terms is a 2017 Version 1 AS-IS beta disclaimer under which the customer assumes all risk of loss of information or data; it adds no fee, window or ownership clause. So the legal set is closed and this cell's zeros are census-bounded, not corpus-bounded. The Odoo.sh beta terms cut mildly against the operator on that platform, since the customer there assumes the risk of data loss, but they neither create nor remove a retrieval window and the ESA governs the Enterprise subscription this cell is scored on. https://www.odoo.com/documentation/19.0/legal/terms/enterprise.html · retrieved 2026-09-05 adversarially verified
Published terms explicitly state the merchant owns its transaction and customer data, and constrain the vendor's right to use or resell that data (beyond aggregated/de-identified use) for its own products or marketing. differentiator
commercial-data-ownership-clause
UPHELD, and the brief's worry that the ownership sentences sit only in a Privacy Policy rather than an agreement is met by the ESA. All three quotes re-verified as single-document hits at 696 documents: on ownership, 'any information or content you submit or upload into your database is your own, and you control it fully' and 'you always retain ownership and full control on this data'; on vendor use, the Third Party Disclosure section's 'We do not sell or trade your data.' The agreement side is stronger than the standing note said: ESA 6.5, in legal/terms/enterprise.html and therefore reported rather than quoted to this url, makes the Customer the Controller of the Personal Data in its database, binds Odoo SA at (a) to process that data only when and as instructed by the Customer and only to perform a Service under the Agreement, and at (h) requires delete-or-return on termination. The only vendor use the ESA reserves is instance telemetry, expressly limited there to the running of an instance, the number of Users, the installed Apps and the number of lines of code of Covered Extra Modules - not transaction or customer data. EDITION: the Privacy Policy and ESA govern ENTERPRISE / Odoo Cloud; for a COMMUNITY LGPL-3 self-host Odoo SA never receives the data, so the constraint is moot in the operator's favour - the same construction on which opensourcepos scores yes. The residual weakness stays on the record: the no-sell sentence is a policy statement, not a warranty of title, and it is unqualified rather than carved out for aggregated use. FALSIFIER: an ESA or order-form clause licensing Odoo to use customer database content for its own products. CENSUS BOUND, run this session after the coordinator flagged 27 unread legal/terms pages: of the 28 legal docnames absent from the corpus, exactly THREE are English non-LaTeX documents (legal/coc, the legal/terms index, and legal/terms/odoo_sh_terms) and I fetched and read all three live; the other 25 are 22 i18n translations and 4 _tex renderings of the same three agreements already in the corpus. The legal/terms index is itself the publisher's enumeration of its terms and names exactly four: the Odoo.sh Beta Program, the Enterprise Subscription Agreement, the Partnership Agreement and the General Terms of Sale. All four have now been read. odoo_sh_terms is a 2017 Version 1 AS-IS beta disclaimer under which the customer assumes all risk of loss of information or data; it adds no fee, window or ownership clause. So the legal set is closed and this cell's zeros are census-bounded, not corpus-bounded. odoo_sh_terms contains no licence for Odoo to use customer content, so reading it does not disturb the constraint half of this cell. https://www.odoo.com/privacy · retrieved 2026-09-05 adversarially verified
Vendor documents validated P2PE or hardware-encrypted card entry plus tokenization such that the merchant's PCI scope is reduced to SAQ A / SAQ P2PE-HW, and names the applicable SAQ.
commercial-pci-p2pe-tokenization
UPHELD. Quotes verified verbatim on this page, given as contiguous fragments rather than joined with an ellipsis: "you only need to complete the minimal Self-Assessment Questionnaire (SAQ) with the provider to obtain the Attestation of Compliance (AoC) and achieve PCI compliance", and "Odoo should not be mentioned as a payment processor or a third-party service provider in the SAQ". The premise is stated on the same page as "it outsources tokenization and payment to external payment providers". Two of the rubric's three elements fail and one is met, which is what partial means: tokenization IS documented and enumerated (the Supported payment providers table carries a Tokenization column, and the page states "a payment token is created in Odoo to be used as a payment method for subsequent payments", the underlying card data being held by the provider), a scope reduction IS asserted, but 'minimal' is not a named SAQ type - no SAQ A, SAQ A-EP or SAQ P2PE-HW designation appears anywhere in the 696 documents, and a search for P2PE and point-to-point encryption returns 0, so no validated P2PE solution is claimed. Caveat kept from the standing note and re-confirmed: this page is scoped to ONLINE payment providers for the portal and eCommerce, not to card-present POS entry, which happens on the third-party terminal. EDITION-INDEPENDENT: the position turns on the acquirer, not on Community versus Enterprise, and point_of_sale plus the pos_* terminal modules are all in the 638 Community list. FALSIFIER: a page naming the applicable SAQ type, or a PCI SSC P2PE listing covering a terminal deployment Odoo documents. Peer distribution agrees this shape is partial (0 yes, 29 partial of 46). CENSUS BOUND: applications/finance/payment_providers is 25 of 25 census pages present in the corpus, so this zero is bounded by a complete book and not by the 153 missing applications/finance pages, none of which matches pci, secur, complian or card except an expense-cards page. CENSUS BOUND, run this session after the coordinator flagged 27 unread legal/terms pages: of the 28 legal docnames absent from the corpus, exactly THREE are English non-LaTeX documents (legal/coc, the legal/terms index, and legal/terms/odoo_sh_terms) and I fetched and read all three live; the other 25 are 22 i18n translations and 4 _tex renderings of the same three agreements already in the corpus. The legal/terms index is itself the publisher's enumeration of its terms and names exactly four: the Odoo.sh Beta Program, the Enterprise Subscription Agreement, the Partnership Agreement and the General Terms of Sale. All four have now been read. odoo_sh_terms is a 2017 Version 1 AS-IS beta disclaimer under which the customer assumes all risk of loss of information or data; it adds no fee, window or ownership clause. So the legal set is closed and this cell's zeros are census-bounded, not corpus-bounded. https://www.odoo.com/documentation/19.0/applications/finance/payment_providers.html · retrieved 2026-09-05 adversarially verified
Vendor documents PCI DSS v4.0.1 future-dated controls in effect since 31 Mar 2025 — notably MFA for all access to the cardholder data environment including POS and back-office logins, and (for hosted ordering pages) payment-page script integrity monitoring per Req 6.4.3/11.6.1.
commercial-pci-dss-4-controls
UPHELD with the counts re-run at 696 documents and one of them corrected downward. The vendor disclaims the premise in terms: 'Odoo is not PCI DSS-certified because it does not store cardholder data or process payments' - verified verbatim here - so there is no cardholder data environment for Odoo to state 4.0.1 controls over, and this is a denial rather than a silence. Absence controls at 696: a search for PCI DSS matches ONE document, this page (the standing note said two, which was wrong); SAQ likewise one; requirement 6.4.3, 11.6.1 and payment-page script integrity return nothing; and the multi-factor/2FA hits are the generic users, 2fa and access-rights pages describing optional backend two-factor authentication with no CDE scoping and no coverage of POS logins, which authenticate by PIN or badge in pos_hr. Doc-tree three-state probe adds a control the standing note lacked: /documentation/19.0/administration/security.html returns the 146-byte / 33-char NEVER-EXISTED nginx body, so no compliance or security page was published and later retired; and www.odoo.com/security, which is live, carries CSA STAR and CAIQv3.1 only, with SOC and ISO 27 both returning zero on that page. EDITION-INDEPENDENT: a COMMUNITY LGPL-3 self-hoster owns the whole environment and receives no control statement, and an ENTERPRISE/Cloud customer gets the same security page. FALSIFIER: an Odoo compliance page enumerating the future-dated 4.0.1 controls. CENSUS BOUND: applications/finance/payment_providers is 25 of 25 census pages present, so the zero is bounded by a complete book; of the 153 missing applications/finance census pages none matches pci, secur, complian, card or fraud except applications/finance/expenses/expense_cards, which is an employee expense-card page. No PCI or compliance page exists anywhere among the 1,159 docnames. https://www.odoo.com/documentation/19.0/applications/finance/payment_providers.html · retrieved 2026-09-05 adversarially verified
Product provides in-app tooling for CCPA/CPRA and GDPR data-subject requests — locating, exporting, and deleting an individual guest's records — plus a published DPA the operator can execute.
commercial-privacy-dsar-tooling
A guest record can be located, exported (portal or Action > Export) and deleted by hand, and the subscription agreement includes 'Data Protection Clauses (often referred to as a Data Processing Agreement), as required by the GDPR' with no signature step - customers 'automatically benefit'. But there is no in-app DSAR queue or one-click subject package, and erasure is refused where business documents reference the contact, leaving anonymisation and no deletion propagation. https://www.odoo.com/gdpr · retrieved 2026-08-08
Vendor publishes an accessibility conformance report (VPAT/ACR) claiming WCAG 2.1 AA (or later) for its self-order kiosk and consumer web-ordering surfaces, including a documented tactile/audio non-visual access mode on kiosks. differentiator
commercial-wcag-kiosk-accessibility
UPHELD, with the standing note's control figure withdrawn: it cited the 9,748-character ruler from BRIEF-ODOO.md, the addendum gives 3,363, and the two disagree only because of the stripper, so neither number is citable on its own. What the control establishes is INVARIANCE, and I measured my own in the same run with my own stripper (script and style bodies removed before tags): www.odoo.com/accessibility = 404 at 66,947 bytes, www.odoo.com/vpat = 404 at 66,362 bytes, and the fabricated control www.odoo.com/zzq-fabricated-control-beta = 404 at 67,857 bytes - three different byte lengths because the page echoes the requested path, and all three identical at 3,363 characters of text on my stripper, against 5,866 for a live page (www.odoo.com/cloud-sla). So no accessibility or VPAT page exists. Doc-tree three-state probe agrees: .../point_of_sale/extra/accessibility.html returns the 146-byte / 33-char NEVER-EXISTED control, not the 132-byte retired-stub, so no such page was ever published. VOCABULARY CONTROL IN ODOO'S OWN NOUNS, widened at the coordinator's direction because a zero on WCAG/VPAT alone would only prove the word absent. At 696 documents with nav stripped: WCAG, VPAT and accessibility conformance = 0; a11y = 0; screen reader = 0; aria- and role="button" = 0; high contrast and colour contrast = 0; Section 508, EN 301 and ADA compliance = 0; assistive, braille, tactile, audio jack and headphone = 0. The only near-misses are a single keyboard-navigation hit on developer/reference/frontend/owl_components.html, which is framework guidance and not a kiosk mode, and six text-size/font-size/zoom hits (HTML editor, email templates, the KDS preparation display's font size, the PDF quote builder, an ecommerce product page and a backend performance page), none of them a non-visual access affordance. No docname in the 1,159-page Sphinx census carries wcag, vpat or accessib. The zero is now vocabulary-complete rather than a wording artefact. The cited page is the enumerating one: it says 'Select Kiosk to let customers browse the menu or product catalog, place orders, and pay directly at a self-ordering kiosk' and then lists the kiosk's complete configuration set - Home buttons, Service location and payment options, Launch on IoT Box, Language, Splash screens, Background - with no non-visual access mode, no audio output, no tactile input and no screen-reader affordance. EDITION: pos_self_order is one of the 638 COMMUNITY modules, so Community and Enterprise ship the same unaudited kiosk and there is no edition split. Kept from the standing note because it is right: the absence of a published report is not proof the UI fails WCAG - but the cell scores publication, and publication is a measured zero. Peer distribution: 0 of 44 records score this yes. CENSUS BOUND, which is the answer to the corpus-hole objection: all 44 point_of_sale census pages are present in the corpus, so the kiosk enumeration is complete, and searching the whole 1,159-name census for access, a11y, wcag, vpat or disab returns only three pages and all three are access RIGHTS - general/users/access_rights, general/users/user_portals/portal_access and developer/tutorials/restrict_data_access - i.e. permissions, not accessibility. There is no accessibility book in Odoo's own build manifest to be missing from the corpus. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html · retrieved 2026-09-05 adversarially verified
POS supports card-network-compliant dual pricing / cash discount or surcharging with automatic exclusion of debit and prepaid cards from any surcharge, and required receipt and menu-board disclosure of the fee. differentiator
commercial-dual-pricing-compliant
Pricing features cover discounts, pricelists, cash rounding and fiscal positions only. No cash-discount, surcharge, or debit-exclusion engine exists. https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html · retrieved 2026-08-01
Adversarial verification
An independent pass was instructed to refute this record, defaulting to downgrade when uncertain. It challenged 81 values — 63 upheld, 16 downgraded, 2 upgraded. It separately resolved 42 previously unknown values. This is published in full because a reader who can see which values were contested, on what evidence, and which way they moved has something no affiliate-funded comparison offers.
Pricing and identity
| Field | Verdict | What the verifier found |
|---|---|---|
| pricing.software | downgrade-to-partial | Two defects. (1) The four figures quoted are the ANNUAL-billing prices only. The pricing page also publishes monthly-billing rates the dossier never mentions: Standard $38.90 promo / $48.90 regular, Custom $76.20 promo / $95.25 regular. A month-to-month restaurant on Custom pays $95.25/user/mo, not $61.00 — a ~56% understatement of the no-commitment price. (2) The 'restaurant POS is free forever' economics is claim-level, sourced to a product marketing page, and is actively undercut by product documentation: the preparation-display page states 'The Kitchen Display app is automatically installed whenever a restaurant point of sale is created.' Kitchen Display is a distinct Odoo app; One App Free covers one app. I could not find any Odoo statement confirming a restaurant POS with its auto-installed Kitchen Display still qualifies for the $0 tier, so the headline free-tier claim is unverified, not established. source |
Capability claims
| Claim | As first scored | Verdict | What the verifier found |
|---|---|---|---|
| commercial-month-to-month-contract | partial — 'Monthly rates are published ($31.10 and $61.00/user/month) alongside discounted annual' | upheld | Score stays partial, but the note is factually wrong and must be corrected before it is quoted anywhere. $31.10 and $61.00 are the REGULAR ANNUAL rates. The published monthly rates are $48.90 (Standard) and $95.25 (Custom) regular, $38.90 and $76.20 promotional. The ESA term-and-30-day-notice reading is verified. source |
| hardware-kds | yes — first-party preparation display / Kitchen Display app | downgrade-to-partial | It is genuinely first-party and the routing/stages/alert-timer/Recall features are all verbatim in the docs — but it is Enterprise-edition-only (module absent from the public odoo/odoo tree; docs treat it as an Enterprise app), so it is not available to the Community self-host the dossier's whole 'best at' thesis rests on. Also verified: 'IoT boxes are not supported.' source |
| kitchen-station-routing | yes — 'Specify the POS product categories to be sent to this display' | upheld | Verified verbatim, including 'Leave the field empty to allow all categories.' Carry the same Enterprise-edition caveat as hardware-kds. source |
| delivery-3p-injection | yes — UrbanPiper consolidates orders from all connected platforms into the POS | downgrade-to-partial | This is the exact shape of cell the brief says to hold to the highest bar, and it is not native. Verified from the Odoo doc: 'an active Odoo Enterprise subscription is required. Odoo Community does not support' it; Enterprise 18.0+; a valid UrbanPiper subscription; plus registered reseller accounts with each platform. Three separate paid relationships and a middleware hop is a partner integration, not a yes. source |
| hardware-ownership-vs-lease | yes (confidence: inferred) — 'Odoo offers no hardware lease, so ownership is the only model' | downgrade-to-unknown | Scored yes on pure inference with a source (the receipt-printers hardware page) that says nothing about ownership, lease, or rental. Under the no-URL-no-yes rule this cannot stand. Odoo publishes no affirmative statement about hardware commercial models because it does not sell hardware. source |
| inventory-shelf-life-expiry | yes — 'Expiration dates can also be configured for products tracked by lot or serial number' | downgrade-to-partial | I could not re-verify that sentence on the cited POS products page; the rendered page's stock section is a stub linking out to Inventory. Expiry tracking is a real Odoo Inventory feature, but its POS surfacing — the thing the cell is scoring — is not confirmed on the cited source. Same caution applies to inventory-lot-traceability's stronger sub-claim that lots are 'imported automatically onto POS cart lines,' which I also could not verify. source |
| labor-native-scheduling | yes — Odoo Planning is a first-party app in the same database | downgrade-to-partial | True that Planning is first-party, but it is a separate app: unavailable on the $0 One App Free tier the dossier leans on, and it reaches the operator only via the all-apps Standard/Custom per-user subscription. It is also not a restaurant labor scheduler — no demand forecast from POS sales, no break/minor/fair-workweek rules (the dossier correctly scores all three 'no'), which makes an unqualified yes here inconsistent with its own neighbors. source |
| delivery-tracking-page | no — 'No branded order-status or driver-tracking page documented' | downgrade-to-unknown | Sourced to restaurant.html, a page that never discusses delivery tracking at all. This is silence, not an affirmative absence and not an enumerated alternative. Per the ground rules that is 'unknown', not 'no'. Same defect applies to delivery-offline-behavior, which cites the same page. source |
| extensibility-doordash-preferred | no — note lists the 2026 DoorDash Preferred Integration Partner cohort as Checkmate, Chowly, Deliverect, Otter, PAR, Qu, Square, Stream, Toast, UrbanPiper | upheld | The score is right — Odoo reaches DoorDash only through UrbanPiper. But the ten-name DPIP roster is cited to an Odoo documentation page that cannot possibly contain it. That is an uncited assertion wearing a citation, and it should either get a real DoorDash-side source or be struck from the note. source |
| reliability-offline-card-auth | no — 'If a connection issue occurs between Odoo and the payment terminal, the transaction is automatically canceled' | upheld | Verified verbatim on the terminals page, along with the Force done / Cancel manual overrides. No store-and-forward. payments-offline-store-and-forward and payments-offline-decline-liability are upheld on the same evidence. source |
| payments-processor-choice | yes — thirteen documented terminal providers, Odoo is not the acquirer | upheld | All thirteen names verified on the terminals page exactly as listed. Processor neutrality is real and is the dossier's most defensible differentiator. source |
| extensibility-api-access-cost | no — 'Access to data via the external API is only available on Custom Odoo pricing plans' | upheld | Verified verbatim, and it appears consistently across the 15.0 through 19.0 and master docs — this is longstanding policy, not a 19.0 quirk. Note two refinements the dossier missed: /json/2 is flagged 'New in version 19.0', so anyone on 18.0 or earlier has only XML-RPC/JSON-RPC; and a forum thread claims read access works in practice on lower plans, which is not authoritative and should not be scored. source |
| digital-qr-table | yes — free physical QR codes worldwide, all subscription types | upheld | Verified verbatim on the restaurant page: 'To order free physical QR codes adapted to the floor plan, activate the QR menu setting, then click Get QR Codes in the Floor plan view. This offer is available worldwide and for all subscription types.' Rare case of a marketing-sounding claim that is actually in the product docs. source |
| commercial-rate-increase-clause | partial — ESA §5.2 caps renewal increases at up to 7% per year of the previous Term | upheld | Verified, as are the 30-day auto-renewal notice (commercial-autorenew-terms-published, yes) and the 300%-of-list-price post-termination breach fee. The dossier is right that 300% is a breach penalty and not an ETF, and right to leave the ETF cell unknown. source |
| reliability-247-live-support | no — pricing page states support is 24/5 | upheld | Verified verbatim: 'unlimited access to our support by email ... 24/5, in English, French, Spanish or Dutch.' Monday to Friday only. source |
| menu-pricing-fractional-placement | no — product model is attributes/variants plus one-level combos, no halves or sections | upheld | Held to the highest bar as instructed. The products page documents only attributes/variants and combo choices as the composition model — the alternative is affirmatively enumerated, so 'no' is defensible rather than mere silence. The dependent cells (half-and-half rule, kitchen-pizza-fractional-display, modifier-price-by-parent-size, nested modifiers) fall the same way. source |
| labor-native-scheduling | partial, grade B - True that Planning is first-party, but it is a separate app: | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| inventory-cogs-gl-export | partial, grade B - Odoo Accounting is the GL, so COGS and AP post natively rath | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| multi-location-org-hierarchy | partial, grade B - Multi-company (parent/child) plus many POS configs per compa | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| extensibility-accounting-connectors | partial, grade B - Odoo Accounting is the native GL with mapped journal entries | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| reliability-local-transaction-engine | partial, grade B - Odoo Online is pure cloud with no edge server, but On-Premis | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| reliability-247-live-support | no, grade B - Verified verbatim: 'unlimited access to our support by email | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| reliability-onsite-install | partial, grade B - Implementation runs through Success Packs or Odoo Partners; | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| reliability-menu-build-service | partial, grade B - Implementation is a separately purchased Success Pack or par | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| commercial-month-to-month-contract | partial, grade B - Score stays partial, but the note is factually wrong and mus | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| commercial-pricing-published | partial, grade B - Exact dollars are published, but the unit is per user per mo | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| commercial-module-unbundling | partial, grade B - One App Free is a single app at $0; Standard and Custom are | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| guest-loyalty-native-email-sms | yes / B - https://www.odoo.com/pricing - "Odoo ships first-party Email Marketing and SMS Marketing apps in the same database (SMS via IAP c" | upheld | The cited evidence was the pricing page, which is grade C and cannot carry a yes on a differentiator. Retrieved Odoo's documentation host instead: applications/marketing/email_marketing.html and applications/marketing/sms_marketing/create_sms.html both describe the mechanics (composition, Recipients model selection with filter equations, Send/Schedule/Test) rather than restating marketing copy, and create_sms.html states credits must be purchased or SMS will not send. Both channels are first-party apps in the same database, so the yes survives on grade-B documentation. source |
| digital-guest-data-ownership | yes / B - 'Users can download manual backups of their live data at any time'; plus per-model CSV/XLSX ex | upheld | The cited /page/odoo-online-sla 301s to /cloud-sla. I fetched the destination and re-checked the quotation word for word - it is present and unconflated, so the citation moved rather than died. Independently, the export manual documents Action > Export on any list view for any field of any record, and the GDPR page names the customer as controller of a Cloud database. Contact records (res.partner) carry email, phone, opt-out and are ordinary exportable models. Re-pointed to the export documentation. source |
| guest-loyalty-data-export-portability | yes / B - Full live-database backup downloadable at any time, plus list-view CSV/XLSX export on every m | upheld | Checked the moved SLA at its new address (quotation intact) and then went past it to the export manual, which is the stronger evidence: it describes the exact self-serve path (list view -> Action -> Export -> CSV/XLS), states any field of any record can be exported, and mentions no fee, approval or ticket. The only documented limit is a timeout on very large single exports, with batching as the remedy - a performance caveat, not a gate. source |
| guest-loyalty-privacy-rights-tooling | partial / E - Any record can be exported or deleted and Odoo publishes GDPR material, but there is no p | upheld | The cited SLA (now /cloud-sla) covers backups and security only and says nothing about data-subject rights, so the original citation did not support this cell even before it moved. Odoo's GDPR page does: it enumerates per-right handling as manual admin steps and explicitly notes that deleting a contact is refused when documents reference it, with anonymisation as the workaround. That is positive evidence for partial and for the named shortfall. Grade left at E to match this record's convention for docs-backed partials. source |
| reporting-history-retention | partial / E - Data lives in the operator's own Postgres database with no documented truncation or archi | upheld | Withdrew the SLA leg: /cloud-sla documents backup rotation (1/day for 7 days, 1/week for 4 weeks, 1/month for 3+ months), which is a disaster-recovery schedule, not a reporting-history guarantee, and reading it as one would have overstated the cell. Re-read the POS reporting page, which shows session and order history in filterable pivot/graph views and says nothing about retention or truncation, and the Odoo Online page, whose only data-loss language is about deliberate database deletion. Partial survives on the queryable-history half; the missing window is the shortfall. source |
| extensibility-data-portability-exit | yes / B - Complete live-database backup downloadable at any time in a documented restorable format, plu | upheld | Replaced the SLA citation with the database-manager documentation, which names the mechanism, the artifact (a ZIP) and the exit context explicitly. Also found the caveat the first pass missed - very large databases have the button disabled and need a support request - but that is a documented alternative route, not a fee or a refusal, and the CSV/XLS and self-host paths are unaffected. A differentiator yes now rests on grade-B product documentation rather than a legal page. source |
| commercial-data-export-self-serve | yes / B - 'Users can download manual backups of their live data at any time', plus CSV/XLSX export from | upheld | Verified the moved SLA quotation verbatim at /cloud-sla, then confirmed the operative mechanism in the export manual: list view, Action, Export, CSV/XLS, all fields of all records, no fee or support step mentioned. The documented JSON-2 API on the Odoo Online page covers the API half of the claim. Only caveat is batching very large exports against a timeout. source |
| commercial-export-customer-and-loyalty | yes / B - Customers, loyalty cards/point ledgers and gift-card records are ordinary models included in | upheld | The researcher's claim that these are ordinary exportable models was correct but was cited to a hosting SLA that says nothing about loyalty or gift cards. Retrieved the eWallet/gift-card guide, which shows issued cards as records with a Balance field reachable from a smart button, and the loyalty/discount guide, which shows generated cards reachable from the program form and from the contact. Combined with the export manual's any-field-any-record rule, the differentiator yes now rests on grade-B documentation. I did not find a dedicated point-ledger export report; the balance field on the card record is what carries it. source |
| commercial-privacy-dsar-tooling | partial / E - Any guest record can be located, exported and deleted, and Odoo publishes GDPR material, | upheld | The cited SLA covers backups, encryption and recovery objectives only - it never mentioned DSARs or a DPA, so this citation was wrong on the merits before it ever moved. Odoo's GDPR page carries both legs: it describes access, portability, rectification, erasure and opt-out as manual admin actions, states that deletion is blocked when documents still reference the contact, and confirms the agreement embeds GDPR Data Protection Clauses that apply automatically. Partial is correct; the shortfall is the absence of any packaged workflow. source |
| order-capture-drive-thru | unknown / F - No drive-thru order flow documented in the POS docs." | resolve-to-no | The POS landing page enumerates every documented POS area, and the restaurant entry reads 'Restaurant features Features specific to restaurants: manage floors, tables, tips, and online delivery.' - no drive-thru anywhere in that index. With the site nav stripped by q210-ogrep.mjs, the regexes drive.?thru and drive-through return ZERO hits across all 467 corpus documents, including the 44 point_of_sale doc pages and the 172 source files; lane, pull.forward and parking spot yield nothing relevant (the single pos_config.py lane hit is the identifier point_of_sale.pos_category_miscellaneous). I also checked .cache/q210/odoo-docnames.txt: none of the 1,158 pages in the 19.0 Sphinx build manifest is a drive-thru page. EDITION: n-a - no order-point/pay-window separation, lane sequencing or pull-forward exists in either edition, since no such module appears in the 638 Community modules and no doc page describes one. Falsified by any 19.0 page or module implementing lane assignment or window separation. source |
| order-capture-drive-thru-timers | unknown / F - No drive-thru speed-of-service timers documented." | resolve-to-no | This page is the complete POS reporting surface: Orders statistics in 'a graph or pivot view that you can filter or group depending on your needs', plus a session report whose per-order columns it enumerates in full, including 'The Employee that placed this order.' and 'The Total paid amount.' No timer, no segment (order, total, window) and no elapsed-time field appears anywhere in that enumeration, and the phrase speed of service returns zero hits corpus-wide with the nav stripped. Since the drive-thru flow itself does not exist (see order-capture-drive-thru), there is nothing to time. EDITION: n-a - absent in both. The only elapsed-time instrument in the product is the preparation-display per-stage alert timer, which is Enterprise (pos_preparation_display is absent from the 638 Community modules) and is a kitchen stage timer, not a drive-thru window timer. Falsified by a documented per-order timer field or a drive-thru timing report. source |
| order-capture-voice-ai | unknown / F - No first-party voice ordering agent or documented voice-AI partner program found." | resolve-to-no | RE-SCORED against the page I flagged as unreadable; now on disk, it settles the cell against the claim. It is titled 'AI voice transcription' and it is dictation, not ordering: 'Odoo AI can transcribe spoken audio into text and generate summaries from that transcript.', 'This feature supports both meeting recordings and real-time dictation', and 'Voice transcripts can be created in the Description and Notes fields of most records, as well as in Knowledge articles.' The workflow is 'Select Voice Transcript from the drop-down list.' then Start Recording and Stop Recording, yielding a transcript and a summary. There is no caller-facing agent, no drive-thru audio path and no order injection; the sibling AI agents page confirms the standard assistant cannot create records. EDITION, per the rule: no module named ai or matching *_ai appears in the 638 Community modules, so the AI application is Enterprise - moot here, because in neither edition is this order capture. Falsified by a documented voice agent that writes pos.order records. source |
| order-capture-catering | unknown / F - No catering-specific flow with quotes, deposits or balance-due tracking documented in POS." | resolve-to-partial | Every mechanical part of the rubric exists, but as the generic Sales-order flow rather than as a distinct catering flow. Quotes: the register opens 'the list of quotations and sales orders created from the sales application'. Deposits: the settlement popup offers 'Apply a down payment (percentage) or Apply a down payment (fixed amount)'. Balance due: 'Once a sales order is partially settled, the applied down payment is automatically deducted' from the order total. Schedule: 'The Ship Later feature allows you to sell products and schedule delivery at a later date', with a shipping date, Warehouse and route, which is a fulfilment schedule outside the order queue. What is missing is the catering flow itself - the word catering returns ZERO hits across all 467 corpus documents with the nav stripped, and no catering page exists among the 1,158 docnames. EDITION: Community - pos_sale is present in .cache/q210/odoo-addons.txt, and this requires the Sales app installed. Falsified by a documented catering-specific order type or event-schedule view. source |
| order-capture-order-ready-signal | unknown / F - UrbanPiper handles marketplace order lifecycle; no documented KDS-bump order-ready push back to Door | resolve-to-partial | A marketplace order-ready signal does exist and it is driven from POS state rather than from a marketplace tablet: 'Click the Mark as ready button.' and then 'Its Order Status switches from Acknowledged to Food Ready , and its Status switches from Ongoing to Paid .' That is the UrbanPiper order lifecycle for the platforms this page tabulates (DoorDash, UberEats, Deliveroo, Just Eat, Swiggy, Zomato and some twenty more). Two reasons this is not a yes. EDITION: Enterprise only - 'An active Odoo Enterprise subscription is required. Odoo Community does not support this integration.', pos_urban_piper is absent from all 638 Community modules, and the peer group for this record is open-source-selfhostable. Second, the page never states in so many words that Food Ready is transmitted onward to the platform; I read it as a platform status because Placed, Acknowledged and Food Ready are the UrbanPiper lifecycle. Falsified if Food Ready is shown to be an Odoo-internal state only. EDITION RULE APPLIED, settled from this record's own precedent rather than asserted: hardware-kds is a standing verified "partial" for pos_preparation_display WITH an Enterprise caveat, and kitchen-station-routing is a standing "yes" carrying the same caveat. So in this record an Enterprise-only capability is scored on its MERITS with the edition stated, and is never downgraded to "no" merely for being Enterprise. This verdict rests on the merits set out above and would stand on Enterprise too; the edition is recorded as a scope fact for the reader, not as the reason for the verdict. source |
| kitchen-order-ready-callback | unknown / F - No documented order-ready event from the preparation display back to a marketplace." | resolve-to-no | The two halves of this claim are documented as separate, one-directional surfaces. Marketplace orders flow INTO the KDS: when an order is accepted it 'is automatically displayed on the preparation display'. But the ready signal back out is a different action taken elsewhere - the documented ready step is 'Click the Mark as ready button.' performed on a selected order in the online-orders list view, not by bumping a card on the preparation display. Nothing on the preparation-display page connects a stage move to a marketplace event; its bump controls are the order-card click and a Recall button that undoes the most recent stage move. EDITION: doubly moot for Community - pos_urban_piper and pos_preparation_display are BOTH absent from the 638 Community modules, and this page states 'Odoo Community does not support this integration.', so Community has neither the KDS nor the marketplace link. Falsified by documentation that a prep-display stage move emits Food Ready. source |
| kitchen-offline-operation | unknown / F - The preparation display is a server-served web app; no statement about behaviour when the cloud back | resolve-to-no | Odoo makes an explicit offline-resilience claim for the register only, on the POS index page (built to maintain functionality even during temporary network outages), and makes no such claim anywhere for the preparation display. This page describes the display purely as a server-backed browser client: 'To use the preparation display, log in via a web browser on a mobile device or a touchscreen connected via USB or HDMI. IoT boxes are not supported.' No on-site device is documented as holding the queue when the backend is unreachable, and no local-cache language appears anywhere in the corpus - service worker, IndexedDB and localStorage all return zero hits with the nav stripped. EDITION: Enterprise - pos_preparation_display is absent from all 638 Community modules and its source lives in the private odoo/enterprise repo, so I could not read the code to check for a cache. Falsified by a documented offline mode for the prep display, or by source showing local persistence. source |
| kitchen-prep-forecasting | unknown / F - No kitchen prep list or forecast-driven prep quantities documented for POS." | resolve-to-no | This page enumerates the entire configuration of the display - Name, Point of Sale, POS product categories, 'Auto clear', and Stages carrying colors and an 'Alert timer (min)' - and its entire interface, being a top bar, a side panel filtering by Time, Preset and POS categories, and order cards. Every one of those is reactive to orders already placed: there is no prep list, no predicted quantity, and no daily prep task list. The phrase prep list returns zero hits corpus-wide with the nav stripped, and the four forecast hits are the Inventory forecasted on-hand quantity (point_of_sale/products.html, inventory configure/type.html, point_of_sale/models/product_template.py), which is stock replenishment rather than a kitchen prep sheet and is not surfaced to kitchen staff. EDITION: the KDS this would live on is Enterprise (pos_preparation_display absent from the 638 Community modules); the Inventory forecast is Community but is not the claimed feature. Falsified by a documented prep-list view fed by historical sales. source |
| delivery-86-sync | unknown / F - Product availability is a static 'Available on Food Delivery' flag; no documented real-time item or | resolve-to-no | The only marketplace channel Odoo documents is UrbanPiper, and its item-availability model is a manual whole-menu push, not a near-real-time 86 event. Products are exposed by filling 'Available on Food Delivery' on the product form or in the list-view column, and publishing them takes an operator action - 'Click the Sync Menu button.' - with the page warning that synchronization may take minutes to reflect on the platform. The only runtime availability control documented is Store Timings, configured by 'Week Day , Starting Hour , Ending Hour', which opens and closes the whole store rather than an item or an item option. EDITION: Enterprise-only - 'An active Odoo Enterprise subscription is required. Odoo Community does not support this integration.', and pos_urban_piper is not among the 638 Community modules, so Community has no channel to 86 to at all. Falsified by a documented stock-driven or on-demand item-level availability push. EDITION RULE APPLIED, settled from this record's own precedent rather than asserted: hardware-kds is a standing verified "partial" for pos_preparation_display WITH an Enterprise caveat, and kitchen-station-routing is a standing "yes" carrying the same caveat. So in this record an Enterprise-only capability is scored on its MERITS with the edition stated, and is never downgraded to "no" merely for being Enterprise. This verdict rests on the merits set out above and would stand on Enterprise too; the edition is recorded as a scope fact for the reader, not as the reason for the verdict. source |
| delivery-3p-reconciliation | unknown / F - No marketplace payout-to-POS reconciliation report documented." | resolve-to-no | This page is the complete POS reporting surface and it enumerates exactly two things: Orders statistics 'available in a graph or pivot view that you can filter or group depending on your needs', and a per-session report whose columns it lists in full - 'The Order Ref', 'The Customer .', 'The Employee that placed this order.', 'The Total paid amount.' and 'The order Status .' No payout, commission, marketing-fee, adjustment or missing-order column appears. The regex reconcil returns no POS documentation page at all with the nav stripped: its twelve hits are Odoo accounting bank reconciliation (payment_providers and the Amazon, Lazada, Shopee and Shopify connectors) plus the point_of_sale payment and session source files, which reconcile the register session to journal entries, not a marketplace deposit to 3P sales. EDITION: n-a - absent in Community (no marketplace connector exists) and not documented for Enterprise or UrbanPiper either. Falsified by a documented food-delivery payout report. source |
| delivery-tracking-page | unknown / F - Sourced to restaurant.html, a page that never discusses delivery tracking at all. This is silence, n | resolve-to-no | The only SMS module among the 638 Community modules is this one, and the manifest scopes it to receipts rather than to tracking: 'POS - SMS', category 'Send sms to customer for order confirmation', description 'This module integrates the Point of Sale with SMS'; the implementation sends a single message built from sms_receipt_template_id in pos_sms/models/pos_order.py. The other guest-messaging channel is the same shape: the WhatsApp page lists its POS use as receipts and invoices from the Point of Sale app, and no whatsapp module appears in the 638 Community modules either. Neither carries an order-status link, and no driver state exists to drive one - the phrases tracking page, order status page and track your order all return zero hits across the full 552-document corpus with the nav stripped, and this record already scores delivery-driver-roster and delivery-driver-tracking as no because no driver entity exists in the POS model. The nearest surfaces are in-store or transactional: the Order Status Screen lobby display and the presets email confirmation template. Falsified by a documented per-order tracking URL. source |
| payments-softpos-tap-to-pay | unknown / F - No Tap to Pay on iPhone or Android tap-to-pay support documented in the POS payment docs." | resolve-to-partial | The literal strings 'tap to pay', 'tap-to-pay' and 'softpos' return zero hits across all 552 corpus documents with the Sphinx nav stripped, but Odoo's own term is different: this page says "The viva.com Terminal app turns a smartphone with an NFC chip into a" payment terminal (the two closing words are a hyperlink to viva.com's tap-on-phone article), and no reader is needed because Viva.com payment terminals do not require an IoT Box. COMMUNITY: the implementing module pos_viva_com is present in the 638-module Community list (.cache/q210/odoo-addons.txt), so this is not an Enterprise-only capability. Partial, not yes, on three grounds: it is one of thirteen supported terminal providers; the page warns Odoo "only supports the Euro currency with viva.com."; and the NFC acceptance happens inside Viva's own Terminal app driven over Viva's Cloud Terminal API, not inside Odoo's browser POS, so the merchant runs two apps and Odoo never names Tap to Pay on iPhone or Tap to Pay on Android. Falsified to yes if Odoo documents a second provider's tap-on-phone path or an in-POS softpos flow; falsified to no if the Viva app proves to be a wholly separate register rather than an Odoo-driven terminal. source |
| payments-card-on-file | unknown / F - Odoo payment providers tokenize cards for eCommerce and Subscriptions, but POS card-on-file reuse is | resolve-to-partial | Grade-A Community source: this controller pays a pos.order through the same payment.token machinery as eCommerce. It selects saved tokens for the order's partner via "_get_available_tokens", accepts a payment whose flow is "token", and rejects a bad one with "The payment token is invalid." COMMUNITY: pos_online_payment is in the 638-module Community list. Partial rather than yes because token reuse here is customer-driven and gated: the code refuses tokenization for anonymous shoppers with "Tokenization is not available for logged out customers.", so the guest must be a logged-in portal user; there is no staff-initiated card-on-file charge from the register (the in-store card path is a third-party terminal) and no phone-order flow at all. Falsified to yes if Odoo documents a cashier charging a stored token from the POS register; falsified to no if the token flow proves unreachable for POS orders in practice. source |
| payments-p2pe-pci4 | unknown / F - No Odoo-published P2PE listing or PCI DSS 4.x AoC covering the POS was found." | resolve-to-no | This is an affirmative vendor disclaimer, not silence. Under the heading PCI DSS and Attestation of Compliance, Odoo states it is not PCI DSS-certified because it does not "store cardholder data or process payments.", that as an Odoo customer "you only need to complete the minimal Self-Assessment Questionnaire (SAQ) with" "the provider to obtain the Attestation of Compliance (AoC) and achieve PCI compliance.", and that Odoo "should not be mentioned as a payment processor or a third-party service provider in the" SAQ. So the vendor publishes no AoC of its own and offers none on request. 'P2PE' and 'point-to-point encryption' return zero hits across all 552 documents. EDITION n-a: the disclaimer is about Odoo S.A. and binds Community and Enterprise alike. The merchant may still have P2PE from Adyen, Stripe or Worldline, but that is the terminal provider's listing, not Odoo's. Falsified only if Odoo publishes its own AoC or a PCI P2PE listing. source |
| digital-voice-ai-phone | unknown / F - No AI voice phone ordering, native or named certified partner, documented for POS." | resolve-to-no | This page is the only voice page in the 1,158-name Sphinx docnames census, and it is not phone ordering: Odoo AI "can transcribe spoken audio into text and generate summaries from that transcript." for meetings and dictation. 'inbound call', 'incoming call' and 'answer ... call' return zero hits across all 552 documents, and the AI book's index page enumerates its whole feature set (API keys, agents, default prompts, document sort, fields, live chat, server actions, email templates, voice transcription, write and improve text) with no telephony surface. EDITION: no 'ai' module appears in the 638-module Community list, so even this transcription feature is Enterprise-only and Community has no AI at all. No named certified voice-AI partner appears anywhere in the corpus. Falsified if Odoo publishes a telephony or voice-ordering agent page, or names a voice-AI partner for POS. source |
| digital-google-order | unknown / F - No Order with Google provisioning documented for Odoo self-ordering." | resolve-to-no | 'Order with Google' and 'Google Business Profile' return zero hits across all 552 documents, and the 1,158-name docnames census has no Google page beyond OAuth, Translate, user login, Google Reserve for Appointments, Merchant Center and Search Console. This page is Odoo's first-party ordering surface and it enumerates how the direct ordering link reaches guests: printed or downloaded QR codes, and a kiosk. Odoo even tells the operator to derive the URL by hand — "To customize QR codes, scan the relevant QR code to acquire its URL, then use a QR code" generator — which is the opposite of provisioning that link into a listing. COMMUNITY: pos_self_order is in the 638-module list, so this is a gap in the product, not in the free edition. Falsified if Odoo documents pushing the self-order URL into a Google Business Profile ordering slot. source |
| digital-apple-business-connect | unknown / F - No Apple Business Connect 'Order Food' action documented." | resolve-to-no | 'Apple Business Connect' returns zero hits across all 552 documents and no docname in the 1,158-name census mentions Apple or Maps. Same reasoning as the Google cell: this page enumerates the distribution channels for the first-party ordering link as QR codes and a kiosk, with the operator instructed "To customize QR codes, scan the relevant QR code to acquire its URL, then use a QR code" generator; there is no place-card or custom-action provisioning of any kind. COMMUNITY: pos_self_order is in the 638-module list, so this is a product gap and not an edition split. Falsified if Odoo documents an Apple Maps Order Food action pointing at the self-order URL. source |
| digital-subscriptions | unknown / F - Odoo Subscriptions is a separate app; a guest membership tier redeemable in POS is not documented." | resolve-to-partial | Odoo does have a real recurring-billing engine: this app "is designed to manage recurring revenue through subscription-based" products or services, with configurable Billing Period, Automatic Closing and self-service actions. But this page's own integration sentence is the completeness sentence that limits it — "The app integrates with other Odoo modules such as" Invoicing, CRM, Sales and Helpdesk — and Point of Sale is not among them; after the Sphinx nav is stripped, 'Point of Sale' has zero hits anywhere in the eight-page subscriptions book, and 'recurring', 'membership' and 'subscription' have zero hits across the 43 point_of_sale pages and the loyalty, gift-card and eWallet pages. So there is no delivery-fee waiver, per-period entitlement or paid loyalty tier redeemable at the register. EDITION: ENTERPRISE ONLY — no module matching 'subscription' appears in the 638-module Community list (.cache/q210/odoo-addons.txt), so a self-hosted Community merchant has no subscription engine at all. Falsified to yes if Odoo documents a subscription redeemable in POS; to no if the app cannot bill a consumer. source |
| digital-checkout-pci-sca | unknown / F - Checkout runs through Stripe/Adyen and similar providers, but Odoo publishes no PCI DSS 4.0 statemen | resolve-to-partial | The hosted-field half is met and stated plainly: "Odoo apps delegate the handling of sensitive information to the certified payment provider so" the merchant need not worry about PCI compliance, and "No sensitive information (such as credit" card numbers is stored on Odoo servers, a unique reference number being used instead. The compliance half is not met: on this same page Odoo states it is not PCI DSS-certified because it does not "store cardholder data or process payments.", so it publishes no PCI DSS 4.0 attestation and nothing about the March 2025 client-side script-integrity requirements; '3DS', '3D Secure' and 'Strong Customer Authentication' return zero hits across all 552 documents, so 3DS support is undocumented even though several supported providers offer it. EDITION n-a: the payment framework ships in Community. Falsified to yes if Odoo publishes a PCI DSS 4.0 statement and documents 3DS. source |
| hardware-handheld-lte | unknown / F - No handheld product and no documented cellular failover for POS devices." | resolve-to-no | This page is Odoo's enumeration of the POS hardware it supports — "Odoo Point of Sale supports integration with a variety of hardware, including" payment terminals, cash drawers, customer displays, scales, barcode scanners, receipt printers and electronic shelf labels — and neither a handheld nor any connectivity product appears in it. Corpus-wide, '4G', 'LTE', 'cellular' and 'SIM' as whole words return exactly one hit across all 552 documents, in an HR employee-record page, i.e. nothing in POS. Odoo ships no first-party handheld at all (the POS is a browser app on merchant-supplied devices), so there is no vendor-supplied failover to document. COMMUNITY: point_of_sale is core, so this is a product gap, not an edition split. Falsified if Odoo documents an LTE failover or a cellular-equipped device; note that a commodity phone running the browser POS has its own cellular radio, but Odoo documents no failover behaviour for it. source |
| hardware-tap-to-phone | unknown / F - No Tap to Pay on iPhone or Android tap-to-phone acceptance documented." | resolve-to-partial | Grade-A and decisive on edition: the core point_of_sale settings model declares module_pos_viva_com with the help text "The transactions are processed by Viva.com on terminal or tap on phone." — Odoo's own words for tap-to-phone, in core Community source, which is why the queries 'tap to pay' and 'softpos' find nothing anywhere. COMMUNITY: this field lives in point_of_sale itself and pos_viva_com is in the 638-module Community list, so the open-source edition gets it. Partial rather than yes: only this one of the thirteen terminal providers is given a tap-on-phone path in the file — the sibling fields for Adyen, Stripe, Razorpay, Mercado Pago, Pine Labs and QFPay say only that "The transactions are processed by" that provider — the acceptance runs in Viva's app rather than Odoo's browser POS, and Odoo never names Tap to Pay on iPhone or Tap to Pay on Android. Falsified to yes if a second provider's module gains the same help text. source |
| hardware-ownership-vs-lease | unknown / F - Scored yes on pure inference with a source (the receipt-printers hardware page) that says nothing ab | resolve-to-partial | Odoo is not a hardware vendor, so there is no lease to escape and no purchase price to publish. This page says the POS "is designed for managing shops and restaurants. It is web-browser-based," "allowing it to run on any device" — the merchant supplies, and therefore owns, the device outright. Whole-word 'lease', 'leasing' and 'rental' return only four hits across the whole 612-document corpus with the Sphinx nav stripped, and every one is the unrelated Odoo Rental ERP app (rental price rules, the app checklist in the pricing calculator) — no hardware lease exists anywhere, and www.odoo.com/pricing enumerates both what its plans include and what they do not — Odoo.sh hosting for custom developments, implementation services, in-app-purchase credits, custom-code maintenance — with no hardware line in either list. Partial rather than yes because the rubric also asks the vendor to state which model applies, and Odoo states neither; ownership is an inference from its absence from the hardware business. EDITION n-a. Falsified to no if Odoo is found bundling or leasing hardware in any region. source |
| guest-loyalty-thirdparty-identity-attach | unknown / F - UrbanPiper docs do not state whether marketplace orders create or attach to a native customer record | resolve-to-no | Marketplace orders reach Odoo POS only through the UrbanPiper connector, and this page gates it: 'An active Odoo Enterprise subscription is required. Odoo Community does not support this integration.' The implementing module (pos_urban_piper) is absent from the 637 Community modules in .cache/q210/odoo-addons.txt, so on the open-source edition there is no mechanism at all. On Enterprise the page documents the whole lifecycle - Accept, Reject, Mark as ready, 'its Order Status switches from Placed to Acknowledged' - and never names a customer, contact, res.partner or any guest identity field in the Configuration, Products, Synchronization or Order flow sections; the only per-order attributes it fills are status ones. EDITION: Enterprise-only (pos_urban_piper is not among the 638 Community modules). APP: Point of Sale + pos_urban_piper (Enterprise) + a paid UrbanPiper subscription. FALSIFIER: pos_urban_piper source or an Enterprise page showing the connector creating or matching a res.partner from platform customer data. EDITION RULE APPLIED, settled from this record's own precedent rather than asserted: hardware-kds is a standing verified "partial" for pos_preparation_display WITH an Enterprise caveat, and kitchen-station-routing is a standing "yes" carrying the same caveat. So in this record an Enterprise-only capability is scored on its MERITS with the edition stated, and is never downgraded to "no" merely for being Enterprise. This verdict rests on the merits set out above and would stand on Enterprise too; the edition is recorded as a scope fact for the reader, not as the reason for the verdict. source |
| guest-loyalty-offer-stacking-rules | unknown / F - Programs trigger when conditions are met, but explicit exclusivity and precedence configuration was | resolve-to-no | This is Odoo's reference for the promotion/coupon engine that pos_loyalty exposes at the register. It enumerates three things - the program form ('The program form typically contains the following fields.'), the Conditional rules options, and the Rewards options ('The options for Rewards vary depending on the selected Program Type') - and no field in any of them expresses exclusivity, combinability or order of application. The only volume control is Limit Usage, a count. Cross-checked in code: pos_loyalty/models/loyalty_reward.py loads discount_applicability and is_global_discount, but those scope one reward's target, not inter-program precedence. Over all 552 documents 'combinable', 'stacking' and 'cannot be combined' return zero hits. EDITION: Community - loyalty, sale_loyalty, pos_loyalty and pos_restaurant_loyalty are all in the 637-module list. APP: Sales (loyalty) + Point of Sale. FALSIFIER: 'typically' and 'The options available may vary depending on the Program Type selected' hedge this enumeration; a stacking flag in the core loyalty module's source (not in this corpus) would overturn it. source |
| guest-loyalty-10dlc-registration | unknown / F - No A2P 10DLC brand or campaign registration handling documented for Odoo SMS." | resolve-to-partial | Odoo discloses the registration obligation without naming the regime or handling it in product. On the built-in IAP path: 'Currently, Odoo registers itself when possible to avoid extra setup for its customers, however in some countries that is not enough and the client itself must do it.' On the Twilio path the operator is explicitly on their own: 'Sending SMS to some countries (such as the US or Canada) might require a registration. This can only be done by you, and not by Odoo.' Across all 552 documents '10DLC' and 'A2P' return zero hits; there is no brand or campaign object, no registration-status field and no submission flow anywhere in the six SMS Marketing pages. Disclosure without handling is partial, not yes and not no. EDITION: Community - sms, sms_twilio, mass_mailing_sms and pos_sms are all in the 637. APP: SMS Marketing / Settings-Contacts (sms), optionally sms_twilio. FALSIFIER: an Odoo IAP or SMS page naming 10DLC brand and campaign registration with a submission workflow. source |
| guest-loyalty-review-capture-routing | unknown / F - Odoo Surveys exists as a separate app, but score-based routing to service recovery versus public rev | resolve-to-no | I am citing the strongest near-miss in the whole 552-document corpus and it still fails the cell. Helpdesk Customer Ratings does trigger a request automatically - 'To automatically request ratings from customers once their tickets have closed, an email template needs to be added to the appropriate stage' - and does score three ways ('Satisfied - green (smile) icon', Okay, Dissatisfied). But every response lands in one place: the rating and written comments 'are added to the chatter on the ticket', plus a Customer Ratings report. There is no low-score branch, no service-recovery route and no public-review destination; 'Google review', 'review site', 'NPS', 'Net Promoter', 'Trustpilot' and 'Yelp' each return zero across 552 documents. It is also ticket-scoped, not post-transaction: the only outbound POS message in Community source is the receipt (pos_sms sends config_id.sms_receipt_template_id). EDITION: helpdesk is absent from the 637 Community modules, so this near-miss is Enterprise-only; Community has survey and rating but no triggered post-sale flow. APP: Helpdesk (Enterprise) or Surveys. FALSIFIER: a documented action branching on rating score to different destinations. source |
| guest-loyalty-ai-offer-recommendation | unknown / F - Odoo 19 lists an Artificial Intelligence app, but no shipped AI offer-content, audience or send-time | resolve-to-partial | CORRECTED after the AI book was added to the corpus. Odoo ships real, documented AI copy generation into outbound mail: an AI prompt embedded in an email template is evaluated per recipient at send time - 'the prompt is evaluated in context, and the generated content is inserted into the message automatically' - and the prompts 'Adapt the message content to the current record' using customer data. That is genuine AI-generated message content, not a roadmap claim. It is NOT offer recommendation: the page's own example use cases are sales follow-ups, HR communication and project updates; nothing recommends a discount, a target audience or a send time, and the loyalty program form has no AI-suggested field. EDITION - and this is the decisive half: no module named ai, ai_*, *_ai, or anything matching llm/gpt/gemini/openai exists among the 637 Community modules, and the AI book never labels itself Enterprise (the same unlabelled-Enterprise trap as pos_preparation_display), so a Community install gets none of this. APP: Odoo AI (Enterprise) + Email/SMS Marketing. FALSIFIER: an ai module appearing in a Community addons listing, or an AI page recommending offer targets or send timing. source |
| labor-photo-punch-verification | unknown / F - No photo-at-punch or facial verification documented for POS login or attendance." | resolve-to-no | The punch device is the Attendances kiosk and this page closes the enumeration of identification methods: 'Determine how an employee checks in at a kiosk, either by searching for their name (Manual Selection), scanning an employee ID or key fob (Barcode/RFID), or both', optionally gated by Employee PIN Identification. The camera only reads a code - 'Barcodes can be scanned with a dedicated Scanner, or with a device's Front Camera or Back Camera' - never captures an image onto the record; hardware.html likewise lists badges, barcode scanners and RFID readers only. 'facial', 'photo at' and 'buddy' return zero across 552 documents. No photo-at-punch and no facial verification, so the non-biometric-mode half of the claim never arises. EDITION: Community - hr and hr_attendance are both in the 637. APP: Attendances (hr_attendance), NOT the POS - this page scopes itself to the workforce that never touches the register ('Kiosks are needed for employees who do not have access to the database.'), and pos_hr's own manifest scopes that module to employee login at the till by barcode or PIN, with no punch record. FALSIFIER: a Kiosk Settings option capturing an image on check-in. source |
| labor-offline-time-punch | unknown / F - No documented offline punch capture or reconnect reconciliation behaviour." | resolve-to-no | Two reasons, and I want the POS-scoping argued rather than assumed. (1) The POS terminal takes no time punches at all: 'hr_attendance' appears in zero of the 552 documents, no POS module in the source set references it, and pos_hr is register login only - so a punch never rides the POS offline buffer. (2) The actual punch device is a server-rendered web kiosk: 'Odoo generates a unique web address (URL) to use a device as a kiosk, without having to sign in to the Odoo database.' Neither this page nor attendances.html, hardware.html, check_in_check_out.html or attendance_logs.html documents queueing, buffering, reconnect reconciliation or duplicate suppression. 'offline' appears in only 6 of 552 documents (IoT, Discuss, pos_payment_method.py and three marketing pages) and in none of the HR pages. The rubric requires the behaviour to be documented; it is not. EDITION: Community (hr_attendance). APP: Attendances. FALSIFIER: any Attendances page describing local punch storage during loss of connectivity. source |
| labor-overtime-prevention | unknown / F - Odoo Attendances tracks extra hours, but a clock-in-time overtime warning or block was not verified. | resolve-to-no | Odoo's overtime rulesets are an after-the-fact costing engine, not a gate at clock-in. Rule conditions evaluate time already logged, and the response set is closed: 'Once the criteria set in the Condition section are met, the Action section determines how any approved extra time is handled', with exactly two actions - 'Pay extra hours' and 'Give back as time off'. There is no warn, block or notify action and no threshold evaluated at check-in. attendances.html reinforces the direction: the only automatic intervention documented is Automatic Check-Out after a tolerance, which ends a shift rather than preventing one from starting. 'clock in' returns zero hits across 552 documents. EDITION: Community - hr_attendance is in the 637. APP: Attendances (hr_attendance), not the POS; the register login in pos_hr has no hours awareness. FALSIFIER: an Action option or kiosk-side prompt that warns on or refuses a check-in against a configured threshold. source |
| labor-qualified-tips-w2-reporting | unknown / F - No evidence found on Treasury tipped-occupation codes or W-2 Box 12 TP / Box 14b handling for tax ye | resolve-to-no | The POS data model cannot express the distinction the cell asks for. pos.order carries exactly two tip fields - "is_tipped = fields.Boolean('Is this already tipped?', readonly=True)" and "tip_amount = fields.Monetary(string='Tip Amount', readonly=True)" - one undifferentiated monetary total per order, with no cash-versus-charged split, no tipped-occupation code and no payroll classification; the register posts tips as a single [TIPS] product line. Upstream there is nothing to export to: no module matching 'payroll' exists among the 637 Community modules, and the only US localisations present are l10n_us and l10n_us_account, so the open-source edition ships no payroll application, no W-2 and no Box 12 or 14b. 'W-2' and 'Box 12' return zero across 552 documents. EDITION: Community = no. APP: would require Payroll plus a US payroll localisation, both Enterprise. HONEST LIMIT: applications/hr/payroll/payroll_localizations/united_states.html is in the 1,158 docnames but is NOT on disk, so I cannot speak to Enterprise US payroll's 2026 W-2 codes; the POS-side half of the claim fails regardless of edition. source |
| reporting-nl-query | unknown / F - Odoo 19 lists an Artificial Intelligence app; a natural-language query over the operator's own sales | resolve-to-partial | CORRECTED after the AI book was added to the corpus - my first pass would have scored this no off a corpus that lacked the evidence. Odoo 19.0 ships a natural-language query surface over the operator's own records: the AI app's preconfigured 'Natural Language Search' topic 'supports the interpretation of a user query to open the appropriate Odoo view with a set of tools necessary to perform the search', alongside 'Information retrieval : a collection of tools to retrieve information about the models.' The agent reads the tenant's own records - 'An AI agent is a smart assistant in Odoo that can understand natural language, perform tasks, and assist users by interacting with Odoo tools.' - and is read-only unless given tools: 'If an agent is not assigned any Topics, it is only able to provide information, not complete tasks or make changes to the database.' The sibling overview page ai.html says the same of Ask AI, that it opens views and displays reports rather than answering from help articles. Two discounts keep this off yes. EDITION, the decisive one: no ai / ai_* / *_ai / llm / gpt / gemini / openai module exists among the 637 Community modules, and the AI book never labels itself Enterprise, so the open-source product ships none of it; 'creating and customizing agents requires that the AI application is installed'. And the documented output is an opened view, not specifically a POS sales-and-labor figure or chart. APP: Odoo AI (Enterprise), plus API keys for Odoo.sh and on-premise. FALSIFIER: an ai module in a Community listing would move this to yes. source |
| extensibility-webhook-reliability | unknown / F - No HMAC signature, retry/backoff policy, or replayable delivery log is documented for outbound webho | upheld | Not licensed by this corpus. The one document that would decide it, https://www.odoo.com/documentation/19.0/applications/studio/automated_actions/webhooks.html, IS named in .cache/q210/odoo-docnames.txt (the 1,158-page Sphinx census) but is NOT among the 552 documents on disk (re-checked after the corpus was corrected upward from 467), and base_automation/ir_actions_server source is not in the corpus either — so I can neither confirm nor deny that Odoo documents HMAC signing, retry with backoff, or a replayable delivery log for the outbound 'Send Webhook Notification' action. Corpus-wide ogrep gives HMAC 4 hits, all INBOUND payment-provider webhook verification (pos_adyen/controllers/main.py, adyen.html, paymob.html), and 'retry|retries' 5 hits, none about outbound webhooks. Edition: base_automation IS in the 638-module Community list (.cache/q210/odoo-addons.txt), so the automation-rule webhook itself is a Community feature and no edition split rescues this cell; only the missing page does. The AI book added in the corpus correction (applications/productivity/ai/*) is not relevant — apikeys.html is about supplying your OWN OpenAI/Gemini key to Odoo, not an Odoo key for third parties. Falsifier: fetching webhooks.html and finding a signing-secret or retry-policy passage. source |
| extensibility-headless-embedded | unknown / F - pos.order is API-writable in principle, but no documented headless mode letting a third-party UI dri | resolve-to-partial | pos_self_order — present in the 638-module Community list (.cache/q210/odoo-addons.txt), so this is COMMUNITY, not Enterprise-only — exposes public HTTP endpoints that drive the POS transaction engine: the process-order route at line 10 of this file is declared with auth=public, type=jsonrpc and creates the order through sync_from_ui, while the /kiosk/payment/ route calls _payment_request_from_kiosk to drive the terminal. Authorisation is a pos.config access_token checked by _verify_pos_config, not a user login, so a third-party UI genuinely can create orders and request payment; and because the module is LGPL-3 a self-hoster may replace the frontend outright. Partial rather than yes because Odoo publishes no headless contract for these routes: 'headless' returns 0 hits across all 552 documents (re-run after the corpus correction) and appears in none of the 1,158 docnames. They are private endpoints for Odoo's own self-order PWA and kiosk, unversioned and free to change. Note this path is NOT the External API, so it is not gated by the plan restriction shown on www.odoo.com/pricing. Falsifier: a documented public contract for these routes would make it yes; a token check that binds the caller to Odoo's own client would make it no. source |
| reliability-sync-conflict-handling | unknown / F - No documented conflict-resolution behaviour for concurrent edits on two devices during a network par | resolve-to-partial | point_of_sale (in the 638-module Community list; identical code in both editions) does state a conflict rule, but in source rather than operator documentation. The sync_from_ui docstring says an order that already exists in a state other than draft is dropped — "it will be discarded, otherwise it will be saved to the database" — while a draft order is overwritten by the incoming client copy, i.e. last-write-wins on drafts and first-write-wins once paid; order identity is a client-generated uuid guarded by the constraint message "An order with this uuid already exists". For kitchen tickets, _ensure_to_keep_last_preparation_change compares serverDate timestamps and keeps the server copy when it is newer, logging "Preparation changes were outdated, probably linked to a synching issue." Partial, not yes, because no operator-facing page documents any of this: no POS documentation page in the 552-document corpus matches 'conflict' (7 hits corpus-wide, none of them a POS doc page), there is no offline or partition behaviour page, and the code never addresses two devices editing the same split check during a partition. Falsifier: a 19.0 documentation page describing partition/merge behaviour would make this yes. source |
| reliability-pci-dss-4-attestation | unknown / F - No PCI DSS v4.0/4.0.1 AoC or validated P2PE listing published by Odoo was found." | resolve-to-no | This is an explicit vendor denial, not an absence. The page's compliance block states "Odoo is not PCI DSS-certified because it does not store cardholder data or process payments" and that it "outsources tokenization and payment to external payment providers". No AoC of any version is published: www.odoo.com/security (also in the corpus, read in full) offers only CSA STAR Level 1 participation and the CAIQv3.1 questionnaire, with no SOC 2 and no PCI item, which I deliberately leave unquoted because that string lives in a different document from this row url, and 'P2PE' returns 0 hits across all 552 documents, re-run after the corpus correction. Edition-independent — Community is LGPL-3 software the operator hosts, so there is no Odoo-operated cardholder data environment to attest at all, and Enterprise/Cloud gets only the security page. Falsifier: an Odoo-published AoC or a PCI SSC validated-P2PE listing naming Odoo SA. Note the proposition scored here is Odoo's OWN attestation, not whether the merchant's Adyen, Stripe or Worldline terminal is validated. source |
| commercial-no-early-termination-fee | unknown / F - No ETF or liquidated-damages clause was located in the published ESA; the 300% figure applies to usi | resolve-to-partial | EDITION SPLIT, and it is the whole answer. A self-hosted Community deployment is bound by LGPL-3 (pos_restaurant/__manifest__.py carries the license LGPL-3), so there is no subscription, no counterparty and no fee of any kind on exit. For Enterprise I read the ESA (Version 12 - 2025-12-19) and the General Terms of Sale to the end: neither contains an early-termination fee or a liquidated-damages clause, and the Charges and Fees section enumerates only standard charges, renewal charges and taxes. Every monetary penalty in the agreement is triggered by something other than cancelling — "300% of the applicable list price for the actual number of Users" for continuing to use Enterprise Edition after termination, EUR 30 000 for soliciting the other party's staff, and 25% of the annualized price for running a non-Covered Version. Partial rather than yes because the terms nowhere affirmatively state a no-ETF position and grant no mid-term cancellation right at all: the only exit is "a written notice of termination minimum 30 days before the end of the Term", so the remaining Term's fees, not a fee schedule, are the real cost of leaving early. Falsifier: an order form or Cloud-specific term outside these two published documents naming a cancellation charge. source |
| commercial-post-termination-export-window | unknown / F - No defined post-termination data-retrieval window was located in the published ESA or SLA." | resolve-to-partial | A defined window exists and is published, but it is framed as retention rather than retrieval. The Data Retention section states: "For databases hosted on the Odoo Cloud, if you cancel the service your database is kept deactivated for 3 weeks (the grace period during which you can change your mind), and then destroyed." Three weeks is a real number and is not an immediate cutoff, and the ESA's data-protection section separately gives the customer a choice between permanent deletion and return of the database on termination. But no document says a DEACTIVATED database can still be exported, so the retrieval half of the rubric is unproven. Edition split: this is an Odoo Cloud term only — a Community or Enterprise self-hoster already holds the database and its filesystem, so the cell is vacuous in their favour and the window governs hosted customers alone. Falsifier: an administration page stating Download Backup stays available during the grace period would make this yes; a statement that deactivation blocks the database manager would make it no. source |
| commercial-data-ownership-clause | unknown / F - Odoo publishes a Privacy Policy, GDPR page and DPA-adjacent material, but an explicit merchant-owns- | resolve-to-yes | Both halves of the rubric are met in one published legal document. Ownership of a hosted database: "any information or content you submit or upload into your database is your own, and you control it fully", and of the personal data inside it, "you always retain ownership and full control on this data". Constraint on vendor use: the Third Party Disclosure section says "We do not sell or trade your data." The Enterprise Subscription Agreement reinforces this on the processor side by making the Customer the Controller and binding Odoo to process personal data only as instructed. Edition split: for a self-hosted Community deployment under LGPL-3 the clause is moot in the operator's favour, because Odoo SA never holds the data and so has no use or resale to constrain. Weaknesses I want on the record: the ownership sentences live in the Privacy Policy rather than in the subscription agreement, and the no-sell sentence is unqualified rather than carved out for aggregated or de-identified use — broader than the rubric asks, but a policy statement rather than a warranty of title. Falsifier: an ESA or order-form clause licensing Odoo to use customer database content for its own products. source |
| commercial-pci-p2pe-tokenization | unknown / F - Card entry occurs on third-party PTS terminals, but Odoo names no validated P2PE solution and states | resolve-to-partial | Odoo documents tokenization and scope reduction but never names the SAQ. The compliance block says that because Odoo outsources tokenization and payment, "you only need to complete the minimal Self-Assessment Questionnaire (SAQ) with the provider to obtain the Attestation of Compliance (AoC)", and adds "Odoo should not be mentioned as a payment processor or a third-party service provider in the SAQ". 'minimal' is not a named SAQ type — no SAQ A, A-EP or P2PE-HW appears anywhere in the 552 documents — and 'P2PE' returns 0 hits corpus-wide, so no validated P2PE solution is claimed. Two caveats: this page is scoped to ONLINE payment providers for the portal and eCommerce, not to card-present POS entry, which happens on the third-party terminal (Adyen, Stripe, Six, Worldline, Viva, Razorpay); and the position is edition-independent because it turns on the acquirer, not on Community versus Enterprise. Falsifier: a page naming the applicable SAQ type, or a PCI SSC P2PE listing covering a terminal deployment Odoo documents. source |
| commercial-pci-dss-4-controls | unknown / F - Two-factor auth and granular access groups exist, but Odoo publishes no PCI DSS v4.0.1 control state | resolve-to-no | Odoo publishes no PCI DSS v4.0.1 control statement and disclaims the premise: "Odoo is not PCI DSS-certified because it does not store cardholder data or process payments". Nothing in the corpus mentions requirement 6.4.3 or 11.6.1, payment-page script integrity, or MFA scoped to a cardholder data environment — ogrep returns 0 of 552 documents for that requirement pattern, and the 4 hits for multi-factor/two-factor/MFA are the generic users, 2fa and access-rights pages describing optional backend two-factor auth with no CDE scoping and no coverage of POS logins, which authenticate by PIN or badge. 'PCI DSS' itself matches only 2 of 552 documents, re-run after the corpus correction. Edition-independent: a Community self-hoster owns the whole environment and receives no control statement either, and no PCI or compliance page appears among the 1,158 docnames in .cache/q210/odoo-docnames.txt. Falsifier: an Odoo compliance page enumerating the future-dated 4.0.1 controls would move this to partial or yes. source |
| commercial-wcag-kiosk-accessibility | unknown / F - No VPAT/ACR or WCAG 2.1 AA claim for the self-order kiosk or web ordering surfaces was found." | resolve-to-no | Odoo publishes no VPAT or ACR and makes no WCAG claim. 'WCAG|VPAT|accessibility conformance' returns 0 hits across all 552 documents with the site nav stripped — re-run after the corpus was corrected from 467 to 552, and the count is still zero — no docname in the 1,158-page census contains wcag, vpat or accessib, and www.odoo.com/accessibility returns the 404 body at the 9,748-character control length. The page cited here is the one that enumerates the kiosk: it says "Select Kiosk to let customers browse the menu or product catalog, place orders, and pay directly at a self-ordering kiosk" and then lists the complete set of kiosk configuration options — Home buttons, Service location and payment options, Launch on IoT Box, Language, Splash screens, Background — with no non-visual access mode, no audio output, no tactile input and no screen-reader affordance among them. The kiosk surface is pos_self_order, which IS in the 638-module Community list, so this covers both editions: Community and Enterprise ship the same unaudited kiosk. Falsifier: an Odoo-published VPAT, or a kiosk accessibility-mode setting. Note the absence of a published report is not proof the UI fails WCAG. source |
| order-capture-drive-thru | no / B - The POS landing page enumerates every documented POS area, and the restaurant entry reads 'Restauran | upheld | upheld: vocabulary zero re-run at 696 docs and confirmed by the never-existed doc-tree control; absent in both editions source |
| order-capture-drive-thru-timers | no / B - This page is the complete POS reporting surface: Orders statistics in 'a graph or pivot view that yo | downgrade-to-no | re-homed: the model's field list, not the reporting page, is the instrument that enumerates what can be timed; value unchanged source |
| order-capture-voice-ai | no / B - RE-SCORED against the page I flagged as unreadable; now on disk, it settles the cell against the cla | upheld | downgraded: note corrected - the proposal ignored the rubric's API-partner-program limb, which I tested separately; value unchanged source |
| order-capture-catering | partial / B - Every mechanical part of the rubric exists, but as the generic Sales-order flow rather than as a dis | upheld | upheld: all four rubric mechanics verified verbatim; the catering-specific flow disproved by a vocabulary zero plus two never-existed doc-tree controls source |
| order-capture-order-ready-signal | partial / B - A marketplace order-ready signal does exist and it is driven from POS state rather than from a marke | upheld | upheld: the order-rejection paragraph supplies the onward-transmission proof the analyst said was missing; partial is the edition rule, not residual doubt source |
| kitchen-order-ready-callback | no / B - The two halves of this claim are documented as separate, one-directional surfaces. Marketplace order | upheld | upheld: two enumerations - the UrbanPiper order-flow procedure and the prep-display control list - place the ready action off the KDS; impermissible edition ground removed source |
| kitchen-offline-operation | no / B - Odoo makes an explicit offline-resilience claim for the register only, on the POS index page (built | downgrade-to-unknown | overturned: no to unknown - the cited page never enumerates offline behaviour and the deciding source is a private repository source |
| kitchen-prep-forecasting | no / B - This page enumerates the entire configuration of the display - Name, Point of Sale, POS product cate | upheld | upheld: vocabulary control broadened to four further terms and still zero, against a page that fully enumerates the KDS surface source |
| delivery-86-sync | no / B - The only marketplace channel Odoo documents is UrbanPiper, and its item-availability model is a manu | upgrade-to-partial | overturned: no to partial - the cited page itself documents a per-item availability field that publishes to the platforms, and the 'no' rested on an impermissible edition ground source |
| delivery-3p-reconciliation | no / B - This page is the complete POS reporting surface and it enumerates exactly two things: Orders statist | upheld | re-homed: the connector's own end-to-end documentation, not the POS reporting page, is the enumeration that can carry this absence source |
| delivery-tracking-page | no / A - The only SMS module among the 638 Community modules is this one, and the manifest scopes it to recei | downgrade-to-no | downgraded: grade A to B and re-homed - a manifest cannot prove an absence, and the proposal missed the documented 'Order is ready' SMS/WhatsApp channel source |
| payments-softpos-tap-to-pay | partial / B - The literal strings 'tap to pay', 'tap-to-pay' and 'softpos' return zero hits across all 552 corpus | upheld | upheld: integration verified verbatim, and partial is compelled by the terminal-provider rule plus the Euro-only restriction source |
| payments-card-on-file | partial / A - Grade-A Community source: this controller pays a pos.order through the same payment.token machinery | upheld | upheld: both source quotes confirmed in the cited file; partial is right because the token is reusable in only one of the rubric's three channels source |
| payments-p2pe-pci4 | no / B - This is an affirmative vendor disclaimer, not silence. Under the heading PCI DSS and Attestation of | upheld | upheld: explicit vendor denial verified verbatim on the cited page, and the P2PE half is a vocabulary-complete zero source |
| kitchen-station-routing | yes / B - Verified verbatim, including 'Leave the field empty to allow all categories.' Carry the same Enterpr | downgrade-to-partial | downgraded: yes to partial, matching the hardware-kds precedent on the identical Enterprise-only module; Community gets printer routing only source |
| digital-voice-ai-phone | no / B - This page is the only voice page in the 1,158-name Sphinx docnames census, and it is not phone order | upheld | upheld: value stands on the AI book's and the Phone book's own feature enumerations plus the 146-byte never-existed control, but the note is rewritten - the analyst's 'only voice page' and zero-call-hit controls were corpus holes, since the entire Phone/VoIP book is in the census and absent from the corpus source |
| digital-google-order | no / B - 'Order with Google' and 'Google Business Profile' return zero hits across all 552 documents, and the | upheld | upheld: absence is now census-backed and confirmed by the three-state doc-tree probe rather than by a 552-document corpus count that covered only 42% of the documentation source |
| digital-apple-business-connect | no / B - 'Apple Business Connect' returns zero hits across all 552 documents and no docname in the 1,158-name | upheld | upheld: the census plus the never-existed doc-tree signature carry this where the corpus count alone would not source |
| digital-subscriptions | partial / B - Odoo does have a real recurring-billing engine: this app \"is designed to manage recurring revenue t | upheld | upheld: quotes verify verbatim, the corpus hole does not touch the books this rests on, and partial is what the record's own hardware-kds edition precedent requires source |
| digital-checkout-pci-sca | partial / B - The hosted-field half is met and stated plainly: \"Odoo apps delegate the handling of sensitive info | upheld | upheld: the enumeration is complete for the book it rests on and the negative half is an explicit vendor denial, the strongest form a shortfall can take source |
| hardware-handheld-lte | no / B - This page is Odoo's enumeration of the POS hardware it supports — \"Odoo Point of Sale supports inte | upheld | upheld: the cited page is a hardware-and-network enumeration rather than a page that never took up the topic, and the vocabulary zero reproduces at 696 documents source |
| hardware-tap-to-phone | partial / A - Grade-A and decisive on edition: the core point_of_sale settings model declares module_pos_viva_com | upheld | upheld: I re-read the file, the string is exact and unique at 696 documents, the Community edition claim is right, and partial is the ceiling the terminal-provider rule imposes source |
| hardware-ownership-vs-lease | partial / B - Odoo is not a hardware vendor, so there is no lease to escape and no purchase price to publish. This | downgrade-to-unknown | downgraded: partial rested on an inference from absence that the IoT box subscription contradicts - Odoo does gate first-party hardware behind a recurring fee and publishes no ownership or lease terms for it, so no verdict is licensed source |
| guest-loyalty-thirdparty-identity-attach | no / B - Marketplace orders reach Odoo POS only through the UrbanPiper connector, and this page gates it: 'An | downgrade-to-unknown | overturned: no -> unknown, because the cited page never enumerates order customer data at all and the Enterprise source is unreadable, so neither the presence nor the absence of identity attach is established source |
| guest-loyalty-offer-stacking-rules | no / B - This is Odoo's reference for the promotion/coupon engine that pos_loyalty exposes at the register. I | downgrade-to-no | re-homed: grade-B doc absence replaced by a grade-A field-by-field reading of the three Community loyalty models, which closes the vocabulary gap the addendum flagged and upgrades the evidence while leaving the value unchanged source |
| guest-loyalty-10dlc-registration | partial / B - Odoo discloses the registration obligation without naming the regime or handling it in product. On t | upheld | upheld: quotes exact, and I confirmed the zero is bounded by a complete book rather than by the corpus hole that damaged other rows in this slice source |
| guest-loyalty-review-capture-routing | no / B - I am citing the strongest near-miss in the whole 552-document corpus and it still fails the cell. He | upheld | upheld: the value survives on the routing-destination ground, but the note's 'no low-score branch' claim was an artefact of the missing livechat page, is corrected, and the Community near-miss is now named source |
| guest-loyalty-ai-offer-recommendation | partial / B - CORRECTED after the AI book was added to the corpus. Odoo ships real, documented AI copy generation | upheld | upheld: the AI book is complete in the corpus so the shortfall is a real bounded absence, and partial is what the edition precedent requires for a documented Enterprise-only capability source |
| labor-photo-punch-verification | no / B - The punch device is the Attendances kiosk and this page closes the enumeration of identification met | downgrade-to-no | re-homed: upgraded B to A - a closed Selection plus the absence of any binary field on hr.attendance is a far stronger instrument for this absence than a prose page, and it makes the enumeration genuinely complete source |
| delivery-3p-direct-integration | no / B - Marketplace access is exclusively via UrbanPiper middleware, which requires its own valid subscripti | upheld | upheld: re-argued on the merits and re-graded to verified - the rubric excludes middleware resale by its own terms, and UrbanPiper is middleware with its own mandatory subscription and per-platform reseller accounts, so the edition rule does not disturb it source |
| labor-offline-time-punch | no / B - Two reasons, and I want the POS-scoping argued rather than assumed. (1) The POS terminal takes no ti | upheld | re-homed: the deciding document was missing from the corpus, not from the documentation - offline_mode.html, fetched live off the census, converts this from an absence-of-documentation no into a documented vendor limitation (offline records are read-only, and a punch is a write) source |
| labor-overtime-prevention | no / B - Odoo's overtime rulesets are an after-the-fact costing engine, not a gate at clock-in. Rule conditio | downgrade-to-no | re-homed: grade B doc-absence -> grade A enumeration of the overtime-rule field set, which is the proper instrument for a capability claim; value unchanged source |
| labor-qualified-tips-w2-reporting | no / A - The POS data model cannot express the distinction the cell asks for. pos.order carries exactly two t | upheld | upheld: the standing row's own honest limit is closed - I probed the Enterprise US payroll page live and it enumerates W-2 box 13 only, so the verdict now covers Enterprise too source |
| reporting-nl-query | partial / B - CORRECTED after the AI book was added to the corpus - my first pass would have scored this no off a | upheld | upheld: quotes re-verified and the Enterprise gate re-confirmed against the 638-module oracle; partial is exactly what the record's own hardware-kds precedent requires source |
| extensibility-webhook-reliability | unknown / F - Not licensed by this corpus. The one document that would decide it, https://www.odoo.com/documentati | resolve-to-no | overturned: unknown -> no, because the deciding document arrived and automated_actions.html ENUMERATES the Send Webhook Notification action's whole configuration (Fields, URL, Sample Payload) with none of the three required controls, backed by a zero-hit vocabulary control and four never-existed doc-tree probes source |
| extensibility-headless-embedded | partial / A - pos_self_order — present in the 638-module Community list (.cache/q210/odoo-addons.txt), so this is | upheld | upheld: routes re-read and verified verbatim; corrected the authorisation helper named in the note and the 'headless' count, which is now 2 but both hits are the test framework, so the shortfall stands source |
| reliability-sync-conflict-handling | partial / A - point_of_sale (in the 638-module Community list; identical code in both editions) does state a confl | upheld | upheld: all four source strings verified at their line numbers, and peer precedent scores published-source conflict rules at partial (thanx, urbanpiper) while reserving no for vendors with no rule at all source |
| reliability-pci-dss-4-attestation | no / B - This is an explicit vendor denial, not an absence. The page's compliance block states \"Odoo is not | upheld | upheld: the denial is verbatim and edition-independent; recording that AUDIT-ODOO.md's MISATTRIBUTED allegation against this row is itself out of date, as the addendum states and as I re-verified source |
| commercial-no-early-termination-fee | partial / B - EDITION SPLIT, and it is the whole answer. A self-hosted Community deployment is bound by LGPL-3 (po | upheld | upheld: the unknown precedent the brief cited predates the full read and was grade F, so reverting would be a downgrade of evidence; ETF vocabulary is a verified zero across the whole legal set source |
| commercial-post-termination-export-window | partial / B - A defined window exists and is published, but it is framed as retention rather than retrieval. The D | upgrade-to-yes | overturned: partial -> yes and re-homed from the Privacy Policy to ESA 6.5(h), whose delete-or-return-at-the-Customer's-choice obligation supplies the retrieval half the standing note called unproven and expressly incorporates the three-week Privacy Policy delay source |
| commercial-data-ownership-clause | yes / B - Both halves of the rubric are met in one published legal document. Ownership of a hosted database: \ | upheld | upheld: quotes verified verbatim and the note's stated weakness partly repaired - ESA 6.5 supplies the Controller designation, the instruction-only processing limit and a telemetry scope that excludes transaction data source |
| commercial-pci-p2pe-tokenization | partial / B - Odoo documents tokenization and scope reduction but never names the SAQ. The compliance block says t | upheld | upheld: quotes verbatim, and one rubric element (tokenization plus an asserted scope reduction) is documented while the named SAQ and any P2PE claim are verified zeros source |
| commercial-pci-dss-4-controls | no / B - Odoo publishes no PCI DSS v4.0.1 control statement and disclaims the premise: \"Odoo is not PCI DSS- | upheld | upheld: explicit denial verified verbatim; corrected the 'PCI DSS matches 2 documents' count to 1 at 696 docs and added a never-existed doc-tree control for a security/compliance page source |
| commercial-wcag-kiosk-accessibility | no / B - Odoo publishes no VPAT or ACR and makes no WCAG claim. 'WCAG|VPAT|accessibility conformance' returns | upheld | upheld: withdrew the stale 9,748-char ruler for an invariance control I measured myself, and widened the vocabulary sweep to a11y, screen reader, aria, contrast, Section 508 and tactile terms - all zero, so the absence is not a wording artefact source |
Sources
Every URL this record cites. 34 in total.
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/reporting.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/receipt_printers.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/self_order.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/presets.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/employee_login.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/products.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/pricing.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/restaurant/urban_piper.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/terminals.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/payment_methods/customer_credit.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/extra/preparation.html
- https://github.com/odoo/odoo/blob/master/addons/pos_restaurant/__manifest__.py
- https://www.odoo.com/page/odoo-online-sla
- https://www.odoo.com/documentation/19.0/applications/studio/automated_actions.html
- https://www.odoo.com/pricing
- https://www.odoo.com/documentation/19.0/applications/hr/payroll.html
- https://www.odoo.com/documentation/19.0/developer/reference/external_api.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/pos_lna.html
- https://www.odoo.com/documentation/19.0/applications/sales/point_of_sale/hardware_network/scale.html
- https://www.odoo.com/forum/help-1/how-is-the-point-of-sale-offline-mode-working-218314
- https://status.odoo.com/
- https://www.odoo.com/documentation/19.0/legal/terms/enterprise.html
- https://www.odoo.com/documentation/18.0/applications/marketing/sms_marketing/create_sms.html
- https://www.odoo.com/documentation/18.0/applications/marketing/email_marketing.html
- https://www.odoo.com/documentation/18.0/applications/marketing/email_marketing/mailing_lists.html
- https://www.odoo.com/cloud-sla
- https://www.odoo.com/documentation/19.0/applications/essentials/export_import_data.html
- https://www.odoo.com/gdpr
- https://www.odoo.com/documentation/19.0/administration/odoo_online.html
- https://www.odoo.com/documentation/19.0/applications/sales/sales/products_prices/ewallets_giftcards.html
- https://www.odoo.com/documentation/19.0/applications/sales/sales/products_prices/loyalty_discount.html