Built for Bangladeshi retail — ৳ pricing, VAT-ready
AT-TOHFA

Sell it, cost it, know the profit on every single line.

A complete point of sale for Bangladeshi shops. Scan and sell in seconds, consume stock batch-by-batch at its real purchase cost, track dues and returns, and read a profit & loss statement that already accounts for expenses and shrinkage.

INV-20260826-0147
Live
Scan barcode or search by name / SKU…
Rice 5kg
৳280.00Bag
Soyabean Oil
৳185.00Liter
Sugar 1kg
৳95.00Kilogram
Flour 2kg
৳120.00Pack
Table Salt
৳30.00Packet
Loose Tea
৳60.00Gram
Laundry Soap
৳45.00Piece
Fresh Milk
৳75.00Liter
Farm Eggs
৳140.00Dozen
Current Sale3 items
Rice 5kg
2 Bag
৳560.00
Soyabean Oil
1 Liter
৳185.00
Sugar 1kg
3 Kilogram
৳285.00
Subtotal৳1,030.00
Special offer− ৳30.00
VAT 5%৳50.00
Total৳1,050.00
Received (Cash)৳1,100.00
Change due৳50.00
CashCardbKash
Complete Sale ✓
26
Units of measure
Piece, Kilogram, Litre, Dozen, Carton…
14
Discount types
Percentage, bulk, seasonal, coupon…
6 × 12
Roles × guarded pages
Access is data, not hardcoded
21
Write-off reasons
Each one valued into your P&L

Every number on this page is a real field, enum, or report in the system — not a marketing figure.

Every module

One system, from the counter to the accounts

Sixteen working areas, each one a real page in the app. Nothing on this list is a roadmap item.

Sell

Everything that happens at the counter.

POS Terminal

Full-screen selling: scan a barcode or search by name and SKU, filter by category and brand, then take payment and print the receipt.

Barcode scan lookup/pos

Sales & Invoices

Every sale gets a dated, unique invoice number you can look a customer up by. Void a sale and stock, balances and profit all reverse with it.

INV-YYYYMMDD-0001/sales

Returns & Exchanges

Full return, partial return or exchange — each with a reason, an optional restocking fee, and an approval step before money moves.

10 return reasons/sales

Stock

What you hold, what it cost you, and what you lost.

Products

SKU, auto-generated barcode, purchase and selling price, per-product tax rate, shelf location, low-stock threshold and reorder point.

26 units of measure/products

Purchase Batches

Receive stock as batches, each carrying its own unit cost and expiry date. Selling consumes the oldest batch first, so cost stays truthful.

FIFO consumption/purchases

Stock Write-offs

Record expired, damaged, stolen, sampled or donated stock against a specific reason, with the loss valued and carried into your P&L.

21 reasons, loss valued/product-removal

Categories

Organise the catalogue into categories that drive POS filtering and every category-level report.

/setup/categories

Brands

Group products by brand for faster lookup at the counter and cleaner reporting in the back office.

/setup/brands

Money

Cash in, cash out, and what is still owed.

Customer Dues

Sell on credit within a customer's limit, collect part-payments over time, and see exactly who is overdue and by how much.

Full balance ledger/dues

Expenses

Log rent, salaries, utilities, transport and the rest against a category and payment method, with a receipt reference kept on file.

10 expense categories/expenses

Profit & Loss

Revenue → cost of goods sold → gross profit → expenses → net profit, with shrinkage and refunds already deducted.

True net profit/reports/profit-loss

Sales Report

Filter by date, search by invoice or customer, and break the period down by product, category, payment method and return rate.

CSV export/reports/sales

Control

Who sees what, and how the shop is set up.

Daily Dashboard

Today's revenue, orders, margin and new customers, plus top products, recent sales, low-stock warnings and a 30-day trend.

/dashboard

Inventory Report

Stock value at cost and at retail, turnover, out-of-stock and low-stock lists, batch ageing, expiry warnings and reorder suggestions.

