South Africa
China
India
● Online
Loading...
Sign Out
Site
Lead Tracker
All branches
Loading…
Container Tracker
Shipments
Loading…
🚛 Delivery Routes
Last 15 customer deliveries — live routes
Loading delivery routes…
🗞️ Industry News — Tiles & Flooring
Loading…
💱 Exchange Rates → ZAR
Loading…
📍 Our Stores
🏠
Jericho Home
Cape Town
12 Long Street
City Centre
Cape Town, 8001
📍 Directions
🏠
Jericho Home
Johannesburg
120 Rivonia Road
Sandton
Johannesburg, 2196
📍 Directions
🔷
Jericho Showroom
Umhlanga
35 Lagoon Drive
Umhlanga
Cape Town, 7441
📍 Directions
Invoice Revenue Trend
Recent Invoices
Invoice #DateCustomerAmountBalance DueStatus
📋 Estimates Created Today
Est # Customer Total Salesperson Status
Loading…
Top 10 Customers by Revenue
New vs Repeat Customers
Customer Summary
CustomerInvoicesTotal InvoicedOutstanding
AR Payment Behaviour — Open Accounts
CustomerOpen InvoicesOutstandingAvg Age (days)% Unpaid
Total Open AR
Overdue (90+ days)
Total AP (Bills)
AR Aging Buckets
AP Aging Buckets
Overdue Invoices
Invoice #DateDue DateCustomerAmountBalance Due
Cash Flow — Income vs Expense
Monthly Income vs Expense (6 Months)
Bank Accounts
AccountTypeBalance
Total Items
Low Stock
Asset Value
Turnover Ratio
times/year
Overstocked Items
Coverage Data — Staff Instructions

The two columns m²/Box and Units/Box are used by the mobile scan page to calculate how many boxes a customer needs.

How to fill them in:

  1. Pick up the physical box of the product.
  2. Find the label — it will say something like "Coverage: 1.44 m²" or "6 tiles per box".
  3. Click the product card below to open the detail panel.
  4. Edit the m² per box (e.g. 1.44) and units per box (e.g. 6) fields.
  5. Click Save next to each field.

Note: Only fill in these fields for tile, flooring, panel and sheet products. Leave blank for adhesives, grout, trims, tools and accessories.

Total:
Showing:
Low Stock:
No Photos:
Loading inventory…
Potentially Overstocked — Excess Tied-Up Capital
ItemSKUOn HandReorder PointExcess QtyExcess Value
🎯 Lead Tracker
QB-synced estimates across all branches — track status & salesperson
Customer Branch Est # Date Total Status Salesperson Preview 💰 Bounty
Loading…
QR Code Scanner
Open on any phone or tablet to scan a product QR code and see price instantly.
Open Scan Page →

All Insights

Live business intelligence — charts, trends & KPIs across your branches.

🏬
Branch
🕐
Last refresh
just now
💰 Financial
👥 Customers
📦 Operations
Quick
1

Key Numbers

At-a-glance health check — refreshes live from QuickBooks.

Revenue MTD
Open AR
Overdue AR
Cash Balance
DSO
days to collect
Avg Gross Margin
Vendor Spend (12 mo)
Top Payment Method
Avg Materials Cost %
2

Financial Performance

Margin, costs, revenue trend, cash position.

Gross Margin % by Product (Top 20)
Top Vendor Spend — 12 Months
Sales by Payment Method
Materials Cost as % of Revenue — Monthly
Revenue Trend
Income vs Expense — 6 Months
3

Customers & Receivables

Who buys, who pays, and how fast.

4

Operations & Inventory

What's moving, what's costing, what's stuck.

Top 30 Selling Items — By Quantity
AR Aging Buckets

Active Alerts

Site Performance Comparison

All active companies side by side.

Revenue Trend by Site (Daily)
Revenue by Site
Open AR by Site
Cash Balance by Site
Overdue AR by Site
Full KPI Comparison
SiteRevenue (Period)Open AROverdue ARCash BalanceOverdue Invoices

User Management

UsernameFull NameRoleStoreBranch AccessWA TagCan QuoteStatusActions
🚢 Shipment Tracker
Track inbound containers from origin to South Africa
🚛 Delivery Tracker
Track local deliveries to customers. Auto-populated from invoices · max 15 shown.
⚙️

