INTELLIVISION MERCHANT MANUAL
πŸ›‘οΈ WRITTEN DIRECTLY FROM THE RUNNING SYSTEM

IntelliVision Merchant Operating Manual

The authoritative operational guide for store managers, cashiers, and accounting personnel. Covers initial store onboarding, daily till workflows across 28 specialized industries, double-entry financial compliance, and zero-lock-in data management.

βœ“ Verified Screen Consistency βœ“ 28 Industry Tills βœ“ Cent-Balanced Ledger βœ“ Offline Selling βœ“ Local Device Privacy
Chapter 1

πŸš€ 'Your First Day' Walkthrough

Follow these sequential numbered steps to take your store from a fresh installation to your first rung sale, printed receipt, and balanced cash drawer. Every step references the exact operational screen in IntelliVision.

Step 1

Sign In & Role-Based Access

auth.html

Open auth.html in any modern browser. It shows two tabs: Create New Business and Existing Sign In, switched instantly with no page reload. A visitor who arrived by tapping a "Try the demo" link, or who was bounced off a page that requires sign-in, is shown a one-tap Open the Demo Till banner above the forms instead of being pushed straight at a password box.

One sector sign-in page names its tabs differently and behaves differently too: restaurant_auth.html shows "Sign In" and "Register New" tabs, but tapping "Register New" never reveals a local form β€” there isn't one on this page β€” it immediately redirects you to this same real auth.html signup, with the restaurant sector carried in the link. That makes it an honest shortcut rather than a broken control, just a differently-built one from the global tab switch above.

Creating your real owner login

The sign-up form is deliberately two fields β€” email and an 8+ character password. Submitting it calls the real registration engine: your password is hashed on your device (see PBKDF2 below), the account is written, and you are signed straight in. The moment that real login exists, the shared demo accounts are deleted from this device forever β€” demo mode does not coexist with a real business.

