Why businesses outgrow a customized Zoho system

Zoho is capable software, and Zoho CRM and Zoho Creator can be customized a long way. The trouble comes from how customizations pile up. Each time the business needs something new, someone adds a custom field, a custom module, a Creator app or a script written in Deluge, Zoho's scripting language. Each change fixes the problem in front of it.

After some years, important business rules live in places nobody reviews, and only the consultant who wrote them knows how they fit together. Every change goes through that consultant, and each one carries more risk because it touches rules the business cannot see. That is usually when a business starts looking for the way out, and when it needs to be careful about what it takes along.

Where your Zoho data and rules live

An export of your main Zoho modules is the start of the inventory. Before you approve any migration plan, list every place your business data and rules are kept. This table is a starting point.

Where to lookWhat it holdsWhat to check
Standard modules such as accounts, contacts, quotes, orders and productsYour core recordsEvery module is exported, including records closed years ago
Custom modules and custom fieldsThings your business tracks that Zoho had no place forEach one is listed with the business need it serves
Attachments and notesFiles and comments on records, such as signed ordersThey are in the export and can be linked back to their records
Deluge functions, workflow rules, buttons and scheduled jobsBusiness rules: pricing, approvals, how orders are handledYou have the code and a plain description of what each one does
Zoho Creator appsSeparate apps, often with their own dataEach app's data is exported, along with its forms
Sources outside ZohoXLS spreadsheets, CSV exports, PDFs, database backups, Dropbox folders and raw web pagesEach one is treated as a source to map, the same as Zoho

Check the last row as carefully as the others. The flooring wholesaler's migration drew on every kind of source listed in it.

Turn scripts and custom fields into stated rules

Before moving any data, describe the business as it should work: customers, products, vendors, orders, purchase orders, invoices and the links between them. For the wholesaler this took a couple of days. Don't copy your old database: design the data model first explains the method.

With the model in place, each customization is read for the need it serves. A custom field either gets one defined meaning in the model or is retired. A script's logic becomes a rule stated in the model, in words a manager can check.

Here is a typical case, simplified for illustration. A Deluge function runs whenever a quote is saved. It compares the quote's discount with an approval limit kept in a custom field on the customer's account. If the discount is higher, it ticks a second custom field so a manager reviews the quote. Nothing on the quote screen says that this rule exists. A field-to-field migration copies both custom fields and loses the rule, because the rule lives in the script.

In the model the rule is written down: a quote needs a manager's approval when its discount is above the customer's approval limit. The approval limit becomes a defined property of the customer, the tick box becomes the quote's approval status, and the script is no longer needed.

One Zoho script, rewritten as a stated rule. Simplified illustration in two panels. In Zoho: a Deluge script card, drawn as abstract code lines, runs when a quote is saved and uses two custom fields, Approval_Limit and Needs_OK. A warning says a field-to-field copy loses the rule. An arrow leads to the data model, which states the rule in one sentence: a quote needs a manager's approval when its discount is above the customer's approval limit. Approval_Limit maps to Customer approval limit, Needs_OK maps to Quote approval status, and the script is shown crossed out as retired. Bottom bar: The rule moves as a sentence anyone can check.
Figure 1. The rule moves as a sentence in the model, and the custom fields that carried it each get one defined meaning. Simplified for illustration.

Each source keeps its own mapping into the model, separate from the rules that use the data. Intelligence Factory's published case study on integrating dozens of EHR systems applies the same separation at a larger scale: data from nearly three dozen EHR and EMR systems mapped to one internal ontology, with each system's mapping kept apart from the rules for eligibility, billing and reporting.

Import the full history, including closed records

Many migrations move only open orders and active customers, and leave everything else in an export file for reference. The new system then cannot answer questions that depend on the past, such as what a customer has bought or which purchase order filled an order. Staff keep the old system or the export open beside the new one, and the move is never quite finished.

Moving the full history is practical when the import is automated and fast. We build and change CommerceServer with Buffaly, our own software engineering system. For the wholesaler, an automated pipeline imported 15 years of history from Zoho, XLS spreadsheets, CSV exports, PDFs, database backups, Dropbox folders and raw web pages: hundreds of thousands of records, in minutes per run. Because a run takes minutes, the team could compare each result with the source, correct a mapping and run the whole import again. Every correction lives in the pipeline, so it survives the next run. Why your data import should be rerunnable explains why this matters.

Every field brought across was compared with a backup of the old data: 293,986 fields, with zero differences at the end. Reaching zero meant tracing 43 exceptions. For 35 orders the correct date was missing from the old records, so it was recovered from the time the original order email was received. Five products were traced through vendor part numbers, and the remaining three were traced one by one.

Fifteen years of records, two ways to move them. Two 15-year timelines end at cutover, each feeding a database for the new system. Open records only: most of the timeline is greyed out and left in an export file, and only the last segment, open orders and active customers, reaches the new system. Two questions go unanswered: What has this customer bought? Which PO filled this order? Full history: all 15 years reach the new system. Result cards: 293,986 fields compared with a backup, 0 differences, 43 exceptions traced. The 43 exceptions: 35 dates from email receive times, 5 through vendor part numbers, 3 traced one by one. Bottom bar: Full history, checked field by field.
Figure 2. Moving only open records leaves most of the history behind. A full import can be checked field by field against a backup. Timeline simplified for illustration; the figures are from the wholesaler's migration.

Keep Zoho running until the new system has proven itself

Running both systems for a while is the safest cutover, but it usually means double entry. Staff fall behind, and the new system's data stops being trustworthy before it goes live. Running old and new systems side by side without double entry covers the alternative in detail.

For the wholesaler, the parallel run lasted one month. Staff kept working in Zoho and emailed the files Zoho produced, and Buffaly agents entered them in CommerceServer. Every real order tested the new system while Zoho was still in use, and problems were fixed before cutover. The parallel run: staff email files from Zoho and agents enter them describes the setup.

One business, start to finish

How a flooring wholesaler left 15 years of Zoho patches in one month tells the story step by step. What a distributor got by leaving Zoho covers the result: no outside consultant, no Zoho license fees, and a portal where its customers check inventory and submit purchase orders. A sister company moved next. The model already described the business, so its migration was mainly a matter of mapping its own sources, as told in The second migration was the easy one.

Questions to ask before you approve a migration plan

You can put these questions to any vendor or consultant, including the one you have now.

AskA good answerA warning sign
Which sources will you import?Every source on your inventory, including files outside ZohoOnly the Zoho modules
How much history moves?All of it, with records still linked to each otherOpen records only, with the rest in an export file
What happens to our Deluge scripts and custom fields?Each one is read and becomes a stated rule or a defined field, or is retiredThey are copied or rebuilt as they are
How long does one full import take, and can it be rerun from scratch?Short enough to rerun after every correctionDays, with corrections made by hand afterward
How will you prove nothing was lost?A field-by-field comparison with a backup, plus a list of exceptionsSpot checks
How do we run both systems before cutover?Staff keep working in Zoho while someone else does the entry in the new systemStaff enter everything twice

Leaving a customized Zoho system?

If your business runs on years of Zoho customizations and a consultant for every change, we can describe your business, change CommerceServer to fit it, move your full history from every source and run both systems until your team is ready to switch. After launch, changes are included in the subscription. Tell us about your current system, or read how full service works.