Settings

Manage backups, integrations, scheduler health and team access.

QuickBooks
Connected Companies
Each company syncs separately from its own QuickBooks server via the Web Connector.
Sync Log
CompanyWhenStatusWhat was syncedError
Email
SMTP Settings
Used to send estimates and notifications by email.
Email Log
History of sent reports and notifications.
SentToReportPeriodStatusError
Report Scheduler
Loading schedules…
Estimates
Estimate Settings
Default values applied when creating new estimates.
🛡️
How your data is protected
Five independent layers cover different failure modes. If you ever need to restore something, find the smallest layer that contains it — it'll be the fastest path back.
🆘 I lost something — which layer do I use?
  • The whole VM won't boot / OS broken → Layer 1 (Proxmox snapshot) if recent, else Layer 2 (PBS)
  • Dashboard DB is corrupted or wrong data → Layer 3 (in-app maintenance backup, daily)
  • I want photos/logo from a specific moment → Layer 4 (download .zip from a past day)
  • I need a specific QuickBooks .QBB backup file → Layer 5 (Nextcloud Backups folder)
  • Lost the whole disk / hardware died → Layer 2 (PBS — restores to any Proxmox node)
LAYER 1 🌐 Proxmox Snapshot
What: Instant point-in-time copy of the whole VM (OS + disk + RAM).
When: On-demand — make one before any risky change.
Where: Proxmox UI → askari0 → VM 206 → Snapshots.
Restore time: ~30 seconds, in-place rollback.
Best for: "I'm about to do something scary — let me have an undo button."
LAYER 2 📦 Proxmox Backup Server (PBS)
What: Deduplicated, off-host nightly backup of the whole VM — survives the host dying.
When: Automatic, daily (configured retention).
Where: pbs-askari2 at https://192.168.0.15:8007 → Datastore /datastore.
Restore time: ~10–30 minutes (depends on VM size).
Best for: "askari0 died, I need this VM back on askari2 / from yesterday morning."
LAYER 3 🛠 In-app Maintenance Backup
What: Just this app's data — SQLite DB (gzip), product images, company logo, .env config.
When: Daily auto-run + click ⚡ Backup now below.
Where: Local disk on this server + emailed if SMTP is set up.
Restore time: ~1 minute — pick a date from the timeline below and click restore.
Best for: "Dashboard data went wrong (bad sync, deleted record) — roll the DB back without touching the VM."
LAYER 4 📥 Advanced .zip + Email / Google Drive
What: A portable, self-contained .zip you can carry off-site (download, email, GDrive).
When: On-demand download + scheduled email at the time set in this page.
Where: Wherever you sent it — your laptop, Gmail, Google Drive.
Restore time: Upload the zip back via Restore from Backup button.
Best for: "I want a copy I can email to myself / take home / restore on a totally different machine."
LAYER 5 📒 Demo Backups (disabled)
What: Native QuickBooks .QBB backup files for each branch (Cape Town, Johannesburg), pushed by the QB Web Connector to the site's Nextcloud user.
When: Each time QB runs a backup on the Windows PC — frequency depends on QB's own schedule there.
Where: Demo Storage → user demo-dbn or demo-cptBackups/ folder. Live status shown below.
Restore time: Download the .QBB, open in QuickBooks → File → Restore.
Best for: "QuickBooks file got corrupted / I want to roll back a posting to a specific day."
Tools & controls
Layers 3 — 5 are managed from here.
🛡️
Backup & Restore
Loading backup inventory…
📦
Restore App / Version
Brings back the entire VM (code, OS, services, every file) to a chosen point in time. Use this if the system itself is broken — wrong code deployed, bad upgrade, VM disk failure.
Loading PBS snapshots…
How to restore: these snapshots live in Proxmox Backup Server on askari2. Restore happens at the hypervisor level via:
Proxmox UIaskari1:8006 → VM 206 → Backup → pick snapshot → Restore
CLIqmrestore pbs-main:backup/vm/206/<ts> <new-vmid>
💾
Restore Data Only
Replaces just qb.db from a chosen daily backup. Use when business data needs rollback (wrong customer edit, accidental delete) but the app itself is fine.
Safety: the current live database is auto-saved as qb.db.before-restore-<timestamp> in the same folder. App restarts itself after restore. Browser will need ~5 s to reconnect.
📅
Local backup timeline
on demo VM · 14-day retention · daily 02:00 cron
Loading…
Last maintenance run log
(none)
📦 QuickBooks Backups
Newest .QBB files in each site's Nextcloud Backups/ folder. Green < 48 h · Amber 48 h – 7 d · Red > 7 d.
Loading…
⚙️ Advanced — full zip download / upload restore
System Backup
Download backup includes: database · product images · company logo · .env config
Database covers: quotes, lead tracker, container tracker, inventory coverage fields, news sources, users, schedules, SMTP & banking settings.
Scheduled email backup sends the database only (gzip compressed) — images are in the download backup.
Restore from Backup
Upload a .zip file from a previous download. Restores the database, product images, company logo, and .env config. Overwrites all current data.
Google Drive Backup
Disconnected
Pushes the full backup (database + images + assets + .env) to your Google Drive on a schedule.
📝 One-time Google Cloud setup — ~10 min (click to expand)
  1. Create a Google Cloud project at console.cloud.google.com/projectcreate — name it Mizan Backups.
  2. Enable the Google Drive APIAPIs & Services → Library → Google Drive API → Enable.
  3. Configure OAuth consent screenAPIs & Services → OAuth consent screen:
    • User Type: External
    • App name: Mizan, support email = your email
    • Skip scopes step. On Test users, add your Google account email.
    • Leave app in Testing mode — no verification needed.
  4. Create OAuth Client IDAPIs & Services → Credentials → + Create Credentials → OAuth client ID:
    • Application type: Web application
    • Name: Mizan
    • Add both Authorized redirect URIs:
      https://mizan.tail95a3b4.ts.net/api/gdrive/oauth/callback https://100.99.177.111/api/gdrive/oauth/callback
  5. Copy Client ID + Client Secret from the modal, paste below, click Save Credentials, then Connect Google Drive.
