Mikro Farm sells stock feed, animal meds, seeds, pesticides and fertilizer — by the kilo, by the sack, by the container. The owner had tried every off-the-shelf POS and none of them split warehouse from store, none of them re-priced when suppliers moved, and none of them told the customer what was on the shelf before they drove an hour to find out. So we built one that did.
Before we wrote a single line, the owner walked us through the same Saturday five times. These are the bruises that came up over and over.
The store is far from where most farmers live. When the thing they came for isn't in stock, the trip is wasted — and so is the trust.
Walk-ins arrive into a busy store with no plan — they stand at the shelf trying to read labels while ten other people queue. Staff time is the casualty.
Warehouse and storefront are physically separate but every off-the-shelf POS lumps them together. So the screen says 40 sacks, the shelf has 3, and the back has 37 — and nobody knows until a customer asks.
Every Friday, someone counts. Manually. By eye. Mistakes show up two weeks later when an order arrives short of what they actually needed.
This isn't a bag at a time. A single supplier order is a container of feed. Order too little — stockout for a month. Order too much — capital frozen, expiry creeping up on the meds and seeds.
The first thing we built isn't for staff. It's a public-facing, education-first catalog the customer opens before they get in the car. Each product has live stock per location, dosage notes for meds and seeds, and a "reserve / order" button so the bag is held when they walk in.
The shelf-side problem solves itself: customers who already chose at home don't need to read labels in a queue. The drive-an-hour problem solves itself: if it's red, they don't drive.
Every item has one master record but two stock rows — one for the warehouse, one for the shop floor. HPP is tracked per location too, so a transfer carries cost as-is and margin reports stay honest.
Sales deduct from Toko first. If Toko runs short, the system falls through to Gudang without confirmation — but logs the pull, so reorder math knows the shelf needs refilling, not just the back.
Low-stock alerts run per location, not in aggregate. The "What to buy" tab is the same logic Friday nights used to do by hand — except it never miscounts, and it surfaces items by urgency, not alphabet.
Expiry-tracked categories (meds, seeds, pesticides) get a second pass: anything within 60 days of expiry shows in the same tab so it gets sold or moved before it's worthless.
| Item | Loc | On hand | Min | Action |
|---|---|---|---|---|
| Pakan Ayam Petelur 50kg | Toko | 3 | 10 | Pindah |
| Pupuk Urea 50kg | Gudang | 82 | 120 | Reorder |
| Vit. B-Complex 1L (exp 09/26) | Toko | 2 | 4 | Sell first |
| Decis 100ml | Gudang | 26 | 50 | Reorder |
For a single-bag retailer, "order more when low" is fine. For Mikro Farm, the question is how many sacks fill a 20ft container without overshooting six months of demand. So reorder isn't a button — it's a calculator the owner can override.
The system rolls the last 12 weeks of sales, multiplies by supplier lead time, and snaps the result up to the supplier's MOQ and the next container fill line. The owner sees the math, not just the answer, and can dial it before sending.
Every receiving event recomputes weighted-average HPP per location. If the new HPP crosses the markup band the owner sets, the retail price auto-updates and gets logged — both on the POS and on the customer-facing catalog.
The owner sees a single feed of every move: what changed, why, and by how much. No more "wait, why did margin drop this month."
We didn't start from zero. The POS skeleton came from our own Floural template — sales, expenses, attendance, payments. The custom work was inventory: splitting it, costing it, and surfacing it.
Inventory model on paper before a single line of code. Mapped every category, every unit (kg / sak / liter / pcs), every supplier MOQ, every expiry-tracked SKU.
Built inventory_items + inventory_stock junction (one master, per-location qty & HPP). Wired weighted-average cost on every receive. Transfer flow ("Pindah ke Toko") shipped same week.
Sales now hit Toko first, fall through to Gudang, snapshot HPP onto the order line. Low-stock alerts and "What to buy" tab driven off live joins.
Customer-facing PWA reading the same stock table the POS writes to. Reorder calculator with container-fill snap. Price ticker reading off receiving events.
For one full week, every count was done both on the system and on the clipboard. Reconciled at the end. Discrepancies → bugs → fixed → handover.
No fabricated month-over-month numbers — the system is fresh. These are the workflows that have moved off paper and out of the owner's head.
Gudang and Toko have their own qty and HPP. Sales fall through cleanly. Transfers carry cost.
Every receive recomputes HPP and re-prices retail per the owner's markup band. Catalog reflects it instantly.
One tab, sorted by urgency, including expiry-soon items. Replaces the Friday clipboard round.
Public catalog reads the same table the POS writes to. No staging, no caching delay.
Reorder suggestions snap to MOQ and container fill. Owner sees the math, can dial it, then sends.
Replaces every Play Store POS attempt that didn't fit. Owned outright. Hosts on a small VPS.
Runs on the staff Android tablet at the counter. Offline-first via a queued sync store — counter keeps taking sales when wi-fi blinks, replays when it returns. OTA updates so we ship JS-only fixes without a reinstall.
One file per domain, ?action= routing, raw PDO. JWT auth. Audit log on every mutation so we can trace any stock change back to a person and a moment.
Public-facing browser app. Reads the same inventory_stock table the POS writes to — no separate sync. Education-first: each product carries a "why this" note for cross-sell context.
One inventory_items row per SKU. Two inventory_stock rows (Gudang, Toko) keyed by (item_id, location). Every receive event triggers weighted-average HPP and an optional retail re-price.
Free scope-out call. We'll tell you the cheapest thing that actually fits.