by Intelliverse X
In Operator X · fleet manager and release owner

Kiosk-X: manufacturer, machine, fleet and release handover

Give every machine an accountable owner, work unresolved cases and expand releases only after real operating evidence.

Picture walkthroughs and the per-cabinet checklist →

Before following these steps: confirm your approved release

Release prerequisite: Match the installed cabinet APK, gateway deployment and Operator release to the verified release record before using these procedures. Complete the required checks on the actual cabinet; publication does not establish physical acceptance.

Your path, step by step

  1. 01Keep one recordTrack each cabinet’s identity, hardware, software, ownership and acceptance evidence.Instructions
  2. 02Qualify the locationCheck the exact country, currency, reader, payment provider and hardware combination.Instructions
  3. 03Assign your teamVerify accepted invitations and actual access before sending staff to a machine.Instructions
  4. 04Work daily issuesResolve uncertain payments and missing products first, then machine and stock faults.Instructions
  5. 05Test a small releaseUse approved compatible software on a staffed first group. Test sales and recovery.Instructions
  6. 06Expand with evidenceConfirm installed versions, online recovery and a verified sale before the next group.Instructions
STOP & resolve

Pause a release group for new payment, vending, identity or startup faults. Incomplete fleet data is not a zero balance or a complete machine list.

READY for the next stage

Each machine has a verified installed version, return-to-service evidence and an owner for unresolved issues. A download alone is unfinished.

New to this? Words explained
Canary
A small, staffed first group receiving a release.
Cohort
A defined group of machines in a rollout.
Adoption
Machines actually running the release.
Reconciliation
Comparing payments, deliveries and stock to resolve differences.
Rollback
Controlled software recovery; Android may require a corrected higher version.

Open the illustrated installation atlas and cabinet checklist.

Review fleet exceptions, assign authorized staff and reconcile machine records.

Instructional illustration; screens and device details vary. Follow the exact steps and approved release record below.

Use this as the handover record for each cabinet and each release wave. A working website, passing software tests, an uploaded signature and a successful physical sale are separate pieces of evidence. Record all four where applicable.

Start in the right place

Person / job Start here What completion means
Manufacturer installing Android for the first time Android installation and operation Correct package, signing certificate, serial, launcher, permissions, device ownership and reboot behavior verified on the cabinet
Manufacturer testing and signing a cabinet Manufacturer sign-off Physical FAT, six native diagnostics, accessory declarations, uploaded handwritten certificate and separate Partner build signature complete
Installer receiving one cabinet Factory-to-operator handover Arrival inspected, correct owner/location/payment setup, actual stock loaded, first sale and recovery proved
Operator supporting a shopper Shopper use and support Product delivery and payment reconciled; unresolved cases stay in the operator queue
Fleet manager / release owner This guide Every machine has an accountable owner, evidence, next action and approved software wave

The public website is https://kiosk-x.ai. The operator console is https://operator.kiosk-x.ai. The device gateway, Partner API, downloads and hosted guides are on https://api.kiosk-x.ai. The operator app belongs on the operator's phone; the ZHZN vending APK belongs on the vending machine. A Reyeah vending APK is a different hardware-family artifact. Do not identify any of these by its filename alone.

One record per physical machine

Before production, assign a serial and record the cabinet model, head-unit model, Android version, supported CPU ABI, VMC model/firmware, actual shelf/coil geometry, drop sensor configuration, serial-port wiring, MDB reader model and accessories. Photograph the rating labels and physical coil labels. Record the APK package, versionName, versionCode, SHA-256 and signing certificate, plus backend and operator release identifiers. Never place a device key, password or invite token in this handover record.

Keep identity separate from the equipment's current owner: cabinet serial, Android device ID, per-device cloud credential, Nayax Device Number and operator account are different identifiers. Preserve leading zeros in a reader's Device Number. A replacement head unit needs a controlled re-enrolment; copying another cabinet's storage is not a replacement procedure.

End-to-end acceptance sequence

