Mobile AppMOGI ALTIGAH

Smart Vending

Mobile Companion App for SaladBar Vending Machines

A mobile app that turns any SaladBar vending machine into a smart self-service kiosk. Users scan the machine's QR code, browse available products, select items, and pay directly from their phone — the machine dispenses automatically after payment.

vending-flow
scan(machine_qr)
  └─ fetch(products)
     └─ selectpaydispense
FlutterDartBLoCQR ScannerVending APIApple PayPayPalClean Architecture
01

How It Works

4-step flow from phone to product

STEP 01

Scan QR Code

Point your phone camera at the QR code on the vending machine to connect.

STEP 02

Browse Products

View the machine's live inventory — filter by category, see prices in SAR.

STEP 03

Pay from Phone

Add to cart, apply promo code, pay via Credit Card, Apple Pay, or PayPal.

STEP 04

Collect Product

Payment confirmed — the machine dispenses your product automatically.

02

Splash & Onboarding

SaladBar brand identity with bilingual Arabic/English support

The app opens with the SaladBar (سالادبار) bilingual logo on a fresh green gradient. A 2-step onboarding introduces the service: "Welcome to SaladBar — the largest self-service vending chain for fresh salads and snacks" followed by QR code scanning instructions.

Splash Screen

Splash Screen

Onboarding — Welcome

Onboarding — Welcome

Onboarding — QR Scanner

Onboarding — QR Scanner

03

QR Code Scanning

Camera-based scanning with real-time animation

Users scan the QR code on the vending machine to connect their phone to that specific unit. The scanner features a live camera feed with green corner brackets, a scanning line animation, and a processing spinner. The bottom sheet explains: "Place the QR code inside the frame and avoid shaking for best results."

QR Scanner — Ready

QR Scanner — Ready

Scanning Line Animation

Scanning Line Animation

Processing QR...

Processing QR...

04

Product Catalog

Live inventory fetched from the connected vending machine

After scanning, the app fetches the real-time product inventory from that specific machine via API. Products display in a 2-column grid with category filter tabs — All Products (كل المنتجات), Coca-Cola (كوكاكولا), Chipsy (شيبسي), Indomie (اندومي). Each product card shows a photo, Arabic name, category label, and price in SAR. A skeleton loading state appears while products load.

Loading — Spinner

Loading — Spinner

Skeleton Loading

Skeleton Loading

Product Grid — Loaded

Product Grid — Loaded

05

Product Details & Cart

Quantity selection, promo codes, and price breakdown

Tapping a product opens a detail view showing the product photo, Arabic name, description, price in SAR (ريال سعودي), and a +/- quantity selector. A promo code input (رمز ترويجي) allows discount application. The bottom section shows subtotal (المجموع الفرعي), taxes & fees (الضرائب والرسوم), and total (المجموع الاجمالي) with item count. The green "Go to Payment" (الذهاب للدفع) CTA proceeds to checkout.

Product Detail — Pepsi

Product Detail — Pepsi

06

Payment Methods

Credit Card, Apple Pay, and PayPal with saved card management

Three payment options are available: Credit/Debit Card (بطاقة ائتمان), Apple Pay (أبل باي), and PayPal (باي بال). The credit card flow includes a horizontal carousel of saved cards showing card number, holder name, and expiry date with edit/delete actions. New cards are added via a full form with card number, CVV, expiry, and holder name fields.

Payment Methods

Payment Methods

No Card — Add New

No Card — Add New

Saved Card Carousel

Saved Card Carousel

07

Card Management

Full card lifecycle — add, view, edit, delete

Add Card Form

Add Card Form

Card Added — Success

Card Added — Success

Card Add — Failed

Card Add — Failed

08

Payment & Dispensing

Success, failure, and product collection flows

After successful payment, the app shows a celebration with confetti animation (تهانينا تم الدفع بنجاح) and prompts the user to collect their product from the machine. The machine receives the payment confirmation via API and automatically dispenses the product. If payment fails, a clear error screen shows the reason with a retry option.

Success — Confetti

Success — Confetti

Payment Error

Payment Error

Success — Checkmark

Success — Checkmark

Collect Product

Collect Product

09

Error Handling

Comprehensive edge case coverage

The app handles every edge case with clear, bilingual error screens: general errors with retry, no internet connection (عذرا لا يوجد انترنت) with a reload button, and empty machine inventory (عذرا لا تتوفر منتجات حاليا) directing users to try another machine. Each error state includes an illustrated icon and actionable button.

Error — Something Wrong

Error — Something Wrong

No Internet

No Internet

No Products Available

No Products Available

10

Technical Architecture

How the phone talks to the vending machine

┌─────────────────┐      ┌─────────────────────┐      ┌──────────────────┐
│   MOBILE APP    │      │   BACKEND SERVER     │      │  VENDING MACHINE │
│   (Flutter)     │      │   (REST API)         │      │  (Hardware)      │
│                 │      │                      │      │                  │
│  1. Scan QR   ──┼─────>│  Identify Machine    │      │                  │
│                 │      │                      │      │                  │
│  2. Browse    <─┼──────┼─ Return Inventory    │<─────┼── Sync Products  │
│     Products    │      │                      │      │                  │
│                 │      │                      │      │                  │
│  3. Add to     ─┼─────>│  Validate Cart       │      │                  │
│     Cart        │      │  Process Payment     │      │                  │
│                 │      │                      │      │                  │
│  4. Pay        ─┼─────>│  Charge Card/Wallet  │      │                  │
│                 │      │  Confirm Payment    ──┼─────>│  Dispense Slot   │
│                 │      │                      │      │                  │
│  5. Collect   <─┼──────┼─ Dispense Confirmed  │<─────┼── Drop Sensor OK │
│     Product     │      │  Log Transaction     │      │                  │
└─────────────────┘      └──────────────────────┘      └──────────────────┘

QR-Based Machine Identification

Each machine has a unique QR code. Scanning connects the app to that specific unit's inventory via the backend API.

Real-Time Inventory Sync

Product availability, prices, and categories are fetched live from the machine. If a slot is empty, it's not shown.

Secure Payment Processing

Payments processed via backend — Credit Card (tokenized), Apple Pay, PayPal. Machine never handles payment data.

Automatic Dispensing

After payment confirmation, the backend signals the machine to activate the specific slot's spring motor. Drop sensor verifies delivery.

11

Key Features

What makes this vending app stand out

Cashless Payments

Credit card, Apple Pay, and PayPal integration — no cash needed at the machine.

Live Machine Inventory

Products fetched in real-time from the specific machine. Always see what's actually available.

Category Filtering

Browse by product type: food, drinks, snacks. Quickly find what you want.

Promo Code Support

Apply discount codes at checkout for promotional campaigns and corporate deals.

Saved Card Management

Store multiple cards securely. Quick checkout with saved payment methods.

Full Arabic RTL

Complete bilingual support with right-to-left layout for Arabic users.

Skeleton Loading

Smooth loading experience with skeleton placeholders while products fetch.

Error Recovery

Every error has a clear message and actionable recovery: retry, reload, or try another machine.

23 Screens

Complete user journey with 23 polished screens covering every flow and edge case.

23
App Screens
3
Payment Methods
8
Screen Sections
12
Key Features