Skip to main content
HolixoraHOLIXORA
← Back to Blog

Product

The POS System Built for Indonesian Retail: A Deep Dive into Mercora

Wira Dharma2026-06-074 min read

Walk into almost any small or medium retail business in Indonesia and you will find the same setup: a cash register or a tablet running a basic POS app, an Excel file tracking inventory, and a WhatsApp group where the owner gets daily summaries from staff. It works, but it is not a system. It is a collection of workarounds.

Mercora is our answer to that.

What Mercora Actually Is

Mercora is a full-stack point-of-sale and operations system built for retail businesses that have outgrown spreadsheets but do not need a SAP implementation. It runs on FastAPI and Next.js, uses PostgreSQL with async queries, and is designed to handle the real operational complexity of a multi-location retail business.

The core modules:

POS (Point of Sale): The cashier interface is built for speed. A transaction from scan to receipt should take under 30 seconds. The cashier screen handles product search by name or SKU, quantity adjustments, multiple payment methods, and receipt generation without switching screens.

Inventory: Real-time stock tracking across products and variants. Low-stock alerts trigger automatically. Inventory adjustments are logged with reasons. The system tracks cost prices and calculates gross margin on every sale.

Purchasing: Create purchase orders, receive goods against POs, and track outstanding orders. When goods are received, inventory updates immediately. No manual sync, no separate entry.

Customers and Suppliers: A CRM layer for repeat customers and a supplier database with contact and payment terms. Customer purchase history is queryable. This is the foundation for loyalty programs and targeted promotions.

Reports: Sales by period, product, and category. Inventory valuation. Gross margin analysis. Cash flow by day. The reports are built to give an owner the information they need in under two minutes.

The Marketing Module

This is where Mercora separates from generic POS systems.

We built a full marketing backend into the same stack. Campaign management, promotion creation, and customer targeting are first-class features, not plugins.

A promotion can be defined as a percentage discount, a fixed amount off, a buy-X-get-Y rule, or a product bundle. It applies automatically at the point of sale when conditions are met. The cashier does not need to remember codes or manually apply discounts.

Campaigns have start and end dates, eligibility rules (new customers, repeat purchasers, minimum spend), and are tracked against sales data so the owner can see whether a promotion drove revenue or just reduced margins.

This matters because most Indonesian retail promotion management happens through the owner's memory and occasional WhatsApp broadcasts. Mercora formalises it.

The Technical Architecture

The backend is a FastAPI application using SQLAlchemy 2.x with async session management. The database schema uses Alembic for migrations, which means schema changes are tracked, reversible, and applied cleanly in deployment. Decimal types are used throughout for financial values, no floating point anywhere in the money layer.

The frontend is a Next.js App Router application. Every page is a React Server Component where possible, with client-side interactivity added only where the UX demands it. The cashier interface is a client component for responsiveness. Reports and dashboards use server rendering for initial load speed.

RBAC is handled by Holixora Core, the shared authentication and authorization library that all our products use. Role definitions for Mercora: Administrator, Manager, Cashier, Viewer. Each role has a defined permission set. A cashier cannot access financial reports. A manager cannot change system configuration. The separation is enforced at the API layer, not just hidden in the UI.

Authentication uses short-lived JWTs with a production secret guard. The Dockerfile is hardened to fail fast if the production secret is not set as an environment variable, preventing accidental deployments with default credentials.

What This Looks Like in Practice

A retail operator deploying Mercora would start with masterdata setup: product catalogue with SKUs, categories, and initial stock levels. Supplier records. Customer import if they have existing data. Then staff setup: cashier accounts, manager accounts, role assignment.

From day one, the owner has a dashboard showing today's sales, current inventory status, and open purchase orders. From day seven, they have a week-over-week comparison. From day thirty, the reports are actually useful for decision-making.

The gap between working retail software and another spreadsheet is not the features. It is whether the software fits the actual workflow. Mercora is built around how Indonesian retail operators actually run their businesses.


Mercora is available for deployment. If you are running a retail operation and want to replace the spreadsheet stack, get in touch.