Howdy, tech wizards!
This week’s Kaizen explores how Catalyst Solutions in the Zoho CRM Developer Hub help import large volumes of data into Zoho CRM while improving data quality and simplifying the migration process.
Catalyst Solutions provide a library of independent, ready-to-use backend solutions called
CodeLibs. The
CRM Bulk Data Processor CodeLib helps handle complex data operations on large datasets. Following are the key benefits:
- Highly Scalable: Processes large datasets efficiently, supporting up to 200,000 records per API call.
- Automation Made Simple: Automate complex tasks like segmentation, data cleansing and lead scoring with minimal effort.
- Effortless Integration: Comes with pre-configured Catalyst resources such as serverless functions and data stores that integrate directly with Zoho CRM.
Business Scenario
Zylker, a manufacturing company, migrated over 3 lakh Lead records into Zoho CRM from spreadsheets.
Post-migration, the Lead data showed the following inconsistencies and challenges:
- Phone number field did not include country codes, or contained incorrect country codes. This inconsistency made it difficult for sales teams to contact Leads reliably.
- Identifying potential Leads for follow-up required manual effort and marketing team has to run generic campaigns without lead segmentation.
Using workflows before record creation to fix phone numbers for this volume would result in 3 lakh individual workflow executions, which can slow imports and cause partial failures.
Solution Overview
Zylker can use the CRM Bulk Data Processor available in Catalyst Solutions to address these challenges at scale.
The solution works as follows:
- Lead records are fetched in bulk from Zoho CRM using the Bulk Read API.
- The fetched data is temporarily stored to evaluate the priority and quality of each record. Based on this evaluation, the records are also segmented accordingly.
- The Country field value is used to identify and append the correct country code to the phone number.
- The processed records are updated back into Zoho CRM using Bulk Write API.
All operations are executed using pre-configured Catalyst resources provided by the CodeLib. You can explore the
Bulk Data Flow in Catalyst help page to understand how each resource participates in the processing pipeline.
Prerequisites
Before you begin, ensure the following:
1. Log into your Zoho CRM and navigate to Setup > Customization > Modules and Fields > Leads.
Create the following custom Single Line fields to map existing record data in Zoho CRM.
- Last Activity Days
- Web Engagement Score
2. Create the following custom Single Line fields to store the calculated values during bulk processing:
- Lead Score Value
- Lead Segment
- Sales Priority
- Data Quality Status
3. Go to Setup > Developer Hub > Catalyst Solutions > Zoho CRM Bulk Data Processor.
4. Click Go to Catalyst and create a Catalyst account if required.

