Custom ERP vs off-the-shelf ERP, from one we run
An incense maker's custom ERP, read from its code: cartons that mix fragrances, stock that cannot go below zero, and what Tally and Odoo already do.
Ridam Agrawal
- 11 min
On this page
Custom ERP or off-the-shelf ERP: which should a small manufacturer choose?
Off-the-shelf ERP suits a manufacturer whose work matches the package. Custom ERP earns its cost where the work does not. Chandas Perfumers, an incense maker in India, tried several SaaS systems before Easinvy built theirs, which packs cartons that mix fragrances, makes to sale orders and never lets finished stock go below zero. Tally keeps the books.
Chandas Perfumers makes incense and fragrances in India. Chandas kept its stock in paper registers and spreadsheets, tried several SaaS systems, and then asked Easinvy to build an ERP of its own. Easinvy built that ERP and runs it. Everything below is read from its code as it stood on 31 October 2026, and set beside what two packaged systems, TallyPrime and Odoo, document for the same units.
Why Chandas moved to a custom ERP
Chandas Perfumers came to a custom ERP after several SaaS systems. Those systems are not named here, and where each one fell short is not on record, so this note does not guess.
A custom ERP is written around one company's own records and rules instead of being configured from a package. What Chandas's ERP does is count the plant's way. The plant thinks in boxes, dozens and cartons, and a carton is packed from one pack line's fragrances to a fixed size, against a buyer's order. Easinvy built the ERP around those rules instead of fitting the plant to a package's.
Prasan Jain, owner of Chandas Perfumers, puts the result this way:
Now that the entire process is well-structured and tracked, there's no more confusion. Everything is clearer, easier to manage, and much smoother to execute.
Easinvy runs the system on its own database and server, for Chandas alone, and Chandas has used it since October 2026. The rest of this note is what that system holds, what a package would have held instead, and what the custom route costs.
What Chandas's ERP counts: boxes, dozens and cartons
Chandas's ERP treats a product as one retail box, at one MRP: a ₹5 small box of one fragrance, say, or a ₹10 pouch. Finished stock is kept in boxes and read in dozens, the way the plant counts it, so a shelf with 149 boxes shows as "12 dz 5 boxes". A dozen is always twelve boxes.
The catalogue comes from Chandas's own stock sheet: 15 pack lines and 178 products. A pack line is one format at one MRP, such as Small Box ₹5 or Jumbo Zipper ₹100, and it holds the fragrances packed in that format.
Each pack line has its own carton, which the plant calls a C/S. A Jumbo Zipper ₹100 carton holds 5 dozens; a Small Pouch ₹5 carton holds 120. Most lines also have a jhola, a polypropylene bag, which usually holds the same number of dozens as the carton; on two lines it holds less.
Raw material is kept in thousandths of its unit, so 2.75 kg is stored as the whole number 2,750, and adding up deliveries or working out what a production run used is exact. The same problem for money, in Easinvy's billing product, is the subject of decimal vs float for money.
An off-the-shelf ERP can count in dozens and cartons
Packaged ERP can count Chandas's units. Counting in dozens and cartons is not, by itself, a reason to build an ERP.
TallyPrime's help shows compound units, one unit defined as a number of another, and says "Compound units can be created up to any level." Box, dozen and carton chain that way. Tally also locks a unit once it is used: "you can alter a compound unit, if there are no transaction recorded using it". Chandas's ERP has the same rule for raw materials, whose unit cannot change once it exists.
Odoo's documentation says "Odoo can be set up to use different units of measure for one product." For cartons it has packagings, a 6-pack or a case of a fixed number of one product, and it states that "packagings are product specific, not generic."
That last line is where Chandas's ERP differs. A Chandas carton belongs to a pack line, not to a product, and it mixes the line's fragrances. Odoo also has packages, and "A package is a physical container holding one or more products." Whether an Odoo package can carry Chandas's whole rule was not tested for this note.
A Chandas carton is filled exactly, from one pack line
Chandas's sales desk books a sale order as cartons. Each line of the order is a carton type: a pack line, how many cartons alike, and the dozens of each fragrance in one carton. Booking moves no stock; it is a promise to a buyer.
Chandas's ERP checks every carton type before the order is saved:
- every fragrance in the carton must belong to the carton's pack line;
- the dozens must add up to exactly that line's carton size, in any mix of the line's fragrances.
Booking 90 dozens into a Small Box ₹5 carton, which holds 96, is refused with "Carton 1: a Small Box ₹5 C/S holds 96 dozens; this one has 90."
The mixed carton is the decision a package makes for you. Where a package's carton belongs to one product, a mixed carton has to be modelled some other way: as a product of its own for each mix, or as a container recorded apart from the sale. Chandas's ERP records the carton on the sale order itself, as the plant packs it.
Production at Chandas follows sale orders
Chandas's ERP has no separate screen for recording what was made. Production works from the sale orders: marking an order complete packs its booked cartons exactly as booked, into one packing that waits for dispatch.
Completing an order uses ready stock first. When ready stock is short, the ERP names what is short, fragrance by fragrance, before anything is saved. A person who may record production completes the order anyway, and the shortfall is recorded as made in the same step; the screen says "Not in ready stock, recorded as made now" before the click. A person without that power cannot complete the order, and is told who can.
Every product has a recipe, and recording dozens as made uses up raw material on the production floor by that recipe. Raw material on the floor is allowed to run short: what was made exists, so the ERP records it, and the material shows as short on the Stock page as something to explain. Finished stock is never allowed to run short. Each raw material also carries a reorder level, and the Stock page lists what is low and what is already on order.
Recipes are not edited in the app. Products, pack lines and recipes change through Easinvy, which means nobody on the floor can change what a dozen uses.
The model changed when the floor showed it was wrong
Chandas's ERP has been rebuilt in places since its code began on 13 October 2026, and the commit history dates each change.
The earliest code, committed after midnight on 13 October, kept finished stock at three levels, loose boxes, loose dozens and cartons, with repacking between them. By 03:24 the same morning, before the database held anything but starting data, it kept finished stock in boxes and packed cartons at the time of sale, mixed. On 30 and 31 October, after Easinvy saw how work actually moved on Chandas's floor, every dispatch was tied to a sale order, packing was split from dispatch, orders were booked as cartons with production completing them, deliveries were received at the workstation straight onto the floor, and the separate store and the "record made" screen were folded away.
The first version took two weeks, and the work continues. Easinvy built it with an AI coding assistant, Claude.
A custom ERP changing that fast is the advantage most comparisons promise. A custom ERP changing at all is also a maintenance relationship: someone has to be there to make each change.
What Chandas's ERP refuses
Chandas's ERP is defined as much by what it refuses as by what it records. On 31 October 2026 the code refused:
- Finished stock below zero. The check sits inside the database update itself, so two people packing the last carton at the same moment cannot both succeed. The backend's self-test packs the last carton six times at once and expects exactly one success.
- A carton that is not full, or holds another line's fragrance, when the sale order is booked.
- A date in the future, and for anyone but an owner, a date more than three days back.
- Changing a sale order after production has completed it. The order can be closed short instead.
- Dispatching cartons that were not packed, or dispatching them twice.
Dispatch records each order's packed cartons as gone, with the time, who sent them and the vehicle or LR number. It moves no stock: the boxes left ready stock when production completed the order.
A Chandas record is added to, not rewritten
Chandas's ERP numbers every record by kind without gaps, so sale orders run SO-00001, SO-00002 and on, and each record carries the plant's date and the person who made it. Each person signs in as themselves and opens only the pages they have been given, unless they are an owner.
Stock records are never edited. Cancelling one writes the opposite stock movements, keeps the original, and records who cancelled it, when and why. Only an owner cancels. Every stock balance is updated in the same transaction as the movements behind it, and a self-test checks that each balance equals their sum.
One kind of record does change in place. A sale order can be edited until production completes it, because a booking moves no stock, and the edit is stamped with who made it and when. The earlier version of the order is not kept.
Tally keeps Chandas's books, and the ERP keeps the goods
Chandas Perfumers keeps its books and its GST invoicing in Tally, and its ERP keeps the goods: orders, packing, production, raw materials and dispatch. Chandas chose that split. Prices and accounts live in Tally; the ERP carries each pack line's MRP and each buyer's and supplier's GSTIN.
A custom ERP can raise GST invoices too, from the same system that moves the stock, when a business wants everything in one place. Chandas keeps its invoicing in Tally, so its ERP was built for the floor.
That split is the hybrid several comparisons recommend. Innoapp's comparison advises: "Run finance, GST and payroll on a proven off-the-shelf core", with custom modules only where a business is different. At Chandas the custom part is the whole floor, and the packaged part is the money.
The price of a custom ERP is the studio that runs it
Custom ERP moves the dependence from a vendor to a builder. BDC, Canada's business development bank, puts it bluntly: "A highly customized system can increase your dependence on your vendor". Witify, a firm that builds custom ERP, says the same from the other side: "The dependency is no longer on a publisher, but on a development team".
At Chandas the dependence is specific. Easinvy hosts the ERP, holds the hosting and database accounts, and runs its backups. Products, pack lines and recipes change only through Easinvy. In return there is no release schedule: a change ships when the floor needs it, where BDC notes that "Most ERP systems are upgraded once or twice a year."
The way out is plain. The code, the database and the backups go to Chandas on request, or if Easinvy stops. A buyer of a custom ERP should settle the same before the first line is written, with whoever builds it.
When an off-the-shelf ERP is the better choice
An off-the-shelf ERP is the sensible default for most small manufacturers, and BDC says so directly: "small and medium-sized businesses are better off researching and selecting the off-the-shelf ERP system". A package arrives tested, a vendor carries upgrades and statutory changes, and the cost is known in advance.
Chandas's case suggests two questions to ask of a package before building anything:
- Does the package's unit of sale match yours? If its carton is your carton, the units are not a reason to build.
- Does it refuse what your floor would refuse? A carton that is not full, stock that is not there, a date that is too old.
If a package answers yes to both, buy it, and keep the money for something the package cannot do. Chandas tried several SaaS systems before building, and its ERP now does the floor's work while Tally does the books.
What this note does not show
Chandas's ERP is one plant's system, and this note reads its code, not its results. Chandas publishes no sales, volumes, time saved or error rates, so there are none here; the counts above are the catalogue's. The self-tests are described from their source and were not run for this note. Whether an Odoo package could hold Chandas's carton rule was not tested, and this note claims no limit for a packaged ERP beyond what its own documentation states.
The note describes the code as it stood on 31 October 2026. Chandas's ERP is still being built, and the next change will be dated like the others.
This is the ERP Easinvy builds and runs for Chandas Perfumers, Easinvy ERP. Building one around a plant's own units and its own floor is custom ERP development.
Questions people ask
- Which ERP is better?
- Neither, in general. An off-the-shelf ERP is the safer choice when a business runs standard processes and wants a vendor to carry upgrades, and Canada's BDC advises most small firms to start there. A custom ERP pays when the way goods move is the business's own and someone will keep maintaining it.
Sources
Ridam Agrawal
Founder and engineer at Easinvy. Writes up the parts of building and running a multi-tenant product that were expensive to get wrong. More about the studio →
Related
AI automation for small business: what stays human
The lead, email and content automations Easinvy runs for small businesses on n8n and code, and the points where a person still reviews, takes over or checks.
The Next.js build id changes every build
Two builds of one Next.js commit differed on all 36 pages, and only by the build id. Where Next writes it, and how easinvy.com's build hashes around it.
Custom ERP Development
An ERP shaped around your business, not the other way round.
All notes
Write-ups from building and running our own product.