LPG Self-Service Kiosk System

Automated Retail & FinTech

LPG Self-Service Kiosk System cover image

Problem & Solution

The Challenge:

Traditional LPG retail is plagued by operational friction. Peak-hour bottlenecks lead to customer churn, while manual payment verification leaves shop owners highly vulnerable to Slip Fraud — where customers present fake transfer screenshots. Managing physical cash while simultaneously manually checking bank apps is not only inefficient but also represents a significant security risk and labor cost for shop owners.

The Solution:

I architected a Fraud-Proof Self-Ordering Kiosk that digitizes the entire LPG purchasing lifecycle. Built as a specialized layer on top of the Cash Management Local System, the kiosk provides a seamless 'Order-to-Payment' workflow. By integrating directly with the SCB Developer API, the system performs real-time cryptographic verification of every QR transaction, making slip fraud impossible. This automation reduces customer wait times by 80% and allows shops to operate with minimal staff without sacrificing security or financial accuracy.

Key Features & Business Impact

  • Fraud-Proof QR Integration: Real-time API verification via SCB Bank to eliminate 'Fake Slip' revenue loss.
  • Hybrid Payment Support: Seamlessly handles both digital QR transfers and physical cash via integrated dispensers.
  • Dynamic Promotion Engine: Flexible discount logic and real-time pricing updates managed through a centralized dashboard.
  • Automated Thermal Printing: Instant generation of order confirmation tickets and fiscal receipts.
  • Unattended Operation: Designed for 24/7 self-service, significantly reducing peak-hour labor requirements.
  • Operational Analytics: Granular insights into customer behavior, popular tank sizes, and peak transaction times.

Technical Deep Dive

Kiosk Architecture: Layered Edge Integration

The system utilizes a Modular Kiosk Architecture that abstracts the complexity of hardware control. The Next.js frontend delivers a low-latency, touch-optimized UX, while the .NET Core backend handles complex business logic like dynamic pricing and promotion engines. By delegating all cash-handling tasks to the existing Cweetlabs Edge Service via internal REST APIs, I ensured a strict separation of concerns: the kiosk manages the 'Customer Journey,' while the underlying edge system handles the 'Physical Assets'.

Security: OAuth 2.0 & Anti-Fraud Verification

To eliminate payment fraud, I implemented a rigorous API-Driven Verification Loop. The system utilizes OAuth 2.0 and Request Signing to communicate with SCB's payment gateway. Unlike systems that rely on visual slip inspection, this kiosk polls the bank's ledger directly. A transaction is only marked 'Complete' and the ticket printed once the bank confirms the specific Transaction UUID has been settled. This 'Trust-But-Verify' model ensures 100% financial accuracy.

Transactional Pipeline: Cash & QR Synchronization

The pipeline is engineered for Atomic Fulfillment. Whether a customer pays via cash or QR, the system maintains a unified state. For cash payments, the kiosk orchestrates hardware commands to the local cash dispenser; for QR, it manages the API polling lifecycle. I implemented Idempotency Keys across the entire pipeline to ensure that network flickers never result in double-charges or unprinted tickets. Every completed order triggers an automated print job and a real-time sync to the reporting database.

Analytics: Flexible Schema & Aggregation

Using MongoDB, I designed a flexible document schema capable of handling high-variability product attributes and nested promotion logic (e.g., volume-based discounts). To prevent reporting overhead from slowing down the kiosk UI, I utilized MongoDB Aggregation Pipelines to generate pre-computed summaries for the owner's dashboard. Composite indexes allow for instantaneous reconciliation of 'Cash vs. QR' ratios, even during high-volume periods.

Technology Stack

NextJSNextJS
TypescriptTypescript
TailwindCSSTailwindCSS
Dotnet CoreDotnet Core
MongoDBMongoDB