Paaros
The desk a wholesale pharmacy runs its week on.
Paaros is the web app a wholesale pharmacy uses to sell to clinics and shops, collect what they owe, and keep track of stock by batch and expiry. The parts that needed the most care were stopping a customer from buying on credit once they owe too much, treating a cheque as unpaid until it clears, and keeping the stock count honest.
- Origin
- Client project
- Platforms
- Web
- What people open
- Staff desk
- Role
- I designed it and I built it
- On this project
- Next.js · Convex · TypeScript

Why it matters
A wrong number becomes an argument.
When a business sells on credit, every decision depends on the figures: who can still buy, who needs a reminder, which batch should go out first. Paaros keeps the sale, the payment, and the stock together in one place, so the day starts with what to do next, not with checking whether the numbers are right.
Where it started
The medicine moved. The books didn't keep up.
A wholesale pharmacy sells to clinics and shops, mostly on credit. They take the stock now and pay weeks later, and the record of that was a spreadsheet, a handwritten invoice, and someone's memory of who was late.
When a number is wrong, the argument ends up being about the books instead of the medicine, and a batch can sit on the shelf past its date unnoticed. Every morning came down to the same questions about what sold, what came in, who owes, and what is about to expire.
What I built
One desk for the sale, the debt, and the shelf.
- 01
A Today screen showing sales, money in by method, profit, what is overdue, low stock, batches near expiry, who to collect from, and who is blocked from buying more.
- 02
Invoices for cash or credit. A credit sale gets its due date from that customer's terms, and saving it takes stock from whichever batch expires first.
- 03
Payments by cash, mobile money, bank transfer, or cheque. One payment can cover several invoices, and one invoice can be settled by several payments.
- 04
A view of who owes, split by how late it is, from not yet due through 1 to 30 days, 31 to 60, 61 to 90, and over 90.
- 05
Customers with a credit limit and a discount. A new credit sale is stopped when they are over the limit or an invoice is past its date.
- 06
Products with a price and a unit, and stock listed by batch and expiry, with low, out of stock, near expiry, and expired each getting their own list.
Sell
The invoice, the payment, and who is late.




In the build
The hard parts.
Credit that stops itself
A customer who is over their limit, or late on an invoice, can't take more on credit. An administrator can allow it, but has to give a reason, and that reason is kept.
A cheque is not money until it clears
Cash, mobile money, and bank transfers land as paid. A cheque stays pending, and if it bounces the debt goes back on the account while the original payment stays on the record.
Stock is a list of changes
Nobody types over a quantity. A delivery, a sale, a return, and a correction are each their own line, and what is on hand is simply the sum of those lines, batch by batch.
The price on the invoice stays put
Each line keeps the price, the discount, and the tax from the day it was written, so changing a product's price later never rewrites sales that are already made.
Profit is not on every screen
A salesperson can sell and record a payment. Cost and profit show on Today, and only for an administrator.
Two ways an invoice gets a number
The website numbers its own invoices in order, but an invoice already written in a paper book keeps the number printed on it and the date it was written.
The shelf
Who they sell to, and what is still in date.



Next project
An iPhone app for keeping track of every show you watch, episode by episode.