Stage Required actions Evidence / stop condition
Build Install the approved Android image and APK; provision network and serial permissions; select Home and configure device owner where supported Package/signature/version read from installed app; reboot returns to kiosk; no unexplained Android permission dialog
Enrol First contact, bound enrolment, device-key contact and heartbeat Cabinet serial and Android device ID agree; registration is not a substitute for enrolment; resolve budget/arm/credential errors before shipping
Physical factory test Run every configured coil including later shelves; prove drop/jam behavior; fitted cooling, reader, printer, power-bank, lighting, sensors and displays tested separately A board handshake proves communication only. Do not infer a dispense or an unfitted accessory from it
Native diagnostics Camera, speaker, microphone, touch, screen and board All six pass; skipped/unavailable is not a pass. Keep the actual diagnostic report
Factory signatures Upload native handwritten certificate; complete physical FAT results; take Partner build sign-off last Uploaded certificate ID and signed build record. A queued signature is unfinished; a rerun must not silently overwrite physical FAT
Shipping / receiving Record packing, keys, power requirements, label photos and shipping condition; receiver compares serial and seals Damage stays documented and unresolved; never accept as “good” merely to advance the UI
Claim / placement Sign in as intended operator, claim serial, locate cabinet, record host or explicit no-host arrangement Machine appears only in intended ownership scope, correct venue and local timezone
Payment configuration Verify the intended live processor and merchant account, reader binding if fitted, currency and amount Test/simulated QR is not a live revenue rail; a merchant name in the console is not proof of payout
First fill Load real products, configure each aisle's product/price/capacity/age policy, record actual quantities No stock invented by “Fill”; a failed inventory request or faulted-only stock must not show setup complete
First sale Prove each enabled payment route with an approved bench/site purchase, and verify product, stock, order and processor Exactly one expected item per quantity, one order/payment and one stock movement; physical tray checked
Customer handover Train operator and venue contact, attach shopper support label, confirm normal screen and return from service mode No active payment, no factory screen, no maintenance tools accessible to shoppers
Fleet release Verify signed bytes and compatibility, canary, observe adoption and service recovery, then expand An offer/download is not installed; a version report alone does not prove a successful vend

The cloud onboarding checks currently cover ownership, online contact, payment configuration, usable stocked inventory and the dispensing guard. paymentsReady accepts a bound non-provisional card reader or live Stripe configuration with a webhook secret and a supported operator currency; test keys do not qualify for QR-only go-live. This is a configuration check, not a processor health probe, country-availability check, merchant onboarding check or physical acceptance certificate. Older backends may return only nayaxBound; update the backend before relying on QR-only readiness. Operators cannot force incomplete setup live. Full-admin override is restricted to a non-production sandbox.

Daily operation of one machine

  1. Open Machines and select the exact serial, not only the venue nickname. Check freshness of the last contact, board/reader state, stock and unresolved orders. A machine can be online while unable to dispense or take payment.
  2. Check physically available inventory against the planogram before replenishing. Remove damaged/expired products according to the operator's procedure. Enter the quantity actually present. Clear a fault only after its cause is corrected.
  3. For a changed product, confirm dimensions, coil fit, price, currency and age policy. Test the changed slot before reopening sales. Count later shelves too; a successful first shelf does not prove row/column mapping everywhere.
  4. Reconcile paid-without-delivery, partial delivery, pending captures/refunds and offline-originated orders. A request for a refund is not a completed refund. Keep the processor transaction reference and resolve the shopper's case once.
  5. Schedule maintenance and software changes when no shopper transaction is active. Check the tray and pending payment first; do not use a reboot to clear an uncertain payment. After repair, recheck readiness and the affected sale path before returning to service.
  6. Close the service menu, remove service media, lock the door, test the Home screen and confirm the public support label is legible.

Operating a fleet

Assign an accountable fleet manager and a local responder for every location. Keep a daily exception queue ordered by customer impact: paid/no delivery or uncertain payment, unsafe/damaged cabinet, offline board, unavailable payment, low stock, and release follow-up. Include serial, location, last known contact, owner, assigned responder, time detected, next action and resolution evidence. Do not close a case because its last telemetry row is green.

For each restock run, select only machines accessible to the signed-in operator, use the latest inventory, calculate pick quantities and recheck at the cabinet. Offline readings may lag physical sales. If any page or inventory request fails, the fleet count and pick list are incomplete; reload or split the run. The web fleet loader reports its supported limit rather than silently discarding machines.

Team invitations are pending until accepted by the named account. Copy and share the generated invitation link through the operator's approved channel; the current backend returns delivery: manual and does not send invitation email. The recipient opens the link, signs in with the invited email and explicitly accepts. Expired or wrong-account invitations require correction; ownership cannot be reassigned with the member role controls. Crew membership currently does not grant another owner's machine API scope. Verify the assigned person's actual machine access before dispatching them; use the platform's supported tenant/access workflow for delegated fleet access.

Invitation creation, acceptance and crew edits report a save failure instead of publishing an unpersisted change. Acceptance reads the current invitation and crew from the shared store when fleet sync is active; a stale replica cannot use an already-consumed token or a removed inviter's old role. Keep invitation links private and never add them to machine handover records.

