EXP-001 · Case study Running Product · Added Jan 2026

BukuBengkel

Started for a friend who runs a motorcycle workshop and was losing track of parts coming in. It grew into stock tracking with moving-average cost, sales reports, and a loyalty rule like "5 oil changes, the 6th is free" backed by Open Loyalty. A few workshops run on it now.

Architecturedata flow
Workshop ownerstock · service · sale
BukuBengkeltenant DB1 SQLite per workshop
  • renewPayment ServiceQRIS · plans · grace period
  • earnOpen Loyaltyearn events · rewards
  • statsDashboard/api/admin/stats

01Overview

A friend of mine runs a motorcycle workshop and had trouble keeping track of parts coming in. They also wanted a simple loyalty program: after 5 oil services, the next one is free. BukuBengkel started as the tool for that workshop and now covers stock in, service out, customer loyalty, and subscription billing via QRIS.

02The Problem

Writing the features was not the hard part. The hard part was taking how a workshop actually runs, with mechanics busy and the owner at the counter, and turning it into screens simple enough that people keep using them. Most of the work went into cutting steps, not adding them. Supplier prices also change all the time, so the cost of a part used in a service is tracked with moving-average cost instead of a fixed price.

03Who Uses It

A few friends' workshops that used to pay for other subscription apps now run on BukuBengkel. I build and maintain it myself.

04What 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
Formula
new_avg = (qty·avg + in_qty·in_cost) / (qty + in_qty)
Why
Cost of a used part stays accurate even when supplier prices move.

05Subscription & 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.

06Technical 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