PoishaPOS — Multi-Tenant Retail POS SaaS for Bangladesh
A cloud point-of-sale and retail management platform for shops in Bangladesh. It handles fast barcode checkout, bKash/Nagad/cash payments, offline selling, inventory, purchases, customer dues and profit reports, with multiple shops, branches and counters on one system.
- Category
- Web Application
- Role
- Developer
- Completed

PoishaPOS (“Every Poisha Counts.”) is a subscription-based point-of-sale and retail management system built for grocery stores, convenience shops, cosmetics, electronics and stationery retailers in Bangladesh. Many independent businesses share one platform, and each business’s data is completely isolated from the others. A single business can run several branches, each with multiple checkout counters.
My aim was a system that small and mid-sized retailers can rely on every day. It needed to be quick at the counter, accurate with money and stock, and still usable when the internet goes down, which happens often for shops here.
The problem
Most local shops track sales in notebooks or in basic billing software that doesn’t follow stock, customer dues or real profit. Cloud POS tools often stop working without internet, and many don’t fit local needs such as mobile-wallet payments, VAT-inclusive prices and credit (baki) sales.
Key features
Point of Sale
- Fast product search by name, SKU or barcode, with USB/Bluetooth barcode scanner support
- Quantity shortcuts, pack sizes (e.g. a carton barcode adds 24 pieces), line and order discounts
- Split payments across cash, card, bKash, Nagad, Rocket and bank transfer, with automatic change calculation
- Credit sales posted to the customer’s due account, with credit limits
- Hold and resume carts, 80 mm thermal receipt printing, keyboard shortcuts for speed
- Manager approval at the counter for discounts or refunds above a set limit
Offline checkout
- Built as a Progressive Web App: the till keeps selling when the internet drops
- Sales are saved safely in the browser (IndexedDB) and sync automatically when the connection returns
- Each sale carries a unique ID, so a retry can never create a duplicate sale or a double stock deduction
- Anything that would have been refused online (an old price, overselling stock) is flagged for a manager to review instead of being lost
Inventory
- Stock per branch, with a complete stock ledger: every change is recorded and traceable
- Opening stock, adjustments for damage, expiry and loss, stock counts, and inter-branch transfers
- Weighted-average costing for accurate stock valuation and profit
- Low-stock alerts
Purchases & suppliers
- Goods receiving with landed cost (discount, shipping and VAT spread into the unit cost)
- Supplier balances, payments and purchase returns
Customers, returns & cash
- Customer profiles, purchase history, dues and collections
- Partial returns and refunds with approval rules; voids reverse stock and payments
- Cash drawer shifts showing the opening float, expected cash and counted cash, so shortages are visible
Reports & dashboard
- Sales by day, product, cashier, payment method and branch
- Net sales, cost of goods sold, gross profit and estimated operating profit
- Stock valuation, customer and supplier dues, expense reports
- CSV export and print-to-PDF
SaaS platform
- Self-service signup with a 14-day trial
- Subscription plans that limit branches, counters, users and features, enforced on the server
- An operator console to manage businesses, verify subscription payments and answer support tickets, without access to any shop’s private business data
- Role-based access with seven roles (Owner, Admin, Branch Manager, Cashier, Inventory Staff, Accountant, Auditor), scoped per branch
- English and Bangla interface
Technology stack
Backend: PHP 8
The server side is written in modern PHP 8 on my own lightweight MVC architecture rather than a heavy framework. It has a clean separation of routing, middleware, controllers and a service layer where all the business rules live. The application needs no third-party packages, which keeps it fast, easy to maintain and simple to deploy.
Database: MySQL / MariaDB
Data is stored in MySQL with the InnoDB engine across 56 well-structured tables, built and updated through version-controlled migrations. Composite foreign keys link every record to its own business at the database level, and transactions keep sales, payments and stock consistent.
Frontend: HTML5, CSS3 and JavaScript
The interface is built with semantic HTML5, a custom CSS design system and vanilla JavaScript ES modules, without a frontend framework. It is responsive across desktop, tablet and mobile, and the POS screen is optimised for keyboard, barcode scanner and touch use.
Offline capability: Progressive Web App
A Service Worker and Web App Manifest let the POS open and run without internet, and IndexedDB stores sales safely in the browser until they sync back to the server.
Security
Passwords are securely hashed. Every form is protected against CSRF, sessions are hardened, and login attempts are rate-limited. Role-based permissions are checked on the server for every action, and an audit log records sensitive changes.
Testing and quality
Automated tests run against a real MySQL database to verify sales, stock, returns, cash and data isolation between businesses. Playwright browser tests simulate a cashier selling online and offline, then syncing.
Hosting and deployment
The system runs on XAMPP for local development and on standard cPanel shared hosting in production, with no Composer or SSH access needed. That makes it affordable to host and easy to deploy.
Engineering highlights
- Data isolation by design: every business’s records are tied to its own account at the database level, so one shop can never see or change another shop’s data. This is covered by automated tests.
- Money and stock you can trust: amounts use exact decimal arithmetic, not floating point. Each sale, payment and stock movement is saved in a single database transaction, so a failure never leaves half-saved records.
- Safe under pressure: row-level locking means that if two counters sell the last item at the same moment, only one sale succeeds. This was verified with parallel-process tests.
- Full traceability: completed sales are never edited or deleted; corrections are recorded as returns or voids, and sensitive actions go into an audit log.
- Tested: 48 automated integration and unit tests, plus a 16-step browser test covering online checkout, offline sale, page reload, reconnect and sync.
My role
I designed and built the system end to end: requirements and business rules, database design, backend, POS interface, offline sync, the SaaS admin area, testing, and deployment documentation for XAMPP and cPanel.



