
Morning
Since the last look: what Zoho received, what the field wrote, which promises fell due, what went quiet. Attendance is read off the work itself, not a check-in button.
- Every tile a link
- Attendance from the work
- Needs attention, by name
Trumac makes buying building materials simple for hardware stores across Mumbai’s western suburbs: the brands they ask for, in stock, with a salesman at the counter every week. Now its website is a storefront for the whole range, and one operations dashboard runs everything behind it: the rounds, the sales, the money, the promises, the team and the books.
Trumac keeps hardware stores across Mumbai’s western suburbs supplied with uPVC pipe, fittings, cable and switchgear from the brands their customers ask for, held in stock and brought to the counter on a weekly round. The business grew faster than its tools. The accounts were in Zoho Books, but the work around them was spread across a sheet and the phone: which store to visit today, what a counter promised, where the day’s cash was, which stores a new salesman takes over. And the website, a template, showed none of what Trumac stocks.
So we did not build a dashboard on top of the sheet. We built the operation around the books.
The website is a storefront, not a shop: it shows the whole range and sends retailers to the sales team. A bundle of uPVC pipe, a cut cable, a carton of switch plates: end-on, they are all the same picture, packed circles. That one geometry is the whole site. The home opens on a 72-pipe bundle drawn live in the browser, and the scroll is a flight down one bore into the catalogue.




01 · At restThe bundle, lit from one low morning source, a bright crescent on every ring.
02 · The flightScroll, and the camera enters one pipe: the bore, then daylight at the far end.
03 · ArrivalIt comes out onto the catalogue, every range laid out on one page.


Five roles, one app, each opening on its own first screen. The director opens Morning. Each salesman opens Today on a phone. The office plans the week, works leads and promises, brings new salesmen on and hands them stores, and follows every rupee in the field until it is in Zoho.

Since the last look: what Zoho received, what the field wrote, which promises fell due, what went quiet. Attendance is read off the work itself, not a check-in button.

The round in the order worth driving, each store with what it usually pays, and the day’s target and incentive on the same screen. Capture is two taps, with six seconds of Undo instead of a dialog.





Two Next.js 16 apps, two repos, one client. The website has no database at all: its facts are baked into the build. The dashboard mirrors Zoho Books in Postgres with the operation’s own tables on top (rounds, leads, promises, tasks, custody, targets) and writes back to Zoho only through guarded paths, each idempotent by construction.
Every 15 minutes, or the moment someone opens the app on a stale book, the mirror refreshes contacts, open invoices and payments. Morning ranks every store from recency, promise state and payment habit. A capture lands in the register and the custody ledger in one transaction. The office posts it to Zoho with a reference number the app can find again, so a retry after a dead socket adopts its own work instead of paying twice.
A duplicated payment in the books is the worst thing this app could do. Seven stages stand between a press on the phone and a row in Zoho.
The register line and the custody ledger line are written together with a client key, so a double press or a retry writes nothing new. The day must be open: a closed register refuses money.
Every register line is matched against the Zoho mirror by store, amount and payment-mode family. "UPI H", "UPI KVB" and a bank transfer are one family. A cheque is never matched: it has no payment until it clears.
Who may post to Zoho is a flag on the user: never a salesman, never grantable to yourself. The write credential is a second Zoho client held by one module; the sync token can only read.
With the write flag unset, every path runs (search, payload, audit row, activity line) and stops one instruction short of the POST. Production is the only place it is on.
Every attempt searches Zoho for reference_number = TRUMAC-<entry id> before writing. A retry after a timeout adopts the payment it already made.
Mode × salesman → Zoho deposit account is a table the admin edits. An unmapped mode refuses the push: a cash payment in the wrong account looks correct until the month closes.
Posted means Zoho returned an id; ticked means the next sync read it back. If somebody deletes it in Zoho, the next sync clears the tick and says so on the activity log.
The guards behind that write path, and the rest of the platform.
If your business has outgrown the tools it started on, and your website could belong to anyone in your trade, tell us. We build the thing only you could have, and the machinery underneath it.