Vendors / Open source & self-hostable
uniCenta oPOS
dossier maintenance
- Claims in scope
- 278
- Scored
- 278
- Assessed
- 276
- Unknown
- 2
- Not applicable
- 36
- Values challenged
- 227
Identity
- Owner
- Jack Gerrard / uniCenta. No corporate entity, country of registration, or team size is disclosed on the site.
- Founded
- 2010 — began as founder Jack Gerrard's hobby project, forked from the Openbravo POS Java codebase; support-by-subscription introduced 2016. Source: https://unicenta.com/about/
- Scale
- Vendor claims 'over 1 million downloads since 2010' and presence in 100+ countries (claim-level, unicenta.com homepage). SourceForge shows ~997 downloads/week and 4.4/5 from 99 reviews (https://sourceforge.net/projects/unicentaopos/). Installed base, ARR, and market share: unknown — nothing public.
- Who it is for
- Single-site and very small multi-site retail, cafés, bars and casual restaurants run by technically self-sufficient owners or local resellers able to install Java + MySQL themselves. No evidence of any chain or franchise deployment; no enterprise motion.
- Site
- https://unicenta.com/
Pricing
transparency: published · unit: flat · processor lock-in: no
- Software
- Core software £0 under GPL3 (community build v5.0 via SourceForge). Paid tiers, all charged annually: BASE £6/month (£72/yr) — downloads + source code, update notifications, web reporting & remote order display, standard forum support, user/developer guides, beta access, API access, 10% rate discount. PLUS £12/month (£144/yr) — priority forum support, unlimited API access, 15% rate discount, limited developer support. HOSTED £15/month (£180/yr) — cloud hosting, iPad/Android browser access on a custom HTTPS URL, daily automated backups, email support, web firewall, automatic upgrades. A 'Hosted Monthly 50%' level is referenced on the developer page but is unpriced.
- Card processing
- quote-only. Vendor markets 'integrated card payments in the UK, EU and USA' and 'get paid the next business day' but publishes no rate, no interchange-plus markup, and names no processor. Subscribers get an unquantified '10%/15% rate discount'. Source: https://unicenta.com/card-payments/
- Contract
- Annual. Vendor states subscriptions last one year, can be cancelled at any time, and the software keeps working after expiry.
- Early termination
- None published, and CORRECTED 2026-09-05 - the earlier statement that no terms-and-conditions page was reachable was wrong. uniCenta publishes an 18,305-character Terms of Service (Brosley Ltd, last updated 8 May 2018) alongside a Privacy Policy and a Data Confidentiality Agreement, all read this session. It carries no early-termination fee and no minimum term; the subscription is prepaid and opt-in-renewal - "The plan s default option is to not automatically renew" - and the public pricing page states "Cancel your subscription at any time ... Absolutely no handcuffing you into any kind of recurring commitment". The exposure is the other way round, in Changes - "At any time uniCenta may supplement or amend these Terms of Service", with notice of fee changes given only "Out of courtesy" and no cap. Community 5.0 is GPL-licensed software with no counterparty and no fee of any kind on exit.
API posture
public API: partner-gated
- Cost to integrate
- API access is a paid subscription benefit: BASE £72/yr includes 'API access', PLUS £144/yr includes 'unlimited API access'. No free tier, no partner program, no revenue share, no certification.
- Webhooks
- None documented. The published Insomnia collection at docs.unicenta.com covers three resources — Customer, Order, Product — each with full CRUD including a bulk GET, under HTTP Basic auth against api.unicenta.io. No outbound events, no signing, no retry policy.
- Data export on exit
- Structurally the vendor's strongest property, but weaker than first recorded. The app runs against the operator's own MySQL database, so the operator already holds every transaction, customer and inventory row and can dump or query it with SQL at any time, subscription or not. No vendor data-hostage risk for self-hosted installs. Two qualifications apply. The table reference that documents what a dump contains is gated to Plus and Hosted subscribers, so the format is not freely documented; and the HOSTED tier's export mechanics are undocumented.
- Notes
- Corrected 2026-08-07: the API is NOT write-only. The published Insomnia collection defines GET /customer, GET /order and GET /product alongside the POST/PUT/DELETE verbs, so a documented read-out path exists — it is simply paid, since API access sits behind the BASE subscription. What the collection does not define is any response schema, pagination or field list, so the endpoints are enumerated without being specified. No OAuth (HTTP Basic only), no scopes, no published rate limits ('unlimited' at PLUS implies an unstated BASE limit), and no sandbox at all - CORRECTED 2026-09-05, the collection's dev base URL dev.unicenta.io does NOT resolve (status 0), while the prod host api.unicenta.io is live and discriminating (/customer /order /product answer 401, every other noun answers 400 'No static resource'), so the three documented resources are the whole live surface and no OpenAPI document is published. No API changelog or deprecation policy.
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
Restaurant mode, Table Management and Move Table documented; multiple floors with placed tables. No documented server-section assignment or table shape/capacity modeling. https://unicenta.com/features/ · 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
UPHELD after re-test. The word "seat" occurs once in the 246-doc first-party corpus, and it is a table-capacity field. Release 4.6 KEY CHANGES (self-dated "From 5th August 2018"), TABLES, VERBATIM: "Seats Button Width Button Height Seats Introduced to start the Guest management functionality which we ll introduce in a future version. Seats sets the default seating capacity for the table." That is an affirmative trajectory statement, not a bare absence, and the v5 generation shows where the trajectory landed: unicenta.com/features/differences/ (v5 delta, self-dated 10 March 2023) lists under Restaurant NEW "Assign number of diners to table" - a cover count per table, not a per-line seat tag - and the v5 release notes 5.0 through 5.4.0 (March 2023 to August 2025) add nothing seat-related. RULE 1 TEST APPLIED: I closed the gated-guide catalogue myself (unicenta.com/downloads/guides/ pages 1-3, probed 2026-09-05: exactly 20 login-walled v4-era guides - Product Attributes/Auxiliaries/Bundles/Barcodes/Import, Category Setup, Customer Setup/Import, Taxes, Configuration, Administrator, Hardware Installation, Web Reports, Database Transfer and 4 developer references). There is NO Restaurant or Sales guide in that set, so no gated document bears on seat-level order entry. GENERATION: primary quote is 4.6-era (2018), bounded forward to the 5.4.0 generation. EDITION: core POS behaviour, common to Community 5.0 GPL and the paid Brosley Ltd subscription. https://unicenta.com/unicenta-opos-release-4-6/ · retrieved 2026-09-05 adversarially verified
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
v4 generation. The /features/ SALES enumeration runs "Edit Receipt Edit Sales Free-entry Item In-sale Stock check Layaway Mixed Payment Move Table Partial Payment Product Lookup Receipt Notes Receipt Ticket Remote/Kitchen Print Refunds Reservations Split Receipts Table Management Tax change in line Transfer Order Item Variable Pricing" - no course, no hold, no fire. Paired v5-era bound per R2: /features/differences/ (10 Mar 2023) enumerates the whole v5 hospitality delta as "NEW Table access lock-out Multi-part kitchen order print Ticket change and delete permissions Print, reprint permissions Assign number of diners to table Table plan auto-refresh IMPROVED Ticket change remote print Reservations form" - again no coursing. Regexes over the 246-doc corpus (the whole crawlable site, NOT the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size, NOT the source): /course/i = 6 hits in 5 docs, ALL of them "of course" / "training course" / "course of dealing" (zero dining-course sense); /coursing/i = 0; /\bfire\b/i = 0; /\bhold\b/i = 6, all legal indemnity or "hold the titles"; /stagger/i = 0. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
SCORE CHANGE unknown→partial (a raise, not a cut — the enum has no 'upgrade-to-partial'). The features page lists 'Split Receipts' and 'Transfer Order Item' under Sales, so splitting a check and moving items between checks are documented. Split by seat or by arbitrary amount, and check merging, remain undocumented — hence partial, not yes. https://unicenta.com/features/ · retrieved 2026-08-01 adversarially verified
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
v4-leaning FAQ (it opens "still apply to earlier versions"), corroborated by a v5 document. The FAQ DOES document bar tabs: "Bars & Clubs At busy times a bar relies on users being able to rapidly access an item and ring it through. Use the Standard screen mode. Item buttons on the sales screen can be quickly resized to suit and bar tabs can be handled using the Layaways functionality." A tab is therefore a stacked layaway ticket, not a card pre-authorisation. v5-era bound per R2: /features/differences/ states "DEPRECATED Card payment gateways (PCI compliance)" - v5 pushed card handling out to acquirer terminals (Dejavoo / PaymentSense, plus UOCL-253 Teya), so the POS holds no card token to re-auth against. Regexes: /pre.?auth|preauth/i = 0; /incremental/i = 0; /\btab\b/i = 2 docs, only the FAQ bar-tab sentence and "tab=advanced" URL fragments in /woocommerce/; /stale/i = 0; /auto.?close/i = 0. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
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
Move Table exists and roles are permissioned; no audit log naming both employees is documented. https://unicenta.com/features/ · 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
Upheld and reinforced against an obvious trap: the features page does list 'Mobile POS', which could easily have been read as a handheld. The FAQ confirms iPad and Android devices require 'an RDP app' to reach a host installation, and only Windows tablets run the app directly. Remote desktop session, not a native handheld. https://unicenta.com/faqs/ · retrieved 2026-08-01 adversarially verified
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
Thick client on a local database keeps order entry and LAN printing alive offline, but the vendor publishes no offline statement.
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
RE-HOMED. The previous citation was /integrations/, a partner listing; scan-to-order writing into a server’s open check is built-in order-capture behaviour, not a partner, so the subject was outside that page’s category - and /integrations/ is in any case a floor rather than a census (it omits the Abacus Solutions International lottery integration announced at /lotteryeverywhere_plus_unicenta-opos/). The deciding first-party document is /api/, which states what an inbound order does: "Order API Send orders to uniCenta POS from other applications or directly through the API Develop applications that can connect with uniCenta POS layaways" - an inbound order lands as its own stacked layaway ticket, not as a write into an already-open server check. Generation: v5-era (the Order API ingest is UOCL-259 in 5.2 and the WooCommerce channel shipped in 5.4.0). Regexes over 246 docs: /\bQR\b|qr.?code/i = 3 docs, ALL ZATCA Saudi tax receipt printing (UOCL-217 "Print ZATCA QR-code on receipts", UOCL-283) - zero QR ordering; /self.?order|self.?service/i = 2 docs, a forum section heading and a third-party lottery case study; /scan to order/i = 0. Bounded to the crawlable site. https://unicenta.com/api/ · retrieved 2026-09-05 adversarially verified
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
v4-leaning FAQ, corroborated by the v5 delta. The FAQ closes the hardware surface twice over: "Devices POS Terminal Touchscreen preferred or a PC what you ve got Windows Tablet PC depends on capabilities Apple iPad or Android need an RDP app" and "Peripherals Report Printer Local or Networked Barcode Scanner USB, Serial Scanpal2 or compatible Cash Drawer via Cashdrawer kicker/Serial port via Printer Customer Display Serial 2 line x 20 char Mag Stripe Reader K board, Generic or Intelligent Receipt Printer Serial/Network/USB with Virtual COM installed ESC/POS, JavaPOS, SurePOS, Star, Ithica or compatible Weighing Scale Casio, Dialog1, Mettler, SamsungESP or compatible iButton USB (Windows only)" - eight peripheral classes, no kiosk enclosure and no guest-facing terminal. v5-era bound per R2: the /features/differences/ NEW list contains no kiosk. Regexes: /\bkiosk\b/i = 0 across all 246 docs; /accessibilit|WCAG|\bADA\b/i = 0 real hits (an unbounded /ADA/ control returned 4 docs, every hit inside "Canada" or "downloadable" - my own control carried the trap); /self.?order/i = 0. One near-miss worth naming: a customer case study says lottery players "can play via a button on a self-service till" - a customer's own deployment, not a uniCenta kiosk product. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
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
v4 generation, corroborated by v5. /features/ enumerates the operating modes exhaustively - "Mixed use Retail/Hospitality... Restaurant mode Retail mode... Supermarket mode" - and the SALES list runs to "Move Table... Table Management... Transfer Order Item": table-service and counter modes only, with no order-point / pay-window / pickup-window separation. v5-era bound per R2: /features/differences/ (10 Mar 2023) adds only "Table access lock-out... Assign number of diners to table Table plan auto-refresh" to the hospitality area. Regexes: /drive.?thru|drive.?through/i = 0 across all 246 docs; /menu board/i = 0; /\bheadset\b/i = 0; /pull.?forward|tandem/i = 0; /order point|pickup window|pay window/i = 0. https://unicenta.com/features/ · 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
v4 generation, corroborated by the 4.6 and 5.x release notes. /features/ closes the reporting surface at six families - "REPORTS Employee Customer Financial Inventory Sales Supplier" - none of them a service-time report, and there is no drive-thru to segment (see order-capture-drive-thru). Regexes: /speed of service/i = 0; /drive.?thru/i = 0; /order time|service time|ticket time/i = 0; /\btimer/i = 1 hit, and it is an unexpected one - release 4.6's "[ UOCL-85 ] Add timers to button Restaurant mode", a table-plan button occupancy timer. Nothing in the 5.x notes extends it and it is not tied to an order or a lane segment. https://unicenta.com/features/ · 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
Undated, v5-era. The partner page lists one live partner plus two empty slots, and is a floor rather than a census: "Our integrated partners... Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products... Learn More Coming Soon! Learn More Coming Soon!" No partner-program page names a voice vendor, and /features/add-ins/ closes the extension side identically - "Free Add-ins Official FREE uniCenta Add-ins. Plus Add-ins Available to uniCenta customers only. Third party Other non-uniCenta applications which are known to work with uniCenta oPOS... Coming Soon Coming Soon". Regexes (re-run by the audit): /\bvoice\b/i = 0 docs across all 246 - the word-boundary control returns a true zero; it is the UNBOUNDED /voice/ control that returns 3 docs, every hit the substring inside "invoice", so the trap is in the loose spelling, not the bounded one; /speech|IVR|conversational/i = 0; /phone order|call.?ahead/i = 0. FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · 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
v5-era first-party technical document; the WooCommerce channel shipped in 5.4.0. This is the only digital order channel uniCenta has, and the doc enumerates its entire configuration surface: "Plugin settings uniCenta menu plugins WooCommerce Webhook Secret: Use the same secret from setting up WooCommerce Domain: The web address of your WooCommerce Website. Must end with / Consumer Key: From the WooCommerce setup Consumer Secret: From the WooCommerce setup", then "Foreground Data Sync (manual)" and "Background Data Sync (automatic) uniCenta menu plugins API Enable the api for each type of data you want to sync in the background". Four settings and two sync modes - no per-channel capacity, no time slot, no quote-time extension, no threshold. Regexes: /throttl/i = 0 across all 246 docs; /capacity|time slot|quote time/i = 0; /pace|pacing/i = 0. https://unicenta.com/woocommerce/ · retrieved 2026-09-05 adversarially verified
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
UPHELD, with Rule 2 explicitly applied and the grade held at C rather than inflated. unicenta.com/features/ self-describes VERBATIM as "a quick-view list of uniCenta oPOS v4 core features" - it is BOTH superseded-generation AND self-disclaiming on its face ("quick-view", "core"), a stronger disclaimer than the audit brief credits it with - so it cannot carry this alone. Its SALES block reads VERBATIM "Access Levels Account Sale Account Settlement Customer Lookup Discounts Edit Receipt Edit Sales Free-entry Item In-sale Stock check Layaway Mixed Payment Move Table Partial Payment Product Lookup Receipt Notes Receipt Ticket Remote/Kitchen Print Refunds Reservations Split Receipts Table Management Tax change in line Transfer Order Item Variable Pricing". Three independent v5-era bounds carry it the rest of the way: (a) the vendor's own deferred-work nouns resolve elsewhere - Layaway is a held ticket ("being able to store recall partially completed orders we call them Layaways", unicenta.com/faqs/) and Reservations is table booking; (b) the complete v5 change record - features/differences/ (10 March 2023) plus release notes 5.0, 5.0.1, 5.1, 5.2, 5.3, 5.3.1, 5.3.2 and 5.4.0 to August 2025 - adds no future-dating or fire-time item, and the 5.2 injection lifecycle is receipt-driven ("Add orders received from the API into the layway"); (c) the publisher's 2024-04-17 Insomnia export POST /order body carries only products, priceExcludingTax, amount, tax and customerId. Corpus-wide zero for future-dated, pre-order, scheduled order, lead time and fire time. RULE 1: no gated guide in the closed 20-guide catalogue covers sales scheduling. Grade C because the enumerating document is the marketing feature page; re-homing to a B-grade URL would be grade inflation, not evidence. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
v4 generation, corroborated by v5. /features/ CUSTOMER enumerates "Account Management Address and Contact detail Barcode Credit Limit Customer Diary Customer Information Customer Store Card Discount % Label Printing Multi-Tax Categories On/Off Account Payments Photo Image Statement Transaction History VIP" and SALES adds "Account Sale Account Settlement... Layaway... Reservations" - an account, layaway and reservation apparatus, not a catering flow with an event schedule. Regexes: /catering/i = 0 across all 246 docs; /event schedul/i = 0; /balance due/i = 0; /\bquote\b/i = 1 hit, a roadmap CRM sentence on the homepage; /deposit/i = 2 hits, both the changelog line "Customer Payments Allow Customer to prepay or leave deposit on-accounts". https://unicenta.com/features/ · 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
Undated, v5-era. Partner floor (not a census): "Our integrated partners offer unique services that seamlessly integrate with uniCenta oPos... Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products Use Cases Table ordering at restaurants Clicks and collect Learn More Coming Soon! Learn More Coming Soon!" - a single e-commerce partner and two empty slots, so there is no marketplace to signal. The one integration's direction is inbound only: /woocommerce/ gives "Delivery URLs: (same URLS for create, update and delete) https://api.unicenta.io/woocommerce/customer https://api.unicenta.io/woocommerce/order https://api.unicenta.io/woocommerce/product". Regexes: /doordash|uber ?eats|grubhub|deliveroo|just ?eat|postmates/i = 0 across all 246 docs; /courier|marketplace|aggregator/i = 0; /order.?ready/i = 0. FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · 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
Role-based security levels gate actions; reason codes and a dedicated exception report are not documented. https://sourceforge.net/projects/unicentaopos/ · retrieved 2026-08-07
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
Score stands but the note is factually wrong: the vendor DOES publish a processor list. The FAQ names Dejavoo (Americas) and PaymentSense (UK/Ireland) as the supported providers, each requiring a merchant account with that provider. So it is not 'no gateway list published' — it is a list of exactly one processor per region, which is weaker for the operator than the dossier implies. https://unicenta.com/faqs/ · 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
Card payments page publishes no rate — only unquantified 10%/15% subscriber 'rate discounts'. https://unicenta.com/card-payments/ · 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
Same v4 Configuration reference and the same corpus zeros as menu-pricing-dual-pricing, read here against the storage and receipt requirement. The published product model is one Sell Price per product: SYSTEM OPTIONS verbatim "Set Tax included on startup : Controls how tax is applied to variable price Products in the sales screen" and "Allow Price updates : When checked allows dynamic update to Product prices when in the sales screen s Edit Line form". The receipt is fully configurable but only as text: COMPANY "Header 1 6 : Complete the text to be used in your receipt s header section. Footer 1 6 ..." and TICKET SETUP enumerates receipt number, prefix, pickup number length and print-off only - no cash/card total pair. Absence controls: /dual pricing|cash discount|cash-discount/i -> 0, /surcharg/i -> 0, /convenience fee/i -> 0 over 246 docs. The nearest published two-price mechanism is a downloadable v4 script, /downloads/scripts/ verbatim "Take Out script to handle a sales ticket line take out item Ideal for countries like Germany and Switzerland where Customer Off-premise purchases (like take outs) are offered at same as On-premise Sell Price including Tax" - a tax recalculation, not a cash/card pair. Bounded to the crawlable site; the gated v4 Administrator and Configuration guides are outside it. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
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
v4 Configuration reference plus the v5 delta. uniCenta does not operate the card rails at all, so there is no engine to hold guardrails: PAYMENT METHOD verbatim "Credit Card Payment gateways have been removed from uniCenta oPOS due to the latest PCI Regulations. These will now be available as plug-ins." and the operator picks an external terminal - "Payment Gateway : Default Not defined . Use the external option if you currently have a Credit Card terminal and wish to track card sales in uniCenta oPOS. Alternatively, set to PaymentSense if you are based in UK or Ireland ... Or, set to Dejavoo if you are based in USA or Canada". The v5-era bound is /features/differences/ (10 March 2023), whose payment block is a single line: "DEPRECATED Card payment gateways (PCI compliance)". Absence controls: /surcharg/i -> 0, /convenience fee/i -> 0, /\bBIN\b|debit card/i -> 1 and that hit is a substring false positive inside the 5.3.1 Trivy vulnerability dump, not a card product code. NOTE: this row does NOT rest on the FAQ line "At this time uniCenta oPOS only supports the Dejavoo and PaymentSense PCI/EMV compliant devices" - that sentence is falsified by release 5.1 UOCL-253 "Integrate with Teya Payment Terminal". Bounded to the crawlable site. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
All first-party payment terminals accept EMV chip and NFC contactless including Apple Pay and Google Pay.
payments-emv-nfc
UPHELD partial, note materially corrected. EMV is affirmatively claimed by the vendor in its own words, unicenta.com/faqs/ CARD PAYMENTS, VERBATIM: "From uniCenta oPOS version 4.4 we now include, as standard, a fully compliant and approved PCI/EMV P2PE PA-DSS solution using our posApps Plugin Manager for : Dejavoo USA, Canada, Mexico, Central and South America PaymentSense United Kingdom and Ireland". Corroborated by unicenta.com/pages/configure-unicenta-opos/: "For Credit card terminals used with our posApps plugin manager this needs to be set to EMV". PARTIAL, not yes, on three grounds: (a) uniCenta ships NO first-party terminal estate, so the rubric's subject does not exist - card entry is on third-party Dejavoo/PaymentSense/Teya hardware; (b) contactless, NFC, Apple Pay and Google Pay are named ZERO times across all 246 first-party documents; (c) whether those third-party terminals take contactless is a fact under contracts uniCenta neither publishes nor controls - the same reasoning I used to hold reliability-offline-card-auth at unknown, and I state the asymmetry deliberately: EMV is partial because uniCenta AFFIRMS it, not because a terminal probably does it. CORRECTION TO THE PROPOSAL: it treated the FAQ's "only supports the Dejavoo and PaymentSense" as a live closed enumeration. It is not - /faqs/ opens VERBATIM "Many of the FAQ s here still apply to earlier versions of uniCenta oPOS" and is v4-era throughout ("uniCenta oPOS v4.x series minimum fully supported screen size"), and the vendor's own 5.1 release notes (November 2023) add a third provider, "UOCL-253 Integrate with Teya Payment Terminal". The FAQ list is stale and demonstrably incomplete for 5.4.0. EDITION: posApps/PaymentSense/Teya plugins are subscriber-side; Community 5.0 ships the same core with no gateway. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
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 no, but on the ARCHITECTURAL leg only - I strike the proposal's primary leg. It relied on "Devices At this time uniCenta oPOS only supports the Dejavoo and PaymentSense PCI/EMV compliant devices through our posApps Plugin Manager" as a closed enumeration; that FAQ self-disclaims ("Many of the FAQ s here still apply to earlier versions of uniCenta oPOS") and is falsified by the vendor's own 5.1 release notes ("UOCL-253 Integrate with Teya Payment Terminal", November 2023), so it is neither closed nor current. What survives, and is sufficient: uniCenta has no phone-resident application that could take a tap. VERBATIM, unicenta.com/faqs/ Mobile Devices: "If you want to run uniCenta oPOS on an Apple iPad or Android tablet then that s possible too, though you will first need to install uniCenta oPOS on a host PC or server and then use an RDP client to connect to it", and the device table reads "Apple iPad or Android need an RDP app". The v5 generation confirms the platform set has not moved to phones - features/differences/ (10 March 2023) lists the NEW packaging as "Native Applications (Window, Mac OS and Linux) without the need to install java", with no iOS or Android build, and release notes through 5.4.0 add none. The standing record already carries order-capture-native-handheld = no/B on the same architecture. Vocabulary-complete zero across all 246 documents for tap to pay, SoftPOS, contactless, Apple Pay and Google Pay, spanning a decade of changelog and every v5 release note. RULE 1: no gated guide could conjure a phone runtime that the vendor's own v5 packaging list excludes. https://unicenta.com/faqs/ · 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
Vendor ships no handheld hardware, so there is no pay-at-table device. https://unicenta.com/features/ · 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
v4.6.4 release note (22 December 2021), first-party technical. The only QR code uniCenta has ever shipped is a fiscal receipt QR, verbatim: "UOCL-217 Print ZATCA QR-code on receipts ZATCA QR-code Usage Instructions ... Once you have install 4.6.4 you will see the Printer.Ticket has been updates to include the following line: ! qr-code ${ticket.printQRCode( header2 , header3 , VAT NO: )} /qr-code Uncomment the above ^ line to enable this feature This will print out the QR-Code based that the name will be in header line 2 and the vat number on line three" - a Saudi ZATCA tax-invoice QR carrying company name and VAT number, with no amount, no ticket id and no payment endpoint. Absence controls: /QR code|qr-code/i -> 3 and all three are the same ZATCA feature (4.6.4, the 5.3.1 bug "UOCL-283 ZATCA QR-code not printing", and the changelog entry "4.6.4 22 December 2021 ZATCA QR-Code printing"); /pay at table|pay-at-table/i -> 0 over all 246 docs. The standing rationale correctly notes Digital Receipts exist, and the homepage describes that plugin as "DIGITAL RECEIPTS Real receipt copy. Strengthen your customer connection and reinforce your brand" - a copy of a closed receipt, issued after payment. Generation: v4.6.4 primary, still referenced in v5.3.1, so current. https://unicenta.com/unicenta-opos-release-4-6-4/ · retrieved 2026-09-05 adversarially verified
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
UPHELD. Rule 2 acknowledged: the cited settings reference is v4-only and self-disclaims VERBATIM "As uniCenta oPOS evolves you may find that new options are shown on the Configuration panel tabs and not shown here." It is not carrying this alone. Three further legs: (1) tip and gratuity appear NOWHERE in the 246-document corpus as a payment concept - the only regex hit is "Tooltips" in the changelog - and that zero spans every v5 release note through 5.4.0 (August 2025); (2) the vendor's near-noun is a fixed service charge, which v5 shipped as a NEW feature ("Service Charge Option", features/differences/, 10 March 2023) and the settings reference defines VERBATIM: "Enable Service Charge : Used together with the special xxx988 Product to add (optional) fixed charge to a sales transaction. Service Charge Rate ?% : The rate to charge. This value should be net of Tax. Restaurant mode only? : Will only be applied when Restaurant screen is used." A fixed percentage charge is not a tip prompt and cannot be adjusted post-authorisation; (3) POSITIVE ARCHITECTURAL BAR from an ungated page: "Credit Card Payment gateways have been removed from uniCenta oPOS due to the latest PCI Regulations. These will now be available as plug-ins." uniCenta holds no authorisation of its own, so there is nothing for it to tip-adjust or batch. RULE 1: the Configuration and Administrator guides are login-walled, but a tip prompt is a sales-screen behaviour the v5 change record would name. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
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
There is no tip object anywhere in the product, so there is nothing to pool. Absence controls over the vendor vocabulary across all 246 docs: /tip\b|tips\b|gratuity/i -> 1 and the single hit is the substring inside "Tooltips translation" in the changelog; /tronc|pool/i -> 0; /declared tip|tip out|tip share/i -> 0; /payroll/i -> 0. The vendor substitute is a flat service charge, v4 Configuration reference > SYSTEM OPTIONS > Automatics verbatim: "Enable Service Charge : Used together with the special xxx988 Product to add (optional) fixed charge to a sales transaction. Service Charge Rate ?% : The rate to charge. This value should be net of Tax. Restaurant mode only? : Will only be applied when Restaurant screen is used." That is a percentage uplift booked to a dummy product, with no employee attribution and no distribution rule. v5-era bound: /features/differences/ (10 March 2023) lists "Service Charge Option" under NEW, confirming the flat charge is the current and only mechanism. Bounded to the crawlable site. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
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
UPHELD, with the scope narrowed and the boundary against reliability-offline-card-auth stated explicitly, because those two cells look like a contradiction and are not. This rubric requires the POS to capture card payments offline AND to expose configurable per-transaction and cumulative offline limits. Both limbs are foreclosed by a positive vendor statement on an ungated first-party page, VERBATIM: "Credit Card Payment gateways have been removed from uniCenta oPOS due to the latest PCI Regulations. These will now be available as plug-ins." uniCenta does not touch the card data path, so it has nothing to store and nothing to forward, and no floor-limit setting could exist for it; the PAYMENT METHOD tab enumerates exactly two settings, Card Reader and Payment Gateway. Corpus-wide zero for store-and-forward across 246 documents; the single "offline" hit is unrelated (release notes moving from offline to online publication). I DO NOT extend this to the third-party terminal: whether a Dejavoo, PaymentSense or Teya device does its own store-and-forward is a fact under contracts uniCenta neither publishes nor controls, and that is exactly why reliability-offline-card-auth stays unknown/F. This cell says uniCenta cannot; that cell says nobody has told us what the terminal does. SCOPE: card capture only - the standing order-capture-offline-order-entry = partial (thick client against a local database) is untouched, and I note that the proposal for labor-offline-time-punch misread the same page's MySQL requirement as a connectivity requirement, which it is not. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
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
Terms of Service (Brosley Ltd, 8 May 2018, 18 KB) - the surface where liability would be allocated if it were allocated anywhere. This criterion is about publication, and the corpus-wide controls settle it: /offline|off-line/i -> 2 across all 246 docs and neither concerns transactions (the FAQ "on-line and off-line support services", and a 2018 news line "The divide between on-line/off-line Click Mortar we often talk about is narrowing"); /store.and.forward/i -> 0. The ToS says nothing about payment risk and instead caps everything, verbatim: "FREE ACCOUNT HOLDERS: YOU AGREE THAT THE AGGREGATE LIABILITY OF UNICENTA TO YOU FOR ANY AND ALL CLAIMS ARISING FROM THE USE OF THE UNICENTA SERVICES IS LIMITED TO TEN (10) BRITISH POUNDS. ... ALL OTHER ACCOUNT HOLDERS: ... LIMITED TO LOWER OF: a) THE AMOUNTS YOU HAVE PAID TO UNICENTA DURING THE THREE MONTH PERIOD PRIOR TO SUCH CLAIM, FOR ACCESS TO AND USE OF THE UNICENTA SERVICES, OR b) FIFTY (50) BRITISH POUNDS." There is also no store-and-forward to allocate: card authorisation happens on the third-party terminal (v4 Configuration reference: "Payment Gateway ... Use the external option if you currently have a Credit Card terminal and wish to track card sales in uniCenta oPOS"). Generation: the legal doc is version-neutral and predates v5; the payment architecture it presumes is unchanged through 5.4.0. Edition: Brosley Ltd paid subscription terms; the Community GPL build has no service terms at all. https://unicenta.com/about-unicenta-opos-point-of-sale/terms-service/ · retrieved 2026-09-05 adversarially verified
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
SCORE CHANGE unknown→partial (a raise). Beyond the 'Customer Store Card' the researcher found, the features page also lists 'Voucher management' as a system feature. Some stored-value construct is documented; balance mechanics, cross-location and online redemption are not. https://unicenta.com/features/ · retrieved 2026-08-01 adversarially verified
House/on-account tabs with per-account credit limits, running balance, and periodic statement or invoice generation.
payments-house-accounts
The note's stated gap is wrong. The features page lists 'Statement' explicitly under customer data, together with 'Account Sale', 'Account Settlement', 'Credit Limit' and 'Transaction History'. Charge accounts with balances and statements are enumerated; the researcher missed the Statement line. https://unicenta.com/features/ · retrieved 2026-08-01 adversarially verified
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
'Multi-Payment' allows several tenders on one sale; split by seat/item/even shares and any cap are undocumented. https://unicenta.com/features/ · 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
Role-based security levels gate privileged actions; an immutable audit log identifying the approver is not documented. https://sourceforge.net/projects/unicentaopos/ · retrieved 2026-08-07
In-product dispute/chargeback dashboard that lists open disputes and allows evidence submission assembled from the POS transaction record. differentiator
payments-chargeback-tooling
v4 Configuration reference plus the v5 delta; uniCenta is not the acquirer and holds no dispute record. Verbatim: "Credit Card Payment gateways have been removed from uniCenta oPOS due to the latest PCI Regulations. These will now be available as plug-ins" and the operator connects a Dejavoo, PaymentSense or (from 5.1, UOCL-253) Teya terminal. Absence controls: /chargeback|charge-back|dispute/i -> 1 across all 246 docs, and that hit is the Terms of Service account-ownership clause "in the event of any dispute regarding ownership of or entitlement to access your account, uniCenta will defer to the current nominated Account Owner" - not a card dispute. The only in-product dashboard published is the subscriber plugin dashboard (release 5.2 bug "UOCL-261 Plugin dashboard loads when subscriber not logged in") and the deprecated v4 WordPress Web Reports SALES DASHBOARD. v5-era bound: /features/differences/ (10 March 2023) "DEPRECATED Card payment gateways (PCI compliance)". Bounded to the crawlable site. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
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 - a genuine vocabulary trap, correctly resolved, and the architectural bar is decisive. The uniCenta customer record carries a field literally named "card" (publisher's 2024-04-17 Insomnia export, POST /customer: "card": "987948724" alongside accountId, maxDebt, discount, vip), but the vendor defines it VERBATIM on the cited page: "Card Reader : Default Not defined . Used for User and Customer legacy Magnetic Card Readers." It is a loyalty/store-card number, not a PAN. The /features/ CUSTOMER block confirms the model is account credit - "Account Management Address and Contact detail Barcode Credit Limit Customer Diary Customer Information Customer Store Card Discount % Label Printing Multi-Tax Categories On/Off Account Payments Photo Image Statement Transaction History VIP". POSITIVE BAR, same page and ungated: "Credit Card Payment gateways have been removed from uniCenta oPOS due to the latest PCI Regulations" - with no card data path there is nothing to tokenise. Corpus-wide zero for token, tokenise, tokenize and card on file across all 246 documents and every v5 release note; and the rubric's reuse limb (across online ordering, phone orders and in-store) fails independently because WooCommerce is the only channel (unicenta.com/integrations/, remaining slots "Coming Soon!"). RULE 2: the settings page is v4 and self-disclaiming, but the removal-of-gateways statement is echoed in the v5 delta ("DEPRECATED Card payment gateways (PCI compliance)", features/differences/, 10 March 2023), so the bar is current. https://unicenta.com/pages/configure-unicenta-opos/ · 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
Claims 'get paid the next business day' but publishes no deposit schedule, cutoff times, or instant-funding option. https://unicenta.com/card-payments/ · 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 unknown, and I record why this cell differs from reliability-pci-dss-4-attestation, which I let stand as no - the two rubrics turn on different verbs. THIS rubric asks whether the vendor PROVIDES P2PE and makes a current AoC or P2PE listing available to merchants ON REQUEST. Availability on request is not observable from outside, so no is not reachable. The vendor's claim exists and is stale: unicenta.com/faqs/ CARD PAYMENTS, VERBATIM, "From uniCenta oPOS version 4.4 we now include, as standard, a fully compliant and approved PCI/EMV P2PE PA-DSS solution using our posApps Plugin Manager". PA-DSS was retired by the PCI SSC in October 2022 and replaced by PCI SSF, so the standard invoked is defunct and the claim predates PCI DSS 4.x entirely; the page itself self-disclaims currency ("Many of the FAQ s here still apply to earlier versions of uniCenta oPOS") and features/differences/ (10 March 2023) reads "DEPRECATED Card payment gateways (PCI compliance)". A stale unverifiable first-party claim blocks a no as surely as it fails to support a yes. Grade F, unknown. || 329th: 329th, NEW SURFACES, CELL NOT MOVED - but the stale FAQ claim the standing note leans on is now superseded by the vendor's own current pages, and nothing replaces it. (1) uniCenta's LIVE card-payments product page, fetched today (171,194 B), says in full: `uniCenta provides integrated card payments in the UK, EU and USA / No manual entries / Reduce time to complete payment / Get paid the next business day / Accept all major payment methods / Get your card machine now` - no encryption, PCI, P2PE or attestation language of any kind. (2) A tokenised control over the 12 commercially relevant pages of the 101-URL unicenta.com page-sitemap census (1,589,994 B: card-payments, payments-sign-up, api, customer-api, integrations, features, features/differences, woocommerce, 5.4.0 release, Terms of Service, GDPR, Data Confidentiality) returns p2pe 0, `pa dss` 0, attestation 0, encrypt* 0, tokenis*/tokeniz* 0; the three `pci` hits are inside script/tag bytes of features/ and features/differences/ and do not appear in the stripped prose = POISON. (3) WHAT THE PRODUCT ACTUALLY SHIPS, from the posApps plugin 1.3.3 jar (repo.unicenta.org/maven2, 460,041 B): card payments are semi-integrated third-party cloud terminals, not a uniCenta encryption product - Dojo/PaymentSense (PaymentSenseConfig.fxml: Device Id, Security Key, URL), Teya (TeyaConfig.fxml: Request Token, Store Id, Terminal Id) and MediaPayments (apiKey, Secret, Serial Number), each driving a `Processing Payment` / `Cancel Payment` screen via CloudTransactionRequest/AuthRequest classes. So any P2PE listing would belong to the acquirer, not to uniCenta. (4) I could not census the PCI SSC listings: listings.pcisecuritystandards.org now 307s to www.pcisecuritystandards.org, whose /assessors_and_solutions/point_to_point_encryption_solutions(/?accept=true) page renders the table client-side (638,986 B raw, 9,014 B of stripped prose, all navigation), its wp/v2/types has no listing post type, and its only admin-ajax actions are get_faqs / get_participating_orgs. So the authoritative registry remains unbounded and the `available to merchants on request` conjunct remains unobservable - still unknown, not no. Retrieved 2026-09-18. 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
Remote/kitchen print plus multiple printers supports category routing; per-location rule config and order-type or revenue-center routing undocumented. https://unicenta.com/features/ · retrieved 2026-08-01
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
uniCenta Remote Order Display Source Code package (unicenta.com/packages/remote-order-display-source-code/ -> uniCenta_Remote_Display.zip, Beta1 JavaFX source with README of 14 January 2017 and a built jar of 2017-01-12 classes; retrieved 2026-09-13; Beta1 artefact only, the login-walled binary last updated 24/01/2019 may differ). STATIONS AND A CONSOLIDATED VIEW EXIST. Each orders row carries a displayid, which the POS takes from the ticket line's 'display' property (default 1). This is in uniCenta_change_code.txt kitchenOrderScreen, and the same logic ships in uniCenta oPOS 5.4.0 JPanelTicket.remoteOrderDisplay. A display normally filters 'WHERE displayid = <screen.displaynumber>'. When the property screen.allorders is true, it instead selects every display's rows, grouped by orderid (DataLogicRemoteDisplay.readDistinctOrders / selectByOrderId), so one screen can show an order's items from all stations. COMPLETION IS NOT GATED. In all-orders mode, Complete Order runs 'DELETE FROM orders WHERE orderid = :id', removing every station's rows at once whether or not those stations are finished. In per-display mode it deletes only that display's rows, and nothing records whether other stations have finished. There is no per-station bump state, and completetime is never written on completion (tokenised: bump 0, expo 0). screen.allorders does not appear on the configuration screen (database.fxml / DatabaseController) and is read only in DataLogicRemoteDisplay, so it has to be set by hand in the properties file. The display also labels its own close option 'Auto-Close THIS station Orders'. A consolidated view exists; station-gated completion does not: partial. https://unicenta.com/packages/remote-order-display-source-code/ · retrieved 2026-09-13 adversarially verified
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
v4 generation, corroborated by v5. Coursing is a POS-side ticket concept, and the /features/ SALES enumeration closes the ticket area: "Edit Receipt Edit Sales Free-entry Item In-sale Stock check Layaway Mixed Payment Move Table Partial Payment Product Lookup Receipt Notes Receipt Ticket Remote/Kitchen Print Refunds Reservations Split Receipts Table Management Tax change in line Transfer Order Item Variable Pricing". The v5-era bound per R2 is /features/differences/, whose hospitality delta is "NEW Table access lock-out Multi-part kitchen order print Ticket change and delete permissions Print, reprint permissions Assign number of diners to table Table plan auto-refresh IMPROVED Ticket change remote print" - kitchen output is a print that fires on ticket change, with no held course. Regexes: /course/i = 6 hits, all "of course" or "training course"; /\bfire\b/i = 0; /\bhold\b/i = 6, all legal boilerplate; /send to kitchen/i = 0. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
uniCenta Remote Order Display Source Code package (unicenta.com/packages/remote-order-display-source-code/ -> uniCenta_Remote_Display.zip; Beta1 JavaFX source with README of 14 January 2017, functionally matching jar of 2017-01-12 classes; retrieved 2026-09-13; bounded to this artefact, the login-walled binary last updated 24/01/2019 may differ), plus uniCenta oPOS 5.4.0 as shipped (lestola/unicenta-mirror-5.4@8771d24). Neither half of the rubric exists. First, no cook time is configurable. The 5.4.0 products table has no cook, prep or time column; its kitchen-related fields are display and printto, which are routing. The kitchen-order row has no cook-time or start-time field either (id, orderid, qty, details, attributes, notes, ticketid, ordertime, displayid, auxiliary, completetime). Second, there is no staggering. 5.4.0 remoteOrderDisplay deletes the order and inserts every ticket line in one pass. The display orders its panels by ordertime and its items by auxiliary, and shows an item as soon as its row is present; there is no delayed release. The only timing configuration is the three WAITING / OVERDUE / URGENT colour thresholds (limit.wait / limit.overdue / limit.urgent), which are per installation and apply to whole orders. Tokenised controls over the display's 42 non-library, non-IDE text files: cook 0, prep 0, preparation 0, stagger 0, pace 0, course 0, fire 0. No. https://unicenta.com/packages/remote-order-display-source-code/ · retrieved 2026-09-13 adversarially verified
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
v5-era first-party technical document; the webhook channel shipped in 5.4.0 ("UOCL-301 Integrate uniCenta API with WooCommerce Customer Webhook", "UOCL-302... Order", "UOCL-303... Product"). The complete configuration surface of that channel is "Webhook Secret... Domain... Consumer Key... Consumer Secret" plus "Foreground Data Sync (manual)" and "Background Data Sync (automatic) uniCenta menu plugins API Enable the api for each type of data you want to sync in the background" - an on/off switch per object type, with no volume threshold, no release delay, and no quoted prep time to extend. Regexes: /throttl/i = 0; /pace|pacing/i = 0; /quote time|ticket time/i = 0. https://unicenta.com/woocommerce/ · retrieved 2026-09-05 adversarially verified
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
Undated, v5-era. Partner floor (not a census): "Our integrated partners offer unique services that seamlessly integrate with uniCenta oPos... Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products Use Cases Table ordering at restaurants Clicks and collect Learn More Coming Soon! Learn More Coming Soon!" The single partner is an e-commerce store, and the v5-era /woocommerce/ doc shows the sync direction is WooCommerce-to-uniCenta - "Delivery URLs... https://api.unicenta.io/woocommerce/customer https://api.unicenta.io/woocommerce/order https://api.unicenta.io/woocommerce/product" - inbound, three objects, no availability push. Regexes: /doordash|uber ?eats|grubhub|deliveroo|just ?eat/i = 0 across all 246 docs; /eighty.?six/i = 0 and a bare /86/ control returned only "linux-x86" installer filenames, a reader artefact; /out of stock/i = 1, a Web Reports stock report heading; /pause|snooze|store closed/i = 0. FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · retrieved 2026-09-05 adversarially verified
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
Undated, v5-era. The same partner floor - "Our integrated partners... Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products... Learn More Coming Soon! Learn More Coming Soon!" - so there is no marketplace to call back to, and /woocommerce/ documents delivery URLs pointing into uniCenta ("https://api.unicenta.io/woocommerce/order") rather than out of it. The kitchen display itself, the PLUS-subscriber Remote Order Display beta, is described in the changelog only as a monitor "for restaurants, QSR or take-away businesses" with no status callback. Regexes: /doordash|uber ?eats|grubhub|deliveroo/i = 0; /order.?ready|status callback/i = 0; /\bbump\b/i = 0 across all 246 docs. FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · 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
uniCenta Remote Order Display Source Code package (unicenta.com/packages/remote-order-display-source-code/ -> uniCenta_Remote_Display.zip; Beta1 JavaFX source with README of 14 January 2017 plus a functionally matching jar of 2017-01-12 classes; retrieved 2026-09-13; bounded to this artefact, the login-walled binary last updated 24/01/2019 may differ). The only input path is the pointer. RemoteDisplayController selects an order through order0items..order7items.setOnMouseClicked and completes it with the Complete Order button. setOnMousePressed / setOnMouseDragged are used only to drag the window. No key handler exists anywhere in the source or in the compiled RemoteDisplayController.class (no KeyEvent, setOnKey or KeyCode). A bump bar, which presents as a keyboard, would have nothing to drive. Tokenised controls over the 42 non-library, non-IDE text files: keypad 0, keycode 0, bump 0. The single 'keyboard' token is a comment, '// Save the keyboard mappings', in the configuration form's save routine; the single 'pressed' token is a CSS :pressed state (both poison). README names no peripheral ('Tested only on Windows 10 / MySQL only supported at this stage / NO User Guide available'). No bump-bar or keypad support and no documented models: no. https://unicenta.com/packages/remote-order-display-source-code/ · retrieved 2026-09-13 adversarially verified
An all-day view aggregates outstanding quantities per item (and per modifier) across all open tickets on the station.
kitchen-all-day-counts
uniCenta Remote Order Display Source Code package (unicenta.com/packages/remote-order-display-source-code/, anonymous download, created 07/01/2021 -> uniCenta_Remote_Display.zip; Beta1 JavaFX source, README of 14 January 2017, source files stamped 2020-02-17, and a built jar of 42 entries dated 2017-01-12; retrieved 2026-09-13). The compiled classes carry the same functional strings as the source. The only difference found is a 'Test + Create' button present in the source database.fxml but not in the jar. This is the complete UI of the display as uniCenta published it. The absence is bounded to that artefact; the login-walled binary (package page 'Version Beta1 ... Last Updated 24/01/2019') still lists the same three components: 'Remote Order popup Remote Display Remote Config File'. remotedisplay.fxml defines eight order panels (order0..order7: id label, time label, item ListView), an 'Orders Waiting' list of ticket ids for overflow orders, a clock, and Exit and Recall buttons. A 'Complete Order' button's label is set at runtime. buildOrderPanels fills each panel with '<qty> - <details>', ' * <attributes>' and ' ** <notes>' for one order. No query sums quantities across orders: DataLogicRemoteDisplay's only reads are SELECT DISTINCT orderid, ordertime and the rows for one orderid. The companion OrderPop app lists 'orderid - ordertime - details' rows, also unaggregated. Tokenised controls over the 42 non-library, non-IDE text files: aggregate 0, total 0, sum 0, summary 0, day 0; the single 'count' token is OrderPop's SQL count(*) (poison). No. https://unicenta.com/packages/remote-order-display-source-code/ · retrieved 2026-09-13 adversarially verified
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
uniCenta's Remote Order Display Source Code package (unicenta.com/packages/remote-order-display-source-code/: 'Version 0.1 ... Create Date 07/01/2021 Last Updated 07/01/2021', anonymous Download, unlike the login-walled binary package at /packages/remote_order_display/, 'Version Beta1 ... Last Updated 24/01/2019 Please login to download') yields uniCenta_Remote_Display.zip: JavaFX source plus a built unicenta_remotedisplay.jar (42 entries dated 2017-01-12). README.txt: '14th January 2017 Release: Beta1 ... DO NOT use in production environment!'. Retrieved 2026-09-13. The evidence is this Beta1 artefact; the walled binary may differ. The display has configurable visual escalation. The configuration screen (database.fxml) has three minute spinners (0-50) with tooltips 'Set - in minutes - remote display visual colour lower limit' / '... intermediate limit' / '... upper limit alert', stored as limit.wait / limit.overdue / limit.urgent. Each order panel also shows a running mm:ss elapsed timer. RemoteDisplayController.buildOrderPanels compares minutes since ordertime against the limits and relabels the order '<ticket> WAITING ', ' OVERDUE ' or ' URGENT! '. The CSS ids textwaiting / textoverdue / texturgent carry backgrounds -flatter-blue / -flatter-green / -flatter-red (flatterfx.css). The compiled 2017 class carries the same strings. Why partial: (1) the thresholds live in one properties file in the OS user's home directory, alongside screen.displaynumber. A station gets its own targets only if it runs its own installation, and those targets apply to every order on that display whatever its order type. (2) Escalation is per order, not per item. (3) There is no audible alert: tokenised controls over the 42 non-library, non-IDE text files find sound 0, audio 0, beep 0, audible 0, alarm 0. (4) The product is a Beta marked not for production, sold only to PLUS subscribers per unicenta.com/apply/. AppConfig's built-in defaults set limit.wait three times and never set limit.overdue or limit.urgent, so the configuration step must be run before the display works. https://unicenta.com/packages/remote-order-display-source-code/ · retrieved 2026-09-13 adversarially verified
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
DOWNGRADED FROM GRADE A AND RE-HOMED OFF insomnia.json, verdict held at no. The proposal reasoned from the absence of a second printer field in the publisher's 2024-04-17 Insomnia export ("printer": "1"). I reject that instrument: the export is a 14-request hand-made developer collection whose bodies are typed examples with joke data ("Jeo Blogs", "new product 2 API"), with no response schemas and no OpenAPI document; its POST /order body carries four fields and no table, discount, payment or ticket, all of which uniCenta demonstrably has. Absence of a field there cannot bound the desktop application, and grade A - the project's strongest - is indefensible for it. What DOES carry the verdict, at grade B: the vendor's complete printer surface is enumerated on two independent first-party documents and contains no standby role. VERBATIM, cited page, PERIPHERALS: "Printer : This is usually your main receipt printer but you can choose any printer even if it is a remote network printer. Printers 2 6 : Same applies as the the main Printer though any of these may be either directly attached or on a network." and "Reports Printer : A locally attached or network printer." The FAQ states the ceiling: "uniCenta oPOS can handle 6 directly attached or network printers + a report printer (local or network)" - six independently addressed destinations, not a primary/standby pair. RULE 2 SATISFIED by a second v5-era bound: the whole v5 print delta is "Multi-part kitchen order print ... Remote print only allowed on ticket change ... Print, reprint permissions" (features/differences/, 10 March 2023), and release notes 5.0-5.4.0 add nothing. Vocabulary-complete zero for fallback, failover, fail-over, backup printer and redundan- across all 246 documents including the 21,991-char changelog, which records printer bugs in fine detail. CAVEAT: the KDS half of the rubric (fail over to a designated backup SCREEN) is not measurable - the ROD has no functional documentation - so this rests on the printer half; scored identically to reliability-printer-fallback, which is the same question. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
KDS continues to receive and display tickets from on-site POS terminals when the internet or cloud backend is unreachable. differentiator
kitchen-offline-operation
LAN-served displays would survive an internet outage by architecture, but no offline KDS behavior is documented.
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
uniCenta Remote Order Display Source Code package (unicenta.com/packages/remote-order-display-source-code/ -> uniCenta_Remote_Display.zip; Beta1 JavaFX source with README of 14 January 2017, functionally matching jar of 2017-01-12 classes; retrieved 2026-09-13; bounded to this artefact, the login-walled binary last updated 24/01/2019 may differ). Each item is one orders row whose only text fields are details varchar(255), attributes varchar(255) and notes varchar(255) (MySQL-createOrdersTable.sql; the same columns ship in uniCenta oPOS 5.4.0 MySQL-orders-table.sql). The 5.4.0 POS fills them with getProductName(), getProductAttSetInstDesc() (the line's attribute-set-instance description, one string) and the line's 'notes' property. The display prints '<qty> - <details>', then ' * <attributes>' if non-empty, then ' ** <notes>', and nothing else. There is no recipe, portion or assembly data anywhere in the schema or the display (tokenised: recipe 0, portion 0, assembly 0 over the 42 non-library text files). Options are not broken out one per line: the display reproduces the ticket line's own name, attribute string and note. That is the ticket line text the rubric excludes. No. https://unicenta.com/packages/remote-order-display-source-code/ · retrieved 2026-09-13 adversarially verified
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
RE-HOMED off the print template onto the Remote Order Display source, because the rubric is a disjunction (make-line screen OR ticket) and the screen is the half the proposal left uncited. Both halves close, and the screen half closes on its own instrument. SCREEN: the ROD render loop, RemoteDisplayController lines 435-442, emits exactly three concatenated strings per order row - (order.getQty() > 1 ? order.getQty() + " - " : "") + order.getDetails(), then " * " + order.getAttributes() when non-empty, then " ** " + order.getNotes() when non-null. Its row model com/unicenta/dto/Orders.java maps the orders table as ( id, orderid, qty, details, attributes varchar(255), notes varchar(255), ticketid, ordertime, displayid, auxiliary, completetime ) and DataLogicRemoteDisplay selects exactly those columns. No section, half, quadrant or placement primitive exists, and the renderer carries no geometry - a quantity and three free-text lines prefixed " * " and " ** ". TICKET: Printer.TicketRemote.xml (5.4.0 @8771d24, read whole) renders per line only ${ticketline.printMultiply()}x plus the product name, prefixing an auxiliary with two dashes via #if ($ticketline.isProductCom()), and, when present, one indented ${ticketline.productAttSetInstDesc} line; the ingredients and notes lines ship commented out. WHY THIS IS NOT THE TILL FINDING BANKED TWICE: the entailment - a display cannot show a section the order model cannot express - IS the same fact, and is deliberately not what carries this cell. What carries it is that even where placement text CAN reach the kitchen (a merchant naming a product "L/H Pepperoni", or typing it into notes), the screen and the ticket both render it as an undifferentiated text line with no visual segmentation, which is exactly the text-only-modifier failure the rubric names. The verdict therefore does not depend on the login-walled Product Attributes / Auxiliaries guides that keep menu-pricing-fractional-placement and menu-pricing-half-and-half-rule at unknown; it is measured on the two shipped renderers. CONTROLS, TOKENISED, BINARIES EXCLUDED (git grep -I -w over 5.4.0 src at the pinned commit; grep -rIw over the ROD tree): 5.4.0 - half/halves/quarter/pizza/topping/toppings/placement/crust/portion/fractional = 0 files; section = 1 file, a code comment in JPanelTicket.java ("Use this section to add more case statements"). ROD - half/quarter/halves/pizza/topping/toppings/placement/crust/portion/fraction/fractional = 0 files; section = 6 files, ALL SIX NetBeans scaffolding (nbproject/build-impl.xml, build-impl.xml~, jfx-impl.xml and three jfx-impl_backup*.xml), 0 in src; slice = 4 files, 0 in src; left/right = 0 in src and locales. The sibling verifier's jar warning is confirmed and defused: the raw half/section/pci/segment/recency hits are compressed bytes inside bundled third-party jars (derbyclient, hibernate-core-4.3.10, hsqldb, javassist, mysql-connector, liquibase) and vanish under -I. NOT BOUNDED: third-party KDS add-ins - unicenta.com/features/add-ins/ is the vendor's own statement that Free, Plus (customers-only) and Third-party extension surfaces exist while enumerating NONE of them (every slot reads "Coming Soon"), so this is a floor, not a closed list; the Plus/hosted and web tier, never inspected for a KDS at all (the web-reporting add-in inventory is reporting only); and the login-walled ROD binary last updated 24/01/2019, which may differ from this 0.1 source package (posted 07/01/2021, JavaFX source dated 2017). https://unicenta.com/packages/remote-order-display-source-code/ · retrieved 2026-09-15 adversarially verified
A bumped ticket can be recalled/unbumped, and an individual item can be refired or reprinted without re-entering the order.
kitchen-recall-refire
uniCenta Remote Order Display Source Code package (unicenta.com/packages/remote-order-display-source-code/ -> uniCenta_Remote_Display.zip: JavaFX Beta1 source, README dated 14 January 2017, built jar of 2017-01-12 classes; retrieved 2026-09-13; Beta1 artefact, the login-walled binary last updated 24/01/2019 may differ). RECALL IS PRESENT. handleCompleteOrder deletes the selected order's rows and pushes them onto a FixedStack, whose size is the 'Items in history' spinner (recall.historycount, fallback 10, locale comment '#Number of orders in Recall list'). When full, the stack drops its oldest entry. The 'Recall' button is visible only when the stack is non-empty and is hidden in 'monitor' mode. It pops the most recently completed order and re-inserts every row via createOrder, with the original ordertime, prefixing the ticket id 'RECALLED: '. Why partial: recall is LIFO and whole-order only. An older completed order cannot be chosen, nor a single item, and the display has no per-item refire or reprint (tokenised: refire 0, reprint 0 over the 42 non-library text files). On the POS side, uniCenta oPOS 5.4.0's Remote Print button runs script.SendOrder, which prints Printer.Ticket.P1-P6 for lines whose 'ticket.updated' property is 'true'. It then calls remoteOrderDisplay(), which deletes and re-inserts every line of the ticket. Re-sending therefore re-fires the whole ticket, not a chosen item. No documented single-item refire was found. https://unicenta.com/packages/remote-order-display-source-code/ · retrieved 2026-09-13 adversarially verified
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
uniCenta oPOS 5.4.0 source (GitHub mirror lestola/unicenta-mirror-5.4 at commit 8771d24, '5.4.0 release' 2025-07-31; retrieved 2026-09-13), read together with the Remote Order Display Beta1 source (unicenta.com/packages/remote-order-display-source-code/, whose login-walled binary was last updated 24/01/2019 and may differ). In 5.4.0 the Remote Print button (j_btnRemotePrtActionPerformed) runs script.SendOrder and then remoteOrderDisplay(). That method first calls dlSystem.deleteOrder(id), which is 'DELETE FROM orders WHERE ORDERID = ?' in DataLogicSystem. It then re-inserts every ticket line, passing null for ORDERTIME, so an edited order re-enters the display with a fresh order time and a restarted timer. The source's own comment reads: 'this block for future - right now we're deleting all ticketlines and resending for consistency with actual ticketlines', above a commented-out updateOrder call. The shipped orders table has no status, change or void column (MySQL-orders-table.sql: id, orderid, qty, details, attributes, notes, ticketid, ordertime, displayid, auxiliary, completetime), so no added, changed or removed marker can reach any display. The Beta1 display renders every row identically; its only row-text marker is the 'RECALLED: ' prefix. Tokenised controls over its 42 non-library text files: modified 0; the one 'changed' token is DirtyManager's form-dirty listener; every 'modify' is GPL boilerplate and every 'void' the Java keyword (poison). An edited ticket replaces the displayed order silently. No. https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/java/com/unicenta/pos/sales/JPanelTicket.java · retrieved 2026-09-13 adversarially verified
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
v4 enumeration corroborated by the v5 delta. /features/ CUSTOMER runs "Account Management Address and Contact detail Barcode Credit Limit Customer Diary Customer Information Customer Store Card Discount % Label Printing Multi-Tax Categories On/Off Account Payments Photo Image Statement Transaction History VIP" - no guest messaging of any kind. The v5-era bound per R2 is /features/differences/, whose NEW list contains the one customer-facing message product uniCenta ships, "Digital Receipts (free for uniCenta subscribers)" - a receipt copy sent after payment, not an order-ready signal - and nothing else. The kitchen display's own stated audience is staff: the changelog calls it a monitor for "showroom/warehouse type operations where customer-ready picking lists are needed". Regexes: /\bSMS\b|text message|push notification/i = 1 hit, a GDPR sentence about "secure data transfer mechanisms"; /order.?ready|status board|pager|buzzer/i = 0. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
Waste, spoilage, and remakes can be logged directly at the kitchen/KDS screen with reason codes, and the entry depletes inventory.
kitchen-waste-logging
v5 delta document, 10 March 2023, v5-vs-v4. The stock-adjustment surface uniCenta added in v5 is named twice in this one document and is a back-office widget both times: "NEW... JVM RAM monitor Widget Stock Maintenance Service Charge Option" and, in the deprecation column, "DEPRECATED... CloseCash reprint Stock Maintenance". No kitchen-side entry point and no reason-code apparatus appears anywhere on the site. Regexes over the 246-doc corpus: /waste/i = 1 hit, a news line "We don t have time to waste on this silly nonsense"; /wastage|spoil|shrink|breakage|damaged|write.?off|scrap/i = 0; /remake/i = 0; /reason code/i = 0. The zero is bounded to the crawlable site and not to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size, but Stock Maintenance is the vendor's own name for this function and it is documented as back-office. https://unicenta.com/features/differences/ · retrieved 2026-09-05 adversarially verified
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
No ticket-time or station-time reports among the six documented report categories. https://unicenta.com/features/ · 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
v4 generation, corroborated by v5. /features/ closes the reporting surface at six families - "REPORTS Employee Customer Financial Inventory Sales Supplier" - all historical. The v5-era bound per R2 is /features/differences/, whose reporting delta is "NEW Supplier reports User reports IMPROVED Jasper Reports engine upgrade to version 6 Inventory reports Sales reports": still six historical families on a Jasper engine, with nothing predictive added. Regexes: /forecast/i = 0 across all 246 docs; /predict/i = 0; /prep list|par level|task list/i = 0. The nearest thing in the corpus is the INVENTORY item "Min/Max levels", a reorder threshold rather than a demand forecast. https://unicenta.com/features/ · 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
v4 capability census + v5 delta. /features/ closes the EMPLOYEE area at "Access Levels Breaks and Leave CheckIn/CheckOut Employee Info iButton/Dallas key Performance Photo Image Security Card" - no driver entity, no assignment state, no run history; the page's only delivery word is under SUPPLIER, "Diary Record deliveries", i.e. goods received IN, not customer delivery. /features/ self-discloses "Here s a quick-view list of uniCenta oPOS v4 core features", so per the generation rule the v5-era second bound is /features/differences/ (10 March 2023), whose NEW/IMPROVED/DEPRECATED blocks cover System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products and name no delivery, driver, dispatch or digital-ordering function. Absence controls over uniCenta's own vocabulary: /driver/ 3 docs, ALL hardware or JDBC ("access to its drivers usually on CD", "Driver Library : This is set by default on installation", "Driver Class : This should not be changed"); /dispatch/ 0; /courier/ 0; /assign(ment)? to (a )?driver|run history/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
/features/ closes the SALES area at "Access Levels Account Sale Account Settlement Customer Lookup Discounts Edit Receipt Edit Sales Free-entry Item In-sale Stock check Layaway Mixed Payment Move Table Partial Payment Product Lookup Receipt Notes Receipt Ticket Remote/Kitchen Print Refunds Reservations Split Receipts Table Management Tax change in line Transfer Order Item Variable Pricing" - the only order-routing screen uniCenta ships is "Remote/Kitchen Print" (v5: "Remote Order Display currently in Beta", /apply/), a kitchen display, not a dispatch board. /features/ self-discloses "Here s a quick-view list of uniCenta oPOS v4 core features", so per the generation rule the v5-era second bound is /features/differences/ (10 March 2023), whose NEW/IMPROVED/DEPRECATED blocks cover System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products and name no delivery, driver, dispatch or digital-ordering function. Controls: /dispatch/ 0 docs; /\bexpo\b/ 1 doc and it is "Technology Expo, Olympia, London" in the news timeline; /courier/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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 mapping capability is enumerated anywhere. /features/ SYSTEM/SALES/INVENTORY lists contain no map, route or geocode function; /features/ self-discloses "Here s a quick-view list of uniCenta oPOS v4 core features", so per the generation rule the v5-era second bound is /features/differences/ (10 March 2023), whose NEW/IMPROVED/DEPRECATED blocks cover System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products and name no delivery, driver, dispatch or digital-ordering function. Controls over the vendor's own spellings: /route/ 1 doc and it is "spend money to get the best router you can afford" in the FAQ networking section; /map(ping)? view|geocod/ 0; /\bzone\b|polygon|radius|isochrone/ 2 docs, BOTH "Time Zone" (a MySQL connector bug, 4.3.1); /GPS/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
Captures live driver GPS position from a driver-facing mobile app and surfaces it back to the dispatch screen. differentiator
delivery-driver-tracking
The rationale's premise is loose and is corrected here: uniCenta DOES ship a mobile client. The homepage states "WEB SERVER Run the full version of uniCenta oPOS on any Android or iOS device, tablet or countertop machine with a browser", and /apply/ (current, v5, HOSTED plan) sells "Runs on an iPad Runs on an Android Tablet Runs in most Browsers". That client is the full merchant POS in a browser, not a driver-facing app - the FAQ adds "If you want to run uniCenta oPOS on an Apple iPad or Android tablet then that s possible too, though you will first need to install uniCenta oPOS on a host PC". Controls: /GPS/ 0; /\bdriver\b/ 3 docs, all hardware/JDBC; /app ?store|play ?store/ 0. So there is a mobile app but no driver role and no location capture. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/ · retrieved 2026-09-05 adversarially verified
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-area modelling of any granularity is enumerated: /features/ CUSTOMER is closed at "Account Management Address and Contact detail Barcode Credit Limit Customer Diary Customer Information Customer Store Card Discount % Label Printing Multi-Tax Categories On/Off Account Payments Photo Image Statement Transaction History VIP" - an address is a contact field, not a served area. /features/ self-discloses "Here s a quick-view list of uniCenta oPOS v4 core features", so per the generation rule the v5-era second bound is /features/differences/ (10 March 2023), whose NEW/IMPROVED/DEPRECATED blocks cover System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products and name no delivery, driver, dispatch or digital-ordering function. Controls: /\bzone\b|polygon|radius|isochrone/ 2 docs, both "Time Zone"; /postcode|zip code/ 0; /geocod/ 0. The absence is of the parent concept, so the polygon-vs-radius distinction the rubric draws never arises. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
Charge configuration on this product is enumerated and closed: /features/ SYSTEM has "Multi-Tax Rates", SALES has "Discounts ... Variable Pricing", and the only fee mechanism the vendor documents is the Service Charge ("Enable Service Charge : Used together with the special xxx988 Product to add (optional) fixed charge to a sales transaction", /pages/configure-unicenta-opos/; "NEW ... Service Charge Option", /features/differences/) - one flat store-wide charge, not a per-zone fee. /features/ self-discloses "Here s a quick-view list of uniCenta oPOS v4 core features", so per the generation rule the v5-era second bound is /features/differences/ (10 March 2023), whose NEW/IMPROVED/DEPRECATED blocks cover System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products and name no delivery, driver, dispatch or digital-ordering function. Controls: /minimum order|order minimum/ 0; /promise time|\bETA\b|estimated (delivery|time)/ 0; /\bzone\b/ = "Time Zone" only. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
/features/ CUSTOMER carries "Address and Contact detail" as a free-text record field and nothing more; /features/differences/ v5 CUSTOMER changes are "NEW Image in Customer Finder Flag as VIP Set a Default Discount Create Customer popup from within Sales screen Add new create Customer to current ticket IMPROVED Customer record load time" - no validation, geocoding or out-of-zone check anywhere in the v5 delta. Controls: /geocod/ 0; /map(ping)? view/ 0; /postcode|zip code/ 0; /\bzone\b/ 2 docs, both "Time Zone". Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
Nothing in the compensation chain exists. /features/ EMPLOYEE is closed at "Access Levels Breaks and Leave CheckIn/CheckOut Employee Info iButton/Dallas key Performance Photo Image Security Card" and REPORTS at "Employee Customer Financial Inventory Sales Supplier" - no driver, no reimbursement, no payroll export. /features/ self-discloses "Here s a quick-view list of uniCenta oPOS v4 core features", so per the generation rule the v5-era second bound is /features/differences/ (10 March 2023), whose NEW/IMPROVED/DEPRECATED blocks cover System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products and name no delivery, driver, dispatch or digital-ordering function. Controls: /mileage|reimburse/ 0; /gratuity|tip\b/ 0 - uniCenta documents NO tip capture at all, in-store or otherwise, so there are no driver-retained tips to allocate; /\bdriver\b/ 3 docs, all hardware/JDBC. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
The standing rationale is correct and is now sourced. /features/ SYSTEM lists "Cash Drawer Close Cash ... Pay Ins/Outs" and /features/differences/ (v5) adds only "NEW Close Cash preview Reprint previous Close Cash" - Close Cash is a terminal/drawer session, and the v5 delta changes only its preview and reprint. The only "settle" on /features/ is "Account Settlement", a customer on-account payment. There is no driver entity (EMPLOYEE enumeration above) to hold a bank. Controls: /bank\b/ 0 docs; /mileage|reimburse/ 0; /gratuity|tip\b/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
/integrations/ is a partner FLOOR, not a census: "Our integrated partners offer unique services that seamlessly integrate with uniCenta oPos" resolves to exactly one live partner - "Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products" - plus two literal "Coming Soon!" slots. Control over the named marketplaces themselves: /doordash|uber ?eats|deliveroo|just ?eat|grubhub|glovo|foodpanda|swiggy|zomato/ 0 docs; /courier/ 0; /dispatch/ 0. That floor plus a corpus-wide zero for every courier network named in the rubric bounds this absence. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · retrieved 2026-09-05 adversarially verified
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
Conditional on the previous cell: with the partner page listing only WooCommerce plus two "Coming Soon!" slots there is no courier connection to overflow to, and no rules engine is enumerated in /features/ or in the v5 delta /features/differences/. Controls: /courier/ 0; /doordash|uber ?eats|deliveroo|just ?eat|grubhub/ 0; /dispatch/ 0; /\bdriver\b/ 3 docs all hardware/JDBC - there is also no in-house driver to fall back FROM. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · retrieved 2026-09-05 adversarially verified
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
Integrations page lists WooCommerce live, QuickBooks and Etsy coming soon. No marketplace integrations at all. https://unicenta.com/integrations/ · retrieved 2026-08-01
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
Re-grounded off the /api/ marketing page. uniCenta's complete published API artifact is its exported Insomnia collection at docs.unicenta.com/insomnia.json: 14 requests across exactly three resources (customer, order, product) against a base-url of https://api.unicenta.io. Order intake is a single generic POST /order whose body carries only products[] (name, priceExcludingTax, amount, tax) and customerId - no channel, order-source, marketplace or delivery fields, and no per-marketplace resource. The vendor's own Integrations page names one integrated partner, WooCommerce ("Get Customers / Get Orders / Get Products"), with two further tiles reading "Coming Soon!". There is no third-party marketplace connected to inject from, so nothing arrives to fire to KDS or printers. https://docs.unicenta.com/insomnia.json · retrieved 2026-08-09
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
The standing premise is WRONG and the verdict survives anyway. A third-party channel DOES exist: /woocommerce/ is a current v5-era technical doc ("uniCenta now supports WooCommerce! Synchronize Customers Synchronize Orders Synchronize Products") wired to exactly three endpoints, "https://api.unicenta.io/woocommerce/customer https://api.unicenta.io/woocommerce/order https://api.unicenta.io/woocommerce/product". That object set is closed and contains no availability, stock or 86 object, and the documented product flow runs the wrong way - "Press the Get All Products button to retrieve all the products from WooCommerce". Shipped in 5.4.0 as UOCL-298..309. The v5 stock feature is in-POS only: "NEW ... Stock level notification" (/features/differences/). Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/woocommerce/ · 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
Same correction: a connected channel exists. /woocommerce/ enumerates the whole control surface - "1 Plugin settings uniCenta menu plugins WooCommerce Webhook Secret ... Domain ... Consumer Key ... Consumer Secret", "2 Foreground Data Sync (manual) ... Press the Get All Products button", "3 Background Data Sync (automatic) ... Enable the api for each type of data you want to sync in the background". Those are the only in-POS controls over the channel and none of them pauses, deactivates or timer-reactivates a storefront. /integrations/ adds no second marketplace ("Coming Soon!" x2). Controls: /doordash|uber ?eats|deliveroo|grubhub/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/woocommerce/ · retrieved 2026-09-05 adversarially verified
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
The one integrated channel is a self-hosted WooCommerce shop, not a marketplace that remits payouts, so there is no commission or marketing fee to reconcile: /integrations/ lists only "Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products" plus two "Coming Soon!" slots. The reporting surface is likewise closed: /features/ REPORTS = "Employee Customer Financial Inventory Sales Supplier" and /features/differences/ v5 adds only "NEW Supplier reports User reports IMPROVED Jasper Reports engine upgrade to version 6 Inventory reports Sales reports". Controls: /doordash|uber ?eats|deliveroo|just ?eat|grubhub/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · 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
MERGE CALL: graded B, not the proposed A - a compiled jar from the vendor Maven repo is shipped production code, not a published spec or source. 329th, MOVED unknown -> no/A. The standing unknown rested on the 2,015-char WooCommerce quickstart never taking up error handling - correct about that page, but the connector APP ITSELF is public and is now censused, so the absence is bounded on the add-on rather than on the core's source (the shape the 328th held). CORPUS: com.unicenta:unicenta-plugins 1.3.3, the whole posApps plugin client the 5.4.0 tree calls, fetched anonymously from repo.unicenta.org/maven2 (460,041 B; maven-metadata.xml confirms 1.3.3 is still `<release>` and `<latest>`, so this is production, not staging); 134 classes, application.properties, logback.xml and - the new surface - ALL 15 JavaFX screen layouts. CLOSED ENUMERATION of the plugin's entire UI: Dashboard.fxml offers exactly API / Digital Receipts / WooCommerce / Card Payments (Dojo, Teya, MediaPayments) / Profile / Log Out. APIConfig.fxml is three checkboxes (`Customer API`, `Order API`, `Product API`) + Save + one `message` Label - toggles, no status. WooCommerceConfig.fxml is Domain / Consumer Key / Consumer Secret / Webhook Secret + `Get All Products` / `Get All Customers` under a `Utilities` label + one `message` Label. THE ONLY ORDER-INJECTION SCREEN IS A SUCCESS POPUP: Order.fxml, VERBATIM `New Order Received!` / `Please login and select the table or layway to complete the sale` / `Close`. There is no failed-order list, no per-channel connection state, no retry/queue view, no alert. EVIDENCE OF WHERE FAILURES GO INSTEAD: OrderServiceInbound.class holds `Error with processing Order: `, `Order API not enabled`, `Subscriber not logged in` and references `getLogger`; logback.xml routes com.unicenta at INFO to a rolling file `${user.home}/.unicenta/unicenta-plugins.log`, maxHistory 5. Operator-visible failure text exists only for the MANUAL pulls and for card transactions: WooCommerceConfigController$2/$3/$4 = `Settings Saved!`, `Unable to save Settings`, `Please complete all fields`, `Failed to retrieve products.`, `Failed to retrieve customers.`; WooCommerceService = `Unable to get WooCommerce Products: `, `Unable to get WooCommerce Customers: `, `Failed to get products from WooCommerce: `, `Response status: , body: `; and Auth/Sale/Linked-refund errors in the Teya/Dojo/MediaPayments classes. None of the three conjuncts (failed/rejected injections, per-channel connection status, alerts on failure) is met. CONTROLS, tokenised word-boundary case-insensitive: over the plugin's 398,427 B of extracted strings + both config files -> sync status 0, last sync 0, synchronis* 0, integration 0, connection status 0, retry 0, queue 0, alert 0, notification 0, health 0, failure 0 (`webhook` hits only WooCommerceConfig.fxml's `Webhook Secret` credential field = POISON, `status` hits only HTTP/card `Response status`/`Payment Status`, `dashboard` only the launcher). Over the 1,208 text files (10,820,784 B) of the 5.4.0 GPL tree -> webhook 0, integration 0, woocommerce 0, sync status 0, connection status 0, failed order 0, retry 2 (both the `retry` password label in pos_messages), queue 1 (DeviceScannerComm serial buffer = POISON), injection 1 (a JPanelTicket comment = POISON): the core till has no channel-health surface either. Over the 101-URL page-sitemap census of unicenta.com -> `webhook` appears only on the 5.4.0 release page and integrations/ says only `Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products`. WEAKNESS TO WEIGH: WooCommerce is uniCenta's only order-in channel, so this is a one-channel product; and the subscriber-walled developer guides could in principle describe a log-reading procedure, which would still not be an operator health view. Retrieved 2026-09-18. https://repo.unicenta.org/maven2/com/unicenta/unicenta-plugins/1.3.3/unicenta-plugins-1.3.3.jar · retrieved 2026-09-18 adversarially verified
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
uniCenta does publish one guest-facing branded digital artefact and it is not this one: the homepage sells "DIGITAL RECEIPTS Real receipt copy. Strengthen your customer connection and reinforce your brand" - a post-purchase receipt copy, with no order-state or driver-state content. The homepage's forward-looking block ("LOOKING AHEAD MORE IN THE WORKS... A collection of future business posApps in-scope for development") names Global Payments, eCommerce Top-up and CRM, not order tracking. Controls: /SMS|text message/ 1 apparent hit that is the substring inside "mechani-sms" - a true corpus-wide zero; /\bdriver\b/ 3 docs, all hardware/JDBC; /promise time|\bETA\b|estimated (delivery|time)/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/ · 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
No quoting mechanism of any kind, fixed or dynamic, is documented - so the rubric fails at its weaker end too. /features/ SALES enumerates "Layaway ... Reservations" as the only future-dated constructs and neither carries a quoted time; /features/differences/ v5 Restaurant changes are "NEW Table access lock-out Multi-part kitchen order print Ticket change and delete permissions Print, reprint permissions Assign number of diners to table Table plan auto-refresh IMPROVED Ticket change remote print Reservations form" - no timing engine. Controls: /promise time|\bETA\b|estimated (delivery|time)/ 0; /\bzone\b/ = "Time Zone" only; /\bdriver\b/ hardware only. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
Vendor documents explicit offline behavior for delivery: whether cash delivery orders, driver assignment, and driver settlement continue during an internet outage.
delivery-offline-behavior
This rubric asks whether the vendor DOCUMENTS offline behaviour, and the control is decisive: /offline|off.line/ returns 2 docs and BOTH are about support, not operation - "3.9.x (and earlier) versions can take advantage of our on-line and off-line support services" (FAQ) and "The divide between on-line/off-line Click Mortar we often talk about is narrowing" (news). /internet connection|no connection|connection is lost|outage/ 0. uniCenta publishes no disconnected-operation documentation for anything, and /features/differences/ (v5, 10 March 2023) - the current-generation delta covering System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products - introduces no delivery area to have offline behaviour. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/differences/ · retrieved 2026-09-05 adversarially verified
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
Score stands, with a material caveat the dossier omits: WooCommerce integration shipped in 5.4.0 (August 2025), a subscriber-only build. It is unavailable in the free v5.0 community release, so the only 'digital ordering' path costs at least £72/yr on top of the operator building and hosting their own WooCommerce store. https://unicenta.com/support/changelog-unicenta-opos/ · retrieved 2026-08-01 adversarially verified
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
The standing rationale mis-describes the mobile product. The homepage: "WEB SERVER Run the full version of uniCenta oPOS on any Android or iOS device, tablet or countertop machine with a browser" - that is the FULL merchant POS, front-of-house not back-office (FAQ: "to take orders on the move ... run uniCenta oPOS on an Apple iPad or Android tablet"), reached through a browser or RDP. /apply/ (current v5 pricing) sells it as HOSTED: "Runs on an iPad Runs on an Android Tablet Runs in most Browsers". There is no consumer-facing app: /app ?store|play ?store/ 0 docs corpus-wide; /\bAndroid\b/ 6 docs, every one of them the merchant POS in a browser or an RDP client. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/ · retrieved 2026-09-05 adversarially verified
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
The standing rationale is right and is now sourced. /woocommerce/ (current, v5, technical) is the only documented digital channel and its object set is closed at three: "Synchronize Customers Synchronize Orders Synchronize Products", endpoints "https://api.unicenta.io/woocommerce/customer https://api.unicenta.io/woocommerce/order https://api.unicenta.io/woocommerce/product". A saved payment method is not among them, and the guest account lives on the WooCommerce side - "Run your website and store with the same data ... Centralised customers for loyalty programs". uniCenta's own customer record (/features/ CUSTOMER) carries "Address and Contact detail ... Customer Store Card ... On/Off Account Payments" - a house account, not a tokenised card on file. Controls: /hosted (payment|fields)|tokeni[sz]/ 0 docs; /3.?D.?Secure|3DS/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/woocommerce/ · retrieved 2026-09-05 adversarially verified
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
/features/ SALES is closed at "Access Levels Account Sale Account Settlement Customer Lookup Discounts Edit Receipt Edit Sales Free-entry Item In-sale Stock check Layaway Mixed Payment Move Table Partial Payment Product Lookup Receipt Notes Receipt Ticket Remote/Kitchen Print Refunds Reservations Split Receipts Table Management Tax change in line Transfer Order Item Variable Pricing" - the nearest constructs are "Auxiliaries" and "Attributes/Modifiers" under INVENTORY, which are configuration of an item, not a suggestion engine. /features/ self-discloses "Here s a quick-view list of uniCenta oPOS v4 core features", so per the generation rule the v5-era second bound is /features/differences/ (10 March 2023), whose NEW/IMPROVED/DEPRECATED blocks cover System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products and name no delivery, driver, dispatch or digital-ordering function. Controls: /upsell|cross.sell/ 0 docs; /recommend/ 5 docs, every one of them "MySQL version 5.7 is recommended"-class installation advice; /attach rate/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
The complete documented behaviour of an inbound digital order is UOCL-259 in 5.2 (current generation): "Integrate with the uniCenta Order API ... Add orders received from the API into the layway Increment layway count when new order is received Once order has been successfully received delete the order from the API". Orders land in the layaway stack; nothing in that spec, or in 5.3 / 5.3.1 / 5.3.2 / 5.4.0, admits a time slot, a capacity limit or a daypart rule. Controls: /scheduled order|pre.?order|time slot|slot/ 0 docs corpus-wide; /minimum order|order minimum/ 0. Per the API rule this release note is used POSITIVELY - cited for what it says the ingest does - and the layaway landing is corroborated by /features/ SALES "Layaway". Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/unicenta-opos-release-5-2/ · retrieved 2026-09-05 adversarially verified
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
Only click-and-collect and table ordering are named as WooCommerce uses; no curbside check-in, mode fees, or delivery flow. https://unicenta.com/integrations/ · 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
'Table ordering at restaurants' is named as a WooCommerce use case; no documented attachment to an existing check, splitting, or tipping. https://unicenta.com/integrations/ · retrieved 2026-08-01
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
/features/ SYSTEM enumerates the shipped terminal modes and the list is closed: "Mixed use Retail/Hospitality Mobile POS ... Restaurant mode Retail mode ... Supermarket mode" - no kiosk or self-order mode. /features/ self-discloses "Here s a quick-view list of uniCenta oPOS v4 core features", so per the generation rule the v5-era second bound is /features/differences/ (10 March 2023), whose NEW/IMPROVED/DEPRECATED blocks cover System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products and name no delivery, driver, dispatch or digital-ordering function. /features/add-ins/ closes the extension route too ("Free Add-ins ... Coming Soon", "Plus Add-ins ... Coming Soon", third party = eleven named tools, mostly generic database and office utilities but not all of them - the first entry is "Barcode Label Maker Hook this label designer directly into uniCenta oPOS database", which is POS-adjacent). Controls: /kiosk/ 0 docs corpus-wide; /unattended/ 0; /self.?service/ 2 docs - one is /support/ "SELF-SERVICE DOCUMENTATION", the other is a case study describing the CUSTOMER'S own hardware ("they can play via a button on a self-service till", the LotteryEverywhere add-on at Jardin Majorelle), not a uniCenta kiosk product. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
/features/ SALES offers the opposite construct - "Split Receipts ... Partial Payment ... Mixed Payment", i.e. one ticket divided at payment time, never many contributors joining one ticket from separate devices. /features/ self-discloses "Here s a quick-view list of uniCenta oPOS v4 core features", so per the generation rule the v5-era second bound is /features/differences/ (10 March 2023), whose NEW/IMPROVED/DEPRECATED blocks cover System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products and name no delivery, driver, dispatch or digital-ordering function. The v5 delta adds only "NEW Lock-out current ticket ... Table access lock-out ... Assign number of diners to table", which restrict concurrent ticket access rather than open it. Controls: /group order|share.able link/ 0 docs; /SMS|text message/ effectively 0 (the single apparent hit is the substring in "mechanisms"). Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
/catering/ is a hard zero across all 246 docs, and the vendor's own vertical enumeration excludes it: the homepage lists RETAIL, HOSPITALITY ("Bars Cafes Hotels Motels Nightclubs Restaurants"), MIXED ("Events Museums Parties Pop-ups Venues") and SPECIALITY ("Education Gyms Launderettes Lottery Sports Centres Transport"). /features/ SALES has "Layaway" and "Reservations" - a held retail ticket and a table booking - as the only forward-dated constructs, and no menu-set, lead-time, quote, deposit or invoice-terms machinery. /features/ self-discloses "Here s a quick-view list of uniCenta oPOS v4 core features", so per the generation rule the v5-era second bound is /features/differences/ (10 March 2023), whose NEW/IMPROVED/DEPRECATED blocks cover System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products and name no delivery, driver, dispatch or digital-ordering function. Controls: /catering/ 0; /minimum order|order minimum/ 0; /scheduled order|pre.?order/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
Both routes are closed. Native: /\bvoice\b/ 0 docs, /\bA\.?I\.?\b/ 0, /speech|IVR|phone order|telephone order/ 2 docs and both are Richard Stallman's "free as in free speech" quotation on /about-unicenta-opos-point-of-sale/ and /apply/. Partner: /integrations/ is a partner floor, not a census - one live partner ("Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products") and two literal "Coming Soon!" slots - so there is no certified partner list to hold one. /features/add-ins/ likewise: "Free Add-ins ... Coming Soon", "Plus Add-ins ... Coming Soon". Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · 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
The standing rationale is right at the coarser level and that is what makes it citable: /drive.?thru|drive.?through/ 0 docs, and /features/ SYSTEM closes the mode list at "Mixed use Retail/Hospitality Mobile POS ... Restaurant mode Retail mode ... Supermarket mode" with no lane or drive-thru mode; the homepage vertical list ("Bars Cafes Hotels Motels Nightclubs Restaurants ... Museums Parties Pop-ups") names no quick-service drive-thru format. /features/ self-discloses "Here s a quick-view list of uniCenta oPOS v4 core features", so per the generation rule the v5-era second bound is /features/differences/ (10 March 2023), whose NEW/IMPROVED/DEPRECATED blocks cover System, Sales, Restaurant, Payments, Close Cash, Reports, Customers and Products and name no delivery, driver, dispatch or digital-ordering function. Voice controls as above: /\bvoice\b/ 0, /\bA\.?I\.?\b/ 0, /IVR/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
Supports conversational SMS or chat ordering/reordering (text-to-order or text-a-link) that lands in the POS.
digital-sms-ordering
The SMS control is a textbook trap and it resolves to zero: /SMS|text message/ reports 1 document, /unicenta_gdpr_customer_help/, but the match is the substring inside "the appropriate and most secure data transfer mechani-sms in place as required by GDPR" - there is no SMS capability, and no chat capability either (/chatbot/ 0). The channel side is floored by /integrations/: one listed partner, "Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products", plus two "Coming Soon!" slots. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · retrieved 2026-09-05 adversarially verified
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
/google (business|my business|maps)|order with google/ 0 docs corpus-wide. The provisioning would have to come from a partner or an add-in and neither surface lists anything of the kind: /integrations/ (a floor, not a census) - "Our integrated partners ... Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products" plus two "Coming Soon!" slots; /features/add-ins/ - "Free Add-ins ... Coming Soon", "Plus Add-ins ... Coming Soon", third party a list of eleven named tools, mostly generic database and office utilities though "Barcode Label Maker" hooks "directly into uniCenta oPOS database". The only ordering endpoint the vendor exposes is https://api.unicenta.io/woocommerce/order. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · 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
/apple (business connect|maps)/ 0 docs. Every Apple mention in the corpus is the operating system or the device - homepage "APPLE Mac OS X 10.6 and later", FAQ "Apple iPad or Android need an RDP app", /apply/ "Runs on an iPad" - never a place card or a listings surface. As above, neither of the two surfaces that could carry such a placement lists anything of the kind: /integrations/ (one partner + two "Coming Soon!") and /features/add-ins/ (both uniCenta tiers "Coming Soon"). Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · 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
The standing rationale overstates. Loyalty primitives DO exist: /features/ CUSTOMER has "Customer Store Card ... Discount % ... VIP", /features/differences/ v5 adds "NEW ... Set a Default Discount" and "NEW One-time use of Voucher/Coupon", and the changelog records groundwork "in readiness for Loyalty and manufacturer coupons". What is absent is the attach. /woocommerce/ - the only documented digital channel - syncs exactly "Synchronize Customers Synchronize Orders Synchronize Products" and frames the benefit as "Centralised customers for loyalty programs": the shared object is the CUSTOMER RECORD, and the loyalty programme is something you then run on the other side. No accrual, balance, points or redemption object crosses the three endpoints. Controls: /loyalty|rewards program|points/ 3 docs - the GDPR page, the changelog "readiness" line, and this WooCommerce sentence; none describes an engine. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/woocommerce/ · retrieved 2026-09-05 adversarially verified
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
Near-denial from the vendor. The homepage files recurring membership billing under future work: "LOOKING AHEAD MORE IN THE WORKS... A collection of future business posApps in-scope for development or we re looking to include. GLOBAL PAYMENTS ... It will also include recurring payments for those who offer utility payments and recurring memberships." That is the product's own statement that guest recurring billing is not shipped. The subscriptions that DO exist are uniCenta's own support plans (/apply/: "ABOUT SUBSCRIPTIONS: A Subscription is priced in British Pounds and lasts for one year from the date you join"), i.e. the vendor's business model, not a merchant-configurable guest programme - a distinction the standing rationale did not draw. Controls: /subscription|membership/ 4 docs, all either the /apply/ support plan or this LOOKING AHEAD sentence. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/ · 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
Promotions exist on the POS side and the rationale undercounts them: beyond "Discount %" there are "Vouchers/Coupons" (/features/), "NEW One-time use of Voucher/Coupon" and "NEW ... Set a Default Discount" in the v5 delta. The parity claim fails at the boundary. /woocommerce/ syncs three objects only - "Synchronize Customers Synchronize Orders Synchronize Products" via https://api.unicenta.io/woocommerce/customer, /order and /product - and states the shared asset explicitly as the customer: "Centralised customers for discounts / promotions". A discount, coupon or channel-eligibility object is not in the set, so a promotion defined in the POS cannot be honoured by definition-sharing on the web side. Controls: /promotion|promo code|discount code/ 3 docs - privacy policy, a customer profile page, and this line. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/woocommerce/ · retrieved 2026-09-05 adversarially verified
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
Ownership is real and documented: the operator supplies the database server the app connects to ("The most essential setting is that you have a MySQL server installed, set up, and running correctly"), so guest rows sit in the operator's own MySQL instance and need no vendor approval to query. Shortfall: the vendor documents no fee-free bulk guest export. The Customer API's GET /customer is a paid subscription benefit, the database table reference is gated to Plus and Hosted subscribers, the GDPR page routes subject requests to "contact us to request assistance", and consented marketing status is not a documented field. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-08-07
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
Explicit vendor removal, current generation. /features/differences/ (v5, 10 March 2023) states under payments: "DEPRECATED Card payment gateways (PCI compliance)" - the gateway class a hosted digital checkout requires has been withdrawn, not merely undocumented. The FAQ gives the history and the surviving posture, which is terminal-side: "These were completely withdrawn in version 4 due to the PCI/EMV liability shift ... From uniCenta oPOS version 4.4 we now include, as standard, a fully compliant and approved PCI/EMV P2PE PA-DSS", and /pages/configure-unicenta-opos/ concurs: "Credit Card Payment gateways have been removed from uniCenta oPOS due to the latest PCI Regulations. These will now be available as plug-ins." PA-DSS is a retired standard; controls: /PA.?DSS|DSS 4|script integrity|SAQ/ 1 doc (that FAQ sentence) with no DSS 4.0 anywhere, /3.?D.?Secure|3DS/ 0, /hosted (payment|fields)|tokeni[sz]/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/features/differences/ · 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
The standing rationale is factually WRONG on its first clause. A service-fee configuration IS documented: "Enable Service Charge : Used together with the special xxx988 Product to add (optional) fixed charge to a sales transaction. Service Charge Rate ?% : The rate to charge." (/pages/configure-unicenta-opos/, v4 but confirmed current by /features/differences/ v5: "NEW ... Service Charge Option"). The verdict survives on the rest of the rubric: the charge is a single store-wide POS setting keyed to a magic product code, with no channel scoping, no guest-facing disclosure text, and no card-brand or jurisdiction logic; and the only digital channel, /woocommerce/, syncs customers, orders and products only, so nothing carries the setting outward. Controls: /surcharge|dual pricing|cash discount program/ 0 docs corpus-wide; /gratuity|tip\b/ 0. Bounded to the 246-doc crawlable site; NOT to the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size (this absence is carried by the named-vocabulary zeros above, not by any claim about what is behind the login wall) and NOT to source code (uniCenta GitHub org public_repos 0; SourceForge ships a binary MSI). https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
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 customer table, reached through a caller-addressed CRUD resource: POST, PUT, DELETE and GET /customer, where the caller supplies the record's own UUID id alongside emailAddress, telephone, mobile, card and searchKey. That caller-supplied id is the entire merge story - identity matching is the integrator's job, not the platform's. Shortfall: the published collection defines no merge, dedup or identity-resolution operation and no lookup-by-phone or lookup-by-email endpoint, so nothing automatic happens on a phone or email match. uniCenta also ships no first-party web/app ordering or kiosk channel whose transactions would need merging; the only documented external order source is WooCommerce. https://docs.unicenta.com/insomnia.json · retrieved 2026-08-09
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
v5-era, undated marketing. /integrations/ is a partner FLOOR, not a census: "Our integrated partners offer unique services that seamlessly integrate with uniCenta oPos" resolves to exactly one live partner, WooCommerce ("Get Customers Get Orders Get Products"), plus two literal "Coming Soon!" slots. Regexes over the 246-doc corpus: /doordash|uber ?eats|grubhub|deliveroo|just ?eat|delivery (network|marketplace|platform|aggregator)/i -> 0 docs; /loyalt/i -> 2 docs (changelog, /woocommerce/). Bounded to the crawlable site, not the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size and not source (GitHub org public_repos: 0; SourceForge newest artefact is a binary MSI). NOTE the failure is the absence of marketplaces, NOT an inability to attach identity: the one documented inbound order channel does carry identity - the Insomnia export (grade A, positive use) POSTs to /order with {"products":[...],"customerId":"b4538210-8096-11ee-aaa4-8796d42c90a1"}. FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · retrieved 2026-09-05 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
Documented customer features are lookup, credit limit, store card, discount % and VIP flag; no points, punch, or spend-tier accrual. https://unicenta.com/features/ · retrieved 2026-08-01
Supports status tiers with automatic promotion and demotion driven by rolling-window spend or visit counts. differentiator
guest-loyalty-tiers
v5 (delta doc dated 10 March 2023). The v5 Customer section reads "NEW Image in Customer Finder Flag as VIP Set a Default Discount Create Customer popup from within Sales screen" - the vendor's own v5 words are "Flag as VIP" (a flag) and "Set a Default Discount" (a scalar), not a tier ladder. Corroborated grade-A positive from .cache/q211/unicenta-insomnia.json: the Customer POST/PUT example body carries "discount": 10 and "vip": true - a boolean, not a tier field. v4 companion /features/ lists CUSTOMER "Discount % ... VIP" identically. Regexes: /tier/i -> 1 doc (unicenta-news, "top-tier global presence CDN" - CDN copy, not a product feature); /reward point|points balance|earn points/i -> 0 docs. https://unicenta.com/features/differences/ · retrieved 2026-09-05 adversarially verified
Documents explicitly what loyalty lookup, accrual, and redemption do when the POS loses connectivity (queue-and-reconcile vs blocked). differentiator
guest-loyalty-offline-behavior
UPHELD no, with the proposal's SECOND leg struck as a misreading. Batch C argued there is no offline mode at all, from "The most essential setting is that you have a MySQL server installed , set up, and running correctly. Without it you cannot run uniCenta oPOS." That sentence says the application requires a database, not that it requires the internet: the same page documents a local instance ("If the MySQL server is on the same machine as the uniCenta oPOS installation it would look like something this jdbc:mysql://localhost:3306/"), and this record's own order-capture-offline-order-entry is partial on exactly that thick-client architecture. The quote does not bear that weight and I have removed it (see also labor-offline-time-punch, which I overturned for relying on it). The FIRST leg survives and is sufficient: there is no loyalty engine whose offline behaviour could be documented. unicenta.com/features/ enumerates the entire CUSTOMER category VERBATIM - "Account Management Address and Contact detail Barcode Credit Limit Customer Diary Customer Information Customer Store Card Discount % Label Printing Multi-Tax Categories On/Off Account Payments Photo Image Statement Transaction History VIP" - with no points, accrual or redemption. RULE 2 SATISFIED: the v5 customer delta (features/differences/, 10 March 2023) is "Image in Customer Finder Flag as VIP Set a Default Discount Create Customer popup from within Sales screen Add new create Customer to current ticket" - still no points engine - and the current 5.4.0 connector page delegates the function outward, listing as a WooCommerce benefit "Centralised customers for loyalty programs". The only corpus mention of the word is aspirational and nine years stale ("Products in readiness for Loyalty and manufacturer coupons", changelog 4.2Beta1, 8 July 2016). Grade C because the enumerating document is the marketing feature page. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
Offer/discount engine exposes explicit stacking and precedence rules (exclusive vs combinable, order of application) as configuration. differentiator
guest-loyalty-offer-stacking-rules
v5 (10 March 2023) delta plus v4 marketing. The only rule the vendor ever attaches to a discount instrument is single use: "NEW One-time use of Voucher/Coupon". /features/ (v4) offers only SALES "Discounts" and CUSTOMER "Discount %". Regexes: /stacking|combinable|precedence|mutually exclusive/i -> 0 docs; /coupon|voucher/i -> 7 docs, all release-note or feature-list mentions of the voucher object itself, none describing combination rules; /promotion|promo\b/i -> 3 docs (privacy policy marketing, a customer profile, and /woocommerce/). Grade C not B because /features/differences/ bounds CHANGE, not capability; the v4 capability list carrying the other half is marketing. https://unicenta.com/features/differences/ · 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
v4 marketing, self-labelled "a quick-view list of uniCenta oPOS v4 core features". The whole CUSTOMER module is enumerated: "Account Management Address and Contact detail Barcode Credit Limit Customer Diary Customer Information Customer Store Card Discount % Label Printing Multi-Tax Categories On/Off Account Payments Photo Image Statement Transaction History VIP" - a record, not an audience engine. Required v5 companion per the generation rule: /features/differences/ (10 March 2023) adds only "Flag as VIP" and "Set a Default Discount" to that module. Regexes: /segment/i -> 0 docs; /campaign/i -> 0 docs. Nothing issues an offer to a rule-defined audience. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
Positive absence, established from the release artifact itself rather than from any vendor description of it. Verified independently against the q275 checkout of lestola/unicenta-mirror-5.4 at commit 8771d24 (confirmed HEAD, clean tree, 2026-09-15). THREE CLOSED ENUMERATIONS, each a census rather than a corpus. (i) SCHEMA: MariaDB-create.sql declares 52 tables and ZERO views - `Select-String 'CREATE (OR REPLACE )?VIEW'` returns nothing in the whole script - so no precomputed derived surface exists anywhere in the product. `customers` is 27 columns ( id, searchkey, taxid, name, taxcategory, card, maxdebt, address, address2, postal, city, region, country, firstname, lastname, email, phone, phone2, fax, notes, visible, curdate, curdebt, image, isvip, discount, memodate ). The only lifecycle-shaped column is `isvip bit(1) NOT NULL default b'0'`, and it is hand-set, not computed: it is carried as `protected boolean isvip` with a plain getter/setter in CustomerInfoExt.java and bound as `Datas.BOOLEAN / Formats.BOOLEAN` in DataLogicCustomers.java, with no code path anywhere that derives it from spend or visits. `curdate`/`curdebt` are the store-credit ledger, not recency/monetary. (ii) REPORT SET: 70 .bs report scripts ship; Role.Administrator.xml, the shipped permission template for the highest-privilege role, enumerates 64 of them by path, of which exactly eight are customer reports (customers, customers_cards, customers_debtors, customers_diary, customers_export, customers_list, customers_sales, customers_vouchers - customers_b.bs exists on disk but is not in the role manifest, which reconciles the proposal's 'eight' against the nine files). None computes a segment, a score, a tier, a visit count or a lifetime total. customers_list.bs is 'SELECT TAXID, NAME, FIRSTNAME, LASTNAME, ADDRESS, ADDRESS2, CITY, POSTAL, PHONE, EMAIL FROM customers WHERE VISIBLE = ...'; customers.bs adds only MAXDEBT/CURDATE/CURDEBT; customers_b.bs is the debtors filter (CURDEBT <> 0); customers_sales.bs GROUPs BY customers.NAME, receipts.DATENEW, tickets.TICKETID, products.NAME - per-ticket, per-product detail, not a per-guest aggregate. THE SHARPEST BOUND: the first-visit/last-visit/lifetime-total idiom IS present in this codebase and is applied to STAFF, not guests - epm_performance.bs is 'SELECT people.NAME, MIN(receipts.DATENEW) AS STARTDATE, MAX(receipts.DATENEW) AS ENDDATE, SUM(ticketlines.UNITS * ticketlines.PRICE) AS TOTAL'. Across all 70 reports, MIN()/MAX() over a date appears for employees and for inventory and never once grouped by a customer; the only three GROUP BYs touching `customers` are customers_sales.bs and sales_extproducts[_1].bs, all of which group by product or category as well. The authors had the query and chose not to point it at the guest. (iii) CLOSED PLUGIN: unicenta-plugins 1.3.3, decompiled, Customer model ( id, name, searchKey, accountId, firstName, lastName, emailAddress, telephone, mobile, card, maxDebt, discount, address, visible, vip, wooCommerceCustomerId ) - again a hand-set `vip` and no segment. CONTROLS, TOKENISED: `git grep -I -w -i` over the 5.4.0 tree returns ZERO files for rfm, recency, cohort, churn, lapsed, segment, segments, frequency, returning, lifecycle, tier, dormant, winback, at-risk, rank and ntile; the same list is zero across the decompiled 1.3.3 plugin. POISON REPRODUCED, BOTH TRAPS: a raw substring grep for `lapsed` hits 176 files and every one is NetBeans' generated `<editor-fold defaultstate="collapsed">` plus one ElapsedTimeBetweenDates - the -w form is 0, so a published raw count would have manufactured a win-back story out of Swing fold markers. `subscrib` hits 15 files in the plugin jar and is `com.unicenta.plugins.subscriber.Subscriber`, a licence holder that LoginController deserialises from the vendor's `/authenticate` endpoint via Gson - a paid-seat record, not a mailing list. `loyalty` is the one non-zero live control (8 files) and it refutes nothing: it is the hashed member-card string in CustomerInfoExt, a `label.loyaltyproducts=Loyalty details` resource key, and - decisively - a comment at DataLogicSales.java:2802 reading 'Use this block workflow as template to pump LOYALTY, MEMBERSHIP & etc', i.e. the authors' own statement that loyalty is a pattern a developer may build, not a shipped feature. THE PRIOR PREMISE IS FALSIFIED, not merely outvoted: this cell sat at unknown/F on the reasoning that only the members-only v4 Developer Reports Matrix Guide could settle what the built-in reports contain. A guide describing built-in reports cannot describe a report absent from the release artifact and the role manifest that gates it, both of which are read here at grade A. WHAT THIS DOES NOT BOUND: the Hosted tier's server side, which is not in the GPL tree; third-party add-ins from /features/add-ins/; releases after 5.4.0 (31 Jul 2025, current); and an operator writing their own .bs report, which the claim explicitly excludes. The v4 web-reporting add-in is deliberately NOT load-bearing here - the sibling verifier put it out of scope for a 5.4.0 record (v4-exclusive, requires the paid $35 third-party wpDataTables, FIRST BUY ships bVisible:false, host now NXDOMAIN) - and the `no` does not need it: its closest surface, a Customer TOP 10 of ( NAME, FIRST BUY, LAST SOLD, SALES TOTAL ), is a ten-row leaderboard, not a computed segment, so the verdict would stand even if it were in scope. https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/resources/com/unicenta/pos/scripts/MariaDB-create.sql · retrieved 2026-09-15 adversarially verified
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
RE-HOMED. The previous citation was /features/add-ins/other-add-ins/, which bounds the EXTENSION surface, not built-in customer-marketing behaviour, so the cell’s subject was outside the cited page’s category. The deciding surface is the customer module itself: /features/ (v4, self-labelled "a quick-view list of uniCenta oPOS v4 core features") enumerates CUSTOMER in full as "Account Management Address and Contact detail Barcode Credit Limit Customer Diary Customer Information Customer Store Card Discount % Label Printing Multi-Tax Categories On/Off Account Payments Photo Image Statement Transaction History VIP", and the required v5-era companion /features/differences/ (10 March 2023) adds only "Flag as VIP" and "Set a Default Discount" - a record with no trigger, no schedule and no send. Regexes over 246 docs: /birthday/i -> 0; /campaign/i -> 0; /referral|refer a friend/i -> 0. The add-ins page is retained only as corroboration, and note that its "Third party" list is eleven named tools, mostly generic database and office utilities but not all of them - "Barcode Label Maker Hook this label designer directly into uniCenta oPOS database" is POS-adjacent - framed as tools that "can help you achieve things that uniCenta oPOS doesn’t do". Bounded to the crawlable site. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
Emailed digital receipts exist; no marketing email or SMS campaign capability documented. https://unicenta.com/ · retrieved 2026-08-01
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
Value and grade as proposed; evidence rebuilt because the proposal under-measured its own corpus. THE CUSTOMER RECORD IS A CLOSED ENUMERATION RENDERED THREE TIMES AND NONE OF THEM CARRIES A PERMISSION FIELD. (1) DDL, pinned commit 8771d24: customers ( id, searchkey, taxid, name, taxcategory, card, maxdebt, address, address2, postal, city, region, country, firstname, lastname, email, phone, phone2, fax, notes, visible, curdate, curdebt, image, isvip, discount, memodate ) - 27 columns, no consent, opt-in, channel, consent-timestamp or consent-source column, and the two datetimes are curdate (debt) and memodate (memo). Identical in Derby-, PostgreSQL- and MySQL-create.sql, so the absence is not one backend. (2) The Swing customer editor CustomersView.java enumerates the whole record as five tabs - Contact (taxid, searchkey, name, card, taxcategory, visible, maxdebt, curdebt, curdate, firstname, lastname, email, phone, phone2, fax), Location, Transactions, Photo, Notes (plus VIP and discount) - with no permission control. (3) The live web demo Customer List report renders exactly NAME, ADDRESS, CITY, PHONE, PHONE 2, EMAIL. THERE IS NO SENDING SURFACE TO REVOKE AGAINST, MEASURED NOT ASSUMED: across 1,687 files / 628 .java, javax.mail = 0, smtp = 0, sendMail and sendEmail = 0, word-boundary SMS = 0, Twilio = 0, campaign = 0; the only outbound path is java.awt.Desktop.mail() opening the operator's own desktop client at one customer (CustomersView.java:1490, SuppliersView.java:1228). The closed unicenta-plugins 1.3.3 Customer DTO - read from the CFR-DECOMPILED SOURCE, never from jar bytes - is 16 fields ( id, name, searchKey, accountId, firstName, lastName, emailAddress, telephone, mobile, card, maxDebt, discount, address, visible, vip, wooCommerceCustomerId ), again with no consent field, so no permission state crosses the WooCommerce sync. Both conjuncts of the claim fail outright: no capture of channel, timestamp or source, and no revocation handling of any kind, keyword or otherwise. THE PRODUCT IS EXPLICIT THAT MARKETING LEAVES THE BUILDING: the changelog sells the Customer List as “a straightforward way of exporting Customer data for use a mailing list” - and that is the six-column report above, so the one marketing-adjacent affordance exports contact data with no permission state attached. CONTROLS AND POISON, ALL OF IT PUBLISHED. Concept controls (consent, opt-in/opt-out, unsubscribe, subscribe, newsletter, mailing list, GDPR, data subject, marketing, TCPA) were run tokenised over the source tree, the decompiled plugin jars, the 87-page site and the web-reporting pages, not the single English word. THREE are traps and all three fire: (a) the sole raw consent hit in the tree is Italian - data_messages_it.properties:30 exception.noparamtype=Tipo di parametro non consentito, i.e. “not permitted”; (b) the sole marketing hit in the tree is a UPC-2 prefix comment in JPanelTicket.java:1285, “4 = In-store marketing for retailers”; (c) subscrib fires 218 times in the decompiled plugin and EVERY ONE is com.unicenta.plugins.subscriber.Subscriber ( id, userName, name, firstName, lastName, nickName, email, registeredDate, url, description, subscription ) - the uniCenta.com LICENCE holder hitting /authenticate, not a marketing list. A fourth: the only permission-shaped column in any DDL is roles.permissions, a staff-ACL blob. On the site, consent fires 6 times over 3 files (the proposal said three) and none is guest consent - an EU cookie checkbox on the contact form, the Privacy Policy's lawful-basis and opt-in/opt-out/unsubscribe/newsletter wording about uniCenta's own subscribers, and the ToS assignment clause; /gdpr/ is a WordPress GDPR plugin serving request forms to unicenta.com account holders. WHAT THIS DOES NOT BOUND: the customers-only “Plus Add-ins” tile and the two “Coming Soon” slots are not enumerated in this corpus (the enumerated third-party add-ins are all database and office tools - HeidiSQL, MySQL Workbench, Toad, LibreOffice, wpDataTables - none a messaging or consent tool); the self-hosted WordPress that Web Reporting runs on can carry any newsletter plugin the operator installs; a linked WooCommerce store may hold its own consent, which the sync does not transport; and an operator can always type consent into the free-text notes column, which is not capture with channel, timestamp and source. There is no hosted or SaaS tier - Web Reporting is a separate WordPress app the operator hosts. https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/resources/com/unicenta/pos/scripts/MariaDB-create.sql · retrieved 2026-09-15 adversarially verified
Handles or explicitly documents A2P 10DLC brand and campaign registration required for the operator to send SMS through the platform.
guest-loyalty-10dlc-registration
v5-era, undated marketing. A2P 10DLC registration presupposes an SMS sending path; the partner floor ("Our integrated partners") contains WooCommerce and two "Coming Soon!" slots - no messaging aggregator. Regexes over 246 docs: /\bSMS\b|text message|MMS/i -> 0 docs; /10DLC|A2P|short ?code/i -> 0 docs. Bounded to the crawlable site; no gated guide TITLE visible in the corpus is a messaging guide (the visible titles are administrator, configuration, category/customer/product setup and import, taxes, hardware, database, reports and developer guides), but that set is a floor - /downloads/guides/ ends "Page 1 of 3" and pages 2-3 are not in this corpus, so this speaks only for the visible titles. This is a UK Java desktop POS; its outbound customer artefact is the posApps Digital Receipt, not a marketing SMS. FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · 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
v5 (10 March 2023). The v5 reporting delta is "NEW Supplier reports User reports IMPROVED Jasper Reports engine upgrade to version 6 Inventory reports Sales reports" - suppliers and users, no offer or campaign dimension. Regexes over 246 docs: /campaign/i -> 0 docs; /segment/i -> 0 docs. There is no campaign object in the product for a redemption to be attributed against, so this fails upstream of the report set (which is why the gated Reports Matrix Guide would not rescue it). https://unicenta.com/features/differences/ · retrieved 2026-09-05 adversarially verified
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
Downgraded from yes: the "no vendor fee" leg does not survive. The Customer API is a paid subscription benefit - the Apply page lists "API Access" under BASE (GBP 6 per month charged yearly, GBP 72) and "Unlimited API Access" under PLUS (GBP 144), with HOSTED carrying "API access as standard" - and the published collection's production base-url is the hosted https://api.unicenta.io. What does survive: on a self-hosted install the guest rows sit in the operator's own MySQL server, so a direct dump is self-serve, free and needs no ticket. Further shortfalls: GET /customer returns profile fields only, not transaction history; the database table reference that would document the schema is gated ("This content is available to uniCenta Customer Plus, Hosted, and Hosted Monthly 50% Subscribers only"); and the GDPR help page routes individual rights requests to "contact us to request assistance". No CSV export of the guest list is documented anywhere. https://unicenta.com/apply/ · retrieved 2026-08-09
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
v5-era, undated marketing. Partner floor (not a census): WooCommerce plus two "Coming Soon!" slots - no reputation or survey partner. Regexes over 246 docs: /net promoter|\bNPS\b|survey|trustpilot|yelp|google review|star rating/i -> 1 doc, and that one is the Privacy Policy describing uniCenta's own website surveys of its subscribers, not a product feature; /review|feedback/i -> 12 docs, all of them "customer feedback" in release announcements or "review our Privacy Policy". No post-transaction request and no score-based routing. FLOOR NOTE: /integrations/ is not a census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ announces a live Abacus Solutions International lottery integration ('We re proud to be working with Abacus Solutions International and the integration of uniCenta oPOS with their unique lottery solution') that /integrations/ omits entirely (grep -ic 'lottery|abacus' over that file = 0), so this row rests on the named-service corpus zero, with the partner page cited only for what it positively lists. https://unicenta.com/integrations/ · 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
v4 marketing (self-labelled v4), with the v5 companion /features/differences/ (10 March 2023) adding only "Flag as VIP" and "Set a Default Discount" to the customer module. The full CUSTOMER enumeration is "Account Management Address and Contact detail Barcode Credit Limit Customer Diary Customer Information Customer Store Card Discount % Label Printing Multi-Tax Categories On/Off Account Payments Photo Image Statement Transaction History VIP" - no code, no referred-by field, no two-sided reward. Regexes over 246 docs: /referral|refer a friend/i -> 0 docs; /reward point|points balance|earn points/i -> 0 docs. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
v4 marketing plus the v5 delta. The vendor names its own alternative in the same enumeration - CUSTOMER "Barcode ... Customer Store Card ... Label Printing" and SYSTEM "Barcode Scanning" - i.e. a physical/printed store card, and v5 adds only "Flag as VIP". Regexes over 246 docs: /apple wallet|google wallet|google pay|passkit|wallet pass/i -> 0 docs; /gift ?card/i -> 0 docs. Bounded to the crawlable site; a 2017-2018 gated guide could not document a pass type the vendor never names anywhere. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
v5-era in force, first-party legal page published 8 May 2018 (Brosley Ltd). The vendor states the process is manual and human, not tooled: "We will assist a customer, upon request, and as much as reasonably possible, to respond to a data subject request (SAR) they may receive under the GDPR" and "In many cases, you may be able to log into your account and edit or change information or settings available. Where this is not possible, please contact us to request assistance with any such Individual Rights Request (SAR)." Regexes: /subject access|right to erasure|erasure|deletion request|DSAR|right to be forgotten/i -> 2 docs (this page and the Privacy Policy, both about uniCenta as controller); /anonymis|anonymiz|pseudonym/i -> 0. TRAP AVOIDED: /gdpr/ carries [gdpr_request_form type="delete"] / "rectify" / "export-data" shortcodes - that is a WordPress plugin on the marketing site, tooling for website visitors, not in-app POS tooling. https://unicenta.com/unicenta_gdpr_customer_help/ · retrieved 2026-09-05 adversarially verified
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
v5 (10 March 2023). The v5 control delta is entirely ticket-side: "NEW Lock-out current ticket ... Cannot refund a Refund Cannot refund a ticket more than one time IMPROVED ... Change and delete permissions Print and re-Print permissions" and "NEW Table access lock-out ... Ticket change and delete permissions" - permissions and refund idempotency, with no loyalty object in scope. Regexes over 246 docs: /audit ?(log|trail)/i -> 0 docs; /velocity|approval|manager approval/i -> 3 docs, all forum-moderation copy in /community/, /forum-guide/ and the news page; /loyalt/i -> 2 docs, neither a redemption feature. https://unicenta.com/features/differences/ · retrieved 2026-09-05 adversarially verified
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
Undated v5-era homepage, and it carries the vendor's own forward-looking list: "LOOKING AHEAD MORE IN THE WORKS... A collection of future business posApps in-scope for development or we're looking to include. GLOBAL PAYMENTS ... eCOMMERCE TOP-UP". Even the roadmap has no AI item. Regexes over all 246 docs, including the 22 KB changelog and the twelve release-note pages 4.6 through 5.4.0 which name every shipped UOCL issue key: /\bAI\b|machine learning|artificial intelligence|predictive/i -> 0 docs. Bounded to the crawlable site; the gated guide titles visible in the corpus are dated 2017-2018 and could not carry an AI claim the roadmap does not make. https://unicenta.com/ · 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
Customer store card and credit accounts give account-tied balances, but this reads as house credit; cross-location redemption undocumented. https://unicenta.com/features/ · 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
Under-scored. The vendor features page explicitly lists employee 'CheckIn/CheckOut' under Personnel, alongside 'iButton/Dallas key' and 'Secure User Logon' authentication, with an 'Employee' report category. That is a POS-resident time punch tied to an identified employee. Claim-level (marketing features page), but affirmatively enumerated. https://unicenta.com/features/ · retrieved 2026-08-01 adversarially verified
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
uniCenta oPOS 5.4.0 source, GitHub lestola/unicenta-mirror-5.4 at commit 8771d24bb67160f6b58bba4d6f3e50c950e2fac9 ("5.4.0 release", author hugh <hughs@unicenta.com>, 2025-07-31; 81 commits, all under uniCenta addresses; pom.xml line 7 <version>5.4.0</version>; AppLocal.java 33 APP_VERSION = "5.4.0"). This is a third-party GitHub mirror, and its authorship is unsigned git metadata. The vendor's own Sources download is gated ("available to uniCenta Customer Base, Plus, Hosted, and Hosted Monthly 50% Subscribers only"). Grade A follows the record's existing precedent of citing the RohiTech 5.0 mirror at A. Schema bound: JRootApp.java 356-357 runs <db>-create.sql on a new install and <db>-upgrade_master.sql otherwise. The 5.4.0 MariaDB and MySQL upgrade_master scripts only set applications.version, and MySQL-create.sql is byte-identical to 5.0. So no schema change separates 5.0 from 5.4.0, which includes the 5.3.1 build behind the hosted "Web version" (news: "October | uniCenta hosted service lauched (5.3.1) | 5.3.1 Web version released"). The home page says WEB SERVER "Run the full version of uniCenta oPOS on any Android or iOS device, tablet or countertop machine with a browser". A punch is one INSERT and one UPDATE on four columns. DataLogicPresenceManagement.java 113-119: "INSERT INTO shifts(ID, STARTSHIFT, PPLID) VALUES (?, ?, ?)" and "UPDATE shifts SET ENDSHIFT = ? WHERE ENDSHIFT IS NULL AND PPLID = ?". It is driven from the Check In / Check Out panel with only the logged-in user's id (JPanelEmployeePresence.java 129-147, e.g. "dlpresencemanagement.IsCheckedIn(app.getAppUserView().getUser().getId())"). shifts is exactly id, startshift, endshift, pplid in MariaDB-create.sql 456-462, Derby-create.sql 353-358 and PostgreSQL-create.sql 616-621. shift_breaks (MariaDB 444-449) is id, shiftid, breakid, starttime, endtime. No column can hold a punch photo or a verification result. The epm package's only image references are button icons (user.png, ok.png, cancel.png, reload.png), and no code path captures an image at punch. The only employee image is people.image, "`image` mediumblob default NULL" (MariaDB 277), a profile picture. That field is the EMPLOYEE "Photo Image" on /features/, which lists CUSTOMER "Photo Image" in the same words. Closed add-in scope: pom.xml 361-365 depends on com.unicenta:unicenta-plugins 1.3.0. Its repo host, repo.unicenta.org, bars ClaudeBot in robots.txt, so the jar was not read. The core calls it from StartPOS.java 131-132 ("application.postMetrics(metrics); application.startEventListener(host, jRootApp, null);"), JRootFrame, MenuPanelAction.java 56-58 (plugins.configure opens initScreen("Dashboard")), JPanelCloseMoney (PaymentSense end-of-day), PaymentGatewayPaymentSense and PaymentGatewayTeya, and JPanelTicket (sendReceipt). The startup listener is handed the whole jRootApp, so the jar's reach is not mechanically bounded. What bounds the finding instead is that everything the vendor documents it doing concerns e-commerce, payments or receipts: the 5.4.0 release notes list only UOCL-298..309 WooCommerce/API/adapter stories, /api/ names only the Customer, Order and Product APIs, and /features/add-ins/other-add-ins/ lists only database and reporting tools. WordPress Web Reports only reads the POS database. Ticket.Buttons.xml 111 carries only a commented-out ticket.removeline script hook. No vendor page describes a time-clock or camera add-in. Poison: \b(photo|webcam|camera|biometric|facial|selfie)\b gives 14 lines over src/main, all non-labor. They are the customer form's Photo tab (CustomersView.java 1256, CustomersView.form 1148/1150, label.photo in 9 locale files) and the camera.png icon on the image-file picker (JImageEditor.java 356, JImageEditor.form 100). https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/java/com/unicenta/pos/epm/DataLogicPresenceManagement.java · retrieved 2026-09-13 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
ACCEPTED as no at grade A, but only after settling WHICH OUTAGE the rubric means - the identical confusion is what overturned this cell's previous no/B, which had read the vendor's MySQL requirement as a connectivity requirement. The rubric is conjunctive: punches captured "while the POS is offline" AND "reconciled on reconnect without loss or duplicate entries" AND documented. The second conjunct is definitional and it fixes the outage - only loss of the authoritative datastore creates anything to reconcile - so this cell is about the terminal losing its database/server, not about losing the internet. I score that outage and deliberately DO NOT deny the other: a single-terminal install on Derby Embedded or localhost MySQL holds its datastore in-process and is untouched by an internet outage, which is exactly why this record's order-capture-offline-order-entry and reliability-offline-order-entry stand at partial. This cell does not contradict them. EVIDENCE, re-opened at the cited commit (8771d24bb67160f6b58bba4d6f3e50c950e2fac9, "5.4.0 release", 31 Jul 2025; I cloned the mirror and checked the commit out myself). Every punch is a synchronous StaticSentence against the live JDBC session: CheckIn() builds {UUID.randomUUID(), new Date(), user} and calls m_checkin.exec on "INSERT INTO shifts(ID, STARTSHIFT, PPLID) VALUES (?, ?, ?)"; CheckOut() on "UPDATE shifts SET ENDSHIFT = ? WHERE ENDSHIFT IS NULL AND PPLID = ?"; StartBreak/EndBreak likewise on shift_breaks. Every one of these, and every read (IsCheckedIn, GetLastCheckIn), is declared "throws BasicException" with no local fallback, and JPanelEmployeePresence merely propagates it. The destination table has no room for a deferred punch: MariaDB-create.sql line 456 defines shifts as (id, startshift, endshift, pplid) - no sync, uploaded or pending column - and there is no second table, no spool file and no reconciliation routine anywhere in the tree. With the database unreachable the statement throws and the punch never exists; on reconnect Session.ensureConnection() only re-opens the socket ("// reconnect if closed" then connect()), with nothing buffered to replay. CONTROLS, re-run by me over the whole checked-out tree, text files only. "store and forward", storeandforward, deferred, spool, unsent, outbox and reconcil* are ZERO. POISON CONFIRMED AND AVOIDED: tokenised "offline" returns EXACTLY ONE hit in the entire tree and counting it would score this cell BACKWARDS - it is pos_messages_da.properties, the Danish install-topology notice "Standard databasen leveret med uniCenta oPOS er Apache Derby Embedded. Denne er beregnet til en offline / single bruger installation", i.e. offline in the STANDALONE-INSTALL sense, not the outage-tolerance sense. The other near-misses are all false positives: "pending" is setVoucherPending plus a sale_pending.png icon; "retry" is two bad-password strings; "resend" is a JPanelTicket comment about reprinting; "reconnect" is the single JDBC comment above; and of 153 "sync" hits the only non-"synchronized" cluster is com.unicenta.possync (ProductsSyncCreate / OrdersSyncCreate), an Openbravo ERP web-service sync that is COMMENTED OUT of Menu.Root.txt and whose package is not even present in the tree - it moves products and orders, never punches. WHAT THIS no DOES NOT BOUND. I opened the closed plugin jar myself (repo.unicenta.org/maven2, unicenta-plugins-1.3.3.jar, 460,041 bytes, 134 classes): its packages are woocommerce, payment (teya/paymentsense/mediapayments), subscriber, order, address, common, config, event, controller, device, subscription, screens, view, security, metrics, product, receipt and customer - none named for shift, presence, employee, punch, epm, queue or spool, and zero "offline" strings - so the plugins do not add this either. But the verdict is bounded to core 5.4.0 plus plugins 1.3.x: THIRD-PARTY ADD-INS and the vendor's HOSTED TIER are outside this source tree and are NOT denied here. THIRD CONJUNCT, failing independently: offline, punch and check-in are each ZERO across the vendor's FAQ, web-reporting, add-ins and full changelog pages, so no punch-during-outage behaviour is documented anywhere. DOUBLE-COUNT CHECK: distinct from labor-clock-in-at-pos (that punches exist at all, yes/C), from payments-offline-store-and-forward (card capture, no/B), from reliability-offline-feature-matrix (whether a matrix is published, no/C), and from the partial offline-operation cells, which turn on architecture surviving an INTERNET outage rather than on buffered-and-reconciled punches. https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/java/com/unicenta/pos/epm/DataLogicPresenceManagement.java · retrieved 2026-09-15 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
Role-based security levels with per-action permissions are a core feature; per-location scoping is undocumented and no permission catalog is published. https://sourceforge.net/projects/unicentaopos/ · retrieved 2026-08-07
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
uniCenta oPOS 5.4.0 source, GitHub lestola/unicenta-mirror-5.4 at commit 8771d24bb67160f6b58bba4d6f3e50c950e2fac9 ("5.4.0 release", author hugh <hughs@unicenta.com>, 2025-07-31; 81 commits, all under uniCenta addresses; pom.xml line 7 <version>5.4.0</version>; AppLocal.java 33 APP_VERSION = "5.4.0"). This is a third-party GitHub mirror, and its authorship is unsigned git metadata. The vendor's own Sources download is gated ("available to uniCenta Customer Base, Plus, Hosted, and Hosted Monthly 50% Subscribers only"). Grade A follows the record's existing precedent of citing the RohiTech 5.0 mirror at A. Schema bound: JRootApp.java 356-357 runs <db>-create.sql on a new install and <db>-upgrade_master.sql otherwise. The 5.4.0 MariaDB and MySQL upgrade_master scripts only set applications.version, and MySQL-create.sql is byte-identical to 5.0. So no schema change separates 5.0 from 5.4.0, which includes the 5.3.1 build behind the hosted "Web version" (news: "October | uniCenta hosted service lauched (5.3.1) | 5.3.1 Web version released"). The home page says WEB SERVER "Run the full version of uniCenta oPOS on any Android or iOS device, tablet or countertop machine with a browser". uniCenta has two override mechanisms, and neither can attribute an approver. (1) The override PIN is one terminal-wide number held in the local properties file. AppConfig.java 73-74 builds it from "new File(new File(System.getProperty(\"user.home\"))" + APP_ID ".properties", with defaults "override.check" "false" and "override.pin" "" at 376-377. Enabling the check with an empty PIN sets it to "1234" (JPanelConfigSystem.java 130-131; JPanelConfigGeneral.java 140-141). Every PIN prompt compares the typed number with that single secret. In JPanelTicket.java 656-663 (changeCount), verbatim: "Integer secret = Integer.parseInt(m_App.getProperties().getProperty(\"override.pin\")); Integer iValue = JNumberPop.showEditNumber(this, AppLocal.getIntString(\"title.override.enterpin\")); if (iValue == null ? secret == null : iValue.equals(secret)) { pinOK = true; JOptionPane.showMessageDialog(this, \"Units changed from \" + count + \" to \" + oCount);". changeCount is called from the line-quantity edits at JPanelTicket.java 1560-1716 and the line delete at 2962-2964. Ticket deletes repeat the same comparison inline at JTicketsBagRestaurant.java 336-337 and JTicketsBagShared.java 502-503. On a match nothing records that an override occurred or who supplied the PIN. The public configuration page describes the same single PIN: "Use Override? : Check and complete the required PIN to allow a User to override certain functions - like a ticket line delete - where their Role Permission normally disallows it." (2) The sales.Override permission (Role.Manager.xml 58 and Role.Administrator.xml 58, <class name="sales.Override"/>) is checked at JTicketsBagRestaurantMap.java 744 and 761 and JTicketsBagShared.java 400 and 465. It is the logged-in user's own right to open a locked or another server's ticket, not an approval, and nothing is written. The only persisted trace is the lineremoved table, whose NAME is the logged-in user. JPanelTicket.java 832-834: "dlSystem.execLineRemoved( new Object[]{ m_App.getAppUserView().getUser().getName(),". JTicketsBagShared.java 131-135: "m_App.getAppUserView().getUser().getName(), \"Void\", \"Ticket Deleted\",". Its INSERTs (DataLogicSystem.java 290 and 299) are "INSERT INTO lineremoved (NAME, TICKETID, PRODUCTID, PRODUCTNAME, UNITS)" and "INSERT INTO lineremoved (NAME, TICKETID, PRODUCTNAME, UNITS)". The table has no approver column and no primary key in MariaDB-create.sql 209-216, Derby and PostgreSQL-create.sql 484-491 alike. It is not immutable either: MariaDB removeddate is "timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP", and the shipped MySQL-clearData.sql 45 reads "delete FROM lineremoved;". Because the shared PIN never identifies a person, no add-on downstream can recover an approver the POS does not capture. Closed add-in scope: pom.xml 361-365 depends on com.unicenta:unicenta-plugins 1.3.0. Its repo host, repo.unicenta.org, bars ClaudeBot in robots.txt, so the jar was not read. The core calls it from StartPOS.java 131-132 ("application.postMetrics(metrics); application.startEventListener(host, jRootApp, null);"), JRootFrame, MenuPanelAction.java 56-58 (plugins.configure opens initScreen("Dashboard")), JPanelCloseMoney (PaymentSense end-of-day), PaymentGatewayPaymentSense and PaymentGatewayTeya, and JPanelTicket (sendReceipt). The startup listener is handed the whole jRootApp, so the jar's reach is not mechanically bounded. What bounds the finding instead is that everything the vendor documents it doing concerns e-commerce, payments or receipts: the 5.4.0 release notes list only UOCL-298..309 WooCommerce/API/adapter stories, /api/ names only the Customer, Order and Product APIs, and /features/add-ins/other-add-ins/ lists only database and reporting tools. WordPress Web Reports only reads the POS database. Ticket.Buttons.xml 111 carries only a commented-out ticket.removeline script hook. Poison: \boverride\b matches 1,917 lines in src/main, of which 1,865 are the Java @Override annotation. "approv*" matches JFileChooser.APPROVE_OPTION. "supervisor" matches once, in the Spanish leave message pos_messages_es.properties 747 ("Contacta con el Supervisor para cancelar la salida"). On unicenta.com, "Product Category over-ride" is a product setting. https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/java/com/unicenta/pos/sales/JPanelTicket.java · retrieved 2026-09-13 adversarially verified
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
v4 marketing, with the v5 companion /features/differences/ (10 March 2023) which has no employee section at all - its only staff-facing v5 item is SYSTEM "Primary + Secondary iButton (Dallas key) support". The EMPLOYEE module is enumerated in full: "Access Levels Breaks and Leave CheckIn/CheckOut Employee Info iButton/Dallas key Performance Photo Image Security Card" - timekeeping and identification, no shift publishing. Regexes over 246 docs: /schedul|roster|rota\b|shift/i -> 3 docs and ALL THREE ARE NOISE ("PCI/EMV liability shift", "an un-scheduled release for 4.4", "Shift to new release timeline"); /overtime/i -> 0 docs. https://unicenta.com/features/ · retrieved 2026-09-05 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
v4 marketing plus the v5 delta (which adds no employee or reporting-forecast item; its report delta is "NEW Supplier reports User reports"). /features/ enumerates "REPORTS Employee Customer Financial Inventory Sales Supplier" and the EMPLOYEE module as "Access Levels Breaks and Leave CheckIn/CheckOut Employee Info iButton/Dallas key Performance Photo Image Security Card". Regexes over 246 docs: /forecast/i -> 0 docs; /labor|labour/i -> 2 docs, both non-product (the sponsors page and a news item). Recommended staffing from sales history requires a scheduling target that does not exist. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
v4, and DEPRECATED in v5 - this is the vendor's only manager dashboard product and /features/differences/ (10 March 2023) lists "DEPRECATED ... Web Reporting (separate app )". Its dashboard is enumerated: "SALES DASHBOARD Sales Summaries Category Top 10 Customer Top 10 Product Top 10 User Top 10 Category Sales Customer Sales" - no labor cost, no percentage of sales. The page itself ends "more to come", so it is paired here with the v5 deprecation rather than carrying the absence alone. Regexes over 246 docs: /dashboard/i -> 2 docs (this page and release 5.2, whose hit is the subscriber "Plugin dashboard" bug UOCL-261); /labor|labour/i -> 2 docs, both non-product. https://unicenta.com/features/web-reporting/ · retrieved 2026-09-05 adversarially verified
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
v4 marketing, paired with the v5 delta which has no employee section. The EMPLOYEE module - "Access Levels Breaks and Leave CheckIn/CheckOut Employee Info iButton/Dallas key Performance Photo Image Security Card" - has no threshold concept, and /pages/configure-unicenta-opos/ (10 KB, the full Configuration panel walkthrough) contains no overtime setting. Regexes over all 246 docs including the 22 KB changelog and the twelve release notes 4.6-5.4.0: /overtime/i -> 0 docs; /hours worked|timesheet|time sheet|attendance/i -> 0 docs. A warn-or-block at clock-in would be a shipped behaviour and would carry a UOCL issue key; none exists. https://unicenta.com/features/ · 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
uniCenta oPOS 5.4.0 source, GitHub lestola/unicenta-mirror-5.4 at commit 8771d24bb67160f6b58bba4d6f3e50c950e2fac9 ("5.4.0 release", author hugh <hughs@unicenta.com>, 2025-07-31; 81 commits, all under uniCenta addresses; pom.xml line 7 <version>5.4.0</version>; AppLocal.java 33 APP_VERSION = "5.4.0"). This is a third-party GitHub mirror, and its authorship is unsigned git metadata. The vendor's own Sources download is gated ("available to uniCenta Customer Base, Plus, Hosted, and Hosted Monthly 50% Subscribers only"). Grade A follows the record's existing precedent of citing the RohiTech 5.0 mirror at A. Schema bound: JRootApp.java 356-357 runs <db>-create.sql on a new install and <db>-upgrade_master.sql otherwise. The 5.4.0 MariaDB and MySQL upgrade_master scripts only set applications.version, and MySQL-create.sql is byte-identical to 5.0. So no schema change separates 5.0 from 5.4.0, which includes the 5.3.1 build behind the hosted "Web version" (news: "October | uniCenta hosted service lauched (5.3.1) | 5.3.1 Web version released"). The home page says WEB SERVER "Run the full version of uniCenta oPOS on any Android or iOS device, tablet or countertop machine with a browser". A break type is only a name, a visible flag and notes. MariaDB-create.sql 90-96: "CREATE TABLE `breaks` ( `id` varchar(255) NOT NULL, `name` varchar(255) NOT NULL, `visible` tinyint(1) NOT NULL default '1', `notes` varchar(255) default NULL, PRIMARY KEY ( `id` )". Derby-create.sql 52-58 and PostgreSQL-create.sql 638-644 have the same four columns. PostgreSQL seeds only names: "INSERT INTO breaks(id, name, visible, notes) VALUES ('0', 'Lunch Break', TRUE, NULL);" and "('1', 'Tea Break', TRUE, NULL)". There is no duration, jurisdiction, paid/unpaid flag or shift-length trigger. Starting a break performs no check. DataLogicPresenceManagement.java 254-257: "public final void StartBreak(String UserID, String BreakID) throws BasicException { String ShiftID = GetShiftID(UserID); Object[] value = new Object[] {UUID.randomUUID().toString(), ShiftID, BreakID, new Date()}; m_startbreak.exec(value);". It is called straight from the break button at JPanelEmployeePresence.java 103-105: "dlpresencemanagement.StartBreak(app.getAppUserView().getUser().getId(), m_break.getId());". EndBreak (265-268) only writes the end time. There is no attestation prompt, missed-break flag or premium-pay concept. \b(jurisdiction|overtime|meal|attest\w*|premium)\b gives 0 lines over src/main. The EPM menu entries in Role.Manager.xml 183-190 are BreaksPanel, JPanelEmployeePresence, LeavesPanel and three reports: epm_dailypresence.bs, epm_dailyschedule.bs and epm_performance.bs. epm_performance.bs 25-26 sums ticket-line sales per person from people, receipts, tickets and ticketlines, and none of the reports evaluates breaks. Closed add-in scope: pom.xml 361-365 depends on com.unicenta:unicenta-plugins 1.3.0. Its repo host, repo.unicenta.org, bars ClaudeBot in robots.txt, so the jar was not read. The core calls it from StartPOS.java 131-132 ("application.postMetrics(metrics); application.startEventListener(host, jRootApp, null);"), JRootFrame, MenuPanelAction.java 56-58 (plugins.configure opens initScreen("Dashboard")), JPanelCloseMoney (PaymentSense end-of-day), PaymentGatewayPaymentSense and PaymentGatewayTeya, and JPanelTicket (sendReceipt). The startup listener is handed the whole jRootApp, so the jar's reach is not mechanically bounded. What bounds the finding instead is that everything the vendor documents it doing concerns e-commerce, payments or receipts: the 5.4.0 release notes list only UOCL-298..309 WooCommerce/API/adapter stories, /api/ names only the Customer, Order and Product APIs, and /features/add-ins/other-add-ins/ lists only database and reporting tools. WordPress Web Reports only reads the POS database. Ticket.Buttons.xml 111 carries only a commented-out ticket.removeline script hook. Poison: \bbreaks?\b over the java sources matched about 325 lines (324 in my count; publish only the invariance), and 284 of them are the Java `break;` statement. On unicenta.com, 4 of the 5 page hits are release-note boilerplate ("make sure nothing breaks"). The fifth is the /features/ label "Breaks and Leave". https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/resources/com/unicenta/pos/scripts/MariaDB-create.sql · retrieved 2026-09-13 adversarially verified
Enforces minor-labor restrictions (age-based maximum hours, prohibited time windows, school-day limits) at both scheduling and clock-in.
labor-minor-labor-rules
v4 marketing plus the v5 delta (no employee section). This rubric requires enforcement "at both scheduling and clock-in", and the scheduling half is independently bounded absent: /schedul|roster|rota\b|shift/i -> 3 docs, all three release-management noise, and the EMPLOYEE enumeration is "Access Levels Breaks and Leave CheckIn/CheckOut Employee Info iButton/Dallas key Performance Photo Image Security Card". Regexes: /minor|under ?18|child labo/i -> 1 doc, the changelog, where every hit is "Minor improvements" / "minor fixes" in release prose; /jurisdiction|meal break|rest break|premium pay|\bFLSA\b|fair workweek|predictive schedul/i -> 1 doc, the ToS governing-law clause. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
v4 configuration walkthrough, paired as required with the v5 delta which lists "NEW ... Service Charge Option" - the same feature, confirmed shipped in v5. The vendor's entire gratuity-adjacent mechanism is a flat charge: "Enable Service Charge : Used together with the special xxx988 Product to add (optional) fixed charge to a sales transaction. Service Charge Rate ?% : The rate to charge. This value should be net of Tax. Restaurant mode only? : Will only be applied when Restaurant screen". It posts to a product line; there is no employee dimension and nothing to distribute. Regexes over all 246 docs: /\btips?\b|gratuit|tip ?out|tronc/i -> 0 docs. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
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
v4 configuration walkthrough with its v5 confirmation ("NEW ... Service Charge Option" in /features/differences/, 10 March 2023). The service charge is applied "Used together with the special xxx988 Product to add (optional) fixed charge to a sales transaction" - it lands on a ticket line, never on an employee, so no per-shift contribution or distribution record can exist. Regexes over 246 docs: /\btips?\b|gratuit|tip ?out|tronc/i -> 0 docs; /audit ?(log|trail)/i -> 0 docs. Bounded to the crawlable site; the gated Reports Matrix Guide could only enumerate reports over data the product does not capture. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
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
v4 marketing plus the v5 delta ("NEW Supplier reports User reports"). /features/ enumerates the report set as "REPORTS Employee Customer Financial Inventory Sales Supplier" with no payroll export. Regexes over all 246 docs including the twelve release notes to 5.4.0: /payroll|wages|salary|P60|PAYE/i -> 0 docs; /\bW-2\b|\bIRS\b|tipped occupation|box 12|box 14/i -> 0 docs; /\btips?\b|gratuit|tip ?out|tronc/i -> 0 docs. The product does not capture tips at all, so the tax-year-2026 split cannot be produced regardless of export format. https://unicenta.com/features/ · 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
Undated v5-era homepage. The vendor publishes its own product roadmap and payroll is not on it: "LOOKING AHEAD MORE IN THE WORKS... A collection of future business posApps in-scope for development or we're looking to include. GLOBAL PAYMENTS ... eCOMMERCE TOP-UP", and the shipped posApps named alongside are DIGITAL RECEIPTS, CARD PAYMENTS and REST API. /integrations/ is a partner FLOOR, not a census (WooCommerce plus two "Coming Soon!") with no payroll provider either. Regexes over 246 docs: /payroll|wages|salary|P60|PAYE/i -> 0 docs. Both editions - Community GPL and the paid Brosley Ltd subscription - are covered, since the roadmap is for the subscription posApps line. https://unicenta.com/ · retrieved 2026-09-05 adversarially verified
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
Integrations catalog names only WooCommerce, QuickBooks (coming soon) and Etsy (coming soon). No payroll provider. https://unicenta.com/integrations/ · 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
v4 marketing plus the v5 delta, which has no employee section. Employee interaction is enumerated as terminal-side identification only: "Access Levels Breaks and Leave CheckIn/CheckOut Employee Info iButton/Dallas key Performance Photo Image Security Card", and v5 adds "Primary + Secondary iButton (Dallas key) support". This is a Java desktop client. Regexes over 246 docs: /mobile app|employee app|staff app/i -> 0 docs; /schedul|roster|rota\b|shift/i -> 3 docs, all release-management noise. With no shift object and no employee-facing app there is nothing to swap or claim. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
'Employee' is a documented report category implying per-employee sales; average check, attachment rate and void/comp rate are not specified. https://unicenta.com/features/ · 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
uniCenta oPOS 5.0 source (GitHub mirror RohiTech/unicenta5-src of the official SourceForge unicenta-opos-5.0.zip; SourceForge's download host is robots-barred): products_bundle links a product to component products with a quantity, and DataLogicSales.adjustStock calls itself for each component ("adjustParams[3] = ((Double)((Object[])params)[3]) * component.getQuantity();" then "adjustStock(adjustParams);"), so bundles can contain bundles and stock is exploded through every level on sale. Partial: there is no BOM costing -- the product buy price is a plain operator-typed field (ProductsEditor), no code rolls component costs into a parent's cost, and nothing recalculates when a component's cost changes. Version-bound to 5.0; the current build is 5.4.0. https://github.com/RohiTech/unicenta5-src/blob/77b35b727ad9ed2f0ddfc53fc6e402a15f637cb5/src/main/java/com/unicenta/pos/forms/DataLogicSales.java · retrieved 2026-09-12 adversarially verified
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
uniCenta oPOS 5.4.0 source, GitHub lestola/unicenta-mirror-5.4 at commit 8771d24bb67160f6b58bba4d6f3e50c950e2fac9 ("5.4.0 release", author hugh <hughs@unicenta.com>, 2025-07-31; 81 commits, all under uniCenta addresses; pom.xml line 7 <version>5.4.0</version>; AppLocal.java 33 APP_VERSION = "5.4.0"). This is a third-party GitHub mirror, and its authorship is unsigned git metadata. The vendor's own Sources download is gated ("available to uniCenta Customer Base, Plus, Hosted, and Hosted Monthly 50% Subscribers only"). Grade A follows the record's existing precedent of citing the RohiTech 5.0 mirror at A. Schema bound: JRootApp.java 356-357 runs <db>-create.sql on a new install and <db>-upgrade_master.sql otherwise. The 5.4.0 MariaDB and MySQL upgrade_master scripts only set applications.version, and MySQL-create.sql is byte-identical to 5.0. So no schema change separates 5.0 from 5.4.0, which includes the 5.3.1 build behind the hosted "Web version" (news: "October | uniCenta hosted service lauched (5.3.1) | 5.3.1 Web version released"). The home page says WEB SERVER "Run the full version of uniCenta oPOS on any Android or iOS device, tablet or countertop machine with a browser". This settles the v5 Units Of Measure feature, which /features/differences/ (10 March 2023) lists as "Products Units Of Measure (UOM)" under DEPRECATED and "Units Of Measure (UOM)" under NEW. In 5.4.0 a unit of measure is an id and a name and nothing else. MariaDB-create.sql 655-659: "CREATE TABLE `uom` ( `id` VARCHAR(255) NOT NULL, `name` VARCHAR(255) NOT NULL, PRIMARY KEY ( `id` ) )". Derby-create.sql 509-513 and PostgreSQL-create.sql 718-722 are identical in shape, and Derby seeds "INSERT INTO uom(id, name) VALUES ('0','Each');" (649). The data layer and editor match. DataLogicSales.java 2569 has "SELECT ID, NAME FROM uom ORDER BY NAME"; getTableUom at 2554-2557 defines columns new String[]{"id", "name"}; UomInfo.java 10-11 has fields m_sID and m_sName. A product points to exactly one unit: products has "`uom` varchar(255) default '0'," (MariaDB 339), and every other java uom reference is a SELECT/UPDATE column, the ProductsEditor label, the CSV import default "0" (JPanelCSVImport.java 915) or Transfer.java copying the table. products (310-349) has no purchase, recipe or count unit and no conversion-factor or yield/waste column. stockvolume is labelled "Product Size" (pos_messages.properties 469) and is only read, edited and saved; stockunits is labelled "In Stock" (532). Stock movements (stockdiary units, price) and bundle components (products_bundle quantity) are all in the product's single unit. The Product API and WooCommerce product sync write into this same products table, which has one uom reference and no factor column. Closed add-in scope: pom.xml 361-365 depends on com.unicenta:unicenta-plugins 1.3.0. Its repo host, repo.unicenta.org, bars ClaudeBot in robots.txt, so the jar was not read. The core calls it from StartPOS.java 131-132 ("application.postMetrics(metrics); application.startEventListener(host, jRootApp, null);"), JRootFrame, MenuPanelAction.java 56-58 (plugins.configure opens initScreen("Dashboard")), JPanelCloseMoney (PaymentSense end-of-day), PaymentGatewayPaymentSense and PaymentGatewayTeya, and JPanelTicket (sendReceipt). The startup listener is handed the whole jRootApp, so the jar's reach is not mechanically bounded. What bounds the finding instead is that everything the vendor documents it doing concerns e-commerce, payments or receipts: the 5.4.0 release notes list only UOCL-298..309 WooCommerce/API/adapter stories, /api/ names only the Customer, Order and Product APIs, and /features/add-ins/other-add-ins/ lists only database and reporting tools. WordPress Web Reports only reads the POS database. Ticket.Buttons.xml 111 carries only a commented-out ticket.removeline script hook. Poison: \b(conversions?|convert|factor|yields?|waste)\b gives 9 lines over src/main, none about inventory. They are DeviceTicket.java 387 "Convert number to string" and 404 "Convert hex to character", five DeviceScannerComm byte convert() lines, TimeUnit convert in ElapsedTimeBetweenDates.java 39, and the sales_categorysalesmysql.bs 26 comment "Convert lowercasednname to UPPERCASE". https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/resources/com/unicenta/pos/scripts/MariaDB-create.sql · retrieved 2026-09-13 adversarially verified
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
v4 feature enumeration bounded forward to v5; the substrate the rubric needs (a recipe) does not exist, so no report can compute theoretical usage. /features/ INVENTORY block, verbatim and complete: "Attributes/Modifiers Auxiliaries Barcodes Bundles Categories Custom Buttons Locations Loss Prevention Min/Max levels Multi-Warehouse Multi-Store Opening Stock Printer assignment Product Image Real-time Lookup Stock Management Stock levels Supplier Transactions Transfers User-definable buttons". Absence controls over the vendor vocabulary across all 246 docs: /recipe|ingredient|bill of material/i -> 0, /variance|theoretical|shrink|waste|wastage/i -> 1 and that hit is a news-blog aside "We don t have time to waste on this silly nonsense", /stocktake|stock take|physical count|inventory count|cycle count/i -> 0. The nearest published concept is Product Bundles, described in the changelog as "Master Product with sub-Products" - a sell-together grouping, not a yield-bearing recipe. v5-era bound: /features/differences/ (10 March 2023) PRODUCTS NEW list is "Units Of Measure (UOM) Assign main Supplier Create new Supplier pop-up View a Product s stock movements View multi-location Stock Order in Catalogue Product Category over-ride Image in Product Finder" and its reports block is "NEW Supplier reports User reports IMPROVED Jasper Reports engine upgrade to version 6 Inventory reports Sales reports" - no recipe and no variance. Bounded to the crawlable site. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
Features page states stock levels track in real time as sales occur; modifier-driven and recipe-driven depletion are not documented. https://unicenta.com/features/ · 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
The /woocommerce/ page is the only current v5-era technical integration document uniCenta publishes, and it settles the direction of sync. Verbatim: "uniCenta now supports WooCommerce! Synchronize Customers Synchronize Orders Synchronize Products ... Press the Get All Products button to retrieve all the products from WooCommerce ... Enable the api for each type of data you want to sync in the background uniCenta will then receive any updates on WooCommerce." The flow is inbound - WooCommerce webhooks POST to https://api.unicenta.io/woocommerce/{customer,order,product} and uniCenta receives; nothing pushes availability outward, and the objects are three (customers, orders, products), not stock or availability. A stock-threshold signal does exist in v5 - /features/differences/ (10 March 2023) NEW list contains "Stock level notification", and /features/ (v4) INVENTORY lists "Min/Max levels" - but it is a notification, not an 86 action. Absence controls across all 246 docs: /\b86\b|eighty.?six/i -> 2 (both are "x86" in installer filenames), /unavailab/i -> 0, /recipe|ingredient|bill of material/i -> 0 (so no component-level depletion exists to trigger on), /marketplace|deliveroo|ubereats|uber eats|just eat|doordash|grubhub/i -> 0. Bounded to the crawlable site. https://unicenta.com/woocommerce/ · retrieved 2026-09-05 adversarially verified
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
Stock management with min/max and multi-warehouse counting documented; distinct full/spot/cycle modes with separate variance history are not. https://unicenta.com/features/ · 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
v4-era FAQ hardware section, bounded forward by the current /apply/ plan page; both describe access modes that are network-dependent by construction. FAQ verbatim: "If you want to run uniCenta oPOS on an Apple iPad or Android tablet then that s possible too, though you will first need to install uniCenta oPOS on a host PC or server and then use an RDP client to connect to it." An RDP session cannot accept counts with no connectivity. The v5-era bound is /apply/, whose HOSTED plan reads "No setup required Runs on an iPad Runs on an Android Tablet Runs in most Browsers custom URL with https daily backups" - browser access to a cloud instance, equally network-dependent. There is no separate counting client: /stocktake|stock take|physical count|inventory count|cycle count/i -> 0 across all 246 docs; /offline|off-line/i -> 2 and neither concerns data capture. Counting is a desktop back-office form - /features/differences/ (10 March 2023) lists "Stock Maintenance" among v5 NEW in-app items while separately deprecating the old standalone app. Scanning itself is supported (FAQ: "uniCenta oPOS can also handle Serial (COM) scanners"), so the failing clause is the offline mobile client, not the scanner. Bounded to the crawlable site. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
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
Supplier records exist but there are no distributor catalog or EDI integrations; the integrations catalog has one live partner. https://unicenta.com/integrations/ · 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
v4 feature enumeration bounded forward to v5. /features/ SUPPLIER block, verbatim and complete: "Account Management Address and Contact detail Assign to Product Credit Limit Diary Record deliveries Sales Track inventory Transaction History" - "Record deliveries" is manual entry and is the whole of the goods-in story. Absence controls over the vendor vocabulary across all 246 docs: /OCR|optical char/i -> 0, /purchase order|goods received|receive stock|delivery note|supplier invoice/i -> 0. v5-era bound: /features/differences/ (10 March 2023) supplier and product NEW lists are "Units Of Measure (UOM) Assign main Supplier Create new Supplier pop-up View a Product s stock movements ..." and the complete 5.0 -> 5.4.0 release-note sequence adds only Java 11/MariaDB, Digital Receipts, PaymentSense/Teya and the Customer/Order/Product/WooCommerce APIs. The only bulk-in path published is CSV import (the members-only "Product Import" and "Customer Import" guides, and the third-party add-in list recommending "SmartCSV.fx Excellent free visual CSV editor"). Bounded to the crawlable site. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
v4 feature enumeration bounded forward to v5. /features/ SUPPLIER block verbatim: "Account Management Address and Contact detail Assign to Product Credit Limit Diary Record deliveries Sales Track inventory Transaction History" - a Diary and a Transaction History, with no price series and no comparison. Absence controls across all 246 docs: /threshold/i -> 0, /purchase order|goods received|receive stock|delivery note|supplier invoice/i -> 0, /alert|notification/i -> 6 and the only product-side hit is /features/differences/ "Stock level notification" (a quantity signal, not a price one); the rest are website, forum and update notices including the /apply/ line "Update Notifications". v5-era bound: /features/differences/ (10 March 2023) supplier NEW is "Assign main Supplier Create new Supplier pop-up" and reports NEW is "Supplier reports User reports" - a report added, but no price-variance alerting language anywhere. Bounded to the crawlable site; the gated v4 Administrator guide is outside it. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
Min/max stock levels are documented and drive reorder visibility; forecast-driven suggested PO quantities are not. https://unicenta.com/features/ · 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
Stock movement adjustments allow shrinkage entry, but a reason-coded waste workflow with separate waste-cost reporting is not documented.
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
v4 feature enumeration bounded forward to v5. /features/ INVENTORY block verbatim and complete: "Attributes/Modifiers Auxiliaries Barcodes Bundles Categories Custom Buttons Locations Loss Prevention Min/Max levels Multi-Warehouse Multi-Store Opening Stock Printer assignment Product Image Real-time Lookup Stock Management Stock levels Supplier Transactions Transfers User-definable buttons" - stock is a quantity per location with no date and no lot dimension. Absence controls over the vendor vocabulary across all 246 docs: /expir|use.?by|best before|shelf life|sell.?by/i -> 2 and both are subscription expiry (the Terms of Service, and /apply/ "uniCenta oPOS does not stop working after your subscription expires"); /batch|lot number|traceab/i -> 0. v5-era bound: /features/differences/ (10 March 2023) products NEW adds "Units Of Measure (UOM)" and stock-movement views but no date attribute, and the 5.0 -> 5.4.0 release notes add none. Bounded to the crawlable site. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
Supports partial-bottle liquid inventory by weight (scale integration) or by bottle fraction for bar and beverage counting.
inventory-bar-partial-bottle
Weighing scales support by-weight retail items; no partial-bottle or pour-spout beverage inventory documented. https://unicenta.com/features/ · 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
QuickBooks is listed as 'Coming Soon!'; no other accounting connector or GL account mapping exists. https://unicenta.com/integrations/ · 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
Named shortfall: no recipe/ingredient costing. Release notes document stock as native to the single Java application - 'Stock Management.java' state-transition changes, 'Switch Stock popup Min and Max values', 'Add missing stockcurrent SQL join causing Location filter error' (multi-location stock), and the inventory.bs/inventorybroken.bs/inventorylistdetail.bs report set - with no third-party inventory product involved. Nothing uniCenta publishes describes recipe or ingredient-level costing/depletion; the vendor's own SourceForge forum answers that request with a Product-Bundles workaround that deducts stock from one parent product only. https://unicenta.com/support/changelog-unicenta-opos/ · retrieved 2026-08-06
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
Web Reports give browser-accessible reporting from the BASE tier and HOSTED adds off-premise HTTPS access; no live dashboard or mobile app. https://unicenta.com/apply/ · 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
Close Cash plus financial reports produce a day close; a single document covering tax, tips, discounts, refunds and expected deposit is unspecified. https://unicenta.com/features/ · 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
Sales reports cover product-level mix; modifier-level PMIX and daypart or revenue-center filtering are not documented. https://unicenta.com/features/ · 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
uniCenta oPOS 5.0 source (GitHub mirror RohiTech/unicenta5-src of the official SourceForge unicenta-opos-5.0.zip; SourceForge's download host is robots-barred): deleting a ticket line calls DataLogicSystem.execLineRemoved, which runs "INSERT INTO lineremoved (NAME, TICKETID, PRODUCTID, PRODUCTNAME, UNITS)" with the logged-in user's name; removeddate defaults to CURRENT_TIMESTAMP, and the shipped Users > Voids report (users_voids.bs) lists NAME, PRODUCTNAME, REMOVEDDATE, UNITS. Partial: no approving manager is recorded (the override is a single shared PIN), lineremoved has no reason-code column, and comps, discounts and price overrides are not logged at all (ticketlines stores only the resulting price). Version-bound to 5.0; the current build is 5.4.0 and the hosted web version is not in the corpus. https://github.com/RohiTech/unicenta5-src/blob/77b35b727ad9ed2f0ddfc53fc6e402a15f637cb5/src/main/java/com/unicenta/pos/forms/DataLogicSystem.java · retrieved 2026-09-12 adversarially verified
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
Close Cash with counted-versus-expected cash and Pay Ins/Outs is documented; per-employee and per-drawer breakdown is not specified. https://unicenta.com/features/ · 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
uniCenta oPOS 5.4.0 source, GitHub lestola/unicenta-mirror-5.4 at 8771d24bb67160f6b58bba4d6f3e50c950e2fac9 (local checkout verified at that commit). The rubric is conjunctive - sales per labour hour AND labour cost as a percent of sales, by hour, by department and by employee, from clocked hours - and NEITHER conjunct is produced, so this is not a partial. uniCenta ships the two raw ingredients and never joins them. The sales half, epm_performance.bs (Menu.EPM.PerformanceReport): 'SELECT people.NAME, MIN(receipts.DATENEW) AS STARTDATE, MAX(receipts.DATENEW) AS ENDDATE, SUM(ticketlines.UNITS * ticketlines.PRICE) AS TOTAL FROM people, receipts, tickets, ticketlines WHERE people.ID = tickets.PERSON ... GROUP BY people.NAME' - it never names `shifts`, and STARTDATE/ENDDATE are the first and last SALE, not clock-in/clock-out. Its epm_performance.jrxml declares only fields NAME/STARTDATE/ENDDATE/TOTAL and two Sum variables (BIGTOTAL, PARTIALTOTAL) - there is no division, so not even a sales-per-elapsed-hour rate is rendered; its column labels are 'Name | Start Date | End Date | Cash Value'. The hours half, epm_dailypresence.bs: 'SELECT people.NAME, shifts.STARTSHIFT, shifts.ENDSHIFT, CONCAT(\'\',TIMEDIFF(shifts.ENDSHIFT, shifts.STARTSHIFT)) AS TOTAL FROM people LEFT JOIN shifts ON shifts.PPLID = people.ID' - 'Total Hours', no money term anywhere. Bounded as a CLOSED enumeration, not a search: the shipped report set is 70 .bs scripts in src/main/resources/com/unicenta/reports, and `shifts` or `leaves` appear in exactly two of them (epm_dailypresence, epm_dailyschedule), both money-free; users_sales.bs and users.bs are sales/roster only. The cost conjunct is structurally impossible, not merely unbuilt: `people` is CREATE TABLE `people` ( id, name, apppassword, card, role, visible, image ) in MariaDB-create.sql with no wage, pay-rate or salary column, and `role` is a permissions role joined to `roles`, not a job code or department - so there is no labour-dollar figure and no department axis to report on at any granularity. Tokenised absence controls over the whole 5.4.0 tree: wage, wages, salary, salaries, payrate, pay_rate, hourlyrate, labourcost, labour, labor, productivity, overtime and hourly are ALL ZERO (the only clock-in hit is a code comment in DataLogicPresenceManagement.java). The web-reporting add-in, the corpus a previous pass left unread, adds nothing: /features/web-reporting/ enumerates its whole surface and the USERS branch is 'Summary Statistics | more to come...', while the live demo at webdemo.unicenta.org/web_reports offers 'User List | User Sales' and user-sales.html is ( NAME, FIRST SALE DATE, LAST SALE DATE, TOTAL SALES ) - the same sales-only shape. POISON PUBLISHED, so a later pass does not re-trip it: (1) `hourly` in the web-reporting corpus is the chart title 'Sales Today Hourly' and in the site corpus a downloadable script 'Hourly Sales - Exactly that!' - both are sales by hour of day with no labour denominator, and both read as labour reporting to a substring grep; (2) the closed plugin jars give phantom hits on binary scan - decompiled, unicenta-plugins 1.3.3 contains com/unicenta/plugins/metrics/{Metrics,PosMetricsService}, which is INSTALL TELEMETRY (subscriber, uniCentaVersion, device, location, os.name POSTed to <adminUrl>/pos-metrics), not a productivity metric; (3) the same controls are zero across both decompiled jars. This supersedes the earlier unknown, which deferred to the members-only v4 'Developer Reports Matrix Guide': the shipped report scripts ARE the report set, and a guide can only document them. BOUND: core 5.4.0 + closed plugins 1.3.x + the vendor's own web-reporting add-in. NOT bounded - third-party add-ins, anything a user writes themselves (the reports are editable BeanShell, and a site could add a wage column and its own .bs), and the Hosted tier, none of which are in the source tree. Note also that the vendor's v5 delta lists Web Reporting as DEPRECATED, so the one add-in that could have carried this is on the way out rather than in. https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/resources/com/unicenta/reports/epm_performance.bs · retrieved 2026-09-15 adversarially verified
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
An Employee report category exists; average check, items per check, attachment rate and tip % are not documented. https://unicenta.com/features/ · 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
v5-era partner floor plus a vocabulary zero. /integrations/ verbatim in full: "Our integrated partners offer unique services that seamlessly integrate with uniCenta oPos ... Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products ... Learn More Coming Soon! Learn More Coming Soon! Learn More" - one live partner and two empty slots, so there is no marketplace commission to net out. Absence controls across all 246 docs: /marketplace|deliveroo|ubereats|uber eats|just eat|doordash|grubhub/i -> 0, /commission/i -> 1 and that hit is uniCenta own affiliate commission on the wpDataTables plugin, /kiosk/i -> 0, /online order/i -> 0. There is also no channel dimension on a ticket: the vendor only off-premise construct is a downloadable v4 script, /downloads/scripts/ verbatim "Take Out script to handle a sales ticket line take out item Ideal for countries like Germany and Switzerland where Customer Off-premise purchases (like take outs) are offered at same as On-premise Sell Price including Tax. This script retains the item retail Sell Price (inc On-premise) and recalculates the tax margin" - a per-line tax recalculation, not a reportable channel. CAVEAT ON THE BOUND: /integrations/ is not a complete census of uniCenta third-party work - https://unicenta.com/lotteryeverywhere_plus_unicenta-opos/ documents an Abacus Solutions International lottery integration that /integrations/ omits - so this row rests on the corpus-wide zero for the named marketplaces as much as on the partner page. https://unicenta.com/integrations/ · retrieved 2026-09-05 adversarially verified
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
v4 Configuration reference (the complete published settings surface) bounded forward by the v5 delta and the 5.x release notes. Its PERIPHERALS block ends at "Reports Printer : A locally attached or network printer" - reports go to a printer or a file, and no schedule, recipient list or destination is configurable anywhere on the panel. Absence controls across all 246 docs: /schedule.{0,15}report|email.{0,15}report/i -> 0; /forecast/i -> 0. The deprecated v4 web add-in was a browse-only WordPress surface - /features/web-reporting/ verbatim "uniCenta oPOS Web Reporting is our open source add-in Exclusive to our uniCenta version 4 customers Requires a web host and uses the massively popular WordPress platform" - and it is listed under DEPRECATED in /features/differences/ ("Web Reporting (separate app )"). v5-era bound: the complete 5.0 -> 5.4.0 release-note sequence contains no scheduling issue key, and its only report entries are bugs ("UOCL-274 top 10 sales report not working", "UOCL-290 reports not saving to xls format"). The Configuration page self-disclaims completeness ("new options ... not shown here"), which is why the v5 release-note sequence is carried alongside it. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
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
Re-pointed and corrected. docs.unicenta.com is an Insomnia Documenter v0.4.1 page whose HTML is a JS shell; its collection loads unauthenticated from /insomnia.json (16,791 bytes; sibling guessed paths return the 730-byte shell, so this is a real hit). The export documents 15 requests across three groups - customer (GET/POST/PUT/DELETE plus /customer/status), order (GET/POST/DELETE plus /order/status) and product (GET/POST/PUT/DELETE plus /product/status) - against base URLs https://api.unicenta.io (prod) and https://dev.unicenta.io, with HTTP Basic auth (api-username/api-password) and complete JSON request bodies. Partial, not yes: orders and menu/product are covered but there are no payments, labor or reporting endpoints, no webhooks, no rate limits, and no published self-service route to credentials. The gated developer material - unicenta.com/developer/ now 301s to /developer-section/, which still reads 'This content is available to uniCenta Customer Plus, Hosted, and Hosted Monthly 50% Subscribers only' - is guides and the database-table reference, not the API reference. https://docs.unicenta.com/insomnia.json · retrieved 2026-08-09 adversarially verified
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
Previous reasoning withdrawn: the API is not "inbound only" - it publishes reads as well as writes (GET /customer, GET /order, GET /product, plus per-resource /status probes). The absence that actually carries the no is verb-level and structural: across all 14 requests in uniCenta's complete published API export there is no subscription, callback or event resource of any kind, no operation to register a customer-supplied endpoint URL, and therefore nothing that could carry a retry policy or a payload signature. Authentication is HTTP Basic with an api-username/api-password pair, a client-to-server posture only. Order and payment lifecycle changes are discoverable solely by polling GET /order. https://docs.unicenta.com/insomnia.json · retrieved 2026-08-09
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
API access is a paid benefit: BASE £72/yr includes API access, PLUS £144/yr unlimited. Not available on the free build. https://unicenta.com/apply/ · 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
Directly contradicted by the vendor's own pricing page: 'Web Reporting' and 'Remote Order Display' are enumerated as BASE (£72/yr) subscription benefits, not free-build capabilities, and the current build itself is subscriber-only. Reporting access is gated by a paid tier even if there is no separate analytics SKU. https://unicenta.com/apply/ · retrieved 2026-08-01 adversarially verified
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
No vendor retention statement exists on any reachable page; the database-table reference and reports guides are gated - 'This content is available to uniCenta Customer Plus, Hosted, and Hosted Monthly 50% Subscribers only.' Only the architecture is documented: on a self-hosted install the operator owns the MySQL instance, so no vendor-imposed retention window or archive-retrieval fee applies. Shortfalls: Web Reporting is an enumerated BASE (GBP 72/yr) subscription benefit, not a free-build capability; retention and export on the vendor-run HOSTED tier are undocumented beyond 'daily automated backups'; no report lookback range is published. https://unicenta.com/developer-section/ · retrieved 2026-08-02 adversarially verified
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
v5 delta document, self-dated "Here is the list as of 10 March 2023", read against the v4 settings reference. uniCenta ships exactly one notification and it is not operator-configurable against a metric: the NEW list reads verbatim "... MariaDB integration New flat Look and Feel Integrated UK payments with PaymentSense Digital Receipts (free for uniCenta subscribers) Stock level notification Multi-Database option Primary + Secondary iButton (Dallas key) support JVM RAM monitor Widget Stock Maintenance Service Charge Option ..." - "Stock level notification" is a quantity signal off the v4 "Min/Max levels" field, with no metric selection, no deviation logic and no delivery channel. Absence controls across all 246 docs: /threshold/i -> 0, /forecast/i -> 0, /alert|notification/i -> 6 with the other five being website, forum and update notices. The v4 Configuration reference /pages/configure-unicenta-opos/ enumerates every panel tab (GENERAL, LOCALE, PAYMENT METHOD, PERIPHERALS, SYSTEM OPTIONS, TICKET SETUP, COMPANY, DATABASE SETUP) and contains no alerting section, though it self-disclaims ("new options are shown on the Configuration panel tabs and not shown here"), which is why the 2023 v5 delta carries this row. Bounded to the crawlable site. https://unicenta.com/features/differences/ · retrieved 2026-09-05 adversarially verified
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
Vendor homepage, current v5-era marketing including its own forward roadmap - the surface where an AI assistant would be announced first. Its LOOKING AHEAD block is a closed list of three, verbatim: "MORE IN THE WORKS... A collection of future business posApps in-scope for development or we re looking to include. GLOBAL PAYMENTS ... eCOMMERCE TOP-UP Early-days development stage ... CRM Bringing together and extending the connection of uniCenta oPOS and CRM" - no AI, no assistant, not even aspirationally. Absence controls across all 246 docs: /natural language|artificial intelligence|\bAI\b|machine learning/i -> 0 (note the \bAI\b control is the trap-carrying one here, matching inside no word, and it still returns zero). Reporting is Jasper-based and static: /features/differences/ (10 March 2023) "IMPROVED ... Legacy Jasper Reports components now v6" and "Jasper Reports engine upgrade to version 6". CORRECTION TO THE STANDING RATIONALE: the vendor does not "claim no AI features" - it makes no statement about AI at all; the verdict rests on the closed roadmap plus the corpus zero, not on a denial. https://unicenta.com/ · 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
CLAIM: guest-level analytics - new vs returning counts, visit frequency, lifetime-spend cohorts. VERDICT: no/A, bounded on BOTH surfaces the prior rejections called unmeasured (q269: 'bounded only in the 5.0 menu'; q310: out-of-tree surfaces). CORPUS (re-derived this session, no clone): api.github.com git/trees for lestola/unicenta-mirror-5.4 at 8771d24bb67160f6b58bba4d6f3e50c950e2fac9 (truncated:false, 1,809 blobs); every text blob fetched from raw.githubusercontent.com - 1,208 files (629 .java, 179 .properties, 172 .form, 70 .bs, 67 .jrxml, 43 .xml, 22 .sql, 18 .txt and the rest); the remaining 601 are images, native libs, one bundled jar and two zips. PLUS the closed com.unicenta:unicenta-plugins 1.3.3 jar (the integration client the 5.4.0 tree calls: initScreen, sendReceipt, postMetrics, startEventListener, payment calls), fetched anonymously HTTP 200, 460,041 bytes, from repo.unicenta.org/maven2: 134 classes plus fxml/config, 151 files scanned. EVIDENCE: (1) CLOSED ENUMERATION of in-app reports: Menu.Root.txt has 100 addPanel entries; the customer reports are exactly eight, lines 16-23: customers.bs, customers_sales.bs, customers_debtors.bs, customers_diary.bs, customers_cards.bs, customers_list.bs, customers_export.bs, customers_vouchers.bs. customers.bs is `SELECT ID, TAXID, ... FROM customers` (a list); customers_sales.bs groups per ticket and product over a date range (q310 verdict). The five charts (lines 85-89: sales_chart_productsales, _piesalescat, _sales, _timeseriesproduct, _top10) and every other listed .bs (sales_*, users_*, epm_*, tools_*) carry no customer dimension. (2) NO UNICENTA CLOUD SURFACE RECEIVES THE DATA: the till's calls into the plugin are StartPOS.applicationStarted -> `application.postMetrics(metrics);` whose Metrics.class fields are `subscriber uniCentaVersion device location osName` (POST /pos-metrics) - no sales, no customer; and ReceiptController posts /receipt with `file` (a rendered receipt.png, base64) and `customerEmail` only when an operator emails a receipt - an image, not structured spend. The plugin Dashboard.fxml is a services launcher (Digital Receipts, WooCommerce, Dojo, Teya, MediaPayments, Profile) with no report. The q310 finding that EventRouter/fireProductEvent is unwired stands. (3) The web-reporting add-in is v4-only by the vendor's own words ('Exclusive to our uniCenta version 4 customers') and its manifest has 0 cohort/returning/frequency (q310). CONTROLS (tokenised, word-boundary, case-insensitive, 1,359 files): cohort(s) 0, returning 0, frequency 0, lifetime 0, recency 0, visit(s) 0, first visit/buy/purchase 0, ltv/clv 0, rfm 0, retention 0. POISON: `repeat` 2 = label.passwordrepeat 'Repeat Password'; `new customer(s)` 22 files = the Button.newcustomer create-record button across locales, JDialogNewCustomer, and the CSV-import summary label.csvnewcustomers. CAVEAT: the members-only v4 Developer Reports Matrix Guide remains unread; it describes v4 Jasper reports, which ship as .bs/.jrxml in this tree and were scanned. Retrieved 2026-09-16. https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/resources/com/unicenta/pos/templates/Menu.Root.txt · retrieved 2026-09-16 adversarially verified
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
The vendor own public analytics extension pack, /downloads/scripts/ (self-dated "Created: 7 September 2018", "Updated: 7 September 2018"), enumerates every analytic uniCenta offers beyond the built-in reports and every one is backward-looking, verbatim: "A collection of useful SQL scripts which can be used in your favourite SQL Editor or added to uniCenta oPOS and include: Clear Transactions Clear uniCenta oPOS data except Categories and Products Daily Sales Exactly that! Day Of Month Sales by day per month Hourly Sales Exactly that! Month Of Year Sales by Month Monthly Sales Sales by Month Week Of Year Week number". Hourly and daypart granularity therefore exists as history and only as history. Absence controls across all 246 docs: /forecast/i -> 0, /natural language|artificial intelligence|\bAI\b|machine learning/i -> 0, /threshold/i -> 0. v5-era bound: /features/differences/ (10 March 2023) reports block is "NEW Supplier reports User reports IMPROVED Jasper Reports engine upgrade to version 6 Inventory reports Sales reports", and the complete 5.0 -> 5.4.0 release-note sequence adds no analytic. A forecast is not a Jasper SQL report over existing tables, so unlike the report-list cells this one is not settled by the gated Reports Matrix. https://unicenta.com/downloads/scripts/ · retrieved 2026-09-05 adversarially verified
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
There is no tip substrate anywhere in the product, so no tip report can exist and the gated Reports Matrix cannot overturn this. Absence controls over the vendor vocabulary across all 246 docs: /tip\b|tips\b|gratuity/i -> 1 and the single hit is the substring inside "Tooltips translation" in the changelog; /declared tip|tip out|tip share/i -> 0; /tronc|pool/i -> 0; /payroll/i -> 0. The vendor substitute is a flat service charge, v4 Configuration reference verbatim: "Enable Service Charge : Used together with the special xxx988 Product to add (optional) fixed charge to a sales transaction. Service Charge Rate ?% : The rate to charge. This value should be net of Tax." - booked to a dummy product xxx988, so it lands in product sales, attributed to no employee and to no jurisdiction. v5-era bound: /features/differences/ (10 March 2023) lists "Service Charge Option" under NEW, confirming this is the current mechanism, and its reports NEW is only "Supplier reports User reports". Tax itself is configured per rate and per customer tax category (FAQ: "someone in Quebec, Canada needs GST and QST along with a specific rule how to apply to a sale"), with no tip liability concept. Bounded to the crawlable site. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
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-store and multi-warehouse are first-class, but no named three-level hierarchy that reporting and permissions scope to is documented. https://sourceforge.net/projects/unicentaopos/ · retrieved 2026-08-07
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
No price tier, price zone or price-list construct exists in the shipped product. Re-opened the 5.4.0 create script myself at commit 8771d24 (47,150 bytes, 52 CREATE TABLE statements): `products` carries exactly one sell price, `pricesell double NOT NULL default '0'`, and no location, channel, daypart or price-list reference; the only other `pricesell` in the file is the `csvimport` staging table, and the only other `price` columns are the transactional `stockdiary.price` and `ticketlines.price`. The five variant tables - attribute, attributevalue, attributeuse, attributesetinstance, attributeinstance - carry no price column between them (attributeinstance is id/set/attribute/value; attributevalue is id/attribute/value). `locations` is ( id, name, address ) and is referenced by exactly three foreign keys, all stock: `stockcurrent_fk_2`, `stockdiary_fk_2` and `stocklevel_location`, verbatim in the script's own ALTER block. The DAO confirms the schema is the whole story: every catalogue read in DataLogicSales.java selects P.PRICESELL from `products` filtered by category or id, with no location, time or channel parameter. MariaDB-upgrade_master.sql is 79 bytes (a version bump) and the 4.5.x upgrade scripts contain no occurrence of `price` or `location`, so nothing adds a price-per-location table later. The closed com.unicenta:unicenta-plugins 1.3.3 API model carries the same single `sellPrice`. The two available workarounds both fail the claim as written: duplicate the `products` row (the claim requires no duplication of the item record), or set `isvprice`, which DataLogicSales/JPanelTicket use to make the cashier key an amount by hand - an open-price item, not a tier. Running a separate database per site is likewise excluded, because it duplicates every item record. All three conjuncts - per location group, per order channel, per daypart - fail. Tokenised controls over the 1,696-file tree and the site corpus return zero for pricelist, price_list, pricelevel, price_level, pricezone, price_zone, daypart, happyhour and 'happy hour'; the surviving `zone` hits are ZonedDateTime and the barcode renderer's setQuietZone(10.0), and the site hits are changelog entries about a MySQL connector 'Time Zone issue', so a raw-substring read here would have cited a barcode quiet zone as a pricing zone. BOUND: core GPL 5.4.0 (current release per the live changelog, read 2026-09-15) plus the closed plugins 1.3.x. NOT bound: the vendor's unenumerated 'Third party' add-in surface, every slot of which reads 'Coming Soon' - a third party cannot add per-location pricing without altering this schema, and the atlas scores native capability, so the `no` stands on the product as shipped. https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/resources/com/unicenta/pos/scripts/MariaDB-create.sql · retrieved 2026-09-15 adversarially verified
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
Multi-store reporting is claimed; store-versus-store ranking and variance flags are not documented. https://sourceforge.net/projects/unicentaopos/ · retrieved 2026-08-07
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
RE-HOMED to the v5-era delta page and upheld as no, after striking one broken leg. Batch C cited the Web Reporting page as an enumerated absence of a gift-card liability report; that page is NOT usable for enumeration - it self-describes as "uniCenta oPOS Web Reporting is our open source add-in Exclusive to our uniCenta version 4 customers", ends its list with "more to come", and appears under DEPRECATED in the v5 delta. Struck. What carries the verdict is a POSITIVE current-generation characterisation of the only stored-value instrument uniCenta ships. VERBATIM, unicenta.com/features/differences/ (v5 delta, self-dated 10 March 2023): "NEW One-time use of Voucher/Coupon". A one-time-use voucher is not a reloadable transferable gift card and cannot carry an outstanding balance. Corroborated by the v4 CUSTOMER enumeration on unicenta.com/features/ - "Account Management Address and Contact detail Barcode Credit Limit Customer Diary Customer Information Customer Store Card Discount % Label Printing Multi-Tax Categories On/Off Account Payments Photo Image Statement Transaction History VIP" - where the Store Card sits among Credit Limit and On/Off Account Payments, i.e. an on-account identification device, not stored value; corpus-wide zero for gift card and gift voucher across all 246 documents and every release note through 5.4.0. The settlement limb fails architecturally: multi-location in uniCenta means many terminals against one shared database ("multi-location, multi-terminal installations", unicenta.com/faqs/), so there are no separate owners between whom to settle. Grade C - both enumerating documents are marketing feature pages. https://unicenta.com/features/differences/ · retrieved 2026-09-05 adversarially verified
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
Re-grounded off the /api/ page's marketing line ("Synchronise customers across all your uniCenta installs - zero development required!"). What the endpoints actually show is CRUD on /customer with a caller-supplied UUID id against a hosted base-url (https://api.unicenta.io), which is what lets the same profile identifier exist in more than one install - a replication mechanism, and one the integrator drives. Shortfall: the customer payload carries maxDebt and discount but no balance, points or ledger field, and the collection publishes no balance, accrual, redemption or transfer operation, so account and store-card balances stay per-install rows. A shared profile, not one shared live balance. https://docs.unicenta.com/insomnia.json · retrieved 2026-08-09
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
v4 marketing plus the FAQ. The vendor's multi-site vocabulary is exhaustively site/stock-shaped: INVENTORY "Categories Custom Buttons Locations Loss Prevention Min/Max levels Multi-Warehouse Multi-Store", SYSTEM "Multi-Terminal", and the FAQ says the product "is multi-location, multi-terminal and multi-user" - locations and warehouses, never brands. v5 companion /features/differences/ adds "View multi-location Stock" and "Multi-Database option", again stock and database scoping. Regexes over 246 docs: /virtual brand|multi[- ]brand|multiple brands|concept/i -> 4 docs, every hit non-product ("Build a global brand in the POS niche" on the About page, brand copy on the home and news pages); /franchis/i -> 0 docs. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
Configurable tax categories and multiple simultaneous rates exist per the Openbravo lineage; no per-location jurisdiction rule engine or exemption model documented.
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
uniCenta oPOS 5.4.0 source, GitHub lestola/unicenta-mirror-5.4 at commit 8771d24bb67160f6b58bba4d6f3e50c950e2fac9 ("5.4.0 release", author hugh <hughs@unicenta.com>, 2025-07-31; 81 commits, all under uniCenta addresses; pom.xml line 7 <version>5.4.0</version>; AppLocal.java 33 APP_VERSION = "5.4.0"). This is a third-party GitHub mirror, and its authorship is unsigned git metadata. The vendor's own Sources download is gated ("available to uniCenta Customer Base, Plus, Hosted, and Hosted Monthly 50% Subscribers only"). Grade A follows the record's existing precedent of citing the RohiTech 5.0 mirror at A. Schema bound: JRootApp.java 356-357 runs <db>-create.sql on a new install and <db>-upgrade_master.sql otherwise. The 5.4.0 MariaDB and MySQL upgrade_master scripts only set applications.version, and MySQL-create.sql is byte-identical to 5.0. So no schema change separates 5.0 from 5.4.0, which includes the 5.3.1 build behind the hosted "Web version" (news: "October | uniCenta hosted service lauched (5.3.1) | 5.3.1 Web version released"). The home page says WEB SERVER "Run the full version of uniCenta oPOS on any Android or iOS device, tablet or countertop machine with a browser". There is no labor-rule entity to configure, per location or otherwise. The complete labor schema is breaks, "`id`, `name`, `visible`, `notes`" (MariaDB-create.sql 90-96). Next is leaves: "CREATE TABLE `leaves` ( `id` varchar(255) NOT NULL, `pplid` varchar(255) NOT NULL, `name` varchar(255) NOT NULL, `startdate` datetime NOT NULL, `enddate` datetime NOT NULL, `notes` varchar(255) default NULL," (197-203). Then shift_breaks (id, shiftid, breakid, starttime, endtime; 444-449) and shifts (id, startshift, endshift, pplid; 456-462). None has a location column, an overtime threshold, a break rule or a scheduling constraint. locations is "`id` varchar(255) NOT NULL, `name` varchar(255) NOT NULL, `address` varchar(255) default NULL" (219-222), and location columns appear only on the stock tables stockcurrent, stockdiary and stocklevel. people is id, name, apppassword, card, role, visible, image (270-277), with no location, wage or rule field. Derby and PostgreSQL create scripts carry the same labor tables. Nothing is enforced at the terminal. JPanelEmployeePresence only inserts and closes shift and break rows, and StartBreak (DataLogicPresenceManagement.java 254-257) writes (uuid, shift, break, now) with no test. The EPM permissions in Role.Manager.xml 183-190 are only BreaksPanel, JPanelEmployeePresence, LeavesPanel and three reports. \b(overtime|jurisdiction|meal|premium)\b and \b(wages?|salary|hourly|payrate|labou?r)\b give 0 lines over src/main. Closed add-in scope: pom.xml 361-365 depends on com.unicenta:unicenta-plugins 1.3.0. Its repo host, repo.unicenta.org, bars ClaudeBot in robots.txt, so the jar was not read. The core calls it from StartPOS.java 131-132 ("application.postMetrics(metrics); application.startEventListener(host, jRootApp, null);"), JRootFrame, MenuPanelAction.java 56-58 (plugins.configure opens initScreen("Dashboard")), JPanelCloseMoney (PaymentSense end-of-day), PaymentGatewayPaymentSense and PaymentGatewayTeya, and JPanelTicket (sendReceipt). The startup listener is handed the whole jRootApp, so the jar's reach is not mechanically bounded. What bounds the finding instead is that everything the vendor documents it doing concerns e-commerce, payments or receipts: the 5.4.0 release notes list only UOCL-298..309 WooCommerce/API/adapter stories, /api/ names only the Customer, Order and Product APIs, and /features/add-ins/other-add-ins/ lists only database and reporting tools. WordPress Web Reports only reads the POS database. Ticket.Buttons.xml 111 carries only a commented-out ticket.removeline script hook. unicenta.com's multi-install copy is about data synchronisation ("Synchronise customers across all your uniCenta installs", /api/) and stock ("View multi-location Stock", /features/differences/), not labor rules. Poison: \blocation\b in src/main is stock locations or Swing layout. https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/resources/com/unicenta/pos/scripts/MariaDB-create.sql · retrieved 2026-09-13 adversarially verified
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
FAQ system requirements name the hardware explicitly: "POS Terminal - Touchscreen preferred or a PC - what you've got", running on Windows XP SP3/7/8/10, "Linux - CentOS, Ubuntu, Mint or other" or "Mac OSX - 10.6.8 and later", needing 1024MB RAM, 70MB disk and a Java 1.8 JRE. uniCenta sells no terminal. iPad and Android are reachable only through an RDP client to a host PC, which does not narrow the claim because commodity PCs and Windows tablets run the full app. https://unicenta.com/faqs/ · retrieved 2026-08-07
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
Score stands, note is wrong. The FAQ publishes minimum specs the dossier calls unpublished: Java 1.8 JRE 32/64-bit, 1024MB RAM, 70MB disk, MySQL 5.6+, Windows XP SP3/7/8/10, CentOS/Ubuntu/Mint, macOS 10.6.8+. Separately, the changelog says v5.0 introduced native applications 'eliminating JVM requirements' — the vendor's own docs contradict each other on the Java prerequisite, which is worth flagging. https://unicenta.com/faqs/ · retrieved 2026-08-01 adversarially verified
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
Vendor sells no hardware; there is no first-party handheld and therefore no drop or IP rating. https://unicenta.com/features/ · 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
v4-leaning FAQ, corroborated by the v5-era /apply/ page. uniCenta sells no hardware at all: the FAQ device list is bring-your-own - "Devices POS Terminal Touchscreen preferred or a PC what you ve got Windows Tablet PC depends on capabilities Apple iPad or Android need an RDP app" - and the same page explicitly recycles the customer's own kit ("It s very, very likely then that you can use that old PC from Dell or HP that s gathering dust in the cupboard"). The v5-era corroboration is /apply/'s HOSTED plan: "Runs on an iPad Runs on an Android Tablet Runs in most Browsers". With no vendor device there is no vendor battery rating to publish. Regexes: /\bbattery\b|\bbatteries\b/i = 0 across all 246 docs; /\bhandheld\b|hand-held/i = 0; /shift life|mAh/i = 0. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
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
v4-leaning FAQ, corroborated by the v5-era /apply/ page. The same bring-your-own device list applies ("Apple iPad or Android need an RDP app"), and the FAQ's only connectivity guidance is Wi-Fi with no failover: "If you intend to use wireless then be prepared to spend money to get the best router you can afford." /apply/ HOSTED is browser-delivered ("Runs in most Browsers custom URL"). Regexes with word boundaries: /\bLTE\b|\bcellular\b|\b4G\b|\b5G\b|\bSIM card\b|\bmobile data\b/i = 0 across all 246 docs. An unbounded /4G|3G/ control returned 5 docs and every hit was substring noise from "altered", "alternative" and "PostgreSQL" - my own control carried the trap. /failover|offline mode/i = 0. https://unicenta.com/faqs/ · 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
On-premise client and database keep terminals operating offline, but the vendor publishes no statement of which functions degrade.
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
Verified: 'Remote Order Display' is enumerated as a BASE-tier (£72/yr) benefit on the pricing page. Nothing published on bump bars, routing rules, or fire timing. Partial is correct, and note it is a paid-tier item, not a free-build capability. https://unicenta.com/apply/ · 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
v4-leaning FAQ, corroborated by the v5 delta. The FAQ closes the hardware surface at eight peripheral classes: "Peripherals Report Printer Local or Networked Barcode Scanner USB, Serial Scanpal2 or compatible Cash Drawer via Cashdrawer kicker/Serial port via Printer Customer Display Serial 2 line x 20 char Mag Stripe Reader K board, Generic or Intelligent Receipt Printer Serial/Network/USB with Virtual COM installed ESC/POS, JavaPOS, SurePOS, Star, Ithica or compatible Weighing Scale Casio, Dialog1, Mettler, SamsungESP or compatible iButton USB (Windows only)" - no enclosure, no guest terminal, no integrated-payment kiosk in either form factor. The v5 hardware delta in /features/differences/ is scales only: "CAS-PDII Weigh Scale support Mettler weigh scale support". Regexes: /\bkiosk\b/i = 0 across all 246 docs; /freestanding/i = 0; /countertop/i = 1, the homepage phrase "tablet or countertop machine with a browser"; /accessibilit|WCAG|\bADA\b/i = 0 real hits. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
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
v4-leaning FAQ, corroborated by the v5 delta. Same closed eight-class peripheral list - "Report Printer... Barcode Scanner... Cash Drawer... Customer Display Serial 2 line x 20 char... Mag Stripe Reader... Receipt Printer... Weighing Scale... iButton USB (Windows only)" - in which the only customer-facing display uniCenta drives is a serial 2-line by 20-character pole display. The v5 hardware delta in /features/differences/ adds weigh scales and nothing else. Regexes: /drive.?thru|drive.?through/i = 0 across all 246 docs; /menu board/i = 0; /\bheadset\b/i = 0; /confirmation display/i = 0; /speed of service/i = 0; /\btimer/i = 1, the 4.6 note "[ UOCL-85 ] Add timers to button Restaurant mode", a table-plan button timer. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
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
Sourced to the marketing bullet 'Multi-Printer'. No supported-printer or driver list is published; the only hard fact found is an FAQ cap of '6 directly attached or network printers + a report printer'. Printer-agnosticism is inferred from the ESC/POS lineage, not documented. https://unicenta.com/faqs/ · retrieved 2026-08-01 adversarially verified
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 set: cash drawers, barcode scanners, weighing scales, customer-facing displays, multiple printers, and iButton/Dallas key authentication. https://unicenta.com/features/ · 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
UPHELD partial. Card entry is on an external EMV terminal and the vendor asserts P2PE, but no PTS-listed device model, no P2PE listing entry and no merchant SAQ type is named anywhere. VERBATIM (unicenta.com/faqs/, CARD PAYMENTS): "From uniCenta oPOS version 4.4 we now include, as standard, a fully compliant and approved PCI/EMV P2PE PA-DSS solution using our posApps Plugin Manager for : Dejavoo USA, Canada, Mexico, Central and South America PaymentSense United Kingdom and Ireland" and "Devices At this time uniCenta oPOS only supports the Dejavoo and PaymentSense PCI/EMV compliant devices through our posApps Plugin Manager". Corroborated by unicenta.com/pages/configure-unicenta-opos/: "For Credit card terminals used with our posApps plugin manager this needs to be set to EMV". DATE/DECAY, stronger than the proposal stated: the claim is v4.4-era (accreditation announced July 2017), PA-DSS was retired by the PCI SSC in October 2022, the FAQ self-disclaims currency ("Many of the FAQ s here still apply to earlier versions of uniCenta oPOS"), and its "only supports" enumeration is falsified by the vendor's own 5.1 release notes ("UOCL-253 Integrate with Teya Payment Terminal", November 2023) - so the device list is stale as well as unvalidated. Partial, not yes: external hardware card entry is documented, validation and scope are not. Corpus-wide zero for SAQ, attestation and AoC. EDITION: the payment plugins are subscriber-side; Community 5.0 ships no gateway at all. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
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
Undated, v5-era (the PaymentSense integration shipped in 5.0). uniCenta's card offer is an acquirer-supplied terminal, not software acceptance on a commodity device: "Payments made simple uniCenta provides integrated card payments in the UK, EU and USA No manual entries Reduce time to complete payment Get paid the next business day Accept all major payment methods Get your card machine now". /features/differences/ reinforces the direction - "NEW... Integrated UK payments with PaymentSense" alongside "DEPRECATED... Card payment gateways (PCI compliance)" - card handling was pushed out of the app onto terminals (Dejavoo, PaymentSense, and UOCL-253 Teya). Regexes: /tap to pay|tap on phone|tap to phone|softpos/i = 0 across all 246 docs; /contactless/i = 0; /\bNFC\b/i = 0. https://unicenta.com/card-payments/ · 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
Not applicable in the vendor's favour: no hardware prices are published because no hardware is sold. Operators buy commodity gear. https://unicenta.com/features/ · 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
FAQ: 'If you already have or intend to buy POS hardware then it's very likely that uniCenta oPOS will run on it', with operator-side minimum specs (1024MB RAM, 70MB disk, Java 1.8 JRE; Windows XP SP3-10, Linux, macOS 10.6.8+) and generic peripherals. The configuration guide sets up each peripheral by choosing 'a manufacturer's communication protocol'. uniCenta is 'first & foremost a software house' and publishes no hardware store, bundle, rental or lease. https://unicenta.com/faqs/ · retrieved 2026-08-02 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 the operator's own commodity PC/touchscreen and generic peripherals bought from third parties (FAQ), so there is no vendor-supplied or vendor-keyed device to deactivate. The pricing page adds that 'uniCenta oPOS does not stop working after your subscription expires', and GPL3 on the community build makes that irrevocable. Residual exposure is confined to the vendor-run HOSTED tier, which is a hosting dependency rather than hardware bricking. https://unicenta.com/faqs/ · retrieved 2026-08-02 adversarially verified
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
No vendor hardware, therefore no warranty term or advance-exchange program. https://unicenta.com/features/ · 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
UPHELD, with a v5-era leg added because Rule 2 hits the cited page: unicenta.com/faqs/ opens VERBATIM "Many of the FAQ s here still apply to earlier versions of uniCenta oPOS" and is v4-era throughout, so it cannot carry this alone. Its mobile-device story, VERBATIM: "If you want to run uniCenta oPOS on an Apple iPad or Android tablet then that s possible too, though you will first need to install uniCenta oPOS on a host PC or server and then use an RDP client to connect to it"; the device table reads "Apple iPad or Android need an RDP app"; "We recommend a minimum 10 screen size tablet". THE V5 BOUND, which the proposal lacked: features/differences/ (10 March 2023) enumerates the v5 packaging as "Native Applications (Window, Mac OS and Linux) without the need to install java" - Windows, Mac and Linux only, no iOS or Android build - and release notes 5.0 through 5.4.0 (August 2025) add none. So there is no personal-phone application on the current generation either. The paid HOSTED plan adds browser access only, VERBATIM (unicenta.com/apply/): "Runs on an iPad Runs on an Android Tablet Runs in most Browsers custom URL with https daily backups ... Built in Web firewall Latest security features" - transport and perimeter security, not a BYOD enrolment, device-trust or per-device revocation model. Vocabulary-complete zero across all 246 first-party documents for BYOD, own phone, personal device and smartphone. Grade C: the enumerating documents are the FAQ and the pricing page. EDITION: browser access is HOSTED-only at GBP 15/month; BASE and PLUS are self-hosted desktop. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
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
v4 generation, corroborated by v5. /features/ SYSTEM enumerates the estate features as "...Mixed use Retail/Hospitality Mobile POS Multi-Lingual Multi-Payment Multi-Printer Multi-Tax Rates Multi-Terminal Pay Ins/Outs..." - multi-terminal operation, but no console over those terminals. The v5-era bound per R2 is /features/differences/, whose nearest NEW item is a purely local widget, "JVM RAM monitor Widget", while the update story on /apply/ is an email perk ("Update Notifications") rather than a staged rollout. Regexes: /device management|remote reboot|fleet|firmware|\bMDM\b/i = 0 across all 246 docs; /online.?offline|heartbeat|staged roll.?out/i = 0. https://unicenta.com/features/ · retrieved 2026-09-05 adversarially verified
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
v4-leaning FAQ, corroborated by the v5 delta - and the standing rationale is exactly right on both halves. The FAQ closes scale support at four protocols: "Weighing Scales uniCenta oPOS supports Casio PD1, CAS PDII, Dialog 1 and Samsung ESP protocols with Serial (COM) interfaces only. There is also the ability to have an on-screen pop-up weighing scale dialogue appear during a sale which allows you to sell a fractional part of product item quantity. This functionality needs to be included in a Product s settings with the Scale option set to screen." The v5 hardware delta in /features/differences/ extends only that axis: "CAS-PDII Weigh Scale support Mettler weigh scale support". Regexes: /flow meter|pour spout|tap wall|self.?pour|keg|dispens/i = 0 product hits; /draught|draft beer/i = 2 hits, both customer-profile prose describing a bar's drinks range rather than hardware; /\bliquor\b/i = 0. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
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
v4-leaning FAQ, corroborated by the v5 delta. The peripheral enumeration is closed at eight classes - "Report Printer... Barcode Scanner... Cash Drawer... Customer Display Serial 2 line x 20 char Mag Stripe Reader K board, Generic or Intelligent Receipt Printer... Weighing Scale... iButton USB (Windows only)" - with no telephony device, and the v5 hardware delta is scales only. Customer recall in uniCenta is manual: /features/ lists "Customer Lookup" and the v5 delta adds "Customer Finder with image" and "Add new Customer pop-up within sale". Regexes: /caller.?id|telephony|\bCTI\b|inbound call/i = 0 across all 246 docs; /screen.?pop/i = 1 hit, and it is the FAQ's "on-screen pop-up weighing scale dialogue" - a scale dialogue, not a screen pop; /phone order/i = 0. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
Integrations, API & extensibility
Public, self-serve API reference documentation is readable without a signed partner agreement, NDA, or sales call.
extensibility-public-api-docs
The API reference is public and unauthenticated. docs.unicenta.com, linked from the public unicenta.com/api/ page, renders an Insomnia Documenter collection loaded from /insomnia.json - 15 requests across customer, order and product, each with method, path, HTTP Basic auth scheme and an example JSON body, plus prod/dev/local base URLs. No login, partner agreement, NDA or sales call is involved; the page and the JSON both return 200 to an anonymous client. The material behind the 'Customer Plus, Hosted, and Hosted Monthly 50% Subscribers only' gate at unicenta.com/developer-section/ is the developer guides and the database-table reference, which is a documentation shortfall elsewhere but not the API reference this claim is about. https://docs.unicenta.com/insomnia.json · retrieved 2026-08-09 adversarially verified
API access is included in the base subscription at no additional per-location fee, surcharge, or upgraded plan requirement. differentiator
extensibility-api-access-cost
API access requires at least the BASE subscription (£72/yr); unlimited access requires PLUS (£144/yr). No free-tier API. https://unicenta.com/apply/ · retrieved 2026-08-01
A free sandbox or test environment with seeded data is available to developers without owning a paid production account. differentiator
extensibility-free-sandbox
The reasoning ('free build is a de facto test environment') collapses once you check versions: the free v5.0 build contains none of the APIs (added in 5.1/5.2/5.3). You cannot exercise a single documented endpoint without paying. No vendor sandbox, no seeded data, no test keys. https://unicenta.com/support/changelog-unicenta-opos/ · retrieved 2026-08-01 adversarially verified
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
UPHELD at grade A - and it is the ONE grade-A row in this file that deserves it, because the export is used as a POSITIVE observation of the shipped authentication model rather than as an absence-of-a-field argument. Every one of the 11 authenticated CRUD requests on /customer, /order and /product in the publisher's own export (__export_date 2024-04-17, Insomnia v8.6.1; on disk .cache/q211/unicenta-insomnia.json, re-read 2026-09-05) carries VERBATIM "authentication": {"type":"basic","useISO88591":false,"disabled":false,"username":"{{ _[api-username] }}","password":"{{ _[api-password] }}"}, with the Base Environment holding VERBATIM {"api-username":"test-user","api-password":"password"} - one shared static credential pair per install, precisely the credential-sharing pattern the rubric excludes. I ADDED A DISCRIMINATING LIVE CONTROL on 2026-09-05 that the proposal did not run: against api.unicenta.io (the export's prod environment), /customer returns 401 - the resource exists and is gated - while /oauth/token, /oauth2/authorize, /.well-known/oauth-authorization-server and /.well-known/openid-configuration all return 400 {"error": "No static resource ..."}, the Spring Boot not-found response. A host that distinguishes gated-but-present from absent, and answers absent for every OAuth route, is a bounded surface. Corroborated at grade C by unicenta.com/woocommerce/, whose integration is likewise pasted static secrets ("Webhook Secret ... Consumer Key ... Consumer Secret"). RULE 1 acknowledged: the developer guides behind unicenta.com/developer-section/ are subscriber-gated, but a gated guide cannot conjure an authorize endpoint the live service denies. GENERATION: 2024 export against the 5.4.0 (August 2025) product, whose only API work was the WooCommerce endpoints - also static-secret. https://docs.unicenta.com/insomnia.json · retrieved 2026-09-05 adversarially verified
The platform pushes real-time webhooks for order lifecycle events (created, modified, paid, voided, refunded) rather than requiring polling.
extensibility-webhooks-push
Stated reasoning withdrawn: "all three documented endpoints push data into uniCenta" is wrong on both counts - uniCenta's published API export holds 14 requests, not three, and four of them are GET reads. What carries the no is that the complete export contains no event, subscription or callback resource at all, and no operation for registering a customer endpoint. There is no published event type for order created, modified, paid, voided or refunded. An integrator's only route to order lifecycle state is polling GET /order (with GET /order/status as a liveness probe), which is exactly the polling the claim asks the platform to replace. https://docs.unicenta.com/insomnia.json · retrieved 2026-08-09
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
v5-era first-party technical document; the webhook work shipped in 5.4.0 ("UOCL-301 Integrate uniCenta API with WooCommerce Customer Webhook", "UOCL-302... Order Webhook", "UOCL-303... Product Webhook"). Webhooks DO exist, but uniCenta is the receiver, not the publisher: "Create Webhooks... Use your WooCommerce website Add a webhook for what you want to sync with uniCenta i.e. if you want to sync products add webhooks [create, update, delete] for products Delivery URLs: (same URLS for create, update and delete) https://api.unicenta.io/woocommerce/customer https://api.unicenta.io/woocommerce/order https://api.unicenta.io/woocommerce/product", and on the uniCenta side "Webhook Secret: Use the same secret from setting up WooCommerce". A shared secret is configured, but uniCenta publishes no outbound webhook and describes no signing scheme of its own, and the whole documented surface is four fields. Regexes: /retry|retries|back.?off|replay|redeliver|dead.?letter|idempot/i = 0 across all 246 docs; /\bHMAC\b/i = 0; /event log/i = 0. https://unicenta.com/woocommerce/ · 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
POST /order exists and takes an externally originated order - body is products[] (name, priceExcludingTax, amount, tax) plus customerId - so write injection is real, and GET /order and DELETE /order?id= complete the resource. Shortfall, and the overview page gives it away rather than hiding it: the Order API section of unicenta.com/api/ describes connecting "with uniCenta POS layaways", and a layaway is a parked ticket, not a fired one. Nothing in the published collection carries a table, order type, modifier, kitchen-routing or print field, the order object exposes no state or acknowledgement, and no vendor page states that an injected order fires to KDS or printers or lands in reporting. First-class ticket behaviour is asserted nowhere and remains unverified. https://docs.unicenta.com/insomnia.json · retrieved 2026-08-09
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
No DoorDash, Uber Eats or Grubhub integration exists in any form. https://unicenta.com/integrations/ · 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
Undated, v5-era. The partner page is short, and is a floor rather than a census: "Our integrated partners offer unique services that seamlessly integrate with uniCenta oPos, giving you the tools you need to help your business succeed! Seemlessly Connect to WooCommerce to: Get Customers Get Orders Get Products Use Cases Table ordering at restaurants Clicks and collect Learn More Coming Soon! Learn More Coming Soon!" - one live partner and two empty slots. /features/add-ins/ closes the extension side identically ("Free Add-ins... Plus Add-ins... Coming Soon Coming Soon") and its third-party list is eleven named tools, mostly generic database and office utilities though "Barcode Label Maker" hooks "directly into uniCenta oPOS database" framed as helping you "achieve things that uniCenta oPOS doesn t do". Regexes with word boundaries: /\b(deliverect|chowly|otter|checkmate|itsacheckmate)\b/i = 0 across all 246 docs. An unbounded /otter/ control returned 4 docs and every hit was the substring inside "lottery" (the Abacus Lottery Everywhere case study). The zero is bounded to the crawlable uniCenta site; it does not speak for those middleware vendors' own catalogues, which are not in this corpus. https://unicenta.com/integrations/ · retrieved 2026-09-05 adversarially verified
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
QuickBooks is 'Coming Soon!' and no other GL connector exists; accounting today is CSV or SQL export only. https://unicenta.com/integrations/ · 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
No payroll provider is named anywhere in the integrations catalog. https://unicenta.com/integrations/ · 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
Too strong in the wrong direction. A self-install plugin mechanism does exist and is referenced repeatedly in the vendor changelog — the posApps Plugin Manager, which delivers card payments, digital receipts and other plugins. It is third-party and its site now resolves to a parked-domain redirect chain, so score it partial-and-decaying rather than a flat documented 'no'. https://unicenta.com/support/changelog-unicenta-opos/ · retrieved 2026-08-01 adversarially verified
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
uniCenta's closed plugin jar (com.unicenta:unicenta-plugins, the binary dependency pinned at 1.3.0 in the uniCenta oPOS 5.4.0 pom.xml, whose <repository> is repo.unicenta.org/maven2) is served anonymously at HTTP 200 from uniCenta's own Maven repository (release 1.3.3), as retrieved 2026-09-13 and decompiled with CFR 0.152. The Order API runs in the direction the rubric asks for. The 5.4.0 StartPOS.applicationStarted calls 'application.startEventListener(host, jRootApp, null)' at launch; the plugin's EventListener ('@Value(value="${api.sync-interval:60}")') calls OrderServiceInbound.getOrders on each cycle, and that method is gated by '@Value(value="${till.order-api:false}")' and a subscription check. For each order received from the cloud order endpoint it builds a TicketInfo, one TicketLineInfo per product with a tax lookup (getTicketInfo/getTaxInfo) and the customer (getCustomerInfoExt); it resolves the table with RestaurantDBUtils getTableId(order.tableName), writes the ticket with DataLogicReceipts insertRSharedTicket (keyed by the table id, or a new UUID), calls setTicketIdInTable, opens the plugin's Order screen, then calls deleteOrder to remove the order from the cloud queue. The publisher's Insomnia collection (docs.unicenta.com/insomnia.json) carries the third-party side: 'POST {{ _['base-url'] }}/order'. So a third-party ordering UI can create live tickets on POS tables. SHORTFALLS that hold it at partial: (1) injection only, by polling, 60 s by default; there is no API to price, tender, pay or close a ticket and no synchronous transaction response. The plugin's own Order.fxml tells the operator so: 'New Order Received!' / 'Please login and select the table or layway to complete the sale'. (2) The injected line carries only product name, id, amount and priceExcludingTax; no modifiers are passed. (3) The Order API is subscription-gated: on a mismatch the till logs ' subscription required' and sets 'till.order-api' to 'false'. (4) This is decompiled code, not a published developer document. OrderServiceInbound in 1.3.0 differs from 1.3.3 only in decompiler call-site forms (callGetProperty vs callGroovyObjectGetProperty). Code as retrieved 2026-09-13. https://repo.unicenta.org/maven2/com/unicenta/unicenta-plugins/1.3.3/unicenta-plugins-1.3.3.jar · retrieved 2026-09-13 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
Nothing is withheld at exit - the data sits in the operator's own MySQL instance and the software keeps running after a subscription lapses, so there is no vendor hostage step. Shortfall: the claim requires a documented machine-readable format, and uniCenta's own database table reference is subscriber-only ("This content is available to uniCenta Customer Plus, Hosted, and Hosted Monthly 50% Subscribers only"), while the published API collection defines no response schema, pagination or field list. https://unicenta.com/developer-section/unicenta-opos-database-tables/ · retrieved 2026-08-07
Reliability, offline & operations
Order entry, ticket routing, and check printing continue on-terminal when the internet connection is lost.
reliability-offline-order-entry
Thick client plus on-premise database keeps order entry, routing and printing alive through an outage; the vendor never documents it as a feature.
Card payments can be accepted while offline via store-and-forward, not just cash-only fallback. differentiator
reliability-offline-card-auth
POSITIVE EVIDENCE OF ABSENCE from the GPL source, and the card path is a CLOSED ENUMERATION rather than a corpus. In uniCenta oPOS 5.4.0 (commit 8771d24bb67160f6b58bba4d6f3e50c950e2fac9, authored hughs@unicenta.com, 31 Jul 2025) there is exactly ONE call site that authorises a card - JPaymentMagcard line 48, m_paymentgateway = PaymentGatewayFac.getPaymentGateway(app.getProperties()) - and PaymentGatewayFac is an exhaustive three-case switch on the payment.gateway property, VERBATIM: case "external": return new PaymentGatewayExt(); case "PaymentSense": return new PaymentGatewayPaymentSense(); case "Teya": return new PaymentGatewayTeya(); default: return null;. None of the three queues, defers or forwards anything. (1) PaymentGatewayTeya.execute() calls new Application().teyaTransaction(roundedValue, getPaymentWindow(roundedValue), payinfo.getTransactionID()), then BLOCKS - while (AppContext.getTeyaPaymentResult() == null) { log.info("uniCenta-oPos: waiting for payment to complete ...."); Thread.sleep(1000); timer += 1; if (timer > timeout) break; } with int timeout = 150 - and takes the success branch only if (AppContext.getTeyaPaymentResult().getStatus().equals("SUCCESSFUL")); otherwise payinfo.paymentError("Transaction Error! Please try again", ...). (2) PaymentGatewayPaymentSense.execute() is the same shape at int timeout = 180, with an explicit if (AppContext.getPaymentResult() == null) payinfo.paymentError("Transaction Error! Please try again", "No Response"). (3) CORRECTION TO THE PROPOSAL, which described "both shipped gateways" and missed the third: PaymentGatewayExt - the "external" mode the vendor documents for merchants who already own a card terminal - has a one-line body, payinfo.paymentOK("OK", payinfo.getTransactionID(), ""), i.e. uniCenta performs NO authorisation at all and merely records a card tender. That is the same fact from the other side: with no card data in the application there is nothing to store and nothing to forward, consistent with the vendor FAQ that gateway interfaces "were completely withdrawn in version 4 due to the PCI/EMV liability shift". The failure is terminal, not deferred: PaymentInfoMagcard.paymentError() sets m_sAuthorization = null, and JPaymentMagcard.executePayment() then returns null and paints the message, so the tender does not complete and nothing is retried. CONTROLS, re-run over all 1,696 files at the pin: store.and.forward 0, storeandforward 0, deferr 0, floor.?limit 0, reversal 0, pending 0, resubmit 0; queue 2 (java.util.Queue inside scanpal2/DeviceScannerComm), retry 4 (all "Invalid Password. Please Retry" / "User Card not found. Please Retry" UI strings), sync 1 (a comment about ORDERS syncs). The closed plugin jar com.unicenta:unicenta-plugins 1.3.3 (re-fetched 2026-09-15, HTTP 200, 460,041 bytes) contains ZERO occurrences of "offline" against a working control of 8 files matching "PaymentSense"; its payment packages are HTTP request/response models (mediapayments AuthRequest/AuthResponse/CloudTransactionRequest, paymentsense, teya), and mediapayments is referenced NOWHERE in the 5.4.0 source, so it is not wired into this build at all. PUBLISHED POISON, EXCLUDED: the SOLE tokenised /\boff.?line\b/i hit in the entire tree is a Danish install-topology string, pos_messages_da.properties message.DBDefault, "Standard databasen leveret med uniCenta oPOS er Apache Derby Embedded ... beregnet til en offline / single bruger installation, lav volume handel kun" - it means single-user local database, not offline payment, and counting it would score this cell backwards. The live vendor FAQ (fetched 2026-09-15) contains no occurrence of "offline" either. The binary-jar trap does not arise: the tree carries exactly one jar, .mvn/wrapper/maven-wrapper.jar. WHAT THIS no DOES NOT COVER: (a) whatever a Dejavoo, PaymentSense or Teya terminal does under its own acquirer floor limits - that is the terminal vendor capability, not uniCenta capability, and in "external" mode uniCenta will record such a sale, but it is not store-and-forward BY THE POS, which is the mechanism this rubric names; (b) the unenumerated "Third party" extension surface the vendor asserts but lists entirely as "Coming Soon" on /features/add-ins/; (c) the Hosted tier server side, which is outside the source tree. BOUNDARY, no double count: payments-offline-store-and-forward (no/B) is settled on the vendor PCI-withdrawal statement and the absence of any offline-limit setting; reliability-offline-decline-liability (no/B) is about publication of liability; order-capture-offline-order-entry stays partial, because the till keeps working against a local database - only the card authorisation is strictly online. This cell is the mechanism question and the code settles it. Supersedes the prior unknown/F, whose sole ground was that no uniCenta DOCUMENT addressed the category; the source does. https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/java/com/unicenta/pos/payment/PaymentGatewayTeya.java · retrieved 2026-09-15 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
This criterion is about publication and the corpus-wide control settles it: /offline|off-line/i -> 2 across all 246 docs and neither hit concerns transactions (the FAQ "on-line and off-line support services" and a 2018 news line about the on-line/off-line Click Mortar divide); /store.and.forward/i -> 0. The Terms of Service (Brosley Ltd, 8 May 2018) is the surface where an allocation would sit and it states only a blanket cap, verbatim: "FREE ACCOUNT HOLDERS: YOU AGREE THAT THE AGGREGATE LIABILITY OF UNICENTA TO YOU FOR ANY AND ALL CLAIMS ARISING FROM THE USE OF THE UNICENTA SERVICES IS LIMITED TO TEN (10) BRITISH POUNDS", with all other account holders capped at the lower of three months of fees or "FIFTY (50) BRITISH POUNDS"; the same document disclaims data reliability - "uniCenta will maintain a regular backup plan, but makes no claim about the accuracy and reliability of these backups". No per-transaction or cumulative offline cap is published because there is no offline authorisation path: card auth runs on the third-party Dejavoo, PaymentSense or Teya terminal (v4 Configuration reference, PAYMENT METHOD). Bounded to the crawlable site, which excludes the members-only gated guide set - a FLOOR, not a closed list: /downloads/guides/ paginates and ends "Page 1 of 3" with pages 2-3 absent from this corpus, so nothing here asserts that set’s composition or size by title. https://unicenta.com/about-unicenta-opos-point-of-sale/terms-service/ · retrieved 2026-09-05 adversarially verified
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
A 'yes' on a weighted differentiator sourced to a SourceForge project page that says nothing about offline or degraded operation. The vendor publishes no offline statement anywhere, and its own FAQ undercuts the architecture story: the MySQL database may be 'Local, Remote or Cloud', the HOSTED tier is cloud-hosted, and iPad/Android terminals are RDP sessions to a host — all of which fail during an outage. LAN-shared state is a possible deployment, not a documented product guarantee. https://unicenta.com/faqs/ · retrieved 2026-08-01 adversarially verified
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
Same defect: 'documented' confidence is not supported. The desktop Java client is real, but locality of the transaction engine depends on where the operator puts MySQL ('Local, Remote or Cloud' per the FAQ) and is explicitly false on the HOSTED tier. No vendor document asserts a local transaction engine as a designed property. https://unicenta.com/faqs/ · retrieved 2026-08-01 adversarially verified
Kitchen display and/or kitchen printer routing continues to function while offline.
reliability-offline-kds-printing
LAN kitchen printing and LAN-served remote displays continue during an outage by architecture, but no offline behavior is documented.
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
UPHELD, and scored identically to kitchen-printer-fallback, which asks the same question and which I downgraded from grade A onto this same evidence. The vendor enumerates its entire printer surface on two independent first-party documents and it contains no standby role and no alert. VERBATIM, cited page, PERIPHERALS: "Printer : This is usually your main receipt printer but you can choose any printer even if it is a remote network printer. Printers 2 6 : Same applies as the the main Printer though any of these may be either directly attached or on a network." and "Reports Printer : A locally attached or network printer." The FAQ states the ceiling: "uniCenta oPOS can handle 6 directly attached or network printers + a report printer (local or network)" - six independently addressed destinations, not a primary/standby pair. RULE 2 SATISFIED: the cited page is v4-only and self-disclaims ("As uniCenta oPOS evolves you may find that new options are shown on the Configuration panel tabs and not shown here"), so it does not stand alone - the v5 print delta is "Multi-part kitchen order print ... Remote print only allowed on ticket change ... Print, reprint permissions" (features/differences/, 10 March 2023) and release notes 5.0-5.4.0 add nothing. Vocabulary-complete zero across all 246 documents for failover, fail-over, backup printer, fallback and redundan-, including the 21,991-char changelog that records printer defects in fine detail. RULE 1 CAVEAT: the Hardware Installation Guide is login-walled, but it is an installation document; automatic failover is a software behaviour that would surface in the configuration enumeration and the change record. The KDS half of the rubric is not measurable - the Remote Order Display has no functional documentation - so this rests on the printer half. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
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
OVERTURNED from no/A. The proposal's evidence is that every mutating request in the publisher's 2024-04-17 Insomnia export carries only "headers": [{"name":"Content-Type","value":"application/json"}] - no If-Match, no ETag, no version field. That is not evidence of anything. Those are HAND-TYPED example requests in a 14-request developer scratch collection with joke payloads ("Jeo Blogs", "new product 2 API"), no response schemas and no OpenAPI document; a client author omitting a conditional header tells you nothing about whether the server implements one, and the same collection's POST /order body omits tables, discounts, payments and tickets that uniCenta demonstrably has. Grade A for that inference is indefensible. The rubric asks whether the VENDOR DOCUMENTS its conflict-resolution behaviour, and uniCenta's technical documentation is subscriber-gated: unicenta.com/developer-section/ returns a 222-byte wall reading VERBATIM "This content is available to uniCenta Customer Plus, Hosted, and Hosted Monthly 50% Subscribers only. Register Already a member? Log in here", and all seven /developer-section/* pages plus the four /packages/reference-developer-* matrices are identical walls. A login wall is not a deletion; the honest answer is that we cannot see whether it is documented. The framing that motivates the question is real and I keep it: the product is marketed for exactly the case that produces conflicts ("Customer API Synchronise customers across all your uniCenta installs - zero development required!", unicenta.com/api/) and the WooCommerce integration is webhook-driven two-way sync with no stated resolution rule, while the FAQ points at a third-party tool for database replication ("other open source app s like SymmetricDS") without adopting its semantics. Grade F, unknown. || 318th: NEW SURFACES 2026-09-16: a crt.sh census of unicenta.io found a Gitea at repo.unicenta.io with zero anonymous repos (/api/v1/repos/search -> data:[]), api.unicenta.io with no OpenAPI/Swagger route (all 400 'No static resource'), and a WordPress demo shop at woocommerce.unicenta.io whose Support Portal is login-gated. None documents conflict resolution. Still unknown. || 329th: MERGE HOLD (proposed partial/A, held unknown): uniCenta has no offline mode: every terminal writes to one shared central database, so the network-partition case this claim describes does not arise (a feature the product lacks entirely = hold, 321st policy). The ticket lock/override messages are real concurrency control and are recorded, but they are not partition reconciliation. Also the cited source is a THIRD PARTY's GitHub mirror (lestola/unicenta-mirror-5.4), not the vendor's org, so it cannot carry grade A. PROPOSAL AS WRITTEN: 329th, MOVED unknown -> partial/A on a surface no prior pass read: the SHIPPED USER-MESSAGE CATALOGUE and the lock code it labels. uniCenta DOES ship and describe a conflict-resolution behaviour for two terminals editing the same check, and it is the rubric's third option (operator prompt) plus an explicit last-write-wins override. EVIDENCE (1) pos_messages.properties (55,661 B, EN, commit 8771d24 = 5.4.0), VERBATIM four keys: `message.sharedticketlock=Ticket is locked!`; `message.sharedticketlockoverride=Do you want to Over-ride?`; `message.sharedticketlockoverriden=<html><center><h4>Your ticket was Over-ridden by someone with higher user permissions.<br>Any changes you made to your current ticket will be replaced`; `message.tableempty=<html>This Table's ticket is being edited by another User<br>Try Later`. (2) The mechanism is a pessimistic row lock, not an inference: MariaDB-create.sql line 433 `CREATE TABLE sharedtickets ( id, name, content mediumblob, appuser, pickupid, locked varchar(20) )` - `locked` is the ONLY lock column in the whole 52-table schema - written by DataLogicReceipts.lockSharedTicket / unlockSharedTicket (`UPDATE sharedtickets SET LOCKED = ?`) and read by getLockState. JTicketsBagRestaurantMap.java 736-756: `m_lockState = dlReceipts.getLockState(m_place.getId(), m_lockState); if ("locked".equals(m_lockState)) { JOptionPane.showMessageDialog(null, ...message.sharedticketlock); if (user.hasPermission("sales.Override")) { showConfirmDialog(...message.sharedticketlockoverride, YES_NO_OPTION) ... lockSharedTicket(id,"locked"); } }` and 421-424 shows the loser `message.sharedticketlockoverriden`. So: prompt the second operator, block unless they hold `sales.Override`, and on override discard the other terminal's edits. (3) The vendor ALSO documents it publicly, twice: features/differences/ lists `NEW Lock-out current ticket` and `NEW Table access lock-out` (https://unicenta.com/features/differences/, grade C), and the changelog reads `JTICKETSBAGRESTAURANT: Resolve View Shared Ticket and Override conflicts` (https://unicenta.com/support/changelog-unicenta-opos/). SHORTFALL, why partial not yes: this is concurrency control against ONE shared central database, not partition reconciliation. uniCenta has no offline/store-and-forward mode at all - tokenised `offline` over all 1,208 text files of the 5.4.0 tree hits exactly one file, pos_messages_da.properties, and that is POISON: it is the Danish translation of message.DBDefault describing Apache Derby Embedded as `beregnet til en offline / single bruger installation` i.e. standalone single-user, not an offline till; EN `offline` = 0. A terminal that loses the LAN cannot transact, so divergent edits cannot arise and the vendor publishes nothing about partition behaviour; the guides that might are subscriber-walled. Retrieved 2026-09-18. 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
The vendor documentation index is a closed list and contains no offline matrix. /support/ verbatim in full: "CUSTOMER ONLY FORUM ... COMMUNITY FORUM ... SELF-SERVICE DOCUMENTATION Installation Configuration Setup Upgrade Guides Members only" - Installation, Configuration, Setup and Upgrade are the four public documents (/pages/install-unicenta-opos/, /pages/configure-unicenta-opos/, /pages/set-up-unicenta-opos/, /pages/upgrade-unicenta-opos/) and none mentions connectivity loss. Absence controls across all 246 docs: /offline|off-line/i -> 2, neither about product behaviour; /store.and.forward/i -> 0. The architecture also makes such a matrix moot: uniCenta oPOS is a Java desktop client against a MySQL/MariaDB server, and the FAQ states the network is the operator problem, verbatim "The basis for success of any application running a multi-terminal or Cloud connected installation is a solid and reliable network ... If you intend to use wireless then be prepared to spend money to get the best router you can afford." Bounded to the crawlable site; the gated guide titles visible in the corpus include a "Hardware Installation Guide" and an "Administrator Guide", neither of which is an offline feature matrix by title. https://unicenta.com/support/ · retrieved 2026-09-05 adversarially verified
A public, per-component status page exists showing current and historical incident state without a login.
reliability-public-status-page
UPHELD - and I RE-RAN THE CONTROL MYSELF rather than trusting the proposal's, using my own fabricated tenant name. On 2026-09-05 via the robots-gated prober: unicenta.statuspage.io returns 200 at 127,604 bytes, and zq7-fake-brand-4471x.statuspage.io returns a BYTE-IDENTICAL 200 at 127,604 - so that 200 is Atlassian's marketing catch-all and no uniCenta tenant exists. status.unicenta.com returns status 0. This rubric is also the one class of claim a login wall cannot block: a status page that requires a login is by definition not a public status page, so Rule 1 does not apply. Vocabulary-complete zero across all 246 first-party documents for status page, uptime, service status and outage; the single incident regex hit is the word INCIDENTAL inside a liability clause. The Terms of Service (Brosley Ltd, last updated 8 May 2018) disclaim the commitment outright, VERBATIM: "UNICENTA MAKES NO WARRANTY THAT THE UNICENTA SERVICES WILL MEET YOUR REQUIREMENTS OR BE AVAILABLE ON AN UNINTERRUPTED, SECURE, OR ERROR-FREE BASIS". api.unicenta.io/customer/status returns {"status": "up!"} (verified 2026-09-05) but that is a machine health route with no component list, no incident history and no operator view. EDITION: for BASE and PLUS the software is self-hosted so uptime is the operator's own; only HOSTED (GBP 15/month, unicenta.com/apply/) is vendor-run, and it has no status page. https://unicenta.com/about-unicenta-opos-point-of-sale/terms-service/ · retrieved 2026-09-05 adversarially verified
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
Support is forum-based (subscriber forum plus open SourceForge community). No phone support, no published hours, no SLA; email support only at HOSTED. https://unicenta.com/support/ · retrieved 2026-08-01
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
OVERTURNED. The FAQ (v4-generation, opening "Many of the FAQ s here still apply to earlier versions of uniCenta oPOS") has a dedicated On-site Support heading and states verbatim: "On-site support is not something we specialise in as we are first foremost a software house. We have been to customer sites though when requested. So far all of these have been to assist with multi-location, multi-terminal installations." That is first-party on-site installation support delivered on request - not a remote-only model, so the standing no is false. It falls short of the full rubric on two counts, hence partial rather than yes. First, it is explicitly ad hoc rather than a program ("not something we specialise in"), the default being remote: "Remote Support across the wire is by far the most cost effective way to provide support. We use a fully licensed version of Teamviewer and so not restricted to the 5 minute sessions". Second, there is no CERTIFIED dealer network - the vendor states the opposite: "If you are a POS Dealer or Reseller the same applies. You are free to distribute uniCenta oPOS without any need to seek our permission in any way", i.e. resellers are unvetted by design. /apply/ lists no on-site line item in the BASE, PLUS or HOSTED tiers and routes bespoke work to "CUSTOM PLAN only". Edition note: this is the paid Brosley Ltd subscription side; the Community GPL 5.0 build from SourceForge carries no support at all. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
A hardware replacement/advance-exchange program with a stated turnaround time is included or purchasable.
reliability-hardware-replacement-sla
No vendor hardware, therefore no replacement or advance-exchange program. https://unicenta.com/features/ · 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 I record why this differs from payments-p2pe-pci4, which I held at unknown: the two rubrics turn on different verbs. This one asks whether the vendor PUBLISHES a current AoC or equivalent, and publication is directly observable against a bounded surface - unicenta.com's Yoast sitemap is the registry (315 locs) because /wp-json/wp/v2/types returns 401 MISSING_AUTHORIZATION_HEADER, and I closed the gated-document catalogue myself (unicenta.com/downloads/guides/ pages 1-3, probed 2026-09-05: exactly 20 login-walled v4-era guides, none of them a compliance attestation). Nothing on that surface is an AoC. What the vendor does publish is a superseded standard, VERBATIM (unicenta.com/faqs/): "From uniCenta oPOS version 4.4 we now include, as standard, a fully compliant and approved PCI/EMV P2PE PA-DSS solution using our posApps Plugin Manager" - PA-DSS was retired by the PCI SSC in October 2022, the claim is v4.4-era ("Official accreditation received from PaymentSense for our posApps Credit Card Payment plugin", July 2017, unicenta.com/about-unicenta-opos-point-of-sale/unicenta-news/), and features/differences/ (10 March 2023) reads "DEPRECATED Card payment gateways (PCI compliance)". Vocabulary-complete zero across all 246 documents for attestation, AoC, SAQ, QSA, ROC and DSS v4/4.0/4.0.1. Nothing addresses the post-March-2025 future-dated requirements. Grade C - the citation is the FAQ, a v4-era support page. https://unicenta.com/faqs/ · 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
Role-based security levels with PIN/password and iButton hardware key authentication documented; MFA on back-office or admin logins is not. https://unicenta.com/features/ · 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 install and config docs exist, but user and developer guides are subscriber-gated, reviewers cite a missing manual, and no training mode is documented. https://unicenta.com/support/ · 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
The v4 Configuration reference is the complete published description of uniCenta multi-database capability, and the vendor states its purpose - which is not failover. DATABASE SETUP verbatim: "Multi-DB : Slide to ON to allow connection to a second MySQL database", and SETTINGS FOR DB 2 verbatim: "The option to have a second uniCenta oPOS database is useful for example if you want to try different settings , do training or access another department database all from the same machine." Testing, training, another department - no replica, no promotion, no automatic role change. This is the feature listed as "Multi-Database option" under NEW in the v5 delta /features/differences/ (10 March 2023), so it is current, and /multi.?database/i -> 1 across all 246 docs (that page alone) confirms nothing else is published on it. Absence control: /failover|fail-over|high availab|redundan|master.{0,10}(node|server|terminal)|hot.?standby/i -> 0 across all 246 docs. The vendor instead puts the burden on the operator, FAQ verbatim: "If you have chosen to run one of the commercial grade SQL databases and it s sitting on a separate server; make sure it is installed and configured by someone who knows how to do it properly." Bounded to the crawlable site; the members-only "Administrator Guide" (337-byte login wall) is outside it, but the public Configuration reference is where a failover setting would appear and its DATABASE SETUP section is fully enumerated. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
Terminals support an automatic cellular/LTE failover for connectivity, first-party or documented.
reliability-cellular-backup
The FAQ HARDWARE section is the vendor complete published peripheral and connectivity list and it contains no networking product at all, verbatim: "Peripherals Report Printer Local or Networked Barcode Scanner USB, Serial Scanpal2 or compatible Cash Drawer via Cashdrawer kicker/Serial port via Printer Customer Display Serial 2 line x 20 char Mag Stripe Reader K board, Generic or Intelligent Receipt Printer Serial/Network/USB with Virtual COM installed ... Weighing Scale Casio, Dialog1, Mettler, SamsungESP or compatible iButton USB (Windows only)". Connectivity is explicitly the operator to buy and engineer, verbatim: "The basis for success of any application running a multi-terminal or Cloud connected installation is a solid and reliable network ... If you intend to use wireless then be prepared to spend money to get the best router you can afford. Spend time setting it up to get the best reliability. Best advice that can be given is: Don t compromise!" Absence controls over all 246 docs: /cellular|LTE|\b4G\b|\b5G\b|SIM card|mobile data|broadband/i -> 5 apparent hits, and ALL FIVE are substring false positives on LTE inside "fiLTEr" and "aLTErnatively" - the true count for every one of these terms is zero; /router|wireless|network hardware|wi-?fi/i -> 1, the FAQ passage quoted above. Generation: the FAQ is v4-era and self-disclaiming, so the v5 bound is the complete 5.0 -> 5.4.0 release-note sequence, which adds no hardware and no networking issue key. https://unicenta.com/faqs/ · retrieved 2026-09-05 adversarially verified
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
Paid tiers are annual (£72/£144/£180) though cancellable anytime; a 'Hosted Monthly 50%' level is referenced but unpriced. Core software is free with no contract. https://unicenta.com/apply/ · retrieved 2026-08-01
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
Verified on the pricing page: 'Cancel your subscription at any time' and uniCenta oPOS 'does not stop working' after expiry. Residual risk is that no T&Cs or MSA page is reachable, so refund treatment of a prepaid annual term is unverified — but no termination penalty is published or implied. https://unicenta.com/apply/ · retrieved 2026-08-01 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
UPHELD yes - I spot-checked every quote against the file and re-tested both rubric limbs, the counterparty, the date and the edition split as the audit brief asked. Both limbs are stated in publicly accessible contract terms. VERBATIM, Terms of Service (uniCenta / Brosley Ltd, London, England; last updated 8 May 2018), Billing: "You can elect to purchase the uniCenta Services under your agreed uniCenta plan either for one month, one year, or multiple years. The chosen plan s renewal date is 12 months from the date of purchase. The plan s default option is to not automatically renew unless you have chosen otherwise. If you do not wish to renew then you must cancel your plan according to terms outlined in Clause 11 (below) a minimum of forty-eight (48) hours prior to the opted renewal date." VERBATIM, Account cancellation: "You must cancel your uniCenta account at least forty-eight (48) hours before the end of your billing cycle anniversary date in order to avoid billing of the next cycle s fees to your credit card or nominated payment method." So the renewal term (12 months, opt-in) and the required notice window (48 hours) are both public. DATE: the ToS is eight years old and predates the 5.4.0 product, but the rubric asks whether the terms are published, and current publication is what I verified; the counterparty named in the document, Brosley Ltd, is the same entity that bills today. TENSION WORTH RECORDING: unicenta.com/apply/ markets the same arrangement as "Cancel your subscription at any time" and "Absolutely no handcuffing you into any kind of recurring commitment", which sits awkwardly beside a 48-hour notice requirement; the ToS governs. EDITION SPLIT: this governs the paid BASE/PLUS/HOSTED relationship only - Community 5.0 is GPL-3.0 software with no counterparty and no renewal, and "uniCenta oPOS does not stop working after your subscription expires". https://unicenta.com/about-unicenta-opos-point-of-sale/terms-service/ · retrieved 2026-09-05 adversarially verified
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
Configuration guide: 'Credit Card Payment gateways have been removed from uniCenta oPOS due to the latest PCI Regulations.' The payment-gateway setting is left 'Not defined' unless the operator installs a third-party terminal plugin (PaymentSense UK/IE, Dejavoo US/CA). The GPL build ships with no processor; card acceptance is opt-in and no subscription tier is contingent on it. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-08-02 adversarially verified
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
No processing rate of any kind is published — no flat rate, no interchange-plus markup, no bps figure. https://unicenta.com/card-payments/ · 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
UPHELD partial - the fee-change category is expressly addressed, there is no cap, and there is an unrestricted exit. AGAINST the merchant, VERBATIM (Terms of Service, Changes; Brosley Ltd, last updated 8 May 2018): "At any time uniCenta may supplement or amend these Terms of Service. Out of courtesy, uniCenta will provide notice to you of any changes affecting cancellation or payment of fees by email to the email address nominated by you in your registration form." Unilateral amendment of fee terms, notice as a courtesy only, no cap and no increase-triggered exit right. FOR the merchant: the subscription is prepaid and opt-in-renewal ("The plan s default option is to not automatically renew"), and unicenta.com/apply/ states "Cancel your subscription at any time" and "Absolutely no handcuffing you into any kind of recurring commitment" - so an increase can only bite at a fresh purchase the merchant is free to decline. That is a de facto penalty-free exit, not a clause tied to increases, which is why this is partial rather than yes. SCOPE CAVEAT, correctly identified by the proposal and I confirm it: uniCenta is not the card processor, so there is no processing agreement here at all - card rates are set by Dejavoo, PaymentSense or Teya under contracts uniCenta neither publishes nor controls, and that limb of the rubric is unaddressed rather than failed. EDITION: applies to the paid subscription only; Community 5.0 has no fees. https://unicenta.com/about-unicenta-opos-point-of-sale/terms-service/ · retrieved 2026-09-05 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
BASE £6/mo (£72/yr), PLUS £12/mo (£144/yr), HOSTED £15/mo (£180/yr), core software £0. Priced per installation; no per-terminal software charge exists. https://unicenta.com/apply/ · 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 monolithic application with no separately purchasable modules; tiers bundle support, API access and hosting rather than functionality. https://unicenta.com/apply/ · 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
Every terminal, display and printer is commodity third-party hardware bought outright; no vendor lease or rental exists. https://unicenta.com/features/ · 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
Configuration guide, PERIPHERALS tab: 'Each of these settings offer a selection for a manufacturer's communication protocol. When chosen you will be asked to complete the type and connection port.' Printer and Printers 2-6 - 'you can choose any printer even if it is a remote network printer'; Scanner - 'Many barcode scanners today are USB and act like a keyboard. If you have serial scanner, set the port it's connected to'; Scale - 'Choose from one of the manufacturers in the list' (the changelog names third-party units, e.g. an Avery Berkel weigh-scale device-list fix); Customer Display 'applies to both built-in and stand-alone displays'. The Install page requires only Java 8 plus MySQL on a standard Windows/Linux/macOS machine - no uniCenta-branded device exists or is required. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-08-06
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
A documented API export path does exist: the published Insomnia collection defines bulk reads - GET /customer, GET /order and GET /product - under HTTP Basic auth against api.unicenta.io. Shortfall on the fee and format tests: API access is a paid subscription benefit rather than part of the free build, no CSV or spreadsheet export is documented on the reporting or features pages, and the free alternative of querying the operator's own database depends on a table reference gated to Plus and Hosted subscribers. https://docs.unicenta.com/insomnia.json · retrieved 2026-08-07
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
Re-grounded off the /api/ overview onto what actually carries the cell: uniCenta runs against a database the operator supplies - "The most essential setting is that you have a MySQL server installed, set up, and running correctly" - so customer records, on-account and Customer Store Card balances and voucher rows are the operator's own tables, and a SQL or CSV dump needs no vendor step, ticket or approval. The Customer API (GET /customer) is a second route but not the load-bearing one, since it is gated to a paid subscription and returns profile fields only. Caveat on documentation rather than on access: the vendor's database table reference is subscriber-gated, so the field layout must be read off the schema, not off a published manual. The claim asks for machine-readable exportability by the operator, and that holds. https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-08-09
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
Moot for self-hosted installs — data never leaves the operator and the app keeps running. For HOSTED, no retrieval window is documented. https://unicenta.com/apply/ · retrieved 2026-08-01
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 yes - both rubric limbs are met by an explicit published clause, and I verified every quote against the file. Data Confidentiality Agreement (uniCenta / Brosley Ltd, London England; last amended 24 May 2018; incorporated by the Terms of Service). OWNERSHIP, VERBATIM: "Proprietary Rights. Other than as expressly provided in the Terms of Service , uniCenta obtains no proprietary rights of any kind to your Confidential Information. Ownership of your Confidential Information stored on uniCenta Services is retained by the Account Owner", where Confidential Information is defined as "all of your Data (as defined in the Terms of Service ) stored using the Services". VENDOR-USE RESTRICTION, VERBATIM: "not use any Confidential Information in any way other than for the purpose of providing the Services to you" and "not at any time disclose, give, or transmit (in any manner or form or for any purpose) your Confidential Information to any person, party, firm, or corporation other than you". No aggregated or de-identified resale right is reserved anywhere; the only carve-out is identity, not data, and it is named explicitly: "excluding your name, company and/or logo which may be used by uniCenta for marketing purposes". DATE/COUNTERPARTY, tested as the brief asked: 24 May 2018, Brosley Ltd - eight years old and predating 5.4.0, but currently published and the same entity that bills today. SCOPE LIMIT I ADD: the clause reaches only data "stored using the Services", so for self-hosted BASE and PLUS installs - the majority - no merchant data reaches the vendor and the clause is protective but largely inapplicable; it bites for HOSTED. The Privacy Policy is narrower still, covering only "information collected through the uniCenta websites", so the merchant-data protection rests on this agreement and not on it. https://unicenta.com/about-unicenta-opos-point-of-sale/data-confidentiality/ · 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 partial, consistent with hardware-p2pe-terminal on the same evidence. Hardware-encrypted card entry is documented; tokenization and the SAQ are not. VERBATIM (unicenta.com/faqs/): "From uniCenta oPOS version 4.4 we now include, as standard, a fully compliant and approved PCI/EMV P2PE PA-DSS solution using our posApps Plugin Manager" and "These providers use the latest nex-gen type of payment terminals which massively reduce the risk to merchants introduced in the current PCI regulations." The architecture is corroborated on the vendor's own setup page, which removes uniCenta from the card data path: "Credit Card Payment gateways have been removed from uniCenta oPOS due to the latest PCI Regulations. These will now be available as plug-ins." and "Payment Gateway : Default Not defined . Use the external option if you currently have a Credit Card terminal and wish to track card sales in uniCenta oPOS" (unicenta.com/pages/configure-unicenta-opos/), which keeps PAN out of the Java application. SHORTFALLS blocking a yes: no tokenization or token-vault architecture is described anywhere - corpus-wide zero for tokeni[sz]- across all 246 documents; no P2PE solution listing is cited; no merchant SAQ type (A, A-EP or P2PE-HW) is ever named - corpus-wide zero for SAQ. The standard invoked, PA-DSS, was retired by the PCI SSC in October 2022, and the FAQ self-disclaims currency ("Many of the FAQ s here still apply to earlier versions of uniCenta oPOS"). Grade C - a v4-era support/marketing page. EDITION: payment plugins are subscriber-side; Community 5.0 ships no gateway. https://unicenta.com/faqs/ · 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
v5, dated 10 March 2023 - the newest PCI statement the vendor publishes, and it is a withdrawal: "DEPRECATED ... Card payment gateways (PCI compliance)". The corpus does discuss PCI five times, so this is a bounded absence over a topic the vendor addresses, not a silent one: the FAQ (v4, self-disclaiming) still describes "a fully compliant and approved PCI/EMV P2PE PA-DSS" solution - PA-DSS, a standard retired in October 2022 - and /pages/configure-unicenta-opos/ says "Credit Card Payment gateways have been removed from uniCenta oPOS due to the latest PCI Regulations." Regexes over 246 docs: /PCI DSS|PCI-DSS|DSS v?4|4\.0\.1|6\.4\.3|11\.6\.1|script integrity|cardholder data|\bCDE\b|SAQ/i -> 0 docs; /\bMFA\b|two[- ]factor|2FA|multi[- ]factor/i -> 1 doc, and that hit is a FALSE POSITIVE - the string "2fa" inside an Apache mailing-list CVE URL on the 5.3.1 dependency-report page. https://unicenta.com/features/differences/ · 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
First-party legal page, published 8 May 2018, still the vendor's current GDPR position (Brosley Ltd; applies to the paid subscription services). On tooling: "We will assist a customer, upon request, and as much as reasonably possible, to respond to a data subject request (SAR) they may receive under the GDPR" and "Where this is not possible, please contact us to request assistance with any such Individual Rights Request (SAR)" - assistance on request, not in-app locate/export/delete. On the DPA half: the page offers only "A list of our sub-processors can be found in the Sharing Your Personal Information section on our Privacy Policy page", and /data-confidentiality/ (24 May 2018) is a confidentiality agreement, not an Article 28 processing agreement. Regexes: /data processing agreement/i -> 0 docs; /DPA|processor|controller/i -> 1 doc (this one). TRAP: the [gdpr_request_form type="delete"] shortcodes on /gdpr/ are a WordPress plugin serving website visitors, not product tooling. https://unicenta.com/unicenta_gdpr_customer_help/ · retrieved 2026-09-05 adversarially verified
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
v4 marketing with the v5 delta as companion. The operating modes are enumerated - SYSTEM "Customizable GUI ... Mixed use Retail/Hospitality Mobile POS ... Restaurant mode Retail mode ... Supermarket mode" - and no self-order or consumer-facing surface is among them; v5 adds only "New flat Look and Feel" and drops "800 x 600 pixels screens". Regexes over all 246 docs: /\bkiosk/i -> 0 docs; /WCAG|VPAT|accessibility conformance|section 508/i -> 0 docs; /accessib|screen reader|\bADA\b/i -> 6 docs, every hit the ordinary word "accessible" (a database "accessible and configured correctly", "make it as accessible as possible to all SME's") or the country "Canada". No kiosk product, and no conformance report of any kind. https://unicenta.com/features/ · 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
v4 configuration walkthrough paired with the v5 delta, which confirms the same feature shipped in v5 ("NEW ... Service Charge Option"). The vendor's only fee mechanism is card-blind: "Enable Service Charge : Used together with the special xxx988 Product to add (optional) fixed charge to a sales transaction. Service Charge Rate ?% : The rate to charge. This value should be net of Tax." It is applied per transaction via a product line, before and independent of tender, so it cannot exclude debit or prepaid cards. Regexes over 246 docs: /surcharg|cash discount|dual pricing|convenience fee/i -> 0 docs (the two hits on that pattern set are both the phrase "service charge"); /PCI DSS|SAQ/i -> 0 docs. Card payments themselves are third-party (Dejavoo, PaymentSense) with gateways "removed from uniCenta oPOS due to the latest PCI Regulations". https://unicenta.com/pages/configure-unicenta-opos/ · retrieved 2026-09-05 adversarially verified
Adversarial verification
An independent pass was instructed to refute this record, defaulting to downgrade when uncertain. It challenged 227 values — 75 upheld, 149 downgraded, 3 upgraded. It separately resolved 57 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.processor_lock_in | downgrade-to-partial | 'Open' overstates it. For integrated card payments there is exactly one supported processor per region (Dejavoo in the Americas, PaymentSense in UK/IE), delivered via a third-party plugin manager; native gateway support was removed from the core app. An operator can of course fork GPL source or key in manually, but out-of-the-box integrated acceptance is single-processor-per-region. source |
| pricing.software | upheld | Figures verified verbatim on the pricing page, all charged yearly. One correction: BASE's bullet list itself includes 'Developer Guides', 'Developer support' and 'API Access', which contradicts the /developer/ page restricting developer content to Plus/Hosted subscribers. The vendor's two pages disagree; treat BASE entitlements as unreliable rather than settled. source |
| pricing.processing_rate | upheld | Verified: the card-payments page publishes no rate, no markup, no bps figure and names no processor; the only quantification anywhere is the unexplained '10%'/'15% rate discount' on the pricing tiers. Quote-only is correct. source |
| api_posture.webhooks | upheld | Webhooks verdict stands - the collection defines no outbound events, no signing and no retry policy. But the supporting characterisation was wrong and is corrected: the three resources are not inbound-only. Parsing docs.unicenta.com/insomnia.json shows GET /customer, GET /order and GET /product alongside POST/PUT/DELETE, all under HTTP Basic auth against api.unicenta.io. The record had described the API as write-only. source |
| api_posture.data_export_on_exit | downgrade-to-partial | Two corrections. First, the database list is wrong: the Configure guide states "uniCenta oPOS v4 only uses MySQL", the Install guide records that Derby, HSQLDB and Oracle Express "are no longer included", and the FAQ lists MySQL alone. PostgreSQL and Oracle were asserted across product.yaml, narrative.md and four claim notes and are removed. Second, the no-hostage conclusion holds but is narrower than stated - the table reference documenting what a dump contains is gated to Plus and Hosted subscribers, so an exiting operator owns the bytes without a free specification of them. source |
Capability claims
| Claim | As first scored | Verdict | What the verifier found |
|---|---|---|---|
| reliability-lan-degraded-multi-terminal | yes / inferred | downgrade-to-partial | A 'yes' on a weighted differentiator sourced to a SourceForge project page that says nothing about offline or degraded operation. The vendor publishes no offline statement anywhere, and its own FAQ undercuts the architecture story: the MySQL database may be 'Local, Remote or Cloud', the HOSTED tier is cloud-hosted, and iPad/Android terminals are RDP sessions to a host — all of which fail during an outage. LAN-shared state is a possible deployment, not a documented product guarantee. source |
| reliability-local-transaction-engine | yes / documented | downgrade-to-partial | Same defect: 'documented' confidence is not supported. The desktop Java client is real, but locality of the transaction engine depends on where the operator puts MySQL ('Local, Remote or Cloud' per the FAQ) and is explicitly false on the HOSTED tier. No vendor document asserts a local transaction engine as a designed property. source |
| hardware-printer-compatibility | yes / claimed | downgrade-to-partial | Sourced to the marketing bullet 'Multi-Printer'. No supported-printer or driver list is published; the only hard fact found is an FAQ cap of '6 directly attached or network printers + a report printer'. Printer-agnosticism is inferred from the ESC/POS lineage, not documented. source |
| extensibility-menu-write-api | yes / documented | downgrade-to-partial | The Product API is real (changelog: 5.3, March 2024) but it is not documented anywhere reachable — docs.unicenta.com returns empty content, and the developer guides plus database-table reference are gated to Plus/Hosted subscribers. Critically, the free community build is v5.0, which predates the Product API entirely, so this is a paywalled-build feature with no published schema, auth method, or error semantics. source |
| reporting-tier-paywall | yes / claimed | downgrade-to-partial | Directly contradicted by the vendor's own pricing page: 'Web Reporting' and 'Remote Order Display' are enumerated as BASE (£72/yr) subscription benefits, not free-build capabilities, and the current build itself is subscriber-only. Reporting access is gated by a paid tier even if there is no separate analytics SKU. source |
| extensibility-free-sandbox | partial / inferred | downgrade-to-no | The reasoning ('free build is a de facto test environment') collapses once you check versions: the free v5.0 build contains none of the APIs (added in 5.1/5.2/5.3). You cannot exercise a single documented endpoint without paying. No vendor sandbox, no seeded data, no test keys. source |
| payments-emv-nfc | partial / claimed | downgrade-to-unknown | The quoted EMV/PCI language does not appear on the cited card-payments page (which claims only 'integrated card payments in the UK, EU and USA', 'all major payment methods', 'get paid the next business day'). Where EMV/P2PE is claimed, it is for the third-party 'posApps Plugin Manager' — card gateways were removed from uniCenta core for PCI reasons — and posapps.io now 301-redirects through a parked-domain chain (pieshare.io → inheritdoc.io → momint.io). Contactless, Apple Pay and Google Pay are never named. Not native, not verifiable, possibly defunct. source |
| payments-processor-choice | partial / inferred | upheld | Score stands but the note is factually wrong: the vendor DOES publish a processor list. The FAQ names Dejavoo (Americas) and PaymentSense (UK/Ireland) as the supported providers, each requiring a merchant account with that provider. So it is not 'no gateway list published' — it is a list of exactly one processor per region, which is weaker for the operator than the dossier implies. source |
| payments-p2pe-pci4 | unknown | upheld | Upheld, with an added caution for the write-up: uniCenta material claims a 'fully compliant and approved PCI/EMV P2PE PA-DSS solution' for Dejavoo. PA-DSS was retired in October 2022 and replaced by PCI SSF, so the claim is stale on its face, and no AoC, PCI DSS version, or P2PE listing entry is published. Unknown is the right score. source |
| extensibility-app-marketplace | no / documented | downgrade-to-partial | Too strong in the wrong direction. A self-install plugin mechanism does exist and is referenced repeatedly in the vendor changelog — the posApps Plugin Manager, which delivers card payments, digital receipts and other plugins. It is third-party and its site now resolves to a parked-domain redirect chain, so score it partial-and-decaying rather than a flat documented 'no'. source |
| labor-clock-in-at-pos | unknown | resolve-to-yes | Under-scored. The vendor features page explicitly lists employee 'CheckIn/CheckOut' under Personnel, alongside 'iButton/Dallas key' and 'Secure User Logon' authentication, with an 'Employee' report category. That is a POS-resident time punch tied to an identified employee. Claim-level (marketing features page), but affirmatively enumerated. source |
| payments-house-accounts | partial / claimed | upgrade-to-yes | The note's stated gap is wrong. The features page lists 'Statement' explicitly under customer data, together with 'Account Sale', 'Account Settlement', 'Credit Limit' and 'Transaction History'. Charge accounts with balances and statements are enumerated; the researcher missed the Statement line. source |
| order-capture-split-merge | unknown | resolve-to-partial | SCORE CHANGE unknown→partial (a raise, not a cut — the enum has no 'upgrade-to-partial'). The features page lists 'Split Receipts' and 'Transfer Order Item' under Sales, so splitting a check and moving items between checks are documented. Split by seat or by arbitrary amount, and check merging, remain undocumented — hence partial, not yes. source |
| payments-gift-cards | unknown | resolve-to-partial | SCORE CHANGE unknown→partial (a raise). Beyond the 'Customer Store Card' the researcher found, the features page also lists 'Voucher management' as a system feature. Some stored-value construct is documented; balance mechanics, cross-location and online redemption are not. source |
| menu-pricing-combos | unknown | resolve-to-partial | SCORE CHANGE unknown→partial (a raise). 'Product Bundles' is listed under Inventory on the features page — a kit/bundle construct exists. Swap deltas, component substitution pricing and automatic cart conversion are undocumented, so it stops short of yes. source |
| order-capture-native-handheld | no / documented | upheld | Upheld and reinforced against an obvious trap: the features page does list 'Mobile POS', which could easily have been read as a handheld. The FAQ confirms iPad and Android devices require 'an RDP app' to reach a host installation, and only Windows tablets run the app directly. Remote desktop session, not a native handheld. source |
| hardware-os-platforms | partial / documented | upheld | Score stands, note is wrong. The FAQ publishes minimum specs the dossier calls unpublished: Java 1.8 JRE 32/64-bit, 1024MB RAM, 70MB disk, MySQL 5.6+, Windows XP SP3/7/8/10, CentOS/Ubuntu/Mint, macOS 10.6.8+. Separately, the changelog says v5.0 introduced native applications 'eliminating JVM requirements' — the vendor's own docs contradict each other on the Java prerequisite, which is worth flagging. source |
| digital-first-party-web | partial / documented | upheld | Score stands, with a material caveat the dossier omits: WooCommerce integration shipped in 5.4.0 (August 2025), a subscriber-only build. It is unavailable in the free v5.0 community release, so the only 'digital ordering' path costs at least £72/yr on top of the operator building and hosting their own WooCommerce store. source |
| reporting-public-api | partial / documented | upheld | Upheld and independently verified: docs.unicenta.com returns no content at all, and the /developer/ page gates guides and the database-table reference to 'uniCenta Customer Plus, Hosted, and Hosted Monthly 50% Subscribers only'. The public /api/ page describes three endpoints with no auth method, no schema, no rate limits, no webhooks. source |
| commercial-no-early-termination-fee | yes / documented | upheld | Verified on the pricing page: 'Cancel your subscription at any time' and uniCenta oPOS 'does not stop working' after expiry. Residual risk is that no T&Cs or MSA page is reachable, so refund treatment of a prepaid annual term is unverified — but no termination penalty is published or implied. source |
| hardware-kds | partial / claimed | upheld | Verified: 'Remote Order Display' is enumerated as a BASE-tier (£72/yr) benefit on the pricing page. Nothing published on bump bars, routing rules, or fire timing. Partial is correct, and note it is a paid-tier item, not a free-build capability. source |
| commercial-processing-not-bundled | yes / grade E, cites unicenta.com/card-payments/ | upheld | Challenged because a differentiator 'yes' was resting on grade E. I located first-party configuration documentation that settles it directly: the Configure uniCenta oPOS guide states 'Credit Card Payment gateways have been removed from uniCenta oPOS due to the latest PCI Regulations', and the payment-gateway configuration setting is left as 'Not defined' unless the operator installs a third-party terminal plugin (PaymentSense UK/IE, Dejavoo US/CA). The GPL build therefore ships with no processor at all — card acceptance is an opt-in plugin, never a condition of running the software, and no subscription tier is contingent on taking uniCenta's payments. Re-graded E to B on documentation I retrieved myself. source |
| hardware-ownership-vs-lease | yes / grade E, cites unicenta.com/apply/ | upheld | Challenged as a differentiator 'yes' at grade E resting on a pricing page. The vendor FAQ documents the operator-supplied model affirmatively rather than by silence: 'If you already have or intend to buy POS hardware then it's very likely that uniCenta oPOS will run on it', followed by an operator-side spec list (1024MB RAM, 70MB disk, Java 1.8 JRE, Windows XP SP3/7/8/10, Linux, macOS 10.6.8+) and generic peripherals. The configuration guide reinforces it: each peripheral is set up by choosing 'a manufacturer's communication protocol', i.e. the operator's own devices. uniCenta describes itself as 'first & foremost a software house' and publishes no hardware store, bundle, rental or lease anywhere on the site. Upheld, re-graded E to B. source |
| hardware-usable-after-churn | yes / grade E, cites unicenta.com/apply/ | upheld | Challenged on the same grade defect. Two documented facts, both retrieved: the hardware is the operator's own commodity PC/touchscreen and generic peripherals bought from third parties (FAQ), so there is no vendor-supplied or vendor-keyed device that could be deactivated; and the software itself does not die with the subscription — the pricing page states 'uniCenta oPOS does not stop working after your subscription expires.' The GPL3 licence on the community build makes that irrevocable regardless of vendor intent. The only residual exposure is the HOSTED tier, where the vendor runs the instance — but that is a hosting dependency, not hardware bricking. Upheld, re-graded E to B. source |
| reporting-history-retention | yes / grade E, cites sourceforge.net project page | downgrade-to-partial | This one does not survive. The cited SourceForge project page says nothing whatever about reporting history, retention or truncation, and I could find no vendor statement on retention on any reachable page — the FAQ covers the database ('MySQL v5.6 or later Local, Remote or Cloud') without a word on retention, and the Developers Section, which holds the database-table reference and reports guides, is gated: 'This content is available to uniCenta Customer Plus, Hosted, and Hosted Monthly 50% Subscribers only.' What is documented is only the architecture: on a self-hosted install the operator owns the MySQL instance, so no vendor-imposed retention window or archive-retrieval fee can exist. Three named shortfalls stop that short of yes — Web Reporting is an enumerated BASE (£72/yr) subscription benefit rather than a free-build capability, retention and export mechanics on the vendor-run HOSTED tier are entirely undocumented (only 'daily automated backups' is published), and no report lookback range is documented anywhere public. Unlimited history is an inference from operator-held storage, not a documented product property. source |
| order-capture-split-merge | partial, grade B - SCORE CHANGE unknown→partial (a raise, not a cut — the enum | 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 |
| menu-pricing-combos | partial, grade B - SCORE CHANGE unknown→partial (a raise). 'Product Bundles' is | 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 |
| payments-pay-at-table | no, grade B - Vendor ships no handheld hardware, so there is no pay-at-tab | 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 |
| payments-gift-cards | partial, grade B - SCORE CHANGE unknown→partial (a raise). Beyond the 'Customer | 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 |
| payments-house-accounts | yes, grade B - The note's stated gap is wrong. The features page lists 'Sta | 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 |
| labor-clock-in-at-pos | yes, grade B - Under-scored. The vendor features page explicitly lists empl | 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 |
| hardware-handheld-purpose-built | no, grade B - Vendor sells no hardware; there is no first-party handheld a | 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 |
| hardware-peripherals | yes, grade B - Documented set: cash drawers, barcode scanners, weighing sca | 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 |
| hardware-pricing-transparency | no, grade B - Not applicable in the vendor's favour: no hardware prices ar | 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 |
| hardware-rma-sla | no, grade B - No vendor hardware, therefore no warranty term or advance-ex | 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-hardware-replacement-sla | no, grade B - No vendor hardware, therefore no replacement or advance-exch | 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-native-not-partner | yes / B / Stock, multi-warehouse, suppliers and transfers are native to the single application; no th | downgrade-to-partial | The 'yes' rested solely on the /features/ marketing feature list, which is grade C and cannot carry a yes on a differentiator. Documentation does support the native half: the first-party changelog shows the stock module, multi-location stockcurrent filtering, min/max and the inventory report set shipping inside the application. It does not support the recipe-costing half of the claim - no guide, release note or API endpoint mentions recipes or ingredient costing, and the project's own SourceForge help forum met the hamburger/bun/patty request with a bundle workaround that deducts a single parent product. Partial with that shortfall named. source |
| commercial-hardware-not-locked | yes / B / Runs on standard Windows/Linux/macOS machines with standard receipt printers, drawers, scan | upheld | The cited evidence was the /features/ quick-view feature list, a grade-C sales page that cannot carry a yes on a differentiator. Re-cited to the first-party Configure uniCenta oPOS setup guide, whose PERIPHERALS section describes selecting a manufacturer's communication protocol plus type and port for customer display, printers 1-6 (including network printers), scale, scanner and reports printer, and to the Install page requiring only Java 8 and MySQL on a standard desktop OS. Value survives on documentation, not marketing. source |
| hardware-commodity-devices | yes / B / Pure software: a Java application on any Windows, Linux or macOS machine bought anywhere. No vendor terminal exists or is required. | upheld | Value survives, citation replaced. The evidence was the SourceForge project landing page, which is a grade-C project/feature page and cannot carry a yes at differentiator weight. Re-cited to uniCenta own FAQ system-requirements block, which states the hardware directly: "POS Terminal - Touchscreen preferred or a PC - what you have got", Windows XP SP3/7/8/10, "Linux - CentOS, Ubuntu, Mint or other", "Mac OSX - 10.6.8 and later", 1024MB RAM, 70MB disk, Java 1.8 JRE, plus "written in Java which means it can run of billions of devices". Quotes verified against the live page, not a mirror. uniCenta sells no terminal at all, so the proprietary-hardware half of the claim cannot fail. source |
| digital-guest-data-ownership | yes / B / Self-hosted GPL3 app on the operator own MySQL/PostgreSQL/Oracle database plus a Customer API; guest records are exportable by SQL at no fee. | downgrade-to-partial | The ownership half is documented and survives - the Configure guide requires the operator to stand up their own MySQL server, so guest rows never sit in a vendor silo. The export half does not. The claim demands bulk export without a fee or vendor approval, and every documented route is gated: the Customer API GET /customer is a paid subscription benefit, the database table reference returns "This content is available to uniCenta Customer Plus, Hosted, and Hosted Monthly 50% Subscribers only", and the GDPR subject-request page routes operators to "contact us to request assistance". Consented marketing status is not a documented field anywhere on the site. The original note also asserted PostgreSQL and Oracle support, which the Configure guide contradicts - v4 onward is MySQL only. source |
| extensibility-data-portability-exit | yes / B / Data never leaves the operator own MySQL/PostgreSQL/Oracle instance; complete historical export is a database dump, free, any time. | downgrade-to-partial | No hostage risk, but the claim also requires a documented machine-readable format and that is what fails. uniCenta own database table reference - the document that would tell an operator what a dump contains - is subscriber-only, and the published API collection defines no response schema, no pagination and no field list. A dump an operator must reverse-engineer is not a documented export format. The no-hostage half is genuine and is why this lands at partial rather than no: the data sits in the operator MySQL instance and the software keeps running after a subscription lapses. source |
| commercial-data-export-self-serve | yes / B / Full transactional history sits in the operator own MySQL/PostgreSQL/Oracle database, exportable by SQL or dump with no ticket and no fee. | downgrade-to-partial | Located the actual API blueprint at docs.unicenta.com/insomnia.json, which does document bulk reads - GET /customer, GET /order and GET /product under HTTP Basic auth - so a documented API path exists and the record understated it. But the claim requires CSV or a documented API without paying a fee, and API access is a paid subscription benefit rather than part of the free build. No CSV or spreadsheet export is documented on the web-reporting or features pages. The free SQL route depends on the subscriber-only table reference. Partial on the fee and format tests. source |
| order-capture-void-comp-controls | partial, grade D - cited to https://sourceforge.net/projects/unicentaopos/ | upheld | Grade only, value and note untouched. The same SourceForge URL carried grade B on four claims and grade D on five in this one record. It is neither vendor product documentation nor a marketing assertion - it is the project landing page, which the ladder grades C. Regraded to C so one URL carries one grade. The four B claims were re-researched separately rather than mechanically moved. source |
| payments-refund-void-controls | partial, grade D - cited to https://sourceforge.net/projects/unicentaopos/ | upheld | Grade only, value and note untouched. The same SourceForge URL carried grade B on four claims and grade D on five in this one record. It is neither vendor product documentation nor a marketing assertion - it is the project landing page, which the ladder grades C. Regraded to C so one URL carries one grade. The four B claims were re-researched separately rather than mechanically moved. source |
| labor-granular-rbac | partial, grade D - cited to https://sourceforge.net/projects/unicentaopos/ | upheld | Grade only, value and note untouched. The same SourceForge URL carried grade B on four claims and grade D on five in this one record. It is neither vendor product documentation nor a marketing assertion - it is the project landing page, which the ladder grades C. Regraded to C so one URL carries one grade. The four B claims were re-researched separately rather than mechanically moved. source |
| multi-location-org-hierarchy | partial, grade D - cited to https://sourceforge.net/projects/unicentaopos/ | upheld | Grade only, value and note untouched. The same SourceForge URL carried grade B on four claims and grade D on five in this one record. It is neither vendor product documentation nor a marketing assertion - it is the project landing page, which the ladder grades C. Regraded to C so one URL carries one grade. The four B claims were re-researched separately rather than mechanically moved. source |
| multi-location-consolidated-reporting | partial, grade D - cited to https://sourceforge.net/projects/unicentaopos/ | upheld | Grade only, value and note untouched. The same SourceForge URL carried grade B on four claims and grade D on five in this one record. It is neither vendor product documentation nor a marketing assertion - it is the project landing page, which the ladder grades C. Regraded to C so one URL carries one grade. The four B claims were re-researched separately rather than mechanically moved. source |
| reporting-public-api | partial / B / Upheld and independently verified: docs.unicenta.com returns no content at all, and | upheld | The cited unicenta.com/developer/ 301s to /developer-section/, which does still carry the quoted subscriber gate, so that leg survives the move. The other leg did not: docs.unicenta.com does not 'return no content' - it is an SPA, and its Insomnia collection is publicly downloadable at /insomnia.json. Reading it shows a genuine but narrow REST surface (customer, order, product; Basic auth; api.unicenta.io) with nothing for payments, labor, reporting or webhooks. Value unchanged at partial; the note and citation are replaced and the grade rises to A because the evidence is now the API reference itself. source |
| extensibility-public-api-docs | partial / B / A public overview describes three endpoints, but developer guides and database ta | upgrade-to-yes | The researcher graded this on unicenta.com/developer/ (now /developer-section/) and treated its subscriber gate as covering the API docs. Retrieving docs.unicenta.com shows otherwise: the shell is JS-only, but its collection at /insomnia.json is served unauthenticated and contains the full endpoint reference - paths, verbs, Basic auth, example payloads, environment base URLs. Calibrated against guessed siblings (data.json, api.json, config.json), which all return the 730-byte shell, so the 16,791-byte hit is the real document. Public, self-serve API reference documentation therefore exists; the gated guides are a separate gap. source |
| extensibility-doordash-preferred | no / B / Not among the 2026 DoorDash Preferred Integration Partners, and cannot meet the 250-l | upheld | The cited URL is dead - get.doordash.com and merchants.doordash.com both return 404 for the preferred-integration-partners-2026 path, at a 428KB soft body, and /partners 404s too. A dead citation is not evidence of absence, so I re-retrieved the roster: DoorDash's newsroom post of 18 May 2026 lists the 2026 cohort exhaustively as Checkmate, Chowly, Deliverect, Otter, PAR, Qu, Square, Stream, Toast and UrbanPiper. uniCenta oPOS is absent from a closed, dated enumeration published by the program operator, which is the positive absence a `no` requires. Separately, developer.doordash.com's DPIP page gives the actual bar (order failure rate <1%, merchant cancel rate <1%, eight required features) and contains no 250-store threshold, so that half of the researcher's reasoning is struck. source |
| delivery-3p-injection | no / B / "A generic Order API can accept external orders, but no third-party marketplace is connect" | upheld | The cited unicenta.com/api/ page is marketing copy ("Connecting uniCenta to infinite possibilities") and cannot establish an absence. Re-checked at endpoint level against the exported Insomnia collection the vendor publishes at docs.unicenta.com/insomnia.json, re-retrieved 2026-08-09 and byte-identical to the 2026-08-07 cache: three resources only, and POST /order's documented body has no channel, source or marketplace field. Integrations page still lists WooCommerce plus two unfilled 'Coming Soon' slots. Value unchanged; evidence moved off the overview and grade held at B rather than raised, because the marketplace absence leans partly on a first-party integrations page. source |
| guest-loyalty-unified-profile | partial / E / "One customer record in one database, and the Customer API syncs customers across installat" | upheld | The 'syncs customers across installations' phrasing was lifted from the /api/ marketing page, and grade E was wrong for a first-party vendor URL. Read the endpoint level instead: /customer is plain CRUD with a client-supplied UUID primary key and profile fields (emailAddress, telephone, mobile, card, searchKey, maxDebt, discount, vip); there is no merge, dedup or search-by-identifier operation anywhere in the collection. Partial with the named dedup shortfall is correct; evidence and grade corrected to B off the API export. source |
| guest-loyalty-data-export-portability | yes / B / "Customer API plus operator ownership of the underlying database means full self-serve export" | downgrade-to-partial | A differentiator yes was resting entirely on unicenta.com/api/, a marketing page, and its two supports fail differently. The API support fails on price: the Apply page, re-read 2026-08-09, gates API Access to BASE at GBP 72/yr and unlimited access to PLUS at GBP 144/yr, which contradicts the claim's "without a vendor fee" and matches this record's own extensibility-api-access-cost = no. The API also cannot satisfy the claim's scope - the collection's /customer resource carries profile fields only, with no transaction-history endpoint. The database support is real but partial: the operator does own the MySQL instance (configure page), yet the table reference documenting it is subscriber-gated and the GDPR page routes subject requests to a support contact. Free self-serve export exists in practice via the operator's own database; a fee-free vendor-provided export of guest list plus transaction history does not. source |
| reporting-webhooks | no / B / "The documented API surface is inbound only; no outbound webhooks, retries, or signatures des" | upheld | Value correct, reasoning wrong. The claim was cited to the /api/ marketing page and described the surface as inbound only, which the endpoint list disproves - four GETs and three /status probes are reads. Re-verified against the vendor's own exported collection: three resources, 14 requests, and zero event/subscription/callback operations, so there is genuinely nothing to sign or retry. This is a positive enumeration rather than absence-of-mention, because the export is the vendor's complete published API artifact, so no remains correct and the grade moves to A off the primary artifact instead of B off a brochure. source |
| multi-location-central-menu-publish | partial / E / "The Product API enables scripted central publishing, but there is no publish action with vers" | upheld | Grade E was wrong for a first-party page and the page itself (unicenta.com/api/) only advertises "Send products to uniCenta POS from other applications". Checking the detail: the product resource exists with a full field set, which supports the scripted-publishing half, but it is single-tenant - the collection's environments point at one base-url each (prod https://api.unicenta.io, local http://localhost:8080) and the only request parameter is `device`. So the overview under-describes the limitation rather than over-describing the capability. Partial upheld with the shortfall sharpened and grade corrected to B. source |
| multi-location-cross-location-loyalty | partial / B / "Customer API explicitly synchronizes customer data across multiple installations - data sync," | upheld | The word "explicitly" was doing work the source cannot support: unicenta.com/api/ is a brochure and the phrase is its headline, not a documented sync semantic. Verified the underlying mechanism instead in the published export - /customer CRUD keyed on a client-supplied UUID, no sync, balance or ledger endpoint - which reaches the same verdict by a defensible route. The distinction the researcher drew between replicated profile data and a single shared balance is correct and is now evidenced from the payload's own field list. source |
| extensibility-webhooks-push | no / B / "No outbound webhooks; all three documented endpoints push data into uniCenta." | upheld | Both halves of the note were checked. The second half is false - the collection enumerates 14 requests across customer, order and product including GET /customer, GET /order, GET /product and three /status probes, so the surface is bidirectional, not push-in-only. The first half survives independently: no event, subscription or callback resource appears anywhere in the vendor's complete published export, so there is no webhook product. Value upheld, note rewritten, grade moved from B off the marketing page to A off the API artifact. source |
| extensibility-order-injection-api | partial / B / "The Order API accepts orders from other applications and e-commerce systems; whether they fir" | upheld | Checked the summary against the detail in both directions, as the wave requires. The overview promises no more than the endpoint delivers - POST /order is genuinely there - and it actually carries a limitation the note had dropped: its Order API blurb scopes the surface to "uniCenta POS layaways". The published body has no table, order-type, modifier or print field and no status back, so the unverified half of the claim (fires to KDS/printers as a first-class ticket) is unverified for a concrete documented reason rather than merely unmentioned. Partial upheld, evidence moved to the API export, shortfall named more precisely. source |
| commercial-export-customer-and-loyalty | yes / B / "Customer records and account/store-card balances are rows in the operator's own database, plus" | upheld | A differentiator yes cited solely to a marketing page needed re-testing. The database half is sound and independently sourced from the configure guide's MySQL prerequisite, which is documentation rather than a sell page; the loyalty half is satisfied by the record's own store-card and on-account balances (Features list: Customer Store Card, On/Off Account Payments, Statement, Voucher management) living in those same tables. The API half was dropped from the reasoning because the Apply page gates API access behind BASE/PLUS subscriptions. Distinguished from guest-loyalty-data-export-portability, which fails on the fee-free and transaction-history conditions this claim does not impose. Yes upheld on corrected evidence. source |
| order-capture-seat-level | unknown / F - Seat-number tagging of order lines is not mentioned in any public vendor documentation." | resolve-to-no | upheld source |
| order-capture-scheduled-orders | unknown / F - Future-dated orders and lead-time-driven fire scheduling are not described publicly." | resolve-to-no | upheld source |
| menu-pricing-modifier-price-by-parent-size | unknown / F - No documentation of a modifier price matrix keyed to parent item and size." | upheld | upheld source |
| menu-pricing-size-style-matrix | unknown / F - Attribute sets generate variants, but a two-axis grid with per-cell price override is not documented | upheld | upheld source |
| menu-pricing-dayparting | unknown / F - Time-scheduled menu, item and price activation is not described in public documentation." | resolve-to-no | upheld source |
| menu-pricing-channel-price-books | unknown / F - Per-channel price books and percentage-markup rules are not documented." | resolve-to-no | upheld source |
| menu-pricing-allergen-nutrition | unknown / F - Allergen and nutrition attributes are not mentioned in the public feature catalog." | resolve-to-no | re-homed: onto the 5.4.0 WooCommerce connector doc; verdict now rests on the publication limb only, and the recipe-derivation leg is struck as circular source |
| menu-pricing-recipe-linkage | unknown / F - Stock depletes on sale, but recipe/BOM linkage to modifiers and theoretical food cost is not documen | upheld | upheld source |
| payments-emv-nfc | unknown / F - The quoted EMV/PCI language does not appear on the cited card-payments page (which claims only 'inte | resolve-to-partial | upheld source |
| payments-softpos-tap-to-pay | unknown / F - Tap to Pay on iPhone or Android tap-to-pay is not mentioned anywhere." | resolve-to-no | upheld source |
| payments-tip-adjust | unknown / F - Tip prompt, pre-auth-then-adjust flows and a batch adjust window are not documented." | resolve-to-no | upheld source |
| payments-offline-store-and-forward | unknown / F - No statement on offline card capture; the vendor publishes no offline documentation." | resolve-to-no | upheld source |
| payments-card-on-file | unknown / F - Tokenized card-on-file tied to a guest profile is not described." | resolve-to-no | upheld source |
| payments-p2pe-pci4 | unknown / F - Upheld, with an added caution for the write-up: uniCenta material claims a 'fully compliant and appr | upheld | upheld source |
| kitchen-bump-bar-hardware | unknown / F - The remote order display is described only as browser-based; bump-bar support and supported models a | upheld | overturned: no/B -> unknown/F; the cited peripheral list describes the POS terminal not the KDS, and the Hardware Installation Guide that would name supported models is login-walled source |
| kitchen-all-day-counts | unknown / F - An all-day aggregated quantity view is not described in public documentation." | upheld | upheld source |
| kitchen-sla-alerts | unknown / F - Target cook times, color escalation and audible alerts are not documented." | upheld | upheld source |
| kitchen-printer-fallback | unknown / F - Automatic failover to a backup printer or screen is not documented." | resolve-to-no | downgraded: A -> B and re-homed off insomnia.json onto the vendor printer enumeration; value no upheld source |
| kitchen-recall-refire | unknown / F - Recall/unbump and per-item refire are not documented for the remote order display." | upheld | upheld source |
| delivery-injection-error-visibility | unknown / F - CORRECTED 2026-09-01: the verdict stands, its stated reason did not. This rationale previously read | upheld | overturned: no/B -> unknown/F; a 2,015-char setup quickstart never takes up error handling, and the developer guides that would are subscriber-gated source |
| guest-loyalty-offline-behavior | unknown / F - No loyalty engine and no published offline behavior documentation of any kind." | resolve-to-no | upheld source |
| labor-offline-time-punch | unknown / F - No offline behavior documentation of any kind is published." | upheld | overturned: no/B -> unknown/F; the MySQL requirement is not a connectivity requirement and cannot serve as a vendor denial of offline operation source |
| labor-manager-override-audit | unknown / F - Whether overrides are attributed to the approving manager in an immutable queryable trail is not doc | upheld | overturned: no/B -> unknown/F; an override PIN is a permission gate not the audit record, and the guides that would show the record are gated source |
| inventory-recipe-bom-costing | unknown / F - Stock and product cost fields exist, but multi-level recipes with sub-recipes and automatic plate-co | upheld | overturned: no/A -> unknown/F; contradicts menu-pricing-recipe-linkage on the same gated guide, and an Insomnia example body is not a schema source |
| inventory-unit-conversion-yields | unknown / F - Purchase/recipe/count unit conversion factors and yield or waste percentages are not documented." | upheld | overturned: no/A -> unknown/F; a uom foreign key in an example body is not a schema, the schema guide is gated, and UOM is a new-in-v5 feature source |
| inventory-menu-margin-linkage | unknown / F - Product cost fields and sales reports exist, but a contribution-margin-per-item report with threshol | upheld | overturned: no/A -> unknown/F; the Reports Matrix Guide is gated and the Web Reports list is v4-exclusive, deprecated in v5 and self-disclaims with more to come source |
| reporting-comps-voids-audit | unknown / F - No comps/voids/override audit report is named among the six report categories, but 50+ reports ship | upheld | overturned: partial/B -> unknown/F; the Reports Matrix Guide is gated and neither public report list enumerates a 50-report product source |
| multi-location-price-zones | unknown / F - Whether one item carries different prices per location group, channel and daypart without duplicatio | upheld | overturned: no/A -> unknown/F; grade A off an Insomnia example body, on the exact cell whose deciding document is the login-walled Database Schema Matrix Guide source |
| multi-location-cross-location-giftcard | unknown / F - Customer store card exists, but cross-location redemption, liability reporting and inter-store settl | resolve-to-no | re-homed: onto the v5 delta page; the Web Reporting enumeration leg is struck as v4-exclusive, deprecated and self-disclaiming source |
| hardware-p2pe-terminal | unknown / F - EMV/PCI compliance is claimed, but no PTS device is named, no P2PE validation cited, and no merchant | resolve-to-partial | upheld source |
| hardware-byod | unknown / F - HOSTED allows browser access from iPads and Android tablets over HTTPS, but no BYOD permission or se | resolve-to-no | upheld source |
| extensibility-oauth-partner-apps | unknown / F - The public API page does not describe an authentication mechanism; detailed developer docs are subsc | resolve-to-no | upheld source |
| reliability-offline-card-auth | unknown / F - No store-and-forward behavior is documented for the vendor's integrated card payments." | upheld | upheld source |
| reliability-printer-fallback | unknown / F - Automatic failover to a backup printer or KDS station with staff alerting is not documented." | resolve-to-no | upheld source |
| reliability-sync-conflict-handling | unknown / F - A single shared database avoids most partition conflicts, but the Customer API's cross-installation | upheld | overturned: no/A -> unknown/F; missing conditional headers in hand-typed example requests are not evidence, and the developer documentation is subscriber-gated source |
| reliability-public-status-page | unknown / F - No status page is linked from the vendor site; a dedicated status subdomain was not directly verifie | resolve-to-no | upheld source |
| reliability-pci-dss-4-attestation | unknown / F - EMV/PCI compliance is claimed for UK/EU/USA card payments, but no AoC, PCI DSS version, or P2PE list | resolve-to-no | upheld source |
| commercial-autorenew-terms-published | unknown / F - No terms-and-conditions or MSA page was reachable; auto-renewal terms and any cancellation notice wi | resolve-to-yes | upheld source |
| commercial-rate-increase-clause | unknown / F - No processing agreement or terms document is publicly accessible, so rate-increase protections canno | resolve-to-partial | upheld source |
| commercial-data-ownership-clause | unknown / F - No terms-and-conditions page was reachable, so no published data-ownership or vendor-use-restriction | resolve-to-yes | upheld source |
| commercial-pci-p2pe-tokenization | unknown / F - No P2PE validation, tokenization architecture, or merchant SAQ type is named; only a general EMV/PCI | resolve-to-partial | upheld source |
| delivery-driver-roster | no / F - No driver entity, assignment state, or run history in the documented feature set." | downgrade-to-no | cited: upheld - the EMPLOYEE enumeration is closed and contains no driver role, and "driver" is proven to be a hardware word on this site. source |
| delivery-dispatch-board | no / F - No dispatch or expo screen for delivery documented." | downgrade-to-no | cited: upheld - the shipped order-routing surface is a kitchen/remote display, and "dispatch" is a corpus-wide zero. source |
| delivery-route-map | no / F - No mapping or route sequencing capability documented." | downgrade-to-no | cited: upheld - every map/route spelling is zero or a false friend ("router", "Time Zone"). source |
| delivery-driver-tracking | no / F - No driver mobile app exists, so no GPS capture." | downgrade-to-no | upheld: value stands but the standing premise "no driver mobile app exists" is wrong - a browser-delivered mobile POS exists; what is absent is a driver role and any GPS capture. source |
| delivery-zones-polygon | no / F - No delivery zone modeling of any kind documented." | downgrade-to-no | cited: upheld - "zone" is a corpus-wide zero once "Time Zone" is excluded, and the customer record enumeration has no served-area field. source |
| delivery-zone-pricing | no / F - No per-zone fee, order minimum, or promise time documented." | downgrade-to-no | cited: upheld, rationale sharpened - a fixed Service Charge IS documented; what is absent is any per-zone fee, minimum or promise time. source |
| delivery-address-validation | no / F - No geocoding or address validation at order time documented." | downgrade-to-no | cited: upheld - the address is a plain contact field in both the v4 census and the v5 delta. source |
| delivery-driver-comp | no / F - No mileage or per-delivery reimbursement tracking documented." | downgrade-to-no | cited: upheld and strengthened - the tip control returns zero corpus-wide, so two of the rubric’s three inputs are absent from the product entirely. source |
| delivery-cash-reconcile | no / F - Close Cash reconciles a drawer, not a driver bank; no per-driver settle-up flow documented." | downgrade-to-no | cited: upheld verbatim - Close Cash is a drawer session in both generations and no per-driver bank or settle-up exists. source |
| delivery-daas-dispatch | no / F - No DoorDash Drive, Uber Direct, Nash, or Relay integration documented." | downgrade-to-no | cited: upheld - one-partner floor plus a zero for every DaaS name. source |
| delivery-daas-fallback | no / F - No hybrid dispatch rules; no DaaS connection exists to overflow to." | downgrade-to-no | cited: upheld - both sides of the hybrid rule (in-house driver, DaaS courier) are independently absent. source |
| delivery-86-sync | no / F - No third-party channels exist to sync item availability to." | downgrade-to-no | upheld: value stands but the rationale is overturned - a third-party channel does exist (WooCommerce); what is absent is any availability object in its closed three-object sync, which in fact pulls products INTO uniCenta. source |
| delivery-store-pause | no / F - No marketplace store-pause capability." | downgrade-to-no | upheld: value stands, rationale corrected - the marketplace-pause control is absent from a documented and fully enumerated channel configuration screen, not absent for want of a channel. source |
| delivery-3p-reconciliation | no / F - No marketplace payout reconciliation report documented." | downgrade-to-no | upheld: the report list is a closed vendor enumeration and the corpus-wide zero for every named marketplace carries the channel side; /integrations/ is cited only as a floor. source |
| delivery-tracking-page | no / F - No branded guest tracking page or SMS link documented." | downgrade-to-no | cited: upheld, rationale sharpened - a branded guest-facing digital receipt exists; a branded order-status or driver-tracking page does not, and the SMS control is a genuine zero. source |
| delivery-promise-time | no / F - No dynamic promise-time engine documented." | downgrade-to-no | cited: upheld a fortiori - not merely the dynamic engine but any quoted promise time is absent from both generations. source |
| delivery-offline-behavior | no / F - The vendor publishes no offline documentation for delivery; there is no delivery module to document. | downgrade-to-no | cited: upheld - a documentation-existence claim falsified by a two-spelling zero over the publisher’s own manifest, with both apparent hits shown to be about support services. source |
| digital-native-app | no / F - No branded consumer iOS/Android app; tablet use is back-office browser access." | downgrade-to-no | upheld: value stands, rationale overturned - the iOS/Android product is the full POS in a browser, not "back-office browser access", and it is merchant-facing rather than a branded consumer app. source |
| digital-account-saved-payment | no / F - Guest accounts with saved addresses and tokenized cards would live in WooCommerce, not the vendor's | downgrade-to-no | cited: upheld - a genuinely closed three-object sync with no payment-instrument or reorder object, and a tokenisation control at zero. source |
| digital-upsell-engine | no / F - No digital upsell engine or attach-rate reporting documented." | downgrade-to-no | cited: upheld - the recommend control is a pure false friend and the SALES enumeration has no suggestion surface. source |
| digital-scheduled-pacing | no / F - No slot capacity limits or daypart throttling documented." | downgrade-to-no | cited: upheld - the vendor’s own ingest specification is complete and terminates in a layaway with no pacing construct. source |
| digital-kiosk | no / F - No self-order kiosk product." | downgrade-to-no | cited: upheld - the mode enumeration is closed and the one self-service sighting is a third-party lottery game on a merchant’s own till. source |
| digital-group-ordering | no / F - No group ordering link or spend caps documented." | downgrade-to-no | cited: upheld - the v5 delta moves toward ticket lock-out, the inverse of shared-link group ordering. source |
| digital-catering-portal | no / F - No catering ordering flow documented." | downgrade-to-no | cited: upheld - a two-spelling zero plus a vertical list that names twenty-odd trades and not this one. source |
| digital-voice-ai-phone | no / F - No AI phone ordering product and no named certified partner." | downgrade-to-no | upheld: zero on the vendor’s own vocabulary with the partner page as a corroborating floor, and the only "speech" hit is a GNU quotation. source |
| digital-drivethru-ai | no / F - No drive-thru capability at all." | downgrade-to-no | cited: upheld - no lane exists in the mode enumeration and both voice spellings are corpus-wide zeros. source |
| digital-sms-ordering | no / F - No conversational SMS or chat ordering documented." | downgrade-to-no | cited: upheld - the only apparent SMS hit is the letters inside "mechanisms", so the zero is real and the partner list is closed. source |
| digital-google-order | no / F - No Order with Google provisioning documented." | downgrade-to-no | cited: upheld - a name zero bounded by the named-vendor zero, with two corroborating floors rather than by silence alone. source |
| digital-apple-business-connect | no / F - No Apple Business Connect ordering placement documented." | downgrade-to-no | cited: upheld - Apple appears only as an OS/device on this site, and the placement would need a partner slot that does not exist. source |
| digital-loyalty-attach | no / F - No loyalty engine exists to attach to a digital flow." | downgrade-to-no | upheld: value stands but the rationale is overturned - Store Card, VIP, default discount and one-time vouchers exist; what is missing is any accrual or redemption object in the closed three-object channel sync. source |
| digital-subscriptions | no / F - No guest subscription or membership program documented." | downgrade-to-no | cited: upheld and upgraded from bare inference to a vendor statement placing recurring memberships in the unbuilt-futures list. source |
| digital-promo-parity | no / F - Customer discount % exists in the POS, but no shared promo definition across POS and digital channel | downgrade-to-no | upheld: value stands, rationale corrected - vouchers/coupons exist too; parity fails because the closed sync shares customers, not promotion definitions. source |
| digital-checkout-pci-sca | no / F - No vendor-hosted digital checkout exists; PCI DSS 4.0 script-integrity posture is not published." | downgrade-to-no | cited: upheld at grade B on an explicit vendor deprecation of card gateways plus a zero for 3DS, hosted fields and PCI DSS 4.0. source |
| digital-surcharge-transparency | no / F - No surcharge or service-fee configuration in POS or digital channels documented." | downgrade-to-no | upheld: value stands, rationale overturned - a Service Charge is documented and shipped in v5; what fails is channel parity, disclosure and jurisdiction handling. source |
| guest-loyalty-thirdparty-identity-attach | no / F - No marketplace integrations exist, so no third-party identity to attach." | downgrade-to-no | cited: two-spelling corpus zero for every named marketplace, with the partner page as a corroborating floor for every named marketplace source |
| guest-loyalty-tiers | no / F - A static VIP flag exists; no automatic promotion or demotion on rolling-window spend." | downgrade-to-no | upheld: the standing "static VIP flag" reading is exactly what the vendor and its own API example say, now citable source |
| guest-loyalty-offer-stacking-rules | no / F - No offer engine with stacking or precedence configuration documented." | downgrade-to-no | cited: two-generation discount enumeration plus a zero over four stacking spellings source |
| guest-loyalty-targeted-offers | no / F - No audience-rule offer issuance documented." | downgrade-to-no | cited: closed v4 customer-module enumeration with its v5 delta, plus two corpus zeros source |
| guest-loyalty-rfm-segmentation | no / F - No automatic lifecycle segmentation; customer reports are transactional." | downgrade-to-unknown | demoted-to-unknown: the deciding enumeration is behind the login wall and a login wall is not a deletion |
| guest-loyalty-lifecycle-automation | no / F - No triggered birthday, first-visit, or win-back campaigns documented." | downgrade-to-no | re-homed: cited to the extension enumeration when the subject is built-in customer marketing; re-founded on the two-generation customer-module enumeration plus three zeros, value unchanged. source |
| guest-loyalty-consent-management | no / F - No per-channel consent capture with timestamp and source documented." | downgrade-to-unknown | demoted-to-unknown: the only non-zero consent hits are the vendor marketing to itself, and the customer-record field list is gated |
| guest-loyalty-10dlc-registration | no / F - No SMS sending capability, therefore no A2P 10DLC handling or documentation." | downgrade-to-no | cited: two-spelling zero for the sending channel, with the partner page as a corroborating floor for the sending channel the rubric presupposes source |
| guest-loyalty-campaign-attribution | no / F - No campaign construct exists to attribute redemptions against." | downgrade-to-no | cited: no campaign construct exists corpus-wide, so the absence is bounded above the gated report enumeration source |
| guest-loyalty-review-capture-routing | no / F - No feedback capture or score-based routing documented." | downgrade-to-no | cited: corpus zero, with the partner page as a corroborating floor; the single survey hit is the vendor surveying its own subscribers source |
| guest-loyalty-referral-program | no / F - No referral codes, attribution, or two-sided rewards documented." | downgrade-to-no | cited: closed two-generation customer-record enumeration plus two zeros over the referral vocabulary source |
| guest-loyalty-wallet-pass | no / F - No Apple Wallet or Google Wallet pass issuance documented." | downgrade-to-no | cited: the vendor enumerates a printed Store Card as its card mechanic and never names a wallet pass source |
| guest-loyalty-privacy-rights-tooling | no / F - No in-app DSAR tooling; operators would service requests with direct SQL against their own database. | downgrade-to-no | cited: an explicit vendor statement that SAR fulfilment is contact-us assistance - but the standing rationale's "direct SQL against their own database" clause is unsourced invention and is dropped source |
| guest-loyalty-redemption-fraud-controls | no / F - No loyalty redemption exists; no velocity limits or self-redemption flagging documented." | downgrade-to-no | cited: the v5 fraud/permission delta is enumerated and contains no loyalty redemption to control source |
| guest-loyalty-ai-offer-recommendation | no / F - No AI or ML features of any kind are claimed by the vendor." | downgrade-to-no | cited: zero across the complete v5 release-note series and even the vendor's own roadmap section source |
| labor-photo-punch-verification | no / F - No photo capture or facial verification at punch documented." | downgrade-to-unknown | demoted-to-unknown: the standing no reads an ambiguous "Photo Image" list item against a form documented only behind the login wall |
| labor-native-scheduling | no / F - No shift scheduling module in the feature catalog." | downgrade-to-no | cited: the employee module is enumerated in both generations and every scheduling-word hit is release-management prose source |
| labor-demand-labor-forecast | no / F - No recommended staffing levels or labor forecasting documented." | downgrade-to-no | cited: a corpus-wide zero for forecast plus the enumerated report and employee modules source |
| labor-realtime-labor-percent | no / F - No real-time labor-as-percent-of-sales view documented." | downgrade-to-no | cited: the only real-time manager surface is enumerated, contains no labor metric, and was deprecated in v5 source |
| labor-overtime-prevention | no / F - No overtime thresholds or clock-in warnings documented." | downgrade-to-no | cited: zero for overtime across the complete release-note series, not only the feature list source |
| labor-break-compliance-by-state | no / F - No jurisdictional break rules; UK-origin product with no US labor compliance features documented." | downgrade-to-unknown | demoted-to-unknown: the vendor does ship a Breaks and Leave function and only a gated guide says what it does |
| labor-minor-labor-rules | no / F - No minor-labor restriction enforcement documented." | downgrade-to-no | cited: the scheduling conjunct the rubric requires is itself bounded absent, so the pair cannot be satisfied source |
| labor-tip-pooling-rules | no / F - No automatic tip pooling or tip-out computation documented." | downgrade-to-no | cited: the vendor's only shipped service-charge mechanism is enumerated and is a product line, not a pool source |
| labor-tip-distribution-audit-trail | no / F - No per-shift tip contribution and distribution record documented." | downgrade-to-no | cited: the charge is modelled as a product line with no employee dimension, and tips are a corpus-wide zero source |
| labor-qualified-tips-w2-reporting | no / F - No payroll export exists; no W-2 Box 12 TP or Box 14b support documented." | downgrade-to-no | cited: three independent zeros - no tip capture, no payroll export, no US tax vocabulary anywhere source |
| labor-native-payroll | no / F - No first-party payroll product." | downgrade-to-no | cited: absent from the shipped posApps list, from the published roadmap and from the partner page alike, with /payroll/ at a corpus-wide zero. source |
| labor-shift-swap-workflow | no / F - No employee self-service app or swap approval workflow documented." | downgrade-to-no | cited: no employee self-service client exists in either generation and the shift object is a corpus-wide zero source |
| multi-location-multi-brand | no / F - No multi-brand or virtual-brand operation on one terminal documented." | downgrade-to-no | cited: the multi-site axis is enumerated in both generations and is location/warehouse-scoped, never brand-scoped source |
| multi-location-central-labor-policy | no / F - No labor rule engine exists at any scope, so nothing to configure centrally." | downgrade-to-unknown | demoted-to-unknown: the row’s own note conceded that a gated guide bears on one limb, which under R1 forces unknown - and the sibling cell resting on the same guide was demoted while this one was not. |
| commercial-pci-dss-4-controls | no / F - No PCI DSS v4.0.1 documentation of any kind is published — no MFA-for-CDE statement and no payment-p | downgrade-to-no | cited: the vendor addresses PCI repeatedly and its newest position is PA-DSS-era deprecation, with v4.0.1 vocabulary at zero source |
| commercial-privacy-dsar-tooling | no / F - No in-app DSAR tooling and no published DPA; operators would service requests with direct SQL agains | downgrade-to-no | cited: an explicit vendor statement that SAR help is manual, plus a sub-processor list standing in for the absent DPA - the standing rationale's "direct SQL" clause was unsourced and is dropped source |
| commercial-wcag-kiosk-accessibility | no / F - No kiosk product, no consumer web-ordering surface, and no VPAT or ACR published." | downgrade-to-no | cited: the mode list is enumerated and contains no self-order surface, with kiosk and VPAT both at zero source |
| commercial-dual-pricing-compliant | no / F - No dual pricing, cash discount, or surcharging engine, and therefore no debit/prepaid exclusion or d | downgrade-to-no | cited: the one shipped fee mechanism is enumerated and is applied pre-tender as a product line, so card-type exclusion is impossible source |
| order-capture-coursing-hold-fire | no / F - Coursing, hold and fire-next-course appear nowhere in the vendor's enumerated hospitality feature se | downgrade-to-no | cited: upheld, now bounded by the v4 SALES enumeration plus the v5 hospitality delta, with zero real hits across the vendor's own vocabulary source |
| order-capture-bar-tab-preauth | no / F - No pre-authorization, incremental re-auth, or stale-tab auto-close documented." | downgrade-to-no | cited: value upheld but the standing rationale is wrong on its face - bar tabs ARE documented, as layaways; only the pre-auth, re-auth and stale-tab close are absent source |
| order-capture-qr-same-check | no / F - No guest QR ordering; WooCommerce 'table ordering' creates a separate injected order, not a write to | downgrade-to-no | re-homed: the deciding language is /api/’s layaway landing plus a QR-ordering zero, not a partner list that does not cover the subject; value unchanged. source |
| order-capture-kiosk-first-party | no / F - No kiosk product and no accessibility conformance documentation." | downgrade-to-no | cited: upheld and bounded by the FAQ device and peripheral enumerations plus a corpus-wide zero for kiosk and for accessibility conformance source |
| order-capture-drive-thru | no / F - No drive-thru order flow documented." | downgrade-to-no | cited: upheld, bounded by the v4 mode enumeration and the v5 hospitality delta source |
| order-capture-drive-thru-timers | no / F - No speed-of-service timing capability documented." | downgrade-to-no | cited: upheld; the one unexpected timer in the corpus is a table-plan button timer and does not reach the rubric source |
| order-capture-voice-ai | no / F - No voice AI product and no partner program; no voice partner is named." | downgrade-to-no | cited: value upheld, but the row’s own reported control was wrong - /\bvoice\b/ is 0, not 3; the 3 belongs to the unbounded spelling and every hit is inside "invoice". source |
| order-capture-throttling | no / F - No per-channel capacity limits or automatic quote-time extension documented." | downgrade-to-no | cited: upheld and bounded by the closed settings enumeration of the only digital channel the vendor ships source |
| order-capture-catering | no / F - No catering flow, quotes, deposits, or balance-due tracking documented." | downgrade-to-no | cited: value upheld on the conjunctive rubric, but the standing rationale is wrong that deposits and balance tracking are undocumented - prepay/deposit on account is in the changelog and Credit Limit plus Statement cover the balance; only the catering flow and event schedule are genuinely absent source |
| order-capture-order-ready-signal | no / F - No marketplace integrations exist, so no order-ready signal can be pushed." | downgrade-to-no | cited: upheld, bounded by the named-service zero, with the partner page as a corroborating floor plus a corpus-wide zero for every named marketplace source |
| kitchen-expo-consolidation | no / F - No expo screen or multi-station completion logic documented." | downgrade-to-unknown | demoted-to-unknown: a kitchen display product is documented, so the scored no rested on a false premise, and the only document that could settle the expo behaviour is login-walled |
| kitchen-course-firing | no / F - No course assignment, hold, or on-demand fire documented." | downgrade-to-no | cited: upheld, bounded on the POS side by the v4 ticket enumeration and the v5 hospitality delta source |
| kitchen-prep-time-pacing | no / F - No per-item cook times or staggered start logic documented." | downgrade-to-unknown | demoted-to-unknown: both halves of the rubric sit behind the members-only login wall (a floor, not a closed set) and a self-disclaiming v4 configuration page, which R1 and R2 bar from carrying an absence |
| kitchen-order-throttling | no / F - No load-based pacing; there is no digital order channel to pace." | downgrade-to-no | cited: value upheld but the standing rationale is wrong - a digital order channel DOES exist (WooCommerce, 5.4.0); it simply carries no pacing control in its documented settings source |
| kitchen-channel-pause-propagation | no / F - No marketplace connections exist to propagate a pause or availability change to." | downgrade-to-no | cited: upheld, bounded by the named-service zero, with the partner page as a corroborating floor and the inbound-only direction of the one integration source |
| kitchen-order-ready-callback | no / F - No marketplace status callback exists." | downgrade-to-no | cited: upheld, bounded by the named-service zero, with the partner page as a corroborating floor and the inbound-only integration direction source |
| kitchen-item-build-screens | no / F - No recipe-step or build-detail station display documented." | downgrade-to-unknown | demoted-to-unknown: a kitchen display is documented and its per-line rendering is settled only by login-walled guides, so R1 bars the no |
| kitchen-pizza-fractional-display | no / F - There is no fractional placement in the menu engine, so nothing to render." | downgrade-to-unknown | demoted-to-unknown: the verdict rested on an inference about a modifier engine whose only documentation sits behind the members-only login wall (a floor, not a closed set) |
| kitchen-order-modification-alerts | no / F - No live-ticket change highlighting documented." | downgrade-to-unknown | demoted-to-unknown: the display exists and its live-ticket behaviour lives only in a login-walled README, so the scored no was an inference off a wall |
| kitchen-guest-ready-notification | no / F - No SMS, push, or order-status board product documented." | downgrade-to-no | cited: upheld and bounded by the v4 customer enumeration plus the v5 NEW list, in which the only guest-facing message product is the digital receipt source |
| kitchen-waste-logging | no / F - Back-office stock adjustments exist, but no KDS-side reason-coded waste or remake logging is documen | downgrade-to-no | downgraded: B -> C. /features/differences/ is a first-party document, but it bounds CHANGE and not capability, and this row rests on a vocabulary silence rather than on a vendor denial or a closed capability enumeration; the value stands and the reading of "Stock Maintenance" under BOTH the NEW and the DEPRECATED columns is correct. source |
| kitchen-prep-forecasting | no / F - No forecast-driven prep list documented." | downgrade-to-no | cited: upheld and bounded by a closed report-family enumeration in both generations source |
| hardware-handheld-battery-swap | no / F - No vendor handheld exists, so no battery specification." | downgrade-to-no | cited: upheld and bounded by the FAQ bring-your-own device enumeration plus the v5 hosted-plan device list source |
| hardware-handheld-lte | no / F - No vendor handheld or connectivity failover product exists." | downgrade-to-no | cited: upheld and bounded by the bring-your-own device enumeration and the Wi-Fi-only connectivity guidance source |
| hardware-kiosk | no / F - No kiosk product in either form factor and no ADA documentation." | downgrade-to-no | cited: upheld and bounded by the closed FAQ peripheral enumeration plus a v5 hardware delta that is scales-only source |
| hardware-drive-thru | no / F - No menu boards, confirmation displays, headsets, or timers documented." | downgrade-to-no | cited: upheld and bounded by the closed peripheral enumeration; the one timer in the corpus is a table-plan timer, not a lane timer source |
| hardware-tap-to-phone | no / F - No Tap to Pay on iPhone or Android tap-to-phone acceptance documented." | downgrade-to-no | cited: upheld and bounded by the vendor's own card-machine offer plus the v5 deprecation of in-app gateways source |
| hardware-remote-device-management | no / F - No fleet console, remote reboot, version visibility, or staged update rollout documented." | downgrade-to-no | cited: upheld and bounded by the v4 SYSTEM enumeration plus a v5 delta whose only monitoring item is a local JVM RAM widget source |
| hardware-selfpour-scales | no / F - Weighing scales are supported for by-weight items; no tap wall, flow meter, or pour spout integratio | downgrade-to-no | upheld: scales are a closed four-protocol serial list in v4 and a two-item delta in v5, with zero beverage-dispense vocabulary anywhere on the site source |
| hardware-callerid-integration | no / F - No caller ID hardware or telephony screen-pop integration documented." | downgrade-to-no | cited: upheld and bounded by the closed peripheral enumeration; the single screen-pop hit is a weighing-scale dialogue source |
| extensibility-webhook-reliability | no / F - No webhooks exist, so no signing, retry, or replayable event log." | downgrade-to-no | cited: value upheld on the conjunctive rubric but the standing rationale is flatly wrong - webhooks exist and a shared secret is documented; what is missing is any outbound webhook, any signing scheme of uniCenta's own, and any retry or replay language source |
| extensibility-middleware-compatibility | no / F - The vendor names no middleware partner, and uniCenta is not listed as an endpoint in any Deliverect/ | downgrade-to-no | cited: upheld on the vendor side and bounded by the named-vendor zero, with two corroborating floors, with the note now stating what the zero does and does not cover source |
| extensibility-headless-embedded | no / F - No headless mode; the Order API is a data-insertion path, not a transaction engine a third-party UI | downgrade-to-unknown | demoted-to-unknown: the no was an argument from a scratch API collection's missing endpoints, which R4 bars, and the deciding developer guides sit behind the login wall |
| menu-pricing-fractional-placement | no / F - No halves or quarters placement anywhere in the feature catalog." | downgrade-to-unknown | demoted-to-unknown: the modifier-pricing semantics live only in the login-walled v4 Product Attributes/Auxiliaries guides, so the scored no was read off a login wall |
| menu-pricing-half-and-half-rule | no / F - No half-and-half pricing rule of any kind documented." | downgrade-to-unknown | demoted-to-unknown: nothing uniCenta publishes takes up attribute pricing rules at all, so the standing no was unbounded rather than wrong |
| menu-pricing-topping-quantity-tiers | no / F - No light/regular/extra/double multipliers documented." | downgrade-to-unknown | demoted-to-unknown: the deciding document is one member of the members-only login-walled guide set (a floor, not a closed set) and a login wall is not a deletion |
| menu-pricing-included-allowance | no / F - No included-modifier allowance or overage charging documented." | downgrade-to-unknown | demoted-to-unknown: the vendor own changelog defers to a login-walled guide for the bundle pricing model |
| menu-pricing-upsell-prompts | no / F - No suggestive-sell prompts or attach-rate reporting documented." | downgrade-to-no | cited: upheld and bounded on the v4 SALES enumeration plus the 2023 v5 delta, grade F -> C source |
| menu-pricing-86-propagation | no / F - No online ordering, kiosk, or marketplace channels exist to propagate an 86 to." | downgrade-to-no | upheld: value stands, but the row is re-founded on the corpus-wide zero for the 86 concept rather than on a partner page that is a floor, and the standing rationale’s "no channel, no KDS" premise is corrected. source |
| menu-pricing-dual-pricing | no / F - No dual pricing or cash-discount capability documented." | downgrade-to-no | cited: upheld with a v4 settings reference plus the closed v5 release-note sequence, grade F -> C source |
| menu-pricing-dynamic-pricing | no / F - No rule-based dynamic pricing documented." | downgrade-to-no | cited: upheld - the vendor own word "dynamic" attaches to a manual line-edit permission, grade F -> C source |
| payments-dual-pricing | no / F - No two-price-per-item storage or dual cash/card receipt totals documented." | downgrade-to-no | cited: upheld, and the one near-miss (the Take Out tax script) is named so the zero is not naive, grade F -> C source |
| payments-surcharge-guardrails | no / F - No surcharging engine, BIN-based debit exclusion, or network cap enforcement documented." | downgrade-to-no | cited: upheld because the vendor states it removed the gateways entirely, grade F -> C source |
| payments-qr-guest-pay | no / F - Digital receipts exist, but no scan-to-pay flow that closes the check is documented." | downgrade-to-no | cited: upheld at grade B - the only QR feature in the product is a fiscal invoice QR, named and quoted source |
| payments-tip-pooling | no / F - No tip pooling or distribution rules exist anywhere in the product." | downgrade-to-no | cited: upheld and now bounded - the standing "does not exist anywhere in the product" was an unbounded claim; the tip noun is absent corpus-wide and the service charge is the substitute, grade F -> C source |
| payments-offline-decline-liability | no / F - Nothing published on offline decline liability or a failed-offline-payment report." | downgrade-to-no | cited: upheld at grade B - the vendor publishes a blanket liability cap and no payment-decline allocation, and there is no store-and-forward layer to allocate source |
| payments-chargeback-tooling | no / F - No dispute or chargeback dashboard documented." | downgrade-to-no | cited: upheld - the single corpus hit for "dispute" is an account-ownership clause, so the zero is real, grade F -> C source |
| inventory-theoretical-vs-actual | no / F - No theoretical-versus-actual usage variance report in the documented inventory report set." | downgrade-to-no | cited: upheld on the missing recipe substrate rather than on the report list, so the gated Reports Matrix guide cannot overturn it, grade F -> C source |
| inventory-86-auto-sync | no / F - No automatic 86 on ingredient depletion, and no online or third-party channels to sync to." | downgrade-to-no | cited: upheld at grade B; the standing rationale missed that a v5 Stock level notification and a WooCommerce channel both exist - the bound is direction of sync and the absent 86 action source |
| inventory-mobile-count-offline | no / F - No dedicated mobile counting app; counting happens in the desktop back office." | downgrade-to-no | cited: upheld - the vendor two published mobile access routes, RDP and browser, are both network-required, grade F -> C source |
| inventory-invoice-ocr | no / F - No supplier invoice capture or OCR line extraction documented." | downgrade-to-no | cited: upheld - the vendor goods-in verb is "Record deliveries" and the vocabulary zero is complete, grade F -> C source |
| inventory-price-change-alerts | no / F - No per-item purchase price history alerting documented." | downgrade-to-no | cited: upheld - the one notification uniCenta ships is quantity-based and is named here so the zero is not naive, grade F -> C source |
| inventory-shelf-life-expiry | no / F - No expiry or use-by date tracking documented." | downgrade-to-no | cited: upheld and the two expir hits are shown to be subscription language, grade F -> C source |
| reporting-labor-productivity | no / F - No clocked-hours labor data feeds reporting; sales per labor hour and labor % are absent from docume | downgrade-to-unknown | demoted-to-unknown: clocked-hours data demonstrably exists and the only enumeration of the report set is one member of the members-only login-walled guide set (a floor, not a closed set) |
| reporting-channel-profitability | no / F - No fulfillment-channel dimension exists and no marketplace commissions to net out." | downgrade-to-no | cited: upheld - no marketplace exists corpus-wide and the only off-premise construct is a tax script, grade F -> C source |
| reporting-scheduled-delivery | no / F - No scheduled recurring report emailing or delivery documented." | downgrade-to-no | cited: upheld - report output in v5 is print or xls, and the two v5 report issue keys are both output bugs, grade F -> C source |
| reporting-anomaly-alerts | no / F - No threshold or deviation alerting documented." | downgrade-to-no | cited: upheld with the one real notification named and characterised, grade F -> C source |
| reporting-nl-query | no / F - No natural-language or AI query assistant; the vendor claims no AI features." | downgrade-to-no | cited: upheld but the standing rationale asserted a vendor denial that does not exist, grade F -> C source |
| reporting-guest-cohorts | no / F - Customer reports exist, but new-versus-returning, frequency and lifetime-spend cohorts are not docum | downgrade-to-unknown | demoted-to-unknown: customer transaction history exists and the only report enumeration is login-walled, so the negative rested on a wall plus a deprecated v4 page |
| reporting-sales-forecast | no / F - No forward sales forecast at any granularity documented." | downgrade-to-no | cited: upheld - the vendor own analytics pack is a closed list of historical SQL aggregations, grade F -> C source |
| reporting-tip-tax-compliance | no / F - No declared-versus-charged tip reporting, pool distribution detail, or tax liability summary documen | downgrade-to-no | cited: upheld on the absent tip substrate rather than on the report list, grade F -> C source |
| reliability-offline-decline-liability | no / F - Nothing is published on offline decline liability or offline caps; this criterion is about publicati | downgrade-to-no | cited: upheld at grade B; a publication criterion is exactly the kind an absence can settle, and the vendor legal set is the correct bound source |
| reliability-offline-feature-matrix | no / F - No offline feature matrix is published anywhere — no statement on gift cards, card auth, or refunds | downgrade-to-no | cited: upheld on a closed documentation index rather than a bare zero, grade F -> C source |
| reliability-onsite-install | no / F - No first-party or certified dealer on-site installation program is documented; the model is self-ins | upgrade-to-partial | overturned: the vendor publishes a dedicated On-site Support paragraph confirming it attends customer sites on request, so a scored no was false source |
| reliability-menu-build-service | no / F - No onboarding menu-build service documented at any tier." | downgrade-to-no | cited: upheld against the vendor own closed tier enumeration and its self-service setup path, grade F -> C source |
| reliability-failover-terminal-role | no / F - No automatic master-role failover; the database server is a single point of failure the operator mus | downgrade-to-no | cited: upheld - the vendor names the second-database feature and gives three purposes, none of them failover, grade F -> C source |
| reliability-cellular-backup | no / F - No cellular failover product; the vendor supplies no networking hardware." | downgrade-to-no | cited: upheld, and the apparent cellular hits are shown to be an artefact of the reader own regex rather than evidence, grade F -> C source |
| menu-pricing-recipe-linkage | unknown, grade F | resolve-to-partial | Re-read raw DataLogicSales.java L1821-1840 and adjustStock L2274-2287: a sale writes an OUT_SALE stock-diary row per products_bundle component at line qty x component qty, recursively. Bundle linkage and depletion are met; modifier linkage and item-level theoretical food cost are not (the component row is priced at getPriceSell(), not cost). source |
| reporting-comps-voids-audit | unknown, grade F | resolve-to-partial | Re-read raw JPanelTicket.java L832-840 (execLineRemoved with getAppUserView().getUser().getName()), MariaDB-create.sql lineremoved (removeddate DEFAULT CURRENT_TIMESTAMP) and Menu.Root.txt L109 -> users_voids.bs selecting NAME, PRODUCTNAME, REMOVEDDATE, UNITS FROM lineremoved. Voids + employee + timestamp + a shipped report are met; approving manager, reason codes, and comps/discounts/price overrides are not. source |
| inventory-recipe-bom-costing | unknown, grade F | resolve-to-partial | Re-read raw DataLogicSales.java: getStockDiaryInsert() (L2163) calls adjustStock (L2185), and adjustStock recurses per products_bundle component (L2274-2287), so a bundle whose component is itself a bundle is exploded on both the sale path (L1809/L1828 inserts) and manual stock entries (StockDiaryPanel). Sub-recipe nesting is met; automatic cost recalculation is not (products.pricebuy is typed in ProductsEditor, never summed from components). source |
| inventory-menu-margin-linkage | unknown, grade F | resolve-to-partial | Re-read raw sales_productsalesprofit.bs (quote verbatim) and Menu.Root.txt L80 (Menu.SalesProfit shipped in the menu). Per-item contribution margin on actual sales mix is met; recipe cost basis and a below-threshold flag are not. source |
| labor-manager-override-audit | unknown, grade F | upheld | Proposed no from the uniCenta oPOS 5.0 source (GitHub mirror of the SourceForge unicenta-opos-5.0.zip) and 87 live unicenta.com pages (269th session); rejected on verification: Absence bounded only in the uniCenta 5.0 source (shared override.pin, lineremoved without approver). The shipping build is 5.4.0 and the hosted web version is unread; old material caps at partial and can never establish `no`, and there is no met conjunct to support a partial. Lead recorded: 5.0 has no approver identity. source |
| labor-photo-punch-verification | unknown, grade F | upheld | Proposed no from the uniCenta oPOS 5.0 source (GitHub mirror of the SourceForge unicenta-opos-5.0.zip) and 87 live unicenta.com pages (269th session); rejected on verification: Absence bounded only in the 5.0 schema (shifts has four columns, no photo). Current build is 5.4.0; old material cannot establish `no`, and no conjunct is met for a partial. source |
| labor-break-compliance-by-state | unknown, grade F | upheld | Proposed no from the uniCenta oPOS 5.0 source (GitHub mirror of the SourceForge unicenta-opos-5.0.zip) and 87 live unicenta.com pages (269th session); rejected on verification: Absence bounded only in the 5.0 schema (breaks = name, visible, notes). Current build is 5.4.0; old material cannot establish `no`, no conjunct met. source |
| multi-location-central-labor-policy | unknown, grade F | upheld | Proposed no from the uniCenta oPOS 5.0 source (GitHub mirror of the SourceForge unicenta-opos-5.0.zip) and 87 live unicenta.com pages (269th session); rejected on verification: Absence bounded only in the 5.0 schema (no labor-rule table; labor tables carry no location). Current build is 5.4.0; old material cannot establish `no`, no conjunct met. source |
| inventory-unit-conversion-yields | unknown, grade F | upheld | Proposed no from the uniCenta oPOS 5.0 source (GitHub mirror of the SourceForge unicenta-opos-5.0.zip) and 87 live unicenta.com pages (269th session); rejected on verification: Absence bounded only in the 5.0 schema (uom = id, name). Current build is 5.4.0 and the live differences page lists Units Of Measure under both DEPRECATED and NEW, so the 5.x surface demonstrably changed here; old material cannot establish `no`. source |
| multi-location-price-zones | unknown, grade F | upheld | Proposed no from the uniCenta oPOS 5.0 source (GitHub mirror of the SourceForge unicenta-opos-5.0.zip) and 87 live unicenta.com pages (269th session); rejected on verification: Absence bounded only in the 5.0 schema (single pricesell per product). Current build is 5.4.0; old material cannot establish `no`, no conjunct met. source |
| guest-loyalty-consent-management | unknown, grade F | upheld | Proposed no from the uniCenta oPOS 5.0 source (GitHub mirror of the SourceForge unicenta-opos-5.0.zip) and 87 live unicenta.com pages (269th session); rejected on verification: Absence bounded only in the 5.0 customers table. Current build is 5.4.0 (with WooCommerce and a Customer API added since), so consent capture may live outside this schema; old material cannot establish `no`. source |
| guest-loyalty-rfm-segmentation | unknown, grade F | upheld | Proposed no from the uniCenta oPOS 5.0 source (GitHub mirror of the SourceForge unicenta-opos-5.0.zip) and 87 live unicenta.com pages (269th session); rejected on verification: Absence bounded only in the 5.0 report menu (eight customer reports). Current build is 5.4.0 and the web-reporting add-in is not in the source tree; old material cannot establish `no`. source |
| reporting-guest-cohorts | unknown, grade F | upheld | Proposed no from the uniCenta oPOS 5.0 source (GitHub mirror of the SourceForge unicenta-opos-5.0.zip) and 87 live unicenta.com pages (269th session); rejected on verification: Absence bounded only in the 5.0 report menu. Current build is 5.4.0 and the separately sold web-reporting add-in is not in the source tree; old material cannot establish `no`. source |
| reporting-labor-productivity | unknown, grade F | upheld | Proposed no from the uniCenta oPOS 5.0 source (GitHub mirror of the SourceForge unicenta-opos-5.0.zip) and 87 live unicenta.com pages (269th session); rejected on verification: Absence bounded only in the 5.0 schema/reports (no wage field; Performance report never joins shifts). Current build is 5.4.0 and the web-reporting add-in is unread; old material cannot establish `no`, no conjunct met. source |
| labor-manager-override-audit | unknown, grade F | resolve-to-no | Re-read raw in the tree. All cited quotes are verbatim, and the version bound checks out (pom 5.4.0, APP_VERSION "5.4.0", upgrade_master sets only the version). One correction: the eight line-edit sites at 1560-1716 do not compare the PIN inline; they call changeCount(), which reads override.pin at 657. The same holds for the delete at 2962. The substance is unchanged. Alternatives hunted: Derby and PostgreSQL lineremoved have no approver column either; the roles XML adds only sales.Override; the scripts and templates have no audit, approver or manager_id token; Ticket.Buttons carries only a commented hook. Plugin call sites are confirmed, but startEventListener receives jRootApp, which the analyst understated as "startup". That does not rescue the cell: attribution needs the approver's identity at the PIN prompt, and the code structurally holds one shared secret per terminal. Rubric check: attribution to the approver is not met, and neither is immutability (no PK, ON UPDATE timestamp, a shipped delete script). The one queryable trail records the actor, not the approver, so no conjunct of the override claim is met and partial is not warranted. The analyst's poison accounting missed the "Supervisor" hit in the Spanish leave message; I added it. Hosted: 5.3.1, the same schema generation, described as "the full version". source |
| labor-photo-punch-verification | unknown, grade F | resolve-to-no | Re-read raw: the INSERT and UPDATE are verbatim, and shifts has 4 columns in all three create variants I read (MariaDB, Derby, PostgreSQL). All 14 photo-token hits were listed and are customer UI or the file-picker icon. The epm image references are static icons only. Version bound holds, and the hosted 5.3.1 falls inside the unchanged-schema window. The residual risk is the closed plugin jar, which receives jRootApp at startup. Every vendor-documented function of it is e-commerce, payments, metrics or receipts, and no vendor page offers labour, camera or time-clock add-ins, so a photo-at-punch surface there is speculation, not a live alternative. Rubric: neither photo capture nor facial verification, nor the photo-only mode, has any conjunct present, so no rather than partial. The analyst's count of 9 locale files is actually 8 message properties plus the base file, 9 label.photo lines in total; the line count of 14 is invariant. source |
| labor-break-compliance-by-state | unknown, grade F | resolve-to-no | Re-read raw: the breaks DDL and StartBreak are verbatim, and the Derby and PostgreSQL variants match (PostgreSQL even seeds just "Lunch Break" and "Tea Break" names). I confirmed there is no rule field or check on the break path, and that the EPM reports do not touch breaks (performance is sales per person). The rule-token zero reproduces (0 lines). The analyst's break-token figure was 325 against my 324, a counting artefact; the 284 break; statements match exactly. Version bound holds, and hosted is 5.3.1 in the same schema window. Plugin: same scope as the other labor cells, with no documented labour function. Rubric: per-jurisdiction rules, attestation and missed-break premium flags are all absent. Recording a break start and end is a timekeeping feature rather than a met conjunct of this compliance claim, so no stands over partial. source |
| multi-location-central-labor-policy | unknown, grade F | resolve-to-no | Re-read raw: the leaves, locations, people, shifts and shift_breaks DDL are verbatim, and there is no location or rule column on any labor table in the MariaDB, Derby or PostgreSQL variants. The labor-token zeros reproduce. The only hit in the broader set (supervisor) is a Spanish leave message, not a rule. Version bound holds, and hosted 5.3.1 is in the same schema window. The rubric requires configurable rules enforced at the terminal; there is no rule of any kind (overtime, break or predictive scheduling), let alone location-scoped, so no conjunct is met. The plugin jar is unread, but none of its documented functions (WooCommerce/API sync, payments, receipts, metrics dashboard) is labour, and a niche-weight no/A off a rule-free schema and rule-free enforcement path is safe. source |
| inventory-unit-conversion-yields | unknown, grade F | resolve-to-no | Re-read raw: the uom DDL is verbatim and has the same two columns in MariaDB, Derby and PostgreSQL. getTableUom, UomInfo and every java uom reference confirm a single name-only unit per product. stockvolume is never multiplied into stock logic; it only appears in SELECTs, the editor and the save. The 9 conversion-token hits were listed and are all byte, string or time conversions. The prior rejection turned on 5.0 being old while the differences page shows UOM changed in v5. That objection is answered: the NEW v5 UOM is exactly this id/name table, and the 5.4.0 upgrade_master adds no ALTER. Rubric: no separate purchase, recipe or count units, no factors and no yield %. A per-product unit label does not partly meet a conversion claim, so no rather than partial. The residual risk is the closed plugin: it only syncs products into the same table, which cannot store a factor. source |
| extensibility-headless-embedded | unknown, grade F | resolve-to-partial | Verified in the src133 decompile: the @Value gates; getOrders' call-site table (initAndShowGUI Order, getTicketInfo, randomUUID, insertRSharedTicket, getTableId, setTicketIdInTable, deleteOrder); and EventListener's table (getProducts, getCustomers, getOrders). Confirmed the path is live: 5.4.0 StartPOS.java:130-131 calls startEventListener. POST /order confirmed in the on-disk insomnia.json. The 1.3.0 diff is 3 lines, all decompiler call-site variance. Amended on three counts. First, I added the vendor's own UI string 'Please login and select the table or layway to complete the sale' from Order.fxml, which directly evidences the not-a-transaction-engine shortfall. Second, I added the subscription gate and the modifier-less line item as named shortfalls. Third, I removed the unsourced robots/Cloudflare aside and the 'On Table' detail. partial/A is consistent with cuboh partial/A and lavu partial/A for order-injection APIs. The rubric weight is niche, so partial needs no A/B floor; A is right for vendor code. source |
| delivery-injection-error-visibility | unknown, grade F | upheld | Proposed no from the unicenta-plugins jar / archived uniCenta forum (284th session); rejected on verification: The till-side facts check out. getOrders' failure branches log only: 'Subscriber not logged in', 'Order API not enabled', ' subscription required' plus the setProperty till.order-api=false, and a catch that logs 'Error with processing Order: '. No plugin FXML (the full text census of the 15 fxml files) has a status or failure field; the only order UI is 'New Order Received!'. But `no` means POSITIVE EVIDENCE OF ABSENCE by the VENDOR, and the rubric's conjuncts (failed injections, per-channel connection status, alerts) can be met off the till. uniCenta's order queue, WooCommerce webhooks and subscriber account all live on api.unicenta.io and the uniCenta account side, which the proposal itself concedes is unmeasured. A census of one client bounds the absence to the wrong surface, the same class of error behind the prior no/B being overturned. There is also a behaviour the proposal did not note. An exception inside the per-order closure propagates to the outer catch before deleteOrder runs, so a failed order stays in the cloud queue and is re-polled. Whether the cloud side surfaces that backlog to anyone is exactly the unmeasured question. Held at unknown. source |
| reliability-sync-conflict-handling | unknown, grade F | upheld | Proposed partial from the unicenta-plugins jar / archived uniCenta forum (284th session); rejected on verification: Half of the proposal's evidence does not hold. ProductServiceOutbound.fireProductEvent (POST/PUT/DELETE) is reached only through EventRouter.routeEvent. Nothing calls routeEvent: EventRouter is referenced by no other class in the 1.3.3 jar, and 'routeEvent|EventRouter|fireProductEvent' has zero hits in the 5.4.0 source tree, whose only plugin calls are initScreen, paymentSenseEOD, paymentSenseTransaction, teyaTransaction, sendReceipt, postMetrics and startEventListener. So the till never pushes its edits through this path, and the 'outbound, no precondition' half is unwired code. What remains is ProductService.saveProducts: it looks up by wooCommerceProductId, else id, and calls updateData with no comparison (confirmed in the decompiled body). That is a one-way, server-authoritative refresh of catalogue and customer rows, not a resolution rule for edits made on two devices during a partition; what the cloud returns, and any server-side resolution, are unmeasured. Tickets and checks, which the rubric's why_it_matters names, are not touched. The tokenised constant-pool control is also misstated. The standalone token `version` does occur once, as Groovy enum boilerplate ('recompile this class with the new version'), and `uniCentaVersion` is the Metrics telemetry field. The claim is about DOCUMENTED behaviour, and inferring an LWW policy from the absence of a compare in an unwired or one-way client is not that. The erpnext partial/A precedent rested on a real conflict mechanism (TimestampMismatchError), which has no analogue here. Held at unknown. source |
| kitchen-recall-refire | unknown, grade F | upheld | Proposed partial from the unicenta-plugins jar / archived uniCenta forum (284th session); rejected on verification: The Wayback capture (line 1 matches the url) holds only the title 'remote oder display recall button not working - Support Forum - uniCenta Forum'. The body reads 'You don't have permissions to see this page, please register or login for further information'. The title is written by a customer. That is user-generated content, grade E at best and not D, and it is not a vendor statement. It does not establish what 'recall' does on the Remote Order Display: recalling a bumped ticket, or recalling a parked order onto the POS, as uniCenta uses 'store recall' for layaways on its FAQ. It also reports the button as NOT WORKING, and says nothing on the refire/reprint half. A title-only, customer-authored, 2019 and semantically ambiguous artefact cannot carry partial on a table-stakes cell. Peer partials all cite vendor help-centre text at grade B. Held at unknown. source |
| kitchen-sla-alerts | unknown, grade F | resolve-to-partial | Every quoted tooltip, property name, label string and CSS colour mapping was checked in raw source (database.fxml lines 196/206/216, RemoteDisplayController lines 454-469, flatterfx.css lines 14-16 and 480-494). The key strings (limit.urgent, ' URGENT! ', textwaiting) are also present in the compiled RemoteDisplayController.class, so the 2017 build had the feature. Package-page facts were checked in the saved HTML. On the yes-vs-partial question: the rubric asks for targets per station or order type plus colour and/or audio. Colour escalation is fully met. Per-station targets exist only indirectly: AppConfig reads user.home/<APP_ID>.properties, so thresholds are per install/user profile, not per order type and not per item. Taken with the Beta 'DO NOT use in production' status, that is a named material limitation, not yes. Corrections to the proposal: the proposed 'one global set per display installation, not per order type' reason ignored that an installation can itself be a station; the token controls are re-bound to the 42 files I counted, not 44 (including nbproject IDE files, 58, the audio zeros are unchanged); and I added the AppConfig defaults defect. The Beta/PLUS status does not change the value on its own; it is a note-level shortfall that reinforces partial. source |
| kitchen-recall-refire | unknown, grade F | resolve-to-partial | Verified in RemoteDisplayController.java lines 161-173 and 291-343, FixedStack.java (push removes index 0 at capacity) and DataLogicRemoteDisplay.createOrder. The locale line and the jar's compiled 'RECALLED: ' and recall.historycount strings were also checked. Partial upheld. One factual error is corrected. The proposal said the POS's Remote Print 're-sends only lines whose sendstatus is No (script.SendOrder)'. That sendstatus logic exists only in the 2017 code-change file uniCenta_oPOS_Remote_Display_script.sendorder.txt (lines 33-56). The shipped 5.4.0 template src/main/resources/com/unicenta/pos/templates/script.SendOrder.txt has no sendstatus and keys on product.printer plus ticket.updated. And 5.4.0 j_btnRemotePrtActionPerformed then calls remoteOrderDisplay(), which resends every line (JPanelTicket 3053-3073, 3473-3521). The note now describes the shipped behaviour. source |
| kitchen-expo-consolidation | unknown, grade F | resolve-to-partial | Verified DataLogicRemoteDisplay lines 50-85 and 110-132 (both query branches and both DELETE forms), plus the controller's handleCompleteOrder (it deletes; it never sets completetime). grep confirms screen.allorders is absent from database.fxml and DatabaseController.java. The compiled DataLogicRemoteDisplay.class carries the screen.allorders string and both DISTINCT queries. The 5.4.0 per-line display-property routing was confirmed at JPanelTicket 3484-3492. The value and the reasoning survive. The amendment only adds the 'THIS station' wording found in database.fxml line 236, which confirms the vendor's own station framing, and tightens the provenance caveat. source |
| kitchen-all-day-counts | unknown, grade F | resolve-to-no | On the bound: this is a complete source tree of the display itself: every UI element, every query, and a matching compiled jar. An aggregated all-day view would need both a UI element and an aggregating query, and neither exists. That is positive structural evidence of absence in the product's own code, not a zero over prose that never takes up the topic, so the login-wall rule (which forbids reading silence as absence) does not apply to it. The residual risk is that the walled binary was updated in 2018/2019. That is mitigated because the binary is still labelled Beta1 with the same three-component list, and because the vendor published this source openly in 2021, after the binary's last update; the note binds the absence to the artefact. Peer precedent exists (kitchen-all-day-counts no/A is already used elsewhere in the corpus). Corrections: the proposal said 'a built jar whose 21 classes/resources ... match the 14 source files one to one'. The jar has 42 entries, and database.fxml differs by one button, so 'functionally matching' is the accurate claim. The proposal's 44-file count is 42 by my count (58 with nbproject; the zeros are invariant). Its 'count' poison list named getLinesCount and historyCount, which are not word tokens: tokenised, 'count' has exactly one hit, count(*). Its listing of the fxml buttons wrongly implied 'Complete Order' is static text. All other quotes verified. source |
| kitchen-bump-bar-hardware | unknown, grade F | resolve-to-no | Verified the full RemoteDisplayController.java and grepped the whole source tree for KeyEvent / onKey / KeyCode / setOnKey (zero). The compiled controller class's constant pool was also dumped, with no key-handler strings. This overturns the earlier F rationale's ground: that verifier held unknown because only the POS-terminal peripheral tab and a walled hardware guide spoke to it. The display's own code now shows there is no input path a bump bar could use, which is positive evidence of absence and not a silent document. The same bounding caveat as the other display cells applies and is stated in the note. A no/A precedent for this cell exists elsewhere in the corpus. Corrections: the proposal said 'pressed' hits were setOnMousePressed plus CSS :pressed. Tokenised, setOnMousePressed is not a 'pressed' token, and the only hit is remotedisplay.css. I also added the compiled-class check and the 42-file count. source |
| kitchen-item-build-screens | unknown, grade F | resolve-to-no | Verified the three-line rendering at RemoteDisplayController 435-443, the orders DDL in both the display source and 5.4.0, and the 5.4.0 addOrder argument list at JPanelTicket 3495-3505. The proposal's own hedge ('if the attribute line is read as a modifier breakout, partial is the ceiling') was examined and rejected. The attribute line is the same single concatenated attribute-set description the ticket line itself carries, so it is ticket line text, not a per-modifier breakout; and uniCenta auxiliary products are separate ticket lines, rendered as separate rows, exactly as on the ticket. The display renders only the ticket line text, which the rubric names as the non-qualifying case, so this is a positive in-code bound, not an absence of documentation. The note is amended to drop the hedge, name the 5.4.0 accessors precisely and add the provenance caveat. source |
| kitchen-order-modification-alerts | unknown, grade F | resolve-to-no | Verified in raw 5.4.0 source: JPanelTicket 3053-3073 and 3473-3521 (the deleteOrder call, the resend loop with a null ORDERTIME argument, and the comment verbatim); DataLogicSystem lines 376-381 (addOrder names ORDERTIME explicitly) and 421-423 (m_deleteOrder SQL); and MySQL-orders-table.sql (11 columns, none carrying change state). This is current shipped code that defines the data contract for any display, so the absence does not depend on the 2017 display build: with delete-and-resend and no change column, no flag can be transmitted. That makes it the strongest of the no verdicts. One overstatement is corrected: the proposal said 'the database default CURRENT_TIMESTAMP applies'. The insert passes an explicit NULL into a NOT NULL timestamp, and whether that becomes CURRENT_TIMESTAMP depends on MySQL's explicit_defaults_for_timestamp setting, so the note now says only that the order re-enters with a fresh time. The 'changed 0 outside DirtyManager' figure holds only over the 42 non-IDE files (the nbproject files add 41 more hits), so it is re-bound. The final_url is line 1 of pages/gh_JPanelTicket.java.txt. source |
| kitchen-prep-time-pacing | unknown, grade F | resolve-to-no | Verified the display side (DataLogicRemoteDisplay ORDER BY ordertime / ORDER BY auxiliary; buildOrderPanels adds rows immediately) and the 5.4.0 insert loop. The proposal checked only the orders table, not where a per-item cook time would actually live. I checked the 5.4.0 MySQL-create.sql products table and grepped src/main for cooktime / preptime / preparationtime / cook_time / prep_time: zero. That closes the configuration half in current shipped code, not just the 2017 display. The stagger half is bounded by the display source. Corrections: the proposal said 'all lines get the same CURRENT_TIMESTAMP'. The explicit NULL ORDERTIME makes that server-configuration dependent, so the claim is replaced with the one-pass insert, which is what matters for pacing. I also added the products-table check and the 42-file count. A no/A precedent for this cell exists elsewhere in the corpus. source |
| menu-pricing-included-allowance | unknown, grade F | resolve-to-no | Challenged the proposed no at grade A and upheld it, with the bounds tightened. I re-derived the DDL myself rather than inheriting it: MariaDB-create.sql:370-377 gives products_com ( id, product, product2 ) with no fourth column, and :352-359 gives products_bundle with a quantity whose sole consumer is bundle/stock handling (BundleEditor binds PRODUCT, PRODUCT_BUNDLE, QUANTITY and nothing else). JPanelTicket:709-782 and :1013-1015 confirm an auxiliary line is a normal priced ticket line; the only parent-child logic is positional insertion. All four controls are tokenised zeros across three corpora with a live positive control, and I found the researcher's own `included` figure to be reader poison (tax and catalogue labels), which is why the amended note states the invariance and not the count. Two corrections to the proposal's framing rather than its value: it presented the schema reading as if it were separate from the sibling cells' - it is one fact, and the note now says so - and it omitted the BeanShell event hooks, which are the strongest available counter to a flat `no` and had to be named and disposed of explicitly ('code, not configuration'). One residual caveat the reader should have: the grade-A citation is a third-party GitHub mirror whose 5.4.0 identity is attested only by its own pom version string, not by a vendor-hosted tag; the GPL makes that low-risk but it is not the publisher's own host. Value no, grade A stands; the prior claims.jsonl cell was unknown/F cited to the members-only Product Bundles guide, so this is a resolution, not a downgrade. source |
| reliability-offline-card-auth | unknown, grade F | resolve-to-no | Value and grade upheld on an independent re-reading of the code; the note is materially corrected and enlarged, hence amended rather than upheld. I re-fetched both cited classes at the pinned commit and the quoted behaviour is verbatim accurate: Teya blocks on AppContext.getTeyaPaymentResult() with int timeout = 150, PaymentSense on getIsProcessing() with int timeout = 180, both ending at paymentError("Transaction Error! Please try again"), and JPaymentMagcard.executePayment() returns null on that path so the tender fails rather than being queued. AMENDED on three points. (1) The proposal says "both shipped gateways". PaymentGatewayFac enumerates THREE - external / PaymentSense / Teya - and the omitted PaymentGatewayExt is precisely the one a sceptic would reach for, since it is the configuration for merchants with a standalone terminal. Read, it strengthens the no: its entire body is payinfo.paymentOK("OK", payinfo.getTransactionID(), ""), no authorisation and no card data, so there is nothing to forward. One call site plus an exhaustive switch is what turns this from a corpus zero into a census, which is why grade A survives scrutiny. (2) I re-ran every control myself over all 1,696 files at the pin rather than inheriting them; store-and-forward, deferred, floor-limit, reversal, pending and resubmit are all 0, and the queue/retry/sync hits are java.util.Queue in the ScanPal driver, password-retry UI strings and an ORDERS-sync comment. The published poison reproduces exactly as warned - the only tokenised offline in the tree is the Danish Derby Embedded single-user install sentence - and it is excluded and named in the note. The binary-jar trap does not apply, since the tree ships only maven-wrapper.jar; I separately re-fetched unicenta-plugins 1.3.3 (200, 460,041 bytes) and it has zero offline against a live control of 8 files matching PaymentSense. (3) The note now states what the no does not bound - the terminal vendor floor-limit behaviour, the unenumerated Third party add-ins, the Hosted tier server side - and states the boundary against payments-offline-store-and-forward and reliability-offline-decline-liability so the group is not read as a double count. Provenance checked, because the corpus is a third-party mirror: the pinned commit is titled "5.4.0 release" and authored hughs@unicenta.com, and the only later commit on that mirror adds a PaymentGatewayViva class of the mirror owner own making, correctly excluded by the pin. source |
| reporting-guest-cohorts | unknown, grade F | upheld | Proposed partial from the GPL 5.4.0 source at commit 8771d24 and the decompiled plugin jars (310th session); rejected on verification: Every conjunct of the claim is conceded absent by the proposal itself, so the partial is self-refuting; the residue is transaction reporting the claim explicitly excludes. Independently confirmed the proposed grade-A script is a today-defaulted per-ticket detail report with no lifetime aggregate; the only first-buy/last-sold/lifetime surface is a v4-exclusive add-in requiring a paid third-party WordPress plugin, with FIRST BUY hidden by default, on a demo host that no longer resolves (NXDOMAIN). Grade A unjustifiable, scope wrong, capability absent. source |
| guest-loyalty-consent-management | unknown, grade F | resolve-to-no | Original was unknown/F, so this is a resolution, not a correction. The stated reason for unknown was the members-only uniCenta oPOS Customer Setup Guide at /packages/guide-customer-setup/ behind a login wall, with /downloads/guides/ paginating to “Page 1 of 3” and pages 2-3 absent from the corpus. THAT REASON IS DISSOLVED RATHER THAN OVERRIDDEN: a user guide describes the customer record, it cannot add a column to it, and the GPL source at the pinned 5.4.0 commit IS the product - the DDL, the Swing editor that enumerates every field, and the rendered web report all agree, so the guide is strictly dominated and no longer supports an unknown. I re-ran the census myself on the concept rather than the English word, and it changed what the note says, not what it concludes. The proposal was right by luck on the jars: it asserted a tokenised zero for consent there without running the concept controls, and subscrib in fact fires 218 times in the decompiled plugin - a homonym for the uniCenta licence holder, which I resolved and have published alongside the Italian non consentito, the UPC-2 marketing comment and the roles.permissions staff ACL. I read only CFR-decompiled sources, never jar bytes, so no phantom hits. I also recounted the site: consent is 6 hits over 3 files, not 3. Two genuinely new pieces of evidence, both stronger than anything in the proposal: the measured absence of any send path at all (javax.mail, smtp, SMS, Twilio and campaign all zero across 1,687 files; only Desktop.mail() for a single customer), and the changelog selling the Customer List as a mailing-list export whose live rendering has six contact columns and no permission column - positive evidence that the consent obligation is pushed wholly outside the product, which is exactly what the claim asks about. ON APPLICABILITY, which is the real challenge: having no marketing channel does not make this claim inapplicable. It is table-stakes with segments: all, and n/a is computed from peer-group category scope and never written per cell, so no is the correct value and the absence of a channel is the substance of the finding rather than an excuse from it. It is also how the neighbours were scored - guest-loyalty-targeted-offers, -lifecycle-automation, -10dlc-registration and -campaign-attribution all sit at no on this record for the same architectural reason. Across the corpus this claim is scored 46 times and no is rare (5 of 46, two already at grade A), so this sits at the strict end, which is where the evidence is. ON DOUBLE COUNTING: no true overlap. guest-loyalty-privacy-rights-tooling and commercial-privacy-dsar-tooling (both no/B) rest on the vendor GDPR page saying DSAR handling is manual - that is access and erasure rights, a different obligation from capturing marketing permission. The correlation with the four guest-loyalty no/C neighbours is real but is the taxonomy decomposing one architecture, and this cell is independent of and stronger than all of them: they cite marketing pages at grade C, this cites the schema and the shipped code at grade A, and it re-founds them. Grade A stands - DDL plus source plus a decompiled DTO is squarely the grade-A class. source |
| menu-pricing-fractional-placement | unknown, grade F | resolve-to-no | RESOLUTION, NOT A CHALLENGE: claims.jsonl line 21 still holds unknown/F, whose rationale rested on the login-walled v4 "Product Attributes Guide", so there was no asserted value to contest - the correct family is resolve-*, and I record it as such rather than as the upheld/downgrade the batch framing invited. On the merits I tried to break the `no` four ways and could not. (1) PROVENANCE: I did not take the mirror on trust - I re-fetched raw.githubusercontent at the pinned SHA (MariaDB-create.sql 47,150 bytes, JPanelTicket.java 137,704, Printer.TicketLine.xml 1,774) and pulled the whole tree as a codeload tarball (5,575,344 bytes, 1,696 files). The repo, the commit and every quoted string are real and verbatim. (2) THE SCHEMA: 52 CREATE TABLEs; I read ticketlines, products, products_com, products_bundle and all five attribute tables myself. Not one price column outside products.pricesell and ticketlines.price, and no placement/section/fraction column anywhere. (3) THE ESCAPE HATCH the batch did not close, which I closed: ticketlines.attributes is a mediumblob, so a section could in principle be smuggled in as a serialised property. It cannot - TicketLineInfo.java writes a fixed set of product.* keys and the on-line attribute editor sets only the instance id and description, never price. That is the difference between labelling a half and pricing one, and it is why the DIY attribute-set workaround fails the rubric's "independent pricing per section" conjunct rather than merely underdelivering. (4) THE CONTROLS: I re-ran the whole census myself over 1,219 text files rather than inheriting the figures, and confirmed 92 placement files / 806 ComponentPlacement / 13 HumanReadablePlacement / fractionMultiplier / "substantial portions" / "Fractionner le recu". I FOUND ONE ERROR IN THE BATCH'S OWN POISON LIST: tokenised `placement` is 1, not 0 - a \u00e9 escape splitting French "Deplacement table" and "emplacement" in pos_messages_fr.properties - which strengthens rather than weakens the finding but had to be published, and the amended note publishes it. GRADE: A is right (GPL source of the exact shipped version, read at a pinned commit); the grade floor does not apply to a `no` in any case. DOUBLE-COUNT, DECLARED: this cell and menu-pricing-half-and-half-rule and kitchen-pizza-fractional-display are three differentiator-weight cells resting on ONE fact - the sale line has no section - measured in three tables (ticketlines, the attribute set, orders). They are not independent observations, and the batch says so for half-and-half ("entailed by the fractional-placement finding ... stands or falls with it"); the same disclosure belongs on kitchen-pizza-fractional-display. The other four menu-pricing rows in the batch (parent-size, topping-tiers, size-style-matrix, included-allowance) do test distinct columns and are not part of that bank. WHAT THIS DOES NOT SETTLE, and I decline to hide it: uniCenta's own add-ins page asserts a third-party extension surface and enumerates none of it, so the zero is bound to the application, its plugins jar and the ROD source - not to the universe of add-ons. That residual does not reach `unknown`, because a capability nobody names in 246 first-party documents (pizza=0, topping=0) is not a shipped capability of the product. source |
| menu-pricing-half-and-half-rule | unknown, grade F | resolve-to-no | Re-opened the corpus myself rather than trusting the proposal. Confirmed the pin (git log at 8771d24b, '5.4.0 release', clean tree) and re-ran every control tokenised with binaries excluded: half/halves/pizza/fraction/portion/topping = 0 over 1,219 text files, and 0 over the decompiled plugin jars and their constant pools, while pricesell/isvprice/products_com/attributeset fire - so the corpus and the matcher are both alive and the published poison is controlled (the only site-corpus 'half' is the Marrakech 'two and a half acre garden'; the desktop verdict does not lean on the site corpus at all). Read the price-assignment sites in JPanelTicket.java directly, including the ones the proposal did not cite (974/976, 1258/1262, 1339/1343, 1512, 1735-1758, 3034): every one takes the product's own getPriceSell()/getPriceSellTax() or the keyed input, none reads another line's price. Grepped the shipped .properties for a price-rule key and got a closed vocabulary with no half/fraction/tier/multiplier token. This is positive absence, not mere silence: a complete GPL source tree plus its complete DDL is a closed enumeration of what the software can do, which is the stronger form of the 'docs enumerate the alternatives and this is not among them' test, so A is the right grade. Three corrections to the proposal, all recorded in the amended note rather than moving the value: it understated the call sites as three; it claimed a corpus bound it did not state (the tree carries no web client, so the GBP 15/mo Hosted 'Web version' is outside this evidence); and it omitted that JPanelTicket fires scriptable ticket.addline/ticket.removeline resource events, a first-party route by which a site could code a bespoke adjustment - that is custom development, not an operator-configurable choice among rules, so the claim still fails. Also flagged the double count the proposal itself half-admits: this cell is entailed by menu-pricing-fractional-placement and shares its corpus with kitchen-pizza-fractional-display, and must not be read as a third independent finding. Verdict is a resolution, not a challenge: the current claims.jsonl row is unknown/F (bound to the members-only v4 attributes guide), so by original value this is resolve-to-no. source |
| reporting-labor-productivity | unknown, grade F | resolve-to-no | Re-opened the cited reports myself against a local checkout verified at 8771d24bb67160f6b58bba4d6f3e50c950e2fac9, and every decisive structural fact holds: epm_performance.bs is sales-only and never names `shifts`; epm_dailypresence.bs is the only report that joins `shifts` and carries no money term; `people` is ( id, name, apppassword, card, role, visible, image ) with no wage column. Attacked the partial reading hardest, because a `no` that shortfalls a conjunct is self-refuting: the claim wording requires sales per labour HOUR and labour cost as a percent of sales, and uniCenta produces neither - sales per EMPLOYEE (bounded by first and last sale, not by clocked time) and raw hours worked are the ingredients, not either conjunct, and I confirmed the jrxml performs no division that would silently create a rate. The by-department axis is absent too, since `role` is a permission role. Strengthened the bound from a vocabulary zero to a closed enumeration: 70 shipped .bs reports, `shifts`/`leaves` in exactly two, both money-free - a census of the publisher's own manifest rather than a grep. Grade A on primary source plus the DDL. Upheld the proposal's poison call and added one it missed: the closed jar's com/unicenta/plugins/metrics package is install telemetry, which would otherwise read as a metrics feature to the next pass. Double-count check: labor-realtime-labor-percent (no/C) is the REALTIME manager-dashboard percentage and labor-server-performance-metrics (partial/D) is per-server sales quality; this cell is the historical labour-vs-sales REPORT, and it now carries grade-A source evidence where those two rest on v4 marketing, so it is not redundant with either. Original value was unknown/F, so this is a resolution, not a correction of an asserted value. source |
| payments-p2pe-pci4 | unknown, grade F | upheld | Proposed partial from the GPL 5.4.0 source at commit 8771d24 and the decompiled plugin jars (310th session); rejected on verification: REJECTED; the cell stays unknown/F. (0) PROCEDURE: this is not an unexamined unknown. The live row carries verified:true and a prior adversarial verdict that already UPHELD unknown on exactly this PA-DSS reasoning and already distinguished it from reliability-pci-dss-4-attestation. The proposal re-reads the same FAQ sentence and adds no evidence the prior pass had not weighed; its one genuinely new corpus, the 5.4.0 source, cuts AGAINST it. (1) RE-FETCH: I fetched unicenta.com/faqs/ myself 2026-09-15, HTTP 200, 148,212 bytes, and read RAW HTML, not stripped text. The quotes are verbatim and correct: CARD PAYMENTS > Important! 'Pre-version 4 uniCenta oPOS included several card payment gateway interfaces. These were completely withdrawn in version 4 due to the PCI/EMV "liability shift" introduced in 2015 and which comes in to full effect 1 February 2018' / 'From uniCenta oPOS version 4.4 we now include, as standard, a fully compliant and approved PCI/EMV P2PE PA-DSS solution using our posApps Plugin Manager for : Dejavoo - USA, Canada, Mexico, Central and South America[;] PaymentSense - United Kingdom and Ireland', and Devices > 'At this time uniCenta oPOS only supports the Dejavoo and PaymentSense PCI/EMV compliant devices through our posApps Plugin Manager'. The page self-disclaims currency in its own lede, 'Many of the FAQ’s here still apply to earlier versions of uniCenta oPOS'. (2) THE THREE SHORTFALLS ALL CONFIRMED. (a) Retired standard: PA-DSS, withdrawn by the PCI SSC in October 2022 and superseded by the Software Security Framework. (b) No 4.x anywhere: raw-byte counts on my own fetch are PCI DSS=0, '4.0'=0, SAQ=0, QSA=0, AoC=0, Attestation=0, 'on request'=0, 'listing'=0, 'Validated'=0; 'DSS'=1 and that single hit is the substring inside 'PA-DSS'. P2PE=1, the one sentence above. (c) Stale device list: at commit 8771d24bb67160f6b58bba4d6f3e50c950e2fac9 the git tree is COMPLETE (truncated=false, 1,809 entries) and contains ZERO paths matching /dejavoo/i; the payment package ships PaymentGatewayPaymentSense.java and PaymentGatewayTeya.java only, and PaymentGatewayFac.getPaymentGateway is a CLOSED three-value switch - 'external', 'PaymentSense', 'Teya', default null. Dejavoo is not selectable in the shipped build. (3) SELF-REFUTING PARTIAL. The rubric is a conjunction: provides P2PE AND a CURRENT PCI DSS 4.x AoC / P2PE listing available on request. The proposal concedes conjunct 2 entirely, and conjunct 1 survives only on a v4.4-era self-claim to a defunct standard. A claim to a RETIRED standard meets no conjunct of a 4.x claim: PA-DSS is a payment-APPLICATION standard, never P2PE validation, so 'PCI/EMV P2PE PA-DSS' is a marketing conflation, not a PCI-listed P2PE solution name, and the solution is attributed to posapps.io, a separate product surface. Shortfalling every conjunct is not a partial. (4) THE CODE LEG IS OVERSTATED, and I checked it rather than accepting it. The proposal says 'no PAN ever enters the uniCenta ticket (PaymentInfoMagcard receives only a card scheme name, a Chip and Pin verification flag and a gateway reference)'. False for that class: PaymentInfoMagcard.java (8,537 bytes) declares track1, track2, track3, encryptedTrack AND encryptionKey, with getEncryptedCardData() and getEncryptionKey() accessors - a merchant application holding the key is the OPPOSITE of a P2PE solution's key-management model. The reduced handoff the proposal describes is true only of the gateway classes: PaymentGatewayTeya.java (3,559 bytes) calls teyaTransaction(amount, window, transactionID) then setCardName("Teya") and setVerification("Chip and Pin"), and contains P2PE=0, PCI=0, encrypt=0. The source establishes an out-of-scope terminal handoff; it does not establish P2PE, and it says nothing about an attestation. (5) GRADE: B is wrong and inconsistent with this record's own treatment. For a compliance proposition /faqs/ is a v4-era vendor support/marketing page, which the standing reliability-pci-dss-4-attestation row already grades C in terms ('Grade C - the citation is the FAQ, a v4-era support page'). Moot on rejection, recorded so it is not re-proposed at B. (6) DOUBLE COUNT: this one sentence is already scored in three live cells - reliability-pci-dss-4-attestation no/C, commercial-pci-dss-4-controls no/B (citing features/differences/ 'DEPRECATED ... Card payment gateways (PCI compliance)'), and payments-emv-nfc partial/B, which quotes it in full. A fourth score off the same sentence is a double count, not a new finding. (7) The published-poison warning is upheld and irrelevant to the outcome: the Remote Order Display 'pci' hits are compressed bytes in derbyclient/hibernate/hsqldb/mysql-connector jars and were correctly excluded. (8) WHY NOT 'no': availability of an AoC on request is not observable from outside, and a stale first-party P2PE assertion blocks positive evidence of absence as surely as it fails to support a yes. unknown/F, grade F with rationale and no url, is the correct state and it is already what the record carries. source |
| kitchen-pizza-fractional-display | unknown, grade F | resolve-to-no | Resolution, not a challenge - the cell stood at unknown/F, so the resolve-* family applies. I verified both artefacts myself: git rev-parse in .cache/q275-unicenta/src54 returns 8771d24bb67160f6b58bba4d6f3e50c950e2fac9 ("5.4.0 release"), and the ROD source is the downloaded uniCenta_Remote_Display package. Three changes to the proposal. (1) RE-HOMED the url. The proposal cited only Printer.TicketRemote.xml, which bounds the printed ticket and cannot bound the make-line SCREEN the claim names first; the ROD package is the corpus that carries the screen, and it is a key in notes.json. (2) REPLACED THE INSTRUMENT. The proposal argued from the ROD schema alone - no section column, therefore nothing fractional can be shown - and its own CAVEATS concede this is entailed by the absence of fractional ORDERING. That is the till fact banked again, and it is a weak footing here because the two till cells (menu-pricing-fractional-placement, menu-pricing-half-and-half-rule) are still unknown/F in claims.jsonl behind the members-only attribute guides; a KDS no resting on them would inherit that weakness. The proposal missed RemoteDisplayController 435-442, the render loop, which settles the cell directly and independently: three concatenated free-text strings with no geometry, so free-text placement would render ambiguously even if the order model could carry it. The rubric word is "unambiguously", and that is what fails. (3) DEFUSED the poison the sibling verifier flagged by re-running every control with -I and naming the residue - all six ROD `section` hits are NetBeans build scaffolding, zero uniCenta code. Grade A stands: shipped source, read whole, at a pinned commit, plus the vendor's own source package. Scope is disclaimed in the note - third-party and Plus add-ins are unenumerated by the vendor's own add-ins page, and the hosted/web tier is unmeasured; neither is bounded by this no. source |
| multi-location-price-zones | unknown, grade F | resolve-to-no | Re-opened the cited schema independently rather than taking the proposal's word: confirmed `products` has exactly one `pricesell` (line 317), the five attribute tables carry no price column, and `locations` is referenced by precisely three foreign keys, all stock. Then went past the proposal: read the DataLogicSales catalogue queries (no location/time/channel parameter anywhere in a product read), the 79-byte MariaDB upgrade master, and the four 4.5.x upgrade scripts (zero hits for price or location), which closes the 'a later migration adds it' gap the proposal asserted but did not show. Both prior rejections of this cell are now answered on their own terms: the 2026-09-05 rejection objected that the deciding document was the login-walled Database Schema Matrix Guide and the grade A rested on an Insomnia example body - the deciding document is now the actual GPL create script, which is strictly stronger than the vendor's own gated schema PDF; the 2026-09-12 rejection objected that the absence was bounded only in 5.0 - it is now bounded in 5.4.0 at a pinned commit whose pom declares 5.4.0, the release the live changelog still lists as current. Challenged the value downward and found no partial route: `isvprice` is an open-price flag the cashier keys by hand, not a tier, and both it and the duplicate-row workaround are what the claim's 'without duplicating the item record' clause exists to exclude. Also tested the separate-database-per-site pattern the brief raised: that is duplication of the item record by definition, so it fails the claim rather than satisfying it, and per-customer variation (the `customers.discount` column) is on none of the claim's three axes. Poison handled as published - tokenised, not substring - so the ZonedDateTime and setQuietZone(10.0) hits and the 'Time Zone' changelog entries are excluded, and no binary-jar byte is cited. No double count: the same create script cites other cells in this batch, but each rests on a different table (products_com for modifiers, products_bundle for allowances, customers for consent); the proposition here is the single `pricesell` plus locations-is-stock-only, which is used nowhere else. Grade A upheld: primary source, retrieved at a pinned commit. Original value was unknown/F, so this is a resolution, not a correction. source |
| guest-loyalty-rfm-segmentation | unknown, grade F | resolve-to-no | Accepted, and this is not the sibling's corpus banked twice. The reporting-guest-cohorts rejection turned on the web-reporting add-in, which I have deliberately excluded from the load-bearing evidence; the sibling's grounds for excluding it (v4 scope, paid third-party dependency, hidden column, dead host) remove a surface from 5.4.0 and therefore make this absence cleaner rather than double-counted. The new and sufficient evidence is a census the earlier passes never ran: 52 tables with zero views, a 27-column customers table whose only lifecycle field is a hand-set boolean, and the 64-entry Role.Administrator report manifest bounding the eight customer reports - none of which computes a per-guest aggregate, while the identical MIN/MAX/SUM lifetime query IS shipped for employees in epm_performance.bs. The claim needs computed segments without operator queries; the strongest thing in the product is a manual isvip checkbox and a developer comment offering loyalty as a template to build. Both named poisons reproduced and both are traps (lapsed 176 raw / 0 tokenised; Subscriber is a licence holder). Source at a pinned release commit is a census, not a corpus, so grade A survives; and the prior unknown's premise - that only the gated v4 reports guide could settle the built-in report set - is falsified by reading the artifact and its role manifest directly. source |
| menu-pricing-modifier-price-by-parent-size | unknown, grade F | resolve-to-no | Original claims.jsonl value was unknown/F (an UPHELD unknown resting on the WPDM-gated v4.4 Product Attributes Guide), so this is a resolution, not a challenge. I re-derived the proposal's facts myself rather than accepting them: read the products_com DDL in all four create scripts and confirmed ( id, product, product2 ) with no price column and no upgrade script touching it; ran a whole-schema price-column census that found seven price columns in five tables and none on the modifier or attribute axis; read JPanelTicket.incProduct at line 1010-1017 and addTicketLine(TicketLineInfo) at 760ff and confirmed the auxiliary takes prod.getPriceSell() with the parent used only for INSERT POSITION. The gating objection that held this at unknown is dissolved, not argued around - a login-walled 4.4 PDF cannot describe a column the 5.4.0 DDL lacks. I accept no/A, with three corrections and one real omission. Corrections: the attribute tables number six, not five; the schema absence is stronger than the proposal states because there is no price-list or promotion table either, which means SIZE itself is unpriced and the claim fails on both of its axes, not just the modifier one; and the duplication route the challenge asked about is real but is precisely what the claim's 'rather than by duplicating the modifier' clause excludes. Omission, and the reason I nearly held at partial: the proposal never mentions that uniCenta ships BeanShell ticket.addline / ticket.change / ticket.setline event hooks that receive the line as a ScriptArg, that TicketLineInfo exposes setPrice and setPriceTax, and that the shipped script.multibuy resource is a worked example of repricing one line off other lines on the same ticket. That is an operator-programmable escape hatch the no must name. It does not reach partial because the claim asks for a configured matrix and this is hand-written code with no shipped parent/size rule - and the shipped sample does not even parse. Absence controls re-run tokenised with `git grep -I -w`: topping, toppings, crust, pizza score zero files while products_com, pricesell, isvprice, attributeset, getPriceSell and setPriceTax all fire in the same tree, so the zeros are about the words and not about the corpus being unreadable. Grade A stands - this is primary source code - but the corpus is a third-party mirror identified as 5.4.0 only by pom version and commit message, and that caveat is now in the note. source |
| menu-pricing-topping-quantity-tiers | unknown, grade F | resolve-to-no | Original value was `unknown` at grade F, deferred to the members-only v4 Product Attributes Guide, so this is a resolution, not a challenge. I re-opened the modifier model myself rather than accepting the proposal. The proposal's core finding holds and I confirmed each element independently: products_com is three identifier columns in MariaDB-create.sql, AuxiliarPanel.java's save Table declares exactly those three as editable, and incProduct()/addTicketLine(prod, dPor, prod.getPriceSell()) charges the auxiliary at its own list price scaled by the 'x' keypad scalar - the duplicate-line mechanism the claim excludes. Against the addmi precedent (a tier lever sitting one level down on a differently-typed field), I enumerated every one-level-down candidate the proposal did not: the attribute/attributevalue/attributeinstance/attributeuse chain is varchar text plus an int lineno with no price consumer, ISVERPATRIB is a prompt boolean, and - the real near-miss, which the proposal missed entirely - products_bundle carries a `quantity DOUBLE` on a product-to-product link. I traced it and it never reaches price: DataLogicSales multiplies it only into stockdiary rows, so it is inventory depletion. That is the strongest available refutation and it fails, which is why I am resolving rather than leaving unknown. I also re-ran the closed-jar check the proposal asserted, decompressing both jars rather than grepping the archive bytes, with live controls (Product=228, product=142) so the zeros are not a compression artefact; tier/multiplier/percent/modifier/products_com are all 0, and the jars' only order model is a whole-number `amount`. Grade A is correct and I am keeping it - this is source code and a schema, the strongest class the atlas recognises - with one provenance caveat a reader should see: the tree is a third-party GitHub mirror, `lestola/unicenta-mirror-5.4`, not a vendor-published repository; it is bound by pom.xml <version>5.4.0</version> and the commit message '5.4.0 release', and the vendor changelog confirms 5.4.0 is current, but the mirror itself is not first-party. DOUBLE-COUNT WARNING, and it is material: this cell shares essentially its whole evidentiary base with the sibling pizza/modifier cells in this batch (menu-pricing-modifier-price-by-parent-size, menu-pricing-fractional-placement, menu-pricing-half-and-half-rule, menu-pricing-size-style-matrix, menu-pricing-included-allowance and kitchen-pizza-fractional-display). One fact - products_com has no columns beyond two product ids, and the only price on the line is products.pricesell times a scalar - drives all of them. They are genuinely distinct claims and each `no` is individually sound, but they are not independent evidence, and the batch should not be read as six or seven separate findings about uniCenta. source |
| labor-offline-time-punch | unknown, grade F | resolve-to-no | Value and grade accepted, note materially rewritten. I cloned the mirror, checked out 8771d24 and re-read DataLogicPresenceManagement.java, JPanelEmployeePresence.java, Session.java and MariaDB-create.sql: the four punch statements, the throws-BasicException path with no fallback, and the shifts(id,startshift,endshift,pplid) DDL with no pending/sync column all verify, and no spool, queue or reconciliation code exists anywhere in the tree. I re-ran the controls myself (store-and-forward/deferred/spool/unsent/outbox/reconcil = 0) and independently reproduced the published poison: the single tokenised offline hit is the Danish Derby-Embedded install-topology string and counting it would invert the cell. I also opened unicenta-plugins-1.3.3.jar myself - 134 classes, no shift/presence/employee/punch package, zero offline strings. THE PROPOSAL'S DEFECT, which is why this is amended and not upheld: it never says which outage it is denying and never reconciles against this record's own partial offline-order-entry cells, so as written it repeats the exact error that got the earlier no/B on this cell overturned. The rewritten note pins the rubric to loss of the DATASTORE (the reconcile conjunct is meaningless otherwise), expressly declines to deny internet-outage survival on an embedded/localhost install, and bounds the no to core 5.4.0 plus plugins 1.3.x, leaving third-party add-ins and the Hosted tier unjudged. Partial was considered and rejected: the capture and reconcile conjuncts both fail on positive code evidence and the documentation conjunct fails on a zero across the vendor corpus, and a partial that shortfalls every conjunct is self-refuting. source |
Sources
Every URL this record cites. 34 in total.
- https://unicenta.com/features/
- https://unicenta.com/faqs/
- https://sourceforge.net/projects/unicentaopos/
- https://unicenta.com/integrations/
- https://unicenta.com/card-payments/
- https://unicenta.com/api/
- https://unicenta.com/support/changelog-unicenta-opos/
- https://unicenta.com/
- https://unicenta.com/apply/
- https://unicenta.com/developer/
- https://about.doordash.com/en-us/news/doordash-preferred-integrations-program-2026
- https://unicenta.com/support/
- https://unicenta.com/pages/configure-unicenta-opos/
- https://unicenta.com/developer-section/
- https://sourceforge.net/p/unicentaopos/discussion/1126901/thread/a5961276/
- https://docs.unicenta.com/insomnia.json
- https://unicenta.com/pages/install-unicenta-opos/
- https://unicenta.com/developer-section/unicenta-opos-database-tables/
- https://unicenta.com/download-files/installers/
- https://sourceforge.net/projects/unicentaopos/files/
- https://unicenta.com/unicenta_gdpr_customer_help/
- https://about.doordash.com/en-us/news/doordash-preferred-integrations-program-2026
- https://developer.doordash.com/en-US/docs/marketplace/overview/getting_started/preferred_integrations_new/
- https://github.com/RohiTech/unicenta5-src/blob/77b35b727ad9ed2f0ddfc53fc6e402a15f637cb5/src/main/java/com/unicenta/pos/forms/DataLogicSales.java
- https://github.com/RohiTech/unicenta5-src/blob/77b35b727ad9ed2f0ddfc53fc6e402a15f637cb5/src/main/java/com/unicenta/pos/forms/DataLogicSystem.java
- https://github.com/RohiTech/unicenta5-src/blob/77b35b727ad9ed2f0ddfc53fc6e402a15f637cb5/src/main/resources/com/unicenta/reports/sales_productsalesprofit.bs
- https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/java/com/unicenta/pos/sales/JPanelTicket.java
- https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/java/com/unicenta/pos/epm/DataLogicPresenceManagement.java
- https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/resources/com/unicenta/pos/scripts/MariaDB-create.sql
- https://repo.unicenta.org/maven2/com/unicenta/unicenta-plugins/1.3.3/unicenta-plugins-1.3.3.jar
- https://unicenta.com/community/support-forum/remote-oder-display-recall-button-not-working/
- https://unicenta.com/packages/remote-order-display-source-code/
- https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/java/com/unicenta/pos/payment/PaymentGatewayTeya.java
- https://github.com/lestola/unicenta-mirror-5.4/blob/8771d24bb67160f6b58bba4d6f3e50c950e2fac9/src/main/resources/com/unicenta/reports/epm_performance.bs