Troubleshooting: • "This app isn't verified" during consent → Advanced → Go to Mizan (unsafe). Normal for testing apps. redirect_uri_mismatch → the URL you opened the dashboard with isn't in the list above. Add it in Cloud Console. 403 access_denied → your email isn't in the OAuth consent screen Test Users list.
Scheduler Last-Fired Health
Loading…
🗂 System Logs
Click ↻ Refresh to load logs.
Audit Login History last 50 successful logins
Loading…
AI Catalogue & WhatsApp AI checking…
Catalogue links cached from your Linktree. Used by the 📚 button in WhatsApp compose to quickly drop the right link, and by the ✨ AI Draft button to suggest contextual replies (when Claude API key is configured).
Loading…
⚡ Quick Replies WhatsApp Templates
Canned messages staff can drop into the WhatsApp compose box with one click (⚡ button next to 📚). Use placeholders to personalise: {first_name}, {name}, {my_name}, {branch}, {balance}, {today}.
Loading…
📰
Industry News Sources
RSS feeds shown on the Overview page. Toggle sources on/off or add a custom feed URL.
Loading…
Add Custom RSS Source
📊

Executive Brief

AI-written cross-branch summary, pulled fresh from your live numbers.

Pick a period above to generate the brief.
🔎 Raw numbers used to write this brief
(none yet)
📖

Help & Guides

Quick references and full manuals. Tap any card to open the guide.

📚 Full manuals
🧭 Topics

📐 Room Calculator

For working out boxes needed

Inside any inventory product, scroll to Room Calculator, enter Length × Width in metres (or total m² directly), pick a waste %, and it tells you boxes needed and whether stock is enough.

  • 10% — straight lay, simple rectangle
  • 15% — diagonal / herringbone, rooms with pillars or islands
  • 20% — complex layouts, large-format tiles, feature patterns
If stock is short, the calculator shows the shortfall in m² and boxes so you know how much to reorder.

🎨 Batch & Shade Codes

Why dye-lot matters

