Everything you need to set up, run, and grow your venue on ZanziPOS.
There are two ways to get started on ZanziPOS. You can submit the early access form at zanzipos.app and our team will contact you personally to set everything up. Or, if you prefer to set up independently, contact build@zanzipos.app and we will provision your account and guide you through the process.
Provide your venue name, email, and venue type. You will receive a confirmation email within minutes.
We create your isolated database and subdomain — e.g. yourvenue.zanzipos.app. This takes a few hours.
Log in to your admin panel and add food categories, items, and prices. This typically takes 20-30 minutes.
Add tables, invite staff with the correct roles, and configure your currency and tax settings.
Display QR codes on tables, open your register, and start taking orders. ZanziPOS is ready.
Every venue on ZanziPOS gets a unique, permanent subdomain in the format yourvenue.zanzipos.app. This is where your staff log in, where QR codes point customers, and where all your venue data lives.
Subdomains cannot be changed after setup. Each subdomain has its own completely isolated database — your orders, menu, and staff data are never shared with or visible to any other venue.
Custom domains (e.g. pos.yourvenue.com) are on the roadmap for the Hoteli plan.
Every new venue starts on a 14-day free trial with full access to all features on their chosen plan. No credit card is required to start.
When your trial period ends, your account automatically enters read-only mode. You can still log in, view all historical orders and reports, and access your data — but you cannot process new orders until you subscribe. Nothing is deleted.
In your admin panel go to Menu → Categories. Categories group your items and appear as filter pills in the POS and sections in the QR menu. Examples: Starters, Main Course, Grills, Drinks, Cocktails, Desserts.
Go to Menu → Items to add your food and drinks. For each item you set a name, category, price, and active status.
| Field | Description |
|---|---|
| Name | Shown in the POS and QR menu. Keep it clear and recognisable. |
| Category | Which section this item belongs to. |
| Price | In your venue currency (TZS or USD). |
| Active | Inactive items are hidden from staff and customers without being deleted. Use this for sold-out items. |
ZanziPOS actively supports TZS (Tanzania Shilling) and USD. Your venue currency is configured in Admin → Settings and applies to all prices, receipts, and ZRA submissions.
Pesapal handles currency conversion for international card payments. If your venue prices in TZS, Pesapal will convert at the live exchange rate when a guest pays in a foreign currency.
Go to Admin → Tables to create your seating areas. Each table has a name and a capacity. In the POS, tables appear as cards — green means available, teal means an active order is running on that table.
Each table automatically gets a unique QR code. Customers scan with their phone camera — no app to download — and see your full menu. QR codes are generated automatically when you add tables in your admin panel. Print them directly from the admin.
Room service ordering is planned for the Roadmap — it is not yet live. When launched, each hotel room will get a unique QR code. Guests scan, browse the menu, and order. Orders route to the kitchen with the room number attached automatically.
ZanziPOS currently supports the following payment methods:
| Method | Status | Notes |
|---|---|---|
| Cash | Live | Always available, no setup needed |
| Room bill | Live | Charges order to guest room account |
| Bank transfer | Live | Manual recording, no gateway required |
| Mobile Money (M-Pesa, Airtel) | Via Pesapal | Requires your Pesapal account connected |
| Visa / Mastercard | Via Pesapal | TZS and USD supported |
| Split payment | Live | Any combination of methods on one order |
At checkout, select Split as the payment method. A breakdown appears showing Cash, Mobile Money, Card, and Bank Transfer. Enter the amount for each method used — the remaining balance updates in real time. The Confirm button only activates when the amounts cover the full total.
ZanziPOS connects directly to the Zanzibar Revenue Authority (ZRA) Virtual Fiscal Management System (VFMS) API. When ZRA is enabled for your venue, every completed order automatically submits a fiscal transaction to ZRA and receives a receipt number in return.
Tax rate and whether tax is enabled are both configurable per venue in Admin → Settings. When enabled, tax is shown as a separate line on the receipt.
To set up ZRA, go to Admin → ZRA and enter your Integration ID, Token ID, Z-Number, TIN Number, and VRN. These credentials are issued by ZRA when you register your fiscal device.
If the ZRA API is unavailable at the time of an order, the submission is saved as pending in the ZRA queue. The system retries automatically every 15 minutes via a background scheduler until the submission succeeds.
You can also trigger a manual retry from Admin → ZRA Queue. The queue shows all submissions with their status: Pending, Successful, or Failed. Customers can still use their receipt while ZRA status is pending — the ZRA receipt number is added to the receipt once confirmed.
Every completed order generates a digital receipt accessible at a unique URL (zanzipos.app/receipt/TOKEN). If the customer provides their email address at checkout, the receipt is emailed to them automatically via SMTP.
The receipt URL can also be shared manually — copied and sent via WhatsApp, for example. ZRA receipts include the fiscal receipt number, response number, tax breakdown, and a QR code linking to the ZRA verification portal.
Go to Admin → Reports to view your venue performance. The following reports are currently available:
Revenue, order count, and average order value by day.
Best-selling items by quantity and revenue.
Orders and revenue processed per staff member.
Revenue split by cash, mobile money, card, and bank.
Fiscal receipts matched to orders, pending queue status.
Dine-in vs quick sale breakdown.
The AI assistant is powered by Claude (Anthropic) and is available in your admin panel under Admin → AI. It has access to your order history and menu data, so you can ask venue-specific questions.
| Plan | Price | Staff | Tables | Key features |
|---|---|---|---|---|
| Mwanzo | $29/mo | Up to 5 | Up to 20 | Cash and bank payments, ZRA, basic reports, AI assistant |
| Biashara | $79/mo | Up to 20 | Unlimited | Pesapal mobile money and card, advanced reports, loyalty (coming soon) |
| Hoteli | $149/mo | Unlimited | Unlimited | Multi-branch (coming soon), custom domain (coming soon), white-label |
All plans include the 14-day free trial. Early access venues receive 3 additional months at no charge.
Subscriptions are billed monthly via Pesapal. When payment is due you receive an email with a secure Pesapal payment link. Pay with Mobile Money, Visa, Mastercard, or bank transfer.
If payment lapses, your account enters read-only mode — you can view all historical data but cannot process new orders. Full access restores immediately upon payment confirmation.
To cancel your subscription, email build@zanzipos.app. Your data is retained for 12 months after cancellation in compliance with Tanzanian tax record-keeping requirements.
ZanziPOS support is based in Zanzibar. We speak both English and Swahili.
| Channel | Contact | Best for |
|---|---|---|
| build@zanzipos.app | Setup, billing, account questions | |
| Available on request | Urgent operational issues |
The following features are actively planned and will be released in upcoming updates:
| Feature | Status |
|---|---|
| Kitchen Display System (KDS) | Roadmap |
| Offline PWA mode (local order queuing) | Roadmap |
| Loyalty points and vouchers | Roadmap |
| Reservations and table bookings | Roadmap |
| Room service ordering | Roadmap |
| Delivery management | Roadmap |
| Multi-branch and multi-location | Roadmap |
| Custom domain per venue | Roadmap |
| WhatsApp receipt delivery | Roadmap |
| Inventory management | Roadmap |
Want to request a feature or vote on priorities? Email build@zanzipos.app.
Open any browser on your phone, tablet, or laptop and go to your venue subdomain — for example yourvenue.zanzipos.app. You will see the ZanziPOS login screen with your venue name. Enter your email and password, then tap Sign in.
ZanziPOS works on Android phones, iPhones, Android tablets, iPads, and laptops. No app installation is required — it runs entirely in the browser.
ZanziPOS has six staff roles. Your role determines what you can see and do:
| Role | POS access | Admin access |
|---|---|---|
| Waiter | Take orders, view menu | None |
| Cashier | Take orders, process payments | None |
| Bar staff | Take orders, view menu | None |
| Kitchen staff | View orders | None |
| Manager | Full POS | Menu, tables, staff, reports |
| Admin | Full POS | All settings including ZRA and billing |
After logging in, you land on the Tables view. All venue tables appear as cards. An occupied table (one with an active order) shows a green dot and is labelled Occupied. Tap any table to select it — the Menu tab opens automatically and your order sidebar appears on the right.
For takeaway customers or walk-ins not seated at a table, tap + Quick sale at the top of the Tables screen. This starts an order without a table assignment. Quick sale orders appear separately in reports and do not affect table availability.
On the Menu tab, tap any item card to add it to the current order. Tap again to add another of the same item. Use the category pills along the top to filter by section, or type in the search bar to find items by name.
In the order sidebar on the right, use the + and - buttons to adjust quantities. Reducing a quantity to zero removes the item from the order.
The Open orders tab shows all active orders across all tables in real time. Tap any order card to load it into the sidebar — you can then add more items or proceed to checkout. Orders remain open until payment is processed.
When the customer is ready to pay, tap Checkout in the order sidebar. The checkout screen opens showing the total and payment method options. Select the method used and optionally enter the customer name and email to send a receipt.
| Method | What to do |
|---|---|
| Cash | Select Cash, record the amount received, confirm. |
| Room bill | Select Room Bill, the order charges to the guest room. |
| Bank transfer | Select Bank Transfer, note the reference, confirm. |
| Mobile Money | Customer pays on their phone via M-Pesa or Airtel, then confirm. |
| Card | Customer taps or inserts on the Pesapal device, then confirm. |
| Split | See split payment section below. |
Tap Confirm payment to complete. The table is freed automatically and the receipt is generated.
Select Split at checkout. Enter how much is being paid by each method. The remaining balance updates live. When the balance reaches zero, the Confirm button activates.
At the checkout screen, enter the customer email in the Email field before confirming payment. After the order completes, a receipt is emailed to them automatically. It includes order details, ZRA fiscal number (if enabled), and a QR code.
If no email was provided, the receipt is still generated at a unique URL that can be shared manually — copy and send it via WhatsApp if needed.
The search bar at the top of the Menu tab filters all items in real time as you type. It searches by item name. Clear the search field to show all items again. Category filter pills reset when you clear search.
A small coloured dot in the top navigation bar shows your connection status. Green means the POS is connected to the server and orders will submit normally. Red means the connection is lost — wait for it to turn green before submitting an order.
The system checks connectivity every 10 seconds and reconnects automatically when internet is restored. On slow connections, allow a moment for the order to process — do not tap Confirm multiple times.
ZanziPOS runs in any modern browser with no installation. Tested and supported on:
The super admin panel at admin.zanzipos.app is the central control plane for the entire ZanziPOS platform. From here, the Zanziholics team can create and manage all tenant venues, monitor subscriptions, configure ZRA per venue, and access system settings.
Navigate to admin.zanzipos.app. Log in with your super admin credentials. The panel is built on Laravel and uses session-based authentication with bcrypt password hashing.
The dashboard shows all registered venues. For each tenant you can see their plan, subscription status, trial expiry, and last activity. Subscription status values:
| Status | Meaning | Access level |
|---|---|---|
| trial | Within 14-day free trial | Full access |
| active | Paying subscriber | Full access |
| readonly | Trial or payment lapsed | View only, cannot take orders |
| suspended | Manually suspended | Redirected to subscribe page |
| cancelled | Account closed | Redirected to subscribe page |
To manually activate a venue (e.g. for early access), update their subscription_status to "active" directly in the zanzipos_main database tenants table.
New venues are currently created manually via the database. Insert a record into the zanzipos_main.tenants table with the following required fields:
| Field | Value |
|---|---|
| slug | Subdomain slug — lowercase, no spaces, hyphens allowed (e.g. "bluehorizon") |
| business_name | Venue display name |
| Owner email for billing and notifications | |
| venue_type | restaurant, bar, hotel, resort, cafe, rooftop, food_truck, or other |
| plan | mwanzo, biashara, or hoteli |
| monthly_price | 29, 79, or 149 (USD) |
| subscription_status | Set to "trial" for new venues |
| trial_ends_at | 14 days from today (DATETIME) |
Then create the tenant database zanzipos_tenant_{slug} and run the tenant schema to create all required tables: staff, orders, food_categories, food_items, service_tables, settings, and zra_receipts.
Each venue requiring ZRA compliance needs these fields set in their tenants record:
| Field | Description |
|---|---|
| zra_enabled | 1 to enable, 0 to disable ZRA submission |
| zra_integration_id | Issued by ZRA on fiscal device registration |
| zra_token_id | API authentication token from ZRA |
| zra_znumber | Fiscal device Z number |
| zra_tin_number | Venue TIN from TRA |
| zra_vrn_number | VAT registration number (if applicable) |
| zra_street | Venue street address for fiscal receipts |
| zra_test_mode | 1 for ZRA sandbox, 0 for live ZRA API |
The ZRA API endpoint is http://102.223.7.131:6060/vfms/api for both sandbox and live. Failed submissions queue automatically and retry every 15 minutes via the Laravel scheduler cron (* * * * *). Venue admins can monitor and manually retry from Admin → ZRA Queue.
Subscriptions are processed via Pesapal live API (pay.pesapal.com). When a venue pays, the Pesapal IPN callback at zanzipos.app/pesapal/callback.php updates their subscription status to "active" and creates a record in the subscriptions table.
The subscribe page at zanzipos.app/subscribe/?slug={slug} handles Pesapal payment link generation automatically — it authenticates with Pesapal, submits the order request, and embeds the Pesapal payment iframe. The page polls every 8 seconds for payment confirmation.
Pesapal Consumer Key and Secret are embedded in the subscribe page. Keep these credentials secure.
ZanziPOS uses a database-per-tenant architecture on MariaDB:
| Database | Purpose |
|---|---|
| zanzipos_main | Shared — tenants, receipts, subscriptions, early_access signups |
| zanzipos_tenant_{slug} | One per venue — staff, orders, menu, tables, settings, ZRA receipts |
Tenant identification uses the HTTP_HOST header — the bootstrap.php extracts the slug from the subdomain and loads the correct tenant database. A data issue in one tenant database cannot affect others.
All transactional email (welcome, receipts, order notifications, override alerts) uses PHPMailer via SMTP:
| Setting | Value |
|---|---|
| SMTP Host | server1.cloudzanzibar.com |
| Port | 587 (STARTTLS) |
| From address | build@zanzipos.app |
| Notify address | operations@zanziholics.com |
Mail config lives at /var/www/zanzipos/config/mail.php. The admin Laravel panel uses its own .env mail settings. Email sending is fire-and-forget (silent fail) so a mail error never blocks an order from completing.
The AI assistant uses the Anthropic Claude API. Config at /var/www/zanzipos/config/ai.php:
| Setting | Value |
|---|---|
| Model | claude-sonnet-4-20250514 |
| Max tokens | 1024 per request |
| Endpoint | /admin/api/ai-chat.php (tenant) and /admin/ai (admin panel) |
Each AI request includes context from the tenant database — order history, menu data, and sales figures — to enable venue-specific insights. Monitor API usage in the Anthropic console to control costs.
Early access form submissions are logged to a private Google Sheet via an Apps Script webhook. Config at /var/www/zanzipos/config/app.php under google_sheet_webhook.
The webhook receives venue_name, email, venue_type, and source. If the Sheets request fails (timeout or error), the signup is still saved to zanzipos_main.early_access — the Sheets sync is a secondary notification only and never blocks the signup flow.
SSL is managed via Let us Encrypt (Certbot). A wildcard certificate covers zanzipos.app and all *.zanzipos.app subdomains, meaning new tenant subdomains are automatically covered with no additional cert work.
Three Nginx server blocks handle all routing:
Database backups are currently handled via daily automated backups for the ZanziPOS databases. In addition, Hetzner VPS snapshots provide server-level recovery points.
Recommended backup approach: daily mysqldump of zanzipos_main and all zanzipos_tenant_* databases, stored off-server (e.g. Hetzner Object Storage or a remote location). Test restores periodically.