6. Create a new folder on your local system, which will act as a local project directory. Use the following command:
7. Navigate to the project folder in your terminal and execute the following command:
8. Follow the prompts to select and initialize your desired project from the Catalyst console.
When prompted to choose a feature, press Enter and proceed without choosing any feature.
9. Run the following command to install the CRM Bulk Data Processor CodeLib.
Step 1: Create a Cron Job
1. Open the Catalyst Console and navigate to the same project in which you have installed the CRM Bulk Data Processor CodeLib.
2. Go to Cloud Scale > Triggers > Cron and click Create Cron.
3. Fill in the following details:
- Provide a Name and Description for the cron job.
- Select Function and choose BulkJobScheduler from the dropdown in the Target Function field.
- Enter the following parameters and values:
MODULES -> Leads
FIELDS_TO_BE_PROCESSED -> Last_Name, Company, Mobile, Country, Designation, No_of_Employees, Web_Engagement_Score, Lead_Score_Value, Lead_Segment, Sales_Priority, Data_Quality_Status
Use GET Modules Metadata API and GET Fields Metadata API to get the API names of the required module and fields.
- Choose the Schedule Type as One Time for our use case.
Step 2: Configure Zoho CRM API Credentials
2. Generate a Grant Token with the following scopes:
- ZohoFiles.files.ALL
- ZohoCRM.bulk.ALL
- ZohoCRM.modules.ALL
- ZohoCRM.settings.ALL
- ZohoCRM.org.ALL
3. Follow the
OAuth Help Section for a step-by-step guide to generate Access and Refresh tokens for your Zoho CRM organization.
Store all the API credentials securely for later use.
4. To allow Catalyst to access Zoho CRM data, configure the stored API credentials as environment variables in the catalyst-config.json file within the BulkDataProcessor function.
These environment variables are used by
Catalyst Connectors to create access tokens for establishing secure connection between Zoho CRM and Catalyst.
Step 3: Add Business Logic
1. Go to com.processor.record.ZCRMRecordsProcessorImpl.java file of the BulkDataProcessor in the functions directory.
2. Override the ZCRMRecordsProcessor method with the business logic.
The complete code sample for this use case is available on
GitHub for reference.
Following is the major custom logic used here:
Phone Number Normalization:
This can be implemented in two stages, Country standardization and Phone Number formatting.
For country standardization, CountryStandardizerUtil maps different variations of the Country field in records to a single standardized country identifier. These variations may include,
- Country Names (India, Unites States, United Kingdom)
- Abbreviations (Ind, IN, USA, US, UK)
- Calling Codes (+91, +1, +44)
With this, we can ensure different interpretations of the same country are interpreted consistently during the process.
Once the country is standardized, Phone Numbers are formatted to E.164 format in the PhoneNormalizerUtil.
It removes all non-numeric characters and converts the Phone input to E.164 format with the respective country codes.
public class PhoneNormalizerUtil { private static final Pattern NON_DIGIT = Pattern.compile("[^0-9]"); public static Optional<String> normalizeToE164(String rawPhone, String countryCode) { if (rawPhone == null || rawPhone.trim().isEmpty()) { return Optional.empty(); } String digits = NON_DIGIT.matcher(rawPhone).replaceAll(""); if (rawPhone.startsWith("+") && digits.length() >= 10) { return Optional.of("+" + digits); } switch (countryCode) { case "IN": return normalizeIndia(digits); case "US": return normalizeUS(digits); case "UK": return normalizeUK(digits); default: return Optional.empty(); } } private static Optional<String> normalizeIndia(String digits) { if (digits.length() == 10) { return Optional.of("+91" + digits); } if (digits.startsWith("91") && digits.length() == 12) { return Optional.of("+" + digits); } return Optional.empty(); } private static Optional<String> normalizeUS(String digits) { if (digits.length() == 10) { return Optional.of("+1" + digits); } if (digits.startsWith("1") && digits.length() == 11) { return Optional.of("+" + digits); } return Optional.empty(); } private static Optional<String> normalizeUK(String digits) { if (digits.startsWith("44") && digits.length() == 12) { return Optional.of("+" + digits); } if (digits.length() == 10) { return Optional.of("+44" + digits); } return Optional.empty(); }
} |
Lead Priority and Segmentation
The lead priority is calculated using the Title, No of employees, Last Activity Days and Web Engagement Score fields in the record.
Each field value contributes a predefined number of points:
- If the job title indicates a senior role such as CEO, CTO, Director, or VP, 25 points are added.
- If the company size is 200 employees or more, 20 points are added.
- If the Lead has been active within the last 7 days, 15 points are added.
- If the web engagement score is 70 or higher, 10 points are added.
The sum of all applicable factors is returned as an integer and based on this score the lead's priority and segmentation is assigned as follows:
- High (Hot): score ≥ 70
- Medium (Warm): score ≥ 40
- Low (Cold): score < 40
public static int calculateLeadScore( String jobTitle, Integer companySize, Integer lastActivityDays, Integer webEngagementScore) { int score = 0; // Decision Maker if (jobTitle != null) { String title = jobTitle.toLowerCase(); if (title.contains("ceo") || title.contains("cto") || title.contains("director") || title.contains("vp")) { score += 25; } } // Company Size if (companySize != null && companySize >= 200) { score += 20; } // Recency if (lastActivityDays != null && lastActivityDays <= 7) { score += 15; } // Engagement if (webEngagementScore != null && webEngagementScore >= 70) { score += 10; } return score; } public static String deriveSegment(int score) { if (score >= 70) return "Hot"; if (score >= 40) return "Warm"; return "Cold"; } public static String derivePriority(String segment) { switch (segment) { case "Hot": return "High"; case "Warm": return "Medium"; default: return "Low"; } }
|
Lead Quality:
Lead quality is evaluated based on the validity of the Mobile and Country fields in the records.
- Clean: Both field values are valid.
- Critical: Both field values are invalid.
- Needs Review: Only one of the field values is invalid.

Write Back to Records:
The processed data is written back to Zoho CRM as follows:
- Mobile: Formatted phone numbers.
- Lead Score: Total score calculated from all applicable fields.
- Lead Segment: Segment derived from the lead score.
- Sales Priority: Priority assigned based on the lead segment.
- Data Quality Status: Overall quality of the Lead record.
if (normalizedMobile.isPresent()) { data.put("Mobile", normalizedMobile.get()); } data.put("Lead_Score", leadScore); data.put("Lead_Segment", leadSegment); data.put("Sales_Priority", salesPriority); data.put("Data_Quality_Status", dataQualityStatus); }
|
Step 4: Deploy to Development
You can find the complete code sample on
GitHub for reference.
Try it Out!
With the changes deployed to the Development environment, let us now test the solution.
We hope this Kaizen helps you import large volumes of data into Zoho CRM while improving data quality and lead intelligence using the CRM Bulk Data Processor.
Have questions or suggestions? Drop them in the comments or write to us at
support@zohocrm.com.
We will circle back to you next Friday with another interesting topic.
On to Better Building!
--------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------
Recent Topics
zoho performance
OVERALL CONFIGURATION OF ZOHO PERFORMANCE Quarterly performance review Self rating and scoring Manager rating and scoring
When will it be possible to edit Subform records via either views or tabular reports?
Hey there, data maintenance often requires mass update of quite a lot of records. While this is a piece of cake via either List view or Zoho sheet view, the same cannot be carried out for subform records yet. When one of the two options will be made available?
Onboarding
Hello Team, Im yuktha working as HR at Ossisto Technologies. We are currently utilizing zoho for onboarding candidate. right now facing issue with onboarding Attaching the screenshots for your reference
How do I change a form's name? Why isn't this more intuitive?
Can someone please let me know how to change a form's name?
Control Over Zia Generative AI Reply Assistance Behavior
Hello, I would like to request an enhancement to the Zia Generative AI feature, specifically concerning the Reply Assistance within Zoho Desk. Current Issue: When replying to a ticket, the Ticket Properties section is automatically replaced by the Zia
Zia now integrated with Open AI in Zoho Desk
The powerful integration of Zia with OpenAI, has empowered Zoho Desk reach a new level of efficiency and performance. With contextual self-service capabilities, Zia enables agents to boost their productivity and delivers superior customer experiences.
Zoho Desk Partners with Microsoft's M365 Copilot for seamless customer service experiences
Hello Zoho Desk users, We are happy to announce that Zoho Desk has partnered with Microsoft's M365 to empower customer service teams with enhanced capabilities and seamless experiences for agents. Microsoft announced their partnership during their keynote
Employee self-service portal: Onboarding and continuous learning platform for support reps
Hello everyone, In any organization, employees must go through multiple courses to learn about the product, their organization's standards, and how to respond to customer queries using the knowledge base articles available. This typically requires completing
2024 Email Authentication Standards: Elevating Security with Google and Yahoo
In contemporary email communication, email authentication plays a pivotal role in mitigating email fraud, spam, and phishing attacks. Brace yourself for a new level of security. Starting February 2024, Gmail and Yahoo will be implementing robust email
Contact custom field in layout
Good day, all, I have an "Extension" custom field in contacts, and would like to display the contact extension in the ticket layout, but I don't seem to be able to. What am I missing? Thanks Rudy
Exact match in name when searching workdrive
Hello, I am wondering how to search workdrive files/folders with an exact match in the name. For example, when I search across folder with the url param search[name]=someName, I get multiple results such as "someName", "someNameAndMore", or "someName
account in a diferent bas currency
Is it possible to have an account in currency diferente from base currency?, lets say, the bas currency in japase yen but asset accut called cash dollars in dollars?
Meeting impossible to use when sharing screen
he Meeting tool in Brazil is practically unusable when sharing anything, whether it’s a presentation or simple navigation. When accessed via Cliq, the situation gets even worse: even basic calls fail to work properly, constantly freezing. And as you are
Changing the Default Search Criteria for Finding Duplicates
Hey everyone, is it possible to adjust the default search criteria for finding and merging duplicate records? Right now, CRM uses some (in my opinion nonsensical) fields as search criteria for duplicate records which do nothing except dilute the results.
Is there a way to create a desktop shortcut for a website course portal?
Hello everyone, I recently got a laptop and bought an online course from a website, Skillwint.com, which I visit regularly. I open that site many times a day and want to create a desktop shortcut so I can open it directly instead of searching in the browser
SalesIQ Tip for Admins: Your Safety Net for Data Recovery
Ever clicked 'Delete' in your SalesIQ and then realized it was the wrong item? Maybe it was a prospect's chat that held important context you needed to refer to later on. Or, maybe you deleted an elaborate Zobot that you were still testing or planning
Depreciated mergeAndStore Function Help!
Hello, I have a function designed to create a PDF containing information from the fields in a Deals record. There is a Writer Mail Merge template in WorkDrive that is populated via Deluge code, and a copy of the resulting PDF is then attached to the record.
Can I execute two 'functions' when completing a mail merge from CRM?
Hi, I have set up a mail merge from CRM Deals to a template. I want a copy of this to be saved in Workdrive, and then a copy also saved back into the deal record from which the merge occurred. I can do both independent of each other, and managed to get
External Share > Edit: Cannot Create Zoho Files
Hi Zoho, When we create an external share link with Edit permission, our external users are unable to create a Zoho file (Zoho Writer, Zoho Sheet and Zoho Show). They can only upload files. They can edit the Zoho files if we create them internally and
Zoho Mail iOS app update - RTL languages support and access emails using permalink and universal link, image upload resolution
Hello everyone! In the most recent version of the Zoho Mail iOS app update, we have brought in support for RTL languages(Arabic and Urudu), providing a seamless reading experience with proper text alignment and layout throughout the app. We have also
Why are emails sending with @viazohocrm.com ?
I just sent out mass emails from CRM. They are sending from the email below and people cannot reply, and they are getting this message: Address not found Your message wasn't delivered to sales.XXXXXXXX.com.au@viazohocrm.com because the address couldn't
Duplicating and referencing datasets
I am moving from PowerBI to Zoho Analytics and while I find Zoho easier to use in many ways, there is one function that I use in PowerBI that I have not been able to find in Zoho. I have several data sets that I need to modify in different ways to get
Zoho Inventory Now Supports VeriFactu for Businesses in Spain
Starting from January 1, 2026, Spain requires real-time invoice reporting for all B2B transactions. From July 2026, this requirement will extend to B2C transactions as well. All reporting must be carried out through the VeriFactu to AEAT (Agencia Estatal
Enhancements to Zoho Map integration tasks
Hello everyone, We're excited to announce enhancements to the Zoho Map integration tasks in Deluge, which will boost its performance. This post will walk you through the upcoming changes, explain why we're making them, and detail the steps you need to
Let’s Talk Recruit: Meet Zia, your all-in-one AI assistant (Part-3)
Welcome back to the Let’s Talk Recruit series. In the part 2 post, we explored how Zia has evolved with smarter summaries and seamless AI-assisted content creation. This time, we’re diving into the latest upgrades that take productivity even further —
Announcing Early Access to "Zoho CRM for Everyone" — A new and exciting update to Zoho CRM
Update : Zoho CRM For Everyone's Nextgen Interface gets an upgrade! Hello everyone, We’ve updated the Zoho CRM for Everyone Nextgen interface based on your feedback. The UI is now simpler with a unified sidebar, a more visible global search and features
Unable to verify domain for Zoho People
I have added TXT records in my DNS (GoDaddy) [screenshot attached], but unable to verify even after 12 hours after adding. On checking the console, it shows some errors [screenshot attached]. It appears that the verification flow is broken - please provide
Zoho Invoice Now Supports VeriFactu for Businesses in Spain
Starting from January 1, 2026, Spain requires real-time invoice reporting for all B2B transactions. From July 2026, this requirement will extend to B2C transactions as well. All reporting must be carried out through the VeriFactu to AEAT (Agencia Estatal
Zoho Billing Now Supports VeriFactu for Businesses in Spain
Starting from January 1, 2026, Spain requires real-time invoice reporting for all B2B transactions. From July 2026, this requirement will extend to B2C transactions as well. All reporting must be carried out through the VeriFactu to AEAT (Agencia Estatal
Weekly Tips : Make your email content error free with Spell check in Zoho Mail
As someone who writes multiple emails a day, we are bound to make both grammatical and spelling errors. Most of them we may not even notice, and even if we do, we may not have the time to correct each one individually when we are in a hurry. So how do
Introducing Enhanced Storage Management
We’re excited to roll out two new enhancements in Zoho Recruit, Subscription Information and Storage Management — designed to give admins complete visibility into subscription details, feature limits, and storage consumption — all from one place inside
how to download all my files
We are in the middle of zoho docs to zoho workdrive migration. I can not access my zoho docs page. I get redirected immediately to a zoho workdrive page. I would like to download all my files so that I have a backup in case something goes wrong with the
Convert Zoho Books SalesOrder - Invoice
Converting a Zoho Books Sales Order into an Invoice Using the SalesOrder Convert API Hello Zoho Developers, Today, we are sharing a simple and effective solution to convert a Zoho Books Sales Order into a Zoho Books Invoice using the SalesOrder Convert
Zoho Expense - Report Templates
Hi Expense Team, I do a recurring trip once every week which has the same cost: Per diem Milage Toll Payment It would be great if there was a feature which allowed me to clone a previously submitted report or create a template reports. This would save
Tip #51- Centralized Contact Management for Better Remote Support- 'Insider Insights'
For our final topic of November, we’re diving into one of the most helpful features in Zoho Assist, the Contacts section on Zoho Assist;s dashboard. Whether you’re managing multiple clients, tracking past sessions, or simply looking to streamline your
Say Hello to Telephony in Zoho FSM
Zoho FSM now brings complete telephony support so your team can manage inbound and outbound calls without switching tabs. Faster responses, smarter routing, and total call visibility—all in one place. Choose the telephony setup that works for you Zoho’s
E-Invoicing in Belgium with Zoho Inventory
Starting January 1, 2026, Belgium is introducing mandatory electronic invoices (e-invoicing) for all B2B transactions between VAT-registered businesses. Invoices and credits notes must be exchanged in a prescribed digital format. How E-Invoicing Works
Employee ID is not correct in get records api V2 for leave
Hi Team, We are facing an issue when calling the Get Records API V2. The employee.id returned in the response is not the actual employee record ID in Zoho People. As a result, our integration is forced to make an additional Get Record API call for every
Formatting Mailing Labels
I want to use the "Print Mailing Labels" function on the drop down list, but I am not seeing a way to change the formatting on the mailing labels. At the moment, the information that appears on the mailing labels ARE NOT mailing addresses, but random
Canvas View - Print
What is the best way to accomplish a print to PDF of the canvas view? Latest update (27th November 2025): We are excited to announce that the Canvas Print View is now available! We encourage you all to try it out and share your feedback with us. Learn
Next Page