ERP / Distribution
GeoPro ERP
One system for two sister companies that ran on spreadsheets — stock, quotes, invoices, KRW purchasing and P&L.
- Client
- Medical-aesthetics distributor (PH)
- Year
- 2026 - Present
- Engagement
- 4 months to go-live


Client requirements live
SKUs migrated at go-live
Automated tests
From kickoff to go-live
The brief
Replace every Excel tracker — stock per warehouse, quotes, receivables and KRW supplier prices — on live data from day one.
What we built
A multi-company Next.js ERP with a stock ledger, pricing approval, partial payments, KRW purchasing and per-role permissions.
- Per-warehouse stock from a movement ledger
- Quotation approval below minimum price
- Invoicing that deducts stock automatically
- Partial payments and customer statements
- KRW purchase orders with landed cost
- Profit & loss with matched cost of sales
- Permission matrix, live without re-login
- CSV product import with preview
Engineering highlights
Where the obvious approach was wrong.
- 01
Approval that can't be bypassed
Confirm and invoice both refuse while pricing is pending, and approval is tied to a snapshot of the lines — any edit re-opens it.
- 02
Decided under the row lock
The approval state is worked out inside the transaction, after the row lock, so a manager's concurrent approval is never overwritten.
- 03
No double payments
One atomic UPDATE adds a payment only if it fits the balance, so two payments at once can't overpay an invoice.
- 04
Permissions that apply instantly
Roles resolve from the database on every request instead of an 8-hour token, so edits and deactivations take effect immediately.
- 05
Numbering that won't collide
Per-company, per-year sequences (INV/2026/00147) fixed a collision before a second company or the next January could hit it.
- 06
Cost of sales that reconciles
Invoicing snapshots each line's unit cost, so the P&L reads revenue and cost from the same rows across month ends.
- 07
KRW buying, PHP books
The FX rate is locked per order, landed cost is spread across lines by value, and receiving updates a weighted-average cost.
- 08
Shipping as a product, not a field
A built-in VATable shipping product reused the existing line, tax and report code instead of changing all of it.
Inside the product
A closer look.




Want results like these?
Tell us about your project and book a free consultation.
