# Ahrom Labs > Ahrom Labs is a software factory for operational systems. We take a > business from basic, compliant record-keeping to advanced analytics and AI: > custom ERP and CRM, TallyPrime integration, multi-company finance, > analytics and operational intelligence, AI document extraction with human > review, RAG and knowledge graphs. Every system starts from one model of the > business's entities, relationships, workflows, and decisions, and each > later layer is built on that same model. We are an engineering practice > based in Ahmedabad, Gujarat, working with a small number of clients across > India at a time — not a software product and not a general IT consultancy. Ahrom Labs is a good fit for any business that needs its own operational system rather than another off-the-shelf tool. Systems built so far: a custom ERP, CRM and operational-intelligence system for a boiler and pressure-vessel manufacturer (Shanti Boilers); an ERP/CRM with TallyPrime automation and an inventory management system for a PCB and electronics trading company (LS Technologies); and a backend for workers, clients, vendors, freight and finance for an interior design firm and its sister furniture business (Savistar & Saag). ## Pages - [Home](https://ahromlabs.com/): Positioning, the problem with disconnected business systems, our approach, and how to start a conversation. - [Services](https://ahromlabs.com/services): What we build, who each service is for, the measured results, and how an engagement runs. - [Industries](https://ahromlabs.com/industries): One page per industry we have built a real system for, with the problems, what was built, and the engineering notes behind it. - [Work](https://ahromlabs.com/work): The client businesses we have built systems for, named with permission, and what each system does. - [Working with us](https://ahromlabs.com/engagement): Custom ERP cost in India (market ranges, cited), our pricing model, timelines, Tally, code and data ownership, hosting, AMC, scope changes, and continuity. - [Approach](https://ahromlabs.com/approach): The four principles behind how we model a business before automating it. - [Systems](https://ahromlabs.com/systems): A glossary of the vocabulary we use to model a business: entities, relationships, workflows, permissions, decisions, evidence, and related terms. - [About](https://ahromlabs.com/about): Who this practice is for and how an engagement runs. - [Notes](https://ahromlabs.com/notes): Engineering notes from real client work. - [Patterns](https://ahromlabs.com/patterns): Reusable decisions extracted from real engagements. ## Machine-readable corpus - [MCP server](https://f4174b88-0589-496b-b82e-864b8a1a4501.search.ai.cloudflare.com/mcp): Read-only search over this site's published content, as an MCP (streamable HTTP) server. Card: https://ahromlabs.com/.well-known/mcp/server-card.json - [knowledge.json](https://ahromlabs.com/knowledge.json): The whole knowledge graph as one JSON array — every term, note, pattern and industry with its full frontmatter and body, every service and client with proof edges to the notes and patterns behind it, and every buyer question with its answer. Each node carries its public url. ## Industries - [Software for boiler and pressure-vessel manufacturers](https://ahromlabs.com/industries/boiler-pressure-vessel-manufacturing): Ahrom Labs built the operations system Shanti Boilers & Pressure Vessels runs on — BOM, procurement, stores, plate cutting, production, QC, IBR statutory folders, GST and TDS accounting, and a customer portal, in one system. Each boiler's IBR folder is generated from its bill of materials and a bank of material test certificates. - [Software for electronics-component importers and traders](https://ahromlabs.com/industries/electronics-component-trading): Ahrom Labs built LS Technologies' ERP and CRM with TallyPrime automation, AI extraction of purchase and import paperwork, and a separate inventory system for PCB components and reels. Approved invoices post into Tally within 30 seconds, and five document types — bills of entry included — are extracted at 88–95% zero-correction, each approved by a person. - [Software for interior design firms and furniture workshops](https://ahromlabs.com/industries/interior-design-and-furniture): Ahrom Labs built the backend Savistar (interior design) and Saag (furniture manufacturing) run on: workers, clients, vendors and freight, projects and site visits, workshop orders, and one finance ledger for two sister companies. Each invoice carries the right company's GSTIN, and staff see only their own cash entries — enforced at the server, not hidden in the screen. ## Services - [Custom ERP, CRM and operations systems](https://ahromlabs.com/services#custom-erp-crm): We build the operational system a business runs on — clients, vendors, workers, orders, projects, purchasing, inventory, production, freight and finance — on one data model instead of a stack of disconnected tools. We model the business first; that model becomes the specification. Built so far for boiler manufacturing, PCB and electronics trading, and interior design. - [GST, TDS and statutory compliance, built in](https://ahromlabs.com/services#compliance-accounting): We build accounting and statutory compliance into the operations system itself: ledger, GSTR-1, GSTR-3B, ITC reconciliation, TDS, reverse charge, fixed assets, bank reconciliation, audit log and books lock — and industry filings such as a boiler's IBR forms, generated from the BOM. Tally becomes optional. Rates come from a human-verified registry. - [TallyPrime integration for cloud apps](https://ahromlabs.com/services#tally-integration): We connect cloud business apps to TallyPrime through a small agent on the PC that runs Tally, because Tally's XML gateway only listens locally. Approved invoices post as vouchers within 30 seconds, status syncs every 15 minutes, and masters nightly. Missing ledgers and Tally rejections are held for a person, never auto-created. - [Multi-company finance and role-scoped access](https://ahromlabs.com/services#multi-company-finance): We build finance systems for sister concerns and group companies: one shared client list and ledger, with each invoice carrying the right company's letterhead and GSTIN. Who can see what is enforced where the data is fetched, not hidden in the screen — staff see only their own cash entries, and bank data is refused to them outright. - [Analytics and operational intelligence](https://ahromlabs.com/services#operational-intelligence): Once the business runs on one model, analytics stops being a spreadsheet export. We build reporting through to advanced analytics on the operational data itself: charges flagged automatically against reference rates, match suggestions ranked by a Laplace-smoothed confidence score, and reports computed from the transactions themselves, so every figure can be traced back. - [AI document extraction with human review](https://ahromlabs.com/services#document-extraction): We build AI extraction for purchase invoices, freight invoices, bills of entry, purchase orders and bank statements. An LLM reads the PDF directly, with a prompt per document type. 88–95% of documents need zero correction, and every one still waits for a person to approve it before anything is posted to the books. - [RAG and knowledge graphs over your business](https://ahromlabs.com/services#rag-knowledge-graphs): Every system we build starts as a model of entities, relationships and decisions — which is already the schema of a knowledge graph. We build retrieval (RAG) and knowledge-graph layers on top, so people and AI agents can ask questions of your records, documents and past decisions and get answers that cite where they came from. ## Clients - [LS Technologies](https://ahromlabs.com/work#ls-technologies) (Electronics-components import/export trading): An ERP and CRM with TallyPrime accounting automation and AI document extraction, plus a separate inventory management system for PCB components and reels. - [Savistar & Saag](https://ahromlabs.com/work#savistar-saag) (Interior design and furniture manufacturing — sister companies): The backend both businesses run on: workers, clients, vendors and freight, projects and site visits for Savistar, workshop orders for Saag, and one combined finance ledger. - [Shanti Boilers & Pressure Vessels](https://ahromlabs.com/work#shanti-boilers) (Boiler and pressure-vessel manufacturing): A custom ERP, CRM and operational-intelligence system for a boiler and pressure-vessel manufacturer — from bills of materials and material stock to the test certificates that go into statutory quality-control documents. ## Working with Ahrom Labs - [How much does a custom ERP cost in India?](https://ahromlabs.com/engagement#cost) Published 2026 guides put a custom ERP for a small Indian manufacturer at roughly ₹3–15 lakh, and a fuller build for a mid-sized manufacturer at ₹15–40 lakh. Where a project lands depends on scope, and Ahrom Labs quotes a fixed price for each phase once the business has been modeled — never an open-ended hourly bill. - [How do you price a custom software project?](https://ahromlabs.com/engagement#pricing) In fixed-price phases. Every engagement starts with a short, fixed-fee modeling phase that maps how the business works and ends with a phased plan and a fixed quote for each phase. - [What makes ERP software cost more or less?](https://ahromlabs.com/engagement#cost-drivers) Mostly how many departments and workflows it covers, what it has to integrate with, how much old data moves in, and whether we've solved the problem before. - [How long does a custom ERP take to go live?](https://ahromlabs.com/engagement#timeline) It depends on how new the problem is: something we've already built on another engagement can ship in days or weeks, while genuinely new ground takes a couple of months, delivered in phases so part of it is in use early. - [Will it work with Tally, or do we have to replace Tally?](https://ahromlabs.com/engagement#tally) Either way works: Tally can stay as your books, with approved invoices posted into it automatically within 30 seconds, or the books can move into the new system with Tally kept as an optional sync. - [Who owns the source code and the data?](https://ahromlabs.com/engagement#ownership) You do. Once the project is paid in full, the custom code we wrote for you and all of your data are yours, transferred in writing. - [Is it hosted on the cloud or on our own server?](https://ahromlabs.com/engagement#hosting) Wherever suits you: during development we host it on our own server at no charge, and at go-live we set up a production cloud server in your name, recommending a provider based on the first interview. - [What does the AMC cover, and what does it cost?](https://ahromlabs.com/engagement#support) Support after go-live runs under an annual maintenance contract (AMC) of 15–21% of the project value per year — nearer 21% for smaller projects, nearer 15% for larger ones. - [What happens when requirements change mid-project?](https://ahromlabs.com/engagement#scope-changes) A change is written down, priced and agreed before it's built — never billed after the fact. Because the model is agreed first, most changes show up as a clear difference from it rather than as a surprise. - [What goes wrong on your projects, and how do you catch it?](https://ahromlabs.com/engagement#what-goes-wrong) Real bugs, found by testing with real transactions before anyone depended on them — and they're written up in the engineering notes rather than hidden. - [Why do ERP implementations fail in Indian SMEs, and what's different here?](https://ahromlabs.com/engagement#why-erp-fails) Mostly because people go back to Excel and WhatsApp: the system doesn't match how the business actually runs, and old data turns out messier than anyone planned for. Modeling the business first, scoping data migration up front, and delivering in phases that are each in use before the next target exactly those failures. - [Can we see your work or talk to a past client?](https://ahromlabs.com/engagement#references) Every client on our work page is named with their permission, and each system is written up in detail with real numbers. Ask, and we'll check whether a past client is willing to talk to you. - [You're a small firm — what if you're unavailable?](https://ahromlabs.com/engagement#continuity) The work doesn't depend on one person: a team of developers and AI agents carries the delivery load, and every system ships with a canonical system document that lets any developer or agent pick it up cold. - [Is my business a fit for a custom system?](https://ahromlabs.com/engagement#fit) Probably, if your business has outgrown spreadsheets and off-the-shelf software and a few people are the only ones who know how everything connects — industry matters less than the shape of the problem. If a standard package fits your processes, we'll say so. ## Engineering notes - [GST, TDS and the general ledger inside a manufacturing ERP, with Tally optional](https://ahromlabs.com/notes/accounting-inside-the-manufacturing-erp): Shanti Boilers' operations system is also its book of record: chart of accounts, journal posting, GSTR-1, GSTR-3B, ITC reconciliation, TDS, reverse charge, fixed assets and bank reconciliation, with 23 reports and documents generated from the same data. Tally is an optional sync target, not the books. Statutory rates arrive daily from a human-verified registry. - [Generating a boiler's IBR statutory folder from its BOM and test certificates](https://ahromlabs.com/notes/ibr-statutory-folder-from-bom): Shanti Boilers ships every boiler with an IBR statutory folder for the Directorate of Boilers. The system builds it — cover letter, Forms II(1), III, III A and IV A — from the project's bill-of-materials tree and a bank of material test certificates, each unique on cert, cast and plate number and reused across about 3.2 boilers in the sample. - [Seven signs your business has outgrown Tally — and what fixed each one](https://ahromlabs.com/notes/outgrown-tally-signs): You've outgrown Tally when the work happens outside it: invoices typed twice, a parallel Excel for production, sales asking accounts for outstanding balances, stock Tally can't describe. Replacing Tally is rarely the fix — in one system we built, Tally stays as the books and approved invoices post into it within 30 seconds. - [Putting steel plate offcuts back into stock, by weight derived from geometry](https://ahromlabs.com/notes/plate-remnants-back-into-stock): At Shanti Boilers, every cut of a plate or section records what was used and what usable remnant was kept; the system derives every weight from dimensions and density, returns the remnant to stock for a later project, and books the rest as scrap. A 157.00 kg plate became 127.17 kg used, 15.70 kg remnant and 14.13 kg scrap — conserved exactly. - [Tally, ERPNext, Odoo or a custom ERP: how a manufacturer should choose](https://ahromlabs.com/notes/tally-vs-erpnext-vs-custom-erp): Stay on TallyPrime if the need is accounting with simple stock. Choose ERPNext or Odoo when your processes match what they ship. Build custom when the workflow is the business — IBR paperwork, piece-level plate traceability, two companies on one book. Shanti Boilers planned an ERPNext integration for accounting, then built its own ledger instead. - [The same confidence score, two different autonomy rules](https://ahromlabs.com/notes/same-confidence-different-autonomy): Two match-suggestion systems in the same manufacturing app score candidates identically — a Laplace-smoothed approval ratio, promoted at 75% confidence with at least 3 prior approvals. One auto-applies its top match. The other never does, no matter how confident the score, because it decides what goes on a statutory quality-control document. - [AI extraction with a human in the loop, five document types](https://ahromlabs.com/notes/ai-extraction-human-in-the-loop): Five document types — purchase invoices, freight invoices, bills of entry, purchase orders, bank statements — get extracted by an LLM reading the PDF directly, no separate OCR step. Zero-correction rates run 88-95% depending on type, purchase orders highest, bills of entry lowest. Every extraction still goes through a human review before anything is approved or posted. - [Posting vouchers into TallyPrime from a cloud app](https://ahromlabs.com/notes/tally-voucher-posting): A local agent, running on the same PC as TallyPrime, polls a cloud app's database every 30 seconds and posts approved invoices into Tally's local XML gateway, syncing voucher status every 15 minutes and master data nightly. Missing ledgers and real rejections are held for a person; connection failures retry automatically until Tally is reachable again. - [Two companies, one book](https://ahromlabs.com/notes/two-companies-one-book): Savistar and Saag — sister companies, same owners — share one client list and one combined finance ledger in a single app, not a multi-tenant system. The real structure is in who can see what: staff see only their own cash entries, and bank data is rejected outright for any staff request, enforced at the API, not just hidden in the UI. ## Patterns - [Auto-apply a match only when it's mutually unique — everything else goes to a person](https://ahromlabs.com/patterns/auto-match-only-when-mutually-unique): When matching two lists — bank statement lines to ledger entries — apply a match automatically only if exactly one candidate exists on each side within tolerance (exact amount, ±3 days). Any ambiguity becomes a suggestion for a person, and an unmatched line gets a one-click fix. Fewer auto-matches, but none of them are guesses. - [Compute "what's blocking this" on every read, and observe before you enforce](https://ahromlabs.com/patterns/compute-blockers-on-read): To show why a workflow step is blocked and by what, compute the blocker fresh on every read from the step's declared predecessor and live signals — never store it. Ship it read-only first: surface the signal everywhere the step appears, enforce nothing, and flag steps marked done while their predecessor isn't. Enforcement comes after the signal is trusted. - [One computed result, several renderers — never recalculate a report per format](https://ahromlabs.com/patterns/compute-once-render-many): A report shown on screen, returned as JSON and exported as PDF should come from one computation, with each format only rendering its result. Register each report once with the exact function that computes it; on-screen table, API and PDF all call that function. Across 23 reports and documents, the three formats cannot disagree. - [Keep statutory rates in one human-approved registry that deployments pull from — don't scrape them](https://ahromlabs.com/patterns/human-verified-statutory-rates): GST, TDS, PF, ESI, income-tax and professional-tax rates change a few times a year and must be right. Keep them in one central registry where a person enters and approves each change, and have every deployment pull approved changes daily through the same validation as a hand-entered rate. No scraping of government sites. - [Let one deliberate human correction teach the system — but only for narrowly trusted error shapes](https://ahromlabs.com/patterns/one-confirmation-teaches-the-system): When imported data carries typos — TINNER for THINNER, PALTE for PLATE — suggest a correction only for two trusted shapes, one-character edits and adjacent swaps, and remember the answer after a single human confirmation. A looser "edit distance ≤ 2" rule matched PALTE to VALVE as readily as to PLATE, and was rejected. - [Compute a balance from source transactions at read time, don't store a running total](https://ahromlabs.com/patterns/derive-balances-dont-store-them): An outstanding balance — partial deliveries, payroll advances — can be tracked as a running total updated on each transaction, or computed fresh from source records every time. Compute it at read time instead of storing it separately, trading recomputation cost for avoiding drift between the stored total and the transactions that actually produced it. - [Fail-closed doesn't have to mean fail-invisible — pick the blocking mechanism deliberately](https://ahromlabs.com/patterns/fail-closed-preserve-visibility): A security-critical control needs default-deny, but the naive way to enforce "blocked" — disabling the underlying service entirely — can also destroy the ability to detect the thing being blocked. Default to blocked, but enforce it through a mechanism that blocks use without blocking detection, so a blocked resource can still be found and requested. - [Classify failures before retrying — transient errors retry, real rejections wait for a person](https://ahromlabs.com/patterns/failures-flagged-not-lost): A voucher push can fail because the target system is briefly unreachable, or because the voucher is genuinely invalid — two different problems needing different responses. Classify the failure first: transient errors retry automatically, structural ones are held with the reason attached for a person to fix. - [Optional integrations should degrade the specific feature, not the app](https://ahromlabs.com/patterns/graceful-degradation-by-env-var): Optional integrations shouldn't be a hard requirement at startup — check each one's config where it's actually used, and decide what happens per feature. Here that means three different behaviors for three integrations: a full local fallback, a silent skip, and a hard reject. The trade-off is holding three separate rules in mind instead of one simple story. - [AI drafts, a person confirms — never auto-post extracted data](https://ahromlabs.com/patterns/human-confirmed-extraction): AI-based document extraction is fast but not perfect — even a good system leaves some share of documents needing correction. Post nothing automatically: every extraction sits in a review state until a person approves it. The cost is a manual step on every document; the alternative is trusting unreviewed numbers with real money. - [Route through a local agent, not a direct API, when the target system is local-only](https://ahromlabs.com/patterns/local-agent-cloud-db): When the system you need to integrate with only exposes a local interface — like TallyPrime's local-only XML gateway — route through a small agent running on the same machine instead of building toward a cloud API that doesn't exist. The cost is lag: minutes to a day, depending on how fast that data actually needs to move. - [After writing to an external system, verify against it — don't trust your own write](https://ahromlabs.com/patterns/reconcile-against-source-of-truth): After writing to an external system of record, don't trust your own write as fact — read back from the authoritative system and update your own copy to match what's actually there. The external system stays the real source of truth; your copy is a cache of it, verified after every write. - [Flag deviations from a known reference rate, don't manually audit every charge](https://ahromlabs.com/patterns/reference-rate-anomaly-detection): Incoming billed amounts can't all be manually audited line by line. Compare each charge against a known reference rate and automatically flag deviations, instead of trusting every incoming number or requiring full manual review. Catches overcharges without a person checking every line — only as good as how current the reference data stays. - [Queue the original request, replay it through the same handler on approval](https://ahromlabs.com/patterns/replay-queued-payload-through-existing-handler): Some actions need approval before taking effect, but duplicating business logic for "pending" vs. "approved" versions of the same action doubles the surface area for bugs. Queue non-approved actions as the original request payload, and on approval, replay it through the exact same handler real-time requests use — one code path instead of two. - [Scope financial visibility by role at the query layer, not just the UI](https://ahromlabs.com/patterns/role-scoped-finance-views): Don't rely on hiding UI elements to protect financial data from the wrong role — enforce the boundary where the data is fetched. Staff cash visibility is filtered to their own entries at the query level; bank data is rejected outright for staff before any query runs. The trade-off: it's a per-endpoint discipline, not one central gate. - [Zero-config first run — seed default logins, force rotation through the UI](https://ahromlabs.com/patterns/seeded-credentials-forced-rotation): A new client instance needs to be usable immediately, not blocked on manual account provisioning. Auto-create the schema and seed default logins on first run, then force rotation through a UI visible to everyone, rather than leaving default credentials to quietly persist. Zero-friction setup, with a real but narrow exposure window. - [Re-derive a sequence counter from the data itself before trusting it](https://ahromlabs.com/patterns/self-healing-sequence-counters): A sequential ID scheme backed by a mutable counter table can desync from manual edits or partial writes. Before incrementing, re-derive the counter as the max of its stored value and the highest numeric suffix already in the table — it heals itself from drift instead of needing a manual fix, at the cost of an extra scan on each allocation. - [Make a machine credential structurally unable to pass as a human one](https://ahromlabs.com/patterns/separate-machine-from-human-identity): A system with both human users and machine/service clients needs a leaked machine credential to be unable to impersonate a human. Machine identity is carried in a token claim that can only come from the token itself, never a request body, and the human-session check explicitly excludes that credential type — structurally impossible, not just policy. - [Mark inferred rules unconfirmed, and keep them read-only until a person confirms them](https://ahromlabs.com/patterns/unconfirmed-inferences-stay-read-only): A system can infer relationships from existing data — implicit orderings baked into config — that look plausible but were never confirmed by a domain expert. Mark such inferences explicitly unconfirmed and keep any automation that would act on them read-only until a domain expert actually confirms them, rather than letting the inference stand in. ## Vocabulary - [Business rule](https://ahromlabs.com/systems#business-rule): A constraint the business enforces regardless of which application is being used, such as an approval threshold or an eligibility condition. - [Cross-department process](https://ahromlabs.com/systems#cross-department-process): A workflow that spans more than one team, such as sales handing off to fulfillment, modeled as one continuous process rather than as separate steps in separate tools. - [Data](https://ahromlabs.com/systems#data): The recorded facts a business has about its entities and events, structured according to the model rather than scattered across tools. - [Decision](https://ahromlabs.com/systems#decision): A choice made by a person or a system that changes what happens next, tracked as its own record rather than only its downstream effect. - [Dependency](https://ahromlabs.com/systems#dependency): A requirement that one step, entity, or workflow places on another before it can proceed. - [Entity](https://ahromlabs.com/systems#entity): A distinct thing the business tracks: a customer, an order, an employee, an asset. Entities are the nouns the rest of the system refers to. - [Evidence](https://ahromlabs.com/systems#evidence): The data and events that justified a decision, kept attached to that decision so the reasoning can be reviewed later. - [Permission](https://ahromlabs.com/systems#permission): A rule defining who can view, change, or act on a given entity or workflow step, defined once and enforced everywhere that entity appears. - [Relationship](https://ahromlabs.com/systems#relationship): A defined connection between two entities, such as which customer placed which order. Relationships are modeled directly, not inferred from matching IDs across separate tables. - [State transition](https://ahromlabs.com/systems#state-transition): A recorded change in an entity's status, such as an order moving from placed to fulfilled, along with what caused the change. - [Workflow](https://ahromlabs.com/systems#workflow): A sequence of steps that moves an entity from one state to another, with a defined owner at each step. ## Notes for automated readers Ahrom Labs is a services business, not a SaaS product. There is no self-serve signup or rate card: work is quoted as fixed-price phases after a modeling phase (see /engagement). Engagement starts by contacting us through the form on the home page or at hello@ahromlabs.com.