Building materials · Trade ERP · Partner portal
Techizat — Wholesale trade ERP with a partner portal for building materials
From six spreadsheets to one ledger on a phone
We built Techizat for a Baku building-materials supplier that sells to construction companies. Purchases, sales, payments, FIFO margin, quotes, invoices and delivery notes live in one phone-first system, and every partner gets a portal with their own balance and documents.
Ledger · today
- 16 Sep · ST-2026-0158 Sale Model Yard LLC 1,200.00 ₼
- 16 Sep · PM-2026-0043 Payment in Sample Homes LLC 500.00 ₼
- 15 Sep · PR-2026-0086 Purchase Demo Cement Supply 3,080.00 ₼
- 15 Sep · ST-2026-0156 Sale Demo Build LLC 960.00 ₼
- 14 Sep · ST-2026-0151 Sale Sample Homes LLC 1,620.00 ₼
- 13 Sep · PM-2026-0041 Payment out Demo Cement Supply 2,000.00 ₼
- 12 Sep · ST-2026-0142 Sale Demo Build LLC 1,422.00 ₼
- 8 Sep · AV-2026-0012 Advance in Demo Build LLC 2,000.00 ₼
- 16 Sep · ST-2026-0158 Sale Model Yard LLC 1,200.00 ₼
- 16 Sep · PM-2026-0043 Payment in Sample Homes LLC 500.00 ₼
- 15 Sep · PR-2026-0086 Purchase Demo Cement Supply 3,080.00 ₼
- 15 Sep · ST-2026-0156 Sale Demo Build LLC 960.00 ₼
- 14 Sep · ST-2026-0151 Sale Sample Homes LLC 1,620.00 ₼
- 13 Sep · PM-2026-0041 Payment out Demo Cement Supply 2,000.00 ₼
- 12 Sep · ST-2026-0142 Sale Demo Build LLC 1,422.00 ₼
- 8 Sep · AV-2026-0012 Advance in Demo Build LLC 2,000.00 ₼
₼ Balance 16 September
Net position
18,640.00 ₼
- Owed to us (7)
- 26,480.00
- We owe (3)
- 7,840.00
Oldest open debts
- Example Towers LLC 64 d 7,850.00
- Sample Homes LLC 41 d 4,120.00
- Model Yard LLC 12 d 2,760.00
Sale saved ST-2026-0142 · 1,422.00 ₼
FIFO margin ST-2026-0142 · 18.4%
Project facts
- Project type
- Client project
- Industry
- Trade and distribution
- Platforms
- Mobile-first PWA · Desktop · Partner portal
- Languages
- Azerbaijani
01 The challenge
Six spreadsheets, and nobody knows the margin
The supplier buys building materials and resells them to construction companies. The trade ran on six supplier-statement spreadsheets, WhatsApp and phone calls. Purchases were written down. Sales were not.
supplier-statement-1.xlsx
Balance =SUM(D2:D41)
supplier-statement-2.xlsx
Balance =D41-E41
supplier-statement-3.xlsx
Balance =SUM(F:F)*1.18
supplier-statement-4.xlsx
Balance typed by hand
supplier-statement-5.xlsx
Balance #REF!
supplier-statement-6.xlsx
Balance =D40-E40+G12
How much do we owe them now?
Let me open the files and call you back
Margin = ?
-
Sales were never recorded
Every purchase had a line in a supplier statement. The other half of the trade lived in chats, so the profit of a sale was a guess.
-
Six files, six ways to count
Each spreadsheet computed its balance with its own formula. An error in one file quietly cancelled an error in another.
-
Advances fell between the rows
Money paid ahead to suppliers and deposits sat outside every balance, so nobody could say where the working capital was.
-
One product, many names
The same bag of cement appeared under different free-text names, so stock and prices could not be compared.
-
Every answer took a call
“How much do they owe us?” meant opening files, adding up columns and calling back.
Our design rule
If an entry takes longer than a WhatsApp message, nobody will make it. So every screen is designed around a phone and a stopwatch.
02 Sales on a phone
An entry in under 20 seconds
Partner, product, quantity, price, save. A sale is recorded between two calls, and a typical entry takes under 20 seconds on a phone. An automated end-to-end test times a phone entry on an emulated device on every release, against a hard time limit.
Stopwatch 17.4 s
Typical entry under 20 s
- Partner
- Product
- Quantity
- Price
- Save
New sale
Purchase Sale Payment
Partner Recent
Demo Build LLC Sample Homes LLC Model Yard LLC
Product
Cement M500 bags
Quantity
180
Unit price
7.90
Total 1,422.00 ₼
FIFO margin 261.00 · 18.4%
- Credit limit within
- In stock 470 bags
Save
Saved · ST-2026-0142
-
Recent partners first
The companies you sold to last sit at the top of the picker, so most sales start with a single tap.
-
One catalogue, no free text
Products come from a searchable catalogue. A supplier’s own product name is mapped to it once and remembered on every purchase.
-
Numbers are never guessed
“1.465,20” and “1,465.20” mean different things. When the separators are ambiguous, the form asks you to retype instead of guessing.
-
Drafts and duplicates
An interrupted entry waits as a draft. A supplier invoice entered twice within a week is flagged before it is saved.
03 FIFO cost and margin
Every sale knows which purchase it came from
Each purchase line opens a cost layer. Sales consume the oldest layers first and every consumption is stored, so the margin of each sale is a recorded fact, not a month-end estimate.
-
The first sale drains the oldest layer
180 bags for Demo Build LLC take all 120 bags of the first layer and 60 of the second. Cost, revenue and margin are stored with the sale.
-
The second sale meets a new price
200 bags for Sample Homes LLC finish the second layer and open the third. The newer purchase price shows up in the margin straight away.
-
The third sale refuses to invent a cost
150 bags are sold, but only 90 are left in layers. Techizat costs those 90 and marks the sale “cost incomplete” until the purchase invoice arrives. It never fills the gap with the last price or with zero.
Cost layers Cement M500 · bags
Margin of the last sale Cost incomplete
60 bags
no purchase yet
L1 2 Sep
120 × 6.40
L2 5 Sep
200 × 6.55
L3 11 Sep
150 × 6.70
-
ST-2026-0142 Demo Build LLC 180 bags × 7.90
L1 120 × 6.40L2 60 × 6.55
- Cost
- 1,161.00
- Revenue
- 1,422.00
- Margin
- 261.00 · 18.4%
-
ST-2026-0151 Sample Homes LLC 200 bags × 8.10
L2 140 × 6.55L3 60 × 6.70
- Cost
- 1,319.00
- Revenue
- 1,620.00
- Margin
- 301.00 · 18.6%
-
ST-2026-0158 Model Yard LLC 150 bags × 8.00
L3 90 × 6.70 60 · no purchase yet
- Cost
- 603.00
- Revenue
- 1,200.00
- Margin
- Cost incomplete
Stock at cost 0.00 ₼
Purchases = cost of sales + stock at cost 3,083.00 = 3,083.00 + 0.00
-
Not a penny lost to rounding
The consumption that closes a layer takes its exact remainder, so purchases always equal cost of sales plus stock at cost.
-
Cost stays with the owner
An assistant can enter purchases, but cost and margin are hidden from that role.
-
Corrections with approval
A late price change on a purchase becomes a cost-correction request, and the owner approves it.
-
A light warehouse
Stock, counts, customer returns, returns to suppliers, write-offs and dead stock with no movement for 90 days.
04 Payments and balances
A balance nobody types
Techizat has no balance field. Every balance is recalculated from movements: goods, payments, advances, deposits and returns. It cannot drift out of sync, because there is nothing to keep in sync.
Partner statement Demo Build LLC · September
₼Date Document Movement Amount Balance
8 Sep AV-2026-0012 Advance received Advance received − 2,000.00 we owe 2,000.00
12 Sep ST-2026-0142 Sale Sale + 1,422.00 we owe 578.00
15 Sep ST-2026-0156 Sale Sale + 960.00 owes us 382.00
16 Sep PM-2026-0044 Bank payment Bank payment − 300.00 owes us 82.00
Computed from 4 movements. Never stored.
owes us 82.00 ₼
Where the money went
-
INV-2026-0031 ST-2026-0142 · 1,422.00 ₼ Paid
Advance 1,422.00
-
INV-2026-0034 ST-2026-0156 · 960.00 ₼ Partly paid
Advance 578.00 Bank 300.00 Open 82.00
-
Computed, never typed
Open the balance screen and every figure is rebuilt from movements. There is no stored total to fall out of date.
-
Advances and deposits count
Money paid ahead is part of the balance, so the owner sees how much working capital sits with suppliers.
-
One company, one balance
When you both buy from and sell to the same company, it has one card and one net position.
-
Payments find their documents
A payment covers open invoices oldest first, or exactly the ones you pick. Offsets, three-party settlements and debt transfers are recorded as what they are.
-
Nothing is deleted
A wrong line is reversed by a new line, so the history stays and the balance stays right. A debt write-off needs a reason.
-
Cash desks and bank accounts
Every money movement lands in a named cash desk or bank account, so cash on hand is a figure, not a feeling.
05 Quotes, invoices, delivery notes
From quote to delivery note, one thread
A request that arrives on WhatsApp becomes a quote. The accepted quote becomes a sale, and the sale gets an invoice and a delivery note. Each document knows where it came from and what state it is in.
- 01 Request
- 02 Quote sent
- 03 Accepted
- 04 Invoiced
- 05 Delivered
Quote
QT-2026-0007 10 Sep
Request via WhatsApp
Item Qty Price Sum
Cement M500 180 bags 7.90 1,422.00
Washed sand 12 t 24.00 288.00
Total 1,710.00 ₼
Partly fulfilled
AcceptedInvoice
INV-2026-0031 12 Sep
QT-2026-0007 → ST-2026-0142
Item Qty Price Sum
Cement M500 180 bags 7.90 1,422.00
Total 1,422.00 ₼
Paid
Delivery note
DN-2026-0019 12 Sep
Item Qty
Cement M500 180 bags
Received by · required R. Sample
Delivered-
A quote has a life
Request, sent, accepted, partly fulfilled, closed. A lost quote records why: price, lead time, stock or terms.
-
Sent means locked
Once a quote is sent its lines stop changing. A new offer is a copy, so what the customer saw is never rewritten.
-
Status from payments
An invoice is unpaid, partly paid, paid or overdue because of the payments allocated to it, never because someone ticked a box.
-
Delivery with a name
A delivery note needs the recipient’s name. Once delivered it never goes back; a mistake is fixed with a new document.
-
Numbering by series
Quotes, invoices and delivery notes each run their own automatic series, like QT-2026-0007.
-
Print and WhatsApp
Every document has a print view, and a WhatsApp message to the partner opens from the phone in one tap.
06 Receivables and credit limits
The sale that stops at the limit
Before a sale is saved, Techizat asks one question: what will this partner owe after this line? Close to the limit it warns. Past the limit the sale stops and asks for a reason.
Age of the oldest unpaid line
Debt age
- Example Towers LLC 64 d 7,850.00 60-day alert sent
- Sample Homes LLC 41 d 4,120.00
- Model Yard LLC 12 d 2,760.00
- Demo Build LLC 1 d 82.00
- Test Site Group settled —
< 30 d 30–59 d 60+ d
New sale
Example Towers LLC
- Owes now
- 7,850.00
- This sale
- +4,630.00
- After this line
- 12,480.00
- Credit limit
- 10,000.00
80% of the limit used Over the limit by 2,480.00
Reason
Paid in cash on delivery, agreed by phone
Saved with the reason · sent to the owner’s review
-
The question comes before the line
The check uses the balance after this sale, not the balance before it, so the warning arrives while it can still change the decision.
-
A reason, not a dead end
Past the limit the owner confirms with a reason. An assistant’s sale goes through with a reason and lands in the owner’s review queue.
-
“Not set” is not “unlimited”
A partner without a limit is shown as having no limit set, so a forgotten limit never passes for a generous one.
-
Age, not buckets
Debt age is the age of the oldest unpaid line. Alerts at 30, 60, 90 and 120 days fire once per debt, and the balance screen opens with the three oldest.
07 Partner portal
Each partner sees only their own
Partners find the answer in the portal instead of phoning for it. There a company sees its own balance, its lines in both directions, its reconciliation statements and the quotes addressed to it. Nothing about any other partner leaves the server.
All lines · owner
- 16 Sep PM-2026-0044 Demo Build LLC 300.00
- 15 Sep ST-2026-0156 Demo Build LLC 960.00
Other partners are never sent
₼ Partner portal Demo Build LLC
Your balance
You owe
82.00 ₼
as of 16 Sep
Your lines
- ↓ Bank payment 16 Sep · PM-2026-0044 300.00
- ↑ Sale 15 Sep · ST-2026-0156 960.00
- ↑ Sale 12 Sep · ST-2026-0142 1,422.00
- ↓ Advance received 8 Sep · AV-2026-0012 2,000.00
September statement Confirm
Quote QT-2026-0007 Accept
-
One company, nothing else
A partner sees its own balance, lines, statements and quotes. The server decides what is sent; the screen does not hide anything.
-
Reconciliation without calls
The monthly reconciliation statement is confirmed in the portal instead of over the phone.
-
Quotes accepted online
Accepting a quote is a deliberate, confirmed action, recorded with its time.
-
Access by approval
A partner applies for access, and the portal opens only after the owner approves the request.
-
Leak tests on every change
Automated tests sign in as one partner and try to read another partner’s data. Any leak fails the check.
08 Offline-tolerant PWA
No signal on site, no lost entries
Warehouses and building sites have weak coverage. Techizat keeps taking entries: they wait in a queue on the phone and go out when the connection returns, without booking anything twice.
On the phone
- Sale Model Yard LLC 1,200.00 Saved
- Payment in Sample Homes LLC 500.00 Saved
- Sale Example Towers LLC 4,630.00 Needs your answer
Server checks
- One-time key
- Credit limit
- Duplicate invoice
- Stock on hand
Resent · same key · not booked twice
Ledger
- Model Yard LLC 3,960.00
- Sample Homes LLC 3,620.00
- Example Towers LLC 7,850.00 Credit limit: give a reason
Balances change only after the server accepts an entry
-
Queued on the phone
Without a signal, entries are kept in a queue on the device, with the time they were actually made.
-
Honest numbers
A queued line is shown as not sent yet and does not change any balance until the server accepts it.
-
Never booked twice
Each entry carries its own one-time key from the moment it is written, so a resend is recognised and skipped.
-
Checks still apply
Credit limit, duplicate invoice and stock questions come back when the queue syncs and wait for the owner’s answer.
09 How it is built
Engineered like accounting software
The rules that protect money live in a framework-free domain core with unit tests. End-to-end tests run on desktop and mobile browsers, and custom checks stop anything that bends the money rules.
Checks on every change
- 01 Money maths in decimals, never floats passed
- 02 Balances rebuilt from movements passed
- 03 FIFO: purchases = cost of sales + stock passed
- 04 No partner can read another partner passed
- 05 Company data isolated in the database passed
- 06 Phone entry timed end to end passed
- 07 Financial lines reversed, never deleted passed
- 08 Data health: integrity checks passed
8 / 8 passed
- Ledger first
- Balances, debt age and invoice status are derived from movements. None of them is a field someone can edit.
- Exact money
- All money maths runs on decimals, and an automated guard rejects floating-point arithmetic on amounts.
- Domain core
- Ledger, FIFO, credit, debt age, quotes and documents live in one tested core that the web app and the portal share.
- Security
- Role-based permissions, a separate sign-in for partners, owner approval for portal access and tenant data isolation enforced in the database.
- Audit trail
- Reversals instead of deletions, reasons for write-offs and limit overrides, and an end-of-day review of the assistant’s entries.
- Data health
- A health screen separates broken data (red) from unfinished work (yellow), such as a sale still waiting for its purchase cost.
Three roles, three views
-
Owner
Sees cost, margin and every balance. Only the owner reverses lines, writes off debt and approves portal access.
-
Assistant
Enters purchases and payments. Cost and margin stay hidden, and the owner reviews the day’s entries.
-
Partner
Signs in to the portal and sees one company: its own balance, lines, statements and quotes.
Around the core
Our role
What Atlas BIP did
-
Discovery from the spreadsheets
We audited the supplier statements line by line and rebuilt the business as data: partners, a normalised product catalogue, purchases, payments and the sales that had never been recorded.
-
Phone-first product design
We designed every screen around one rule, faster than a WhatsApp message, and kept the interface calm: one card style, colour only where it means something.
-
Domain engineering
We wrote the ledger, FIFO costing, credit limits, debt age, quotes and documents as a tested core with exact decimal money maths.
-
Partner portal
We built the portal with its own sign-in, owner approval and per-partner data isolation, verified by automated leak tests.
-
Offline PWA and quality
We added the offline queue, end-to-end tests on desktop and mobile browsers, and a timed phone-entry test that runs on every release.
Stack
Built on a modern stack
- Application
-
- TypeScript
- React
- Next.js
- Tailwind CSS
- Offline
-
- PWA
- Service worker
- IndexedDB
- Data
-
- PostgreSQL
- Prisma
- Zod
- Quality
-
- Vitest
- Playwright
Questions and answers
What trading companies ask us
How fast is data entry on a phone?
A typical entry takes under 20 seconds on a phone. Recent partners come first, products are picked from a searchable catalogue and the total is always on screen. An automated end-to-end test times a phone entry on an emulated device on every release.
How does FIFO costing handle goods sold before the purchase invoice is entered?
Each purchase line opens a cost layer and sales consume the oldest layers first. If a sale needs more than the layers hold, Techizat costs what it can and marks the sale “cost incomplete” until the purchase arrives. It never invents a cost from the last price or zero.
What exactly can a partner see in the portal?
Only its own company: the balance, lines in both directions, reconciliation statements and quotes addressed to it. Access opens after the owner approves the request, and the separation is enforced on the server and in the database, not by hiding things on screen.
Does it work without a stable internet connection?
Yes. Techizat is an offline-tolerant PWA: entries made without a signal wait in a queue on the phone and sync when the connection returns. Each entry carries a one-time key, so a resend is never booked twice.
Can you build a system like this for our distribution company?
Yes. We start from your real spreadsheets, statements and chats, agree the money rules with you in writing, and build a phone-first ERP around them: ledger, cost and margin, credit control, documents and a partner portal.
Your project
Your system is next
Tell us how orders, money and documents move through your company today. We reply within 24 hours with questions and a concrete plan.
Names and figures on screens are sample data.
Back to the start