Signing up also creates your merchant tenant record β€” a random MERCHANT-NNNNN id, your email, ZAR as the default currency, and VAT-registered defaulting to No until the wizard asks β€” and hands you straight to the Setup Wizard in Step 2. Which sector page you clicked "Sign Up" from is remembered (from the link's ?industry= parameter, or failing that from the page that referred you) and pre-fills the wizard's industry step β€” shown on-screen as "Setting up: <Sector> β€” you can change this in setup" so nothing is silently decided for you.

Signing in with an existing login

Sign in with your registered email, username, or phone number, plus your password β€” all three identifier types are actually checked, not just email. Don't have a login yet? The "Create your owner login" link on every sector sign-in page routes to this same real signup, with your sector pre-filled in the URL.

Submitting the sign-in form calls the real authentication engine: every one of the 28 sector sign-in pages (e.g. retail_auth.html) runs the identical call β€” type your credentials, press Sign In, and you land in that sector's workspace. A wrong username or password shows one generic message β€” it never reveals which field was wrong, so a shared till doesn't leak which usernames are real. If you arrived here bounced off a protected page (the URL carries ?next=), a successful sign-in sends you straight back to that page instead of dropping you at a generic home screen.

Tick "Remember me on this device for 30 days" on your own tablet and you won't have to sign in again until the month is up; leave it unticked on a till the whole team shares. Typed the wrong email into the sign-up form and want to sign in instead? The error message under a clashing sign-up offers a "Sign in instead" link that switches tabs and carries your typed email across so you don't have to retype it.

Try before you buy: demo mode

Demo mode (fresh devices only): a till nobody has signed up on carries two demo accounts β€” Owner: owner / Owner!2026, Cashier: cashier / Cashier!2026. The "Open the Demo Till" button signs the demo owner in with zero typing β€” no password box, one tap. The moment you create your real owner login, both demo accounts are deleted from that device and these published passwords stop working there; a business already running on the device also hides the button.

Passwords are stored only as salted PBKDF2-SHA256 hashes (100,000 iterations), computed and verified directly on your device β€” the password itself is never written anywhere.

Role-based access fails closed: every page checks your session before it renders, and a role without the right capability never sees the page at all β€” its content is replaced, in full, by a red "Access Restricted" panel naming your role, with a single Sign out button as the only way off it. There is no partial peek and no redirect back to the till; the deny screen is the whole page.

What "manage / sell / view" actually means

Every account has exactly one role β€” Owner, Manager, Cashier or Staff β€” and every role maps to a fixed set of capabilities: Owner and Manager get manage + sell + view, Cashier gets sell + view, Staff gets view only. Which capability a page needs is decided purely by matching the filename, not by checking individual buttons on the page: anything containing _setup, _accounting, vat201, fixed_assets, multibranch, payroll, data_export or team_logins needs manage; anything containing _pos, _till, checkout or grv_receiving needs sell; everything else only needs view. Practically: a Cashier can ring sales and see dashboards, but every Setup screen, Team & Logins, payroll, VAT201, the fixed asset register, and every multi-branch page are Owner/Manager-only β€” including the Setup Wizard and Camera Manager covered later on this page.

Passwords & recovery, honestly: your data lives on your device and only your password unlocks sign-in β€” there is no remote reset. Owners reset staff passwords on the Team & Logins screen (add or activate a person there β€” its own add/reset controls are documented under Chapter 5's back-office functions, out of scope for this page). Protect the owner password and keep encrypted backups (Backups & Export). A second tablet starts as its own empty till β€” move data with a backup file or Connected Mode.

Sales agents: joining the partner fleet

A "Looking to earn money as a Sales Agent?" panel sits under the sign-in and sign-up forms on the main auth.html door, linking to the real partner sign-up flow (sales_rep_signup.html) β€” a separate application from a merchant account. The 28 sector-branded sign-in pages do not carry this panel; reach it from the main sign-in screen.

Reality check β€” PIN pad & "facial biometric" button (automotive, events, freelancer, nonprofit, professional, rentals, repair, salon sign-in screens): eight sector sign-in pages show a 4-digit PIN numpad and a "1-Tap Facial Biometric Scan (0.3s)" button below the normal username/password form. Neither is a working alternate sign-in method today. Tapping digits on the numpad only updates the dot display on screen β€” CLR resets that display and GO checks only that four digits were tapped, then signs you in using whatever is typed in the username and password fields above it β€” the PIN digits themselves are never read or sent anywhere. The biometric button does the same thing with no camera involved at all: it re-submits the typed password field the instant you tap it. Use the username and password fields to sign in on these eight screens; the PIN pad and biometric button are visual only.
Reality check β€” role tiles on hardware, hospitality and property sign-in screens: these pages show a grid of role cards (Store Owner, Fleet Manager, Trade Counter Cashier, Yard Supervisor, Accountant, and more) that look like one-tap logins into that role. They are not. Tapping a tile still requires a real, valid username and password typed into the form above the grid β€” the tile only decides which page you land on after that sign-in succeeds, not which role you're granted. Landing on a page never changes your account's actual role or capabilities; fail-closed access still applies on the far side exactly as described above. A cashier account that taps "Hardware Accountant", for instance, signs in successfully and is sent to hardware_accounting.html β€” a manage-only screen β€” where the fail-closed check replaces the page with the Access Restricted notice. The tile chose the destination; it did not grant the role.
IntelliVision Sign-In Screen
Figure 1: Authentication screen (auth.html) featuring salted PBKDF2 authentication and role-based session isolation.
Step 2

Master Setup Wizard

master_setup_wizard.html

After signup you land in master_setup_wizard.html β€” the one setup screen in the product that actually saves what you type. It runs four numbered steps top to bottom on one page (not a click-through wizard), followed by a launch bar and an onboarding checklist.

Step 1: Business Profile & Tax Registration

Enter your trading name and owner/director name, then answer "VAT / Tax Registered Vendor?" β€” choosing Yes reveals the VAT number field and makes it required; a South African number must be exactly 10 digits starting with 4, checked before launch. "Who runs the business?" β€” Just me / Me + staff / Multiple branches right-sizes what your dashboard shows: solo hides payroll and staff tools until you need them, and every hidden tool still appears by itself the moment reality calls for it β€” your first staff member surfaces payroll, your second branch surfaces multibranch. "Do customers buy on account?" turns the debtors book on or off β€” No keeps it tucked away until your first account sale surfaces it automatically. A branch/location name and a read-only e-invoicing law field (set from your country in Step 3) round out this step.

Step 2: Industry Sector Template

Pick one of the 28 sector pills (Retail, Restaurant, Hardware, Butchery, Petrol, and so on) β€” one is always active, pre-selected from your sign-up page when known. Your choice drives which POS and dashboard the launch button opens and which checklist links appear below.

Step 3: Country, Currency & Camera Link

Choose your operating country from a 15-entry list (South Africa/SARS through UK/HMRC, EU/OSS and US state tax) and the VAT/GST rate, currency, and the tax-number field's label all update to match β€” e.g. selecting Kenya relabels the field for KRA and switches the rate to 16%.

Honest by design: the "Test IP" button next to the camera field does not attempt any connection on this screen β€” pressing it opens a plain message explaining that camera testing happens for real on Vision Live, with your actual camera, after setup is finished. Nothing here pretends a handshake succeeded.

Step 4: Review & Launch

A review grid mirrors back your trading name, owner, industry, country/currency, VAT status and branch before you commit. Pressing Save & Open Industry Dashboard validates the form (business name and VAT number format, if applicable), writes your tenant record, and takes you straight to your sector's POS β€” the button relabels itself to name the exact sector once saved. Not ready to fill all of it in? Skip for now writes a minimal, honest tenant record β€” your typed business name if you gave one, your sector, "Skip" recorded β€” and opens My Business directly; nothing here is invented on your behalf.

If you already connected an old POS on the Import screen (Chapter 1.3), this wizard opens pre-filled with what that import honestly knows β€” your shop name, whether you have account customers, whether you have staff β€” and shows a banner naming exactly what it filled in, so you review and adjust before launching rather than trusting it blind. Intel older than 48 hours, or already used to launch a previous business on this device, is never applied to a new one.

Post-setup onboarding checklist

Four milestones β€” import your products, ring your first sale, print a test receipt, meet your dashboard β€” each with a link to the right screen and a checkbox you can tap to mark it done or undone yourself. Only one of the four checks itself, and only on page load: every time you (re)open this wizard, it looks for a real (non-history, non-sample) order in your database and, if one exists, silently flips "Ring your first sale" to done β€” it does not update live while you're on the till. The other three are entirely self-reported, so ticking "Print a test receipt" records that you say you did, not that a printer actually fired.

IntelliVision Master Setup Wizard
Figure 2: Master setup wizard (master_setup_wizard.html) configuring company legal entity, branch details, and tax parameters.
Reference

Sector "Business Setup" Screens Are Concept Previews

*_setup.html (28 pages)
Every one of the 28 sector setup pages (retail_setup.html, hospitality_setup.html, agriculture_setup.html, and so on) opens with its own honest banner: "Design preview β€” this screen is a concept render, not a working tool yet. The working business setup lives at Business Setup (the real wizard)." Nothing you configure on these pages is saved β€” treat them as a look at what richer, sector-specific setup will eventually look like, and use the Master Setup Wizard from Step 2 above for the setup that actually takes effect.

On the retail-style layout (used by retail, and equivalent pages for other product-heavy sectors): a "1-Click Quick Start (Tiny Shop / Corner Mart)" button shows a success message and sends you to the sector's POS, without writing any configuration; three "Business Scale" tier cards (Tuck Shop / Independent Store / Enterprise Chain) visually highlight your pick but nothing downstream reads it; module accordions expand and collapse on click to show or hide their settings; the first checkbox in each module flips its badge between "Active" and "Skipped" on screen only, while the second checkbox in each module (Bettcher recipe display, SMS alerts, exit turnstile) has no handler at all and does nothing when clicked; the trading-name and VAT-number fields accept typing β€” the trading-name field is read only to echo it back in the confirmation message, and the VAT-number field is never read at all; neither is written to any configuration; and "Save Configuration & Launch Workspace" shows a confirmation message naming whatever you typed as the store name, then opens the sector dashboard β€” the message, not a database write, is the entire effect.

The hospitality-style layout (used by hospitality/guest-house pages) is the same story in miniature: "1-Click Quick Start (B&B / Guest House)" shows a success message and opens the front-desk POS, and "Save Configuration & Launch Hotel Dashboard" shows a "Hotel Setup Saved" message and opens the dashboard β€” again, neither writes anything.

Every sector setup preview's own banner links straight to the real Master Setup Wizard β€” that link is the one control on these 28 pages that reliably takes you somewhere useful; use it instead of the preview's own buttons.

A "Fixed Asset Register" button in the retail setup header opens fixed_assets_register.html β€” a real page, but as with several `*_setup` companions its "Register new asset" and "Post depreciation" controls currently show a confirmation message rather than writing to the ledger; documenting that page's own add/post functions in full belongs to a different package (they carry the separate assets.register.* function family), so only the act of opening it is covered here.

Reference

Camera & Device Manager

device_camera_setup.html
Unlike the 28 sector setup pages above, this screen carries no preview banner β€” but it behaves exactly like one. The four cameras listed (Overhead Till, Yard Entrance, Kitchen Plating Pass, Poison Vault) are fixed example rows built into the page, not a live list of devices you own, and none of the controls below persist anything or talk to a real camera.

Both "+ Add New Camera / Device" in the header and "+ Add Camera (IP / RTSP)" in the provisioning bar open the same form, pre-filled with a randomly generated camera ID and a placeholder IP, asking for a name, mounting location, an AI purpose from a 12-option list, IP/port, and a confidence-sensitivity slider. Clicking "Edit" on any of the four example cards opens the same form pre-filled with that card's hardcoded details so you can see the fields in context.

Submitting the form ("Save & Deploy Camera AI") shows a confirmation alert repeating back what you typed, including an invented "Calibrated to 30 FPS Edge" line, then closes the dialog β€” the camera list on screen does not change; nothing you entered is added to it or saved anywhere. "Scan LAN (ONVIF Auto-Discover)" shows the same two hardcoded "discovered" cameras every time it is pressed, regardless of what is actually on your network β€” it does not perform a real scan. The Γ— button and the form's own Cancel button both simply hide the dialog with no confirmation and no save.

For pairing a camera that actually works, this is the wrong page: the till's own camera (Vision Live) and a real IVOPS Vision kit (Edge Node pairing) are genuine, gate-proven features documented in the Vision chapter of this manual β€” this screen is not how either is set up today.

Step 3

Import From Your Old POS System

pos_connect.html + legacy_pos_migration_portal.html

Bring a complete business packβ€”or run a deliberately limited quick importβ€”from Square, Loyverse, Yoco, GAAP POS, Pilot Software, Arch Retail, IQ Retail, Lightspeed (Vend), Shopify POS, Clover, iKhokha, Sage Pastel, a local export folder or a spreadsheet. The complete route reconciles structured records before writing and retains every selected source row, including vendor-specific fields it cannot safely map.

Two migration lanes work together on pos_connect.html. Complete Business Migration is the cutover route for the whole business. The vendor API and CSV shortcuts are quick connections for products, customers and sales history where exposed; they are not presented as a full changeover. The older legacy_pos_migration_portal.html remains the quick CSV upload-or-paste screen.

Route 1 β€” Complete Business Migration

A complete pack can map branches, disabled-until-activated staff, products, prices, stock and batches, customers/debtors, suppliers/creditors, purchases and GRV lines, supplier payments, sales receipts, item lines, tenders, returns, chart of accounts, balanced ledger entries, VAT history, loyalty, gift cards, payroll and settings. Open laybys, quotes, sales orders, job cards, bill-of-quantity records, promotions, bank reconciliations, budgets, assets, report definitions, audit history and other unmatched vendor tables are retained with their original source fields; preservation does not pretend that a corresponding live IntelliVision workflow exists.

Sales need the receipt header, every item line, tender breakdown and returns/credit notes for the full date rangeβ€”not merely a daily or receipt total. One detailed CSV containing receipt reference, date, product, quantity and line total is split into reconciled receipt and item records automatically; explicit tender rows are deduplicated by their source reference. Preflight shows missing detail before anything is written.

The source picker below still helps you: tell it which system you're coming from and it routes you automatically identify the right source. Use Complete Business Migration for a cutover; use the quick portal only when the merchant intentionally wants the smaller product/customer/sales-history move.

Your old systemHow you bring it acrossWhat to expect
SquareAPI token, or CSVProducts, customers, sales history and staff roles all pull across.
LoyverseAPI token, or CSVSame four data classes pull across; staff import too.
Lightspeed (Vend)API token + store prefix, or CSVStaff import too. Accounts opened after 16 Jan 2026 need a private-app credential instead of a personal token.
Shopify POSAPI token + shop subdomain, or CSVThe only API connection that also brings stock-on-hand across.
CloverAPI token + Merchant ID, or CSVStaff import too.
YocoGuided exportOne click opens your own Yoco portal; export, then drop the files in.
iKhokhaGuided exportOne click opens your own iK Dashboard; export, then drop the files in.
GAAP POSGuided complete export or quick CSVFor cutover, collect products/stock, full receipt and line history, tenders/returns, debtors, creditors, purchasing, branches/staff, tax and accounting exports plus the original backup.
Pilot SoftwareGuided complete export or quick CSVSame full-business checklist; the quick route remains intentionally limited.
Arch RetailGuided complete export or quick CSVSame full-business checklist; the quick route remains intentionally limited.
IQ RetailGuided complete export or quick CSVCollect Stock Master; POS/invoice headers, item lines, VAT, tenders, voids and returns; debtors/creditors with transactions and allocations; purchasing/GRVs; ledger/cash book/VAT; branches/users/settings; and every optional module in use.
Sage PastelGuided complete export or quick CSVCollect inventory, customers, suppliers, detailed sales/purchases, payments/returns, ledger/tax history and settings.
Excel / spreadsheetPaste straight inCopy your cells with the header row, paste, fix anything, import.
Anything elseComplete local folder, or Generic CSVSelect all readable CSV/TSV/JSON/SQLite exports. Recognised classes map; unmatched tables remain in the retained source archive instead of disappearing.

Quick route A β€” Connect directly by API

Direct API connect with legacy POS accounts (Square, Loyverse, Lightspeed/Vend, Shopify, Clover): open Connect Your Old POS, paste one token, approve each data class, and products, customers and sales history import duplicate-proof (Shopify includes stock-on-hand) β€” other systems follow the guided export recipes on the same page, with one-click buttons that open YOUR vendor portal's export screen (your login never touches us).

  1. Test connection β€” before anything is fetched, press this to prove the token actually works. IntelliVision checks it live against IntelliVision's own relay service and tells you plainly if it can't reach your account β€” nothing is pulled until this passes.
  2. Fetch my data β€” a preview only, nothing is written to your books yet. Live counts tick up per data type as it runs. It pages through your ENTIRE account, not just the first screen β€” a large catalogue comes across whole, not truncated at page one.
  3. Tick what to bring in β€” Products, Customers, Sales history, Staff & roles. Anything left unticked is never pulled into IntelliVision.
  4. Import now runs each ticked class through the exact same zero-loss, duplicate-safe engine as every other route on this page β€” an API pull gets no shortcuts around validation.
Your token, honestly handled: it stays in this page's memory only for the session β€” never saved, never logged by the relay. Revoke it in your old system once the migration is done.

Where the vendor shares it (Square, Loyverse, Lightspeed, Clover), your staff and their roles import too β€” sign-in disabled until you set each password on Team & Logins, and a vendor "owner" becomes a manager here, never a second owner. And Business Setup opens pre-filled from what was found: shop name, team size, account customers detected β€” all waiting for your one final review before launch.

Honest limits on API pulls: customer account balances don't come across from any of these APIs β€” customers arrive at R0.00, and no opening journal is posted, so bring balances in with a CSV from your old back office instead. Stock-on-hand only comes across from Shopify; for the rest, do a stock capture after cutover or import a stock CSV.

Quick route B β€” Read product/customer/sales files right off this machine

If the old till is on this same machine, choose This same computer instead: pick its export folder and IntelliVision reads the CSV files and SQLite databases locally β€” every file is listed with what it is, nothing is uploaded, and re-imports can never duplicate your records.

  • Pick a folder or Pick files β€” everything you choose is scanned in this browser and listed, supported or not, with a plain reason for anything skipped. Recognized formats: CSV exports (all vendor column maps apply), SQLite databases read via a bundled reader (tables whose columns look like customers, products or sales are offered; a table over 100,000 rows is refused with the real count rather than silently cut off β€” export it as CSV in date ranges instead), and IntelliVision's own backup archives, which are pointed at the separate Data Export β†’ Restore screen because restoring replaces your current data, not adds to it.
  • Tick the entries you want and press Import selected. Each ticked entry runs through the same proven import funnel as every other route β€” the same validation, loss reporting and dedupe.

Safe to run again: re-scanning the same folder writes nothing and re-posts nothing β€” every file already imported is recognized and skipped.

Quick route C β€” Paste straight from a spreadsheet

Coming from Excel or a paper book typed into a spreadsheet? On pos_connect.html, choose Excel / spreadsheet: copy your cells (header row included), paste them straight in, fix any cell in the preview grid, and import β€” the grid is what gets imported, so a typo fixed there is fixed in your books.

  • Spreadsheet pastes are read as tab-separated automatically (the normal case when you copy real cells); typed or copied CSV/text falls back to a quote-aware parser, so commas inside names and a cell that itself contains a line break survive intact.
  • The header row is read automatically to guess Products, Customers or Sales history β€” shown as a badge next to the grid; change it yourself if it guessed wrong.
  • Click any cell to edit it, use βœ• to drop a row you don't want β€” only what's left in the grid at the moment you press Import the grid is written.
  • Clear empties the box and grid so you can start over with a fresh paste.

A second, simpler paste tool lives on legacy_pos_migration_portal.html itself: a plain text box for raw CSV or TSV content (no editable grid) β€” paste it in and press Import Pasted CSV. Useful when you already have CSV text copied from somewhere, rather than live spreadsheet cells.

Route D β€” Guided export for a complete cutover or a quick import

For systems with no live API, Connect Your Old POS shows a full cutover checklist and vendor-specific guidance. Use Complete Business Migration takes the complete set through preflight, reconciliation, one atomic write and retained-source archiving. Quick products/customers/sales only opens legacy_pos_migration_portal.html when the merchant intentionally wants only that smaller move.

  1. On the portal, Step 1 is picking your system again (Square, Loyverse, Yoco, GAAP POS, Pilot Software, Arch Retail, IQ Retail, or Generic CSV) β€” this sets which vendor's columns it expects.
  2. Step 2 is choosing what you're importing: Products & Inventory, Sales history, or Customers & balances.
  3. Step 3 is the file itself β€” click the drop zone to browse for your exported CSV/TXT, or use the paste box from Route C above.

On the restaurant till specifically, a πŸ”„ Import GAAP CSV shortcut sits right in the header β€” one click straight to the import portal, no need to go via Connect Your Old POS first. The till-side view of that button is in Chapter 1's till reference.

Every route shares the same safety engine underneath

The vendor format is auto-detected from the file's header row (or its filename) the moment it's read, so you rarely need to tell IntelliVision which system it came from. The migration engine handles South African comma-decimal prices (such as R 89,50 or 1 250,00) correctly without truncation or parsing errors.

  • Every product row either imports, is rejected with its specific reason, or is recognized as a duplicate already in your system β€” never silently skipped.
  • Before anything is written, IntelliVision counts what it found and what it will skip β€” a preview-only parse, so you see the shape of the import before committing to it.
  • Rejected rows can be downloaded as their own CSV β€” fix them in your spreadsheet and try again, rather than starting the whole file over.
  • Records that already match an existing one (by barcode/SKU/name for products, email/phone/name for customers, receipt number for history) are shown as skipped, not re-imported β€” nothing is ever double-counted and no opening balance is ever posted twice, even if you run the exact same file again.

Whichever route you used, the results screen ("What happened β€” exactly" on POS Connect, or the Imported Records table on the portal) shows imported / already-in-your-system / rejected counts for every data class, with the specific reason behind every single rejection β€” nothing about an import is ever a black box.

Sales history & customer accounts β€” available now

βœ“ Live now β€” bring years of sales history and every customer's account with you

Sales history from your old system imports as history rows, flagged so they can never deduct stock, never post to your general ledger, and never count as today's sales β€” they exist purely so your reports show real trading history from day one, with no limit on how many years back your export covers. Receipt numbers already imported are recognized, so re-running the same file never doubles your history.

Customer accounts arrive as real debtor balances. For everyone newly imported with a non-zero balance, IntelliVision posts one balanced opening-balances journal β€” a customer who owes you debits Debtors Control (1100) against Opening Balances Equity (3900); a customer in credit posts the other way β€” summed once, for that import only, so duplicates never re-post.

What can go wrong:
  • Two imports can't run at once on the same device β€” a second import (even in another tab) is refused outright with the message "another import is already running on this device - wait for it to finish, then retry", never silently queued or run twice.
  • On POS Connect, every Import button (API, folder and paste-grid alike) is disabled for anyone who isn't signed in as owner or manager β€” a cashier can open the screen but cannot press Import.
  • A file the parser genuinely can't read (wrong format, corrupted, a header row it doesn't recognize) is listed as "not importable" with a plain reason β€” it isn't silently ignored, but it also isn't imported; fix the export or use a different route for that file.
  • Passwords never come across for imported staff, and account balances never come across from an API pull β€” both need a manual step afterwards (set each password on Team & Logins; bring balances in with a CSV).
Reference

Till Chrome β€” the Floating Dock, Search, Hold and Drafts

universal_workspace_manager.js

Sign in on any of 22 tills β€” every sector except butchery, carwash, funeral, liquor, petrol and restaurant β€” and a floating pill-shaped dock appears bottom-centre of the screen: Search, Admin, Tutorial, Help, Modules, Hold, Draft, and API Vault. It never appears on auth.html itself (it used to sit on top of the Sign In button), and it never appears for a signed-out visitor. One caution worth passing to every role, not just cashiers: the dock shows the same eight buttons β€” including Admin and API Vault, links into platform-operator territory β€” to every signed-in role. It does not hide itself for a Cashier account; the fail-closed role check happens only after you tap through.

Tap Search, or press Ctrl+K (Cmd+K on a Mac), and a full-screen command palette opens with a search box already focused. Type any part of a screen name or category β€” "Admin", "POS", "Cashier", "Silo" β€” and the list filters live against a fixed roster of roughly 40 platform screens (every sector's POS and dashboard, the Super Admin console, camera setup, the free calculators, role SOP pages, the API vault) grouped by category tag; tap a result to jump straight there. Escape, or a click outside the box, closes it again.

Reality check β€” Hold does not park the sale. Tap Hold and a counter on the dock button ticks up ("Hold (1)", "Hold (2)"...) and an alert reads "Active transaction/job parked to Slot #1. Screen cleared for next customer!" Nothing about the visible cart changes β€” no line is removed, no ticket is written anywhere, and the counter is a bare number in localStorage. There is no recall function anywhere in the workspace-manager script or on any till: once you move on, whatever was in the cart is simply gone, and the "Screen cleared" line in the alert is not true β€” the screen is not cleared unless you clear it yourself. The "Hold (N)" badge only ever counts up β€” there is no Unhold control to bring it down. Reloading the page makes it look like it reset: the dock is rebuilt from a template that hardcodes "Hold (0)" and nothing re-reads the stored number, so the badge shows zero again while the stored count is untouched. The next tap after a reload therefore jumps straight to the real next number β€” you can see "Hold (7)" appear with no 4, 5 or 6 in between. Treat the badge as decoration, not as a count of anything you can get back.

Draft saves whatever you have typed into any input, dropdown or text box on the current screen β€” it also runs on its own every 5 seconds in the background, not only when you press the button, so you rarely need to press it. Saving shows a confirmation alert. If a save exists from an earlier visit to this exact page, a yellow banner appears at the top offering Restore, which re-fills every matching field by its id or name and clears the banner; Dismiss clears the banner and deletes the saved draft without restoring it. One precision worth knowing: this saves form fields β€” search boxes, quantity inputs, setup forms β€” keyed to the page's own filename. On tills where the cart is built as plain rows in a table or list rather than form inputs (every till in this manual), Draft does not capture or restore the cart itself; a held sale is not a saved draft, and neither one is a safety net for the other.

Tap Tutorial (or the πŸŽ“ icon inside the role-help panel, see below) to start a real guided walkthrough: a dimmed overlay, a highlight ring drawn around the actual on-screen element for each step, and a step card with Next/Prev, a step counter, and a "Fill Demo Data" shortcut. It scrolls the page to bring each target into view rather than assuming it is already visible.

Reference

Getting Help From the Till β€” Two Different Buttons

universal_help.js + universal_role_guides.js
A till running the dock actually carries two independent help systems that happen to share a page. They look similar and are easy to conflate β€” they are documented separately here on purpose.

Every one of the 28 tills carries a floating "?" button, bottom right, at all times β€” this is the one help control that reaches every till with no exceptions. Tapping it opens a small drawer listing up to six of the functions that actually exist on the screen you are standing on, looked up by filename in the platform's help map, and filtered against your signed-in role: a cashier is not shown manager-only functions. Below the list sits "πŸ“– Open the full manual for this screen β†’", which jumps to the section of this manual covering that screen, and below that a link to the role knowledge base. If a screen is not in the map, the drawer falls back to one of seven generic buckets (POS pages, dashboards, accounting, payroll, migration, setup/admin, or a catch-all) so it is never empty. The βœ• in the drawer's corner, or a click outside it, closes it.

Corrected since the last edition of this manual: the drawer's till bullet used to read "Tender payment via Cash, Ozow Instant EFT, SnapScan QR, or Card terminal." SnapScan is not a real tender anywhere in this product (see the tender section below), and that wording has been removed β€” the drawer no longer mentions it, and the string "SnapScan" no longer appears in universal_help.js or in the help map at all. The bullet now reads "Tender payment via Cash, Ozow Instant EFT, or Card terminal."

On the 22 dock sectors, the dock's own "❓ Help" button and the Ctrl+H / Cmd+H shortcut open a second, different, full-screen panel β€” the role SOP modal, not the floating "?" drawer above. It carries role tabs (Cashier, Waiter, Manager, Mechanic, Owner and several trade-specific roles) down one side and, for the tab you land on, a couple of longer operational SOP cards plus a "πŸŽ“ Practice Interactive Simulation" button that starts the same guided tour described above. It always opens on the Cashier tab first, regardless of which role is actually signed in β€” switch tabs yourself if you need a different role's guide. On the six sectors with no dock (butchery, carwash, funeral, liquor, petrol, restaurant), neither this panel nor the Ctrl+H shortcut exists at all; only the floating "?" is available there.

The dock's βš™οΈ Modules icon is a plain link to the owner's module hub (owner_modules_hub.html), and the πŸ‘‘ Admin icon is a plain link to the platform Super Admin console (super_admin_dashboard.html) β€” the platform-operator dashboard, not a per-shop admin screen β€” while ⚑ API Vault links to the API integrations hub (api_integrations_hub.html). All three are ordinary navigation links with no logic of their own on the till; what you can actually do once you land on each is out of this fragment's scope.

Reference

Tax Regime, Screen Switching, Updates and the Assistant

universal_currency_tax_toolbar.js + industry_nav.js

Every till's header carries a small "🌍 Tax Regime" dropdown listing 15 countries β€” South Africa through Nigeria, Kenya, the UAE, the UK, the EU and the US β€” and switching it live-swaps the currency, the VAT/GST rate and the tax label used across the page. Beside it, a small pill reads 🟒 with the active tax period's name, or turns πŸ”΄ EXPIRED the moment the loaded tax rule's validity window has passed, and a βš™οΈ icon opens the admin tax and pricing cockpit for anyone with the rights to change rates. One condition worth knowing: this toolbar only renders into a page that has a .app-header, .header class, or a bare <header> element, and only once the currency engine script has loaded β€” on a page missing either, the toolbar simply does not appear; it fails silently rather than with an error.

A breadcrumb plus a "<Sector> pages β–Ύ" dropdown sits at the top of every till and every platform page β€” IntelliVision › your sector › the current screen β€” and opening the dropdown lists every sibling page in that sector, a "Run the business" section linking the universal cross-sector tools (books, stock, cash-up, payroll, team β€” these used to be unreachable from a sector till before this switcher existed), a Platform section, and a link back to "All industries". It only appears on pages the platform actually recognises as belonging to a sector or the shared platform set; a page outside that registry keeps whatever nav it was built with instead.

When a new build ships, a "What's new" card slides in naming the version and a bullet list of what changed, with an "Update now" button, and a "Later" button that simply removes the card for this visit without dismissing it permanently β€” it can reappear next load until you do update.

Try to open a screen your licence tier does not cover and, instead of the screen, you land on a lock page naming the module, the required tier, its draft price, and how many days your trial has left, with a field to type an offline unlock code and a one-tap "Back to the till (Free forever)" link so you are never stranded. The single POS till itself is never gated this way β€” only the modules layered on top of it are.

On 16 of the 28 tills, a pulsing "Ask IntelliVision AI" launcher sits in a corner (agriculture, construction, ecommerce, education, fitness, hardware, healthcare, hospitality, logistics, manufacturing, property, repair, retail, salon, trades, wholesale) and opens a small chat window pre-loaded with a page-aware welcome line and four quick-question chips β€” offline and data location, how POS works, Vision AI hardware requirements, and hardware prices. The other 12 tills do not load this widget at all.

Reference

Right-Click: the Till's Context Menu

custom_context_menu.js

On 16 of the 28 tills (agriculture, construction, ecommerce, education, fitness, hardware, healthcare, hospitality, logistics, manufacturing, property, repair, retail, salon, trades, wholesale β€” exactly the same 16 tills the AI assistant loads on; butchery, carwash, funeral, liquor, petrol and restaurant do not load it) right-clicking anywhere opens a small dark context menu positioned at the cursor, closing on the next left click or a click outside it. What it shows depends on what you clicked.

Reality check β€” the four ticket actions are toast notifications, not real actions. Right-click a table row, a table-node, or a menu card and the menu offers four items: "πŸ”’ Manager Void Item" shows a toast reading "Item Void Requested - PIN Prompt" β€” no PIN prompt actually appears and the item is not removed; "πŸ’³ 2-Way Equal Bill Split" shows a toast announcing the split was triggered β€” nothing about the bill changes; "πŸ“ Add Kitchen Note" shows a toast saying a note was added β€” no note is attached to any ticket anywhere; and "πŸ–¨οΈ Print Duplicate Receipt" shows a toast saying it is printing β€” no print call is made and no hardware bridge is invoked. All four are, verbatim, one line of code each: show a toast, then close the menu. Use the till's own on-screen controls (documented below, where they exist) for anything this menu appears to offer.

Right-click empty space (or anywhere that is not a camera tile or a ticket row) instead, and the menu offers five items. Three of the five are real navigation: "πŸš€ Quick Role Switcher" opens the role login simulator, "πŸ‡ΏπŸ‡¦ SARS VAT201 Tax Ledger" opens an accounting page β€” but that link is hardcoded to restaurant_accounting.html on every till it appears on, not the sector you are actually working in, so a cashier on agriculture_pos.html who picks this item lands in the restaurant sector's books, not their own β€” and a "🏒 Multi-Client Portal" link. The other two are not navigation: "❓ Page Guided Tutorial" starts the real guided tour where one exists on the page and falls back to a toast where it does not, and "πŸ’¬ Open AI Assistant" is a toast only β€” it shows the message "IntelliVision AI Chatbot Ready" and closes the menu without opening the assistant. The assistant's own launcher, documented below, is the control that actually opens it.

Right-click a camera tile and the menu offers "Full Screen WebRTC", "Take HD Snapshot" and "Recalibrate Vision AI" β€” all three are toasts as well, plus one real link through to a vision-AI log page; camera functions belong to the Vision chapter of this manual, not this one, and are only named here because they share the same right-click handler.

Step 4

Ring Your First Sale at the Till

*_pos.html

Open your industry till. The clearest example is the pattern shared by 16 sectors β€” agriculture, automotive, construction, ecommerce, education, events, fitness, freelancer, healthcare, logistics, manufacturing, nonprofit, professional, property, rentals, repair β€” which is also the best-built ring-up flow in the product: retail_pos.html, despite being the page the old manual walked through, is actually the odd one out (see the Reference cards below for exactly how it, and every other sector, differs).

Tap any item tile in the catalogue and it is added to the active ticket immediately β€” one line per tap, quantity always 1; tapping the same tile again adds a second separate line rather than incrementing a quantity, because there is no quantity field anywhere on this screen. The ticket panel lists every line live, each with its own βœ• to remove just that line, and a running subtotal, VAT (15% while you are a registered VAT vendor, nothing at all while you are not) and total recompute after every add or remove, worked out directly from what is actually in the cart array, not a separate stored figure.

The 15% VAT is split out of the tax-inclusive price shown on the tile, not added on top of it β€” the same rule used everywhere else in the platform. That split only happens at all if you are a registered VAT vendor; if you are not, the price on the tile is the whole of your revenue and no VAT line is shown or posted (Chapter 3, Β§3.3). not VAT registered? β†—

Three genuinely distinct tender buttons sit under the total β€” πŸ’³ Speedpoint Card, πŸ’΅ Cash Payment and ⚑ Ozow Instant EFT β€” and each one really does record that exact method: the checkout function normalises whatever text a button passes it (matching "CASH", "OZOW"/ "EFT", or "CARD"/"SPEEDPOINT") into one of the three, so the sale ledger genuinely reflects which button the cashier pressed. This is the one sector family where tender choice is real end to end.

The same normaliser also recognises "SNAPSCAN"/"QR" text and would record a SnapScan-tendered sale if any button passed it β€” but no button anywhere in the product does. It is dead code, not a hidden feature; there is still no way to actually choose SnapScan at any till.

Press a tender button with nothing in the cart and the sale is refused with a plain message, and a cart that somehow totals zero is refused the same way β€” both checked before anything is written.

Once the guards pass, the sale is written in one call to the shared ledger engine β€” items, the tender line, and a stock deduction all go in together, and this is the one call every till in the product ultimately shares, however different their buttons look. The signed-in cashier's name is stamped onto the sale automatically from the current session, falling back to a generic label only if no session is found.

Reference

Ringing Up: How Each Till's Catalogue Actually Works

*_pos.html (per sector)

The remaining tills each build their own ticket a little differently. Five sectors β€” butchery, carwash, funeral, liquor and petrol ring an item onto the active ticket the same one-tap-per-line way as the 16-sector pattern above, just with their own catalogue and their own single combined tender button (covered in the payment Reference card below).

restaurant_pos.html's menu grid adds most cards straight to the cart the same way, filtered by a category bar (All / Steaks / Burgers / Seafood / Beverages / Desserts) that shows and hides cards live, and re-priced by a Standard / Happy Hour (20% off) / Delivery (+15%) tier toggle that recalculates every currently-visible tile's price the instant you switch it.

The tier toggle only re-prices the tiles on screen β€” it does not touch anything already sitting in the cart. Switch tiers mid-order and the bill can end up blending prices from two different tiers on one ticket without any visible flag that it happened.

Two of restaurant's menu cards (steak and burger) are gated behind a forced popup instead: tapping Ribeye Steak or the Bacon & Cheddar Burger opens a modal asking for a cooking temperature before anything is added. Rare / Medium-Rare / Medium / Well Done each close the modal and add the item immediately, temperature baked into its name, while an optional side-upgrade button (Salad +R12, Sweet Potato Fries +R18) adds a second, separate priced line and Cancel closes the popup with nothing added.

The side-upgrade button can be tapped on its own, without ever choosing a temperature first, and the line it adds is always labelled "(Med-Rare + <side>)" regardless of what β€” if anything β€” was actually picked. A well-done order finished via the side button prints as Medium-Rare on the ticket.

salon_pos.html adds services and retail products from a row of quick buttons below the active client's appointment the same one-tap way, on top of the three line items the appointment already arrived with. trades_pos.html's field catalogue (call-outs, materials, parts) taps straight onto the active job invoice the same way, and wholesale_pos.html's pallet/case catalogue taps straight onto the active dispatch invoice, identically.

hardware_pos.html carries a genuine cut-to-length calculator: pick a timber spec, a cut length and a piece count, press Calculate & Add, and it multiplies length by pieces by the rate-per-metre, adds one correctly-priced line naming the total metres cut, and confirms the figures in an alert. This is real arithmetic on real inputs, not a fixed demo line.

On the 16-sector pattern and its five single-tender siblings, every cart line's own βœ• removes exactly that line, instantly, no confirmation. A separate Clear button on five tills β€” healthcare, logistics, manufacturing, property and repair β€” empties the whole ticket in one tap, also with no confirmation prompt: one stray tap loses the entire order, though nothing is charged until checkout so re-adding items costs only time.

Reality check β€” retail_pos.html is the outlier, not the template. Its scan box has no real scanner behind it: "Simulate Scan Barcode" always appends the identical hardcoded line β€” Cadbury Dairy Milk 150g @ R24.50 β€” with an alert announcing a scanned barcode number, regardless of what is actually being sold. The cart starts pre-loaded with six fixed grocery lines on page load; this button is the only way to add anything further, and it always adds the same thing. Its own totals do recompute live from whatever rows are in the table, the same honest way as the 16-sector pattern. Its βœ• equivalent is a "Remove Item" button gated by a PIN prompt β€” the demo PIN is printed in the prompt text itself (1234) β€” and it only ever removes the LAST row in the table, never a specific line you pick.

Eleven tills carry a "Scan … / Search…" text box above the catalogue β€” worded to suit the sector ("Scan Barcode / SKU / Search…" on six of them, "Scan Waybill / Consignment", "Scan BOM / Part Number", "Scan Unit / Tenant ID", "Scan Part SKU" and "Scan Barcode / ICD-10" on the rest β€” automotive, events, freelancer, healthcare, logistics, manufacturing, nonprofit, professional, property, rentals, repair) that does nothing β€” it has no id, no name, and no input handler anywhere in the page. You can type into it; nothing filters, nothing scans, nothing is added. On these 11 tills the only working way to ring up an item is tapping a catalogue tile.

retail_pos.html has one flat "Apply Voucher" button that announces a fixed R50 discount and edits the total banner's text, and a "Member Card" button that shows a fixed loyalty-cashback message with no other effect.

The voucher now reaches the sale. Until 20 August 2026 it did not: the button edited the banner text while payNow() recomputed the charged total straight from the cart table, so a cart of R485.00 showed R435.00 and charged R485.00. The voucher is now a real discount that reduces what the customer owes. On a R485.00 cart with a R50.00 voucher the sale is recorded at R435.00, the bank debit is R435.00, gross sales still show R421.74 with the R43.48 given away sitting in its own contra-revenue account GL 4100 Discounts Allowed, and output VAT falls to R56.74 β€” fifteen percent of what you actually charged, not of what you did not. One voucher per sale, and a voucher can never take a sale below zero. Outside retail no till has a line-item or percentage discount.

Reference

Taking Payment: the Tender Pattern, Till by Till

*_pos.html (per sector)

The single question every cashier eventually asks β€” "can I actually tell the till how the customer paid?" β€” has a different answer on almost every sector. This table is the honest version of manual.html:847's tender list.

Till Can the cashier really choose? What actually gets recorded
16-sector patternYes β€” Card, Cash, Ozow are three distinct buttonsWhichever of the three you pressed
retailNo β€” one PAY NOW button, no argument passedAlways CARD
butchery / carwash / funeral / liquor / petrolYes β€” Cash, Card and Ozow Instant EFT are three distinct buttons (since 20 Aug 2026)Whichever of the three you pressed
restaurantPartly β€” Card and Cash are separate buttonsCARD or CASH, matching the button (Cash also prompts for tendered amount)
salonNo β€” one Complete Checkout buttonAlways CARD
tradesYes β€” Card / EFT / Cash are three distinct buttonsWhichever of the three you pressed
wholesaleYes β€” Trade Credit / EFT / Card are three distinct buttonsWhichever of the three you pressed
hardwarePartly β€” Trade Credit and Cash/Card are separate buttonsTRADE CREDIT, or CARD even when the button says "Cash / Card"
hospitalityNo β€” one Accept Payment buttonAlways CARD

retail's PAY NOW button calls the checkout function with no tender argument at all, so every retail sale books as CARD regardless of how the customer actually paid.

butchery, carwash, funeral, liquor and petrol each give the cashier three buttons β€” Cash, Card and Ozow Instant EFT, and the one you press is the one recorded. Until 20 August 2026 these five shared a single "Instant Pay (Ozow / Card / Cash)" button that passed no method at all, so the literal label went into the record as the payment method. That was not merely untidy: a label matching neither cash nor account classified as a bank receipt, so cash taken over these five counters posted to GL 1010 Bank instead of GL 1000 Cash on Hand and never appeared in the shift cash-up β€” a butchery closing its drawer would have seen the float alone as expected and thrown the whole day's takings into Cash Over. Cash rung on these tills now reaches the cash-up.

restaurant's "πŸ’³ CARD (1.75%)" button records a CARD tender β€” the 1.75% named in the button is a label only; nothing in the checkout path actually deducts a fee from the total charged or recorded. "πŸ’΅ CASH" prompts for the amount tendered, and calculates and shows the change due once you confirm, while a tendered amount less than the total is rejected outright with a message, before anything is recorded. The confirmation alert also claims the RJ11 cash drawer was kicked open; no hardware-bridge call happens anywhere in this function, so treat that line as informational rather than a hardware confirmation.

salon has one "COMPLETE SALON CHECKOUT" button, hardcoded to always pass CARD β€” there is no way to record a client's cash or EFT payment as anything but a card tender on this till.

trades' "πŸ’³ CARD (TAP-ON-PHONE)", "⚑ INSTANT EFT" and "πŸ’΅ CASH PAYMENT" buttons each pass their own distinct method string through to the ledger β€” a field technician genuinely can record which of the three the client used.

wholesale's "🏒 30-DAY TRADE CREDIT", "⚑ INSTANT EFT" and "πŸ’³ SPEEDPOINT CARD SETTLEMENT" buttons are likewise three genuinely distinct methods. Unlike hardware's version below, choosing Trade Credit here runs no credit-limit check at all β€” it is recorded exactly like any other tender, with no available-balance guard and no link to a specific debtor account.

All three "account" tenders on the tills β€” wholesale's 30-Day Trade Credit, hardware's Charge to Trade Credit and restaurant's Charge to Corporate Tab β€” bypass the debtors book entirely. None of them updates a customer's account balance or statement, and each posts the sale as a debit to GL 1010 Bank / Speedpoint Settlement rather than to GL 1100 Debtors Control β€” in the ledger the sale looks like money that already arrived. The full explanation, and what to do instead if you need the debtors book to be right, is in Chapter 3, Β§3.6.

hardware's "CHARGE TO TRADE CREDIT" button genuinely checks the account's available credit before allowing the sale, refusing with "TRADE CREDIT LIMIT EXCEEDED! Manager approval required" if the total would exceed it, and deducting from the shown available-credit figure on success. Its counterpart, "PAY CASH / CARD (SPEEDPOINT)", always records CARD regardless of the "Cash / Card" wording on the button β€” there is no separate cash path here, and no tendered-amount or change prompt like restaurant's.

The credit-limit guard is real for the length of one browser session only. availableCredit is a plain JavaScript variable initialised to a fixed R107,850.00 on page load β€” it is not read from or written to any ledger. Reload the page and it resets to that starting figure no matter how much was actually charged against the account beforehand; the Limit and Owing Balance figures shown alongside it never update at all, only the Available Credit number does.

hospitality's single "ACCEPT PAYMENT & CHECK-IN GUEST" button settles the whole folio and checks the guest in together, and β€” like retail and salon β€” it passes no tender argument, so it always books as CARD no matter how the guest actually paid at the desk. The R2,500 incidental pre-authorisation hold shown beside it is fixed decorative text, never read or updated by this function.

Reference

Refunds and Returns

retail_pos.html
βœ“ Refunds and returns reverse the sale in the books (Gate G51)

Until 20 August 2026 this product had no way to reverse a sale at all. Nothing on any till, in any book, undid a transaction: a mis-rung sale stayed rung, and a returned item had to be handled outside the system entirely.

Retail’s [REFUND / RETURN] button opens a small panel on the till: the order number being reversed, an amount (leave it blank to refund the whole sale), and a reason. The reason is not optional — a refund with no stated reason is refused, so the audit trail can never contain a silent reversal.

What it does to the books: revenue and output VAT are both reversed, and the money goes back out the same way it came in — a cash sale refunds cash, a card sale refunds the bank, and an on-account sale becomes a credit note against GL 1100 and the customer’s balance rather than a cash payout. That credit note shows on their statement, allocates against the invoice in the same oldest-first order as a payment, and stops the aging schedule chasing money they no longer owe.

What a refund refuses to do. It will not touch an order number it cannot find, will not accept a blank or non-positive amount, and will not refund more than is still unrefunded on that order — so the same sale can be part-refunded twice but never over-refunded. Each refund writes its own audit row, and the order carries a running refunded total so you can always see what is left.

The control is on the retail till today. The engine behind it is shared, so the other twenty-seven tills can carry the same button without a second implementation — but until they do, reverse their sales from retail or from Books.

Reference

Corporate Tabs, Trade Credit and Split Bills at the Till

restaurant_pos.html + hardware_pos.html

restaurant's "πŸ’³ Charge to Corporate Tab" button opens a modal listing pre-set approved corporate accounts β€” Sasol Corporate, an FNB commercial tab, and one named individual account, each with a fixed limit and used-balance shown in its own dropdown option. Picking a different account from that dropdown does not update anything else in the modal: the "Available Credit" figure shown stays fixed at its opening value, because the function the dropdown calls on change β€” onDebtorSelectChange() β€” is not defined anywhere in the page. Selecting a different account is silently a no-op beyond changing which name is highlighted.

"βœ“ Authorize Charge" records the sale against the account shown, with the VAT portion broken out, and confirms with the order number and the amount, while Cancel simply closes the modal with nothing charged. This control runs no credit-limit check of its own before authorising.

Both restaurant's tab modal and hardware's credit banner show a limit, an owing balance, and an available-credit figure for the account in view β€” on hardware this available-credit number is genuinely live within the session (see the Reference card above for its reset-on-reload caveat); on restaurant it is fixed decorative text that the dropdown never refreshes. Only hardware's trade-credit button actually blocks a charge that would exceed the shown limit β€” restaurant's corporate-tab flow and wholesale's trade-credit tender both authorise regardless of balance.

Reality check β€” the guest-split buttons do not read the live cart. "Pay Guest 1" and "Pay Guest 2" each charge a fixed set of items and a fixed R242.50, taken from a hardcoded map built into the page, completely independent of whatever is actually sitting in the order cart below them at the time you press the button. Ring up an entirely different order and these two buttons still charge the same two demo baskets. The "Guest 1 / Guest 2" summary table above them β€” subtotal, items, READY TO PAY status β€” is likewise fixed markup on page load, never recalculated from the live order. There is no working way to split whatever the table is actually carrying at checkout time.

"Print Splits" shows a printing confirmation alert naming the table and a receipt number β€” no print call reaches the hardware bridge; treat it the same as the context menu's duplicate-receipt item above.

hardware's "PRINT YARD DISPATCH PASS" shows a confirmation alert with a fixed pass number and a hardcoded three-item list β€” 6x Custom Cut Pine, 20x PPC Cement, 1x DeWalt Drill Kit, regardless of what is actually in the trade cart at the time β€” then sends you to the timber yard screen. No print call is made.

IntelliVision butchery till screen
Figure 3: A cashier's till in use (butchery_pos.html) showing the product grid, the cart line items and the Cash / Card / Ozow Instant EFT tender buttons.
Step 5

Receipts: Confirmation, WhatsApp Share and Migration

*_pos.html

On retail, restaurant and butchery β€” and on the trade-debtors screen's customer statements, described below β€” a genuinely working "πŸ’¬ Share receipt on WhatsApp" button appears the moment a sale completes. It is real: the button's link is built from the actual order just recorded and opens WhatsApp with that receipt attached, ready to send. This is a shipped, gate-proven feature (G25) β€” it is not "Coming soon" on any till that carries it.

On the same three tills, a green confirmation banner appears in place of (not on top of) the tender buttons once a sale completes β€” the order number, the amount, and the WhatsApp button described above β€” and stays until the next item is added, at which point it hides itself again ready for the next sale.

restaurant_pos.html carries a "πŸ”„ Import GAAP CSV" link in its own header, alongside the pricing-tier toggle β€” it is a plain navigation shortcut straight to the real legacy-migration portal covered in Chapter 1's import section, not a separate importer built into the till itself.

Printing itself β€” the thermal-receipt formatting and the ESC/POS Bluetooth/USB bridge with its cash-drawer kick β€” is a platform-wide engine rather than a till.* function of its own, and stays out of this fragment's numbered scope; it is documented where the manual covers universal_hardware_bridge.js directly.
Step 6

Shift Open, Blind Cash-Up and Petty Cash

cash_management.html
This screen requires the manage capability (Owner or Manager) β€” a plain Cashier account that opens it directly is bounced to a full-page "Access Restricted" panel naming their role, with a single Sign out button as the only way off it. That access-denied panel's Sign out button is not a general-purpose "sign out of the terminal" control; it only exists on this denial screen. There is no other sign-out button anywhere on cash_management.html.

The Sign out button described above ends the session and returns to auth.html β€” again, reachable only via the access-denied path, not as a routine control a manager taps at the end of a shift.

Opening a shift asks for a cashier name (quick pills for Cashier 1 / Cashier 2 / Supervisor, or your own signed-in name pre-filled) and an opening float (quick pills for R200 / R500 / R1,000). This is genuinely enforced server-side, not just labelled: attempting to open a second shift for a name that already has one open is rejected outright, naming the existing shift number. The cashier field and the float field are both plain inputs behind that same validation β€” a blank cashier name or a negative float is refused before the shift is created.

Closing a shift is genuinely blind: the "System Expected Cash" and "Cash-Up Variance" figures are replaced with πŸ”’ placeholder text and stay that way for the whole shift β€” there is no way to peek at them before you count. Only once you type the physically counted cash and submit does the real close happen, and only then do both figures reveal themselves, colour-coded green for balanced, red for a shortage, blue for an overage. The reveal names the exact figures and the ledger accounts each variance posts against β€” Cash Short (5900) against Cash on Hand (1000) for a shortage, Cash on Hand against Cash Over (4900) for an overage.

Petty cash payouts require a positive amount and a written reason β€” both are required fields, refused if either is missing β€” against the currently open shift only; four quick-pick reason pills (cleaning supplies, staff refreshments, hardware consumables, courier/postage) fill the reason field for you, and every payout posts a real balanced ledger pair, debit 5800 against credit 1000, confirmed in the response message. Every voucher recorded on the currently active shift lists below the form β€” time, reason, amount, and the GL posting β€” and the engine itself refuses a payout once its shift has already been closed.

A full audit table of every shift session β€” ID, cashier, status, opened time, float, expected, counted and variance β€” sits below the open/close cards, clickable row by row to load any past shift back into the active-shift panel above for inspection. A cashier dropdown, built from every distinct cashier name that has ever opened a shift, filters that table to just their sessions, and a Refresh button re-reads everything from the database β€” shift list, active shift, and history together β€” useful after a sale posts on another device sharing this till, since the screen also refreshes itself automatically on that broadcast.

Reference

Trade Debtor Accounts

wholesale_trade_debtors.html

Charging a sale to a customer's account at the till (hardware's trade credit button, restaurant's corporate tab, both covered above) is one side of this. The account itself β€” its credit limit, its balance, its statement and its aging β€” is managed from one shared screen reachable from wholesale, hardware and restaurant.

"βž• Add Account Customer" opens a form for a business name, contact details, and an optional credit limit β€” leaving the limit blank means unlimited, and the field's own helper text calls this "Fail-Closed Enforced": a limited account really does refuse a sale that would push its balance over the cap, surfaced as an explicit "FAIL-CLOSED ENFORCEMENT" error rather than a silent skip.

"πŸ’³ Receive Payment" takes an amount, a method (EFT / Card / Cash), and an optional reference note, and settles it against the chosen account, applying the payment oldest-invoice-first (FIFO) across whatever is outstanding β€” the confirmation names exactly how many invoices the payment was allocated across and the account's new balance.

"⚑ Test Account Sale (POS)" rings a chosen item, quantity and price straight onto a chosen debtor's account, going through the same shared sale-recording call every till uses β€” a deliberate demonstration/verification control living on the debtors screen itself, distinct from charging a live sale on an actual till (restaurant's corporate tab and hardware's trade credit button, both covered above, are the real till-side equivalents).

Opening any account's statement shows credit limit, current balance and available credit, plus a full running-balance ledger of every charge and payment on that account, each row typed CHARGE or PAYMENT with a reference and description. "πŸ–¨οΈ Print Statement" calls the browser's own print dialog directly β€” a genuinely real, simple print, not a simulated one β€” and the statement also carries its own working "πŸ’¬ Send statement on WhatsApp" share link.

A tab toggle switches the whole screen between the Account Customers list and a 30/60/90+ day aging schedule, the latter a full table per customer with a totals row, backing the four aging figures (current, 30, 60, 90+ days) shown as headline metrics at the top of the page.

Chapter 2

🏒 Per-Archetype Till Guides

IntelliVision supports 28 vertical industries organized into six fundamental workflow archetypes. Below is the operational reference for each till archetype.

πŸ›’ 1. Scan-and-Go Retail

Applicable Sectors: General retail, supermarkets and convenience counters (retail_pos.html), liquor and bottle stores (liquor_pos.html), and hardware stores and builders' trade counters (hardware_pos.html) β€” three separate tills built on the same tap-a-tile pattern, not one configurable screen.
Ringing Up: On the retail till, ring-up today is tapping a product tile β€” real barcode scanning is not there yet. The "Simulate Scan Barcode" button is exactly what its name says: every tap adds the same fixed line, "Cadbury Dairy Milk 150g @ R24.50", no matter what is (or isn't) shown to the camera. There is no live camera decode and no HID handheld-scanner input wired into any retail sale today. full till reference β†— Liquor and Hardware ring up the same way β€” tap a catalogue tile (a bottle, a case, or a trade item) to add it to the ticket; neither till has a scan control at all. Hardware's trade counter adds one genuinely useful calculation on top of that: pick a timber spec, enter a cut length and a piece count, and "Calculate & Add" works out total metres Γ— rate and appends a correctly priced line to the invoice β€” the arithmetic is real, not decorative. full till reference β†— Removing a scanned item on the retail till asks for a "Cashier Supervisor PIN" β€” but the PIN is a fixed demo value printed right in the prompt itself (1234), so today this is a confirmation step, not a real access control. full till reference β†— "Apply Voucher" on the retail till is a real discount engine as of 20 August 2026 β€” it still applies a flat R50.00 regardless of the code entered, but that R50.00 now genuinely comes off what the customer is charged, posts to GL 4100 Discounts Allowed and reduces the VAT accordingly. "Member Card" is still a demonstration button, not a loyalty ledger: it always shows a fixed R12.50 cashback with no card actually read and no balance anywhere. voucher reference β†— member-card reference β†—
Tender Modes: The retail till has one checkout button, "PAY NOW," and it always books the sale as CARD β€” there is no cash, EFT or SnapScan choice on screen, no change calculator and no numeric keypad. What it does do for real: the tap writes a genuine sale β€” items, payment and stock β€” in one transaction to your ledger. SnapScan does not exist as a working tender anywhere in this product; if you are expecting it, you will not find it here or on any other till. full till reference β†— Liquor offers a single "Instant Pay (Ozow / Card / Cash)" button and, like retail, the cashier cannot actually pick between those three named methods on screen β€” see Weigh & Counter Sales below for the identical pattern on the butchery till. Hardware is the one till in this card with a real credit control: "Charge to Trade Credit" checks the invoice total against the account's available balance and refuses the sale outright β€” "TRADE CREDIT LIMIT EXCEEDED! Manager approval required" β€” if it would go over. That guard genuinely runs before anything is recorded. Cash and card settle through a second button, "Pay Cash / Card." trade-credit reference β†— credit-guard reference β†—
Receipts: Retail's receipt banner includes a genuine "Share receipt on WhatsApp" link once the sale is recorded β€” this is shipped, not a mock-up. Liquor and Hardware do not have this button. Hardware's "Print Yard Dispatch Pass" does not send anything to a printer β€” it shows a confirmation alert with a pass number and then takes you to the Timber Yard screen; nothing here calls the same receipt bridge the till's thermal receipt uses. full till reference β†—
Beyond the till β€” Stock & Items (retail_inventory.html): real, and the honest exception in this card. Search by name, SKU or barcode; add a new item with price, cost and opening stock; edit any field; adjust a count with an audit note kept on the item. Owners and managers can edit β€” till and floor staff see the same list read-only. Every row is the same database the till sells from. The page's own "Expiry Lot & Auto-Markdown" panel is labelled a design preview and nothing on the page pretends otherwise.

retail_specialty_categories.html and liquor's liquor_broken_stock.html ("Spirits Shelf Loss & Broken Stock Verification AI") are both concept pages β€” each opens with "Design preview β€” this screen is a concept render, not a working tool yet," and neither has a single interactive control on it. Treat their category-specific ideas (fashion sizing, spirits breakage, jewellery serials, and so on) as sketches, not shipped tools.

Hardware's header links to eight further stations: Timber Yard AI, Layby Register, Paint Tinting, Tool Hire, Board Cutting, GRV 3-Way Matching, RFQ Tender Quote and RTV Supplier Credits. Of the eight, only GRV 3-Way Matching is real β€” it posts a genuine goods-received voucher against a purchase order, updates stock and weighted-average cost, and raises the accounts-payable liability (see Money & Compliance, Purchases & GRV). The other seven each open to the same "design preview β€” not a working tool yet" banner with no interactive control on the page.

πŸ₯© 2. Counter & Bulk Sales (Butchery / Agriculture / Wholesale)

Applicable Sectors: Butchery and meat wholesalers (butchery_pos.html), agriculture and farm produce (agriculture_pos.html), and wholesale & B2B bulk distribution (wholesale_pos.html).
No till reads a scale today. The platform's hardware-bridge engine can already parse a live RS232/USB scale feed and compute a tared net weight β€” it even fires a scaleWeightUpdate browser event when it does. But nothing listens for that event: a repository-wide search of every page in this product returns zero matches for it outside the one engine file that dispatches it. Every "per kg" product on these three tills β€” A-Grade Beef Forequarter (kg), Whole Lamb Carcass (kg), Live Weaner Cattle (kg), and so on β€” is a fixed-price tap tile, priced and rung up exactly like a tin of pilchards on the wholesale till. The kg in the name is a label, not a live reading; there is no auto-tare, no PLU-by-weight lookup, and no scale-pairing screen anywhere in the product yet.
Ringing Up: All three tills ring up the same way: tap a catalogue tile to add its fixed price to the ticket. Agriculture's cart is the most complete of the three β€” it recalculates a live subtotal, 15% VAT and total as items are added or removed, the same pattern as the platform's general till β€” and, like every till, it shows and posts no VAT at all if you are not a registered VAT vendor. not VAT registered? β†—
Tender Modes: Butchery, like liquor above, gives the cashier one "Instant Pay (Ozow / Card / Cash)" button β€” it books the sale under a generic label, and the cashier cannot pick a specific method on screen. full till reference β†— Agriculture is the more honest of the three here β€” it genuinely offers three separate buttons (Speedpoint Card, Cash, Ozow Instant EFT) and records whichever one the cashier actually taps. Wholesale settles on three real buttons too β€” 30-Day Trade Credit, Instant EFT, or Speedpoint Card β€” but unlike Hardware's trade counter, nothing here checks the buyer's account balance before charging 30-day credit; the sale is simply recorded under whichever button was tapped, with no credit-limit guard anywhere in the function. full till reference β†—
Receipts: Butchery shares the real WhatsApp receipt link with Retail and Restaurant β€” it appears once the sale is recorded, addressed to that specific order number. Agriculture and Wholesale do not have this button.
Beyond the till β€” Carcass Breakdown Station: the till's "⚑ Carcass Breakdown Station" link opens butchery_carcass_yield.html β€” a design preview. The page is a single static checklist claiming "real-time OCR scale integration," "24/7 IoT cold-chain telemetry" and "100% automated ledger posting"; there is not one button, input or interactive element anywhere on it. Hanging weight, primal-cut yield and cutting-loss variance are not tracked anywhere in the product today.

agriculture_livestock_crops.html ("Grain Silo Moisture Sensors & RFID Herd Genetics") is the same kind of concept page. One control on it is genuinely real, though: "Error Adjustment" opens the platform's actual supervisor-PIN mistake-correction log β€” the same audited engine used across the product β€” so a correction logged there is real even though the silo-telemetry and RFID-herd-genetics claims around it are not. The "Dispatch Event Webhook" button beside it only shows an alert; no webhook is sent, and the "Live Connected APIs" chips next to it are static labels, not a verified live connection.

🍽️ 3. Table & Tab (Restaurant / Hospitality)

Applicable Sectors: Restaurants, cafes and bars (restaurant_pos.html), and guest houses and boutique-hotel front desks (hospitality_pos.html).
There is no floorplan on the till, and no drag-and-drop anywhere in the product. The screen a waiter or bartender actually rings sales on is restaurant_pos.html β€” a flat touch menu grid with no table layout at all. restaurant_floorplan_builder.html is a separate, disconnected page, and the product labels it honestly: "Design preview β€” this screen is a concept render, not a working tool yet." Its "Auto-Fill Floor Plan," table shapes and "Send to Kitchen KDS" button only rearrange on-screen boxes and show an alert β€” the order it builds is never written to the ledger and never reaches the real Kitchen Display System described below. A search of the file for drag, draggable or ondrop returns nothing. Earlier drafts of this manual described interactive drag-and-drop table selection here; that claim is removed, not softened.
Ringing Up: Restaurant's till genuinely recalculates the whole menu grid when you switch pricing tier β€” Dine-In, Happy Hour (20% off) or Delivery (+15%) β€” every visible price updates live, and the discount or markup carries into whatever is added next. full till reference β†— The category bar β€” Steaks & Grills, Burgers & Mains, Seafood, Beverages & Bar, Desserts β€” really filters the grid down to matching tiles. full till reference β†— Two menu items β€” the Ribeye Steak and the Bacon & Cheddar Burger β€” force a cooking-temperature choice and offer a paid side upgrade before the line is added to the cart; every other menu tile adds straight to the cart with no prompt. full till reference β†— Hospitality's till works differently again β€” there is no menu grid at all; it settles a pre-itemised room folio in a single action, described under Tender Modes below.
Tender Modes: Restaurant's Card (1.75%) and Cash buttons both write a real sale. Cash genuinely prompts for the amount tendered, refuses a tender lower than the total, and computes the change due before recording anything. full till reference β†— "Charge to Corporate Tab" picks one of three named accounts and authorises the charge β€” but no credit-limit check runs before the charge is recorded; the "Available Credit" figure shown is display text, not read from a live debtors ledger the way Hardware's trade-credit guard is (Card 1, above). full till reference β†— "Pay Guest 1" and "Pay Guest 2" are two fixed buttons over a hardcoded two-guest order, not a live split of whatever is actually in the current ticket β€” treat this as a demo of one two-cover split, not a general bill-splitter for any table size or combination. full till reference β†— Hospitality's single "Accept Payment & Check-in Guest" button settles the whole itemised folio β€” room nights plus any spa charge already on it β€” as one real, ledger-backed sale, then returns to the dashboard. full till reference β†— The "R 2,500.00 held in escrow" pre-authorisation and the passport-scan confirmation above it are both static display text, not a live card hold or a real document scan. "Encode Room 402 Key Card" is the same kind of button as Hardware's yard pass β€” it shows a success alert with no RFID hardware call behind it.
Receipts: Restaurant shares the real WhatsApp receipt link with Retail and Butchery. "Print Splits" is not real printing, though β€” it only shows an alert claiming a receipt number was printed; nothing calls the till's thermal-print bridge.
Beyond the till β€” Kitchen Display System (restaurant_kds.html): genuinely real, and one of the best-built screens in this product β€” its own source comment says so, and it holds up. Tickets shown are the till's actual live open orders, not sample data, grouped into Grill / Fryer & Sides / Cold Larder by matching item names, each with a live SLA timer that turns amber past 5 minutes and red past 10. "Bump" writes the real order's kitchen status to done; "Recall" reverses the last bump; "86 an Item" flags a real stock item unavailable on the kitchen board without touching its stock count. The board refreshes the instant any till anywhere records a sale, with a 15-second poll as a fallback. Its "Plating AI" camera panel is honestly labelled a design preview on the page itself and points through to Vision Live for the real camera.

Hospitality's own linked concept screens β€” room-service ordering, spa booking, housekeeping release, night audit and maintenance logging β€” all open to the same "design preview" banner; none of their buttons write to a real folio, room-status table or ledger. The front-desk till above is the only place a hospitality sale is actually real.

πŸ”§ 4. Job & Appointment (Trades / Salon)

Applicable Sectors: Hair & Beauty Salons, Electronics Repair, Automotive Workshops, Field Trades β€” four separate tills (salon_pos.html, repair_pos.html, automotive_pos.html, trades_pos.html) that share a family resemblance but not a checkout.
Ringing Up: On all four tills, a service or part is rung up by tapping a fixed-price catalogue tile β€” there is no appointment-calendar lookup and no staff-linked booking on the till screen itself; "Active Client Appointment" and "Active Vehicle Job Card" headers you see are static labels, not pulled from a booking record. The salon till is the one place in this archetype with real commission math: it shows a stylist commission of a flat 30% of the ticket, recalculated live as items are added. The stylist name on screen is fixed text, not a per-stylist rate, and the commission figure is a live display only β€” it is not saved as part of the recorded sale.
Tender Modes: The salon till has exactly one checkout button. It is wired to card and nothing else β€” there is no cash or EFT option on screen, so "choosing" a tender here means nothing; every salon sale is booked as CARD. Repair, Automotive and Trades all give the cashier a genuine choice: separate Card, Cash and EFT buttons, each tendering the sale as the method actually tapped. Repair's large "RELEASE VEHICLE & CLOSE JOB CARD" button is not a separate workflow step β€” it calls the exact same checkout as the Speedpoint button above it, always as a card payment. No distinct job-card-closing record is created; releasing the vehicle is just another way to trigger a normal card sale. Whichever of those buttons is tapped, the sale itself is real: all four tills record the ticket's items, the payment and the stock movement in one transaction against your ledger β€” there is no half-written sale if the tap fails.
Neither a booking deposit nor a 30-day trade-credit tender appears on any of these four tills β€” earlier drafts of this manual claimed both; no control, field or handler for either exists in source, so both claims are removed rather than repeated here.
Line Editing & Receipts: Repair and Automotive let the cashier remove a mis-tapped line with a βœ• on the ticket (Repair also has a one-tap "Clear Ticket" for starting over). Salon and Trades have no way to remove a single line once it is added β€” the only recovery is reloading the page and starting the ticket again. Every completed sale on all four tills writes a real record through the same ledger engine as every other IntelliVision till and prints a standard tax invoice with the 15% VAT split shown separately β€” or, if you are not a registered VAT vendor, the same slip with no VAT line at all. Claims of itemised labour-hour logs, parts serial numbers, technician notes or warranty terms on the printed slip do not match what these four tills actually produce β€” the receipt is a standard tax invoice, not a specialised service document.
Specialty Pages (salon_booking_calendar.html, repair_imei_diagnostics.html, automotive_job_cards.html, trades_van_inventory.html): all four open to the same banner β€” "Design preview β€” this screen is a concept render, not a working tool yet." Today they each render one hardcoded example record (a fixed appointment, IMEI, bay or van) with decorative "Connected APIs" chips and a webhook button that only shows an alert; nothing on these four pages is wired to your real appointments, intake records, job cards or van stock. Chair booking, IMEI/serial intake logging, parts-BOM allocation and van-stock replenishment are Coming soon β€” the four tills above are where the real, working sale happens today.

β›½ 5. Lane & Fleet (Fuel / Logistics / Wash)

Applicable Sectors: Fuel Service Stations, Automated & Hand Carwashes, and Logistics Couriers & Transport Fleets. That last pairing is one till, not two β€” logistics_pos.html brands itself "Logistics Fleet & Freight Transport" and is the single shared screen for courier and fleet-freight work; there is no separate "Transport Fleets" till.
Ringing Up: All three tills ring up flat-price catalogue tiles β€” litres of fuel or an LPG refill on Petrol, a wash tier on Carwash, a freight leg or waybill fee on Logistics. None of the three reads a pump meter, logs a number plate, captures a driver ID, or computes a price from distance or tonnage: Logistics' "Long-Haul Freight Dispatch (Per Ton/Km)" tile is a fixed R4,850.00 regardless of tons or kilometres, exactly like every other tile on these tills. The "GPS Fleet Tracker & Waybill Invoicing" heading at the top of the Logistics till is a static line of text next to a screenshot image β€” no live map, GPS feed or tracker widget is embedded on the page.
Tender Modes: Petrol and Carwash each have exactly one checkout button, labelled "Instant Pay (Ozow / Card / Cash)". Tapping it does not ask which method was used β€” the ledger records the tender as the literal button label, not as Ozow, Card or Cash specifically, because the till never collects a method. Logistics is the exception in this archetype: real Speedpoint Card, Ozow EFT and Cash buttons, a working βœ• to remove a single waybill line, and a one-tap Clear for the whole ticket. Fuel Voucher and Corporate Account tenders do not exist on any of the three tills β€” dropped here rather than repeated from an earlier draft, since no such control appears in source.
βœ“ SARS diesel rebate logbook β€” genuinely working Two of this archetype's three sectors β€” Petrol and Logistics β€” are eligible for the SARS diesel fuel refund, and the logbook that supports the claim is a real, gate-proven screen: diesel_rebate.html records qualifying litres and use per entry and computes the refund as litres Γ— the configured rate. The rate ships as a provisional R3.74 per litre and the screen says so on its face β€” diesel refund rates move with fuel-levy adjustments, so confirm the current rate with SARS before you claim. As everywhere else in this product, the screen prepares the figures for your claim; it never submits anything to SARS. Carwash is not an eligible sector.
Line Editing & Receipts: Petrol and Carwash have no way to remove a rung-up line β€” a wrong tap stays on the ticket until the sale is finished or the page is reloaded. All three tills print a standard tax invoice with the 15% VAT split on completion (no VAT line at all if you are not a registered VAT vendor); none prints liquid volume to three decimal places, an odometer reading or a fuel-levy line β€” those fields do not exist in the receipt data any of the three tills builds.
Specialty Pages (petrol_fuel_reconciliation.html, carwash_bay_timer.html): both carry the same "Design preview β€” this screen is a concept render, not a working tool yet" banner and render one static checklist each β€” tank-dip-vs-pump-meter reconciliation and drive-off ALPR for Petrol, bay-occupancy and wash-output ALPR for Carwash. Neither loads a camera or telemetry engine; both are text-only mockups today. There is no Logistics-specific specialty page. Underground tank reconciliation, automated drive-off detection and bay-throughput timers are Coming soon.

🎟️ 6. Community & Venue (Events / NPO)

Applicable Sectors: Live Event Venues, Fitness Gyms, Non-Profit Organizations, Funeral Societies β€” four tills (events_pos.html, fitness_pos.html, nonprofit_pos.html, funeral_pos.html).
Ringing Up: All four tills ring up flat-price catalogue tiles the same way as every other archetype β€” an admission pass or RFID top-up on Events, a membership or protein tub on Fitness, a service item on Nonprofit, a casket or transport line on Funeral. Two of these four catalogues were never adapted from the template they were copied from. Funeral prices an "Executive Casket Solid Oak" at R 65.00 β€” the identical 65 / 130 / 195 / 260 / 325 price run used for Petrol's litre prices and Carwash's wash tiers, unedited. Nonprofit's counter sells "Standard Service Package", "Premium Package / Part" and "Diagnostic Assessment Fee" at R 1,250 / R 2,450 / R 650 β€” the same three names and prices as the Automotive workshop till. Treat both catalogues as placeholder demo data, not real sector pricing, until an owner edits them.
Tender Modes & Line Editing: Events, Fitness and Nonprofit each offer real Card, Cash and Ozow EFT buttons and a working βœ• to remove a single line before checkout. Funeral matches Petrol and Carwash, not the other three: one "Instant Pay (Ozow / Card / Cash)" button with no method actually chosen, and no way to remove a line once it is rung up.
Receipt Generation: All four print a standard tax invoice with the 15% VAT split from a real sale record β€” with no VAT line at all if you are not a registered VAT vendor. The "Digital Wristband Pass" line in Events' success message and the "Access Turnstile Unlocked" line in Fitness' do not correspond to anything the till actually generates β€” no QR, barcode or wristband-ID code exists on either page; both are decorative text in the same alert as every other line.
βœ“ Section 18A donor receipts β€” genuinely working
Unlike its Events and Fitness neighbours, Nonprofit's Section 18A screen is real, working software, not a preview. It refuses to issue a certificate until an owner has saved the organisation's SARS PBO number; it then validates the donor name, amount, date and project fields, assigns the next sequential receipt number from what has actually been issued so far, writes the receipt to the audit-log store (with a local mirror if the store is unavailable), and opens a genuinely printable certificate styled for @media print β€” spelled-out amount in words included.
It does not, however, track grant funding against project budgets: "Approved Public Benefit Project" is a free-text field typed per receipt, not a budget it checks spending against β€” there is no target amount, running balance or variance shown anywhere on the page.
Fitness (fitness_turnstiles_classes.html): a design preview titled "Facial Biometric Gates & Member Capacity Meters" β€” one static example record, no camera, no biometric match code, no turnstile hardware call anywhere in the product. Biometric member check-in is Coming soon, not a working feature today. Events (events_scanner_wristband.html): the same design-preview pattern β€” "High-Speed Offline Gate Validation & Cashless RFID Bars" is one static counter (8,450 scanned) with no scanning or NFC code behind it. High-throughput gate/wristband validation is Coming soon. Funeral (funeral_policy_ledger.html): the "BI-1663 Registry, Coffin BOM & Policy Premium Ledger" a merchant reaches from the Funeral till's own nav bar is also a design preview β€” monthly policy-premium billing and a coffin bill-of-materials are Coming soon, not something this screen does yet.
Chapter 3

πŸ’° Money & Financial Compliance

IntelliVision maintains an integrated, double-entry general ledger in local IndexedDB storage. Every financial action posts balanced debits and credits β€” postJournal() enforces exact integer-cent equality on every write, with no rounding "plug" line ever inserted to force a balance. This chapter covers your books, purchases, VAT201, payroll, the sector compliance packs, trade debtors, and encrypted backups β€” written from the same engine that posts your till sales, not a separate description of it.

πŸ“š 3.1 Your Books: Ledger, Trial Balance & the Honest SARS Workflow

Every sector has its own Books page (for example retail_accounting.html, restaurant_accounting.html) β€” the home screen for your general ledger. A parallel whole-business view lives at owner_financial_pnl_ledger.html, reading the same underlying tables.

Seven live figures, not typed-in numbers

TileWhat it showsWhere it comes from
Month RevenueSales this monthSum of 4xxx sales accounts
Month ExpensesPurchases & operating costs this monthSum of 5xxx/6xxx expense accounts
Net ProfitRevenue less expensesComputed from the two tiles above
Output VAT (2150)VAT collected on salesSum of GL account 2150
Input VAT (1200)VAT reclaimable on purchasesSum of GL account 1200
Debtors Control (1100)Total owed by trade-account customersSum of GL account 1100 β€” ties to Β§3.6
Cash & Bank (1000+1010)Till float plus bank/settlement balanceSum of GL accounts 1000 and 1010

A Mini Trial Balance card lists your top accounts by activity with a live BALANCED/UNBALANCED badge, and a Double-Entry General Ledger Audit Journal table below it lists every posted row (an honest "No postings yet" message shows until your first transaction). Both read real rows β€” there is nothing to see until you sell, buy or pay something.

The Books page re-reads the ledger automatically the moment a sale posts anywhere on this device, so you don't need to refresh the tab to see a new sale land in the totals above.

Honest note on the "Preview VAT201" buttons:

On the restaurant Books page you'll find a button labelled Authorize & Preview VAT201 Return (Demo); on 25 other sector Books pages you'll find one labelled Preview VAT201 Certificate (Demo). Both are exactly what their label says β€” a demo preview, gated behind a PIN prompt (currently the demo PIN 9999). Entering it shows a message that says outright: "Nothing was submitted to SARS. Use these figures with your practitioner or SARS eFiling." No network call is made and nothing about a filing is written to your ledger. Use the real, computed figures from Β§3.3 below and file them yourself on SARS eFiling β€” exactly as the callout there says.

Short of that button, the rest of the same card is real: a Current Period SARS VAT201 Breakdown table shows standard-rated sales, output VAT, input VAT and net VAT payable computed live from your ledger, plus a Filing Period control bar for the active bimonthly period.

Some sector Books pages carry auxiliary cards for sector-specific ledgers (for example agriculture's Diesel Refund & Silo Valuation cards). Where a card is tagged Connected Mode it needs the cloud sync that isn't built yet; where it's tagged Coming soon, take that at face value β€” both tags are the product's own honest labels, not ours.

An Export General Ledger (CSV) button also sits on this page. Until 20 August 2026 it only showed a confirmation message and produced no file; it now writes a real CSV of your actual general ledger entries through the same export engine Chapter 4 describes, and says so honestly if it cannot. For your ledger plus every other table β€” orders, customers, trial balance and a full JSON archive β€” use data_export.html (Chapter 4).

Two linked screens that are previews today, not postings

A Fixed Asset Register link on the Books page opens fixed_assets_register.html, which lists capital assets with a monthly depreciation schedule per item. It's a real screen, but its Register New Capital Asset and Post Monthly Depr[eciation] buttons currently show a confirmation message describing the journal they'd post (for example "Debited Account 6500... Credited Account 1550...") β€” no asset row is saved and no depreciation journal actually reaches your ledger yet. Treat the screen as a design preview of the coming feature, not a working asset register.

A separate Merchant Settlement Reconciliation screen at merchant_settlement_reconciliation.html is built to match your Speedpoint card-terminal batches against bank deposits. It's the same story: real layout, but the Import Daily Bank Statement button is a demo preview β€” it does not connect to FNB, Standard Bank or any bank, and the "142 transactions imported, 100% matched" message it shows is a fixed demo result, not your actual settlement data.

πŸ“¦ 3.2 Purchases, GRV Stock Receiving & Input VAT

Operating through purchases_expenses.html and hardware_grv_receiving_portal.html, store purchasing follows a disciplined supply-chain loop, all of it posting through the same accounting engine as the Books page above.

  1. Reorder Suggestions: items below their safety-stock threshold get a suggested reorder quantity: Suggested = Max(Threshold × 2 - Stock, Threshold).
  2. Purchase Order Generation: a formal PO (PO-10024 style numbering) captures supplier, line costs and quantities against that supplier.
  3. Goods Received Voucher (GRV): receiving staff confirm arrived quantities and cost. Stock increases immediately and unit cost recalculates on a weighted average: New Cost = ((Old Stock × Old Cost) + (Received Qty × New Cost)) / (Old Stock + Received Qty).
  4. General Ledger Posting: receiving a GRV posts automatically β€” debits the relevant expense account for the net-of-VAT cost (5000 Stock Purchases for ordinary stock; category-dependent for other purchase types β€” 6000 Rent, 6100 Utilities, 6200 Fuel, 6300 Wages, 1500 for capital items, 6900 for everything else), debits Input VAT (GL 1200) for the 15% VAT portion, and credits Trade Accounts Payable (GL 2100) for the total including VAT.

For purchases that aren't a stock GRV β€” rent, utilities, fuel, wages, or a one-off expense β€” Record Purchase / Expense on the Purchases & Operating Expenses page posts the same way, picking the expense account from the category you choose and warning you if input VAT is being claimed without a supplier VAT number on file.

Supplier Accounts Payable (AP) Balances and a Purchases & Expense Ledger list every supplier's outstanding balance and every posted purchase. Settle a Supplier Account posts a payment that debits the AP balance down and credits your cash or bank account.

The same page also carries shortcuts to the VAT201 figures sheet and period lock β€” those are covered fully in Β§3.3, right below, so they aren't repeated here.

πŸ›οΈ 3.3 VAT201 Periods, Settlement & Period Locking

The vat201_period.html screen aggregates all date-effective sales output tax and supplier input tax into official South African VAT cycles. Category B (the default) runs bi-monthly, ending in even months β€” e.g. Period 2026/01–2026/02 ends February, which is a valid Category B close. Categories A (odd-month bi-monthly), C (monthly, turnover > R30m), D (six-monthly farming ≤ R1.5m) and E (annual letting companies) are also configured.

If your business isn't VAT registered, the screen says so plainly β€” "Not VAT registered" β€” rather than showing fabricated figures, and links out to Tax Configuration if you need to change that.

That answer governs far more than this one screen. Your registration status is read in exactly one place, and every till on the platform posts through it. If you are not a registered VAT vendor, no till charges VAT: the full amount the customer pays is revenue, not one cent is posted to Output VAT (GL 2150) β€” there is no zero row either, so 2150 never appears in your trial balance at all β€” a discount comes off revenue with no tax carved out of it, a refund reverses exactly what the sale posted, and your slips and till screens stop showing a VAT line, because printing one would be representing a VAT charge you are not entitled to make. Register later and the answer flips for new sales only: postings already made are never rewritten, because every sale carries the status it was rung up under, so a refund long afterwards still reverses what that sale actually did. βœ“ Not a VAT vendor? No till charges VAT and nothing reaches Output VAT

Honest Operational Scope:

IntelliVision computes exact, ledger-balanced totals for Fields 1 (Standard Rated Sales), Field 4 (Zero-Rated Sales), Field 14 (Total Output Tax), Field 15 (Capital Goods Input), Field 16 (Standard Input Tax), and Field 19 (Net VAT Payable or Refundable). These figures are prepared for the merchant or tax practitioner to type directly into SARS eFiling. IntelliVision never files directly with SARS or simulates automatic approval.

The figures grid is sign-aware: a credit note reduces sales and output VAT rather than inflating them, and it's proven against a hand-worked example spanning a credit note and a year boundary β€” Nov–Dec output VAT nets to R165 after a R115 credit note, and the January sale correctly lands output tax in the following Jan–Feb period, not the one just closed.

Period Locking Mechanics

Once you've filed a period on eFiling, click Lock Period. Locking does three things:

  • Freezes every sale, purchase and expense on or before the period end against retrospective editing β€” attempting to post there afterwards is rejected, and so is a post-dated attempt to slip in before an earlier lock (no backdated holes).
  • Posts a closing journal clearing the period's Output VAT (GL 2150) and Input VAT (GL 1200) balances into VAT Control (GL 2160) β€” credited when you owe SARS, debited when you're due a refund.
  • Records the lock against the period so it can never be run twice.
βœ“ VAT201 figures computed for you, ready to file on eFiling
IntelliVision VAT201 Settlement Screen
Figure 4: VAT201 period settlement interface (vat201_period.html) displaying output vs input breakdown and period locking controls.

πŸ‘₯ 3.4 Statutory Payroll & SARS EMP201 Processing

The payroll engine at payroll.html β€” the Statutory Payroll & Tax Center β€” runs employee wages against South Africa's statutory tables and posts a balanced salary journal. Two senior-reviewed anchor figures prove the arithmetic rather than merely describing it:

  • PAYE (annualized model): Gross Annualized Remuneration → Annual Tax from Bracket → deduct age-band rebate → ÷ 12 for monthly PAYE. On R25,000/mo (under 65) that's exactly R3,483.08; on R8,000/mo it's R3.75 β€” not zero, which is the classic silent bug this table avoids (an annual rebate applied monthly would wrongly zero out PAYE below the threshold).
  • UIF: 1% employee + 1% employer, capped at the statutory monthly ceiling β€” R177.12 each side once monthly remuneration reaches R17,712.
  • Skills Development Levy (SDL): 1% employer levy, automatically exempt while your annualized payroll stays under R500,000 β€” and it switches on the month you cross it (R58,000/mo × 12 = R696k triggers R580 SDL that month).
  • Accounting Journal: debits Gross Salaries (GL 5100), debits UIF Employer Contribution (GL 5110) and SDL Statutory Expense (GL 5120) when those apply, credits SARS PAYE Withholding (GL 2200), credits UIF Payable β€” employee plus employer β€” (GL 2210), credits SARS SDL Payable (GL 2220), and credits Bank (GL 1010) for the net pay actually going out.
  • A given month can only be run once β€” trying to re-run it is refused, as is running a month outside the loaded tax table's effective date range.

The SARS EMP201 Statutory Return Summary gives you the exact PAYE, UIF and SDL totals due for the month in the CCYYMM period format eFiling expects, ready to type in. It's honest about what it can't do yet too: the Employment Tax Incentive line shows an explicit R0.00, "ETI not calculated β€” claim manually if applicable" rather than silently omitting it or guessing.

What "e@syFile Capture Summary" actually is:

It is a downloadable schedule of the SARS source codes your tax practitioner needs β€” Code 3601 (Income), 3699 (Gross Remuneration), 4102 (PAYE), 4103 (Total Tax), 4141 (UIF, employee + employer), 4142 (SDL) and 4149 (Total) β€” aggregated per employee across the March–February tax year, for capturing into SARS's own e@syFile software during your EMP501 biannual reconciliation. It is not a generated EMP501 return and it does not issue IRP5 tax certificates β€” the engine is deliberately built so that no artifact it produces is ever labelled IRP5.

βœ“ Payroll with EMP201 figures and an e@syFile-ready source-code summary

Employee Pay Configuration sets up each worker's package; Monthly Payslip Distribution lists who's due a payslip once a run completes.

🧾 3.5 Sector Compliance Packs: Diesel, Section 18A & Trust Accounts

Three specialised compliance kits sit alongside the general ledger for the sectors that need them. All three compute from a single versioned config file, and all three are honest about their own limits β€” each shows a caveat on screen, and each caveat is repeated below rather than left buried.

βœ“ Sector packs: diesel rebates, Section 18A receipts, trust accounting

Diesel Refund & Logbook Rebate (agriculture, logistics, petrol)

Log litres and their use (for example "Tractor β€” primary production") and the engine totals litres and multiplies by a configured refund rate per litre β€” currently R3.74/ℓ β€” to give a running eligible claim.

Provisional by design:

The rate is explicitly flagged provisional in its own config and the screen is required to show a note that diesel refund rates move with fuel-levy adjustments β€” verify the current rate with SARS before claiming. Only genuinely eligible use (primary production on farming land) qualifies; the logbook exists to record that use, not just the litres.

Section 18A Donor Receipts (non-profit)

nonprofit_section18a_grants.html issues real, sequentially numbered receipts (prefixed S18A-) once your organisation's SARS PBO number is on file β€” it refuses to issue one before that. Chapter 2's community-and-venue archetype covers the receipt screen's full mechanics (field validation, audit-log persistence, the printable certificate); the two things worth repeating for the bookkeeper here are that a receipt is only valid once your PBO approval is real, and that this screen does not track grant spend against a project budget β€” the project field is free text, not a monitored budget line.

Trust Accounting (professional services β€” attorneys, agents)

professional_trust_retainers.html runs a genuine per-client trust ledger: a client's balance can never go negative, and that rule is enforced before any withdrawal is written, not caught afterwards by a report β€” the write simply never happens if it would overdraw that one client, even though other clients' funds sit in the same pooled trust bank account. Interest earned on the trust account posts to a dedicated liability (GL 2310) and never counts as your income. When you transfer an earned fee out of trust, it posts as two linked journal entries sharing one reference β€” the client's trust drawdown and your business's fee income move together, never one without the other. An invariant check ties the trust bank balance (GL 1300) to the sum of what's owed to clients plus accrued interest (GL 2300 + GL 2310) to the cent, on demand.

What this is not:

The product's own configuration labels this a "demo trust ledger β€” not a compliant attorneys/estate-agents trust accounting system." There's no FICA workflow, no section 86(4) trust-account structure, and no audit report generation. Treat it as a genuine, correctly-invariant ledger mechanism you can build on, not a drop-in replacement for a regulated trust accounting package.

πŸ“‘ 3.6 Customer Accounts, Credit Limits & Debtor Statements

Trade customer credit is managed through wholesale_trade_debtors.html. Everything described in this section β€” the debtor accounts, the credit-limit guard, the aging buckets, the statements and the tie-back to GL 1100 Debtors Control β€” runs behind one on-account tender class, and since 20 August 2026 every till that offers a trade account reaches it: this back-office screen's account tools, Wholesale's "30-Day Trade Credit", Hardware's "Charge to Trade Credit" and Restaurant's "Charge to Corporate Tab" all land in the same debtors book.

The tills reach the debtors book now. Until 20 August 2026 they did not. Each till sent its own button label β€” TRADE CREDIT from Wholesale and Hardware, CORPORATE TAB from Restaurant β€” and the engine only recognised the literal word ACCOUNT, so every on-account sale fell through to the bank account. A wholesale "30-Day Trade Credit" sale of R19,450.00 debited GL 1010 Bank: money the merchant had not received, booked as though the customer had paid electronically that instant, with no debtor row, no statement line and no credit-limit check. The Restaurant till's own success message even said it had posted to Debtors Control while it was posting to Bank.
  • Tender labels are now classified rather than string-matched: the on-account family (account, on account, tab, trade credit, trade account, corporate tab, house account, credit account, N-day credit) all resolve to one class, and that class posts to GL 1100 Debtors Control. The same R19,450.00 sale now debits 1100, moves no bank or cash, and leaves the customer owing R19,450.00.
  • The fail-closed credit-limit guard runs for every on-account tender whatever the till calls it, and an on-account sale with no account selected is refused outright β€” no order, no ledger rows, no half-posting.
  • All three tills now pick a real trade account loaded from the debtors book and pass its id, so the balance, the statement and the aging all see the sale. Hardware's page-local available-credit variable, which reset to R107,850.00 on every reload, is gone.
Settlement receipts were always correct and are now reachable from real charges: a R5,000.00 receipt debits 1010 and credits 1100, recognising no revenue and no VAT a second time.
βœ“ Customer accounts, statements and aging
  • Credit Limits Enforced at the Account Engine: the account engine itself fails closed β€” a sale that would push a customer's balance over their credit limit throws before anything is written, so no order is created and the balance doesn't move, and an unknown or mistyped debtor reference is rejected the same way. This is proven directly against wholesale_trade_debtors.html's own account screen (its "Test Account Sale" control surfaces the block as an explicit "FAIL-CLOSED ENFORCEMENT" message). It is not yet uniform at every till's own checkout button β€” which sector tills actually run this check before charging a sale to an account, and which don't, is covered precisely in Chapter 1's till walkthrough; this section describes the account and its engine, not each till's checkout button.
  • FIFO Payment Allocation: a payment allocates against the oldest outstanding invoice first, then the next β€” proven against a worked example (R300 then R400 owed, a R350 receipt allocates R300 to the first invoice and R50 to the second).
  • Aging Schedules: Current / 30 / 60 / 90+ day buckets that always sum exactly to the account balance.
  • Running-Balance Statements: one-click statement generation and printing, showing invoice numbers, debits, credits and a running balance line by line.
  • Opening Accounts: a new trade account is created with a name and an optional credit limit β€” leave the limit blank for unlimited. Step-by-step account setup and charging a sale to it from the till are walked through in Chapter 1; this chapter covers what the account becomes once it exists.
  • Ties to the Books, to the cent: the total of every debtor account equals the Debtors Control balance on the Books page (GL 1100) β€” the page checks this live, not just at month-end. That tie now covers the tills too. Until 20 August 2026 it held only for sales entered through this screen's own account tools, because they were the only sales that touched GL 1100 at all β€” a trade-credit or corporate-tab sale rung on a till never entered the reconciliation, so both figures could be internally consistent and still understate what your customers owed you. Every on-account tender now posts to 1100 whichever till rang it, so the reconciliation covers the whole debtors book.
  • WhatsApp Statement Delivery: a debtor statement can be shared straight to WhatsApp, using the same real share mechanism documented under Chapter 1's receipt-sharing entry β€” it isn't a separate, unbuilt feature.

πŸ›‘οΈ 3.7 Encrypted Backups & 'Verified by Restoring' Protocol

βœ“ Encrypted backup and restore, proven by restoring (Gate G23)

Disaster recovery in system_health.html uses WebCrypto AES-GCM 256-bit encryption with PBKDF2 key derivation (150,000 iterations, 16-byte random salt, 12-byte initialization vector), wrapped in a versioned envelope format (iv-backup-1, magic bytes IVBK1).

The 'Verified by Restoring' Standard:

A backup file that has never been tested is not a reliable safety net. Before any database wipe or restore occurs, the file envelope format, decryption key, table integrity and row counts are fully decrypted and validated in memory first. If the passphrase is wrong or the file is corrupt, the restore aborts cleanly and your existing database is untouched. Restoring is deliberately made hard to trigger by accident: you must type the file's passphrase and then type the word RESTORE to confirm before anything is wiped.

System Health also shows the timestamp of your last successful backup, so you can see at a glance whether you're overdue for a fresh one.

IntelliVision System Health Screen
Figure 5: System health & encrypted backup console (system_health.html) with AES-GCM backup generator and storage diagnostics.
Chapter 4

βš™οΈ Platform Architecture & Operations

Technical specifications, multilingual capabilities, offline and Connected Mode mechanics, licensing rules, the certified hardware shop, multi-branch views, in-app help, and complete data portability.

🌍 4.1 15 Pan-African & Global Languages

IntelliVision operates natively in 15 languages, supporting local South African languages, East/West African regional commerce languages, and European trade languages:

Language Code Regions Text Direction
EnglishenSouth Africa / GlobalLeft-to-Right (LTR)
isiZuluzuSouth Africa (KwaZulu-Natal, Gauteng)Left-to-Right (LTR)
isiXhosaxhSouth Africa (Eastern Cape, Western Cape)Left-to-Right (LTR)
AfrikaansafSouth Africa / NamibiaLeft-to-Right (LTR)
SesothostSouth Africa / LesothoLeft-to-Right (LTR)
SetswanatnBotswana / South AfricaLeft-to-Right (LTR)
KiswahiliswKenya / Tanzania / East AfricaLeft-to-Right (LTR)
YorΓΉbΓ‘yoNigeria / West AfricaLeft-to-Right (LTR)
IgboigNigeriaLeft-to-Right (LTR)
HausahaNigeria / Ghana / SahelLeft-to-Right (LTR)
chiShonasnZimbabweLeft-to-Right (LTR)
FranΓ§aisfrDR Congo / Rwanda / West AfricaLeft-to-Right (LTR)
PortuguΓͺsptMozambique / AngolaLeft-to-Right (LTR)
Ψ§Ω„ΨΉΨ±Ψ¨ΩŠΨ©arUAE / North AfricaRight-to-Left (RTL)
DeutschdeNamibia / EuropeLeft-to-Right (LTR)

Switch languages at any time using the global language selector in the page header or preferences menu. Every button label and prompt on screen swaps immediately β€” the page never reloads, because the switch works by re-translating the text already on the page from a downloaded language file, not by fetching a new page.

⚑ 4.2 Offline Architecture, Load-Shedding Resilience & Connected Mode

IntelliVision is engineered as an offline-first Progressive Web Application (PWA). All application code, stylesheets, and UI assets are cached locally on your device via the Service Worker (sw.js), which downloads and versions its own cache the moment you first open the app.

All database tables β€” including products, customers, sales orders, stock batches, and general ledger entries β€” reside directly inside your browser's local IndexedDB storage. Nothing leaves your device unless you explicitly choose Connected Mode below.

PWA Installation: In Chrome, Edge, or Safari, click the Install icon in the address bar (or Add to Home Screen on mobile/tablet) to run IntelliVision as a standalone, windowed desktop or tablet application with dedicated icon and offline launch capability.

Connected Mode today: an honest, opt-in heartbeat

Connected Mode is off by default on every install. If you switch it on, IntelliVision sends a small, whitelisted check-in β€” an install ID, the app version, your business type, your referral code if you have one, today's sale and order counts, and a fixed active-till count of 1. That is the whole payload β€” no customer, staff or product data, and nothing configurable β€” and nothing is sent at all unless both the opt-in is on and a connection endpoint is configured. If your connection drops, the check-in queues locally and sends once you're back online.

Coming soon: the full Connected Mode β€” automated cloud backup sync, live multi-location mesh, and third-party integrations

πŸ”„ 4.3 Updates, Changelog & System Diagnostics

When a new version is released, the Service Worker downloads updated assets in the background. On your next session, IntelliVision upgrades transparently without interrupting ongoing till shifts.

Review the latest platform enhancements by visiting system_health.html and opening the What's New / Release Notes viewer (sourced directly from release_notes.json).

πŸ”‘ 4.4 Modular Licensing, 14-Day Trial & Offline Unlock Codes

IntelliVision operates on an honest, transparent licensing model enforced by owner_modules_hub.html:

  • Free Forever Till Tier: Single-till POS operations, product catalog, barcode scanning, and basic setup wizard are completely free forever without time limits β€” the free tier is always unlocked, on every install.
  • 14-Day Full Feature Trial: Fresh installations start an automatic 14-day trial the moment you first open the app, silently, with no card or signup required, giving unrestricted access to Business dashboards, cash management, and Compliance+ accounting modules.
  • Trial Countdown: A days-remaining banner appears on virtually every screen while your trial is running β€” everywhere except the manual, the data export tool, and the shop itself β€” and the Modules Hub carries its own large countdown display.
  • Fail-Closed, Never Silent: If a trial ends before you unlock a paid tier, the gated page doesn't quietly break β€” it shows an honest upgrade screen explaining what ended, an unlock-code box, and links back to the free till, the Modules Hub, and pricing.
  • Subscription Tiers & Status: The Modules Hub renders your current tier, trial state, and every gated module's required tier live from the licensing manifest β€” nothing hardcoded.
  • Gated Module Directory: A full table of every module and which page patterns it covers, with its required tier and your current status against it β€” filterable by tier (All / Free / Business / Compliance+) and searchable by name or route (module search box).
  • Which Tier Does This Page Need? Every page in the platform is matched against the module list by its filename, so the gate always knows the right tier to ask for before it lets you in.
  • Offline Unlock Codes: To unlock premium modules on air-gapped or offline devices, enter your key in the format IV-<tier>-<expiryYYYYMM>-<check> (e.g. IV-compliance-202612-a1b2c3d4) on the Modules Hub or directly on the upgrade screen. Keys validate offline using a SHA-256 signature β€” the free tier never needs one.
Honest Licensing Policy:

Unlock codes today are an offline-friendly stopgap β€” validated locally, not phoned home. They deter casual bypass; they are not a full licensing service. Real online license sync and automatic renewals arrive with Connected Mode.

Tier pricing is being finalized ahead of launch β€” see pricing.html for current figures rather than this manual, so you always see the same number in one place.

πŸ›’ 4.5 The IntelliVision Hardware Shop

Certified thermal printers, Bluetooth barcode scanners, certified scale kits, and IVOPS Vision camera kits can be ordered straight from shop.html β€” hardware chosen to work with the till out of the box, not a generic marketplace listing.

Checkout today is EFT-only: build your order, capture your delivery details, and submit β€” the shop hands you a payment reference to settle by instant EFT rather than taking a card on the page. Your order history stays on the shop for this install so you can find a past payment reference again.

Coming soon: automated camera loss-prevention analysis powered by IVOPS Vision

The AI detection previews shown on today's vision screens return fixed example results for evaluation, not a live read of your camera β€” real analysis is never faked in the browser, it happens on the kit or not at all.

🏬 4.6 Multi-Branch Views & Consolidated Reporting

Once you open a second location, IntelliVision gives you both a per-branch view and a consolidated group view β€” real figures, not a mock-up.

This is deepest today on the retail till family: live consolidated group revenue, basket counts and average basket value, a per-branch breakdown, tools to add or rename a branch, and a fast switcher for which branch you're currently stamping sales against. Most other sectors' branch screens are still marked in the product itself as a design preview of what's coming, and the depth varies sector to sector. The full, sector-by-sector picture is in this manual's back-office chapter.

❓ 4.7 Contextual In-App Help & Role Guides

The contextual help drawer (powered by universal_help.js) appears on all 365 of the platform's pages β€” every till, dashboard, admin, setup and shop screen, with no exception. Clicking the floating ? button in the bottom-right corner lists the functions that actually exist on the screen you are standing on, filtered to your signed-in role, and offers a direct link into the section of this manual that covers that screen.

For staff role guidelines, open role_guides_knowledge_base.html to review daily checklists for the Cashier & Till Operator, Waiter & Service Staff, Workshop Mechanic & Tech, Responsible Pharmacist, Weighbridge Operator, and General Manager & Owner roles.

πŸ’Ύ 4.8 Complete Data Portability ('Leave Anytime')

You own your business data. data_export.html lets you export your complete database at any time with zero vendor lock-in β€” the export/re-import round trip is tested by the IntelliVision team on their own data before every release, not just claimed.

A Refresh Row Counts button on the page shows exactly how many rows of each kind (products, orders, customers, ledger entries) are waiting to export before you commit to a download.
Export Format Target Systems Header Columns
Product CSV β€” Square Square Token, Item Name, Variation Name, SKU, Description, Category, Price, Quantity
Product CSV β€” Loyverse Loyverse Handle, SKU, Name, Category, Price, Cost, Barcode, In stock
Product CSV β€” Yoco Yoco Name, SKU, Price, Cost, Quantity
Product CSV β€” Generic Excel, Shopify, most POS imports SKU, Name, Category, Price, Cost, Stock, Barcode
Orders & Sales CSV Excel, Google Sheets, Power BI order_number, date, total, payment_method, status (legacy-import history rows are flagged)
Trade Debtors CSV Accounting packages, CRM Name, Email, Phone, Balance
General Ledger CSV Xero, Sage, QuickBooks, Pastel date, account_code, side, amount, description
Trial Balance CSV Your accountant or tax practitioner account_code, debits, credits, net
Full Portability JSON Archive (iv-export-1) Another IntelliVision install, or a recovery drill Every store and every application preference, unencrypted, in one file
Restoring from an archive:

Pick a saved iv-export-1 file and type RESTORE to confirm β€” this is a destructive action, so it asks you to mean it. The file's format and integrity are checked before a single row is wiped; a bad or unreadable file is rejected up front rather than leaving you with a half-replaced database.

This full JSON archive is an open data-portability export, not the encrypted backup described in the Money & Compliance chapter β€” use this one to migrate or duplicate an install; use the encrypted backup to protect against data loss on the same install.

Chapter 5

🏒 Back Office: Dashboards, Staff & Branches

Everything an owner or manager uses to watch the business, manage the team, and run more than one location. Access to every screen in this chapter is decided the same way as the rest of the platform: by the filename IntelliVision is loading, not by hiding individual buttons. Your session role β€” owner, manager, cashier or staff β€” carries a fixed set of capabilities (manage, sell, view), and each page requires one of those three before it will render. Chapter 1 covers the general rule; this chapter tells you exactly which capability each back-office screen below requires β€” including two cases where the rule is more permissive than you might expect.

πŸ“Š 5.1 Executive Dashboards

Unlike Setup, Accounting or Branches, a dashboard filename doesn't match the platform's manage-only pattern, so it requires only the view capability β€” and every role holds view. In practice that means a cashier or general staff login can open the dashboard and see the same turnover, order count and stock alerts as the owner. If you want the day's numbers kept to management only, that's a conversation about which login you hand to the till, not a setting on this screen.

Today's numbers: real, not decoration

The eight tiles at the top of every *_dashboard.html page are computed, not typed in. They read straight from the same local order, payment and stock tables your till writes to β€” nothing here is a placeholder.

TileWhat it showsWhere the number comes from
Today's Sales Till turnover so far today Sum of every order's total placed today
Today's Transactions Basket count so far today Count of today's orders; shows an explicit "No sales yet" note at zero rather than a bare 0
No-sales note Replaces the transaction count when nothing has sold today Swaps automatically once the first order lands
7-Day Sales Rolling 7-day turnover Sum of every order placed in the last 7 days
Top Selling Product Highest-volume item Line items grouped by name, ranked by quantity sold
Payment Split (Cash) Cash drawer intake Sum of payments recorded with a cash method
Payment Split (Card / EFT) Everything not cash Sum of the remaining payment methods
Inventory Low Stock Alert Count of SKUs below 5 units Live count against your stock table

Leave the dashboard open in one browser tab and ring up a sale in another: the tiles above update within a second, without a manual refresh. A local BroadcastChannel message fires every time a sale posts, and the dashboard recomputes the moment it hears one.

The dashboard header is also a jump bar: it links straight to the Industry Hub, the POS counter, the Setup Wizard, the SARS VAT ledger, Staff & Roles, and the API Vault, so you never have to go back to a menu to move between them.

IntelliVision butchery management dashboard
Figure 6: A live management dashboard (butchery_dashboard.html) rendering turnover, margin and stock-velocity tiles computed from real database rows.

Mistake Recovery: a real, durable record β€” but not a ledger correction

Mistake Recovery button:

The πŸ›‘οΈ Mistake Recovery button on every dashboard opens a real modal asking for a supervisor PIN, a reason code and notes. Pressing Record adjustment writes a durable row into this device's audit log β€” it survives a reload, and it carries a real SHA-256 computed over the record itself, so the entry can be checked later rather than merely trusted. Two honest limits, both now stated on the modal itself: the PIN is recorded, not verified (this product has no supervisor-PIN store, so any non-empty PIN is accepted and simply written down as the person claiming authorisation), and no general ledger journal is posted. Until 20 August 2026 the confirmation claimed one was. To actually reverse money, use the till's refund / return control or post the correction in Books; use this form to record who decided what, and why.

Camera and sensor tiles: preview only

These buttons respond, but nothing is connected yet:

Three controls on the dashboard show a confirmation message when pressed but do not talk to any real hardware or sensor feed today:

  • ⚑ Poll IoT Telemetry β€” confirms a poll was dispatched; there is no connected sensor to poll.
  • ⚑ Manage & Calibrate Stream β€” appears on the Shoplifting AI Turnstile, ESL Dynamic Sync, and Till Turnover Variance widgets; each confirms a command was sent to a stream that isn't actually connected.
  • βš™οΈ Calibrate YOLOv9 β€” confirms the camera model was calibrated; no camera model runs against this page.

Playback & replay: the navigation is real

πŸ“Ό Open Playback & Replay Console and each camera tile's Replay Clip link are genuine navigation, not alerts β€” both take you to video_playback_investigation.html. What that console can actually play back is covered in the Vision & Cameras chapter.

πŸ§‘β€πŸ€β€πŸ§‘ 5.2 Staff, Roles & Clock-In

Like the dashboard, a *_staff.html filename doesn't match the platform's manage-only pattern, so it opens for every signed-in role, including staff itself β€” worth knowing before you hand out logins, since these pages can show role PINs (see below).

Role & PIN simulator β€” a design preview, by the product's own label:

Nineteen of the sector Staff & Roles pages (agriculture, automotive, construction, ecommerce, education, events, fitness, freelancer, healthcare, logistics, manufacturing, nonprofit, professional, property, rentals, repair, salon, trades, wholesale) open on a role simulator that carries this banner at the top of the page: "this screen is a concept render, not a working tool yet." Inside it:

  • Role tabs switch between three sample roles for the sector (e.g. Farm Owner / GM, Field Agronomist, Livestock Manager) and redraw the card below.
  • Granted / Restricted screen lists redraw with the tab, but the lists are fixed per sample role in the page's own script, not read from your actual team or setup.
  • PASSCODE / PIN display shows a fixed four-digit demo value per sample role (not a PIN anyone can actually sign in with).
  • Test Manager Override shows a confirmation message naming the sample PIN; it does not check a PIN or unlock anything.
  • Clock In With Biometrics on this page shows a confirmation with a fake GPS stamp and records nothing β€” the real version of this control is below.

Sectors outside that list (retail included) show a static screenshot of the same design instead of a working simulator.

The real clock-in terminal: staff_biometric_facial_clockin.html

This is a separate page from the sector simulator above, and it is honest about exactly which half of it works: its own banner reads "Facial matching on this screen is a design preview. The PIN clock-in below is real." The flow:

  • A staff member is asked for POPIA consent before any camera capture UI exists on the page at all β€” not merely hidden, genuinely absent until consent is granted.
  • Consenting writes a timestamped, audited consent record and only then reveals the capture screen.
  • Withdrawing consent writes its own audited record and removes the capture screen again.
  • PIN clock-in works today: a 4-digit PIN writes a real, audited clock-in record your payroll can trust β€” this is the fallback offered at every step, and the one the page itself calls real.
  • Facial clock-in shows a fixed "99.8% match" and is labelled a simulation on the button itself; treat it as a preview of the camera-kit feature described later in this manual, not a working face check today.

Proven end-to-end β€” consent gating, withdrawal, and the PIN fallback all writing real audit rows β€” by the platform's automated test suite. No menu currently links to this page; open it directly at staff_biometric_facial_clockin.html until that's wired up.

Every Staff & Roles page, simulator or screenshot alike, points you to where the real work happens: Team & Logins to add sign-ins and set passwords, Staff Roles for the working roles-and-daily-tasks reference, and Payroll for salaries (Chapter 3, Β§3.4).

🏬 5.3 Branches & Multi-Location

Branch screens require the manage capability, so only owner and manager logins can open them. A cashier or staff login that tries is shown a full-page Access Restricted message with a Sign-out button β€” the page fails closed rather than showing anything underneath.

One more fact worth stating plainly before the rest of this section: only Retail has a fully working multi-branch console today. Every other sector's Branches page is a preview.

The real console: retail_multibranch.html

retail_multibranch.html is a genuine multi-location console: every branch record, every figure on it, and the isolation between branches are backed by real local data, not sample numbers.

ControlWhat it does
Store Locations grid Lists every registered branch with today's live revenue and basket count
Group Revenue Today Consolidated turnover across every branch, computed fresh each load
Total Baskets Served Consolidated order count across every branch
Average Basket Group revenue divided by group orders
Stores Configured The branch count, shown twice β€” "Stores Configured" in the summary card and "Total Branches Registered" above the grid β€” both reading the same live count
Per-branch card Each branch's own revenue and basket count, isolated from every other branch's sales
πŸ”„ Refresh Metrics Recomputes every figure on the page on demand
Live auto-refresh The whole view recomputes itself within a second of any branch posting a sale, over the same local BroadcastChannel used by the dashboard

Adding, renaming and switching branches

retail_multibranch.html

Add a branch

+ Add New Branch opens a small dialog asking only for a store name.

Create Branch assigns the next sequential branch identifier (e.g. BRANCH-02) automatically and gives the new branch its own fully isolated sales and stock ledger β€” nothing about it shares numbers with any other branch until you post a sale there.

retail_multibranch.html

Rename a branch

The pencil icon on any branch card opens a dialog pre-filled with that branch's current name.

Save Changes updates the branch's display name in place; its identifier, its sales history and its stock stay exactly as they were.

retail_multibranch.html

Switch which branch you're stamping

Switch to Branch on any non-active card β€” or the Fast Branch Switcher dropdown at the top of the page β€” makes that branch the active one. Every POS sale and stock entry from that point stamps the newly active branch until you switch again.

Multi-branch previews outside Retail

Even on the real console, cross-site sync over the internet is future work, correctly labelled on the page itself: Coming soon: cross-site branch sync over the internet. Today's consolidated totals work because every branch's data lives in the same local database on the same device β€” that's genuine, just not yet spread across separate shops on separate networks.

Every other sector's Branches page is a design preview.

Three different preview patterns exist, each labelled by the product's own banner and pointing back to retail_multibranch.html as "the working branch tools":

  • Seven sectors (automotive, events, freelancer, nonprofit, professional, rentals, repair) show three sample branch cards with live-looking status text. πŸ“¦ Create Inter-Branch Transfer shows a confirmation message and creates nothing. View Branch Dashboard on each card is real navigation, but all three cards currently open the same sector dashboard rather than a dashboard scoped to that specific branch.
  • Restaurant has its own bespoke preview with a 5-outlet switcher and a stock transfer queue. APPROVE on a pending transfer shows a confirmation message and approves nothing. TRACK GPS on an in-transit transfer has no action behind it at all β€” clicking it does nothing.
  • Salon has its own bespoke preview of a 5-salon chain checkout screen. COMPLETE SALON CHECKOUT shows a confirmation message; no sale is recorded.
  • Seventeen sectors (agriculture, butchery, carwash, construction, ecommerce, education, fitness, funeral, hardware, healthcare, liquor, logistics, manufacturing, petrol, property, trades, wholesale) show a single static screenshot with no interactive controls at all. The banner's own link to Branches (per-branch and consolidated figures) is the only working thing on the page.

πŸ‘‘ 5.4 The Platform Admin Console

super_admin_dashboard.html is IntelliVision's own console for overseeing every merchant tenant on the platform β€” support tickets, tenant fleet totals, and infrastructure status. It is not a tool for running your own business, and nothing in the rest of this manual depends on it. Like every other admin-pattern screen, it requires the manage capability to open.

ControlWhat actually happens
⚑ Live Pulse Refresh Re-reads the tenant and metrics data from the local platform database β€” a genuine refresh, with a confirmation message on top
Tab bar (Merchants Fleet / Support / Infrastructure / Tax & Currency) Switches which panel is visible β€” works as shown
+ Simulate Incoming Ticket Adds one fixed sample ticket to the on-screen list only, exactly as its own label says β€” not written to the platform's real ticket store
πŸ” Inspect Tenant Shows a confirmation naming the merchant, then opens retail_dashboard.html β€” the same page every time, regardless of which merchant you picked, not that merchant's own data
βœ“ Mark Resolved Writes the resolution to the platform's real ticket store β€” this one is genuine
Chapter 6

πŸ“Ή Vision & Cameras

Several screens use the word "camera." This chapter tells you exactly which are real, with nothing hidden: the supermarket Vision Control Room (6.1) and IVOPS Vision camera kit pairing (6.2) are built and gate-proven. The Control Room records real local motion evidence, accepts real Edge Node events, matches evidence to actual receipts, records investigation outcomes and exports an incident register. The Camera AI Workbench (6.3) uses the same real motion engine in a tuning lab. The remaining 27 sector "Vision AI" showcase pages (6.4), the Camera & IoT Manager (6.5) and the Playback & Investigation console (6.6) remain design previews.

πŸŽ₯ 6.1 Vision Live β€” the till's own camera

vision_live.html turns the device your till already runs on β€” tablet, laptop or USB webcam β€” into a real motion watcher. It uses getUserMedia to read the device's own camera (browsers cannot speak RTSP, so IP cameras are the kit's job, not this page's) and a genuine frame-difference engine to detect movement. No object recognition runs here β€” the page does not pretend a tablet camera can identify people or items, only that something changed in the frame.

POPIA, plainly: starting the camera means you are recording people. Put up visible camera signage, use the footage only for security, and know that every event and snapshot stays in this device's database β€” nothing uploads anywhere. The camera never arms itself; a human has to press Start.
Start / Stop

Start watching / Stop

vision_live.html

Start watching is fail-closed by design: the camera never streams before you click it, and the status pill says so ("off β€” the camera never starts by itself") until you do. Once running, motion events record while the settings below allow it. Stop releases the camera stream immediately and stops recording β€” no lingering background capture.

Settings

Keep evidence (days): how long a motion event and its snapshot stay before automatic deletion. Whatever you set, storage is also hard-capped at 200 events, so snapshots can never fill the device even if you forget to touch this setting.

Sensitivity (min % change): the minimum share of the frame that has to change before it counts as an event β€” turn it down to catch smaller movements, up to ignore shadows and flicker. A cooldown field (seconds) sits alongside it so one continuous disturbance logs as one event, not a flood.

Armed from / Armed to: the hours the camera is allowed to record β€” leave both blank to stay armed whenever you're watching. The window safely wraps past midnight (e.g. 22:00 to 06:00). Outside armed hours the live picture keeps showing on screen, but nothing is recorded or saved.

Save writes all of the above to this device immediately β€” there is no separate "apply" step.

Events

Every recorded event shows its snapshot, time, severity, review status and whether a sale happened inside the configured 30–300 second window. Select Review evidence to verify its SHA-256 integrity seal, link or remove an actual receipt, record the investigation status and outcome, add a note, download its snapshot or delete that single event. Resolving an event requires an outcome. Export register downloads the complete incident register as CSV; spreadsheet formulas in notes are neutralised before export. Kit events (6.2) appear in the same queue with the camera's name and the Edge Node's own event type and confidence.

Delete all evidence clears every stored event and snapshot on this device at once. There is no undo.

Who can touch this:

Starting the camera, changing settings, pairing or unlinking the kit, linking receipts, reviewing outcomes and deleting evidence are owner/manager-only. A cashier sees "owner or manager access required" and cannot arm a camera or alter an investigation.

πŸ“‘ 6.2 The IVOPS Vision camera kit

The IVOPS Vision kit (dedicated cameras plus an Edge Node, sold from the hardware shop) is where the heavier seeing happens β€” person detection, tracking, night IR. Pair it once on vision_live.html and its events join the same evidence timeline as the till's own camera, with the same sale-context and NO-SALE honesty, the same retention and the same 200-event cap. The till talks straight to the Edge Node over your shop network; footage and events never route through IntelliVision's own servers.

If the customer already owns ONVIF/RTSP cameras or a DVR/NVR, install the IntelliVision Camera Bridge for Windows instead of replacing the system. The bridge discovers ONVIF devices, accepts direct RTSP streams, adds multiple recorder channels, encrypts camera passwords for the signed-in Windows user, starts with Windows and refuses to mark a source online until Test picture receives a real frame. Standard cameras contribute real MOTION evidence only; they are never relabelled as person/object AI.

Pair

Camera Bridge / Edge Node address + pairing code

vision_live.html

Enter the local Camera Bridge or Edge Node address (e.g. http://192.168.1.50:8090) and the pairing code shown by that app/device. Pairing is fail-closed: a wrong code stores nothing at all and the pill reads "the kit refused this pairing token" β€” nothing is saved locally until the bridge itself accepts. A successful pair shows the site name, the agent's version, and every camera's real online/offline state (an offline camera says so, plainly, rather than being hidden).

The Windows bridge executable and this till-side link share the published pairing contract and are gate-proven together. Every physical camera/recorder model still needs Test picture during commissioning; advanced detection accuracy belongs to the certified hardware product itself.

Once paired, the kit is polled automatically (about every five seconds) and each new event is ingested exactly once β€” a re-sent event from the kit is silently ignored rather than duplicated. A motion event lands tagged kit:<camera name>; a person detection lands at HIGH severity carrying the kit's own confidence score. If the kit goes offline, the till keeps selling regardless β€” pairing status just shows "unreachable right now" and quietly keeps retrying.

πŸ”¬ 6.3 Camera AI Workbench β€” tuning the same real engine

camera_ai_workbench.html is a separate page from Vision Live: a lab for testing and tuning the same on-device motion engine, not a second place to watch your counter. Its own banner states the scope plainly β€” "Basic frame-difference motion detection runs client-side in your browser. Heavy neural models (person tracking, object recognition) run dedicated on the IVOPS Vision camera kit + Edge Node."

Video input source

Enable Webcam requests your device's real camera and analyzes actual frames for genuine pixel-level change.

Run Synthetic Demo feeds the same real engine a generated moving square instead of a camera, so you can see genuine motion detection working with no camera attached. It also runs automatically if webcam access is denied or unavailable.

Stop Video Stream releases the camera (if one was active) and halts analysis.

An Engine Capabilities box states, honestly, what's running: Motion Detection β€” Active (client CV); Object Recognition β€” Camera Kit Only; Model Identifier β€” frame-diff-motion-v1. That is a direct read of the engine's own honesty function, not marketing copy.

Motion parameters & log

Pixel Difference Threshold and Sampling Rate sliders tune the live engine while it runs β€” raise the threshold to ignore small lighting shifts, lower the sampling interval to check frames more often.

Clear Log empties the on-screen motion event list for this session.

πŸ’Ύ Record persists a real detected motion event with model frame-diff-motion-v1. Operator note: this saves to the general audit log, a different table from Vision Live's evidence timeline (6.1) β€” events you record here will not appear in Vision Live's Events list, and vice versa. They are two views onto the same engine, not one shared feed.

πŸ§ͺ 6.4 The remaining sector "Vision AI" pages β€” concept previews

Honest Operational Scope:

Supermarket/retail is the exception: retail_vision_ai.html now opens the working Control Room. The other 27 sector showcase pages carry an on-page design-preview banner. Their model panels and sample detections are concepts and do not read a camera unless a page explicitly reports a real paired Edge Node.

Coming soon: Automated camera loss prevention powered by IVOPS Vision

The remaining 27 pages are not all the same page

Twenty-two of the remaining twenty-seven are built on one shared interactive template β€” the one described in detail below. The remaining five (butchery_vision_ai.html, carwash_vision_ai.html, funeral_vision_ai.html, liquor_vision_ai.html, petrol_vision_ai.html) are much smaller pages with none of that template's controls β€” no IP field, no Grab Snapshot, no toolset tabs, no Simulate Event β€” and they never load the detection engine. What they do carry is a real one: a live panel wired to your actual camera-kit pairing, described next.

These five used to claim a live camera feed. They now report your real one. Until 20 August 2026 each of the five printed a fixed line claiming a connection to an ONVIF RTSP stream at a hard-coded address, above a green badge asserting an active inference stream at 12 ms. None of it was real: a web browser cannot open an RTSP stream at all, and both the address and the latency were static text typed into the page. Each of the five now shows the only live source this product actually has β€” your camera kit pairing, read from the kit itself. With nothing paired the panel says "No camera paired", states plainly that nothing on the screen is reading a camera, and offers one tap through to Vision Live to pair one. With a kit paired it shows that Edge Node's own answer β€” site name, agent version, and every camera by name with the offline ones saying offline β€” and only then does it report anything as live. The sector model named at the top of each page is labelled a concept that is not built, and the detection list below the panel is labelled planned, not running.

The engine behind the 22 template pages

Each of those 23 pages asks the engine for "the model for my industry." Only 8 industries actually have one defined β€” retail, restaurant, hardware, hospitality, automotive, healthcare, logistics and agriculture. Every other industry silently receives the retail model instead; there is no error and no indication on screen that a substitution happened. (The five static pages above ask nothing β€” their model names are hand-typed headings, not registry lookups.)

"Running inference" always returns the same fixed example detections for that industry's model, regardless of what the camera sees β€” the function accepts a frame as its argument and never reads it. Nothing about the picture on screen changes what comes back.

The "toolset" tabs you can click browse this same fixed registry β€” each industry's three named tools (for example retail's overhead pass-around scanner, turnstile loss tagger and shelf-label verifier) are description text pulled from the registry, not independently working detectors.

On a remaining shared-template page (restaurant_vision_ai.html is representative)

IP camera address field + Connect: typing an address and clicking Connect shows a scripted "Handshake Established" pop-up. No network connection to any camera is actually attempted.

Grab Snapshot shows a scripted "Snapshot Captured" pop-up; no image is captured or stored anywhere.

Switching toolset tabs changes which tab is highlighted, but redraws the identical bounding-box graphic underneath either way β€” the on-screen overlay does not actually change per tool.

The bounding-box overlay drawn on the video canvas is painted at fixed coordinates every second β€” it is not tracking anything in a video feed, because there is no live feed underneath it.

One genuinely live detail on the page: the on-screen clock in the corner does tick with the real current time, once a second.

+ Simulate Event manufactures a new incident row in the alert feed on demand β€” it is explicitly a simulate button, not a detection.

Alert Floor Supervisor (WhatsApp Push) shows a scripted confirmation pop-up. No WhatsApp message is sent from this page.

Replay on an incident, and "Open Full Investigation & MP4 Export", both link to the Playback & Investigation console β€” which is itself a concept preview (see 6.6). Following the link does not open real footage.

The useful control on each remaining preview page is its link to the working Vision Control Room. It opens the real local evidence and Edge Node workflow.

βš™οΈ Camera Setup in the page navigation opens the Camera & IoT Manager (6.5) β€” also a concept preview.

πŸ“Ό Playback Replay in the page navigation opens the Playback & Investigation console (6.6) β€” also a concept preview.

βš™οΈ 6.5 Camera & IoT Manager β€” concept preview

Honest Operational Scope:

camera_manager.html is a mockup of a future multi-camera provisioning console β€” assign a camera to a purpose (sweethearting loss, ALPR gate, plating AI, vault biometrics), point it at an IP address, and deploy. Every control below produces a scripted confirmation only; no camera is actually added, discovered or configured on your network. Unlike the sector Vision AI pages (6.4), this page carries no on-screen preview banner warning you of that β€” treat every button here as a preview until this note.

ControlWhat actually happens when you click it
+ Add New Camera / Device Opens a form (name, location, AI purpose, IP, port, confidence slider). Submitting it shows a scripted "Successfully Provisioned" pop-up; nothing is saved.
πŸ” Scan LAN (ONVIF Auto-Discover) Shows a scripted pop-up naming two fixed, hardcoded IP addresses as "discovered." No network scan of your LAN is performed.
Provisioned camera list Four camera cards are hardcoded into the page (till overhead, yard ALPR gate, kitchen plating, pharmacy vault) β€” they are examples, not devices you own.
βš™οΈ Edit (on a camera card) Opens the same form pre-filled with that card's example values. Saving shows the same scripted confirmation as Add.
Operational Purpose & AI Model dropdown Lets you pick from 12 named purposes (e.g. sweethearting loss, ALPR gate, weighbridge). Selecting one only changes what the confirmation pop-up will say β€” it does not connect a real model.
πŸ’Ύ Save & Deploy Camera AI Closes the form and shows a scripted "Successfully Provisioned" pop-up quoting the location, purpose and stream address you typed back at you. Nothing is deployed.

A naming quirk worth knowing: "Camera Setup" and "Camera Manager" links elsewhere in the product (including on the sector Vision AI pages) actually open device_camera_setup.html, not this page's own address β€” but they are the same page in every way that matters; the two files differ by a single blank line. Whichever address you land on, you're looking at the same concept preview.

To actually add your camera hardware today, use the IVOPS Vision kit pairing on Vision Live (6.2) β€” that is the real, working path, not this console.

πŸ“Ό 6.6 Playback & Investigation β€” concept preview

Honest Operational Scope:

video_playback_investigation.html renders a synchronized 4-camera review console with a scrubbable incident timeline and a receipt-sync panel. None of it is connected to a real camera, a real recording, or your real sales β€” it is a fully scripted demonstration of a console that has not been built. It carries no on-screen preview banner either, so treat every control below as a preview.

ControlWhat actually happens when you click it
1x1 / 2x2 Quad / 3x3 Grid Shows a scripted "Switched to N-camera layout mode" pop-up; the four camera panels are fixed, hardcoded text and icons regardless of layout chosen.
⏸️ Pause / ▢️ Play Toggles a label and stops/starts a decorative playhead animation that advances on a fixed timer β€” no real video exists to play or pause.
βͺ -10s / +10s ⏩ Nudges the same decorative playhead a fixed visual distance along the timeline bar.
Click anywhere on the timeline Jumps the decorative playhead to that position. There is no underlying video to seek.
A colored event marker, or a receipt line Shows a scripted "Jumped to [description]" pop-up. The four event markers and five receipt lines are hardcoded example data, not your actual sales or footage.
🧾 POS Receipt Sync panel A fixed example receipt (#INV-889410) with five hardcoded line items β€” it does not look up any real receipt, even though it carries a search box.
πŸ“Œ Bookmark Incident & Notify Store Owner Shows a scripted confirmation. No bookmark is saved and no message is sent to anyone.
πŸ“₯ Export Court MP4 Clip needs a stronger warning than the table above:

This control used to show a pop-up claiming a "Court-Admissible Evidence Video Clip" had been generated, naming an invented SHA-256 hash and telling you the file had downloaded successfully. Nothing was ever hashed, cut or written. Since 20 August 2026 the button is labelled Court clip export β€” not built and says so when pressed: the four camera panels on this console are still images, so there is no recording here to cut and nothing to hand to a court. The camera evidence this product really keeps is Vision Live's snapshot timeline (6.1), and the pop-up now points you there.

Naming quirk: every "Playback Replay" link elsewhere in the product opens video_playback_investigation.html, not playback.html β€” but the two files are byte-identical, so there is nothing functionally different to find on either address.

πŸ“‹ Vision & Cameras at a glance

ScreenStatus
Supermarket Vision Control RoomReal. Owner/manager-gated motion evidence, sale matching, SHA-256 integrity checks, investigation outcomes and incident-register export.
IVOPS Vision camera kit pairingReal. Fail-closed pairing, exactly-once event ingestion, gate-proven.
Camera AI WorkbenchReal. Same detection engine as Vision Live, in a tuning/testing lab; saves to a separate log.
Remaining 27 sector "Vision AI" pagesConcept previews, self-labelled. Retail now redirects to the real supermarket Vision Control Room.
Camera & IoT Manager / device_camera_setup.htmlConcept preview, not self-labelled. Every control is a scripted pop-up.
Playback & Investigation / video_playback_investigation.htmlConcept preview, not self-labelled. Every control is a scripted pop-up; export claims are fabricated.
Chapter 7

πŸ›’ Hardware Shop, Auto-Replenishment & Integrations

Five screens in this chapter promise commerce and integrations. Two are real and working: the hardware shop you actually check out from, and the tax/currency cockpit behind every till's price. One is a genuine mix β€” real sales figures sitting directly above a fabricated customer fleet, in the same console. The other two β€” auto-replenishment and the API integrations hub β€” show confident buttons that produce a success message and nothing else. This chapter says exactly which is which, screen by screen, before you rely on any of them.

ScreenWhat it's forWho can open itStatus
shop.htmlOrder certified hardware, EFT onlyAnyone with the link β€” public storefront, no sign-in by designReal, gate-certified (G27 + G52)
auto_replenishment_inventory.htmlLow-stock alerts & supplier purchase ordersAny signed-in role, including staffPreview β€” every button is a fixed alert
api_integrations_hub.html"Test" the platform's 8 API clustersAny signed-in role, including staffPreview β€” every test shows fixed sample data
super_admin_dashboard.htmlMulti-tenant fleet, support desk, infrastructureOwner / Manager onlyMixed β€” see 7.4
admin_tax_currency_manager.html15-country tax regime & pricing cockpitOwner / Manager onlyReal, working

πŸ›’ 7.1 Ordering Certified Hardware (shop.html)

βœ“ Certified hardware shop, EFT-only (Gate G27)

shop.html lists a gate-certified hardware catalogue β€” printers, a cash drawer, a barcode scanner, a scale, an IVOPS Vision camera kit, and two starter bundles. The page tries to load the live list from shop_catalog.json first and falls back to a bundled default list if that request fails, so the catalogue still renders offline. Every price is marked Draft Pricing / Launch Pricing (Draft) in the catalogue data itself β€” check the shop for the current number rather than this manual, so you only ever see one price.

The one catalogue line to read carefully:

The scale kit's own listing describes it as sending "live weights into per-kg lines." That's true of the physical scale as hardware β€” it is not true of what happens after you plug it in today. universal_hardware_bridge.js:223 reads the scale's serial port and dispatches a scaleWeightUpdate browser event, but nothing in the product listens for that event β€” a search of every HTML and JS file in the platform turns up the one dispatch and zero matching listeners, on any till, including the two weigh-sector tills that load the bridge. Buying the scale here gets you certified hardware; it does not yet get you a weight in your cart. Treat that part of the wiring as not built, not "coming soon" with a date.

Step 1

Build your order

shop.html

Click Add to Cart on any catalogue item to add one unit; adding the same item again increases its quantity instead of creating a duplicate line.

In the cart panel, the + / βˆ’ buttons raise or lower a line's quantity one unit at a time; taking a line to zero removes it.

The Γ— button removes a line outright, regardless of its quantity.

Clear at the top of the cart empties the whole order in one click β€” there is no confirmation prompt, so use it deliberately.

The cart itself lives only in this browser tab's memory while you shop β€” nothing is saved until you submit the order in Step 2, so reloading the page before then loses it.

Step 2

Buyer details & submit

shop.html

Fill in the business/buyer name, phone, email and courier delivery address β€” all four are required before the form will submit.

If you arrived via a sales agent's link (a ?ref= or ?agent= URL parameter, or a code this browser saved from an earlier visit), the Sales Agent Referral Code field and an "Active Referral Attribution" banner fill in automatically. The banner names a hardware-margin percentage attributed to that agent, read from commission_config.json β€” the file itself marks this as a draft structure, not a finalized commission policy.

Submit Order (EFT Direct) creates a real order record on this device: a sequential reference in the form IVSHOP-000001, status AWAITING_EFT, saved to this browser's local storage. There is no card capture anywhere in this flow β€” payment is EFT only, by design, platform-wide. Nothing here confirms the money has actually arrived: the status doesn't change itself, so the shop and the buyer both still have to follow up on the bank transfer directly.

After

Confirmation, printing & history

shop.html

Print EFT Invoice on the confirmation screen opens your browser's own print dialog on that confirmation β€” it's a page printout, not a thermal receipt, and it does not call the ESC/POS hardware bridge.

My Orders in the header lists every order this browser has ever submitted, newest first, each with its reference, status, buyer, date and line items β€” read from this device's local storage, not from a server.

Two screens, one real shop:

A separate page, hardware_store.html, shows a similar-looking hardware catalogue but carries its own banner calling itself "a concept render, not a working tool yet." The ordering flow described above β€” shop.html β€” is the real one. If you land on the other page looking to buy something, follow its own link back to the working shop.

Unlike every other page in this manual, shop.html loads neither universal_auth.js nor universal_role_access.js β€” there is no sign-in prompt and no role check on this page at all. Anyone who has the link can build a cart and submit a real EFT order in the business's name.

Agents managing their own referral links use a separate screen, sales_rep_portal.html ("Agent Portal", linked from the shop's header) β€” not covered in this chapter.

πŸ“¦ 7.2 Auto-Replenishment & Low-Stock Alerts (auto_replenishment_inventory.html)

Honest Operational Scope:

Every control on this screen is a fixed illustration today, not a live tool. The "items below safety reorder point" table always shows the same two example rows no matter what is actually in stock, and both buttons only display a success message β€” nothing is created, saved, or sent anywhere.

The low-stock table lists a barcode, description, current stock, safety reorder point, suggested reorder quantity, supplier and estimated cost per item β€” but those two rows (PPC Cement, Tastic Rice) are written directly into the page's HTML. There is no code on this page that reads your actual inventory to populate or refresh them.

Auto-Generate All Supplier POs shows an alert claiming three purchase orders were generated and suppliers notified, with a fixed total value. No purchase order record is created and no notification is sent β€” the function only shows the alert text.

Dispatch PO on a single row behaves the same way: an alert claims the PO was emailed to a supplier portal with a GRV expectation logged, and neither actually happens.

The platform's real reorder math lives elsewhere: universal_purchasing.js computes genuine reorder suggestions (Suggested = Max(Threshold Γ— 2 βˆ’ Stock, Threshold), the same formula this manual documents in Β§3.1) and real purchase orders and goods-received vouchers, reachable from retail_purchasing.html and hardware_grv_receiving_portal.html. This auto-replenishment screen does not currently connect to that engine.

This screen also has no owner/manager gate: its filename doesn't match the platform's "manage" access pattern, so any signed-in role β€” including staff β€” can open it and click these (currently fake) purchasing buttons.

🌐 7.3 API Integrations Hub (api_integrations_hub.html)

Coming soon: Connected Mode β€” cloud sync, multi-site and real third-party integrations
Honest Operational Scope:

This page used to carry a banner reading "8 OF 8 API CLUSTERS 100% OPERATIONAL" over eight tiles each claiming "100% UP". None of the eight clusters is connected to anything outside your device, so since 20 August 2026 the banner reads "0 OF 8 CLUSTERS CONNECTED β€” DESIGN PREVIEW", every tile reads "not connected", and a design-preview banner sits at the top of the page. The engine behind this page, universal_api_gateway.js, describes itself in its own header comment as a "QUARANTINED HONEST STUB": every one of its methods β€” across the Payments, Government, Logistics, Messaging, MarketplaceOTA, HardwareIoT, CreditKYC and Accounting clusters β€” returns a NOT_CONNECTED result and warns in the browser console that external integrations aren't wired. That includes named capabilities like initiateOzowEFT, fileSARSVAT201, createCourierGuyWaybill, syncShopifyCatalog, syncTakealotStock, syncXeroJournal and parseMettlerToledoScale.

Run Full Gateway Ping used to show a canned alert listing all eight clusters "verified" with fixed millisecond figures; it now says plainly that nothing was pinged and that no cluster is connected. It has never called window.IntelliVisionAPI or any of the honest-stub methods above β€” the page's own script defines a separate, hardcoded set of sample data and never references the gateway object it loads.

Each cluster's own "Dispatch / Test" button (Payments, SARS, Logistics, Vision AI/IoT, WhatsApp, Identity, Ad Networks, Accounting) shows a fixed sample request/response pair for that category. Only the timestamp changes between clicks; the substance never does. Until 20 August 2026 the SARS button answered with an invented eFiling acknowledgement token and a VALIDATED status, and every button ended in a "handshake success" alert β€” for a request that was never sent. The SARS response now reads NOT_CONNECTED with no token at all, each button says plainly that no request left your device, the cluster tiles read not connected instead of "100% UP", and the page carries a design-preview banner. Nothing on this screen has ever spoken to SARS.

The "Live Gateway Request / Response Telemetry Inspector" panel below the cluster cards shows the same sample payload that the last button click wrote into it β€” it's a viewer for the fake data above, not an independent live feed.

Despite the "Super Admin" branding in its own header nav, this page carries no owner/manager gate: its filename matches neither the "manage" nor the "sell" access pattern, so it defaults to plain view access β€” any signed-in role, including staff, can open it.

πŸ‘‘ 7.4 Super Admin Command Center (super_admin_dashboard.html)

The top row of this console β€” Today Sales, Today Orders, 7-Day Sales, Top Selling Product, the Cash/Card split, and Low Stock Count β€” is computed the same honest way as every other dashboard in this manual: directly from this device's own order, payment and inventory rows, not from placeholders. It updates live over the same BroadcastChannel('iv_sales') mechanism the moment a sale is rung up anywhere on this device.

Everything below that row is a different story.

Five things to know before you trust the rest of this console:

Merchants Fleet

This tab, the MRR/GMV/tills-and-cameras tiles above it, and the "SAAS FLEET ONLINE (99.98%)" badge all come from ten fixed, fictional named businesses (e.g. "SPAR Supermarket Sandton", "Ocean Basket V&A Waterfront") seeded once into this browser's own local database the first time the page loads. None of it is a real other customer's data β€” this product has no server connecting separate installs together.

Live Pulse Refresh

Re-reads that same seeded list (plus whatever ticket you've added below) and shows a success alert regardless of what changed.

Inspect Tenant

Shows an alert claiming an active impersonation session, then opens retail_dashboard.html β€” the same generic page every time, regardless of which of the ten fictional names you clicked.

Support & Ticket Command Center

Lists tickets from the same kind of seeded local data. "+ Simulate Incoming Ticket" adds one more fabricated ticket to the top of that list. "Mark Resolved" does genuinely update that ticket's status in the local database and re-renders the list β€” real within this seeded dataset, just not connected to any real support queue.

Cloud Infrastructure & API Gateways

Camera feed count, a SARS connector marked as fully connected, payment gateway uptime β€” all decorative static text. Nothing on the page computes or refreshes it, and it is not wired to the honest, not-connected gateway engine described in Β§7.3. Don't rely on this tab to mean anything is actually connected.

The four tabs (Merchants Fleet, Support, Infrastructure, Tax & Currency) just show and hide these panels β€” switching tabs doesn't reload or refresh anything underneath.

Admin Guided Tour opens the platform's guided walkthrough engine, if it's loaded on the page.

The Tax & Currency tab's mini preview is the one place this console understates what's real: it shows four countries as fixed markup and labels itself "8 Countries" (super_admin_dashboard.html:250), while the actual engine behind its own "Open Full Tax & Pricing Cockpit" link supports fifteen β€” see Β§7.5 for the real, current list.

This console is properly gated: its filename matches the platform's owner/manager-only access pattern, so a cashier or staff login cannot open it β€” it fails closed to the same "Access Restricted" screen used everywhere else in the product.

🌍 7.5 Tax Regimes & Country Pricing (admin_tax_currency_manager.html)

Unlike the two screens above, this cockpit is genuinely real and working β€” the same engine (window.IntelliVisionCurrency, in universal_currency_tax_engine.js) that drives the country/tax toolbar on every till.

The cockpit covers 15 countries β€” South Africa (SARS), Namibia, Botswana, Kenya, Nigeria, Zimbabwe, Ghana, Rwanda, Tanzania, Zambia, Mauritius, the UAE, the UK, the EU and the USA β€” each card showing its statutory VAT/tax rate, currency, fiscal validity window, and a country price multiplier applied to an example price so you can see the converted amount at a glance.

The region buttons (All 15 Markets / Southern Africa / East Africa / West Africa / International) filter that list down by group.

What "real" means here, precisely:

The expiry badge on each card (Active / Expiring Soon / Expired) is a genuine date calculation against today's date, not a fixed label. The currency conversion, however, runs on a fixed table of default exchange rates written into the engine (universal_currency_tax_engine.js:14-32) β€” despite this page's own description promising real-time conversions, rates only change when an admin edits them below; nothing fetches a live market rate.

Adjust Rate / Multiplier opens two prompts β€” new tax rate percentage, new cross-border price multiplier β€” and, once confirmed, genuinely rewrites that country's regime.

Renew Fiscal Period prompts for a new expiry date and schedule name, then genuinely resets that country's status to active with the new date.

Simulate Tax Period Expiry is a genuine testing control, not theater: it actually sets a chosen country's regime to expired, so you can see the same compliance warning a cashier would see on the till's tax status pill.

All three of the edits above save to this browser's local storage immediately, but they only take effect the next time a till or toolbar page on this device loads or reloads β€” there's no live push into a till that's already open in another tab. Only switching your own active trading country broadcasts instantly, over a same-tab event the toolbar listens for.

Reset Standard Statutory Defaults clears every saved change and reloads the page back to the shipped rates and dates.

This page is also owner/manager-gated, the same as the console above.

πŸ—ΊοΈ 7.6 Other Tools Nearby

A handful of working screens near this chapter have no link pointing to them anywhere in the product today, which means this manual is currently the only way to find them. Listing them here is a map, not a certification β€” this chapter hasn't audited their behaviour the way it has everything above, so verify anything they claim before relying on it: