Skip to content
SKSuraj Kumar

MSME operations

Eluno

Business software for small enterprises

Eluno is a working name used for this write-up. The client isn't identified, so their actual product name isn't either.

Business software for a small enterprise that had outgrown notebooks and WhatsApp but was never going to buy an ERP.

  • Business software
  • MSME
  • Business software
  • Client project
  • Operations
Role
Sole engineer, working directly with the owner. Requirements, data model, interface, and the decisions about what deliberately stayed out of scope.
Work type
Client project
Timeline
Paid engagement · 2024
Status
Delivered
Industry
Small and medium enterprise
Client
Private client project

Interface built in code for this case study — not a client screen capture.

01Business problem

What was actually going wrong

A small business at the point where the owner is the only person who knows what is owed, what is promised and what is late — and all three live in their head.

Who feels it

  • The owner, who is the only index of what is outstanding
  • Staff who cannot answer a customer without asking
  • Customers chasing an update on something already agreed
  • Anyone trying to work out what the month actually looked like

MSMEs do not run on nothing. They run on a WhatsApp thread per customer, a notebook for what was quoted, a spreadsheet somebody started and stopped maintaining, and an owner who remembers the rest. That arrangement is not stupid; it is genuinely faster than most software, right up until the volume passes what one person can hold.

The failure is never dramatic. A quote goes out and nobody follows it up. A delivery is promised twice for the same day. A customer pays half and the balance is remembered wrong. Each one costs a little money and some credibility, and none of them shows up as a problem you could point at.

The reason off-the-shelf software does not fix it is not price. It is that an ERP asks the business to describe itself in the ERP’s vocabulary before it will do anything useful, and a business with nine people cannot spare the weeks that takes. So the software is bought, half-configured, abandoned, and the notebook comes back.

02Product overview

What got built

One record per customer, one thread of what was quoted, agreed, delivered and paid — built around how the business already talks about its work, not around a chart of accounts.

Engineering notes

  • Domain vocabulary lifted verbatim from how the business already describes its work, which removed nearly all of the training burden.
  • Quotation versioning with the agreed version copied onto the job at confirmation, so history cannot rewrite an agreement.
  • Payment allocation against individual charges, with a default ordering and a manual override.
  • Ageing derived from charge dates and never stored, removing the possibility of a drifting balance.

I started by writing down the vocabulary the owner used, unedited, and made that the schema. What they called an enquiry stayed an enquiry, not a "lead". What they called a job stayed a job, not a "work order". That sounds cosmetic and it is not: every renaming is a translation the user has to perform mentally on every screen, and those translations are the reason internal tools get abandoned.

The core is a single timeline per customer. An enquiry becomes a quotation, a quotation becomes a confirmed job, a job accrues deliveries and payments, and each of those transitions is a row you can point at with a date and a person attached. Nothing is edited in place — a revised quotation is a new version with the old one still readable, because "what did we actually agree" is the question that starts arguments.

The hardest part of the build was deciding what not to build. There is no accounting module, no inventory valuation, no user-configurable workflow engine. Each of those was asked about and each would have doubled the surface area for a feature that would be used quarterly at best. What went in instead was a payments view that answers "who owes us money, and how old is it" on one screen, because that was the question being asked daily.

I stayed deliberately close to the owner during the build rather than gathering requirements once and disappearing. Small-business software fails on details that never make it into a specification — that a customer has two phone numbers and one of them is the one that actually gets answered, that prices are agreed in round figures and adjusted verbally, that "delivered" sometimes means delivered to a relative.

03Key features

What the software does, feature by feature

7 capabilities. Every one of them is deterministic software — there is no model in this build, and nothing here is described as AI.

  • 01

    Customer record with one timeline

    Every enquiry, quotation, job, delivery and payment for a customer on one page in date order. The answer to "where are we with them" is a scroll, not an investigation.

  • 02

    Quotations that keep their history

    A revision creates a new version; the old one is never overwritten. Both stay readable, with who changed what and when, because a disputed price is only settled by the record.

  • 03

    Outstanding payments on one screen

    What is owed, by whom, and how many days old — sorted by age, not by amount, because a small invoice that is ninety days late is the more urgent problem.

  • 04

    Part payments handled properly

    A payment is allocated against specific charges and never against a single balance, so the record shows which items are settled instead of only how much is left.

  • 05

    Job status in the language of the business

    The states are the ones the owner already used out loud. No configurable workflow engine, because a nine-person business does not need to model its own process, it needs the process it has to be visible.

  • 06

    Printable documents that look like the business

    Quotations and receipts generate as clean documents with the business’s own details, because these get forwarded to customers and a spreadsheet screenshot undermines every impression the business is trying to make.

  • 07

    Works on the phone that is actually in the room

    Built for a mid-range Android on mobile data first. The desktop layout came second, because the person entering a payment is standing up.

04User flow

How a person moves through it

The path from the trigger to the finished record, with each step attributed to whoever performs it — a person or the system.

  1. 01StaffLogs an enquiry against a customer, or creates the customer if they are new.
  2. 02StaffBuilds a quotation from the enquiry; sends the generated document.
  3. 03CustomerAgrees, or asks for a change — which becomes a new version, not an edit.
  4. 04StaffConfirms the job; the quotation is frozen at the agreed version.
  5. 05StaffRecords deliveries and payments against the job as they happen.
  6. 06OwnerOpens the outstanding view to see what is owed and how old it is.

05Architecture

How it is put together

The processing path first, then the layers it runs on, then the constraints that shaped both.

Path through the system

6 stages

  1. 01

    Enquiry

    Captured against a customer with the minimum required to be useful. An enquiry with only a name and a phone number is a valid record, because a form that demands more gets abandoned mid-entry.

  2. 02

    Quotation

    Line items with quantities and agreed prices, versioned on every revision. A quotation is immutable once a job is confirmed against it.

  3. 03

    Confirmation

    The agreed version is copied onto the job, not referenced, so a later revision cannot retroactively change what was agreed.

  4. 04

    Fulfilment

    Deliveries recorded against job lines, partial by default. Most real deliveries are partial and software that assumes otherwise forces staff to lie to it.

  5. 05

    Payment

    Allocated against specific charges, oldest first by default with a manual override, so the ledger shows which items a part payment cleared.

  6. 06

    Outstanding

    A derived view, never a stored balance. Ageing is computed from the charge dates, so it cannot drift out of step with the underlying rows.

Layers

Interface
Mobile-first layoutsCustomer timelineOutstanding viewDocument generation
Domain
CustomerEnquiryQuotation with versionsJobDeliveryPayment allocation
Rules
Immutable confirmed quotationsAppend-only correctionsAllocation before balanceDerived ageing
Platform
Relational schema with constraints in the databaseRole separation for owner and staffDocument rendering

Why it is shaped this way

  • Balances are derived from allocations rather than stored on the customer. A stored balance is a second source of truth and it goes wrong quietly.
  • Corrections are appended, never destructive. In a business where the owner is also the auditor, an edit history is the only thing that settles a disagreement.
  • Constraints live in the database, not only in the application. The one thing worse than a validation bug is a validation bug that has already written bad rows.
  • No configurable workflow. The states are hard-coded to the ones the business uses: the correct trade for a single-tenant build, and the wrong one for a product.

06Technical decisions

The choices that mattered, and what each one cost

Every decision here was contested by a reasonable alternative. The trade-off column is the part usually left out.

01

Model the business’s own vocabulary, not a standard one

Why

Every term the user has to translate is friction on every screen. Adopting their words removed the training problem almost entirely — nobody needed to learn what a screen was for.

Trade-off

The schema is specific to this business and would need renaming to serve another one. For a single client that is the right direction; it would be the wrong foundation for a product.

02

Version quotations instead of editing them

Why

The most expensive disputes in this business were about what had been agreed. Versioning turned that from a memory question into a lookup.

Trade-off

More rows and a slightly heavier interface — a quotation list has to show which version is current without burying the history that makes it useful.

03

Allocate payments to charges, not to a balance

Why

A single balance cannot answer "is that item paid for", and that is the question a customer asks when they dispute one line of five.

Trade-off

Allocation needs an interface and a default order, and the default is occasionally wrong — so it is overridable, which is one more thing to explain.

04

Leave accounting out entirely

Why

The business already had an accountant and a process that worked. Duplicating it would have created two ledgers that disagreed, which is worse than one ledger and a spreadsheet export.

Trade-off

Month-end still involves a manual step. That was an explicit decision with the owner, not an omission.

07Challenges

What was genuinely difficult

Not the setup work. These are the problems where the first implementation was wrong and had to be reconsidered.

01

The first version of the entry forms were abandoned halfway through, repeatedly.

Approach

Cut required fields to the ones that make a record findable — a name and one contact route — and let everything else be filled in later from the record itself.

