JikoXpress Pro: Checkout & Order Management Architecture
JikoXpress Pro: Checkout & Order Management Architecture
Document Information
| Property | Value |
|---|---|
| Version | |
| Status | Draft |
| Created | December 2025 |
| Updated | January 2026 |
| Purpose | Development Guide & Requirements Reference |
Executive Summary
This document defines the complete architecture for JikoXpress Pro's checkout and order management system. The system supports multiple sales channels (POS, Kiosk, Mobile App, WhatsApp)WhatsApp, Table QR, Drive-Through), flexible payment methods, configurable kitchen operations, and comprehensive printing workflows.
The architecture prioritizesis built on three core principles:
- Single Source of Truth - All channels create Orders through a
singleunifiedsourcemodel - Progressive
truthFeaturewhileUnlockingmaintaining-flexibilityFromforhome kitchen to enterprise chain on one platform - Zero-Config Defaults - Works immediately, customize as needed
JikoXpress Pro serves diverse restaurant operation models - from a home chef with a mobile phone to multi-location fast food tochains finewith dining,drive-through from paper tickets to digital kitchen displays.lanes.
Part 1: Platform Tiers & Progressive Unlocking
1.1 The Vision: One Platform, All Scales
JikoXpress Pro is designed to grow with the business. A home chef starts with the simplest possible setup and progressively unlocks features as their operation scales.
STARTER GROWING PROFESSIONAL ENTERPRISE
(Home Chef) (Small Shop) (Restaurant) (Chain)
📱 → 📱💻 → 💻🖥️ → 🏢🌐
• Mobile app • + POS access • + KDS • + Multi-location
• Basic menu • + Kiosk • + Stations • + Central menu
• Order list • + Table QR • + Drive-through • + Analytics
• Accept/Ready • + Basic stats • + Staff roles • + API access
• Mobile money • + More payments • + Tabs • + Integrations
• + Printer • + Inventory • + White-label
1.2 Subscription Plans
STARTER Plan
Tagline: "Perfect for home chefs & small vendors"
Price: Free or minimal fee
Features Included:
Limits:
Ideal For: Home kitchens, street food vendors, side hustle chefs, testing the platform
GROWING Plan
Tagline: "For busy kitchens ready to scale"
Price: Mid-tier monthly fee
Features Included:
- Everything in STARTER
- Unlimited menu items
- POS access (desktop/tablet)
- Kiosk channel
- Table QR (unlimited)
- WhatsApp bot ordering
- Receipt printer support
- Kitchen printer support
- Card payments
- Cash handling
- Basic sales reports
- Order history (1 year)
Limits:
- 1,000 orders/month
- 3 staff accounts
- 1 location
Ideal For: Small restaurants, busy food stalls, cafes, food trucks
PROFESSIONAL Plan
Tagline: "Full-featured restaurant management"
Price: Higher-tier monthly fee
Features Included:
- Everything in GROWING
- Kitchen stations
- KDS (Kitchen Display System)
- Drive-through support
- Tabs (pay-later for dine-in)
- Table management
- Up to 15 staff accounts
- Roles & permissions
- Discount limits by role
- Advanced reports
- Customer insights
- Priority support
Limits:
- Unlimited orders
- 15 staff accounts
- 1 location
Ideal For: Full-service restaurants, fast food outlets, bars & lounges, hotel restaurants
ENTERPRISE Plan
Tagline: "For chains & franchises"
Price: Custom pricing
Features Included:
- Everything in PROFESSIONAL
- Multi-location support
- Central menu management
- Consolidated cross-location reports
- API access for integrations
- Inventory management
- White-label option
- Dedicated support
- Custom integrations
- SLA guarantees
Limits:
- Unlimited everything
Ideal For: Restaurant chains, franchises, hotel groups, cloud kitchens with multiple brands
1.3 Smart Onboarding & Segmentation
When a new kitchen signs up, 4 simple questions determine the recommended plan:
Question 1: Business Type
- Home Kitchen / Catering → Score: 0
- Food Stall / Vendor → Score: 1
- Restaurant / Cafe → Score: 2
- Chain / Multiple Locations → Score: 3
Question 2: Expected Orders Per Day
- Just starting (1-10/day) → Score: 0
- Getting busy (10-50/day) → Score: 1
- High volume (50-200/day) → Score: 2
- Very high (200+/day) → Score: 3
Question 3: Team Size
- Just me → Score: 0
- 2-5 people → Score: 1
- 6-15 people → Score: 2
- 15+ people → Score: 3
Question 4: Service Styles (multi-select)
- Delivery only → Score: 0
- Pickup only → Score: 0
- Dine-in → Score: +1
- Drive-through → Score: +2
Recommendation Logic:
- Score 0-2: STARTER
- Score 3-5: GROWING
- Score 6-8: PROFESSIONAL
- Score 9+: ENTERPRISE
1.4 Feature Modules (Unlockable)
Each feature is a module that can be toggled on/off based on subscription:
Kitchen Feature Modules:
CORE (Always On - STARTER):
├── basic_menu
├── order_management
├── mobile_notifications
├── basic_payments (mobile money)
├── operating_hours
└── order_history
CHANNELS (GROWING+):
├── pos_access
├── kiosk_channel
├── table_qr
└── whatsapp_bot
PAYMENTS (GROWING+):
├── card_payments
├── kitchen_wallet
├── cash_handling
└── custom_payment_methods
HARDWARE (GROWING+):
├── receipt_printer
├── kitchen_printer
└── cash_drawer
KITCHEN OPS (PROFESSIONAL+):
├── stations
├── kds_display
├── expeditor_mode
└── drive_through
DINE-IN (PROFESSIONAL+):
├── tabs
├── table_management
└── reservations (future)
TEAM (PROFESSIONAL+):
├── staff_accounts
├── roles_permissions
├── discount_limits
└── shift_management
INSIGHTS (PROFESSIONAL+):
├── sales_reports
├── popular_items
├── peak_hours
└── customer_insights
SCALE (ENTERPRISE):
├── multi_location
├── central_menu
├── consolidated_reports
├── api_access
└── white_label
INVENTORY (ENTERPRISE):
├── ingredient_tracking
├── auto_deduction
├── low_stock_alerts
└── supplier_orders
1.5 Usage-Based Upgrade Triggers
The platform monitors usage and suggests upgrades:
STARTER → GROWING Triggers:
- Orders this month > 80 (approaching 100 limit)
- Menu items > 15 (approaching 20 limit)
- Customer requested card payment
- Multiple login attempts (wants staff accounts)
GROWING → PROFESSIONAL Triggers:
- Orders this month > 800 (approaching 1,000 limit)
- Staff accounts maxed at 3
- Searched for: tabs, dine-in, stations, KDS
- Average prep time > 15 minutes
PROFESSIONAL → ENTERPRISE Triggers:
- Asked about second location
- Searched for: multi-location, franchise, API
- Orders this month > 5,000
Part 2: Sales Channels
1.2.1 Channel Overview
JikoXpress Pro supports sixseven distinct sales channels, each with unique characteristics and requirements.characteristics.
POS (Point of Sale)
The primary channel for counter staff and waiters.
Characteristics:
- Staff-operated, requires speed and efficiency
- Supports both immediate payment and pay-later (tab) scenarios
- Full access to all payment methods
- Primary channel for dine-in customers
- Can lookup existing customers or create new ones
- Generates QR codes for customer self-payment via app
Availability: GROWING plan and above
Typical Flow:
- Staff enters items into cart
(local/memory storage) - Identifies customer (
optional - lookup or quick create)optional) - Selects fulfillment type (dine-in with table number)
- Chooses payment timing: Pay Now or Pay Later (Tab)
- Processes payment or opens tab
- Kitchen receives order based on configuration
Kiosk
Self-service terminals for customer-driven ordering.
Characteristics:
- Customer-operated, must be intuitive
- Session-based cart storage
- Limited payment options (QR, USSD, Cash, Card Swipe)
- Primarily for dine-in and pickup customers
physically present - Anonymous or optional login
- Prints order stub for customer
Availability: GROWING plan and above
Typical Flow:
- Customer browses menu on touchscreen
- Adds items to cart with modifications
- Proceeds to checkout
- Selects payment method
- Completes payment (or receives cash payment
slip for counter)slip) - Receives printed stub with order number
- Waits for number to be called
Table QR
Self-ordering from customer's own device by scanning QR code at table.
Characteristics:
- Customer scans QR code placed on their table
- Opens in App (if installed) or Web browser (no app needed)
- No login required - anonymous ordering
- Table number automatically identified from QR
Session-based cart (browser) or linked to app session- Payment: USSD, Cash (pay at counter), App Wallet (if logged in)
- Dine-in only
TypicalAvailability: Flow:
Customer sits at table, scans QR codeQR contains: kitchen ID + table numberSystem detects: Has app? → Open in app : Open web menuCustomer browses menu on their phoneAdds items to cart with modificationsProceeds to checkoutTable number pre-filledplan (from1QR)table), Selects payment method:USSD: Receives prompt, confirms paymentCash: Order sent, customer pays at counterApp Wallet: If logged into app, can use wallet
Order confirmed, sent to kitchenFood delivered to tableGROWING+ (staff knows table number)
QR Code Content:
https://menu.jikoxpress.com/{kitchenSlug}?table=5
or
jikoxpress://menu/{kitchenId}?table=5 (deep link for app)
Web vs App Experience:
| Aspect | Web (No App) | App |
|---|---|---|
| Login | Not required | Optional |
| Cart | Browser session | Persistent |
| Payment | USSD, Cash | USSD, Cash, Wallet |
| Order History | Not available | Available |
| Push Notifications | Not available | Available |
Table QR Advantages:
No app download required (web fallback)Reduces staff workload (customer self-orders)Table number automatic (no errors)Customer orders at their own paceCan add more items easily (scan again or keep session)
Mobile App
Full-featured mobile application for registered users.
Characteristics:
- Requires user account
- Server-side persistent cart
- Supports delivery, pickup, and dine-in
- Preferred payment: App Wallet, USSD
- Push notifications for order status
- Order history and reordering
TypicalAvailability: Flow:All plans (customer-facing)
Conversational ordering via chatbot integration.
Characteristics:
- Customer identified by phone number
- Chatbot-guided ordering process
- Cart maintained in conversation state
- Payment via USSD or payment link
- Supports delivery and pickup only
Availability: GROWING plan and above
Drive-Through
Vehicle-based ordering and pickup.
Characteristics:
ConfirmationDesignedsentforviaspeedWhatsApp-messagetime SLA is critical- Lane-based queue management
- Speaker/mic or digital menu board ordering
- Payment and pickup at windows
- Vehicle tracking by order number
Availability: PROFESSIONAL plan and above
Typical Flow:
- Customer
messagesenterskitchen's WhatsApp numberlane ChatbotPlacesguidesorderthroughatmenuorderselectionpoint (speaker or screen)ConfirmsProceedsordertodetailspayment windowSendsProceedspaymenttooptionspickup(USSD prompt or payment link)Customer completes payment externallywindow- Receives
confirmation message withorderdetailsand exits
Direct Counter Service
Simplified model for small operations where counter is kitchen.
Characteristics:
- Same person takes order and prepares food
- No kitchen routing needed
- Immediate handoff to customer
- May only need receipt, no kitchen ticket
Availability: All plans (default for STARTER)
1.2.2 Channel Comparison Matrix
| Aspect | POS | Kiosk | Table QR | App | Drive-Through | |||
|---|---|---|---|---|---|---|---|---|
| Operator | Staff | Customer | Customer | Customer | Customer | Staff/Screen | ||
| Cart Storage | Session | Session/App | Conversation | Memory | ||||
| Customer |
Required | Phone | Optional | |||||
| Pay Later (Tab) | Yes | No | No | No | No | |||
| No | ||||||||
| Fulfillment |
All | Dine-in, Pickup | Dine-in |
All | Delivery, Pickup | Drive-Through | ||
| Speed Priority | Critical | High | Normal | Normal | Normal | Critical | ||
| Normal | Normal | Normal | Normal | Normal | Critical | |||
| Min Plan | GROWING | GROWING | STARTER | All | ||||
*Wallet only available if customer has app and is logged in
Part 2:3: Order & Tab Architecture
2.3.1 Core Concept: Single Source of Truth
All channels ultimately create Orders. The Order is the central entity that:
- Tracks what was purchased
- Connects to payment records
- Drives kitchen operations
- Generates receipts and reports
Key Principle: Cart is an unpersisted Order draft. Checkout persists the Order and initiates payment.
2.3.2 Order Lifecycle
CREATED → PENDING_PAYMENT → CONFIRMED → PREPARING → READY → COMPLETED
↓
CANCELLED
State Definitions:
| Status | Description | Kitchen Visible | Payment Status |
|---|---|---|---|
| CREATED | Order recorded but not yet submitted | No | Not started |
| PENDING_PAYMENT | Awaiting async payment confirmation | Depends on config | In progress |
| CONFIRMED | Payment complete or tab |
Yes | Paid or Deferred |
| PREPARING | Kitchen actively working on order | Yes | N/A |
| READY | Order complete, waiting for |
Yes | N/A |
| COMPLETED | Customer received order | No | N/A |
| CANCELLED | Order cancelled before completion | No | Refunded if paid |
2.3.3 Payment Status (Separate from Order Status)
Orders track payment independently:
| Payment Status | Description |
|---|---|
| UNPAID | No payment received (tab scenario) |
| PENDING | Async payment initiated, awaiting confirmation |
| PARTIAL | Some payment received (future feature) |
| PAID | Full payment received |
| REFUNDED | Payment returned to customer |
This separation allows:
Kitchen to prepare food while payment is UNPAID (tab scenario)Order to be CONFIRMED but payment PENDING (async payment)Clear tracking for end-of-day reconciliation
2.3.4 Tab System (Pay Later)
Tabs enable the "eat now, pay later" model common in dine-in scenarios.
Availability: PROFESSIONAL plan and above
What is a Tab?
- A container for one or more orders at a table
- Remains open until customer is ready to pay
- Aggregates totals across all orders
- Single payment closes the entire tab
Tab Lifecycle:
[No Tab] → OPEN → CLOSED
↑
(orders can be added while OPEN)
Tab Creation:
Auto-created when first "Pay Later" order placed for a tableOne open tab per table per dayIdentified by: Kitchen + Table Number + Date + Status
Tab Rules:
- Customer can add more orders to open tab
(new orders, not modifying existing) - Each order goes to kitchen independently
- Tab shows running total of all orders
- Discounts can be applied at tab level before closing
- Single payment closes tab and marks all orders as PAID
Why Multiple Orders per Tab (not modifying single order):Tab:
- Kitchen already received and is preparing original order
- New items create new kitchen tickets
(clear for kitchen staff) - Each order has clean, independent lifecycle
Item-level status tracking remains accurate- Simplifies kitchen display and ticket management
2.3.5 KwaFulfillment Deni (Credit/Debt System)Types
A controlled feature allowing trusted customers to take food on credit and pay later - days or weeks after consumption.
Important: This is NOT the same as Tab (pay later same day). Kwa Deni is actual debt that extends beyond the restaurant visit.
2.5.1 Feature Characteristics
Availability:
POS channel ONLYNOT available on Kiosk, App, or WhatsAppHidden by default - not visible in standard POS interfaceMust be explicitly enabled by kitchen adminRequires special permission for staff to use
Security Controls:
Kitchen-level setting to enable/disable entirelyStaff-level permission required (not all staff can offer credit)Customer must be registered (no anonymous credit)Credit limit per customer (optional)Manager approval option for amounts above threshold
2.5.2 Kwa Deni vs Tab Comparison
| Handoff Point | |||
|---|---|---|---|
| Table | |||
| Counter | |||
| Door | |||
2.5.3
KwaPart Deni4: Drive-Through Architecture
4.1 Overview
Drive-through is modeled as both a channel and a fulfillment type, allowing it to integrate seamlessly with the existing order system while supporting its unique requirements.
4.2 Drive-Through Flow
Creating Debt:
1.LANE_ENTRY Customer→ ordersORDER_POINT food→ PAYMENT_WINDOW → PICKUP_WINDOW → EXIT
↓ ↓ ↓ ↓
(registereddetected) customer required)
2. Staff completes (order entry
3. At payment, staff selects "Kwa Deni" optioncreated) (if permitted)
4. System checks:
- Is feature enabled for this kitchen?
- Does staff have credit permission?
- Is customer registered?
- Is customer within credit limit?payment) (if limits configured)
- Does amount require manager approval?
5. If manager approval needed:
- Manager enters PIN or approves
6. Order created with:
- paymentStatus: CREDIT
- Linked to customer's debt account
7. Kitchen receives order normally
8. Customer leaves without paying
9. Debt recorded against customerhanded)
Paying Off Debt:
1. Customer returns to pay (or staff initiates)
2. Staff looks up customer's debt balance
3. System shows:
- Total outstanding debt
- Individual unpaid orders (optional detail)
- Oldest debt date
4. Customer can pay:
- Full amount (clears all debt)
- Partial amount (reduces debt balance)
- Specific orders (if itemized payment enabled)
5. Payment processed
6. Debt balance updated
7. Receipt shows: Payment toward credit balance
2.5.4 Debt Tracking
Customer Debt Account:
Total outstanding balanceList of unpaid ordersPayment historyCredit limit (if set)Last payment dateOldest unpaid order date
Debt Order Properties:
Standard order propertiespaymentStatus: CREDITdebtCreatedAt: When debt was createddebtDueDate: Optional due datedebtApprovedBy: Staff/manager who approved
Debt Payment Properties:
Amount paidPayment methodApplied to which orders (or general balance)Remaining balance after payment
2.5.53 Configuration Options
Kitchen Level:
Kwa DeniDrive-Through Settings:
├──
enabled: false (defaultdefault)
numberOfLanes: 1-4
orderPointType:
- hiddenSPEAKER_MIC entirely)# ├──Staff requireManagerApproval:takes true/falseorder ├──via approvalThreshold:speaker
Amount- aboveDIGITAL_MENU_BOARD which# managerCustomer mustself-orders approveon ├──screen
allowPartialPayment:- true/falseBOTH ├──# showInPOS:Screen falsewith (evenstaff ifbackup
enabled,windowConfiguration:
can- beSINGLE_WINDOW hidden# fromPay mainand UI)pickup ├──at defaultCreditLimit:same 0window
(no- limit)SEPARATE_WINDOWS or# amountPayment └──window, debtAgingAlertDays:then 30pickup (alertwindow
forvehicleTracking:
old- debt)ORDER_NUMBER # Customer given number, called at window
- MANUAL # Staff tracks position manually
- TIMER_BASED # System estimates based on avg times
Staff4.4
Level:
Staff Credit Permission:
├── canOfferCredit: falseOrder (default)when ├──fulfillment maxCreditAmount:= MaximumDRIVE_THROUGH):
singlelaneNumber: transaction1-4
└──vehicleDescription: requiresApprovalAbove:"Red AmountToyota" requiring(optional)
managerorderPointTimestamp: overridewhen order was taken
paymentWindowTimestamp: when payment completed
pickupWindowTimestamp: when order handed off
Customer4.5
Level:
Customer Credit Settings:
├── creditEnabled: true/false (can this customer use credit)
├── creditLimit: Maximum outstanding balance allowed
├── currentBalance: Current debt amount
└── creditStatus: GOOD_STANDING | SUSPENDED | BLOCKED
2.5.6 Business Rules
Who Can Receive Credit:
Must be registered customer with verified identity- Kitchen
admin can whitelist specific customers Optional: Require minimum purchase historyOptional: Credit application/approval process
Credit Limits:
Global default limit (kitchen setting)Per-customer override (higherTicket fortrusted, lower for new)Can be zero (unlimited) for corporate accounts
When Credit is Blocked:
Customer exceeds credit limitCustomer has debt older than X daysCustomer status set to SUSPENDED or BLOCKEDStaff attempts without permission
Partial Payments:
If enabled, customer can pay any amount toward balancePayment applied to oldest debt first (FIFO)Or customer/staff can specify which orders to pay
2.5.7 Reporting & Alerts
Debt Reports:
Total outstanding debt (all customers)Debt by customerAging report (0-30 days, 31-60 days, 60+ days)Debt created today/this week/this monthPayments received toward debt
Alerts:
Customer approaching credit limitCustomer exceeding credit limitDebt aging past thresholdLarge credit transaction (above threshold)
2.5.8 UI Considerations
Kwa Deni option NOT visible in standard payment screenAccess via: Settings menu, long-press, or special navigationPrevents accidental usePrevents customer seeing and requesting it
When Visible:
Only shown after admin enables AND staff has permissionClear visual distinction from regular paymentWarning/confirmation before proceedingShows customer's current balance before adding more
2.5.9 Receipt for Credit Transaction
Drive-Through
================================
JIKOXPRESSORDER KITCHEN#47
================================Lane Receipt2 #:| R-20241229-0052DRIVE-THROUGH
Date:12:34 29-Dec-2024PM 14:30| Customer: John Doe03-Jan-2026
--------------------------------
ITEMS:>> HOT LINE <<
1x Burger
12,000- 1xNo onions
- Extra cheese
2x Fries
5,000- Large
--------------------------------
TOTAL:⚡ 17,000
================================
PAYMENT: CREDIT (Kwa Deni)
Approved by: Manager Jane
Previous Balance: 25,000
This Order: 17,000DRIVE-THROUGH -------------------------------- NEWSPEED BALANCE DUE: 42,000
================================
Payment due upon request
================================
2.5.10 Receipt for Debt Payment
================================
JIKOXPRESS KITCHEN
================================
Receipt #: R-20241229-0067
Date: 29-Dec-2024 16:45
Customer: John Doe
--------------------------------
PAYMENT TOWARD CREDIT BALANCE
Previous Balance: 42,000
Payment (Cash): -20,000
--------------------------------
REMAINING BALANCE: 22,000
================================
Thank you!PRIORITY
================================
2.4.6 OrderDrive-Through vs Tab vs Kwa Deni Decision FlowMetrics
Which channel?
├── POS: How will customer pay?
│ ├── Pay Now: Create Order, process payment immediately
│ ├── Pay Later (Tab): Find/create Tab, Order linkedDue to Tabthe │critical │nature └──of Customerspeed MUSTin paydrive-through:
beforeTracked leavingMetrics:
│
└──- Average
Kwatime Deniper vehicle
- Time at each station (
Credit):
│ ├── Check: Feature enabled? Staff permitted? Customer registered?
│ ├── If all yes: Create Order with paymentStatus: CREDIT
│ └── Customer can leave, pays another day
│
├── Kiosk: Create Order, require payment (no Tab, no Kwa Deni)
│ └── Cash option: Kitchen timing configurable
│
├── Table QR: Create Order, require payment (no Tab, no Kwa Deni)
│ ├── USSD/Wallet: Processorder, payment, confirmpickup)
order- Orders
│per └──hour Cashper option:lane
Kitchen- Peak
timinghour configurableanalysis
│
├──Alerts:
App:
Create- Order
Order,taking require> immediate2 paymentminutes
│- Payment
└──processing WhatsApp:> Create1 Order,minute
require- Pickup
immediatewait payment>
3 minutes
Part 3:5: Checkout Flow
3.5.1 Universal Checkout Principles
Regardless of channel, checkout always involves:
- Identify Items - What is being ordered
- Identify Customer - Who is ordering (optional for some channels)
- Identify Fulfillment - How order will be fulfilled
- Calculate Totals - Items + taxes + fees - discounts
- Select Payment - How customer will pay
- Process Payment - Execute payment or defer
- Create/Confirm Order - Finalize and notify kitchen
5.2 Default Flow (Zero Configuration)
If a kitchen sets nothing, this is what happens:
Default Configuration:
fulfillmentTypes: [PICKUP]
paymentTiming: ON_PAYMENT_COMPLETE
orderRouting: DISPLAY_ONLY
kitchenNotification: DISPLAY
printOnConfirm: true
customerStub: true
tabsEnabled: false
Default Experience:
- Kitchen signs up
- Sets their menu
- Immediately can take orders via mobile app
- Customer pays → Kitchen sees order on screen → Prepares → Calls number → Customer picks up
No stations, no tabs, no printers required. Just works.
5.3 Channel-Specific Checkout Flows
POS Checkout (Pay Now)
1. Staff finalizes cart
2. System creates checkout session
3.2 Staff selects customer (optional) and fulfillment
4. System calculates totals
5. Staff selects payment method
6. System processes payment
7. Order created with status CONFIRMED
8. Kitchen notified
9. Receipt printed
POS Checkout (Pay Later / Tab)
1. Staff finalizes cart
2. Staff selects "Pay Later" and enters table number
3. System finds/creates Tab for table
4. Order created with status CONFIRMED, paymentStatus UNPAID
5. Order linked to Tab
6. Kitchen notified immediately
7. Tab remains open for additional orders
[Later, when customer ready to pay]
8. Staff retrieves Tab for table
9. Staff applies discounts if needed
10. Staff processes payment
11. Tab closed, all orders marked PAID
12. Receipt printed
Drive-Through Checkout
1. Customer arrives at order point (lane assigned)
2. Staff/screen takes order
3. Order created with fulfillment DRIVE_THROUGH
4. Customer proceeds to payment window
5. Payment processed
6. Order status → CONFIRMED, sent to kitchen
7. Customer proceeds to pickup window
8. Kitchen prepares (priority queue)
9. Order handed to customer
10. Order status → COMPLETED
Kiosk / Table QR Checkout
1. Customer finalizes cart
2. System creates checkout session
3. Customer selects fulfillment
4. Customer selects payment method:
- USSD: Receives prompt, confirms
- Cash: "Pay at counter" displayed
5. On payment confirmation:
- Order confirmed
- Kitchen notified
- Stub printed (kiosk) or shown on screen (Table QR)
5.4 Checkout Session
A checkout session provides:
- Temporary holding state during checkout
process - Protection against abandoned checkouts
- Support for async payment flows
Prevention of race conditions
Session Properties:
Expires after configured time (e.g., 15 minutes)Contains cart snapshot at checkout initiationLinks to Order once createdTracks payment attempts and status
Session States:
| Status | Description |
|---|---|
| ACTIVE | Checkout in progress |
| COMPLETED | Payment successful, order created |
| EXPIRED | Session timed out (15 min default) |
| CANCELLED | User or system cancelled |
3.3 Channel-Specific Checkout Flows
POS Checkout (Pay Now)
1. Staff finalizes cart
2. System creates checkout session
3. Staff selects customer (optional) and fulfillment
4. System calculates totals and shows available payment methods
5. Staff selects payment method
6. System processes payment
7. Order created with status CONFIRMED, paymentStatus PAID
8. Kitchen notified (based on configuration)
9. Receipt printed
POS Checkout (Pay Later / Tab)
1. Staff finalizes cart
2. Staff selects "Pay Later" and enters table number
3. System finds existing open Tab for table OR creates new Tab
4. Order created with status CONFIRMED, paymentStatus UNPAID
5. Order linked to Tab
6. Kitchen notified immediately
7. Customer stub printed (optional)
8. Tab remains open for additional orders
[Later, when customer ready to pay]
9. Staff retrieves Tab for table
10. System shows all orders and total
11. Staff applies discounts if needed
12. Staff processes payment
13. Tab closed, all orders marked PAID
14. Receipt printed
Kiosk Checkout
1. Customer finalizes cart on screen
2. System creates checkout session
3. Customer selects fulfillment (dine-in table or pickup)
4. System shows available payment methods (QR, USSD, Cash, Card)
5. Customer selects payment method:
- QR: Display QR code, wait for app scan confirmation
- USSD: Customer enters phone, receives prompt, confirms
- Cash: Print "pay at counter" slip, staff confirms manually
- Card: Process via terminal integration
6. On payment confirmation:
- Order created with status based on kitchen config
- Kitchen notified (based on configuration)
- Order stub printed for customer
App Checkout
1. User reviews cart in app
2. User initiates checkout
3. System creates checkout session
4. User selects/confirms delivery address or pickup
5. System calculates totals including delivery fee if applicable
6. User selects payment method (Wallet, USSD, saved methods)
7. User confirms payment
8. On payment confirmation:
- Order created with status CONFIRMED
- Kitchen notified
- Push notification sent to user
- User sees order tracking screen
WhatsApp Checkout
1. Chatbot summarizes order and total
2. Chatbot asks for fulfillment preference (delivery/pickup)
3. If delivery: Chatbot collects/confirms address
4. Chatbot presents payment options:
- USSD: Sends prompt to customer's phone
- Payment Link: Sends clickable payment link
5. Customer completes payment externally
6. Webhook receives payment confirmation
7. Order created with status CONFIRMED
8. Chatbot sends confirmation message with order details
9. Kitchen notified
Table QR Checkout (Web)
1. Customer scans QR code at table
2. Web menu opens in browser (no app needed)
3. Customer browses and adds items to cart
4. Customer taps checkout
5. System creates checkout session
6. Table number pre-filled from QR data
7. Customer selects payment method:
- USSD: Enter phone number, receive prompt, confirm
- Cash: Select "Pay at Counter"
8. For USSD:
- Payment initiated
- Wait for confirmation
- Order confirmed, sent to kitchen
- Customer sees confirmation with order number
9. For Cash:
- Order created with paymentStatus PENDING_CASH
- Kitchen notified (based on config: before or after cash confirmed)
- Customer shown: "Please pay [amount] at counter"
- Staff confirms cash received
- Order fully confirmed
10. Food delivered to table (staff knows table from order)
Table QR Checkout (App)
1. Customer scans QR code at table
2. Deep link opens app (if installed)
3. Table number passed to app session
4. Customer browses menu in app
5. Adds items to cart (app cart, persistent if logged in)
6. Customer taps checkout
7. Table number pre-filled from QR
8. Customer selects payment method:
- App Wallet (if logged in and has balance)
- USSD
- Cash (pay at counter)
9. Payment processed or cash selected
10. Order confirmed, sent to kitchen
11. Push notification when ready (if logged in)
12. Food delivered to table
3.4 Checkout Session API Concept
Create Session:
Input:
- items (menuId, quantity, modifiers, notes)
- channel (POS, KIOSK, APP, WHATSAPP)
- customerId (optional)
- fulfillmentType (DINE_IN, PICKUP, DELIVERY)
- tableNumber (for dine-in)
- deliveryAddress (for delivery)
Output:
- sessionId
- summary (items, subtotal, taxes, fees, total)
- availablePaymentMethods (filtered by channel and kitchen config)
- expiresAt
Process Payment:
Input:
- paymentMethod
- paymentDetails (method-specific data)
- payLater (boolean, POS only)
- tabId (if adding to existing tab)
Output:
- status (COMPLETED, PENDING, DEFERRED)
- orderId
- tabId (if tab created or used)
- paymentInstructions (for async: QR data, USSD prompt, link)
Part 4:6: Payment Architecture
4.6.1 Payment Method Categories
Immediate Settlement
Payment completes instantly within the transaction.
| Method | Description | Channels |
|---|---|---|
| Cash | Physical |
POS, Kiosk |
| Card Swipe | Card terminal |
POS, Kiosk |
| Kitchen Wallet | POS | |
| App Wallet | POS ( |
Asynchronous Settlement
Payment initiated but confirmation arrives later via callback/webhook.
| Method | Description | Channels |
|---|---|---|
| Mobile Money (USSD) | Customer |
All |
| QR Scan (App Wallet) | POS displays |
POS |
| Payment Link | Customer clicks |
|
Deferred Settlement
No payment now, to be collected later.
| Method | Description | Channels |
|---|---|---|
| Pay Later (Tab) | Opens tab, |
POS only |
6.2 Payment Method by Plan
| Method | STARTER | GROWING | PROFESSIONAL | ENTERPRISE |
|---|---|---|---|---|
| ✓ | ✓ | |||
| Cash | - | ✓ | ✓ | ✓ |
| Card | - | ✓ | ✓ | ✓ |
| Kitchen Wallet | - | ✓ | ✓ | ✓ |
| App Wallet | ✓ | ✓ | ✓ | ✓ |
| Pay Later ( |
- | - | ✓ | ✓ |
| Custom Methods | - | - | ✓ | ✓ |
4.2 Payment Method Configuration
Each kitchen configures which payment methods are available and for which channels.
Configuration Properties:
Method type and nameEnabled/disabled statusWhich channels can use this methodWhether manual confirmation is requiredMethod-specific configuration (Lipa number, bank details, etc.)
Example Configurations:
Fast Food Restaurant:
Cash: POS, KioskCard: POS, KioskMobile Money: All channelsApp Wallet: POS (QR), AppPay Later: Disabled
Fine Dining Restaurant:
Cash: POSCard: POSKitchen Wallet: POS (for regulars)Pay Later: POS (enabled)Mobile Money: Disabled
4.6.3 Payment Processing Flow
Immediate Payment Flow
1. Customer/staff selects payment method
2. System validates method is available for channel
3. For Wallet: Check sufficient balance
4. Process payment:
- Wallet: Deduct balance, record transaction
- Cash: Mark as received, staff confirms
- Card: Send to terminal, await response
5. On success: Update payment status to COMPLETED
6. Create payment record
7. Proceed with order confirmation
Async Payment Flow
1. Customer/staff selects async payment method
2. System creates payment record with status PENDING
3. System generates payment instructions:
- QR: Generate QR code data
- USSD: Initiate USSD push to customer phone
- Link: Generate unique payment URL
4. Return instructions to client for display
5. Customer completes payment externally
6. Payment provider sends webhook/callback
7. System validates callback authenticity
8. Update payment status to COMPLETED
9. Update order status to CONFIRMED
10. Trigger kitchen notification
Deferred Payment Flow (Tab)
1. Staff selects "Pay Later"
2. System creates/finds Tab for table
3. Order created with paymentStatus UNPAID
4. Order linked to Tab
5. Kitchen proceeds with preparation
6. [Customer adds more orders - repeat steps 2-5]
7. When ready to close:
- Staff retrieves Tab
- System calculates total across all orders
- Staff applies discounts if needed
- Staff processes payment (any immediate method)
- Tab status set to CLOSED
- All linked orders set to paymentStatus PAID
4.4 Kitchen Wallet
A prepaid balance system for loyal customers, managed by the kitchen.customers.
Characteristics:
- Issued and managed by individual kitchen
- Not platform-wide (unlike App Wallet)
- Can be topped up via cash at counter
- Used for quick payment without cash handling
Balance visible to POS staff during checkout
Use Cases:
- Regular customers with running credit
- Corporate accounts
- Staff meals
- VIP customers
4.5 Partial Payments
Current Recommendation: Not supported in V1
Rationale:
Adds significant complexity to payment trackingEdge cases around partial failuresReconciliation becomes more difficultRare in actual restaurant operations
Future Consideration:
Schema should support multiple payment records per order/tabUI restricts to single payment method initiallyCan be enabled for POS dine-in scenarios later
4.66.4 Discount Handling
Discounts can be applied at checkout to reduce the total.
Discount Types:
- Percentage: Reduce total by X%
- Fixed Amount: Reduce total by fixed value
Discount Application Points:
Item level: Discount on specific menu itemOrder level: Discount on order subtotalTab level: Discount on tab total (before final payment)
Staff Discount Limits:Limits (PROFESSIONAL+):
- Each staff role has maximum discount percentage
allowed - Exceeding limit requires manager approval (
PIN or override)PIN) - All discounts recorded with who applied and
whoapproved
Example Discount Flow:
Tab total: 50,000
Staff applies 10% discount (within their 10% limit)
New total: 45,000
Customer pays: 45,000 ✓
Tab total: 50,000
Staff needs 20% discount (exceeds their 10% limit)
System prompts for manager PIN
Manager enters PIN
Discount approved and recorded
New total: 40,000
Customer pays: 40,000 ✓
Part 5:7: Kitchen Operations
5.7.1 Operation Models
Model A: Direct Counter Service (Default for STARTER)
Order Confirmed → Same person prepares → Immediate handoff
RestaurantsNo operatekitchen differently.routing, Theno systemprinters, mustno support multiple models.complexity.
Model A:B: Paper Ticket Kitchen
Traditional model with physical tickets.
Order Confirmed → Print ticket → Hand-carry to kitchen →
Kitchen works from paper
→ Calls out order number
Characteristics:
Reliable,reliable, no technologydependencyinkitchenKitchen staff familiar with paper workflowRequires physical ticket transportLimited real-time status visibility
Model B:C: Kitchen Display System (KDS)
Modern paperless kitchen.
Order Confirmed → Appears on kitchen screen →
Kitchen marks items done on screen → Customer notified
Characteristics:
Real-time order visibilityItem-level status trackingNo paper wasteRequires reliable network and hardware
Model C: Hybrid
Kitchen uses both screens and paper.
Order Confirmed → Appears on screen AND prints ticket → ScreenKitchen formarks overview, paper for line cooksdone
Characteristics:Real-time visibility, paperless, item-level tracking.
Best of both worldsRedundancy if one system failsHigher operational cost
Model D: Expeditor ControlledHybrid
Expeditor (senior staff) controls kitchen flow.
Order Confirmed → GoesScreen toAND expeditorpaper
Best of both, redundancy if one fails.
Model E: Expeditor Controlled (Fine Dining)
Order Confirmed → Expeditor screen → Expeditor "fires"fires items when ready →
Station receives items in controlled sequence
Characteristics:
- Pacing control for multi-course
meals Prevents kitchen overwhelmRequires trained expeditorBest for fine dining
Model E: Direct Counter Service
No kitchen routing needed.meals.
Order Confirmed → Same person prepares and serves →
Immediate handoff to customer
Characteristics:
Simplest modelFor small operationsCounter person sees order on POS screen
5.7.2 Kitchen Stations (PROFESSIONAL+)
Larger kitchens have multiple stations, each responsible for certain menu items.stations:
Common Stations:
- Hot Line: Grills, fryers, sauté
- Cold Line: Salads,
desserts, cold appetizersdesserts - Bar: Beverages, cocktails
- Bakery: Bread, pastries
- Expeditor: Final
assembly, quality checkassembly
Station Routing:
Example Order Routing:Example:
Order #47:
├── Burger → Hot Line
├── Caesar Salad → Cold Line
├── Beer → Bar
└── Cheesecake → Cold Line
Hot Line receives: 1x Burger
Cold Line receives: 1x Caesar Salad, 1x Cheesecake
Bar receives: 1x Beer
5.7.3 Kitchen Timing Configuration
Critical Decision: When does kitchen receive the order?
| Setting | Description | Use Case |
|---|---|---|
| ON_ORDER_CREATED | Before payment | Trusted dine- |
| ON_PAYMENT_COMPLETE | After payment | Kiosk, |
| MANUAL | Staff triggers | Special |
ConfigurationDefault by Channel:
Kitchen can set different timing for different channels:
- POS Dine-in: ON_ORDER_CREATED
(trusted customers) - POS Pickup: ON_PAYMENT_COMPLETE
(ensure payment) - Kiosk: ON_PAYMENT_COMPLETE
or configurable - Table QR: ON_PAYMENT_COMPLETE
or configurable (like Kiosk) - App: ON_PAYMENT_COMPLETE
- WhatsApp: ON_PAYMENT_COMPLETE
Table QR Cash Special Case:
Similar to Kiosk, when Table QR customer selects cash payment:
KITCHEN_FIRST: Order goes to kitchen, customer pays at counterPAYMENT_FIRST: Order waits until staff confirms cash receivedON_PAYMENT_COMPLETE
Kitchen configures based on trust model. Since table is known, KITCHEN_FIRST is often acceptable.
Kiosk Cash Special Case:
When kiosk customer selects cash payment:
KITCHEN_FIRST: Order goes to kitchen, customer pays at counterPAYMENT_FIRST: Order waits until staff confirms cash received
This is kitchen-configurable based on their trust model and layout.
5.7.4 Kitchen Configuration Summary
Kitchen Operation Settings:
├──orderRouting:
Order Routing Mode
│ ├──- DIRECT_TO_STATIONS
(items go directly to assigned stations)
│ ├──- EXPEDITOR_CONTROLLED
(expeditor fires items)
│ ├──- DISPLAY_ONLY
(no auto-print, screen only)
│ └──- NONE (counter service,service no- kitchendefault)
routing)notificationMethod:
│
├── Notification Method
│ ├──- DISPLAY (KDSKDS)
screens)
│ ├──- PRINTER
(paper tickets)
│ ├──- BOTH
(screen and paper)
│ └──- NONE (counter service)service │- ├──default)
TimingtimingByChannel:
by Channel
│ ├── POS Dine-in:pos_dine_in: ON_ORDER_CREATED | ON_PAYMENT_COMPLETE
│ ├── POS Pickup: ON_ORDER_CREATED |pos_pickup: ON_PAYMENT_COMPLETE
│ ├── Kiosk:kiosk: ON_PAYMENT_COMPLETE
| configurable
│ ├── Table QR:table_qr: ON_PAYMENT_COMPLETE
| configurable
│ ├── App:app: ON_PAYMENT_COMPLETE
│ └── WhatsApp:whatsapp: ON_PAYMENT_COMPLETE
│drive_through: ├──ON_PAYMENT_COMPLETE
KioskkioskCashFlow:
Cash Flow
│ ├──- KITCHEN_FIRST (prepare before paymentcash confirmed)
│ └──- PAYMENT_FIRST (wait for cash confirmation)- │
└── Table QR Cash Flow
├── KITCHEN_FIRST (prepare before payment confirmed)
└── PAYMENT_FIRST (wait for cash confirmation)default)
5.5 Kitchen Display System (KDS)
For kitchens using digital displays.
Display Features:
Shows pending orders for stationColor coding by age (green → yellow → red)Touch to mark item/order completeSound alerts for new ordersFilter by stationPriority flagging for rush orders
Display Layout Example:
┌─────────────────────────────────────────────────────────────┐
│ HOT LINE 2:34 PM │
├─────────────────────────────────────────────────────────────┤
│ #47 │ #48 │ #49 │ #51 │
│ Table 5 │ Pickup │ Table 2 │ Delivery │
│ 2 min ago │ 5 min ago │ 1 min ago │ Just now │
│─────────────│──────────────│──────────────│────────────────│
│ 1x Burger │ 2x Wings │ 1x Steak │ 3x Burger │
│ -no onion │ 1x Burger │ 1x Fish │ 2x Wings │
│ 2x Fish │ │ │ 1x Salad │
│ │ │ │ │
│ [START] │ [WORKING] │ [START] │ [START] │
└─────────────────────────────────────────────────────────────┘
KDS Configuration:
Which stations to show on this displayAlert thresholds (warning at X minutes, critical at Y minutes)Sort order (oldest first, priority first)Sound settings
5.6 Customer Facing Display
Shows customers their order status.
┌─────────────────────────────────────────────────────────────┐
│ NOW SERVING │
│ │
│ #45 #46 │
├─────────────────────────────────────────────────────────────┤
│ PREPARING │
│ │
│ #47 #48 #49 #50 #51 │
└─────────────────────────────────────────────────────────────┘
Features:
Shows orders ready for pickupShows orders being preparedOptional voice announcementUpdates in real-time
Part 6:8: Printing Architecture
6.8.1 Print Types
| Print Type | When | Where | Purpose |
|---|---|---|---|
| Kitchen Ticket | Order |
Kitchen |
|
| Customer Receipt | Payment completed | POS printer | Proof of purchase |
| Bill/Check | Customer requests | POS printer | |
| Order Stub | |||
| Void Notice | Item voided | Kitchen printer |
6.8.2 Kitchen Ticket Example
Sent to kitchen when order is ready for preparation.
Content:
Order number (large, prominent)Table number or pickup/delivery indicatorFulfillment typeTimestampStation name (if station-specific)Items with quantitiesModifiers and special instructionsServer/staff name
Example Kitchen Ticket:
================================
ORDER #47
Table 5 | Dine-in
12:34 PM | 29-Dec-202403-Jan-2026
--------------------------------
>> HOT LINE <<
1x Burger
- No onions
- Extra cheese
2x Fish & Chips
- One mild spice
--------------------------------
Server: John
================================
Station-Specific Printing:
When kitchen has multiple stations:
Items grouped by assigned stationEach station gets ticket with only their itemsSame order number on all tickets for coordination
Add-On Ticket (for tab additional orders):
================================
** ADD TO #47 **
Table 5 | Dine-in
12:52 PM | 29-Dec-2024
--------------------------------
>> HOT LINE <<
1x Chicken Wings
--------------------------------
================================
Void Ticket:
================================
** VOID FROM #47 **
Table 5
--------------------------------
>> HOT LINE <<
VOID: 1x Burger
Reason: Customer changed mind
Approved: Manager Jane
================================
6.8.3 Customer Receipt Example
Printed after payment completion.
Content:
Business information (name, address, tax ID)Receipt number (for accounting)Date and timeStaff who processedItemized list with pricesModifiers shown with itemsSubtotalDiscounts (shown separately)Tax breakdownTotalPayment method and amountChange given (for cash)Footer message (customizable)
Example Receipt:
================================
JIKOXPRESS KITCHEN
123 Main Street, Dar
Tel: +255 123 456
TAX ID: 12345678
================================
Receipt #: R-20241229-20260103-0047
Date: 29-Dec-202403-Jan-2026 13:45
Table: 5
Server: John
Cashier: Mary
--------------------------------
ITEMS:
1x Burger 12,000
Extra cheese 1,500
2x Fish & Chips 30,000
1x Chicken Wings 8,000
1x Caesar Salad 7,500
2x Beer 8,000
--------------------------------
Subtotal: 67,00043,500
Discount (10%): -6,700
--------------------------------4,350
VAT (18%): 10,8547,047
--------------------------------
TOTAL: 71,15446,197
================================
PAYMENT:
CashMobile 75,000Money Change:46,197
3,846Ref: MP12345678
================================
Thank you!
Please come again
** WiFi: kitchen2025 **
================================
6.8.4 Bill/Check (Pre-Payment)
Given to customer before payment when they ask "Can I have the bill?"
Content:
Business nameTable identifierDate/timeItems and pricesSubtotalTaxTotal dueNote: "This is not a receipt"
Example Bill:
================================
JIKOXPRESS KITCHEN
================================
TABLE 5 - BILL
29-Dec-2024 13:30
--------------------------------
1x Burger 12,000
Extra cheese 1,500
2x Fish & Chips 30,000
1x Chicken Wings 8,000
1x Caesar Salad 7,500
2x Beer 8,000
--------------------------------
Subtotal: 67,000
VAT (18%): 12,060
--------------------------------
TOTAL DUE: 79,060
================================
Please pay at counter
This is not a receipt
================================
6.5 Order Stub
Given to customer at kiosk or counter for pickup reference.
Content:
Order number (large)Items summary (optional based on config)Pickup locationEstimated wait time (optional)
Example Stub:
================================
ORDER #47
================================
Your order is being
prepared!
--------------------------------
1x Burger
2x Fish & Chips
Pickup at: COUNTER A
Wait time: ~10 mins
--------------------------------
Show this stub when your
number is called
#47
================================
6.6 Print Trigger Configuration
Kitchens configure what prints when.
Configurable Triggers:
Configuration allows:
Different triggers for different channelsDifferent triggers for different fulfillment typesEnable/disable specific prints
Example Configurations:
Fast Food:
ON PAYMENT_COMPLETE for KIOSK:
→ Print kitchen ticket
→ Print customer stub
→ Notify KDS
ON PAYMENT_COMPLETE for POS:
→ Print kitchen ticket
→ Print receipt
→ Notify KDS
Fine Dining:
ON ORDER_CONFIRMED for POS (dine-in):
→ Print kitchen ticket (payment comes later)
ON TAB_CLOSED for POS:
→ Print receipt
ON BILL_REQUESTED:
→ Print bill
6.7 Print Job ManagementArchitecture
Print Job Lifecycle:
PENDING → CLAIMED → PRINTED
↓
FAILED
Print Job Properties:
Order/Tab referencePrint type (ticket, receipt, stub, etc.)Target printer or printer typeContent (structured data)StatusClaimed by (which device)Timestamps
Print Delivery Models:
Model A: Backend Direct Print
Backend sends directly to network printersWorks for cloud-connected printersHarder for local USB/Bluetooth printers
Model B:Model: Client Pull (Recommended)
Backend creates print jobs with contentPOS/Kiosk app polls for pending jobsApp prints locallyApp updates job statusWorks with local printersSupports offline queuing
Client Pull Flow:
1. Order confirmed
2. Backend creates PrintJob (status: PENDING)
3. POS app polls: GET /print-jobs?status=PENDING
4. POS app claims job: POST /print-jobs/{id}/claimjob
5. POS app formatsprints content for local printerlocally
6. POS app printsmarks 7. POS app updates: POST /print-jobs/{id}/complete
6.8
Works Printwith Contentlocal StructureUSB/Bluetooth
Printprinters, jobssupports containoffline structured data, not pre-formatted text. Client renders based on printer capabilities.queuing.
Example Kitchen Ticket Content:
{
"type": "KITCHEN_TICKET",
"orderNumber": 47,
"orderType": "DINE_IN",
"tableNumber": "5",
"station": "Hot Line",
"timestamp": "2024-12-29T12:34:00",
"server": "John",
"isAddition": false,
"isVoid": false,
"items": [
{
"name": "Burger",
"quantity": 1,
"modifiers": ["No onions", "Extra cheese"],
"notes": null
},
{
"name": "Fish & Chips",
"quantity": 2,
"modifiers": ["One mild spice"],
"notes": null
}
]
}
Client app uses kitchen's print template settings to render this appropriately for their printer.
6.9 Print Template Configuration
Each kitchen can customize print appearance.
Template Settings:
Header text (business name, address)Footer text (thank you message, WiFi password)Show/hide logoPaper width (58mm or 80mm)Font size preferencesContent options (show prices on kitchen ticket, etc.)
Part 7:9: Numbering Systems
7.9.1 Order Number
- Purpose: Kitchen identification, customer
reference,reference - Format: Simple integer, resets daily
- Example: #47
Properties:Sequential within kitchen within dayResets to 1 each dayUsed on kitchen tickets, stubs, display screensEasy to call out verbally
Generation:On order creationPer kitchen, per date sequenceMust handle concurrent orders (proper locking)
7.9.2 Receipt Number- Purpose: Accounting, tax
compliance,compliance - Format: Prefix-Date-Sequence
- Example: R-
20241229-20260103-0047or JKX-20241229-0047Properties: - Never resets (continuous
or dailywith date prefix) Generated only when payment completesOne tab with multiple orders = one receiptUsed for refunds, reports, tax filings
audit trailGeneration:On payment completionNot on order creation (order might be cancelled)Tab payment generates single receipt for all orders
7.9.3Tab IdentifierPurpose:Internal tracking, staff referenceFormat:Can use table number as identifierDisplay:"Table 5's tab" or "Tab #12"Properties:One open tab per table per dayClosed tabs retained for history
7.4Internal IDs- All entities have UUID primary keys
for:Database relationships- Used for database relationships and API references
Integration stability
Display numbers
(order #, receipt #)are separate from internalIDs.Part 8: Event-Driven Architecture8.1 Order EventsThe system generates events at key moments. Actions are triggered based on kitchen configuration.Event Types:EventDescriptionORDER_CREATEDOrder record createdORDER_CONFIRMEDOrder submitted and ready for processingPAYMENT_INITIATEDPayment process startedPAYMENT_COMPLETEPayment successfulPAYMENT_FAILEDPayment unsuccessfulSENT_TO_KITCHENKitchen notified of orderITEM_STARTEDKitchen started preparing itemITEM_READYItem preparation completeORDER_READYAll items ready for customerORDER_PICKED_UPCustomer received orderORDER_COMPLETEDOrder fully closedORDER_CANCELLEDOrder cancelledITEM_VOIDEDItem removed from order8.2 Event-Action MappingKitchens configure what happens when events occur.Configuration Structure:Event Action: - Trigger Event (which event fires this) - Action (what to do) - Conditions (when to apply) - Enabled (on/off)Example Mappings:When: PAYMENT_COMPLETE Conditions: channel = KIOSK Actions: - Print kitchen ticket - Print customer stub - Notify KDS - Update customer display When: ORDER_READY Conditions: fulfillment = PICKUP Actions: - Show on customer display - Send SMS notification When: ORDER_CONFIRMED Conditions: channel = POS, fulfillment = DINE_IN Actions: - Print kitchen ticket (payment comes later for tabs) - Notify KDS8.3 Benefits of Event-Driven ApproachFlexibility:Kitchen customizes workflow without code changesDecoupling:Core logic separated from notification/printingAuditability:Event log shows exactly what happened whenExtensibility:New actions added without changing core flowIDs
Part
9:10: Configuration Presets9.10.1PurposeNot all kitchens want to configure every setting. Presets provide sensible defaults for common operation types.9.2Available PresetsHome Kitchen Preset (STARTER Default)
orderRouting: NONE kitchenNotification: NONE sendToKitchen: immediate (same person) customerStub: false customerDisplay: false tabsEnabled: falseFast Food Preset
Order Routing:orderRouting: DIRECT_TO_STATIONSKitchen Notification:kitchenNotification: DISPLAY(KDS) Send to Kitchen:sendToKitchen: ON_PAYMENT_COMPLETECustomercustomerStub:Stub:trueYes,customerDisplay:ontruepaymenttabsEnabled:complete Customer Display: Enabled Kiosk Cash Flow: KITCHEN_FIRST Pay Later (Tab): DisabledfalseCasual Dining Preset
Order Routing:orderRouting: DIRECT_TO_STATIONSKitchen Notification:kitchenNotification: PRINTERSend to Kitchen:sendToKitchen: ON_PAYMENT_COMPLETECustomercustomerStub:Stub:optionalOptionalcustomerDisplay:CustomerfalseDisplay:tabsEnabled:Disabled (server delivers) Kiosk Cash Flow: PAYMENT_FIRST Pay Later (Tab): EnabledtrueFine Dining Preset
Order Routing:orderRouting: EXPEDITOR_CONTROLLEDKitchen Notification:kitchenNotification: BOTH(screen + paper) Send to Kitchen:sendToKitchen: ON_ORDER_CONFIRMED(trustcustomerStub:dine-in)falseCustomercustomerDisplay:Stub:falseDisabledtabsEnabled: true (waiter service) Customer Display: Disabled Kiosk: Not used Pay Later (Tab): Enabled,default for dine-inin)Cafe/Coffee ShopDrive-Through PresetOrderorderRouting:Routing:DIRECT_TO_STATIONSNONEkitchenNotification: DISPLAY sendToKitchen: ON_PAYMENT_COMPLETE customerStub: false customerDisplay: true (countershowsservice)orderKitchennumbers)Notification:tabsEnabled:NONEfalse(baristadriveThrough:seesenabled:POS)trueSendlanes:to1Kitchen:combinedWindows:Immediate (same person) Customer Stub: Simple (name + number) Customer Display: Optional Pay Later (Tab): DisabledtrueFood Truck Preset
Order Routing:orderRouting: DISPLAY_ONLYKitchen Notification:kitchenNotification: DISPLAY(single screen) Send to Kitchen:sendToKitchen: ON_PAYMENT_COMPLETECustomercustomerStub:Stub:trueYescustomerDisplay:Customer Display: Singlesingle screenPaytabsEnabled:Later (Tab): Disabledfalse9.3 Preset CustomizationKitchen selects preset, then can override any individual setting. Preset just provides starting point.
Part
10:11: Data Model OverviewThis section provides conceptual entity definitions. Not database schemas - just the key entities and their relationships.10.11.1 Core EntitiesKitchen
The restaurant or food service establishment.- Has many staff members
- Has many menu items
- Has configuration settings
- Has subscription tier and enabled features
- Has many orders, tabs, customers
Customer
A person who orders from a kitchen.- Can have App Wallet (platform-wide)
- Can have Kitchen Wallet (
specific to kitchen)kitchen-specific) - Can have order history
- Identified by phone number or account
Tab (PROFESSIONAL+)
A container for dine-in orders that will be paid together.- Belongs to a kitchen
- Associated with a table number
- Has many orders
- Has status (OPEN, CLOSED)
- Can have tab-level discounts
Order
A single order transaction.- Belongs to a kitchen
- Optionally belongs to a tab
- Optionally linked to a customer
- Has many order items
- Has order status
(lifecycle) Hasand payment status- Has channel source
- Has fulfillment type
- Has order number (daily reset)
Order Item
A line item within an order.- Belongs to an order
- References a menu item
- Has
quantityquantity, Has modifiersHasmodifiers, notes- Has item status (for kitchen tracking)
- Has line total
Payment
A payment transaction.Can be linkedLinked to an order or tab- Has payment method
- Has amount
Hasand status(PENDING, COMPLETED, FAILED, etc.)- Has reference/confirmation code
Records who received (for cash)
Receipt
An immutable record of a completed transaction.- Generated on payment completion
- Has unique receipt number
- Contains snapshot of
items, prices, totalstransaction Records discounts and taxRecords payment method(s)Cannot be modifiedImmutable (onlyvoided)voided,
Customer Debt AccountTracks credit/debt (Kwa Deni) for customers.Belongs to a kitchen and customerHas total outstanding balanceHas credit limit (optional)Has status (GOOD_STANDING, SUSPENDED, BLOCKED)Links to unpaid credit ordersLinks to debt payments made
Debt PaymentA payment made toward outstanding credit balance.Belongs to customer debt accountHas amount paidHas payment methodRecords which orders were paid (optional)Has remaining balance after payment
Checkout SessionTemporary state during checkout process.Contains cart snapshotHas expiration timeLinks to created orderTracks session status
Table QR CodeQR code configuration for a table.Belongs to a kitchenHas table number/identifierHas QR code data (URL with kitchen + table)Has generated image (for printing)Enabled/disabled statusCreated/updated timestampsmodified)
10.11.2ConfigurationSubscriptionEntities& Features
id:KitchenKitchen:Settings
plan:Operationaluuidconfigurationname:forstringasubscription:kitchen.- STARTER
Order|routingGROWINGmode| KitchenPROFESSIONALnotification|methodENTERPRISE
Timingstatus:settingsACTIVEby|channelTRIAL Kiosk|cashPAST_DUEflow|settingCANCELLED
Kwastarted_at:Denidatetimeenabled/disabledcurrent_period_end:(hiddendatetimebyusage:default)orders_this_month: KwaintegerDenimenu_items_count:approvalintegerthresholdsstaff_accounts_count:
integerPaymentlocations_count:Method
pos_enabled:Configuredfeatures:payment#optionsDerivedforfromaplankitchen.- boolean
Methodkiosk_enabled:typebooleanandtable_qr_enabled:nameboolean
Enabledwhatsapp_enabled:channelsboolean
Requirestabs_enabled:confirmationbooleanflagstations_enabled: Method-specificbooleanconfigurationkds_enabled:
booleanKitchendrive_through_enabled:Station
#Ateam_enabled:preparationbooleanstationmulti_location_enabled:withinbooleantheprofile:kitchen.- From
Nameonboardingandbusiness_type:descriptionHOME_KITCHEN Assigned|printerFOOD_STALL Display|configurationRESTAURANT
expected_orders_per_day:KitchenCHAINPrinter
PICKUP,Astringprinterteam_size:devicestringforservice_styles:the[DELIVERY,kitchen.- DINE_IN,
NameDRIVE_THROUGH]and type (kitchen, receipt, kiosk)Connection detailsAssigned station (for kitchen printers)
Print TemplateCustomizable print formatting.Print type (ticket, receipt, stub, bill)Header and footer textContent options
Event ActionConfigured action triggered by events.Trigger eventAction typeConditions (channel, fulfillment)Enabled status
Staff Discount LimitDiscount permissions by role.RoleMaximum discount percentageRequires approval flag
10.11.3 Entity RelationshipsKitchen ├── has many → Staff ├── has many → Menu Items ├── has many → Customers(Kitchen Wallets)├── has many → Orders ├── has many → Tabs ├── has many → Payments ├── has many → Receipts ├── has one → Kitchen Settings ├── has one → Subscription ├── has many → Payment Methods ├── has many → Kitchen Stations├└── has many → Kitchen Printers├── has many → Print Templates └── has many → Event ActionsTab ├── belongs to → Kitchen ├── has many → Orders├── has many → Tab Discounts└── has one → Payment (on close) Order ├── belongs to → Kitchen ├── belongs to → Tab (optional) ├── belongs to → Customer (optional) ├── has many → Order Items ├── has many → Payments├── has many → Print Jobs└── generates → Receipt(on payment) Order Item ├── belongs to → Order ├── references → Menu Item └── assigned to → Kitchen Station Payment ├── belongs to → Kitchen ├── belongs to → Order or Tab └── references → Payment Method Receipt ├── belongs to → Kitchen ├── belongs to → Order or Tab ├── belongs to → Customer (optional) └── records → Payment details (snapshot) Print Job ├── belongs to → Kitchen ├── references → Order or Tab ├── targets → Kitchen Printer └── uses → Print Template
Part
11:12:APIDeliveryStructureIntegrationOverview(Future)This section outlines the conceptual API structure. Not detailed specifications - just the key endpoint groups and their purposes.11.12.1CheckoutMultipleAPIsDelivery ProvidersJikoXpress Pro will support multiple delivery providers:
SessionPlannedManagement:Providers:CreateJIKOXPRESS_DASHERScheckout(ownsession from cartfleet)Get session status and detailsBOLT_FOODProcess payment for sessionUBER_DIRECTCancel session
Tab Management:Find or create tab for tableGet tab details with all ordersApply discount to tabRemove discount from tabGet tab summary for paymentClose and pay tab
11.2 Order APIsOrder Operations:Create orderSAFEBODA (direct,EastwithoutAfricatab)Get order detailsUpdate order statusCancel order
Order Items:Add item to unpaid order (rare, usually new order on tab)Void item from order
11.3 Table QR APIsQR Code Management:Generate QR code for tableList all table QR codes for kitchenRegenerate QR code (if compromised)Enable/disable QR codeDownload QR code image for printing
11.3 Payment APIsPayment Processing:Get payment statusConfirm manual payment (cash, custom)Handle payment webhook callbacksRequest refund
Payment Methods:List available methods for channelGet method configuration
11.4 Kwa Deni (Credit/Debt) APIsDebt Management:Get customer debt balanceGet customer debt history (orders on credit)Create credit order (with permission checks)Record debt payment (full or partial)Get debt payment history
Debt Administration:List all customers with outstanding debtGet aging reportUpdate customer credit limitUpdate customer credit status (suspend, block)Get debt summary reports
11.4 Kitchen APIsKitchen Display:Get pending orders for stationUpdate item statusUpdate order statusGet order details
Order Routing:Fire order to station (expeditor control)Bump order (mark complete)
11.5 Print APIsPrint Job Management:Get pending print jobs for deviceClaim print jobComplete print jobFail print job with reason
Manual Print Triggers:Reprint kitchen ticketPrint bill for tableReprint receipt
11.6 Configuration APIsKitchen Settings:Get operation settingsUpdate operation settingsApply preset
Payment Method Config:List payment methodsEnable/disable methodUpdate method configuration
Print Configuration:List printersConfigure printerList templatesUpdate template
Event Actions:List configured actionsCreate/update actionEnable/disable action
Part 12: Integration Points12.1 Payment Provider IntegrationMobile Money (USSD):Initiate payment requestReceive webhook on completionQuery payment status
Card Terminals:Send payment requestReceive responseHandle terminal errors
Payment Links:Generate unique payment URLTrack link statusReceive completion webhookspecific)
12.2
NotificationKitchenIntegrationConfigurationSMS:deliverySettings:- enabledProviders:
Order[JIKOXPRESS_DASHERS,confirmationBOLT_FOOD]
OrderpreferredProvider:readyJIKOXPRESS_DASHERSnotificationfallbackProvider: DeliveryBOLT_FOODupdatesautoAssign:
Push|Notificationsfalse(App):Order status updatesReady for pickupDelivery arriving
WhatsApp:Order confirmation messageStatus updatesPayment instructions
12.3
ExternalOrderSystemsDelivery Properties
(whenAccountingOrderIntegration:- fulfillment
Export=dailyDELIVERY):salesdeliveryProvider: Receiptstringdata(nullable)fordeliveryExternalId:bookkeepingstring Tax reporting
Inventory Integration:Deduct ingredients on(provider's orderLowID)stockdeliveryStatus:alertsFINDING_DRIVER Menu|itemASSIGNEDavailability|
DELIVERINGLoyalty|Programs:- |
PointsDELIVEREDaccumulationdriverInfo:
Rewardname:redemptionstring
Customerphone:tierstringtrackingvehicle:
Part 13: Operational Scenarios
13.1
Scenario:HomeBusyChefLunch RushScenario (Fast Food)STARTER)Context:FastMamafoodLisherestaurant,cookinghighfromvolume,home,kioskdeliveryandonlycounterSetup:orders- Downloaded mobile app - Added 10 dishes with photos - Set operating hours: 11am - 8pm - Enabled mobile money payments Daily Flow: 1.MultipleCustomerkioskfindscustomersMamaorderingLishesimultaneouslyon JikoXpress app 2.Counter staff handling walk-upCustomer orders Ugali + Samaki 3.KitchenCustomerreceivingpayscontinuousviaorder streamM-Pesa 4.KDSMamashowingLisheallgetsorders,pushsortednotificationby time📱 5.CustomerMamadisplayLishecallingtapsnumbers as ready"Accept" 6.StaffMamamanagingLishecashcooks,paymentstapsfrom"Ready"kiosk7.KeyCustomerRequirements:picks-upHandle(orconcurrentdeliverycheckoutarrangedsessionsseparately)-8.EfficientOrderkitchencompletedticketNoprintingPOS,-noClearprinter,ordernonumbercomplexity.visibilityJust-phoneQuickandcash confirmation workflowcooking.13.2
Scenario:BusyDinnerFoodServiceStall Scenario (Fine Dining)GROWING)Context:FinePopulardining,foodmulti-coursestall,meals,hightabslunch traffic Setup: - Tablet with POS app - Kitchen ticket printer - Receipt printer - 2 staff accounts Daily Flow: 1. Customer orders at counter 2. Staff enters order on tablet POS 3. Customer pays cash or mobile money 4. Kitchen ticket prints automatically 5. Receipt prints for customer 6. Customer waits for number 7. Order called when ready13.3 Restaurant with Dine-In (PROFESSIONAL)
Context: Full restaurant, tables, bar Setup: - POS terminals - KDS in kitchen - Multiple stations (hot line, cold line, bar) - Table QR codes on all tablesFlow:- Tabs enabled Scenario A - Waiter Service: 1.ServerCustomersopensseatedtabatwhenTableseating guests7 2.ServerWaiterenters first coursetakes order on POS 3.KitchenSelectsprepares,"PayexpeditorLater"controls→timingTab created 4.GuestsOrdersrequestsplit to stations on KDS 5. Customers order more drinks (added to tab)5. Main course ordered and added6.DessertCustomersorderedrequestand addedbill 7.GuestWaiterrequestsprints bill(print bill, not receipt)8.GuestCustomerspays (card or cash)pay 9. Tab closed, receipt printedKeyScenarioRequirements:B -Tab management for multiple courses - Expeditor control of kitchen flow - Bill vs receipt distinction - Graceful discount application if needed13.3 Scenario: App Delivery OrderContext: Customer ordering via app for delivery Flow: 1. Customer browses menu in app 2. Adds items to persistent cart 3. Proceeds to checkout 4. Enters/confirms delivery address 5. Sees delivery fee added 6. Selects wallet payment 7. Confirms order 8. Receives confirmation with estimated time 9. Kitchen prepares 10. Driver picks up 11. Customer receives push notification 12. Order delivered Key Requirements: - Server-side cart persistence - Address validation - Delivery fee calculation - Push notification integration - Driver handoff tracking13.4 Scenario: WhatsApp Order (Pickup)Context: Customer ordering via WhatsApp for pickup Flow: 1. Customer messages kitchen number 2. Chatbot greets, shows menu 3. Customer specifies items 4. Chatbot confirms order and total 5. Customer selects USSD payment 6. Chatbot sends USSD instructions 7. Customer completes payment on phone 8. Webhook confirms payment 9. Chatbot confirms with estimated time 10. Kitchen prepares 11. Customer arrives and picks up Key Requirements: - Chatbot conversation management - USSD payment initiation - Webhook handling - WhatsApp message confirmation13.5 Scenario: Voiding ItemsContext: Customer changes mind after ordering Flow: 1. Order placed and sent to kitchen 2. Customer says "Actually, no burger" 3. Server voids burger from order 4. System checks: Is discount needed? Does void need approval? 5. Manager approves void (if required) 6. Void ticket printed to kitchen 7. Kitchen stops/discards burger preparation 8. Order total updated 9. When paying, adjusted total used Key Requirements: - Void permission by role - Manager approval workflow - Void ticket to kitchen - Order total recalculation - Audit trail of void13.5 Scenario:TableQR Self-OrderingContext: Customer at table orders via QR code on their phone Flow - Web (No App): 1. Customer sits at Table 7 2. Scans QR code on table tent 3. Browser opens: menu.jikoxpress.com/mamalishe?table=7 4. Sees Mama Lishe's menu (no login needed) 5. Browses, adds: 1x Ugali + Samaki, 1x Juice 6. Taps "View Cart" → sees items and total: 18,500 7. Taps "Checkout" 8. Table number shown: "Table 7" (from QR, read-only) 9. Payment options: USSD or Cash 10. Selects USSD, enters phone: 0754xxxxxx 11. Receives USSD prompt on phone 12. Confirms payment 13. Browser shows: "Order #34 Confirmed! Your food will be delivered to Table 7" 14. Kitchen receives order with Table 7 clearly marked 15. Staff delivers food to Table 7 Flow - App User:QR: 1. Customer scans QR atTable 7table 2.HasOrders on phone (no appinstalled → app opens with table=7needed) 3.CustomerPaysalreadyvialogged inUSSD 4.Browses menu, adds items 5. Checkout shows Table 7 6. Payment options include: Wallet (12,500 balance), USSD, Cash 7. Selects Wallet 8. Instant payment from balance 9. Order confirmed, push notification enabled 10. When ready: Push notification "Your order #34 is ready!" 11. Staff delivers to Table 7 Flow - Cash Payment: 1. Customer scans QR, orders via web 2. Selects "Pay at Counter" 3. Order created (status based on kitchen config) 4. Screen shows: "Please pay 18,500 TZS at counter. Order #34" 5. Customer walks to counter, pays cash 6. Staff sees pending cash order, confirms payment 7. If KITCHEN_FIRST: Food already preparing 8. If PAYMENT_FIRST:Kitchennowreceives order9.with "Table 7" 5. Food delivered to tableKeyRequirements:13.4 Drive-Through Scenario (PROFESSIONAL)
Context: Fast food with drive-through Setup: -QRSpeaker/miccontainsatkitchenorderIDpoint - POS at order window - KDS showing drive-through orders with priority - Single window (pay +tablepickup)numberFlow: 1. Car enters Lane 1 2. Customer orders via speaker 3. Staff enters on POS: "Lane 1, Order #23" 4. Customer drives to window 5. Staff processes payment 6. Kitchen already preparing (priority queue) 7. Order ready, handed to customer 8. Car exits, time logged Metrics tracked: -WebOrdermenutime:works45without app or loginseconds -TablePaymentnumbertime:locked30(customer can't change)seconds -USSDPickupandwait:Cash2always availableminutes -WalletTotalonlytime:if3:15app✓+(target:logged<in4- Kitchen ticket clearly shows table numbermin)13.
65Scenario:Multi-LocationKwa DeniChain (Credit Customer)ENTERPRISE)Context:Regular5trustedrestaurantcustomerlocationswants to take food on credit FlowSetup: -CreatingCentralDebt:menu1. Regular customer (registered) orders lunch 2. Customer says "Nitalipia kesho" (I'll pay tomorrow) 3. Staff checks customer is registered in system 4. Staff navigates to hidden Kwa Deni option 5. System checks:management -KwaEachDenilocationenabledhasforownthisPOS,kitchenKDS,✓printers - Consolidated reporting dashboard - Staffhasmanagedcreditperpermissionlocation✓with central oversight Daily Operations: -CustomerMenuregisteredupdate✓pushed to all 5 locations -CustomerEachwithinlocationcreditoperateslimitindependently✓-6.HQOrderseestotal:real-time15,000sales7.acrossCustomerallcurrentlocationsbalance:-10,000 8. New balance would be: 25,000 (within limitEnd of50,000)day:✓consolidated9.reportStaff confirms credit transaction 10. Order created, kitchen prepares food 11. Customer receives food and leaves 12. Debt of 15,000 added to customer account Flowgenerated -PayingInventoryDebtsynced(partial):across1. Same customer returns 3 days later 2. Customer: "Nataka kulipa 20,000" (I want to pay 20,000) 3. Staff looks up customer, sees balance: 25,000 4. Customer pays 20,000 cash 5. System records debt payment 6. New balance: 5,000 7. Receipt printed showing payment toward credit Flow - Paying Debt (full): 1. Customer returns next week 2. Wants to clear balance completely 3. Staff shows remaining balance: 5,000 4. Customer pays 5,000 5. Balance now: 0 6. Customer in good standing for future credit Key Requirements: - Hidden UI (not visible to regular staff or customers) - Permission checks at multiple levels - Clear balance tracking - Partial payment support - Receipt differentiation (credit vs regular)13.7 Scenario: Split Table (Edge Case)Context: Two friends at one table want separate bills Options: Option A: Separate Tabs 1. Create two tabs for same table (e.g., Table 5A, Table 5B) 2. Each person's orders on their tab 3. Close tabs separately Option B: Manual Split at Payment 1. Single tab with all orders 2. At payment, staff calculates each portion manually 3. Process two payments against same tab 4. Close tab when fully paid Recommendation: Start with Option B (manual) for V1, as true split adds significant complexity.locations
Part 14: Non-Functional Requirements
14.1 Performance
- Checkout session creation: < 200ms
- Kitchen notification: < 500ms from trigger
- Print job creation: < 200ms
Payment processing: Depends on provider, show progress- KDS refresh: Real-time (
websocket<or2s) - Drive-through order entry: <
2s30polling)seconds target
14.2 Reliability
- Print job retry on failure
- Payment webhook idempotency
- Offline POS capability (queue and sync)
- KDS fallback to printer if display fails
14.3 Scalability
- Support 100+ concurrent orders per kitchen
- Support
1000+10,000+ orders per day per kitchen (enterprise) - Support
multi-location100+kitchenslocations(future)per enterprise account
14.4 Security
- Payment data encryption
- Staff authentication
for POS - Manager PIN for sensitive operations
- Audit log for all transactions
- Receipt data immutability
14.5 ComplianceTax calculation accuracyReceipt format compliance (local regulations)Payment provider complianceData retention policies
Part 15:
FutureAPIConsiderationsStructure Overview15.1
PlannedCheckoutfor Later VersionsAPIsPartial Payments:AllowCreatesplitcheckoutpayments (50% wallet, 50% cash)sessionTrack multipleProcess paymentrecords per transaction
Table Management:Table entity with capacity, zone, statusReservationCancelintegrationsessionTableTabtransfermanagement (movefind,tabcreate,to different table)
Inventory Integration:Ingredient deduction on orderMenu item availability based on stockLow stock alerts
Loyalty Program:Points earning on purchasePoints redemptionCustomer tiers and benefits
Multi-Location:Kitchen groups/chainsCentralized menu managementCross-location reportingclose)
15.2
OutOrderof Scope for Current PhaseAPIsThird-partyCreatedelivery integration (Uber Eats, etc.)orderAdvancedGetreservationordersystemdetailsKitchenUpdatevideoorderdisplaystatusCustomerCancelfeedback/rating systemorderAdvancedVoidanalyticsitem
dashboard15.3 Kitchen APIs
- Get pending orders (by station)
- Update item/order status
- Fire order (expeditor)
15.4 Payment APIs
- Get payment status
- Confirm manual payment
- Handle webhooks
- Request refund
15.5 Print APIs
- Get pending print jobs
- Claim/complete/fail print job
- Manual reprint triggers
15.6 Subscription APIs
- Get current plan
- Get feature flags
- Get usage stats
- Upgrade/downgrade plan
- Unlock feature module
Appendix A: Glossary
Term Definition Tab A containerContainer for unpaid orders at a dine-in tableKwa DeniCredit/debt system - customer takes food and pays days/weeks laterTable QRQR code at table that customers scan to self-order via phoneStub Small printed slip with order number for customerKDS Kitchen Display System - digital order screens showing ordersExpeditor Senior kitchenstaffwho controlscontrolling order flowStation A specificSpecific preparation area inthekitchenBump Mark anorderascomplete on KDSFire Send order to kitchen for preparation Void Cancel an item from an order Kitchen Wallet Prepaid balance issued by kitchen to loyal customersApp Wallet Platform-wide customer wallet Deep LinkLaneURLDrive-throughthatvehicleopens directly in mobile app if installedqueue
Appendix B: Configuration Checklist
WhenSTARTER
setting up a new kitchen, configure:Setup-
BasicDownloadInformationmobile(name, address, tax ID)app -
OperationSetPresetbusiness(ornamecustomandsettings)logo -
KitchenAddStationsmenu items (up to 20) -
MenuSetItemsoperatingwith station assignmentshours -
PaymentEnableMethodsmobileandmoney
channelavailabilityGROWING Setup (+ STARTER)
- Set up POS on tablet/desktop
-
PrintersConfigure(kitchen,kitchenreceipt, kiosk)printer -
PrintConfigureTemplatesreceipt(headers, footers)printer -
StaffAddAccountsstaff accounts (up to 3) - Enable additional payment methods
- Generate Table QR codes
PROFESSIONAL Setup (+ GROWING)
- Define kitchen stations
- Set up KDS displays
- Configure station assignments for menu items
- Enable tabs
- Set staff roles and discount limits
-
StaffConfigureCredit Permissionsdrive-through (ifKwaapplicable)
Deniused)ENTERPRISE Setup (+ PROFESSIONAL)
- Add additional locations
-
CustomerConfigureDisplaycentral(if used)menu -
EventSetActionsup(ifconsolidatedcustomizing from preset)reporting -
KwaConfigureDeniAPISettings (disabled by default, enable only if needed)access -
TableSetQRupCodesinventory(generate and print for each table) Table QR Cash Flow setting (kitchen first or payment first)tracking
Appendix C: Decision Log
Key architectural decisions made during design:Decision Choice Rationale TabCredit system (Kwa Deni)Removed Complexity vs modifyV1orderMultiple orders per tabCleaner for kitchen, independent lifecyclesscopeTab creation Auto-createAuto on first pay-laterorderLess friction for staff Partial payments Defer to V2 Complexity vs actual need Kwa Deni visibilityDrive-throughHiddenChannelby+defaultFulfillmentHigh-riskUnifiedfeature,model,preventsamemisuseorder entityKwaFeatureDeni partial paymentunlockingSupportedSubscription-basedReal-worldClearneedvaluefortiers,debtsimplerepaymentUXDefault config Zero-config works Reduce onboarding friction Print architecture Client pull modelWorksLocalwithprinterlocal printers,support, offlinesupportOrder number Daily reset Easier for kitchen communication featureReceiptPlatformnumberscaleNeverOneresetcodebase all tiers APIs,Accounting/complianceSamerequirementflags KitchengatetimingConfigurable per channelDifferent trust models for different channelsaccess
Document History
Version Date AuthorChanges 1.0 December 2024Architecture Team2025Initial document 2.0 January 2026 Removed Kwa Deni, added Drive-Through, added Progressive Feature Unlocking, added Subscription Tiers, added Default Configuration, noted Multi-Provider Delivery
End of Document