Vendors / Mobile & food truck
Addmi
Zero-monthly-fee POS plus online ordering plus event ticketing for small counter-service venues and associations, funded entirely by a small per-transaction fee passed to the guest, bundling KDS, loyalty, gift cards, email marketing and time cards at no extra charge — but it sells no hardware, publishing instead a list of exact models you must buy yourself.
scored unknown legacy rubric
- Claims in scope
- 226
- Scored
- 40
- Assessed
- 37
- Unknown
- 189
- Not applicable
- 88
- Values challenged
- 11
unknown, never as no.Identity
- Owner
- Addmi, Inc. — private US company; no parent disclosed
- Who it is for
- Food trucks, small counter-service venues, associations and event organizers wanting POS plus online ordering plus event ticketing with no software subscription
- Site
- https://www.addmi.com/
Pricing
transparency: quote-only · unit: per transaction (flat cents on POS/online, % on tickets/memberships), passed to the guest; $0 monthly per location · processor lock-in: unknown
- Software
- $0/month software. Funded by a per-transaction service fee passed to the guest: 19 cents per POS transaction, 38 cents per online order; 2% on memberships and 2% on invoicing; 3% on event ticketing capped at $39. USA and select countries only; other regions and alternative structures by quote (pricing@addmi.com).
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
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
Vendor FAQ: 'For POS, you can accept card payments, cash, and split payments across multiple methods' — splitting payment across tenders is claimed first-party. Shortfall: splitting a check by item, by seat or by even N-way, arbitrary dollar/percentage splits, and merging checks or tables (including after partial payment) are documented nowhere; the 'Orders Screen in Point of Sale' help article that would settle this appears in the archived help-centre roster but was never captured, and the live portal (addmi.freshdesk.com) returns HTTP 404. https://addmi.com/faq · retrieved 2026-08-04
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
NEW 2026-09-18 (329th): addmi.com has been REBUILT since the 310th-321st passes -- sitemap.xml now carries 2,218 URLs (1,890 tenant /b/ pages, 236 /e/ event pages, 92 non-tenant pages, all 92 fetched this pass). Two of the new pages carry the vendor's only offline statements about its OWN product. https://addmi.com/guides/food-truck-offline-pos (published 2026-08-12, live 200, 22 KB): 'Addmi keeps taking payments and stores orders locally, then syncs automatically when you are back online, so you keep selling through festival dead zones. Just know that digital wallets and QR-code payments usually still need a live connection.' and 'For a truck that wants fewer limits and its own data, Addmi offers offline mode with no monthly or per-terminal fee and automatic sync when the signal returns.' https://addmi.com/blog/festival-check-in-gate-entry-software: 'Addmi is built offline-first for exactly this reason -- the same design that lets its point of sale keep selling at a remote stall lets its check-in keep scanning at a dead-WiFi gate.' VERDICT: partial. Local order capture with automatic sync is asserted by the vendor for this product, so the claim's 'create orders' and 'keep selling' half is satisfied at grade C (vendor guide page, written to sell). SHORTFALL, three parts. (1) The last conjunct fails outright: no published offline scope exists. The vendor has NO documentation surface at all -- addmi.freshdesk.com/support/home, /support/solutions and /support/solutions/articles/65000163511 (the article the live /pricing and /contact pages still link to) all return 404 to curl with a browser UA today, and support./help./docs./developer.addmi.com do not resolve; the only offline text in the 92-page site census is marketing FAQ prose. (2) Modifiers and send-to-kitchen offline are nowhere asserted: tokenised controls over all 92 pages returned 0 hits for 'offline' within 200 chars of 'kitchen', 'modifier' or 'KDS'. (3) The vendor's own merchant dashboard CONTRADICTS the offline card half: the payment-processor picker chunk https://addmi.com/dashboard/js/6515.bd6d4fb9.js (live 200, 9.6 KB, re-fetched 2026-09-18) renders the footnote '*<span>OFFLINE</span> payment processing <span>not</span> supported' under each of the three self-serve processors it offers (Square, Stripe, PayPal -- the fourth tile is 'Other Payment Processors / Contact Us'), i.e. offline card processing is not supported on any gateway a merchant can self-onboard. POISON/CONTROLS: 'offline' occurs 438 times across the 92 pages but the overwhelming majority are competitor comparisons (Square's 24-hour cap, Toast's local-sync mode) and event check-in, not Addmi POS; the two Addmi-specific claims above are the only ones. The live anonymous OpenAPI 3.0.3 spec (api.addmi.com/api/docs/swagger-ui-init.js, 'Addmi API' v0.1.0, 6 paths: oauth2/authorize, oauth2/createToken, oauth2/refreshUsingToken, GET /menu, POST /transactions, POST /webhook) has 0 occurrences of 'offline' -- a 6-path integration API bounds nothing, recorded so nobody re-mines it. Retrieved 2026-09-18. https://addmi.com/guides/food-truck-offline-pos · retrieved 2026-09-18 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
Not scored by this record.
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
Not scored by this record.
Captures and reports drive-thru speed-of-service timers by segment (order, total, window) tied to individual orders.
order-capture-drive-thru-timers
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Established at source grade from the merchant back office's anonymously served 'frontofhouse' settings chunk. A 'ManageScheduledPickup' editor saves com.addmi.catalog.settings.scheduledPickUp.update.v1 with the payload {enabled, required, duration, rollingDays, reminderInterval, hours, prepDuration, daysOfWeek}, behind the labels 'Enable Scheduled Pick Up', 'Require Scheduled Pick Up', 'Intervals in Which Orders Can Be Scheduled' (30/45/60-minute options), 'Pick up can be scheduled over N rolling day(s)' (1-14, default 3) and 'Restrict days scheduled pick up can be done'. A separate 'scheduled-delivery' editor saves com.addmi.catalog.settings.scheduledDelivery.update.v1 with {enabled, required, dropOffTime (default 12:00:00), cutOffDuration, daysOfWeek}, exposing 'Cut off time before drop off' of 30 mins / 45 mins / 1 hr. Each fulfillment carries a dueAt timestamp -- the fulfillment info reducer is combineReducers({type, label, dueAt, notificationMethods, delivery, dineIn, pickUp, shipping, roomService, togo}) -- and the back office's Orders screen renders a 'Scheduled For' column that prints dueAt or the literal 'Immediately' when it is null. So future-dated orders and per-channel lead times both exist. Two shortfalls keep this at partial. First, the scheduled-DELIVERY editor is rendered only inside an isTestBusiness() guard reading businessInfo.testBusiness, so in production the per-channel pair is pickup-only. Second, and decisive for this claim, nothing injects a scheduled order into the make queue at a computed fire time: prepDuration appears 15 times in the settings editor and ZERO times in the domain-model bundle's fulfillment or transaction reducers, no fireTime, holdUntil or scheduledFor token exists in any served chunk, and the KDS product page still says online and POS orders are 'sent right to the KDS'. Due time is stored and displayed; it is not shown to gate when the ticket fires. https://addmi.com/dashboard/js/3666.97a35c48.js · retrieved 2026-09-15 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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Vendor publishes card-processing pricing publicly (a specific flat rate or interchange-plus markup) rather than quote-only. differentiator
payments-published-rates
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
All first-party payment terminals accept EMV chip and NFC contactless including Apple Pay and Google Pay.
payments-emv-nfc
CLAIM: all first-party payment terminals accept EMV chip and NFC contactless including Apple Pay and Google Pay. VERDICT: partial. NEW SURFACE: the vendor's own hardware list. The live pricing page https://addmi.com/pricing says 'We don't sell hardware but we can help you find the right stuff!' and 'Important Always be sure to buy the exact models listed on our Support Page', and its 'Compatible Hardware List' link points to https://addmi.freshdesk.com/support/solutions/articles/65000163511-recommended-hardware-for-addmi, which is now 404 live but archived by Wayback (captures 20240229 and 20240915; article 'Created by: Addmi Team', 'Modified on: Tue, 6 Jun, 2023'). EVIDENCE (verbatim, archived vendor help article): '3) Supported Credit Card Readers: Square Contactless and Chip Card Reader; Square Dock for Contactless and Chip Card Reader; Stripe Card Reader M2; MagTek iDynamo 6 (Contact us for more information); MagTek tDynamo (Contact us for more information)'. The served merchant dashboard bundle (addmi.com/dashboard, 310th corpus) also carries the label 'WisePad 3' (a Stripe EMV/NFC reader) in its translation tables. MET: EMV chip plus contactless is stated by the vendor for its primary supported reader (Square). SHORTFALL: (1) Addmi has no first-party terminals at all -- every reader is a third-party device the merchant buys; (2) the vendor text states chip+contactless only for the Square readers, and says nothing about the Stripe M2 or MagTek devices' contactless support; (3) Apple Pay and Google Pay are never named for in-person acceptance -- the applepay/googlePay code found in the served web bundles initialises Square web-payment wallet buttons (sqPaymenTrequest, initializeApplePay), i.e. browser checkout, not card-present. Grade B: vendor help-centre text, read via Wayback because the live KB was retired while the live pricing page still links to it. Retrieved 2026-09-16. https://web.archive.org/web/2024/https://addmi.freshdesk.com/support/solutions/articles/65000163511-recommended-hardware-for-addmi · retrieved 2026-09-16 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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Gift cards listed as included at no extra cost; cross-location balance and online-channel redemption not documented. https://www.addmi.com/pricing · retrieved 2026-08-01
A single check can be settled with multiple tenders and split by seat, by item, by even shares, or by arbitrary amount, with no hard cap below eight ways.
payments-split-tender
Not scored by this record.
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
POS page documents 'Pin code access for employees', and the vendor FAQ documents full or partial refunds from the dashboard with a Payment & Refund report in the enumerated dashboard set — refunds and PIN-scoped employee access exist. Shortfall: no page documents role-based authorization gating voids, discounts or no-sales at the terminal, and no approver-identified immutable audit log is described anywhere; the 'Roles and Users' help article visible in the archived help-centre roster was never captured and the live portal (addmi.freshdesk.com) returns HTTP 404. https://addmi.com/products/point-of-sale · retrieved 2026-08-04
In-product dispute/chargeback dashboard that lists open disputes and allows evidence submission assembled from the POS transaction record. differentiator
payments-chargeback-tooling
Not scored by this record.
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
Not scored by this record.
Vendor publishes its deposit schedule and offers a next-day or same-day/instant funding option. differentiator
payments-payout-timing
Not scored by this record.
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
Not scored by this record.
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
Routing is a first-class, merchant-authored property of the item. Addmi's published OpenAPI 3.0.3 document (inlined as swaggerDoc in the anonymous Swagger UI bootstrap) gives CatalogItem a string field initialStateID, "The initial fulfillment station of the item"; CatalogModifier carries the same field as "The ID of the initial fulfillment station for the modifier", and the transaction schemas echo it per line item (LineItemCatalogItem_catalogItem: "The ID of the initial fulfillment station of the store item") and per chosen modifier (LineItemCatalogItem_choices: "The ID of the initial fulfillment state") -- so the station travels with the ordered line, not just the menu record. The stations themselves are created and edited by the operator with no vendor involvement: the back-office SPA's 'stations' route (display 'Back of House') lazy-loads https://addmi.com/dashboard/js/9901.4bc61e90.js, fetched anonymously at HTTP 200, which renders a 'Display Station' table with 'Add Station', 'Create Fulfillment Station' / 'Edit Fulfillment Station' (field 'Station Name', maxlength 64), an 'Assign Items' action, an 'Items to Stations Assignment' table listing every catalog item under its category with checkboxes, Select All/Deselect All and 'Save and Assign Items', plus the guard 'This station cannot be deleted because it is being used in an Order Routing.' Those writes are the event-sourced actions com.addmi.catalog.fulfillmentstate.create/update/copy/delete.v1 and com.addmi.catalog.item.update.v1, whose reducer accepts initialStateID or initialStateIDs. One item may target several stations: the item and modifier reducers both hold {initialStateID, initialStateIDs, requiresExpediter}, the fulfillment aggregate holds {stateID, stateIDs, stationFulfills, requiresExpediter} and on com.addmi.catalog.fulfillment.fulfillStation.v1 completes only once every stateID in stateIDs appears in stationFulfills; the vendor's KDS page states the same behaviour in prose -- 'Double Fulfillment: One item being sent to multiple stations makes complex kitchens run smoother... it will be sent to all stations and completed individually at each station until the last station fulfills the order triggering a completed state.' Shortfalls and controls, none fatal because the claim's routing axis is disjunctive and the item leg is met outright: routing by ORDER TYPE and by REVENUE CENTER is unevidenced -- tokenised, orderType and revenue-cent* are zero across the spec, the 652 action types, the ~109 reducers and the stations chunk; category appears only as the grouping of the bulk item-assignment picker, i.e. a convenience for assigning many items, not a category-level rule; 'station' tokenises to 3 in the spec (all three inside the quoted fulfilment-station descriptions) and 0 as a bare word in the action/reducer corpora, with zero 'workstation' hits, so no substring trap. The in-app setup signpost, help article 65000166722 'order-fulfillment-stations', is dead: addmi.freshdesk.com returns 404 and the Wayback CDX for that host holds only 7 rows and two unrelated articles, so the documented setup path is the shipped UI itself rather than a published guide. Retrieved 2026-09-15. https://api.addmi.com/api/docs/swagger-ui-init.js · retrieved 2026-09-15 adversarially verified
An expo screen consolidates items from multiple prep stations into a single order view and only marks the order complete when every contributing station has bumped its items.
kitchen-expo-consolidation
KDS feature page: 'Enabling Expediter mode on your kitchen display screen allows all stations fulfillment progress to be watched through their stages until completed either by the station or the expediter' — a consolidated multi-station expo view exists. Shortfall: the completion gate the claim requires is not documented; the vendor's own wording lets 'the station or the expediter' complete an order, and no page states completion waits until every contributing station has bumped its items. https://addmi.com/products/kitchen-display-system · retrieved 2026-08-04
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
KDS supports physical bump bars or programmable keypads in addition to touchscreen interaction, with documented supported models.
kitchen-bump-bar-hardware
The vendor's supported-hardware article enumerates every supported device class — iPads for 'Point of Sale Screen; Customer Facing Screen; Kitchen Display Screen; Server Handheld', supported printers (Star mC-Print3, SP700, TSP654IISK), supported card readers (Square, Stripe M2, MagTek), tablet stands and cash drawers — and contains no bump bar or keypad in any category. The KDS is an iPad app operated by touch ('Fulfill orders or individual items'), and no bump-bar input appears anywhere else on the vendor surface. Read from the Internet Archive's 2026-02-16 snapshot (article last modified 2023-06-06); the live portal addmi.freshdesk.com returns HTTP 404 as of 2026-08-04. https://web.archive.org/web/20260216092012/https://addmi.freshdesk.com/support/solutions/articles/65000163511-recommended-hardware-for-addmi · retrieved 2026-08-04
An all-day view aggregates outstanding quantities per item (and per modifier) across all open tickets on the station.
kitchen-all-day-counts
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
KDS continues to receive and display tickets from on-site POS terminals when the internet or cloud backend is unreachable. differentiator
kitchen-offline-operation
Not scored by this record.
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
Not scored by this record.
A bumped ticket can be recalled/unbumped, and an individual item can be refired or reprinted without re-entering the order.
kitchen-recall-refire
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Waste, spoilage, and remakes can be logged directly at the kitchen/KDS screen with reason codes, and the entry depletes inventory.
kitchen-waste-logging
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Delivery, dispatch & third-party channels
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
The vendor's delivery capability is its DoorDash courier partnership: 'We are partnered with DoorDash to provide the best customer experience while keeping things simple for your business', and the enumerated behaviour is that delivery orders 'are displayed in your POS', 'respect your inventory settings' and 'are displayed in your reports'. Drivers are DoorDash's, not the operator's — no driver roster, driver availability, dispatch/expo screen or multi-order run batching exists anywhere on the vendor surface, and the only delivery article in the archived help-centre roster is 'DoorDash Delivery Support'. https://addmi.com/products/online-ordering · retrieved 2026-08-04
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Online ordering included with a flat 38-cent fee passed to the guest, so no percentage marketplace commission to the operator; branded-domain support not documented. https://www.addmi.com/pricing · retrieved 2026-08-01
Vendor offers a branded native iOS and Android ordering app (published under the restaurant's own brand in the App Store/Play Store), not only a mobile web page or a shared multi-restaurant marketplace app. differentiator
digital-native-app
Not scored by this record.
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
One-tap reorder of a previous order IS shipped in the first-party web ordering client, and a tokenized card IS stored for membership subscriptions, but there is no guest account and no saved-address book. Evidence is the vendor's own served ordering client. Its webpack runtime (a2e5a56.modern.js) enumerates 242 lazy chunks; all 242 were fetched anonymously (7.41 MB) and censused. REORDER (met): the store page component (chunk 493f037) calls getPurchasedCarts({businessID}) -> POST /api/carts/getPurchasedCarts and passes purchased-carts into the cart component; chunk eef1b4f computes mostRecentCart, raises an overlay on mount when a purchased cart exists and the active cart is empty, screens items with isItemUnavailable against current listings, and dispatches createCartFromPurchasedCart({purchasedCartID, currentCartID, fulfillmentMethod}) -> POST /api/carts/createCartFromPurchasedCart; chunk 9b29a63 renders the purchased-cart list with per-cart reorder. Four chunks (6439209, 8ef3d1a, a493f7b, 37277c2) render a $gettext("Order again")/"Order Again" button bound to orderAgainRoute on the receipt/feedback pages, and the cart error dictionary carries cart.unableToReorder = "One or more items cannot be reordered automatically". SAVED PAYMENT (met, but only for memberships): chunk d342db2 holds savedPaymentMethod state set from the POST /api/verifyCode response ({savedPaymentMethod}, keyed by membershipID/paymentSubscriptionID) and renders the payment form only when loadPaymentForm && savedPaymentMethod; chunk 1da9371 ships the com.addmi.paymentmethod.create/update/delete.v1 entity with {type: PaymentMethodType.card, card, merchantID, listID} inside the guest app itself; the eager bundle's gateway component branches on a Stripe SetupIntent (submit() tests clientSecret.indexOf("seti_") and calls stripe.confirmSetup), which is Stripe's store-a-card-for-later primitive, and the public client posts /api/updateMembershipPayment and /api/reactivateMembership against paymentSubscriptionID. SHORTFALLS: (1) there is NO guest account -- no guest registration, password or session credential anywhere in the 242-chunk census; purchased carts are resolved server-side from the anonymous /api/session/ensureSession cookie plus businessID, and identity for memberships is a one-time emailed code (sendVerificationCode/verifyCode), not a login. The vendor states the model on its online-ordering page: 'Customers do not need to create an account to order.' (2) saved ADDRESSES are absent: savedAddress and addressBook tokenise to ZERO across all 242 chunks, and a delivery place is entered per order via setFulfillmentInfo. (3) the stored card is evidenced only for membership/subscription auto-renewal, not for the ordering checkout, where the Square path tokenizes a per-transaction card_nonce with no store-for-later call. TWO GATEWAYS, not one: the client ships BOTH Square Web Payments (web.squarecdn.com/v1/square.js; card, applePay, googlePay, cashAppPay, masterpass, secureremotecommerce) and Stripe Elements, selected by gateway.config -- gatewayToken is a wrapper that carries a Square card_nonce, a Stripe paymentIntent OR a Stripe setupIntent, so it is not per se a per-transaction nonce. POISON: 'reorder' as a token is worthless here -- 48 of 242 chunks match it and nearly all are drag-and-drop list reordering; the vendor's vocabulary is purchasedCart and 'Order again'. 'vault' matches only the image file img/vault-stability-addmi-pos-480.jpeg ($gettext 'Addmi POS vault'). 'signIn'/'signing' in the lazy chunks is blog prose ('before signing') and the ToS phrase 'signing up for an Addmi account', which is the MERCHANT account. In the eager bundle all 22 'login' hits are merchant-side (ActionBusinessAccountLogin, ActionVenueAccountLogin, LoginMethod enum of DashboardPassword/PosPassword/PosSessionResume/PosPIN/PosScan, and a nav Login button to /dashboard/auth/). https://addmi.com/_nuxt/9442fe0.modern.js · retrieved 2026-09-15 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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Supports AI voice ordering at the drive-thru lane, integrated with the POS menu/modifiers and with escalation-to-human handoff.
digital-drivethru-ai
Not scored by this record.
Supports conversational SMS or chat ordering/reordering (text-to-order or text-a-link) that lands in the POS.
digital-sms-ordering
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Addmi keeps one guest entity that spans its channels, resolves the loyalty wallet by phone or email, and ships a duplicate-merge -- but the merge is email-only, operator-initiated, and does not fold point balances. The back office carries a Contacts module ('Contacts -- View and manage CRM') over a BusinessContact {id, businessID, entityID, address1, address2, city, company, custom, email, firstName, lastName, occupation, phone, state, zip, notes, -validation, created, updated, deleted}, and a loyalty point wallet {id, businessID, businessContactID, ownerName, ownerEmail, ownerPhone, points, timeOptedOut, created, deleted, updated} keyed to that contact, folded by com.addmi.catalog.loyalty.pointwallet.{addPoints,deductPoints,redeemPoints,optOut}.v1. IDENTITY RESOLUTION IS PHONE-OR-EMAIL: the contact-details loyalty panel (dashboard chunk 4350) resolves the wallet through a server-side GraphQL resolver -- query pointWallet($businessEntityID: ID!, $businessContactEntityID: ID!, $email: String, $phone: String) { pointWallet: catalogLoyaltyPointWalletForBusinessContact(businessEntityID, businessContactEntityID, email, phone) { id points } } -- i.e. the wallet is matched to a guest by contact entity PLUS email PLUS phone, and a new wallet id is minted only when that lookup misses. CROSS-CHANNEL: the same wallet is exercised from the first-party web ordering client, which posts /api/carts/applyLoyaltyRewardToCart {authors, cartID, businessID, rewardID, pointWalletID} and /api/carts/optOutOfLoyalty and holds loyaltyPoints in cart state (https://addmi.com/_nuxt/9442fe0.modern.js and its 8e00c83 sibling), so a web order and a register order accrue to one wallet rather than to per-channel records; the shared transaction event model carries ACTION_REF_SET_WALLET_ID(walletID) and ACTION_REF_SET_LOYALTY_INFORMATION next to Ref.purchaseApp, 'The source from which this transaction originates from'. DEDUP: the Contacts chunk https://addmi.com/dashboard/js/2185.45dd815c.js ships a 'Merge Duplicate Customers' modal ('There are %{contacts} customers with duplicate data') over a server-side query getDuplicates -> duplicateBusinessContacts(businessEntityID). SHORTFALLS: (1) that dedup matches on EMAIL ONLY -- the client groups on email.trim().toLowerCase() and the duplicate query selects {id, entityID, businessEntityID, firstName, lastName, email, count, updated{ms}, groupAssignments{id, businessContactGroupID}} with no phone field -- so phone-only guests are deduped by nothing, even though wallet LOOKUP does take phone; (2) the merge is OPERATOR-INITIATED, not automatic: an admin opens the modal and clicks Merge, and the survivor is just the record with the greatest updated.ms; (3) mergeDuplicates re-points businessContactGroupID list memberships onto the survivor and deletes the rest via batchActions, but chunk 2185 contains ZERO occurrences of wallet, pointWallet, loyalt or transaction, so point balances are not folded and transaction history is not re-pointed; (4) kiosk is not a channel Addmi sells -- across a COMPLETE census of all 454 lazy dashboard chunks (19.8 MB), the guest ordering client and every marketing page, 'kiosk' and 'Kiosk' tokenise to ZERO, as do self-serve, self-service, unattended and tablet ordering, so 'spanning channels' here means POS plus web store and QR dine-in. METHOD: this dedup is invisible to an action-type census -- it defines no new com.addmi.*.v1 action but composes existing primitives (deleteBusinessContactGroupAssignment, contact delete, group-assignment create) through batchActions. CONTROLS/POISON: over all 454 chunks, 'duplicateBusinessContacts' and 'mergeDuplicates' occur in exactly ONE chunk (2185), and 'dedup' and 'byPhone' are zero; the 34 other files matching 'merge' are library boilerplate -- chunk 3959's 30 hits are SheetJS XLSX cell merges (mergeCell, !merges), and chunk-vendors' 40 are v-calendar popover, Firebase RTDB merge(), vee-validate _merge and vue-i18n mergeLocaleMessage, with 'duplicate' there being vue-router 'duplicated' navigation and Firebase 'duplicate-app'. com.addmi.business.contact.convert.v1 is NOT a guest merge but the uniform event-sourcing snapshot primitive every entity carries. https://addmi.com/dashboard/js/chunk-vendors.08aeeb98.js · retrieved 2026-09-15 adversarially verified
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
Not scored by this record.
Supports at least two of points-per-dollar, visit/punch-count, and spend-tier accrual as configuration, without custom development or a bolt-on loyalty vendor.
guest-loyalty-accrual-models
Loyalty is a first-party included feature at no extra cost; supported accrual models are not documented. https://www.addmi.com/pricing · retrieved 2026-08-01
Documents explicitly what loyalty lookup, accrual, and redemption do when the POS loses connectivity (queue-and-reconcile vs blocked). differentiator
guest-loyalty-offline-behavior
Not scored by this record.
Offer/discount engine exposes explicit stacking and precedence rules (exclusive vs combinable, order of application) as configuration. differentiator
guest-loyalty-offer-stacking-rules
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Addmi ships two of the claim's three named lifecycle triggers as always-on, operator-toggled automations, but neither is delivered as a configurable campaign and the third is absent. LAPSED WIN-BACK: the merchant back office's Email Campaigns screen (route {path:'email', name:'marketing', modules:['marketing']}, lazy chunk 2834 via the webpack hash map in index.b265f90a.js) renders a block headed 'Automated Email Marketing' whose ONLY control is a single checkbox (id 'return-notif', v-model returnNotificationsInput) labelled verbatim 'Notify customers that have not visited your place in 30 days'. That is an always-on recurring send, not a one-off blast, and it is the exact win-back automation the claim names -- but the 30-day window is hard-coded into the label, there is no audience, content, offer or cadence control on it, and the surrounding screen gates sending behind a paid tier ('You must subscribe to Email Marketing to use this service', 'You have exceeded your free limit'). BIRTHDAY: the membership level editor (routes 'level/create'/'level/:levelId', chunk 9412) ships a 'Free 1 item on birthday' checkbox (birthdayItemChecked) with an 'Apply Items' catalog picker (itemIDsForBirthday), alongside 'Free item' (numAllowedFreeItems + freeItemsOccurrences, placeholder '0 or blank for indefinite') and 'Award gift card' (awardGiftCardChecked). The level's own GraphQL query confirms the persisted model: settings { freeBirthdayItem { active itemIDs } freeItems { active numAllowed itemIDs occurrences } giftCard { active amount { amount currency } occurrences } }, and the member form carries dateOfBirth as a first-class predefined field (chunks 932/5948, 'D.O.B.'). So a birthday reward is real and configurable -- but it is an ENTITLEMENT attached to a paid membership LEVEL, granted at redemption, not a triggered campaign or message, and it reaches only enrolled members of that level. SHORTFALL, the reason this is partial and not yes: (1) first-visit thank-you does not exist -- 'firstVisit' tokenises to ZERO across the whole 456-file back office and the 'Automated Email Marketing' block contains no second toggle; (2) the win-back automation is a single fixed-window on/off switch with no configurability; (3) the birthday reward is a membership-level perk rather than a campaign, so neither trigger is authorable as a campaign -- the campaign builder itself (campaignobjective/campaignaudience/campaigndesign/campaignreview, chunks 4265/1329/8056/7926) is MANUAL-SEND only, offering 'Send Now', 'Save as Draft' and 'Next' with no trigger or schedule entity. VENDOR CLAIM RECONCILED: addmi.com/features states under Membership Management 'Free items on birthdays or visit milestones'; the birthday half is confirmed in shipped source, while the 'visit milestones' half is NOT implemented as a visit trigger -- the nearest shipped mechanisms are freeItems.numAllowed/occurrences (a per-plan entitlement count, not visit-driven) and the loyalty earn rule whose type enum is exactly {amountSpent, Visit} rendering '%{points} per visit' / '%{points} per visit with %{amount} min' (chunk 2785), i.e. points accrual toward a redeem rule, not a milestone automation. CONTROLS AND POISON: this note rests on an exhaustive census -- all 454 lazy chunks named in the index bundle's webpack hash map were fetched (454/454 at HTTP 200, 21.5 MB) and searched with tokenised, not substring, controls. 'birthday' is 34 tokenised hits (102 raw) and is REAL, not locale noise: 14 hits are translated dictionaries of the same 'Free 1 item on birthday' string and the live control sits in chunk 9412. 'milestone' tokenises to ZERO (12 raw hits are all the plural 'milestones'), and every one of those 12 is POISON: they live in chunk 9417, route 'adminactivationfunnel' with meta {auth:true, admin:true}, which is ADDMI'S OWN INTERNAL merchant-acquisition CRM -- 'Every signup and where they stand ... its stage, milestones, drip status, revenue', 'Signups to real revenue', 'Addmi revenue (our cut)' -- tracking BUSINESSES, not guests, so its 'Drip'/'Milestones' timeline is not a merchant-facing tool. 'lapsed' (0 tokenised, 17 raw = 'collapsed'/'handleDelayElapsed'), 'winback', 'win-back', 'anniversary', 'birthdays', 'dormant', 'reengage' and 'autoSend' all tokenise to ZERO -- and on this corpus those zeros prove nothing about the capability, because Addmi's own vocabulary for the feature is the sentence 'have not visited your place in 30 days'. 'dob' is 10 tokenised of 100 raw (the rest are 'Cordoba'/'addObserver'); 'automated' is 88 tokenised but almost all locale-dictionary entries, the load-bearing English instance being the 'Automated Email Marketing' heading in chunk 2834; 'trigger' is 38 tokenised and is entirely Vue/jQuery render internals ($(...).trigger('reflow')). SCOPE: this corpus is the merchant BACK OFFICE bundle; the Addmi POS is a separate native app, so these findings bound what the back office configures, not the whole product. https://addmi.com/dashboard/js/index.b265f90a.js · retrieved 2026-09-15 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
Not scored by this record.
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
Not scored by this record.
Handles or explicitly documents A2P 10DLC brand and campaign registration required for the operator to send SMS through the platform.
guest-loyalty-10dlc-registration
Not scored by this record.
Reports redemption and incremental sales attributable to a specific campaign or offer, tying redeemed offers to actual check totals. differentiator
guest-loyalty-campaign-attribution
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
'Time Cards' listed as an included feature; PIN/badge mechanics and whether clock-in happens at the terminal are not documented. https://www.addmi.com/pricing · retrieved 2026-08-01
Captures a photo at punch (or performs facial verification) attached to the timecard entry, with a photo-only mode available that stores no biometric template. differentiator
labor-photo-punch-verification
Not scored by this record.
Supports mobile clock-in restricted by geofence or location validation for staff who do not punch at a fixed terminal.
labor-geofenced-mobile-punch
Not scored by this record.
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
Not scored by this record.
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
Resolved to partial off the merchant dashboard's role-editor chunk, served anonymously (no source maps on this host). Roles are operator-authored rather than fixed tiers: the routes 'role/create' (display 'Create a Role') and 'role/:roleId' both sit under meta.modules ['accessControl'] and are backed by ActionRoleModule Create/Update/Delete/Copy ('com.addmi.rolemodule.*.v1'); the role entity reduces to {id, businessID, name, display, backEndModules, frontEndModules, posModules, allBackEndModules, allFrontEndModules, allPOSModules} and the editor renders a checkbox per permission with select-all toggles. The POS grant surface is a closed 14-value enum, each entry a discrete labelled action: 'Access to Sales Activity / Payments' (viewSalesActivity), 'Apply Discounts and Comps' (applyDiscounts, desc 'Allow users to apply discount and comps'), 'Delete or Void Submitted Orders' (voidOrders), 'Issue Refunds' (issueRefunds), 'Manage Tills & Open Cash Drawers' (manageTills, desc 'Allow users to manage tills and open cash register. Override only for opening cash drawer.'), 'Manage All Open Tickets' (closeOpenTickets), 'View Reports' (viewReports), 'Settle All Payments Awaiting Tip' (settleTips), 'Manage Settings in the POS' (manageSettings), 'Correct Orders in the POS' (orderCorrection, desc 'move items, change server, and move checks on an order'), 'Adjust Payments' (paymentAdjustment, desc 'adjust nontip amount, move payment to another order, or completely void the payment'), 'Adjust Shift Reviews' (serverShiftReviewAdjustment), 'Re-Open Completed Order' (reopenCompletedOrder) and 'Adjust Time Cards' (timeCardAdjustment) — alongside a 14-value BackEndModules enum (accessControl, business, users, catalog, admission, events, invoices, membership, marketing, subscriptions, transactions, fundraising, reports, contacts) and a 3-value FrontEndModules enum. These are enforced gates rather than labels: four of the fourteen descriptions end 'Users with no permission need manager Override.' Six of the seven actions the claim enumerates are therefore individually grantable — void, comp, discount, refund, drawer open and report access. SHORTFALL, two parts. (1) There is no price-change permission anywhere in the closed enum — the token 'price' tokenises to zero occurrences in the role-editor chunk, and the nearest neighbours are explicitly something else (orderCorrection is moving items/servers/checks, paymentAdjustment is the tendered amount) — so item price override cannot be granted or withheld as its own right. (2) The claim's per-location half is absent: the role carries businessID only, a businessaccount row carries a single 'role' field scoped to one businessID, and no store/location entity exists among the 652 back-office action types, so a multi-location operator re-authors roles per business rather than scoping one role matrix across locations. Granularity is also coarser than the claim's list in two places — comp is not separable from discount, and opening the cash drawer is not separable from till management, though the latter carries its own manager-override path. BOUND: the enum is hardcoded in the role editor and is closed over the only served surface on which roles are authored, so it bounds what an operator can GRANT; the POS itself is a native app (com.addmi.pos) outside this corpus, so the price-change gap is not asserted as a product-wide absence of any price gate. CONTROL: 'permissions' occurs 340 times in the 3.5 MB vendor chunk and all 340 are Apache-licence boilerplate ('governing permissions and limitations under the License') — re-measured this pass at 340/340, zero evidential hits. This cell claims nothing about who approved an override or whether approvals are queryable; labor-manager-override-audit remains unknown. https://addmi.com/dashboard/js/8017.60d73dbb.js · retrieved 2026-09-15 adversarially verified
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
NEW 2026-09-17: the retired Freshdesk home (Wayback 20240915075248, 94 article links) lists "Roles and Users" (65000168599-roles-and-users), its Spanish twin 65000181348-roles-y-usuarios, and "Time Cards" (65000168862). Wayback id_ fetches of 65000168599-roles-and-users (2023 and 2024) return the not-archived 404 page; CDX for addmi.freshdesk.com/support/solutions* lists only 65000163511 and 65000182851. The lead cannot be read. crt.sh for addmi.com (22 names) probed at / and /swagger, /swagger/index.html, /api-docs, /openapi.json, /docs, /v3/api-docs, /robots.txt and a nonsense path: api.addmi.com 404 everywhere, auth 404, biz 301 -> addmi.com, tprox 307 -> addmi.com, onboarding/eks-elb 400, file.addmi.com 403 (S3), stage/ops-*/vpn/tschnepp no response. Two LISTABLE S3 buckets: iab.addmi.com (IsTruncated=true; hashed per-business image uploads, no documents) and image.addmi.com (185 keys, complete: brand icons, distributor/reseller agreement PDFs, addmi-onesheet-foodtruck-2023.pdf, case-study-Fatwood-BBQ--Addmi.pdf, clubexpress onesheet). App Store lookup (artist of id1187349472): only "Addmi Point of Sale" com.addmi.addmi-pos 1.5.9 and "Addmi Ticketing"; no DS/KDS listing; no com.addmi.* on Google Play (404). None of these mentions override, approval or audit. Retrieved 2026-09-17. || 329th: NEW 2026-09-18 (329th): the operator-QUERYABLE surface was censused for the first time and holds no approver attribution anywhere. The 202 GraphQL documents embedded in the 454-chunk merchant-dashboard bundle set were extracted and searched: zero fields named approvedBy, authorizedBy, overrideBy, performedBy, actorID or manager* exist in any of them; the only 'override' fields are commercial or catalog ones (priceOverride on memberships, modifierOverrides, ticketOverrides, locationDeliveryOverrides, businessClientsWithFeeRulesOverride) and 'approvalInfo { accepted rejected autoRejectAt }' is ONLINE-ORDER acceptance, matching the action types com.addmi.transaction.detail.approvalinfo.ACCEPT/REJECT/AUTO_REJECT.v1 -- a homonym of manager approval, named here so it is not re-mined. The two reports where an override would surface enumerate their own columns and neither carries an operator: discountItemsReport rows are {appliedCount, payerFirstName, payerLastName, payerEmail, moneyEffectivePaidAmount, discountEntityID, discountName, discountAmount, currency} (https://addmi.com/dashboard/js/1813.d9d9e222.js, live 200, 14.4 KB, re-fetched 2026-09-18), and the paginated transactions report attributes an order to the SERVER who owns it ({serverEntityID, serverNameGiven, serverNameFamily, serverName, voided{iso}, countItemsVoided, countItemsDeleted}) -- i.e. the void is timestamped and tied to the ticket's server, never to the manager who authorised it. 'audit' occurs 0 times in the dashboard's complete 4,827-key English string table (no audit-log or activity-trail screen; the 16 'Activity' keys are sales activity and email-marketing activity), and the live 6-path Addmi API spec has 0 'audit'. Per-employee attribution of the authenticator does exist in principle -- businessAccount carries {employeeID, pinCode, scanToken, lastAccess} per person, so override PINs are individual rather than one shared manager PIN. HELD unknown: the four override-gated permissions live in the native POS app (com.addmi.addmi-pos), which no corpus covers, so whether the app records and exposes the approving manager cannot be determined; what is now established is that nothing in the back office lets an operator query it. Retrieved 2026-09-18. 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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Enforces minor-labor restrictions (age-based maximum hours, prohibited time windows, school-day limits) at both scheduling and clock-in.
labor-minor-labor-rules
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Addmi tracks stock per SELLABLE VARIANT, so there is no ingredient layer for a recipe to be built from. The published OpenAPI 3.0.3 spec states it verbatim: Inventory.id is 'The inventory ID. This ID is the same as the item variant which this inventory applies to', and the schema is closed at {id, track, stateQuantities}, with Inventory_stateQuantities closed at {inStock}. The merchant back office agrees and is equally closed: the inventory action set is exactly SIX (com.addmi.inventory .create/.delete/.adjustment/.physicalCount/.setThreshold/.updateTracking, all .v1), the Inventory reducer folds {entityID, businessID, unit, stateQuantities, customQuantities, track, threshold, thresholdCrossed, created, deleted, updated}, its stateQuantities sub-reducer is closed at {inStock, hold, sold, returnedByCustomer, soldOnline, orderedFromVendor, receivedFromVendor, inTransitTo, waste, unlinkedReturn, custom}, and the adjustment-reason dropdown is a closed list of {received, restock, damage, loss, theft, recount}. Both conjuncts of the claim fail: there is no component/BOM link of any kind (buildsFrom, madeFrom, portionSize, batchSize, subitem, linkedInventory, inventoryLink and depletes all tokenise to zero across every fetched bundle), and nothing recalculates. CORRECTION TO THE PRIOR RATIONALE: it is NOT true that Addmi has 'no cost field at all'. A cost field exists, but on the sellable variant rather than on inventory -- the CatalogItemVariant reducer is {id, businessID, itemID, name, display, sku, price, order, ggleapSeconds, ggleapBalance, options, eightySix, productionCost, created, deleted, updated}, and the item editor (chunk 2317, routes storeItemEdit/storeItemNew) renders productionCost as an input-money labelled 'Cost' with a productionCostOverride. That is a single flat number an operator types per variant -- a manually maintained unit cost, not a plate cost rolled up from components, and it is exactly the spreadsheet-maintained figure this claim asks the POS to replace. The cost field is unpublished: productionCost tokenises to ZERO in the OpenAPI document. CENSUS BOUND TO THE PUBLISHER'S OWN MANIFEST, NOT TO WHAT HAPPENED TO LOAD: the action-type list alone would NOT be a safe census -- lazy chunks demonstrably introduce novel action types, since chunk 8017 carries four com.addmi.rolemodule.* types found in neither the eager vendor chunk nor actions.txt. The zero is instead bound to the eager Vue router table, a complete manifest of all 454 lazy chunks, which names exactly two inventory routes (storeInventory, admissionInventory) and no recipe, ingredient, prep or costing route; storeInventory resolves to n.e(6627) and storeItemEdit/storeItemNew to n.e(2317), and both chunks were fetched and read. A 384-entry gettext label census over those fetched inventory and item screens yields the complete merchant inventory vocabulary -- Track Inventory, Add/Remove Stock, Restock, Restock Return, Stock Received, Recount, Inventory Re-Count, Current Stock, Out of Stock / 86, Inventory Low Alert, Threshold crossed, Quick Modify Inventory, Adjust Inventory, Cost -- and contains zero instances of recipe, ingredient, yield, prep, theoretical, variance, batch or portion. CONTROLS/POISON, run tokenised over every corpus the verdict leans on: 'bom' returns 62 hits that are 100% POISON (bombs, bomb, shitsbomb, brbom, autobom, bomedpn and other minified garbage) with not one bill-of-materials sense; 'yield' returns 76 hits that are ALL the JavaScript keyword (71 yield, 4 shouldYield, 1 yields); 'recipe' returns 2 hits and BOTH are inside swagger-ui's bundled ICANN TLD list ('...oldnavy|organic|philips|recipes|rentals|reviews...'), i.e. third-party library data, not Addmi content; 'component' returns 1859 hits that are all Vue/React framework symbols; 'consumes' returns 36 hits that are all the OpenAPI keyword inside swagger-ui-bundle.js. CONTRARY VENDOR CLAIM, DISCLOSED: Addmi's own App Store listing for Addmi Point of Sale (id 1499904685) reads 'Inventory Control: Stay on top of ingredients and supplies with automated alerts and reporting, so you're never caught off guard' -- the only use of the word 'ingredients' anywhere in the corpus. It is marketing prose that maps onto the shipped low-stock threshold alerting and inventory reports, and it asserts no recipe, no sub-recipe and no cost rollup; it does not disturb the no. The vendor's features page claims only 'Inventory reports', and the partners page lists MarketMan, indicating ingredient-level control is delegated to a third party rather than native. https://addmi.com/dashboard/js/chunk-vendors.08aeeb98.js · retrieved 2026-09-15 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
Addmi's inventory model has no unit-of-measure layer at all: an inventory record carries exactly ONE unit, and the merchant cannot even set it. In the eagerly-loaded dashboard vendor chunk the inventory entity folds as combineReducers({entityID, businessID, unit, stateQuantities, customQuantities, track, threshold, thresholdCrossed, created, deleted, updated}); the unit reducer defaults to the literal string 'Unit', is assigned only on creation (case ActionInventoryCreate: return t.unit), and on both other paths merely asserts consistency against the stored value -- case ActionInventoryPhysicalCount: return o(e, t.count.unit), e and case ActionInventoryAdjustment: return o(e, t.adjustment.unit), e -- where o() throws Error('can not modify quantity with different unit!') with code 'inventory.badUnit', status 400. That is the exact inverse of a conversion: counts and adjustments must arrive in the SAME unit, and mixing units is a 400 error. At the application layer the field is not even a variable: the item editor (dashboard chunk 2317.91c99334.js, 138 KB, reached from routes storeItemNew and storeItemEdit) hard-codes unit:"Unit" as a string literal in every action it emits -- createInventory(this.authors, '/<variantID>', this.businessID, "Unit", t.track) and every adjustment {from, to, scalar, unit:"Unit", reason} -- and the CSV item importer (chunk 8400.ea0f687f.js, route storeItemCSV, 'Item Upload / CSV Template / CSV Upload') does the same, with template columns Category, Description and Regular (price) and no unit, case or pack column. The merchant-facing inventory UI is a track toggle plus a quantity: 'Track Inventory', 'Current Stock', 'Add Stock', 'Remove Stock', 'Inventory Low Alert', 'Alert At', and a CLOSED adjustment-reason dropdown of five -- Stock Received, Restock Return, Damage, Theft, Inventory Re-Count. There is no purchase/recipe/count unit, no conversion factor and no yield percentage anywhere. 'waste' exists but is a QUANTITY BUCKET in stateQuantities alongside inStock, hold, sold, returnedByCustomer, soldOnline, orderedFromVendor, receivedFromVendor, inTransitTo, unlinkedReturn and custom -- damage/theft/loss move scalars from inStock to waste -- i.e. a count of wasted stock, never a yield percentage applied to a raw-to-usable conversion. The published OpenAPI 3.0.3 spec (api.addmi.com/api/docs/swagger-ui-init.js) exposes even less: Inventory is closed at {id, track, stateQuantities}, and Inventory_stateQuantities at {inStock}. The Inventory Stock report (chunk 8821.b0729a55.js, GraphQL query AddmiDashboardInventoryAdjustmentReport -> businessInventoryAdjustReport) renders columns Date/Time, Employee, Item/Variant Name, Category, Reason, Stock -- no unit column. CENSUS: the zero is bound to the whole inventory module, not to a convenience sample. I resolved the Vue router's lazy-chunk map and fetched every previously-unfetched inventory-bearing chunk -- 6627 (storeInventory), 8400 (storeItemCSV), 2317 (storeItemNew/storeItemEdit), 4550 (storeItems), 3700 (reports--inventory), 8821 (reports--inventory--stock), 1861 (admissionInventory) and the shared 2055/3663/7583/8440 -- and uom, unitOfMeasure, conversionFactor, purchase/recipe/count/base/stock unit, caseSize/packSize/perCase/unitsPerCase, yield, recipe and ingredient tokenise to ZERO in all of them, as they do in the published spec. CONTROLS/POISON: EVERY control was re-run over EVERY corpus including the 3.5 MB bundle, and four of them are traps. 'unit' is 75 hits in the vendor chunk and only 6 are real: the rest are date-fns/moment TIME units (ordinalNumber({unit:'year'|'quarter'|'month'|'week'|'hour'})) and the ISO 4217 currency table, where 'Bond Markets Unit European Composite Unit (EURCO)', 'ADB Unit of Account' and minorUnit are money, not measure -- and in the dashboard app chunk all 6 hits are the word 'United'. 'conversion' is 113 hits in the vendor chunk and 113 in the guest bundle, and EVERY ONE is the lead-to-customer payload key of ActionAccountConvert / ActionBusinessContactConvert / ActionResellerConvert (t.conversion), never unit conversion -- the proposer tested this control only against the spec, and testing it against the bundle was the single most likely way to overturn this cell. 'yield' is the JS reserved-word list in the vendor chunk and generator syntax in the guest bundle; 'pound' is 12 currency names (Egyptian, Sudanese, Sterling); 'portion' is the accounting.js MIT licence header; 'shrinkage' is CSS flex-shrink; 'case' is 5,017 switch statements. Tokenised, the real count is zero. https://addmi.com/dashboard/js/chunk-vendors.08aeeb98.js · retrieved 2026-09-15 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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Addmi has no inventory counting MODE of any kind: counting is one reason code on a single-item quantity edit. The merchant dashboard's item editor (lazy chunk 2317.91c99334.js, 138 KB, routes storeItemNew/storeItemEdit) renders a CLOSED adjustment-reason dropdown whose last option is 'Inventory Re-Count' (value "recount"); selecting it relabels the single numeric input from 'Add Stock'/'Remove Stock' to 'Current Stock', replaces the running math helper '%{currentStock} + %{delta} = %{result}' with the transient hint 'Previously %{currentStock}', and emits com.addmi.inventory.physicalCount.v1 for that ONE item variant with {scalar: <typed figure>, unit: "Unit"}. The reducer in the eagerly-loaded vendor chunk confirms the semantics: case i.ActionInventoryPhysicalCount: return a(0, t.count.scalar) -- inStock is REPLACED by the typed figure -- against case i.ActionInventoryAdjustment: return a(e, s("inStock", t.adjustment)), which applies a signed delta across named state buckets. That is absolute quantity editing, not a count: there is no count session, count sheet, count subset, schedule, cadence or due-date object anywhere. The inventory domain is closed at six actions -- create, delete, adjustment, physicalCount, setThreshold, updateTracking -- declared together in the shared action module (t.ActionInventoryPhysicalCount="com.addmi.inventory.physicalCount.v1" etc.), and the inventory entity folds as combineReducers({entityID, businessID, unit, stateQuantities, customQuantities, track, threshold, thresholdCrossed, created, deleted, updated}). The dashboard's own storeInventory route is an UNIMPLEMENTED STUB: chunk 6627.5c7f9981.js is 414 bytes rendering only <div class="inventory"><h1>{{$route.name}}</h1></div>. HISTORY -- the one conjunct that partly holds: counts are not overwritten. The Inventory > Stock report (route reports--inventory--stock, chunk 8821.b0729a55.js) runs GraphQL query AddmiDashboardInventoryAdjustmentReport -> businessInventoryAdjustReport(businessEntityID, start, end) selecting {time{iso}, variantOptions, accountEntityID, accountNameGiven, accountNameFamily, catalogCategoryName, catalogItemName, catalogItemVariantName, adjustFrom, adjustTo, adjustScalar, adjustUnit, adjustReason}, rendered over a merchant-chosen date range as columns Date/Time, Employee, Item/Variant Name, Category, Reason, Stock, with reasonMap {received:'Received', restock:'Restock', damage:'Damange'[sic], theft:'Theft', loss:'Loss', recount:'Recount'}. Every re-count is therefore a separate timestamped, employee-attributed row. But there is NO VARIANCE: the row carries the new absolute figure and the reason, never expected-vs-counted; a physicalCount action carries no from/to at all, so adjustFrom/adjustTo are empty on precisely the recount rows; and variance, discrepanc, overage and shortage tokenise to ZERO across 55 corpora / 12.8 MB. The only 'Previously N' is a live hint in the edit form, not a stored or reported figure. The published OpenAPI 3.0.3 spec exposes even less: Inventory is closed at {id, track, stateQuantities}, Inventory_stateQuantities at {inStock}, and none of its six paths (/oauth2/authorize, /oauth2/createToken, /oauth2/refreshUsingToken, /menu, /transactions, /webhook) is a count endpoint. CENSUS: the zero is bound to the whole inventory module, not a sample -- the Vue router's lazy-chunk map was resolved and every inventory-bearing chunk fetched: 6627 (storeInventory), 8400 (storeItemCSV), 2317 (storeItemNew/storeItemEdit), 4550 (storeItems), 3700 (reports--inventory), 8821 (reports--inventory--stock), 1861 (admissionInventory) and the shared 2055/3663/7583/8440. CONTROLS/POISON: cycleCount, spotCount, 'count sheet', stocktake, cadence, parLevel, countSession, 'count history' and 'audit trail' are zero in every corpus; the surviving near-misses are ALL traps. 'cycle' is NOT zero in the 3.5 MB vendor bundle that this citation names (3 tokens, 7 substrings), but every hit is plumbing: Firebase 'object contains a cycle', 'Promise-chain cycle', JSON '__cycle__', json-stable-stringify's cycles option, Intl hourCycle and Vue _lifecycleHooks. 'schedul' is 42 hits of Firebase token-refresh and reconnect schedulers, Firestore gcScheduler/indexBackfillerScheduler, Apollo scheduleQueueConsumption, and the ordering features scheduledPickUp/scheduledDelivery -- never inventory scheduling. 'recurring' is recurringDonationOptions/allowRecurringDonations (fundraising); 'frequency' is PostFrequency {daily, weekly, monthly} (social posting); 'weekly' is labour RuleType.weeklyHours. 'onHand' matches onHandleClick and 'sheet' matches the xlsx worksheet-table component -- both inside the stock report itself, the two places a careless search would manufacture a false positive. https://addmi.com/dashboard/js/chunk-vendors.08aeeb98.js · retrieved 2026-09-15 adversarially verified
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Provides a structured waste/spoilage logging workflow with reason codes that debits inventory and reports waste cost separately from usage variance.
inventory-waste-logging
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
KDS feature page: 'Access reports such as Sales, Labor, Payment & Refund, Transactions, Discounts, and Loyalty' and 'Reports are available on your Addmi dashboard and can be accessed from anywhere with an internet connection' — an off-premise cloud dashboard exists. Shortfalls: refresh latency is undocumented (no live/real-time claim anywhere, only 'historical reports' on the quick-serve page), and the vendor's own /app page lists no owner/manager mobile app — only Ticketing and POS apps — so off-premise mobile access is browser-only. https://addmi.com/products/kitchen-display-system · retrieved 2026-08-04
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
POS page lists 'Till and end of day features' and documents a 'Server Shift Close Out' in which servers 'have restricted view of their assigned transactions and daily tips only and are required to settle lingering orders before clocking out' — an end-of-day/close-out process exists. Shortfall: the contents of the close-out are undocumented; no page shows a single document reconciling gross sales, net sales, tax, tips, discounts, refunds, tender types and expected cash deposit, and the 'Addmi Summary Reports' / 'Addmi Sales Summary Reports' help articles visible in the archived help-centre roster were never captured (live portal returns HTTP 404). https://addmi.com/products/point-of-sale · retrieved 2026-08-04
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
Vendor's own App Store copy claims 'detailed reports on sales, popular items, and peak hours' — item-level product reporting is claimed, at marketing grade only. Shortfall: no modifier-level breakdown, no quantity/gross/net columns, and no daypart or revenue-center filters are documented anywhere; the dashboard report set enumerated on the POS and KDS pages (Sales, Labor, Payment & Refund, Transactions, Discounts, Loyalty) contains no PMIX report. https://apps.apple.com/us/app/addmi-point-of-sale/id1499904685 · retrieved 2026-08-04
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Multi-location, franchise & enterprise governance
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
Not scored by this record.
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
Not scored by this record.
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
Addmi publishes a recommended/exact-model compatibility list in support docs and insists on those models; OS names and minimum versions were not retrievable. https://www.addmi.com/pricing · retrieved 2026-08-01
Offers a purpose-built handheld ordering device with an integrated card reader (not a phone case add-on), with published drop rating and IP ingress rating.
hardware-handheld-purpose-built
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Vendor's food-truck guide (published 2026-07-23) markets 'Offline-friendly card acceptance — sales continue when the signal at the curb does not.' Shortfall: only card acceptance is claimed to survive an outage; nothing documents that kitchen printing or cash-sale recording continue, and the claim's requirement that the vendor document which functions degrade is unmet — the same guide tells buyers to 'confirm exactly what still works offline before you commit' while publishing no such degradation list for Addmi itself. The supported-hardware article's documented mitigation for low-connectivity sites is an iPad Wi-Fi + Cellular, i.e. alternative connectivity rather than a described offline mode. https://addmi.com/guides/food-truck-pos-system · retrieved 2026-08-04
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
Kitchen display included at no extra cost as a first-party feature; bump-bar input, station routing and course timing not documented. https://www.addmi.com/pricing · retrieved 2026-08-01
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Hardware prices are published per SKU on the vendor's public site, rather than quote-only. differentiator
hardware-pricing-transparency
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Staff can run the ordering or payment app on their own personal phone (BYOD) with a documented permission and security model.
hardware-byod
Not scored by this record.
Integrations, API & extensibility
Public, self-serve API reference documentation is readable without a signed partner agreement, NDA, or sales call.
extensibility-public-api-docs
Addmi serves a public, anonymous API reference at https://api.addmi.com/api/docs/ -- a Swagger UI page, HTTP 200, 3,106 bytes, no login, no NDA and no sales call (re-fetched 2026-09-15 under two user agents; api.addmi.com/robots.txt returns 404, so no crawl bar applies). The page's ./swagger-ui-init.js (220,499 bytes, also anonymous) inlines the complete OpenAPI 3.0.3 document: info.title 'Addmi API', version 0.1.0, description 'The API for integrating with the Addmi system'; servers [https://api.addmi.com/api/v0]. Six operations -- GET /oauth2/authorize, POST /oauth2/createToken, POST /oauth2/refreshUsingToken, GET /menu, POST /transactions, POST /webhook -- each carrying a summary, parameters or a request body, per-status responses (400/401/403/5XX) and a declared security scheme (basicAuth, or bearerAuth JWT); 64 component schemas, and all 64 $refs in the document resolve. So the reference is complete as published and machine-consumable before purchase, which is what this table-stakes claim asks. Two caveats a reader should have. (1) The surface is small and versioned 0.1.0 -- menu read, transaction post and one inbound webhook receiver, with no employee, inventory, payment or reporting endpoints -- so it documents an integration API, not the whole product. (2) It is undiscoverable from Addmi's public marketing: it appears in none of the 2,215 URLs in addmi.com/sitemap.xml, the partners page and the 165 KB terms never use the token 'API', and the only reference to it anywhere is the merchant dashboard's own API Settings chunk (addmi.com/dashboard/js/2639.726fddd6.js), which renders 'Documentation:' anchored to this exact URL. PROBE POISON, recorded so no later pass repeats it: the bare path /api/docs 301s to /docs/, which 404s -- an earlier pass's 'no API reference' rests on that false negative -- while conversely EVERY path under /api/docs/ (/api/docs/zzqqnonsense, /openapi.json, /swagger.json, /schema/) returns the byte-identical 3,106-byte Swagger shell (same sha256), so those 200s are a path-prefix catch-all and the spec exists only inside swagger-ui-init.js. This also falsifies the record's sources.jsonl note on addmi.com/partners that Addmi has 'no developer program, API or app marketplace'. https://api.addmi.com/api/docs/ · retrieved 2026-09-15 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
Not scored by this record.
A free sandbox or test environment with seeded data is available to developers without owning a paid production account. differentiator
extensibility-free-sandbox
Not scored by this record.
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
Addmi publishes an OAuth 2.0 authorization-code flow, but none of the claim's qualifying conjuncts. MET: the anonymous OpenAPI 3.0.3 document inlined as swaggerDoc in api.addmi.com/api/docs/swagger-ui-init.js (220,499 bytes, retrieved 2026-09-15) defines GET /oauth2/authorize ('After authorization, you will be redirected to the provided redirectURI with an authorization code'; required client_id and redirect_uri, optional state), POST /oauth2/createToken ('Use Basic Authorization passing in the base64 encoding of clientID:clientSecret. Access tokens expire after 24 hours while refresh tokens expire after 30 days') and POST /oauth2/refreshUsingToken; the dashboard bundle confirms https://api.addmi.com/oauth2 is Addmi's own service, not a vendored SDK. NOT SCOPED: the tokens 'scope', 'scopes', 'consent', 'grant_type' and 'permission(s)' occur ZERO times word-boundary in the entire 220,499-byte file; securitySchemes are only {basicAuth: http basic, bearerAuth: http bearer JWT} with NO scheme of type oauth2 at all, so the document contains no mechanism by which a scope could be declared, and every protected operation carries an empty scope array. The merchant's own API-credential entity carries no scope field either: com.addmi.business:api.create/update/delete.v1 over a reducer of {id, businessID, clientID, webhookURLs, created, deleted, updated}. NOT OPERATOR-GRANTED IN THE CLAIM'S SENSE: the clientID/clientSecret pair is issued to the MERCHANT in its own back office (addmi.com/dashboard/js/2639.726fddd6.js, 'API Settings': a disabled Client ID input, a masked Client Secret with Show/Hide, a merchant-editable 'Callback URLs' list, and a 'Documentation:' link to the spec above), so a third party integrates by being handed the operator's own secret - which is the credential sharing the claim explicitly excludes, not a per-app grant with a consent screen. NO REVOCATION SURFACE: no revoke endpoint exists in the closed six-path spec (/oauth2/authorize, /oauth2/createToken, /oauth2/refreshUsingToken, /menu, /transactions, /webhook), and the API Settings screen exposes no revoke or regenerate control - its only delete handlers are handleDeleteCallbackURL and handleDeleteWebhookURL, and it renders a single credential pair with no per-app list. The event model does carry a per-businessAPIID delete action, so server-side per-credential deletion may exist, but it is neither surfaced in the back office nor documented. No developer portal resolves (developer., developers., docs. and portal.addmi.com all return nothing) and no app marketplace or partner directory exists; addmi.com/partners is a logo wall of named integrations (Club Express, MarketMan, Intuit QuickBooks, Otter, Square, Stripe) with a contact form. POISON: 'oauth' elsewhere in the merchant bundle is NOT Addmi's - oauthAccessToken/oauthTokenSecret/INVALID_OAUTH_CLIENT_ID and revokeAccessToken (providerId 'apple.com') are the Firebase Auth SDK, and 'squareposoauth2error' is a Square route; the integration-settings chunk's permission and revocation strings ('Allows our app to read content...', 'You can always manage or revoke access to the integration') are FACEBOOK's scopes and Facebook's revocation, not Addmi's; and 'permissions' in chunk-vendors is 340 hits of Apache-licence boilerplate. https://api.addmi.com/api/docs/swagger-ui-init.js · retrieved 2026-09-15 adversarially verified
The platform pushes real-time webhooks for order lifecycle events (created, modified, paid, voided, refunded) rather than requiring polling.
extensibility-webhooks-push
Addmi's published OpenAPI 3.0.3 document ('Addmi API' v0.1.0, server https://api.addmi.com/api/v0, inlined as swaggerDoc in the anonymous Swagger UI that the merchant dashboard's own API Settings screen links to as 'Documentation:') defines POST /webhook, 'These are the requests that will be sent to your server if you have webhooks configured'. Its requestBody is a closed anyOf of exactly three variants, each pinned by a single-value type enum: 'catalogItemVariant.eightySix.updated', 'catalogModifier.outOfStock.updated' and 'catalogSubModifier.outOfStock.updated', whose data.object resolves to CatalogItemVariant, CatalogModifier and CatalogSubModifier respectively. There is no discriminator, no additionalProperties, no free-string type fallback, no OpenAPI 'webhooks' or 'callbacks' key, and no fourth variant. Every pushed event is therefore catalog availability (86 / out-of-stock); no order lifecycle event -- created, modified, paid, voided or refunded -- is among them, so the claim shortfalls on every conjunct rather than partly. The absence is bounded to the outbound surface, not merely unfound: the merchant-side webhook configuration is a bare repeatable webhookURLs list on the dashboard API Settings screen ('+ Add Webhook', placeholder 'https://') with no event-type, topic or subscription selector, backed by the GraphQL query businessAPIByBusinessEntityID {id, webhookURLs} and a single ActionBusinessAPICreate/Update carrying {clientID, webhookURLs}; 'webhook' appears in none of the 652 com.addmi.*.v1 action types. There is no richer subscription model behind a tier for the spec to be a subset of. Nor is polling an alternative: the document has six paths in total -- GET /oauth2/authorize, POST /oauth2/createToken, POST /oauth2/refreshUsingToken, GET /menu, POST /transactions ('Create a new transaction in the Addmi system', inbound) and POST /webhook -- so an integrator can neither receive order events nor read them back. CONTROLS: the token 'event' occurs zero times in the 220,499-byte document, both as a raw substring and tokenised (it is not hiding inside 'eventually'). POISON, recorded so a later pass does not misread it: 'order' occurs 145 times raw / 122 tokenised and is almost entirely the catalog sort-order integer ('"order": 6', 'The sort order of the modifier') plus the onlineOrderingClosed* settings and orderNumber / orderNumberPrefix / orderNumberError on the transaction Ref -- there is no Order schema in the document at all. Retrieved 2026-09-15; the live fetch is byte-identical to the cached copy (MD5 6BF9BEDA8124AB380E74559C2FE566A2). https://api.addmi.com/api/docs/swagger-ui-init.js · retrieved 2026-09-15 adversarially verified
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
Not scored by this record.
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
Not scored by this record.
The vendor is a named DoorDash Preferred Integration Partner (DPIP) under the 2026 program requirements. differentiator
extensibility-doordash-preferred
Not scored by this record.
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
Not scored by this record.
The POS is a supported endpoint for at least two major aggregation middleware platforms (Deliverect, Chowly, Otter, Checkmate, ItsaCheckmate).
extensibility-middleware-compatibility
Not scored by this record.
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
Not scored by this record.
Labor hours export natively to at least two named payroll providers (e.g. Gusto, ADP, Paychex, Paylocity) without manual re-keying.
extensibility-payroll-export
Not scored by this record.
The vendor operates a public integrations marketplace listing named third-party apps that operators can browse and self-install.
extensibility-app-marketplace
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Reliability, offline & operations
Order entry, ticket routing, and check printing continue on-terminal when the internet connection is lost.
reliability-offline-order-entry
Vendor legal text, not marketing, now carries the on-terminal half of this claim. Addmi's Terms define the mechanism: '"Offline Credit Card Transactions" means the situation when encrypted credit card transaction information that is stored locally on a device when the proper network connection is unavailable. An attempt to facilitate the transaction can be made when the connection is restored', and 'addmi may offer a feature that facilitates transacting Offline Credit Card Transactions with the Services.' The shipped domain model corroborates that this is a live product state rather than boilerplate: the merchant dashboard bundle carries a first-class action 'com.addmi.transaction.tender.OFFLINE.v1' whose reducer returns TenderStatus.offline, a member of the closed status enum alongside authorized, declined, captured, voided and prepayPreAuth; tender and transaction attempt actions carry a ProcessingType of 'local' or 'server' (com.addmi.transaction.processItemCreation.v1 among them). Shortfalls, all three unresolved: (1) what is documented is the TENDER, not the TICKET -- offline order entry itself is asserted only at marketing grade, by the vendor guide sentence 'Addmi keeps taking payments when the network drops, stores orders locally, and syncs automatically when you are back online' (addmi.com/guides/food-truck-offline-pos, Aug 2026); (2) ticket routing and check printing while offline are documented nowhere -- the archived Freshdesk roster contains no offline article and the live portal 404s; (3) the terms say Addmi 'may offer' the feature and disclaim all liability for it on an 'As Is' and 'As Available' basis, so per-merchant availability is not established. https://addmi.com/tos · retrieved 2026-09-15 adversarially verified
Card payments can be accepted while offline via store-and-forward, not just cash-only fallback. differentiator
reliability-offline-card-auth
Not scored by this record.
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
Not scored by this record.
Kitchen display and/or kitchen printer routing continues to function while offline.
reliability-offline-kds-printing
NEW 2026-09-17: crt.sh for addmi.com (22 names) probed at / and /swagger, /swagger/index.html, /api-docs, /openapi.json, /docs, /v3/api-docs, /robots.txt and a nonsense path: api.addmi.com 404 everywhere, auth 404, biz 301 -> addmi.com, tprox 307 -> addmi.com, onboarding/eks-elb 400, file.addmi.com 403 (S3), stage/ops-*/vpn/tschnepp no response. Two LISTABLE S3 buckets: iab.addmi.com (IsTruncated=true; hashed per-business image uploads, no documents) and image.addmi.com (185 keys, complete: brand icons, distributor/reseller agreement PDFs, addmi-onesheet-foodtruck-2023.pdf, case-study-Fatwood-BBQ--Addmi.pdf, clubexpress onesheet). App Store lookup (artist of id1187349472): only "Addmi Point of Sale" com.addmi.addmi-pos 1.5.9 and "Addmi Ticketing"; no DS/KDS listing; no com.addmi.* on Google Play (404). Case study: "By choosing the Star Micronics TSP143III with a USB connection to a cellular iPad for the POS, Fatwood can use their printer without requiring network connectivity" -- the printer needs no LAN, but the iPad is on cellular data, so this says nothing about kitchen routing during an internet outage. Wayback id_ fetch of 65000165417-printing-with-ads: not archived (404). Retrieved 2026-09-17. || 329th: NEW 2026-09-18 (329th): APP-LEVEL CENSUS OF THE STORE APP, and it does not settle this cell. iTunes lookup of the publisher shows the KDS is not a separate product: the ten iPad screenshots of 'Addmi Point of Sale' (com.addmi.addmi-pos 1.5.9, released 2026-08-13) were downloaded at full resolution (2000x0w, 0.26-0.57 MB each) and read as images; screenshot 002 is captioned '3 Apps in 1 -- Install a single app for multiple duties' over POINT OF SALE, KITCHEN DISPLAY SYSTEM and CUSTOMER FACING DISPLAY, and the KDS pane's footer bar reads 'Default Station | Fry Station | Kitchen ... 12 Fulfillments / Orders / Recall / Settings' beside a green cloud-with-check status pill that also appears in the POS header of screenshots 001 and 011. So the KDS is a mode of the same iOS binary and shows a cloud/connection indicator, but a screenshot cannot say what it does when that indicator goes red. The dashboard's complete 4,827-key English string table contains exactly two 'offline' keys, neither about the kitchen ('*<span>OFFLINE</span> payment processing <span>not</span> supported', the processor-picker footnote, and 'Canceling an event date ensures that it remains offline...'), and the station entity is a cloud record ('fulfillmentStates { id name display emailsEnabled emailAddresses }'), matching the setup string 'To use the Addmi Display System (Kitchen Display System) to display your orders, please add a station on the Settings page'. The vendor's rebuilt site (2,218-URL sitemap, 92 non-tenant pages fetched) has 0 hits for 'offline' within 200 chars of 'kitchen'/'KDS'/'station', and the KB is gone (addmi.freshdesk.com/support/home, /support/solutions and the /pricing-linked article 65000163511 all 404 to curl with a browser UA today). HELD unknown: this is an absence of publication, not evidence that kitchen routing stops offline, and no censused surface covers the native app's behaviour during an outage. Retrieved 2026-09-18. adversarially verified
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
CLAIM: automatic failover to a backup printer/KDS when a kitchen printer is unreachable, with staff alerts. VERDICT: unknown (unchanged). NEW SURFACE CHECKED 2026-09-16: the retired Freshdesk KB (addmi.freshdesk.com, live 404) survives in Wayback only as its home page (capture 20240915075248), which lists 94 article links, including 'Printing with ADS' (65000165417), 'How to Configure a Printer' (65000179326), 'Addmi DS Troubleshooting' (65000173203), 'Addmi DS Settings and Setup' (65000165419) and 'Order Fulfillment Stations and DS App' (65000166722) -- exactly the articles that would settle this cell. Their BODIES ARE NOT ARCHIVED: 54 of the 94 article URLs were probed at Wayback and all but the hardware article returned the not-archived page (~4.7 KB), and the Wayback CDX index for addmi.freshdesk.com (q310-addmi/cdx_addmi.freshdesk.com.txt) lists only two article captures, 65000163511 (hardware list: 'Supported Printers: Thermal: Star Micronics mC-Print3 (MCP31L) Impact: Star Micronics SP700 Label: Star Micronics TSP654IISK', no failover text) and 65000182851 (gift cards). Also read: all 19 posts under https://addmi.com/news (no printer text) and addmi.com/support (a contact form only; no KB). The KB is a gated-by-absence corpus (titles without bodies), so no 'no' may be published. Retrieved 2026-09-16. || 321st: NEW 2026-09-17: crt.sh for addmi.com (22 names) probed at / and /swagger, /swagger/index.html, /api-docs, /openapi.json, /docs, /v3/api-docs, /robots.txt and a nonsense path: api.addmi.com 404 everywhere, auth 404, biz 301 -> addmi.com, tprox 307 -> addmi.com, onboarding/eks-elb 400, file.addmi.com 403 (S3), stage/ops-*/vpn/tschnepp no response. Two LISTABLE S3 buckets: iab.addmi.com (IsTruncated=true; hashed per-business image uploads, no documents) and image.addmi.com (185 keys, complete: brand icons, distributor/reseller agreement PDFs, addmi-onesheet-foodtruck-2023.pdf, case-study-Fatwood-BBQ--Addmi.pdf, clubexpress onesheet). App Store lookup (artist of id1187349472): only "Addmi Point of Sale" com.addmi.addmi-pos 1.5.9 and "Addmi Ticketing"; no DS/KDS listing; no com.addmi.* on Google Play (404). No failover/backup-printer text on any of these; Wayback retries of 65000165417-printing-with-ads (404 not archived) and 65000179326-how-to-configure-a-printer (no response). Retrieved 2026-09-17. || 329th: MERGE HOLD (proposed no/B, held unknown): The census is of the BACK-OFFICE dashboard (4,827 strings, 202 GraphQL docs). The store-level native iOS app (com.addmi.addmi-pos), where a print failure would be handled, is in no corpus; a back-office census does not bound the store-level POS (325th rule). The printer schema having no fallback field is recorded as the bound so far. PROPOSAL AS WRITTEN: NEW 2026-09-18 (329th): the printer DATA MODEL, read out of the merchant dashboard's own GraphQL documents, cannot express a fallback target. https://addmi.com/dashboard/js/208.188bc8d7.js (live 200, 13.5 KB, re-fetched 2026-09-18) carries the catalog-settings query verbatim: 'printerConfig {\n ipAddresses\n }\n\n printers {\n id\n name\n ipAddress\n port\n }' -- four fields per printer, plus a flat list of IPs, and nothing else. The station entity in the same document set is 'fulfillmentStates {\n id\n name\n display\n emailsEnabled\n emailAddresses\n }': a station carries no printer reference at all, so there is no per-station primary printer to fail over FROM, let alone a secondary. VERDICT: no. Automatic failover to a backup printer or KDS station, with staff alerts, cannot be configured and no alert exists. BOUND: the surface censused is the Addmi merchant dashboard (addmi.com/dashboard), which is where printers are authored -- its own UI strings are 'Enter the Details of the printers you are using.', 'Printer %{printerCount}' and 'Your printers have been saved!', and the back-office action-type enumeration exposes exactly two printer verbs, com.addmi.catalog.settings.printerConfig.update.v1 and com.addmi.catalog.settings.setPrinters.v1, out of 652 distinct com.addmi.*.v1 action types. The corpus is the 454-chunk dashboard bundle set fetched to a fixpoint in the 310th (454/454 ok, 0 fail, 21.5 MB) plus its complete 4,827-key English UI string table (extracted this pass from the locale chunk 8767) and the 202 GraphQL documents embedded in those chunks. CONTROLS, tokenised, case-insensitive, over all three: 'backup' 0 hits in the 4,827 keys; 'fail-over'/'failover' 0; 'redundant' 0; 'secondary' 0 in any printer context; the 17 'fail' keys are all payment/void/capture failures ('Capture Failed', 'Void Tender Failure', 'Tip Adjustment Failed') -- POISON NAMED: 'fail' is a payments word in this app, not a device word. The vendor's own KDS feature page https://addmi.com/products/kitchen-display-system enumerates ten KDS features (no extra cost, online+POS orders to KDS, fulfillment-method filter presets, customer SMS, print receipts and tickets for incoming online orders, fulfil orders or individual items, Expediter Screen, Fulfillment Summary Bar, Fulfillment Warning Threshold, Double Fulfillment) and failover is not among them; 'Double Fulfillment' is a ROUTING feature (one item to multiple prep stations, each completing independently), not a fallback. The live 6-path Addmi API spec has 0 'printer'. RESIDUAL RISK, stated: the store-level app (com.addmi.addmi-pos 1.5.9, iOS, which per its App Store screenshots also runs the KDS and the customer display) is a native binary not in any corpus, so an undocumented, unconfigurable in-app retry is not excluded -- but the claim's own wording is failover for 'a configured kitchen printer', and no such configuration or alert exists on the only surface where printers are configured. 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
Not scored by this record.
A public, per-component status page exists showing current and historical incident state without a login.
reliability-public-status-page
Not scored by this record.
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
Not scored by this record.
A hardware replacement/advance-exchange program with a stated turnaround time is included or purchasable.
reliability-hardware-replacement-sla
Not scored by this record.
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
Not scored by this record.
Multi-factor authentication is enforceable on back-office and POS administrative logins, with role-based permissions.
reliability-mfa-role-based-access
Not scored by this record.
A public, free training library (video/LMS) and a practice/training mode on the terminal exist for staff onboarding.
reliability-self-serve-training
Not scored by this record.
Terminals support an automatic cellular/LTE failover for connectivity, first-party or documented.
reliability-cellular-backup
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Addmi's publicly served Terms and Conditions state the renewal term in all caps: 'IF YOU SUBSCRIBE TO THE SERVICES FOR A TERM (THE "INITIAL TERM"), THEN THIS AGREEMENT WILL BE AUTOMATICALLY RENEWED FOR ADDITIONAL PERIODS OF THE SAME DURATION AS THE INITIAL TERM AT ADDMI'S THEN CURRENT FEES FOR SUCH SERVICES UNLESS YOU OPT OUT OF THE AUTO RENEWAL IN ACCORDANCE WITH section 9.6 BELOW.' The fees section states the cancellation window: the subscription 'will automatically commence on the first day following the end of such period (each a "Renewal Commencement Date") and continue for an additional equivalent period, at addmi's then current price', and 'You agree that your subscription will be subject to this automatic renewal feature unless you cancel your subscription at any time prior to the Renewal Commencement Date. If you do not wish your subscription to renew automatically, or if you want to change or cancel your subscription, please contact us at team@addmi.com.' It also fixes the effect of cancelling: 'You may not cancel your subscription prior to the end of your then current subscription term... you will not be eligible for a prorated refund.' The Termination section repeats that 'The subscription term will automatically renew in accordance with this Agreement.' Both conjuncts of the claim are therefore public and diligenceable before signing: the renewal term (an equal period at then-current fees) and the notice window (none required; cancel any time before the Renewal Commencement Date). Two caveats that do not defeat the claim: the all-caps clause conditions opting out on 'section 9.6', and the published document contains no numbered sections at all -- a dangling cross-reference, leaving the email above as the only stated opt-out mechanism; and Addmi's default model is $0 software with per-transaction fees, so these clauses bite only where 'by mutual agreement, a monthly subscription model is applied'. https://addmi.com/tos · retrieved 2026-09-15 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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Per-location and per-additional-terminal software pricing is published as specific dollar figures on the vendor's public site (not 'contact sales' only).
commercial-pricing-published
Exact figures published: $0/month, 19c POS and 38c online per transaction, 2% membership/invoicing, 3% ticketing capped at $39. https://www.addmi.com/pricing · retrieved 2026-08-01
Individual modules (online ordering, KDS, loyalty, inventory, payroll, marketing) can be purchased à la carte and cancelled independently without repricing the base POS subscription. differentiator
commercial-module-unbundling
Not scored by this record.
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
No hardware lease is possible because Addmi sells no hardware — you buy listed models yourself — but Addmi publishes no hardware price list. https://www.addmi.com/pricing · 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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
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
Not scored by this record.
Adversarial verification
An independent pass was instructed to refute this record, defaulting to downgrade when uncertain. It challenged 11 values — 8 upheld, 0 downgraded, 3 upgraded. It separately resolved 26 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.
Capability claims
| Claim | As first scored | Verdict | What the verifier found |
|---|---|---|---|
| kitchen-expo-consolidation | unknown (placeholder: no public documentation located during the 2026-08-01 research pass) | resolve-to-partial | Placeholder cell resolved. The KDS feature page documents Expediter mode: 'allows all stations fulfillment progress to be watched through their stages until completed either by the station or the expediter' — a consolidated multi-station expo view exists. Partial, not yes: the claim's gate (order complete only when every contributing station has bumped) is not documented, and the vendor's own wording permits completion by 'the station or the expediter'. source |
| reporting-realtime-dashboard | unknown (placeholder: no public documentation located during the 2026-08-01 research pass) | resolve-to-partial | Placeholder cell resolved. Vendor documents a cloud dashboard with Sales, Labor, Payment & Refund, Transactions, Discounts and Loyalty reports 'accessed from anywhere with an internet connection'. Partial, not yes: no live/real-time refresh claim exists anywhere (the quick-serve page says 'historical reports'), and the vendor's /app page lists only Ticketing and POS apps — no owner/manager mobile app, so mobile off-premise access is browser-only. source |
| reporting-pmix-modifier-level | unknown (placeholder: no public documentation located during the 2026-08-01 research pass) | resolve-to-partial | Placeholder cell resolved. The vendor's own App Store copy claims 'detailed reports on sales, popular items, and peak hours', establishing item-level product reporting at marketing grade. Partial, not yes: modifier-level breakdown, quantity/gross/net columns and daypart/revenue-center filters are documented nowhere, and the enumerated dashboard report set contains no PMIX report. source |
| order-capture-split-merge | unknown (placeholder: no public documentation located during the 2026-08-01 research pass) | resolve-to-partial | Placeholder cell resolved. The vendor FAQ states 'For POS, you can accept card payments, cash, and split payments across multiple methods' — split tendering is first-party claimed. Partial, not yes: split-by-item/seat/N-way, arbitrary-amount splits and check/table merging (including after partial payment) are documented nowhere; the 'Orders Screen in Point of Sale' help article exists in the archived help-centre roster but was never captured and the live portal 404s. source |
| order-capture-scheduled-orders | unknown (placeholder: no public documentation located during the 2026-08-01 research pass) | resolve-to-partial | Placeholder cell resolved. The online-ordering page offers 'curbside pickup, scheduled pickup times, or delivery services'. Partial, not yes: no per-channel lead time or fire-time injection is documented — the KDS page describes orders 'sent right to the KDS' with no hold logic, so on-receipt surfacing cannot be ruled out. source |
| payments-refund-void-controls | unknown (placeholder: no public documentation located during the 2026-08-01 research pass) | resolve-to-partial | Placeholder cell resolved. 'Pin code access for employees' (POS page), dashboard full/partial refunds (FAQ) and a Payment & Refund report establish refunds plus PIN-scoped access. Partial, not yes: role-based approval gating on voids/discounts/no-sales and an approver-identified immutable audit log are documented nowhere; the 'Roles and Users' article was never archived and the live help portal 404s. source |
| kitchen-bump-bar-hardware | unknown (placeholder: no public documentation located during the 2026-08-01 research pass) | resolve-to-no | Placeholder cell resolved with positive evidence of absence. The vendor's supported-hardware article enumerates every supported device class (iPads for POS/customer/KDS/handheld screens, three Star printers, Square/Stripe/MagTek readers, stands, cash drawers) and no bump bar or keypad appears in any category; the KDS is a touch-operated iPad app. Read from the Internet Archive 2026-02-16 snapshot because the live portal addmi.freshdesk.com returns HTTP 404. source |
| delivery-dispatch-board | unknown (placeholder: no public documentation located during the 2026-08-01 research pass) | resolve-to-no | Placeholder cell resolved with positive evidence of absence. The vendor enumerates its delivery model as an outsourced DoorDash courier partnership whose POS-side behaviour is display-only ('Delivery orders are displayed in your POS ... respect your inventory settings ... are displayed in your reports'). There are no operator drivers to dispatch, and no driver-availability, dispatch screen or run-batching feature exists anywhere on the vendor surface; the only delivery help article in the archived roster is 'DoorDash Delivery Support'. source |
| reporting-eod-closeout | unknown (placeholder: no public documentation located during the 2026-08-01 research pass) | resolve-to-partial | Placeholder cell resolved. The POS page lists 'Till and end of day features' and a 'Server Shift Close Out' requiring servers to settle lingering orders before clocking out — a close-out process exists. Partial, not yes: no page documents a single EOD document reconciling gross/net/tax/tips/discounts/refunds/tenders/expected cash; the Summary Reports help articles were never archived and the live portal 404s. source |
| hardware-offline-mode | unknown (placeholder: no public documentation located during the 2026-08-01 research pass) | resolve-to-partial | Placeholder cell resolved. The vendor's food-truck guide markets 'Offline-friendly card acceptance — sales continue when the signal at the curb does not'. Partial, not yes: only card acceptance is claimed to survive an outage, no degradation list is published (the guide itself tells buyers to 'confirm exactly what still works offline'), and the hardware article's low-connectivity mitigation is a cellular iPad, not a documented offline mode. source |
| reliability-offline-order-entry | unknown (placeholder: no public documentation located during the 2026-08-01 research pass) | resolve-to-partial | Placeholder cell resolved. The food-truck guide's 'sales continue when the signal at the curb does not' asserts order-taking continues offline, at marketing grade. Partial, not yes: offline ticket routing and check printing are documented nowhere — no offline article exists in the archived help-centre roster and the live portal 404s. source |
| commercial-pricing-published | yes, grade B - Exact figures published: $0/month, 19c POS and 38c online pe | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| commercial-hardware-purchase-outright | partial, grade B - No hardware lease is possible because Addmi sells no hardwar | upheld | Grade only, value untouched. Corpus-wide mechanical pass (workflows/regrade-marketing-pages.mjs): the cited page is a first-party pricing/feature/product page, which atlas-evidence-rules grades C ("vendor pricing page or feature page - first-party, but written to sell"), not B ("vendor product documentation - the manual, the help centre, the admin guide"). No claim was re-researched in this pass and no evidence was re-read; only the grade was brought into line with the source type. source |
| extensibility-public-api-docs | unknown, grade F | resolve-to-yes | Re-opened independently rather than trusting the cache. GET https://api.addmi.com/api/docs/ returns 200 with no credentials, no cookie and no Referer, under both a ClaudeBot UA and a browser UA; the shell is genuine Swagger UI dist HTML whose three script tags include ./swagger-ui-init.js, and it contains zero tokens of 'login', 'sign in', 'password', 'agreement', 'contact', 'sales' or 'register'. Its single substring hit for 'NDA' is the trap, not a finding: it is inside 'swagger-ui-standalone-preset.js', and tokenised the count is 0. I fetched swagger-ui-init.js myself, brace-matched the swaggerDoc object out of it and parsed it as JSON: 6 paths and 64 schemas confirmed, and its canonical JSON hashes identical to the cached .cache/q310-addmi/openapi.json, so the local copy is not a doctored intermediate. Completeness checked structurally, not by eye -- all 64 $refs resolve within the document and every operation has responses and a security scheme. The soft-200 trap the proposer flagged reproduces exactly (four nonsense/JSON paths under /api/docs/ all return the same 3,106-byte body, sha256 3d1f21ff983b) but does not touch this verdict, because the load-bearing artefact is the 220,499-byte init script at its own distinct hash, not a catch-all 200; and /api/v0/menu returns a real 401, confirming a live API behind the spec rather than a decorative document. Grade A is correct: an OpenAPI specification served by the vendor is primary technical documentation, and the claim is table-stakes so the differentiator grade floor is not in play. No double count: this is the only line in prop-a.jsonl for this id, no other row of data/vendors/addmi/claims.jsonl cites api.addmi.com, addmi's verification.jsonl holds no prior row for it, and the sibling cells the same spec feeds (extensibility-oauth-partner-apps, extensibility-webhooks-push) are separate propositions about scoping and push delivery. I considered downgrading to partial on two grounds and rejected both. Discoverability: the reference is reachable only via a URL surfaced inside a merchant dashboard chunk, which is a real weakness and now sits in the note -- but the claim's conjuncts are that the reference be public, self-serve, and readable without an agreement, NDA or sales call, and all three hold; nothing in it requires a marketing link, and the page is served at a conventional path with no robots bar, so it is genuinely open rather than leaked. Size: six paths is a thin API, but this cell scores whether the documentation is readable, not how much product the API covers -- the shortfall belongs to the API-surface cells, and grading it here would double-penalise. Value, grade and URL stand as proposed; the note is expanded to carry the discoverability limit, the 0.1.0 scope and the probe poison, none of which the bare cell would otherwise record. source |
| inventory-recipe-bom-costing | unknown, grade F | resolve-to-no | Re-opened the evidence independently: parsed openapi.json (6 paths, 64 schemas) and re-derived the action and reducer census from the bundles myself. VALUE AND GRADE UPHELD, NOTE MATERIALLY REWRITTEN AND URL MOVED -- hence amended rather than upheld. (1) The lazy-chunk objection is real but resolvable, and the proposer's stated basis for it was unsound. An action-type census is NOT a census of capability: I falsified that directly by diffing the fetched lazy chunks against the eager vendor chunk, which surfaced four com.addmi.rolemodule.* action types present in chunk 8017 and absent from both the eager chunk and actions.txt. Had the no rested on the action list alone I would have rejected to unknown. It survives because the eager Vue router table is a complete manifest of all 454 chunks and names only storeInventory (n.e(6627)) and admissionInventory; that chunk and the item-editor chunk 2317 were both fetched, so the two screens that could house recipe costing were actually read, and their combined 384-label gettext corpus has no recipe-domain vocabulary. (2) I found a false statement in the proposed note and corrected it: 'no cost field at all' is wrong. productionCost is a real field on the CatalogItemVariant reducer and is rendered as a money input labelled 'Cost' in the item editor. It is a flat hand-entered per-variant cost with no component linkage and no recalculation, so both conjuncts of the claim still fail, but the note must not assert a cost field is absent when one is visible in the UI. (3) Counted the census honestly: the proposal says '652 distinct action types'; actions.txt's own header reads 'distinct 650 of 652' (650 distinct, 652 occurrences), and it predates the lazy fetch that added four more, so the figure is both mis-stated and stale. Dropped the number from the note rather than republish it. (4) Ran the synonym search myself, tokenised, and the controls carried heavy poison that the proposal did not report: bom is 62/62 false (bombs, shitsbomb), yield is 76/76 the JS keyword, and the 2 'recipe' hits are ICANN TLD data inside swagger-ui, i.e. not Addmi's corpus at all -- a zero bound to the wrong publisher would have been the trap here. Published the poison in the note. (5) Disclosed the one genuine contrary vendor claim, the App Store 'ingredients' sentence, which the proposal never mentioned; it is marketing mapping to threshold alerts and does not reach sub-recipes or cost rollup. (6) No double count with inventory-unit-conversion-yields: that cell turns on multi-unit conversion factors and a yield percentage, this one on component nesting and cost recalculation. They share the closed six-action model as a corpus, which is legitimate, so I wrote this note self-contained rather than cross-referencing. (7) Moved final_url from the swagger spec to the vendor chunk: the 6-path partner API is corroborating, but a narrow integration API cannot settle a product's feature surface, whereas the vendor chunk carries both the Inventory reducer and the CatalogItemVariant reducer with productionCost -- the two facts the verdict actually turns on. Grade A stands: first-party application source plus published OpenAPI spec, with closed enumerations rather than silence. source |
| inventory-count-modes | unknown, grade F | upheld | Proposed partial from the anonymous api.addmi.com OpenAPI spec and the addmi.com/dashboard bundles (310th session); rejected on verification: REJECTING the partial: I re-opened every cited artefact and three of the claim's four conjuncts fail outright, the fourth half-fails, so the proposal shortfalls every conjunct and refutes itself. (1) FULL PHYSICAL COUNT -- the proposal's load-bearing assertion, that 'full physical counting exists as a first-class action', is false. I confirmed the cited reducer line verbatim (case i.ActionInventoryPhysicalCount: return a(0,t.count.scalar)), but the proposal read the ACTION and never opened the UI that emits it. In chunk 2317 (storeItemNew/storeItemEdit) physicalCountInventory is emitted from a switch over t.adjustment.kind whose sibling cases are received/restock/damage/theft/loss: 'Inventory Re-Count' is the sixth entry in a closed adjustment-reason dropdown on ONE item variant, relabelling the input to 'Current Stock'. That is the challenge's 'just quantity editing', exactly. A count that cannot span more than one variant is not a physical inventory. (2) SPOT COUNTS -- the proposal concedes these exist only 'in the weak sense that inventory records are per item variant, so an operator may count only some records'. By that reasoning every quantity field in every POS supports spot counts; it is not a finding, and I reject it. (3) CYCLE COUNTS -- conceded absent, and independently confirmed: no schedule, cadence, frequency or due-date entity touches inventory in any corpus. (4) VARIANCE HISTORY -- the proposal argued this from event-sourcing architecture ('balances are a fold over an append-only log'), which is inference about an implementation, not evidence of a product surface, and would have been grade F reasoning presented as A. I found the real evidence it missed -- the Stock Entries report and its businessInventoryAdjustReport query, which does give per-count timestamped, employee-attributed rows -- so the history half is better supported than proposed. But the conjunct says each count's VARIANCE, and there is none: the row shows the new absolute figure and reason, adjustFrom/adjustTo are empty on recount rows specifically, and variance/discrepanc/overage/shortage are zero across 12.8 MB. The conjunct fails as written. CONTROL AUDIT: the proposal's zeros were bound to the wrong corpus, the same error the sibling caught on the uom cell. It published "'cycle' is ZERO across the dashboard app chunk" -- true of the 232 KB app chunk, but its own final_url is the 3.5 MB vendor bundle, where 'cycle' is 3 tokens / 7 substrings. I ran every control over every corpus (55 files, 12.8 MB, tokenised with lookarounds); all hits are Firebase/Vue/Intl plumbing, so the conclusion survives, but the poison is now published rather than left as a landmine, along with two new traps: onHand is onHandleClick and sheet is the xlsx worksheet component, both inside the stock report. LANDING VALUE: not unknown. This is positive, enumerated absence -- a closed six-action inventory domain declared in one shared module, a closed six-value reason map, a closed report column list, a closed spec schema, and an unimplemented 414-byte storeInventory route -- bound by a census of every inventory-bearing chunk in the router's lazy-chunk map rather than a convenience sample. no/A. CONSISTENCY WITH THE SIBLING 'no' CELLS: partly the same corpus banked a third time, and a reader should see that. All three rest on one premise -- that the six com.addmi.inventory.*.v1 actions are closed -- so if that premise fell, all three fall together and they are not three independent confirmations. Where this cell differs: its decisive evidence is a PRESENCE, not an absence. Addmi does have a counting action; the finding is what that action IS (an absolute per-variant set, one reason code among six), which is a different and stronger kind of fact than 'the concept is wholly missing'. It also rests on three surfaces neither sibling touches -- the 'Inventory Re-Count' dropdown option with its 'Previously %{currentStock}' hint, the Stock Entries report's GraphQL field list, and the storeInventory stub. One correction to the sibling uom note while I was in the same chunks: it describes the reason dropdown as five values and omits Loss; the reasonMap in chunk 8821 is six -- received, restock, damage, theft, loss, recount. BOUND: the corpus is the merchant web dashboard, the guest ordering SPA, the published spec and the marketing site; the native iOS/Android merchant apps were not decompiled. The zero is defensible past that gap only because the closure is at the DOMAIN layer -- any count feature in a native client would still have to emit an inventory action, and that enumeration is closed in the shared module both clients consume. GRADE: A. Application source code and a published OpenAPI spec, both retrieved anonymously; the claim is table-stakes, so no differentiator floor applies. final_url is the vendor chunk (a notes.json key) because it carries the action enumeration and the physicalCount reducer; chunks 2317, 6627 and 8821 are cited inside the note. Prior claims.jsonl value is unknown/F, so in verification.jsonl this is a resolve-to-no, not a downgrade. source |
| guest-loyalty-lifecycle-automation | unknown, grade F | resolve-to-partial | AMENDED at the same value and grade, but on evidence that REFUTES the proposal's central finding rather than supporting it. The proposal graded partial/A on the premise that 'none of the claim's three named triggers exists: birthday, anniversary, milestone, visitCount and winback are all ZERO, and no lifecycle trigger appears among the 652 action types', with the vendor's 'Free items on birthdays or visit milestones' left standing as an unresolved conflict against the shipped model. That premise is false, and it is false for exactly the reason the proposal itself flagged and then did not act on: the lazy membership chunks were never enumerated. I resolved the webpack hash map in index.b265f90a.js and fetched ALL 454 lazy chunks anonymously (454/454 at 200, 21,526,679 bytes) rather than the four the proposal had. Two findings invert the verdict's basis. FIRST, 'birthday' is not zero -- chunk 9412 (the membership level editor) ships a 'Free 1 item on birthday' checkbox with a catalog item picker, and the screen's own GraphQL query persists it as settings.freeBirthdayItem{active,itemIDs} beside freeItems{numAllowed,occurrences} and giftCard. The proposal's zero was an artefact of searching a 3.7 MB slice of a 23.6 MB application. The recorded conflict with addmi.com/features therefore RESOLVES IN THE VENDOR'S FAVOUR on the birthday limb and should not be carried forward as a contradiction; only 'visit milestones' remains unevidenced as a trigger. SECOND, and more damaging to the proposal, the win-back absence was a control-vocabulary failure of exactly the kind this corpus punishes: 'lapsed' and 'winback' tokenise to zero because Addmi does not use those words. The shipped feature is a checkbox under a heading literally reading 'Automated Email Marketing' in chunk 2834, labelled 'Notify customers that have not visited your place in 30 days' -- an always-on triggered send that the proposal's own sentence ('there is no always-on trigger entity') denies exists. Any 'no' here would have been a false statement of absence about a shipped feature, so I rejected the 'no' option in the brief outright; and partial at grade C on the marketing page is wrong in the opposite direction, because the capability is now attested in first-party shipped source, not merely asserted in a brochure. Grade A on the back-office bundle is correct and the claim is table-stakes, so no differentiator floor applies. Partial rather than yes survives on three named shortfalls, all verified rather than inferred: firstVisit tokenises to zero across all 456 files so the first-visit thank-you limb genuinely does not exist; the win-back toggle is a single switch with a hard-coded 30-day window and no audience, offer or cadence control; and the birthday reward is a membership-level entitlement, not a campaign, while the campaign builder itself (chunks 4265/1329/8056/7926) offers only 'Send Now'/'Save as Draft' with no trigger or schedule entity -- so the claim's 'as configurable always-on campaigns' conjunct shortfalls even where the triggers exist. I also cleared the proposal's two stated poison controls and add a third it missed: freeItem IS a redeem-rule reward type as the proposal said (chunk 2785, redeemRuleType {deductPoints, discountPercentage, discountFlat, freeItem}) and is NOT the birthday benefit -- the birthday benefit is a separate membershiplevel setting -- so the proposal was right about that trap; 'lapsed' does match 'collapsed'; and the third, which the proposal reported as a genuine signal, is that all 12 'milestones' hits are Addmi's INTERNAL admin activation funnel (chunk 9417, meta admin:true, 'Addmi revenue (our cut)') tracking merchant signups, not guests -- a reader could easily have mistaken that screen's 'Drip' and 'Milestones' timeline for a guest lifecycle tool. No double count with guest-loyalty-unified-profile, which rests on the pointwallet/businessContact reducers and the absence of a merge action; nothing in this note asserts identity resolution. The earn-rule enum {amountSpent, Visit} is recited here only to show that no visit-MILESTONE trigger exists, and belongs to guest-loyalty-accrual-models, which should be re-based on it separately rather than crediting it twice. Scope, per the sibling finding: the corpus is the back-office bundle and the POS is a separate native app, so the firstVisit zero bounds the back office, not the product -- which is a further reason this is partial and not no. Checked 2026-09-15. source |
| digital-menu-single-source | unknown, grade F | resolve-to-yes | Challenged as a shared-data-model mistaken for single-source publishing. It survives, on evidence I re-opened myself. Quote fidelity first: the researcher quoted hideFromPOS:false, hideFromStore:true, featuredInStore:false, but the served payload literally reads hideFromPOS:c, hideFromStore:d -- minified aliases. I decoded the __NUXT__ invocation argument list (null,"id",false,true,0,...) against its parameter list (a,b,c,d,e,...); the quote is exact. The proposal was nevertheless under-evidenced on the conjunct that matters: it showed only that ONE catalog object is SERVED, which is a shared data model, not proof that there is no separate digital menu build. I closed that gap in the back-office bundle: the dashboard route table contains exactly one menu section and no channel-specific menu builder, and its item editor writes a single Listing via createListing/updateListing with the channel choice reduced to one checkbox, "Hide from online store". That is single-source publishing, not merely a shared schema. The three undercuts the brief asked for all failed: the storeMenuUpload/storeMenuReview routes are AI onboarding ("Upload Menu Photos", "Review Menu Extraction"), an importer into the same catalog rather than a second channel menu; posCatalogCategoryID and storeCatalogCategoryID are two placement pointers ON THE SAME ROW, per-channel merchandising of one record, not a duplicated menu; and priceOverrides hang off availabilityAssignment (dayparting/availability), not off a channel, so they are no channel price book. The kiosk and 86 conjuncts in the brief are not in this claim's text -- the taxonomy wording is "all first-party digital channels", while kiosk and 86 propagation belong to menu-pricing-86-propagation -- and a full-corpus census returns zero "kiosk" tokens for Addmi, so the web store is the whole first-party digital surface. The second tenant capture (101 Red Barn) corroborates the query shape but returns an empty catalog, so 911drinkspot carries the row-level evidence alone. Grade A stands on served application state, merchant-bundle source and the anonymous OpenAPI spec; no shortfall could be named, so a partial would be unfounded. I trimmed the eightySix and delivery-blog material out of the note so it cannot pre-empt two unscored cells. Original value was unknown/F, so in verification.jsonl this is a resolve-to-yes, not a challenge to an asserted value. source |
| menu-pricing-nested-modifiers | unknown, grade F | resolve-to-partial | PROPOSAL'S VALUE, GRADE AND URL UPHELD; ITS SHORTFALL (2) CORRECTED AS OVERSTATED. I re-parsed the spec myself from the local openapi.json (the swagger-ui-init.js inline swaggerDoc) and re-read the merchant bundles. Nesting is genuine, not a flat second tier: subModifierSetAssignment is keyed {subModifierSetID, modifierID} and the line-item schema puts subModifiers inside each modifier choice, so a modifier really does carry its own group. The proposal's claim that the second level 'has NO selection constraints at all' is wrong as written: CatalogSubModifierSet.defaultID is a compulsory single default (radio input, error string 'You need to declare a default sub modifier for this set'), which is a forced-selection mechanism of the exactly-one kind -- what is missing is operator-settable min/max counts, multi-select, and any per-item override. I rewrote the shortfall accordingly and added the per-item-vs-global asymmetry. The third-level absence is bounded by a closed enumeration rather than a failed search: 25 namespaceCatalog* entities, 652 actions, 64 schemas, and a sub-modifier row UI with no assign control. Value stays partial and cannot be upgraded (the claim's leading conjunct, three levels, fails outright) and cannot be downgraded to no (level-one min/max plus a required count are documented and served). NO DOUBLE COUNT: this note rests on the nesting chain, the assignment entities and the selection-count fields; it does not bank CatalogModifier.modifierType ['normal','quantity'], which is the topping-tiers cell's evidence, and it cites the sub-modifier's compulsory default only as a SELECTION rule, leaving the 'Cost Multiplier' (% of modifier price) percentage to the tiers cell and modifierOverrides to the price-by-parent-size cell. Grade A is correct: primary OpenAPI documentation plus shipped source. Original cell value was unknown/F, so when applied this is a resolve-to-partial, not a downgrade. source |
| extensibility-oauth-partner-apps | unknown, grade F | resolve-to-partial | Re-fetched https://api.addmi.com/api/docs/ (HTTP 200, 3,106-byte shell) and .../swagger-ui-init.js (HTTP 200, 220,499 bytes) anonymously myself, re-extracted swaggerDoc by brace-matching and confirmed it is byte-identical to the cached init file and structurally identical to .cache/q310-addmi/openapi.json, so the proposer's parse is faithful. Value and grade upheld; the note is amended because two of the proposer's load-bearing statements do not survive. (1) The proposer scored 'operator-granted' as MET, citing the dashboard's Client ID / Client Secret / Callback URLs screen. That is backwards: the credential is issued to the MERCHANT, so a partner integrates by receiving the operator's secret. The claim's own parenthetical excludes exactly that ('not shared static API keys or credential sharing'), so this evidence counts AGAINST the claim, not for it. A partner-app OAuth has the developer holding the client credential and the merchant granting consent; here the roles are inverted, and 'consent' is a word-boundary zero across the whole spec. (2) The proposer asserted that multiple integrators 'necessarily share one credential and revoking one revokes all'. That over-reads a UI into a data model: the event model is per-businessAPIID and does carry com.addmi.business:api.delete.v1, so per-credential deletion may well exist server-side. What is actually evidenced is narrower and is what I wrote - the back office surfaces one pair with no per-app list and no revoke or regenerate control, and no revoke endpoint exists in the spec. Partial is nevertheless correct and not self-refuting: exactly one conjunct is genuinely met at grade A - a published OAuth 2.0 authorization-code flow with 24-hour access tokens and 30-day refresh tokens - which is materially more than a bare static API key. Not upgraded: the scope zero is not a mere absence of the word but an absence of the mechanism, since no securityScheme of type oauth2 exists to hold a flow or a scope list, and the credential entity has no scope field. Not downgraded to no: OAuth 2.0 demonstrably is published, so 'no' would be a false statement. Two poisons the proposer missed are now recorded: the integration-settings chunk's 'permissions' and 'manage or revoke access' strings are Facebook's, and chunk-vendors' revokeAccessToken is Firebase's - either could manufacture a future false upgrade. Finally, the claim does NOT require a partner directory or an app marketplace despite the cell id saying 'partner-apps'; the taxonomy text (weight table-stakes) requires only OAuth 2.0 with scoped, operator-granted, individually revocable permissions, so the absent directory is context, not a failed conjunct, and is not double-counted as a shortfall. source |
| order-capture-offline-order-entry | unknown, grade F | upheld | Proposed partial from the anonymous api.addmi.com OpenAPI spec and the addmi.com/dashboard bundles (310th session); rejected on verification: Rejected: every conjunct of this claim is about ORDER ENTRY, and all of the proposal's load-bearing evidence is about CARD TENDER. (1) The TOS definition I re-read (p_https_addmi_com_tos.txt lines 49 and 119) is explicitly and only about card data -- 'Offline Credit Card Transactions means the situation when encrypted credit card transaction information that is stored locally on a device when the proper network connection is unavailable. An attempt to facilitate the transaction can be made when the connection is restored.' -- and the operative clause is permissive and disclaimed: 'addmi MAY offer a feature that facilitates transacting Offline Credit Card Transactions', 'at your own risk', 'As Is and As Available'. It establishes a contractual offline card-capture feature and says nothing about creating orders, applying modifiers, routing to kitchen, or tendering cash while offline. (2) The action evidence is tender-scoped by construction, not by inference: actions.txt holds exactly ONE OFFLINE action among all 652 types, com.addmi.transaction.tender.OFFLINE.v1, and all 21 bundle references are ACTION_TENDER_OFFLINE. In the raw bundle its creator is u(authors, transactionID, tenderID, tender, extra) and it is reduced in the same switch arm as AUTHORIZE / DECLINE / PURCHASE / PREPAY_PRE_AUTHORIZE, every one operating on t.tender; TenderStatus.offline sits in an enum beside captured, voided and declined. That is a payment status, not an order-capture path. (3) RAW-BYTE check of the published poison -- confirmed, and the proposal was right to flag it: the 72-hour hold, the $100 per-transaction default and the loyalty/gift-card/text-to-pay drop-off live in a separate <h2 id=the-fine-print-that-costs-trucks-money> section, in <p> elements attributed by <sup> footnotes to SQUARE [2] and TOAST [3]. Addmi's only self-referential sentence sits roughly 2,000 bytes later as a sales bullet under <h2 id=how-to-keep-selling-through-a-dead-zone>: '<strong>Choose a POS built for it.</strong> Addmi keeps taking payments when the network drops, stores orders locally, and syncs automatically when you are back online -- with no monthly fee, no per-terminal fee, unlimited terminals at a flat 19 cents per in-person transaction...'. Tag-stripping would weld the Square/Toast matrix onto that bullet and manufacture a published Addmi offline scope that does not exist; in the raw bytes the two are in different sections. The claim's second conjunct (the vendor publishes what does and does not work offline) therefore fails outright, as the proposal itself concedes. (4) That leaves the first conjunct supported by the four-word clause 'stores orders locally', inside a marketing bullet that runs straight on into pricing copy -- grade D, and not on the cited page at all: the proposal sets url=https://addmi.com/tos, which does not carry that proposition. A partial that fails the published-scope conjunct entirely, has no evidence whatever for modifiers, kitchen send or offline cash tender, and supports order storage only with a grade-D sales bullet is self-refuting; partial/B over-grades it twice over (the legal page is a legitimate B but carries only card tender, while the order clause is D marketing). The cell stays unknown/F with a rationale and NO url when applied -- final_url above names only the page I re-opened, and must not be written onto the row. SCOPE: per the sibling verifier, the 652 actions come from the back-office bundle and the POS is a separate native app (com.addmi.pos; its Play listing is HTTP 404 Not Found in this corpus), so I publish no zero here -- the tender-only finding is a statement about what the proposal's evidence IS, not about what the POS cannot do, and offline order entry may well exist unevidenced. CONTROL POISON FOUND: 'syncQueue' returns 29 substring hits in the back-office bundle and every one I opened is Firestore's own 'asyncQueue' (garbageCollector / localStore internals); an offline-order-queue control built on that token manufactures a false positive, so tokenise it. Likewise the bundle's window 'offline' event listeners are Firebase Realtime Database reconnect code, not Addmi's. DOUBLE COUNT: none arises from this verdict, because the cell does not move. But the separate correction pass must not spend the same single 'stores orders locally' bullet twice -- reliability-offline-order-entry is already partial/D on the sister food-truck guide for a near-duplicate proposition, and if it is re-based on this guide's bullet then this cell must stay unknown. Equally, the TOS card definition supports only the card-acceptance half that hardware-offline-mode already records at partial; it cannot also carry an order-entry cell. source |
| labor-manager-override-audit | unknown, grade F | upheld | Proposed partial from the anonymous api.addmi.com OpenAPI spec and the addmi.com/dashboard bundles (310th session); rejected on verification: The partial shortfalls every conjunct of a three-part conjunctive claim (attributed to the individual approver AND immutable AND queryable after the fact), which is self-refuting. (1) APPROVER ATTRIBUTION FAILS, and the proposal's own key evidence refutes it: 'authors' is real (649 tokenised hits, on every action constructor) but chunk_8017 defines it verbatim as authors(){const e=[this.accountEntityId,this.businessEntityId];return this.isSuperAdmin?e.push('/app:backend/superAdmin'):e.push('/app:backend/account'),e.filter(...)} -- it is the ACTING operator's own session identity (their account entity + businessID + a role tag), not a second approving party. approvedBy, approver, authorizedBy, overrideBy, managerID, performedBy and supervisor all tokenise to ZERO in the 3.48 MB vendor chunk. No action among the 652 captures an approver distinct from the operator, and there is no override action type at all: 'override' tokenises to 3 hits in actions.txt and all three are pricing/delivery config (catalog.settings.locationDeliveryOverrides, setDenomRoundingOverrides, vendor.inHouseDeliveryOverride). (2) THE CITED APPROVAL FAMILY IS THE WRONG MECHANISM. com.addmi.transaction.detail.approvalinfo.ACCEPT/REJECT/AUTO_REJECT/SET_AUTOREJECTAT.v1 verify verbatim, but their constructors are acceptTransaction(authors, eta, processing=ProcessingType.server), rejectTransaction(...reason...) and setAutoRejectAt(authors, autoRejectAt), folding to {accepted, rejected, autoRejected, autoRejectAt}. An eta, a server-side ProcessingType and an auto-reject deadline are an INCOMING-ORDER accept/reject workflow (merchant accepting an online order with a prep ETA), not a manager overriding a cashier. Reading it as override approval is the substring trap this vendor actually carries. (3) QUERYABILITY FAILS and the proposal concedes it: 'audit' tokenises to ZERO in the vendor chunk, the index chunk and the role chunk alike -- so the flagged audit/SOC-2 substring trap does not even arise here, there are no hits to disqualify. No audit, activity or log route exists among ~200 dashboard routes (reports/, sales-summary, labor-summary, orders-summary, shiftreviews, timecards are business reporting, none an override log), and the anonymous OpenAPI has six paths only (/oauth2/authorize, /oauth2/createToken, /oauth2/refreshUsingToken, /menu, /transactions, /webhook) with zero occurrences of 'audit' or 'approv*'. (4) Immutability is an INFERENCE from reducer shape (a 'deleted' timestamp rather than row removal), not a documented property, and cannot carry a partial alone. WHAT IS GENUINELY THERE, and it is a permission gate not an audit record: chunk_8017 ships operator-facing text 'Users with no permission need manager Override.' on applyDiscounts, voidOrders and issueRefunds, plus 'Override only for opening cash drawer' on manageTills. So Addmi demonstrably HAS a manager-override flow -- but nothing in the served corpus records who approved it. That is exactly the distinction settled against unicenta-opos on 2026-09-05 ('an override PIN is a permission gate not the audit record'), and it lands the same way. DOUBLE-COUNT WITH labor-granular-rbac: those four Override sentences and the 14-value POSModules enum are the rbac cell's primary evidence, in the rbac cell's own citation (chunk_8017); the override cell may not be scored a second time off the same permission enum, which is the only thing the proposal's 'each maps to a grantable POS permission' sentence adds. NOT downgraded to 'no': the 652 actions were enumerated from the merchant back-office bundle, and the POS itself is a native app (com.addmi.pos / com.addmi.businessnew) outside this corpus, so a POS-side override record cannot be excluded -- a corpus is not a census. Cell stays unknown/F. source |
| guest-loyalty-unified-profile | unknown, grade F | resolve-to-partial | Re-opened the corpus and refuted the proposal's central shortfall. The proposal asserted that 'there is NO merge, link or dedup action among the 652 distinct com.addmi.*.v1 action types' and that the claim's dedup/merge conjunct 'fails outright'. That absence was bound to a partial chunk sample. I resolved chunkmap.json (454 lazy chunks against ~20 the proposer held) and fetched them serially -- an initial 6-way concurrent pass returned 403 on all 454, which was my own rate-limiting and not a host bar, since serial refetches return 200. Chunk 2185.45dd815c.js is the Contacts/CRM module and it implements exactly what the proposal said did not exist: a 'Merge Duplicate Customers' modal, a server-side duplicateBusinessContacts(businessEntityID) GraphQL query, and a mergeDuplicates() that re-points contact-group assignments onto a surviving record and deletes the duplicates via batchActions. It is invisible to an action-type census because it mints no new action type, which is why the proposer missed it. Value and grade nonetheless stand at partial/A rather than upgrading: the merge matches on email.trim().toLowerCase() only (the duplicate query returns no phone field), it is operator-initiated rather than automatic, and the chunk contains zero occurrences of wallet/pointWallet/loyalt/transaction, so loyalty balances are not folded and transactions are not re-pointed -- the claim's 'automatically merges transactions ... under one identity' is still not met. I also verified the proposal's cross-channel evidence was cited to the wrong file: loyaltyPoints, applyLoyaltyRewardToCart and optOutOfLoyalty tokenise to ZERO in the cited chunk-vendors bundle and live in the guest ordering client (8e00c83, part of the _nuxt set); the finding is real but the citation was wrong, and the note now attributes it correctly. Corrected two field lists against reducers.txt: the wallet's key is 'id' not 'walletID' and its opt-out field is 'timeOptedOut' not 'optedOut'. Confirmed kiosk is not an Addmi surface (zero across every corpus incl. all marketing pages), so 'spanning channels' can only mean POS plus web store/QR dine-in here. Published the merge/duplicate poison: all 40 'merge' and 5 'duplicate' hits in chunk-vendors are v-calendar/Firebase/vee-validate/vue-i18n/vue-router boilerplate, and contact.convert.v1 is the generic event-sourcing snapshot primitive, not a guest merge. No double count: guest-loyalty-lifecycle-automation covers triggered campaigns and digital-account-saved-payment covers guest accounts with stored cards; neither turns on profile unification or dedup. source |
| labor-granular-rbac | unknown, grade F | resolve-to-partial | Value upheld, note rewritten: the proposal's shortfall list was materially wrong in the direction that matters, and a partial whose named shortfalls are false is not a finding. I re-opened chunk_8017.js myself and confirmed the closed 14-value POSModules enum verbatim from its emitted TypeScript enum literal (e['viewSalesActivity']='app:pos:viewSalesActivity' ... e['timeCardAdjustment']='app:pos:timeCardAdjustment') and from the component's hardcoded posModules() label/desc array, and confirmed operator-authored roles from the 'role/create' route in index.b265f90a.js plus ActionRoleModule Create/Update/Delete/Copy. Of the three gaps the proposer named, one is false and one is soft: applyDiscounts is labelled 'Apply Discounts and Comps' and described 'Allow users to apply discount and comps', so comp IS grantable (bundled with discount, not missing); manageTills is labelled 'Manage Tills & Open Cash Drawers' and carries 'Override only for opening cash drawer', so drawer opening is both covered and separately overridable. Only the price-change gap survives, and I verified it as a strong zero ('price' = 0 occurrences, substring included, in the 30,582-byte chunk). Because the proposer's note would have published two false absences about a named business, it is replaced. I considered upgrading to yes: Addmi covers six of the claim's seven actions, roles are genuinely operator-authored, and two peers scored yes (arryved, union-pos) have comparable per-action sets with no location scoping. I did not, for two reasons. First, the claim conjoins 'per role and per location' and the per-location half is positively absent here, not merely undocumented — the role reducer holds businessID only and no location entity exists in 652 action types; union-pos records the same gap only as an unresolved caveat, whereas nearly every well-evidenced yes in the set (cake-pos, touchbistro, restaurant365, itsacheckmate, infor-hospitality, marketman, spoton, shift4-skytab, crunchtime) establishes location scoping affirmatively. Second, price change is one of the seven actions the claim names, and the recent adyen partial (2026-09-08) is the governing precedent for shortfalling on enumerated actions that have no permission to grant. Grade A is correct: this is served application source code, not documentation or marketing. Boundedness challenged and recorded rather than waved through — the enum is closed over the role-authoring UI, which bounds grants, but the POS is a native app outside the corpus, so the note does not assert a product-wide absence. Poison control re-run independently: all 340 'permissions' hits in dashjs_chunk-vendors.08aeeb98.js are Apache-licence boilerplate (340/340), so the proposer's exclusion of them is correct. No double count with labor-manager-override-audit, which was rejected and stays unknown: that cell rests on the event-sourced action log and attribution, this one on the grant enum, and the note explicitly disclaims any audit/attribution finding. source |
| digital-account-saved-payment | unknown, grade F | upheld | Proposed no from the anonymous api.addmi.com OpenAPI spec and the addmi.com/dashboard bundles (310th session); rejected on verification: Rejected: the proposed no/A is wrong on the claim's most important conjunct, and its corpus was not a census. THE CENSUS FAILED TWICE. (a) The proposer called five eager files (2.87 MB) 'the complete served ordering client'. They are not: the tenant ordering page serves a2e5a56/1552866/65bd8a4/9442fe0/8e00c83, and the proposer censused 69748f4 -- the HOME page chunk -- while missing 1552866, the ORDERING page chunk. I fetched 1552866 (28,849 bytes, HTTP 200). (b) Far worse, a2e5a56 is the webpack runtime and contains the chunk map {0:'0d81aa9' ... 245:'eef1b4f'}.modern.js -- 242 lazy chunks the zeros were never bound to. I fetched all 242 anonymously (7.41 MB, 0 failures) and censused them. THE ZEROS WERE A VOCABULARY ARTEFACT. Addmi does not use the word reorder for reordering; it uses purchasedCart. Chunk 493f037 loads getPurchasedCarts for the store page, eef1b4f offers the mostRecentCart back to the guest in an overlay and dispatches createCartFromPurchasedCart, and four chunks render a $gettext('Order again') button on the receipt page. 'One-tap reorder of a previous order' is therefore SHIPPED, which is the exact conjunct the proposal declared absent -- a no here would have been a false statement of absence about a named business. THE SECOND KEY CLAIM IS ALSO FALSE. The proposer asserted token/gatewayToken is 'Square's per-transaction nonce rather than a stored card' and that checkout is 'a one-shot Square Web Payments form'. The client ships two gateways, and the Stripe component's submit() branches on clientSecret.indexOf('seti_') into confirmSetup -- a Stripe SetupIntent, whose only purpose is storing a card for later -- emitting it as the same gatewayToken. Chunk 1da9371 carries com.addmi.paymentmethod.create.v1 {type: card, card} inside the guest app, and d342db2 reads a savedPaymentMethod flag back from /api/verifyCode. ONLY ONE OF THE TWO CHALLENGED FINDINGS SURVIVES: 'login' is genuinely merchant-side only -- all 22 eager-bundle hits are ActionBusinessAccountLogin/ActionVenueAccountLogin, the LoginMethod enum (DashboardPassword/PosPassword/PosPIN/PosScan) and a nav link to /dashboard/auth/; the three lazy-chunk signIn hits are blog prose and the merchant ToS. I upheld that and it is why the value is not higher: there is still no guest account, and savedAddress/addressBook are zero across all 242 chunks, so the claim's 'account with saved addresses' conjunct fails and the stored card is evidenced only for membership auto-renewal. Net: partial at grade A off served first-party source, with the shortfalls named. Note for application: the record's current value is unknown, so this lands in verification.jsonl as resolve-to-partial, NOT a downgrade. Also correct two errors carried in the existing unknown rationale: the checkout is not Stripe-only (it is Square or Stripe per gateway config), and 'no page mentions ... one-tap reorder' is now superseded by the client's own Order-again flow. No double count with guest-loyalty-unified-profile: that cell rests on the point wallet's ownerEmail/ownerPhone identity and its missing merge/dedup action, whereas this one rests on the purchased-cart reorder path and the paymentmethod entity; neither borrows the other's evidence. source |
| menu-pricing-modifier-price-by-parent-size | unknown, grade F | resolve-to-partial | Re-opened the spec and corpora independently rather than trusting the proposal. The challenge hypothesis (that catalogItemVariant yields only item-level variant pricing) is confirmed, but one conjunct genuinely survives, so the partial does not refute itself. Parent-item repricing is real and load-bearing, not a per-modifier-group override: I verified itemID on the CatalogModifierSetAssignment reducer in two independent places (reducers.txt and the ActionCatalogModifierSetAssignmentCreate/Update/Copy reducers in chunk-vendors), and the per-item Customize Modifier dialog exposes it as 'Override Price?'. The size half fails structurally, not merely for want of evidence: Addmi built variant-keyed pricing for item prices (PriceOverride.variantID) and did not extend it to modifiers, which is positive evidence of the shortfall rather than silence. I did not bank CatalogModifier.modifierType, which belongs to the nested-modifiers and topping-tiers proposals. On the census objection, the fetched chunks are not a blind 4-of-454 sample -- they are resolved from the index bundle's router, where storeItems = [7576,7583,8440,3663,4550], storeItemNew/storeItemEdit = [7583,8440,3006,3663,2317] and storeModifiers = [8440,2492]; every menu/catalog editor chunk the router names was fetched, so the absence is bound to the publisher's own route manifest. Two corrections to method: my first tokenised size control returned 0 hits on openapi.json because '.' does not match newlines in a pretty-printed JSON file -- my own control carried the trap, and re-run with the dotall flag it returns 10, vindicating the proposal's figure, which I had been ready to call wrong. I also ran a positive control (1,161 modifierID windows) before accepting the variantID zero, since a zero from an untested harness proves nothing. Amended rather than upheld because the proposal missed PriceOverride, the variant-keyed item-price lever that both sharpens the shortfall and shows the omission is deliberate, and because the note needed the production-usage and bounded-absence figures to stand on its own. Value partial and grade A both stand. source |
| kitchen-station-routing | unknown, grade F | resolve-to-yes | Re-opened the evidence independently and confirmed all three verbatim descriptions in the served swagger-ui-init.js by byte offset ("The initial fulfillment station of the item" at 139184; the modifier and store-item variants at 88801 and 202806), so routing is configurable per item AND per modifier as proposed. The proposal's weak point was its inference that stations are 'authored from the dashboard with no vendor involvement' -- it argued that from action names alone, and a schema field plus an action name is a data slot, not proven product behaviour. I closed that gap myself by resolving the router's 'stations' chunk from chunkmap.json and fetching https://addmi.com/dashboard/js/9901.4bc61e90.js live (200, 88,248 bytes), which is the merchant station manager: Add/Create/Edit Fulfillment Station, Station Name, Items to Stations Assignment with per-item checkboxes, and the vendor's own phrase 'Order Routing'. I also corroborated multi-station routing of one order in prose on the KDS product page ('Double Fulfillment'), rather than resting on the initialStateIDs normaliser as the proposal did. Value and grade stand at yes/A (table-stakes weight, so no differentiator floor is engaged; the source is a published spec plus served application source). The note is amended rather than upheld because I rewrote it onto the evidence I verified and added the controls the proposal omitted: order-type and revenue-center routing tokenise to zero, category is bulk assignment not a rule, the LineItemCatalogItem quote actually belongs to the LineItemCatalogItem_catalogItem sub-schema, and the in-app help article 65000166722 is 404 with no Wayback capture. Double-count check: the fulfillment-completion machinery (stateIDs / stationFulfills / requiresExpediter) is cited here only as proof that the station assignment drives real runtime behaviour -- it is the missing conjunct of kitchen-expo-consolidation (currently partial/C on the marketing page) and should be taken up there separately, not counted twice; kitchen-bump-bar-hardware (no/B) is untouched. Note also that no tenant ordering page in the cached /b/* census exposes initialStateID, so the field is merchant-side, which is consistent with a kitchen-routing field and not evidence against it. source |
| menu-pricing-topping-quantity-tiers | unknown, grade F | upheld | Proposed no from the anonymous api.addmi.com OpenAPI spec and the addmi.com/dashboard bundles (310th session); rejected on verification: REJECTED; the cell resolves to the opposite pole. I re-fetched https://api.addmi.com/api/docs/swagger-ui-init.js myself (200, 220,499 bytes, byte-identical to the cached copy) and confirm the two facts the proposal rests on: modifierType is exactly ['normal','quantity'] with the description 'Denotes whether quantity can be selected for the modifier', and CatalogModifier.priceAdjustment is a flat Money. The proposer's reading of THAT field is right -- a two-value switch plus a flat adjustment is add-it-twice, not tiering -- and their substring controls hold (multiplier/tier/portion/half tokenise to zero in the spec; the 3 'fraction' hits are Percentage_rat plumbing; I re-ran them and add that 'half' would have been caught by 'behalf' in two dashboard chunks). But the proposal is built on a misread of the adjacent schema and it inverts the answer: it states 'CatalogSubModifier.priceAdjustment (Money)', and the spec says `$ref: Percentage`. That single substitution erases the multiplier, because a PERCENTAGE adjustment on a named, ordered, defaulted option attached to a modifier is precisely a per-tier price multiplier. The proposal's 'closed enumeration' argument is therefore not a census of the price model -- it enumerates one field's enum while the tier lever sits one level down, on an entity the proposal itself lists (CatalogSubModifier) and mis-types. On the census question the answer runs against the proposal rather than for it: I did not rely on the partner API. I pulled the merchant back office's own Modifiers screen (chunk 2492 via the storeModifiers route, 200 anonymous) and it renders a column literally headed 'Cost Multiplier', an input-percentage labelled '% of modifier price' with placeholder '100%', and a required 'Default' radio, alongside a separate 'Qty' checkbox that writes modifierType -- the two mechanisms side by side in the product's own configuration UI, exactly as the claim distinguishes them. Addmi's release post (live and archived 20221201065722) states the arithmetic in the vendor's voice ('a 50% charge for half a pizza ... a $2 topping on a full pizza becomes $1 on half'). Grade A on shipped back-office source plus the public spec; the claim is table-stakes so no differentiator floor applies. I considered downgrading to partial on the grounds that Addmi ships no light/regular/extra vocabulary and documents the lever for halves, but declined: the claim asks for a configurable multiplier per tier, not for vendor-seeded tier names, and peers holding yes on this cell are the same shape or weaker (floreant-pos yes/A on an operator-maintained MULTIPLIER table with RATE; ncr-voyix-aloha yes/B on 'Charge X percent'; quantic-pos yes/B on 'the price can be a multiplier'; linga-pos yes/B on an absolute per-prefix price). Both caveats are recorded in the note instead. No double count: the nested-modifiers proposal in this batch cites the same modifierSet->modifier->subModifierSet chain only for DEPTH and min/max selection counts, and the modifier-price-by-parent-size proposal cites modifierOverrides (Money, keyed by modifierID) -- neither asserts the percentage multiplier. One lead for a different cell, not scored here: the vendor's own half-pizza example and the 'pick the left or right side' sentence bear on menu-pricing-fractional-placement and should be checked there rather than double-counted into this one. Checked 2026-09-15. source |
| inventory-unit-conversion-yields | unknown, grade F | resolve-to-no | Re-opened the evidence independently; the value and grade survive but the note is materially amended and strengthened. (1) The proposer's headline trap is real but was reported against the wrong corpus, and I treated its own absence evidence as untested: its 'unit'=United (6/6) finding is about the 232 KB app chunk only. I re-ran a 20-probe tokenised census -- uom, unit of measure, conversion, conversionFactor, purchase/recipe/count unit, case, pack, each, yield, waste %, portion, shrinkage, oz/lb/g/L, recipe, ingredient -- over 13 corpora INCLUDING the 3.5 MB vendor bundle, the 2.87 MB guest bundle, the spec and the tenant page. The concept is genuinely absent; but I found the proposer had left its most dangerous control untested where it mattered: 'conversion' returns 113 hits in the vendor bundle it cites, all of which are ActionAccountConvert/ActionBusinessContactConvert lead-conversion payload keys. That poison is now published in the note rather than left as a landmine. 'unit' in the vendor chunk is likewise 75 hits of moment/date-fns time units and the ISO 4217 minorUnit table around only 6 real ones. (2) CENSUS, the ground I was prepared to reject on: the proposer censused 4 of 454 chunks, and the router table exposes unfetched storeInventory, storeItemCSV ('Import Items'), storeItemNew/Edit and reports--inventory--stock routes -- an inventory module could have lived there. I resolved the chunkmap and fetched all of them (robots.txt re-checked: Allow: / with no bar on /dashboard/js/). They are clean, so the corpus is now a census of the inventory module and the reject-to-unknown ground is closed. (3) The fetch also CORRECTED a proposer statement I would otherwise have let stand: it wrote that the reducer 'sets it only on creation -- case ActionInventoryCreate: return t.unit', which reads as though the merchant supplies a unit at creation. At the application layer t.unit is always the string literal "Unit", hard-coded in both the item editor and the CSV importer; there is no unit input in the UI. That makes the absence stronger than proposed -- not one unit per item, but no user-settable unit at all -- and it is now the note's lead fact. I also corrected the proposer's reducer field list, which conflated the inventory reducer with its stateQuantities sub-reducer and dropped customQuantities and thresholdCrossed. (4) DOUBLE COUNTING with inventory-recipe-bom-costing in the same batch: partly, and the note is written so a reader can see it. Both cells share one premise -- that the six com.addmi.inventory.*.v1 actions are a closed enumeration -- so if that premise fell, both would fall together, and the shared corpus should not be read as two independent confirmations. But this cell does not merely re-bank that corpus: its decisive evidence is a PRESENCE, not an absence (a single non-editable unit plus an assertion that throws 400 on a unit mismatch), and it rests on three surfaces the recipe cell does not touch -- the hard-coded unit:"Unit" literal in chunks 2317 and 8400, the closed five-reason adjustment dropdown, and the Stock report's column list. (5) Grade A is correct and not over-graded: application source code and a published OpenAPI spec, both retrieved anonymously, which the rules admit at A; the claim is table-stakes so no differentiator floor applies. final_url kept as the vendor chunk (a notes.json key) because it carries the reducer; the newly fetched chunks are cited inside the note. Prior value was unknown/F, so when this lands in verification.jsonl it is a resolve-to-no, not a downgrade. source |
| extensibility-webhooks-push | unknown, grade F | resolve-to-no | Re-opened the evidence independently rather than accepting the proposer's read. Fetched https://api.addmi.com/api/docs/ (HTTP 200, 3,106-byte Swagger shell, anonymous) and re-fetched swagger-ui-init.js live: 220,499 bytes, MD5 6BF9BEDA8124AB380E74559C2FE566A2, identical to the cached copy, so the parse is of the served document. Parsed the inlined swaggerDoc as JSON myself and confirmed the claim's load-bearing fact: webhook_body is an anyOf of exactly three objects, each with a single-value type enum, resolving to webhook_data/_1/_2 whose only property is an object $ref to CatalogItemVariant / CatalogModifier / CatalogSubModifier. Checked every escape hatch that could reopen the enumeration and found none: zero 'discriminator', zero 'additionalProperties' anywhere in the document, no top-level 'webhooks' key, no 'callback' in paths, and the schema list holds no Order type. CENSUS CHALLENGE, the one that decides this cell: a 6-path spec is not automatically a census, so I bound it on the configuration side rather than the documentation side. The merchant's only webhook surface is the dashboard's event-less webhookURLs list (chunk 2639: '+ Add Webhook', handleAddWebhookURL, hasWebhookURLChanges), persisted by one ActionBusinessAPI Create/Update over {clientID, webhookURLs} and read by businessAPIByBusinessEntityID {id, webhookURLs}; 'webhook' appears zero times across the 652 enumerated com.addmi.*.v1 action types and only once in the reducer census. With no per-event subscription model anywhere in the merchant application, everything that fires goes to the same flat URL list, and POST /webhook is the document enumerating what fires -- this is the publisher's own manifest, linked from the screen where merchants configure the feature, not a partner-scoped slice. The residual private-pipe risk does not rescue the cell either: the integrationsettings chunk shows Otter, MarketMan, QuickBooks and the rest as Addmi-built per-vendor credential forms, which is a first-party internal pipe, not a platform webhook offered to integrators. The partners page is a lead-generation form and advertises no developer programme; addmi.com carries zero occurrences of 'webhook'. WORDING CHALLENGE: rejected. The taxonomy claim reads 'pushes real-time webhooks for order lifecycle events (created, modified, paid, voided, refunded) rather than requiring polling' -- the subject is order lifecycle events and the polling phrase is a contrast clause, not a severable conjunct three catalog-availability events could satisfy. Catalog 86/out-of-stock is not an order event under any reading, so a partial would shortfall every conjunct and be self-refuting. CONTROL AUDIT: the proposer's 'event' zero survives tokenisation (0 raw, 0 as a token, 0 for 'events'), but their unexamined 'order' framing did not, and I KWIC'd it -- 145 raw hits are the sort-order integer, onlineOrderingClosed* and orderNumber*, which I have written into the note as poison. AMENDED rather than upheld for two reasons: the proposer's evidence blob is a research artefact, not a publishable self-contained note, and it omits the two findings that actually bound the verdict -- the event-less merchant configuration surface, and that no order-read endpoint exists either, so Addmi offers neither push nor polling for orders. Value no and grade A stand; the URL is the machine-readable document I parsed, not the catch-all /api/docs/ shell. Note for application: the prior value was unknown/F, so this applies as resolve-to-no, not a downgrade. source |
| commercial-autorenew-terms-published | partial, grade D | upgrade-to-yes | The prior note asserted 'no explicit renewal or notice-window language is published', which the vendor's own terms falsify outright. I re-read addmi.com/tos and located both required conjuncts: the all-caps automatic-renewal sentence and, in the fees section, the Renewal Commencement Date mechanic with cancellation permitted 'at any time prior to' it. This is vendor legal text, grade B, not the pricing page (grade D) the cell was citing, and the claim is table-stakes so no differentiator floor applies. Upgraded partial/D to yes/B. Adversarial checks run before upgrading: (a) I searched the whole document for numbered sections -- there are none, so the referenced 'section 9.6' does not exist and the opt-out procedure is a dangling reference; I kept that in the note rather than letting it silently support the cell. (b) The inference that the notice window is zero days is not mine -- the text says 'at any time prior to the Renewal Commencement Date', which is a stated window. (c) addmi.com 403s a ClaudeBot UA while serving 200 to a browser UA, so I confirmed the passages twice, through a browser-UA fetch of the whole 165,442-byte document and independently through a second retrieval today; robots.txt is generic Allow:/ and names no AI agent. source |
| reliability-offline-order-entry | partial, grade D | upgrade-to-partial | Upgraded the evidence grade only; the value stays partial and the named shortfall stays. The cell rested on a marketing bullet. Addmi's own terms define transaction information 'stored locally on a device when the proper network connection is unavailable' with the transaction attempted 'when the connection is restored' -- vendor legal text, grade B -- and the served back-office bundle carries com.addmi.transaction.tender.OFFLINE.v1 with a matching TenderStatus.offline enum member, which is grade-A corroboration that offline capture is a real state in the platform. Deliberately NOT treated as full support: a tender is not a ticket, and I kept the claim's routing and printing conjuncts unmet rather than let payment evidence stand in for order flow. Two traps I checked and am recording so a later pass does not step in them: 'syncQueue' returns 29 hits in the dashboard bundle and every one is Firebase's asyncQueue (the substring), and both navigator.onLine hits are Firebase connectivity boilerplate under an Apache licence header; offlineMode, isOffline, pendingSync, unsynced and storeAndForward all tokenise to ZERO there -- but that bundle is the merchant BACK OFFICE, not the POS, which ships as a native iOS/Android app, so those zeros bound nothing about the terminal and were not used as evidence in either direction. Contrast with hardware-offline-mode, which I rejected in the same pass: that claim demands kitchen printing, cash recording and a published degradation list, none of which this evidence touches. source |
| order-capture-scheduled-orders | partial, grade C | upgrade-to-partial | The cell was resolved off a marketing sentence ('curbside pickup, scheduled pickup times, or delivery services'). I fetched the dashboard router's 'frontofhouse' chunk set (3666/8896/5059, from chunkmap.json) and the 'storeFulfillments' chunk 6517 and found the actual settings model, which is far more specific than the prior evidence: two distinct per-channel scheduling actions, an explicit pickup prepDuration lead time, a delivery cutOffDuration before a dropOffTime, a rolling-days horizon, day-of-week restrictions, and a per-fulfillment dueAt rendered as 'Scheduled For' / 'Immediately'. That lifts the evidence from C to A and makes the first two conjuncts of the claim established rather than implied. I did not upgrade the value, and tested the third conjunct rather than assuming it: I ran fireTime, scheduledFor, scheduledTime, pickupTime, dueTime, readyBy, holdUntil and fulfillmentTime across chunk-vendors, index, 2639, 3006, 4454, 8017, 3666, 6517 and 8896 and got zero in every chunk, and prepDuration is absent from the domain-model bundle entirely, so no computed fire time is evidenced. I also found a limitation the researcher could not have seen from the marketing page and added it to the note: scheduled delivery is behind a testBusiness flag. Retrieval note: these chunks serve HTTP 200 anonymously to a browser UA; addmi.com returns 403 to a ClaudeBot UA while robots.txt is a generic Allow:/ that names no AI agent. source |
| guest-loyalty-unified-profile | partial, grade A | upheld | Verifier revised its own verdict after the first draft had been merged: the completed 454-chunk census showed identity resolution takes phone as well as email (the first draft said email only, conflating wallet lookup with contact dedup). Note replaced; value and grade unchanged. source |
| inventory-count-modes | unknown, grade F | resolve-to-no | REJECTING the partial: I re-opened every cited artefact and three of the claim's four conjuncts fail outright, the fourth half-fails, so the proposal shortfalls every conjunct and refutes itself. (1) FULL PHYSICAL COUNT -- the proposal's load-bearing assertion, that 'full physical counting exists as a first-class action', is false. I confirmed the cited reducer line verbatim (case i.ActionInventoryPhysicalCount: return a(0,t.count.scalar)), but the proposal read the ACTION and never opened the UI that emits it. In chunk 2317 (storeItemNew/storeItemEdit) physicalCountInventory is emitted from a switch over t.adjustment.kind whose sibling cases are received/restock/damage/theft/loss: 'Inventory Re-Count' is the sixth entry in a closed adjustment-reason dropdown on ONE item variant, relabelling the input to 'Current Stock'. That is the challenge's 'just quantity editing', exactly. A count that cannot span more than one variant is not a physical inventory. (2) SPOT COUNTS -- the proposal concedes these exist only 'in the weak sense that inventory records are per item variant, so an operator may count only some records'. By that reasoning every quantity field in every POS supports spot counts; it is not a finding, and I reject it. (3) CYCLE COUNTS -- conceded absent, and independently confirmed: no schedule, cadence, frequency or due-date entity touches inventory in any corpus. (4) VARIANCE HISTORY -- the proposal argued this from event-sourcing architecture ('balances are a fold over an append-only log'), which is inference about an implementation, not evidence of a product surface, and would have been grade F reasoning presented as A. I found the real evidence it missed -- the Stock Entries report and its businessInventoryAdjustReport query, which does give per-count timestamped, employee-attributed rows -- so the history half is better supported than proposed. But the conjunct says each count's VARIANCE, and there is none: the row shows the new absolute figure and reason, adjustFrom/adjustTo are empty on recount rows specifically, and variance/discrepanc/overage/shortage are zero across 12.8 MB. The conjunct fails as written. CONTROL AUDIT: the proposal's zeros were bound to the wrong corpus, the same error the sibling caught on the uom cell. It published "'cycle' is ZERO across the dashboard app chunk" -- true of the 232 KB app chunk, but its own final_url is the 3.5 MB vendor bundle, where 'cycle' is 3 tokens / 7 substrings. I ran every control over every corpus (55 files, 12.8 MB, tokenised with lookarounds); all hits are Firebase/Vue/Intl plumbing, so the conclusion survives, but the poison is now published rather than left as a landmine, along with two new traps: onHand is onHandleClick and sheet is the xlsx worksheet component, both inside the stock report. LANDING VALUE: not unknown. This is positive, enumerated absence -- a closed six-action inventory domain declared in one shared module, a closed six-value reason map, a closed report column list, a closed spec schema, and an unimplemented 414-byte storeInventory route -- bound by a census of every inventory-bearing chunk in the router's lazy-chunk map rather than a convenience sample. no/A. CONSISTENCY WITH THE SIBLING 'no' CELLS: partly the same corpus banked a third time, and a reader should see that. All three rest on one premise -- that the six com.addmi.inventory.*.v1 actions are closed -- so if that premise fell, all three fall together and they are not three independent confirmations. Where this cell differs: its decisive evidence is a PRESENCE, not an absence. Addmi does have a counting action; the finding is what that action IS (an absolute per-variant set, one reason code among six), which is a different and stronger kind of fact than 'the concept is wholly missing'. It also rests on three surfaces neither sibling touches -- the 'Inventory Re-Count' dropdown option with its 'Previously %{currentStock}' hint, the Stock Entries report's GraphQL field list, and the storeInventory stub. One correction to the sibling uom note while I was in the same chunks: it describes the reason dropdown as five values and omits Loss; the reasonMap in chunk 8821 is six -- received, restock, damage, theft, loss, recount. BOUND: the corpus is the merchant web dashboard, the guest ordering SPA, the published spec and the marketing site; the native iOS/Android merchant apps were not decompiled. The zero is defensible past that gap only because the closure is at the DOMAIN layer -- any count feature in a native client would still have to emit an inventory action, and that enumeration is closed in the shared module both clients consume. GRADE: A. Application source code and a published OpenAPI spec, both retrieved anonymously; the claim is table-stakes, so no differentiator floor applies. final_url is the vendor chunk (a notes.json key) because it carries the action enumeration and the physicalCount reducer; chunks 2317, 6627 and 8821 are cited inside the note. Prior claims.jsonl value is unknown/F, so in verification.jsonl this is a resolve-to-no, not a downgrade. source |
| digital-account-saved-payment | unknown, grade F | resolve-to-partial | Rejected: the proposed no/A is wrong on the claim's most important conjunct, and its corpus was not a census. THE CENSUS FAILED TWICE. (a) The proposer called five eager files (2.87 MB) 'the complete served ordering client'. They are not: the tenant ordering page serves a2e5a56/1552866/65bd8a4/9442fe0/8e00c83, and the proposer censused 69748f4 -- the HOME page chunk -- while missing 1552866, the ORDERING page chunk. I fetched 1552866 (28,849 bytes, HTTP 200). (b) Far worse, a2e5a56 is the webpack runtime and contains the chunk map {0:'0d81aa9' ... 245:'eef1b4f'}.modern.js -- 242 lazy chunks the zeros were never bound to. I fetched all 242 anonymously (7.41 MB, 0 failures) and censused them. THE ZEROS WERE A VOCABULARY ARTEFACT. Addmi does not use the word reorder for reordering; it uses purchasedCart. Chunk 493f037 loads getPurchasedCarts for the store page, eef1b4f offers the mostRecentCart back to the guest in an overlay and dispatches createCartFromPurchasedCart, and four chunks render a $gettext('Order again') button on the receipt page. 'One-tap reorder of a previous order' is therefore SHIPPED, which is the exact conjunct the proposal declared absent -- a no here would have been a false statement of absence about a named business. THE SECOND KEY CLAIM IS ALSO FALSE. The proposer asserted token/gatewayToken is 'Square's per-transaction nonce rather than a stored card' and that checkout is 'a one-shot Square Web Payments form'. The client ships two gateways, and the Stripe component's submit() branches on clientSecret.indexOf('seti_') into confirmSetup -- a Stripe SetupIntent, whose only purpose is storing a card for later -- emitting it as the same gatewayToken. Chunk 1da9371 carries com.addmi.paymentmethod.create.v1 {type: card, card} inside the guest app, and d342db2 reads a savedPaymentMethod flag back from /api/verifyCode. ONLY ONE OF THE TWO CHALLENGED FINDINGS SURVIVES: 'login' is genuinely merchant-side only -- all 22 eager-bundle hits are ActionBusinessAccountLogin/ActionVenueAccountLogin, the LoginMethod enum (DashboardPassword/PosPassword/PosPIN/PosScan) and a nav link to /dashboard/auth/; the three lazy-chunk signIn hits are blog prose and the merchant ToS. I upheld that and it is why the value is not higher: there is still no guest account, and savedAddress/addressBook are zero across all 242 chunks, so the claim's 'account with saved addresses' conjunct fails and the stored card is evidenced only for membership auto-renewal. Net: partial at grade A off served first-party source, with the shortfalls named. Note for application: the record's current value is unknown, so this lands in verification.jsonl as resolve-to-partial, NOT a downgrade. Also correct two errors carried in the existing unknown rationale: the checkout is not Stripe-only (it is Square or Stripe per gateway config), and 'no page mentions ... one-tap reorder' is now superseded by the client's own Order-again flow. No double count with guest-loyalty-unified-profile: that cell rests on the point wallet's ownerEmail/ownerPhone identity and its missing merge/dedup action, whereas this one rests on the purchased-cart reorder path and the paymentmethod entity; neither borrows the other's evidence. source |
| menu-pricing-topping-quantity-tiers | unknown, grade F | resolve-to-yes | REJECTED; the cell resolves to the opposite pole. I re-fetched https://api.addmi.com/api/docs/swagger-ui-init.js myself (200, 220,499 bytes, byte-identical to the cached copy) and confirm the two facts the proposal rests on: modifierType is exactly ['normal','quantity'] with the description 'Denotes whether quantity can be selected for the modifier', and CatalogModifier.priceAdjustment is a flat Money. The proposer's reading of THAT field is right -- a two-value switch plus a flat adjustment is add-it-twice, not tiering -- and their substring controls hold (multiplier/tier/portion/half tokenise to zero in the spec; the 3 'fraction' hits are Percentage_rat plumbing; I re-ran them and add that 'half' would have been caught by 'behalf' in two dashboard chunks). But the proposal is built on a misread of the adjacent schema and it inverts the answer: it states 'CatalogSubModifier.priceAdjustment (Money)', and the spec says `$ref: Percentage`. That single substitution erases the multiplier, because a PERCENTAGE adjustment on a named, ordered, defaulted option attached to a modifier is precisely a per-tier price multiplier. The proposal's 'closed enumeration' argument is therefore not a census of the price model -- it enumerates one field's enum while the tier lever sits one level down, on an entity the proposal itself lists (CatalogSubModifier) and mis-types. On the census question the answer runs against the proposal rather than for it: I did not rely on the partner API. I pulled the merchant back office's own Modifiers screen (chunk 2492 via the storeModifiers route, 200 anonymous) and it renders a column literally headed 'Cost Multiplier', an input-percentage labelled '% of modifier price' with placeholder '100%', and a required 'Default' radio, alongside a separate 'Qty' checkbox that writes modifierType -- the two mechanisms side by side in the product's own configuration UI, exactly as the claim distinguishes them. Addmi's release post (live and archived 20221201065722) states the arithmetic in the vendor's voice ('a 50% charge for half a pizza ... a $2 topping on a full pizza becomes $1 on half'). Grade A on shipped back-office source plus the public spec; the claim is table-stakes so no differentiator floor applies. I considered downgrading to partial on the grounds that Addmi ships no light/regular/extra vocabulary and documents the lever for halves, but declined: the claim asks for a configurable multiplier per tier, not for vendor-seeded tier names, and peers holding yes on this cell are the same shape or weaker (floreant-pos yes/A on an operator-maintained MULTIPLIER table with RATE; ncr-voyix-aloha yes/B on 'Charge X percent'; quantic-pos yes/B on 'the price can be a multiplier'; linga-pos yes/B on an absolute per-prefix price). Both caveats are recorded in the note instead. No double count: the nested-modifiers proposal in this batch cites the same modifierSet->modifier->subModifierSet chain only for DEPTH and min/max selection counts, and the modifier-price-by-parent-size proposal cites modifierOverrides (Money, keyed by modifierID) -- neither asserts the percentage multiplier. One lead for a different cell, not scored here: the vendor's own half-pizza example and the 'pick the left or right side' sentence bear on menu-pricing-fractional-placement and should be checked there rather than double-counted into this one. Checked 2026-09-15. source |
Sources
Every URL this record cites. 24 in total.
- https://www.addmi.com/pricing
- https://addmi.com/products/kitchen-display-system
- https://addmi.com/products/point-of-sale
- https://apps.apple.com/us/app/addmi-point-of-sale/id1499904685
- https://addmi.com/app
- https://addmi.com/partners
- https://addmi.com/guides/food-truck-pos-system
- https://addmi.com/blog/cashless-festival-pos-rfid
- https://addmi.com/pos/quick-serve
- https://addmi.com/faq
- https://addmi.com/products/online-ordering
- https://addmi.com/contact
- https://web.archive.org/web/20260216085929/https://addmi.freshdesk.com/support/home
- https://web.archive.org/web/20260216092012/https://addmi.freshdesk.com/support/solutions/articles/65000163511-recommended-hardware-for-addmi
- https://api.addmi.com/api/docs/
- https://addmi.com/dashboard/js/chunk-vendors.08aeeb98.js
- https://addmi.com/dashboard/js/index.b265f90a.js
- https://addmi.com/b/911drinkspot.-OK-0eWaoGfx2X3CTNEB
- https://api.addmi.com/api/docs/swagger-ui-init.js
- https://addmi.com/dashboard/js/8017.60d73dbb.js
- https://addmi.com/tos
- https://addmi.com/dashboard/js/3666.97a35c48.js
- https://addmi.com/_nuxt/9442fe0.modern.js
- https://addmi.com/dashboard/js/2492.031a9f62.js