Outcome

Records started getting created at the moment of the phone call instead of "later". A system that lags a day behind the business is a different thing from one that reflects it.

02

Prices were agreed verbally and adjusted, so the quotation never matched the invoice.

Approach

Made the agreed line price an explicit field distinct from the list price, with the difference visible and not hidden, and carried the agreed figure onto the job at confirmation.

Outcome

Discounts stopped being invisible. The owner could see what had been given away without having to compare two documents by eye.

03

Everything was slow on the connection the business actually had.

Approach

Cut the list views to the fields that get read, paginated on the server, and removed a client-side table library that was costing more than the data it displayed.

Outcome

The screens that get opened forty times a day became usable on mobile data — the only performance measurement that mattered here.

08Business value

What it changes for the business

Stated qualitatively on purpose. Invented percentages are the easiest thing to put on a portfolio and the easiest thing to see through.

Operational effect

  • What is outstanding, and for how long, is answerable by anyone, not only by the owner.
  • What was agreed with a customer is a record instead of a recollection.
  • Part payments and partial deliveries are represented as they actually happen, so staff stop working around the software.
  • Documents sent to customers look like the business, not like an internal spreadsheet.
  • The system is usable from the phone in the room, which is why it is still used.

What would change at scale

  • The hard-coded job states are the first thing that would break for a second business. Making them configurable is a product decision, not a refactor.
  • The outstanding view is computed on read, which is correct at this size and would need a maintained projection with an order of magnitude more charges.
  • Multi-user editing is currently optimistic. With more concurrent staff it would need explicit locking on the quotation, or last-write-wins would start losing agreed prices.

09Interface

The screens where the work happens

Dense operational views rather than dashboards. These are used for hours at a time, so the priorities are legibility, keyboard flow and state that is never ambiguous.

Customer timeline

Enquiry through to payment in one column, with each transition dated and attributed.

Quotation versions

The current version and the one it replaced, with the changed lines marked.

Outstanding

Sorted by age, because the oldest small debt is the more serious one.

Payment allocation

Which charges a part payment cleared, and what it left open.

The screen above is built in HTML and CSS for this case study. It reproduces the layout, states and vocabulary of the real build without exposing client data, which is why it exists rather than a screenshot. It is evidence of design and of the decisions behind it. It is not a photograph of a deployed system, and no part of it is a capture of anyone else’s product.

10Technologies

What it is built with

Chosen for the shape of the problem, not for novelty. Anything unusual is justified in the decisions section above.

Frontend
  • React
  • TypeScript
  • Mobile-first CSS
  • Server-driven pagination
Backend
  • REST API
  • Relational schema
  • Database-level constraints
  • Role-based access
Documents
  • Server-side document generation
  • Print-accurate layout
Delivery
  • Containerised deployment
  • Backups with a tested restore

Implementation detail

  • Domain vocabulary lifted verbatim from how the business already describes its work, which removed nearly all of the training burden.
  • Quotation versioning with the agreed version copied onto the job at confirmation, so history cannot rewrite an agreement.
  • Payment allocation against individual charges, with a default ordering and a manual override.
  • Ageing derived from charge dates and never stored, removing the possibility of a drifting balance.
  • Append-only corrections throughout, giving an audit trail in a business that has no auditor.
  • Required fields reduced to the minimum that makes a record findable — the change that got records created in real time.
  • List views rebuilt for a mid-range Android on mobile data — the only performance target that mattered.

11Technical preview

Where the source for this one sits

This build was delivered to a client, so the source belongs to them and is not republished here in any form — not as excerpts and not as a repository link.

Delivered work

A walkthrough instead of a code dump

For private client work, contact me for a walkthrough. On a call I can screen-share the build, go through the component structure, the decisions behind the interaction work and the parts that needed rewriting — the same ground a technical preview covers, without republishing a client's property to do it.

Request a walkthrough

Or email directly: surajk86808@gmail.com

What is not published here

  • The live URL — the deployment belongs to the client, not to this portfolio.
  • The repository, in whole or in excerpt.
  • Client content, contact records, pricing or anything else from the running site.
  • Anything beyond what was agreed: Private client project.

Next step

Need something along these lines?

Send the process, the constraints and the deadline. You will get an honest scope, an architecture sketch and a timeline before any commitment.

Email
surajk86808@gmail.com
Based in
Bengaluru, India
Working hours
IST (UTC+5:30)
Availability
Taking new engagements