Tile from different production runs can have slightly different shade or size. The batch code on each box identifies the run — always supply tiles for one job from the same batch.

  • The dashboard tracks batches per SKU and warns when stock crosses batches.
  • Quote PDFs include the batch code so installers know what to look for.
  • Always check batch + shade on the boxes before opening — replacements need the same code.

📦 Inventory Tools

Products, photos, stock
  • Search by name or SKU; filter by category, branch, or stock status.
  • Photos — click a product to upload multiple images. They show in quotes, on the public scan page, and in the POS.
  • Coverage — set m² per box and units per box on each product so the Room Calculator works.
  • Cross-branch stock — a product card shows on-hand at every branch, not just the selected one.
  • Export CSV — top-right of the inventory page.

🔳 QR Codes & Price Check

Mobile scanner & public lookup
  • Price Check tab → tap any product → "Print QR Label" for showroom displays.
  • Customers scan the QR with their phone — opens a public page with product info + photos. No login.
  • The staff scanner (/scan/) is a phone-optimised version with stock info, internal pricing, and quick "add to quote" button.

📄 Estimates & Quotes

Build, send, track
  1. Estimates tab → + New Quote → pick customer → add line items (search or scan) → set qty & price.
  2. Choose PDF template: Jericho (branded) · Classic (clean B&W) · Premium (with product photos).
  3. Click Preview to see the PDF. Edit if needed, then Save.
  4. Send by email (uses your SMTP) or WhatsApp (attaches the PDF as a document).
  5. Lead Tracker tab — every estimate appears here. Mark Hot/Mild/Cold, assign salesperson, set bounty for owner.
When a customer accepts, the estimate can be one-click converted into a sale at the POS — items pre-loaded into the cart.

📱 WhatsApp Slips & Sending

Receipts, quotes, & ad-hoc messages
  • From the POS after a sale: tap 📱 WhatsApp slip, search a customer or type a number, hit send. Free if customer messaged you within 24h, otherwise sends as a utility template (~R0.12).
  • From a quote: open the quote → Send → WhatsApp → pick customer. Attaches the quote PDF.
  • From the WA gateway UI (whatsapp-gw.tail95a3b4.ts.net): full messenger with conversation history, broadcast, contacts.
If a send shows "queued — retrying", the gateway is offline or DNS is down. Sales are saved either way; re-send from the Sales history page when network returns.

📊 Reports & Email Schedules

Daily, sales, AR, statements
  • Reports tab → pick a report type and date range → preview → email or download PDF.
  • Daily Sales includes both Accrual (revenue earned) and Cash (money received) views, plus POS data.
  • Settings → Email schedules — set up auto-send at any time, any days. One row per branch.
  • Each schedule fires for one branch. To send multiple branches, tick the relevant ones in the same card — saves as two rows automatically.

👤 Users, Roles & Branches

Who sees what
  • Superuser (you) — everything, plus user management and infra settings.
  • Admin / Owner — full dashboard, all branches.
  • Supervisor — own branch only, no user management, can void sales.
  • Cashier / Staff — own branch only, modules you tick in user settings, voids need a manager PIN.

Settings → Users → Edit user → tick the modules they should see. The branch dropdown is locked to their assigned branch automatically.

📱 Phone as a Wireless Scanner

Skip the R500-R3500 Bluetooth scanner

Any phone running the Scanner PWA (/scan/) can be paired to an open till and every QR/barcode it scans lands in the till's cart in real-time. Great for stocktake-style rings, customer-queue overflow, or a backup when a hardware scanner dies.

  1. On the till tablet, tap the 📱 icon in the top bar.
  2. A 6-digit code + QR appear. The code is good for 60 seconds.
  3. On the phone, open /scan/Till tab → enter the code (or scan the QR from the camera tab) → optionally name the phone ("Mary's phone") → Pair to till.
  4. Done. Switch the phone to the Scan QR tab and every scan goes straight to the till. The till's top bar shows a green ✓ chip with the phone's name.

What's built-in to keep it bulletproof:

  • Idempotent scans — phone retries on flaky network won't double-add an item.
  • 800ms dedup — phones double-trigger barcodes constantly; the second hit is silently ignored.
  • Offline queue — phone offline mid-shift? Scans are stored locally and replayed when network returns.
  • SSE reconnect — if the till's WiFi blips, scans are buffered server-side for 30s and replayed on reconnect.
  • Session lasts 4 hours, then auto-expires. New pair on the same till revokes the old one.
  • Brute-force protection — max 5 pair attempts per IP per minute.
  • Audit log — every scan stored with device, label, sku, result. Admin can review.