Coordinate crew changes through one administrator at a time. Crew snapshots are not protected by a cross-replica transaction or compare-and-swap update, so simultaneous changes can overwrite each other. Invitation consumption and membership are separate durable writes. If acceptance fails after the link has been consumed, check the actual member list and issue a new invitation when needed; retrying the consumed link does not restore removed access. When the shared record cannot be read, the operation fails closed with an unavailable response instead of trusting a stale local grant. Refresh and resolve the save/read error before dispatching the person to a machine.

For relocation, record the destination and venue timezone, reconcile outstanding orders and count stock before the move. Repeat network, board, payment, product and support-label checks at the new location. For resale/RMA, preserve historical orders with their original owner, reconcile captures/refunds, revoke or rotate the cabinet credential through the supported workflow and document reader ownership separately. A serial claim does not transfer the Nayax merchant actor. Do not delete app storage until pending reports and replacement credentials are accounted for.

Release qualification by market and hardware

Do not treat “global” as one machine configuration. Create an acceptance row for every supported combination of market, language, currency, Android/head unit, board protocol, reader/profile and accessory set. A region with no completed row is unqualified for this release, even if another region passed.

Area Required evidence
Language Manufacturer, installer, operator and shopper can complete the supported flows; long text, non-Latin product names and unavailable translations are checked
Currency Price label, cart, reader/phone amount, captured amount, order, refund and settlement use the same currency; zero-, two- and three-decimal paths tested where supported
Processor Production merchant approved for the country/currency, live credentials and signed webhooks verified, payout destination confirmed; unsupported provider currencies fail before payment
MDB Reader currency and decimal scale agree with cabinet prices; known mismatches are refused; legacy country-code telemetry requires physical amount verification
Time Venue timezone, local date/time, overnight operation, daylight-saving change where applicable, quiet hours and reporting-day boundaries checked
Android / network Required ABI, ROM privileges, WebView, permissions, TLS clock, Wi-Fi/Ethernet/cellular, captive portal and reconnect tested
Operations Local support contact and hours, replacement stock/parts, escalation owner, receiving/maintenance and outage procedures assigned
Market approval Responsible owner records applicable product, age-check, accessibility, electrical, tax/receipt, privacy and payment requirements and their sign-off; software tests alone do not provide these approvals

New orders snapshot currency so an account currency change cannot reinterpret a past sale. Orders created before currency metadata existed retain the USD legacy interpretation. Provider precision can differ from ISO currency precision; unsupported or nonrepresentable Stripe amounts are refused before payment rather than rounded into a different charge. This does not certify every currency or processor account worldwide. See the gateway currency tests and release evidence.

Sales summaries and refund queues keep different currencies in separate groups. Unavailable or a dash does not mean zero. Read the currency on each period, order and exported CSV row; the account's current currency does not relabel an older sale. CSV amounts retain the sale currency's decimal precision. Machine detail and recent-history views name their limited scope; use the full server summary for fleet totals. Tax and cost accounting is currently validated only for USD; non-USD order summaries leave those figures unavailable. Complete the destination's accounting/reconciliation acceptance before approving that market.

If a refund response is interrupted, its outcome is unconfirmed. Refresh the original order and check the processor reference before retrying; a network error does not establish that no money moved.

The hosted QR checkout keeps the same request reference while an order-opening response is missing, including after a screen reload. Retrying that request returns its saved outcome; it must not create another charge. A changed cart is blocked while the first request remains unresolved. If the screen says the payment request is still being confirmed, check the original order and processor records with support. Do not clear browser/app storage or create a fresh request to bypass the hold. An interrupted request has no automatic expiry or takeover; support must reconcile it before another payment. Legacy integrations that send no request reference do not gain this retry protection merely by sending the same cart twice.

If a processor's captured amount or currency differs from the agreed receipt, the accounting pages show Reconciliation required and withhold affected totals. Review each capture and refund in its actual currency, retain the agreed receipt, and resolve the discrepancy before using the P&L, balance sheet or trend for a financial decision. An unavailable total is not a zero balance.

The local card route accepts one product line and one unit per purchase. The hosted card endpoint and cabinet enforce this limit before starting the reader. Do not use a multi-unit card request to approximate a basket: partial unit delivery cannot be represented safely by that cashless session. Resolve each payment and dispense before starting another purchase.

The current Nayax Spark integration accepts USD only because terminal currency negotiation has not been verified for other denominations. A bound reader does not establish Spark support for a non-USD operator. Verify any separate local MDB route against that reader's actual currency and decimal scale; do not infer its support from a Spark or software-only test.

With capture-after-delivery enabled (SCANPAY_MANUAL_CAPTURE), Scan & Pay accepts one product line and one unit per checkout; multiple product lines or a quantity above one are refused before authorization. Existing multi-product or multi-unit sessions that share one processor hold must be reconciled together at the processor; per-line capture or cancellation is blocked and remains an operator review item. Do not promise multi-product manual settlement, or ask the shopper to repay a cart whose earlier authorization is unresolved.

