CimaTech
all work
shipped system

ERP · for Colón Free Zone traders

Free Zone Trading ERP

Live in production · stock that cannot be sold twice

Free Zone Trading ERP dashboard showing billed revenue, gross margin and a receivables aging table, with an invoice being issued

The problem

In a Free Zone office several people invoice from the same stock at once, and a spreadsheet or an old desktop system lets two of them sell the same cartons. This ERP moves stock and balances only through the database itself, so the figure on screen is always the real one, and the invoice, the packing list and the landed cost come from the same records.

What we built

invoicing
Invoices by carton and unit, downloaded as a real PDF together with the packing list the warehouse checks boxes against: weight, volume, and origin and composition when the goods carry them. Freight and handling billed to the client sit between subtotal and total, and invoice numbers can never repeat, even when two people press New at the same moment.
stock
Stock only moves through database functions that lock the rows first, so two invoices cannot both sell the last ten cartons. A draft reserves nothing, a closed invoice is frozen, and adjustments are add-only, so the history always explains why a SKU stands where it does.
landed cost
Purchases are entered freely while pending and only raise stock when closed. Freight, insurance and handling are spread over each SKU by value, showing the landed unit cost per line and printing as an internal costing sheet: the number to set the selling price from.
receivables
A statement per client with charges, payments and a running balance, and a front page with revenue against last year, collections, gross margin, inventory value and balances by age. A SKU with no cost recorded is left out of the margin and flagged, instead of quietly showing 100%.
money
Exact decimals in Postgres and in the browser, never floating point. The app only sends what the user typed, quantity and price, and the server works out every total, backed by 64 automated tests.
migration
Products, clients and open invoices come in from a spreadsheet, with templates provided. You see what will be created, skipped or rejected before anything is saved, and old invoices keep their dates and payments, so day one starts with real balances.

Screens

The front page: billed revenue against last year, collections, gross margin, inventory value and receivables by age. All figures are demo data.
The front page: billed revenue against last year, collections, gross margin, inventory value and receivables by age. All figures are demo data.
Purchase costing: freight, insurance and handling spread over each SKU by value, showing the landed cost of every unit.
Purchase costing: freight, insurance and handling spread over each SKU by value, showing the landed cost of every unit.
The invoice book, with balances and overdue days worked out on the server so filters and totals stay right at any size.
The invoice book, with balances and overdue days worked out on the server so filters and totals stay right at any size.
The printed invoice, laid out the way Free Zone customers and customs expect it.
The printed invoice, laid out the way Free Zone customers and customs expect it.
Inventory with live stock, cost, price and markup per SKU.
Inventory with live stock, cost, price and markup per SKU.
The public site for the ERP. The system itself sits behind a login.
The public site for the ERP. The system itself sits behind a login.

Stack

ReactSupabasePostgresEdge Functions

Need something like this?

Tell us what the problem is costing you, and we will tell you what it takes to fix it.

book a 15-minute call