Overview
Most small workshops in Indonesia still track inventory on paper or in spreadsheets — prone to errors, slow to reconcile, and impossible to audit. BukuBengkel replaces that with a purpose-built platform that handles the full operational loop: stock in, service out, customer retention, and subscription billing via QRIS.
The Problem
Workshop owners juggle parts inventory, service records, and customer data across disconnected tools. When a part gets used, the cost isn't always obvious — especially with fluctuating supplier prices. Loyalty programs, if any, are manual punch cards. On the business side, monetizing the platform required a billing system that Indonesian workshop owners could actually use — no Stripe, no credit cards, just scan and pay.
What Was Built
A full workshop management platform covering:
- — Inventory tracking with moving-average cost accounting — unit costs auto-adjust with every new purchase
- — Sales and stock reports exportable per period
- — Built-in loyalty program to track repeat customers and reward them automatically
- — Subscription billing with QRIS — multi-tenant payment system with QR code generation, automatic invoice creation, payment confirmation webhooks, and grace period management
Subscription & Billing
BukuBengkel uses a shared Payment Service to handle the full billing lifecycle. Workshop owners register, choose a plan, scan a QRIS code to pay, and the platform activates automatically. When a subscription nears expiry, the system generates a renewal invoice and enters a grace period before suspending access. The payment service supports multiple apps, each with configurable plans, duration, and webhook-based status notifications.
Technical Notes
- — Stack — Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS v4, Drizzle ORM, SQLite (better-sqlite3), better-auth
- — Multi-tenancy — each workshop gets an isolated SQLite database, resolved via subdomain or slug
- — Payments — QRIS via Payment Service with Pakasir integration, QR code rendering on the pay page, and webhook-driven activation
- — Self-hosted — single server deployment via PM2 + Caddy, no Docker, no external DB