The phone scanner page (/scan/) is still publicly accessible without a login — it just defaults to product-lookup mode until paired.

Audio beep + haptic on every scan so the cashier on the till knows the phone-scan landed without looking at it.

💳 Credit Limit Control (account sales)

Stop runaway A/R balances

When an account customer has a credit_limit set in QuickBooks (it syncs into the dashboard automatically), the POS keeps an eye on their outstanding balance and either warns or blocks an over-limit sale.

When a customer is selected at the till, a chip under their name shows the live status:

  • 🟢 CREDIT OK — projected balance is under the warn threshold (default 80% of limit)
  • 🟡 NEAR LIMIT — projected balance is ≥ warn threshold but still under the limit
  • 🔴 OVER LIMIT — adding this cart would push them over their limit

Behaviour at checkout (POS Settings → Credit check mode):

  • off — chip still shows, but no prompt; cashier can charge freely
  • warn (default) — confirm dialog with the over-by amount; cashier can override on the spot
  • block_with_pin — sale rejected unless a manager enters a 4-6 digit PIN; same PIN as voids/refunds

The chip stays hidden for walk-ins (no account) and for customers without a credit_limit set in QB.

Balances are pulled from QuickBooks every 15 minutes during sync. A sale just rung up doesn't reflect on the balance until the next sync — keep that in mind for fast-fire scenarios.

📋 B2B Tax Invoice (SARS, sales ≥ R5000)

Capture buyer details for SARS-compliant invoices

SARS requires that any sale of R5000 or more (incl VAT) be issued as a full Tax Invoice. The slip must show the buyer's name and address, and the buyer's VAT registration number if they're registered — otherwise the buyer can't reclaim the VAT.

The till handles this automatically:

  1. When the cart total crosses R5000, a navy banner appears above the charge buttons: "Tax Invoice required".
  2. Walk-in customer over R5000: tap Cash, Card or any payment method. Before the payment modal opens, a Buyer details dialog asks for:
    • Buyer name (required — "Walk-in Customer" not accepted)
    • VAT reg # (optional, but recommended — if the buyer is registered)
    • Address (street, suburb, city, postal)
  3. Account customer over R5000: if the customer record already has VAT + address, the till uses those automatically (no extra prompt). Otherwise it asks like a walk-in.
  4. Slip prints/sends with a navy "TAX INVOICE" banner instead of "RECEIPT", and a BILL TO block showing the buyer's details.
  5. The QB transaction is unchanged — same SalesReceipt or Invoice as a normal sale, just the customer details are recorded.

The buyer details are frozen on the sale row — editing the customer record later doesn't change historic invoices. The Sales History detail view shows them under the line items.

Change the threshold in POS Settings → Tax invoice threshold (per branch). Defaults to R5000. Set to 0 to disable the auto-flag entirely.

↩️ Returns & Refunds