Expiry & ageing/reports/inventory

Users & Roles

Add staff, assign one of six roles, change passwords and suspend accounts. Every product change is stamped with who made it.

6 role levels/users

Shop Settings

Shop name, contact details, currency and default tax rate — plus the permission matrix and a full database backup and restore.

Backup & restore/settings
The counter

A terminal built for a queue

The POS runs full-screen on whatever you already have at the counter. Scan, adjust quantity, apply the discount, take the money — and the sale carries its own cost and profit with it from the moment it closes.

Scan or search

Every product gets a unique barcode automatically. Scan it, or search across name, SKU, description and barcode at once.

Sell by weight or volume

Quantities are stored to two decimal places, so 1.25 kg of sugar or 0.5 litre of oil rings up exactly — across 26 units of measure.

Discounts that fit the deal

Fourteen discount types — percentage, fixed amount, bulk, seasonal, loyalty, trade, coupon code and more — applied per sale.

VAT handled per sale

A shop-wide default tax rate, overridable per product and per sale, with the tax amount stored alongside the total.

Six ways to get paid

Cash, card, mobile banking, bank transfer, digital wallet or other — with change calculated for you, or the balance left as a due.

Numbered instantly

Each sale is stamped INV-YYYYMMDD-0001 the moment it completes, and a printable receipt is ready straight away.

INV-20260826-0147
Live
Scan barcode or search by name / SKU…
Rice 5kg
৳280.00Bag
Soyabean Oil
৳185.00Liter
Sugar 1kg
৳95.00Kilogram
Flour 2kg
৳120.00Pack
Table Salt
৳30.00Packet
Loose Tea
৳60.00Gram
Laundry Soap
৳45.00Piece
Fresh Milk
৳75.00Liter
Farm Eggs
৳140.00Dozen
Current Sale3 items
Rice 5kg
2 Bag
৳560.00
Soyabean Oil
1 Liter
৳185.00
Sugar 1kg
3 Kilogram
৳285.00
Subtotal৳1,030.00
Special offer− ৳30.00
VAT 5%৳50.00
Total৳1,050.00
Received (Cash)৳1,100.00
Change due৳50.00
CashCardbKash
Complete Sale ✓
Stock & cost

Your margin is only as honest as your cost price

Stock arrives in batches, and each batch remembers what you actually paid for it. Selling draws down the oldest batch first, so the cost attached to a sale is the real one.

Rice 5kg

/purchases

112 Bag in stock across 3 batches

Batch #A-1042Selling from this
Remaining
12 of 60 Bag left
Unit cost
৳242.00
Received 02 Aug
Exp 12 Sep 2026
Batch #A-1078Queued
Remaining
60 of 60 Bag left
Unit cost
৳248.50
Received 14 Aug
Exp 24 Sep 2026
Batch #A-1103Queued
Remaining
40 of 40 Bag left
Unit cost
৳251.00
Received 23 Aug
Exp 02 Oct 2026

The next bag sold costs ৳242.00, not an averaged guess. When batch #A-1042 runs out, costing moves to #A-1078 by itself.

Low-stock and reorder alerts

Set a low-stock threshold and a reorder point per product; the dashboard and inventory report surface anything that crosses them, with suggested reorder quantities.

Expiry and ageing reports

Because expiry lives on the batch and not the product, you can see precisely which lot is about to date out — and how long stock has been sitting.

Know where it physically is

Each product carries a shelf or warehouse location, so the person picking it doesn't have to guess.

A full audit trail

Created, updated, restocked, adjusted, price changed, status changed or deleted — seven action types, each stamped with the user who did it and when.

Profit intelligence

Profit measured per line, not guessed per month

Every item sold stores what it sold for and what it cost, right there on the sale. That single decision is what makes a real profit & loss statement possible at the end of the month.

One sale, itemised

/sales

INV-20260826-0147