Release sequence and rollback

  1. Reconcile the candidate against the source revisions currently deployed. This workspace can be older than the public download. Carry forward fixes and published guides from the deployed branch; do not deploy an older checkout as a replacement for a newer production build.
  2. Build a release with the approved signing key and a versionCode above every supported installed target. Inspect the actual package, ABI, minimum SDK, version and certificate. A debug APK and a bundled sample APK are bench artifacts, even when unit tests pass.
  3. Publish the exact bytes to an immutable version-and-digest URL. Fetch the published bytes and compare SHA-256. The download button, APK manifest, release description and OTA descriptor must name those same bytes.
  4. Deploy compatible backend routes and publish matching guides before offering an APK that requires them. Verify the operator web build and the actual distributed operator APK separately: Flutter tests do not validate a Kotlin/Compose artifact built from another source directory.
  5. Start with a named, staffed bench/canary cohort covering each hardware and market profile. Verify reboot, device-key contact, native factory report, one sale per enabled route, failures, outage recovery and order reconciliation.
  6. Check adoption and return-to-service evidence before widening. Compare before and after: contacts, usable stock, sales, failed/uncertain vends, captures, pending reports and refunds. Stop a wave for a new unexplained payment, dispensing, credential or startup fault.
  7. Expand in documented cohorts and maintain a per-machine outcome: pending, offered, downloaded, installed, returned online, sale verified or blocked with an owner and next action. Do not convert missing evidence into success.
  8. For rollback, prefer a corrected forward release with a higher versionCode. Android may refuse a downgrade or a different signing certificate. Any attended reinstall must preserve/recover device identity and pending reports; do not prescribe a blanket uninstall as a remote rollback.

Failure and recovery acceptance matrix

Scenario to exercise on a controlled bench Expected result / proof
New head unit, no network, no goods cache Clear unavailable/setup path; no sale from invented inventory
Captive portal, wrong clock or revoked credential Actionable service diagnosis; no claim of successful cloud enrolment
Enrol arm expired, wrong device ID or attempt budget exhausted Refusal remains visible; correct identity and re-arm through the supported process
Board or reader missing / busy / refusing No false payment or dispense success; inspect the correct device's evidence
Repeated product tap or duplicated order request One active card session; duplicate completed ID returns the same result within the supported retry window
Card quantity above one, or a stale card-opening response after cancellation Request refused before reader authorization; old response cannot arm the next shopper's sale
Cancel before card confirmation Reader has not been armed; no charge or vend
Dismiss/reconnect during active card payment Session remains visible; no second checkout or recovery reload while outcome is unresolved
Lost local HTTP response Poll the same order's local status; do not assume refusal or open a new QR payment
Cloud outage with fresh unrestricted goods Only supported local card flow; sale, currency and reports reconcile after reconnect
Stale/legacy cache or age-restricted goods offline Offline sale refused; update policy/network before selling
QR paid after cancel / duplicate webhook Cancelled order cannot cause an abandoned-session vend; refund/void reconciled once
Vend report and QR webhook race Both use the same dispense ID; no second physical action
Multiple product lines or units with capture-after-delivery enabled Refused before authorization; legacy shared holds require joint reconciliation
Partial multi-item delivery Show per-item outcome, collect actual drops, reconcile only owed amounts
Wrong settlement currency or amount Mark for review; no cloud-triggered dispense based on mismatched payment
Jam, sensor silence or late drop Check the tray; distinguish motor completion without a witnessed drop from a failed or unresolved attempt; investigate the original order and never retry automatically
Power failure after approval / during motor / before report Inspect durable ledger and processor; do not assume software can prove an unobserved physical outcome
Crew invitation wrong account, expired, replay or owner edit Access refused and owner retained; no membership before acceptance
Crew save/read fails or a second API replica receives acceptance No unpersisted membership claimed; current durable invite/crew checked; consumed link remains unusable
Inventory API fails on page two / fleet exceeds supported limit Explicit incomplete/error state; no partial list presented as the whole fleet
OTA wrong package, signing key, digest or older version Refused with evidence; existing cabinet remains recoverable
Maintenance / relocation to live while checks fail Transition refused; resolve readiness before reopening

Handover signatures

For each machine record the manufacturer QA signer, receiving inspector, installer, operator owner and release approver with timestamp, serial and the evidence references above. Mark each result pass, fail, not fitted or not tested, with a reason. “Not tested” remains unfinished. Record the release wave and every outstanding item with its owner. No final signature should hide an unresolved payment, dispensing, identity or installation failure.