When a customer brings something back
  1. POS sidebar → Sales History → find the original sale (search by sale # or customer).
  2. Click the sale to open it → Process return (yellow button, only shows for paid, non-refund sales).
  3. Set the qty to refund on each line. The "Already refunded" column shows what's been returned before (partial returns are fine — yellow row = partial, red = fully refunded).
  4. Pick the refund method:
    • Cash — give money back from the drawer. Best for small cash sales.
    • Card — refund to the customer's card on the terminal. Process the card refund separately on the speedpoint, then tick Card here so QB reflects it.
    • Account — customer is on account; the return becomes a Credit Memo against their A/R balance (shows on their next statement).
    • Credit note — issue a paper voucher to spend in-store next time. Does not push to QB (customer redeems it later).
  5. Add a short reason (optional but helpful for the audit log) → Confirm refund.

What happens behind the scenes:

  • A new sale row is created tagged -R1 (e.g. PAR-2026-05-0007-R1) with negative amounts.
  • Stock is added back to the branch's inventory automatically.
  • For cash/card refunds → a negative SalesReceipt goes to QB (reduces the deposit account).
  • For account refunds → a CreditMemo goes to QB (reduces their outstanding balance).
  • The original sale stays in QB unchanged — refunds are always separate reversing transactions for a clean audit trail.
Staff users need a manager PIN to confirm a refund unless it's a demo sale. Admin / owner / superuser sessions skip the PIN. Set PINs in Settings → Users → Edit → Manager PIN.

Voids vs refunds — if you void a sale (instead of processing a return) and it's already in QuickBooks, the system now auto-creates the reversing entry too. No manual QB cleanup needed. The void status shows in the sale's detail view as "Void → QB: posted / queued / failed".

🖨 Thermal Printer Setup

In POS Settings
  1. Plug the thermal printer to a network port or USB.
  2. POS → ⚙ Settings → Thermal Printer URL.
  3. For network: enter 192.168.0.50:9100 (replace with printer IP).
  4. For USB: select the device path from the dropdown.
  5. Tap Test print — a sample slip should come out.

If nothing prints, check: power, paper, LED status (red = error), and that the printer IP is reachable from the till device.

🔄 QuickBooks Sync & Data

How data refreshes
  • QuickBooks Web Connector (QBWC) on your QB Desktop PC pulls data every 15 minutes.
  • Settings → Sync tab shows the last sync time and per-branch status.
  • Click Force Sync to trigger an immediate pull.
  • If sync stops: check the QB Desktop PC is on, QBWC is open (system tray), and QuickBooks is logged in.
Inventory edits, photos, and custom fields you set in the dashboard are not overwritten by QB sync — those live only in the dashboard.
💡
Need more help?
Check the POS manual for till specifics, or ask Hassan / Sofia for workflow questions. System Logs viewer (🗂 icon bottom-right of dashboard) shows live activity for diagnosing issues.
Executive Summary
Period: loading…
Revenue vs Expenses — Monthly
AR Aging Snapshot
Top 5 Customers — Period
CustomerInvoicedInvoices
Inventory Health
Payment Methods Summary
Payment MethodTransactionsTotal Amount
Profit & Loss Statement
Period: loading…
Monthly Revenue vs Expenses vs Gross Profit
Materials Cost as % of Revenue
Top Vendor Spend
VendorBillsTotal
Payment Methods Summary
Payment MethodTransactionsTotal Amount
Monthly P&L Summary
MonthRevenueExpensesGross ProfitGP%
Sales & Revenue Report
Period: loading…
Monthly Revenue Trend
Sales by Payment Method
Top Customers — Period
CustomerInvoicedOutstanding
New vs Repeat Customers
Gross Margin % by Product (Top 20)
Invoice List
#DateCustomerAmountBalance DueStatus
Payment Methods Summary
Payment MethodTransactionsTotal Amount
📋 Estimates Created Today
Est #DateCustomerTotal
Loading…
Accounts Receivable Aging
As of today
Aging Buckets
Days Sales Outstanding (DSO)
AR by Customer
CustomerCurrent1–30 days31–60 days61+ daysTotal Due
Customer Payment Behaviour
CustomerOpen InvoicesOutstandingAvg Age (days)% Unpaid
Open Invoice Detail
Invoice #DateDue DateCustomerAmountBalanceBucket
Inventory Health Report
As of today
Top 10 Items by Asset Value
Gross Margin % — All Products
! Low Stock & Out of Stock
ItemOn HandReorder PointStatus
Overstocked — Tied-Up Capital
ItemExcess QtyExcess Value
Full Inventory Valuation
ItemSKUQtyReorderStatusCostPriceMargin%Asset Value
Customer Statement
Select a customer
Sales Report
Select a date
Collections by Payment Type
Invoices View:
Invoice #DateCustomerTotalPaidOwed
Sales Receipts — Cash & EFT Collected
Ref #DateCustomerMethodAmountMemo
Customer Payments (ReceivePayment)
Ref #DateCustomerMethodAmount
Payment Methods Summary
Payment MethodTransactionsTotal Amount
📋 Estimates Created
Est #DateCustomerTotal
Run the report to load estimates
Invoice #DateDue DateCustomer AmountBalance DueStatus
Loading…
WhatsApp Messages
SSE …
0 selected
Product QR Code

Email Report