ItemSoldCostProfit
Rice 5kg
×2
৳280.00৳242.00
৳76.00
15.70%
Soyabean Oil
×1
৳185.00৳158.00
৳27.00
17.09%
Sugar 1kg
×3
৳95.00৳82.00
৳39.00
15.85%
Subtotal৳1,030.00
Special offer− ৳30.00
Cost of goods sold− ৳888.00
Gross profit
৳112.00
11.20% margin

One month, all the way down

/reports/profit-loss

Nothing here is entered by hand — it is assembled from sales, batches, expenses, returns and write-offs.

Gross sales
৳502,400
Returns & refunds
− ৳19,800
Net revenue
৳482,600
Cost of goods sold
− ৳412,300
Gross profit
৳70,300
14.57% of net revenue
Operating expenses
− ৳38,450
Stock write-offs
− ৳4,120
Net profit
৳27,730
5.75% of net revenue

Illustrative figures — but this is the exact chain the report computes, including shrinkage from written-off stock, which most small-shop software silently ignores.

Customers & dues

Selling on baki, without losing track of it

Credit is how a great many Bangladeshi shops actually trade. Here it is a first-class feature with a proper ledger behind it — not a note scribbled in a register.

Karim General Store

Wholesale

Credit limit ৳50,000 · ৳37,550 still available

/dues
Outstanding balance
৳12,450
Partial
25% of credit limit used
Balance history
Opening balance+ ৳5,000
Carried over৳0 → ৳5,000
Credit sale+ ৳18,200
INV-20260812-0093৳5,000 → ৳23,200
Payment received− ৳10,750
PAY-20260820-0061৳23,200 → ৳12,450
1

A credit limit that means something

Give a customer a ceiling and an opening balance. Their running balance moves with every sale and every payment, so you always know how much rope is left.

2

Part-payments, not all-or-nothing

Take ৳500 today and ৳2,000 next week against the same invoice. The sale tracks paid and due separately and moves through PARTIAL, COMPLETED or OVERDUE on its own.

3

Every payment gets a number

Collections are recorded as PAY-YYYYMMDD-0001 with the method, transaction or cheque reference, and who took the money — with a printable receipt.

4

Mistakes are reversible

Void a payment and the customer's balance unwinds with it. The ledger keeps the history rather than quietly rewriting the number.

Who owes you, right now. The dues page lists every customer with an outstanding balance and flags sales past your chosen overdue threshold, so chasing money stops being guesswork.

Returns & shrinkage

Stock leaves for reasons other than a sale

Goods come back, and goods go bad. Both are recorded against a reason and a value, so your closing stock and your profit figure stay believable.

Returns & exchanges

/sales
Full return
The whole sale comes back and is refunded.
Partial return
Only the lines the customer actually brought back.
Exchange
Swapped for a different product, with the difference settled.
Nothing refunds itself
Pending→
Approved→
Completed
(or rejected / cancelled)
  • •Ten reasons — defective, wrong item, damaged, size, colour, quality, changed mind and more — recorded per returned line.
  • •Charge a restocking fee where it is fair, and note the condition the goods came back in.
  • •Restock only what is genuinely resaleable; the system records who restocked it and when.
  • •Refunds are netted out of your sales figures and your return rate is reported alongside them.

Stock write-offs

/product-removal

When stock is removed for any reason other than a sale, say why. Each write-off carries a quantity and an estimated loss, and can be pinned to the specific batch and expiry date it came from.

Fresh Milk — 6 Litre
Expired · Batch #M-208 · dated out 24 Aug
− ৳372.00
estimated loss
All 21 reasons
ExpiredDamagedBrokenDefectiveStolenLostSampleQuality issueRecallWasteDonationEmployee useTestingDemonstrationShowroom displayPromotionalManufacturer defectShipping damageStorage damageNatural disasterOther

The total flows into your profit & loss report as shrinkage — the quiet cost that usually goes unmeasured.

Expenses & reporting

The back office, already reconciled

Record what the shop spends, then read three reports that pull sales, stock, expenses, returns and write-offs into one picture.

Where the money went

/expenses

August 2026 · ৳38,450 across 10 categories

Salaries৳15,000 (39.0%)
Rent৳12,000 (31.2%)
Utilities৳4,800 (12.5%)
Transportation৳3,200 (8.3%)
Supplies৳2,100 (5.5%)
Other৳1,350 (3.5%)
Attach the receipt and keep a reference number against each entry — five payment methods, from cash to mobile payment.
Export expenses, products, sales and inventory to CSV whenever your accountant asks.

Sales report

/reports/sales

Any date range, searchable by invoice, customer name or phone. Breaks down by top products, category, payment method and return rate, with net sales after refunds.

Inventory report

/reports/inventory

Stock value at cost and potential revenue at retail, inventory turnover, per-product margin, out-of-stock and low-stock lists, batch ageing and expiry warnings.

Profit & loss

/reports/profit-loss

Gross and net profit with margins, expense breakdown by category, shrinkage from write-offs, returns by reason, month-by-month trend and your most profitable products.

Access control

Who can open what is a setting, not a rebuild

Twelve pages, six roles. The grid below is how a new shop starts — and every tick in it can be changed from inside the app, taking effect immediately.

PageSuperAdminOwnerAdminManagerStaffCustomer
Dashboard
/dashboard
POS terminal
/pos
Sales
/sales
Dues
/dues
Products
/products
Purchases
/purchases
Stock write-offs
/product-removal
Setup
/setup
Expenses
/expenses
Users
/users
Reports
/reports
Settings
/settings

Scroll the table sideways to see every role →

Permissions are data, not code

A SuperAdmin edits the matrix in Settings. The change lands in the database and the very next request is judged against it — no deployment, no developer, no downtime.

Enforced on the server too

Hiding a menu item is not security. The same page-to-role map guards the API, so a hidden page cannot be reached by typing its address or calling the endpoint directly.

Foundations

Boring, in the way infrastructure should be

No uptime badge invented for a landing page — just the things that are actually in place.

Passwords are hashed, never stored

Credentials are bcrypt-hashed. Sign-in issues a short-lived access token plus a refresh token held in an httpOnly cookie.

Backup and restore, built in

Take a complete database backup as a file from inside the app, and restore from one when you need to. Reserved for the SuperAdmin.

Hardened by default

Secure HTTP headers, strict request validation that rejects unexpected fields, a locked-down cross-origin allow-list, and per-IP rate limiting.

Health checks you can watch

A health endpoint reports database connectivity and memory pressure, so your host or uptime monitor can tell you before your staff do.

An audit trail on your stock

Product changes are logged with the action, the user and the timestamp. Sales, payments and write-offs all record who was responsible.

Your database, your data

It is a standard PostgreSQL database. Run it on your own server, export to CSV whenever you like, and take your backup file with you.

Getting started

Five steps, in this order

Step three matters most: products carry prices, but batches carry cost. Without a purchase batch, there is nothing for the profit figures to work from.

01

Set up the shop

/settings

Shop name, address and phone, your currency and the default tax rate every sale should inherit.

02

Categories and brands

/setup

Create the groupings your catalogue needs. These drive POS filtering and every category-level report later on.

03

Add products, then stock them

/products

Enter each product with its price, unit and low-stock threshold — then receive a purchase batch so it has real quantity at a real cost.

04

Invite your staff

/users

Create accounts and give each one a role. Adjust the permission matrix if the defaults don't match how your shop runs.

05

Open the counter and sell

/pos

From the first sale onward, stock, costs, profit, dues and reports all keep themselves up to date.

Straight answers

Including the ones that are a no

Where the system doesn't do something yet, it says so here rather than letting you find out later.

Ready to see where
your profit actually is?

Sign in and start with your shop settings. From the first sale, the numbers keep themselves honest.

Runs on your own serverStandard PostgreSQL data you ownRole-based access, enforced server-sideBackup & restore built in