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
Archiving Contacts
How do I archive a list of contacts, or individual contacts?
Ask the Experts 31: Improving support performance with reports and dashboards
Hello everyone, Join us for the next Ask the Experts (ATE) session! Ask the Experts is an opportunity to connect with people who have deep knowledge of Zoho Desk. Let's look at the topic we're focusing on this month. Just as we rely on the right tools
Request to Customize Module Bar Placement in New Zoho CRM UI
Hello Support and Zoho Community, I've been exploring the new UI of Zoho CRM "For Everyone" and have noticed a potential concern for my users. We are accustomed to having the module names displayed across the top, which made navigation more intuitive
Problem with decimal numbers, urgent!
As per screenshot attached: it's a simple math operation 100+10% = 110 (not 11.000)! This simple operation works for many years, today this strange behaviour... wtf?
#25 The Audit Trail That Protects Your Business
Every report we have looked at in this segment measures money: what you earned, what you are owed, how late it is. This last one is different. It measures something you can't put a number on but can't run a business without. Trust. Because all those other
Allow native Webhooks to authenticate via Connections
Allow native Webhooks to authenticate via Connections (Basic Auth) instead of plaintext custom headers Summary Please allow native Webhooks (Workflow Rules > Instant Actions > Webhooks) to authenticate against the destination endpoint using the existing
View Products (items) in Contact and Company
Hi, I would like to know if there is an option to view all the products /(items) that were inserted in the pipeline deal stage for exemple "Win Pipeline" within the company and contacts module section? For instance, view with the option filter for the
Import or migrate a Word Press website into Zoho Sites?
Is it possible to import or migrate a Word Press website into Zoho Sites?
Zoho Community Digest - July 2026 | Part 3
Hi everyone, and welcome back! Week three of July leans mobile and AI: smarter Zoho Mail on Android and iOS, a redesigned Backstage attendee app, and a run of Q2 roundups from People, Projects, and Sprints. Here's everything new from July 16–24, 2026.
Request for Subscription Renewal and Billing Information – Zoho Recruit
Dear Zoho Recruit Support Team, I hope this email finds you well. I am writing on behalf of Land Republic Limited regarding our Zoho Recruit subscription. It appears that our current Zoho Recruit subscription has expired or been exhausted, and we are
DYK 10: Restrict time logging for past or future time
Did you know you can define a time logging window for your team with Zoho Projects? In a project, users often log time at different points of the day depending on their scope of work. Those who switch between onsite tasks and their desk work might not
WhatsApp Business Platform: Message pricing guide
Hi everyone, Starting October 1, 2026, Meta is updating how WhatsApp Business messages are charged. This guide explains the new per-message pricing model, how message categories work, and what changes for service messages specifically. How Meta charges
Invoice Only Shipped Items
Dear Zoho, We are a company that deals with sales orders with 600-1000 lines We need to be able to do partial invoicing based on shipped items Right now when we click convert to invoice we can not only select items that have een shipped It takes hours
How to disable and fade past date cells in Calendar View (Zoho Creator)
Hi Community, I am working on a Calendar View Report (Asset Inventory Report) in Zoho Creator and would like to customize the calendar grid behavior for past dates. What I am trying to achieve: Visual Styling: Fade or gray out the calendar date cells/boxes
Possibility to modify a standard wedget to create my own customized wedget
Below is the std wedget available for dashboard which is great to show the the overdue, current, and all tasks as well as issues for each team member. My problem is this; The list of users cannot be edited (there are admin users which are not relavant
Tips & Tricks Series - #2 Adding Multimedia to Quiz Questions
Hello everyone! Welcome back to our Tips & Tricks series, where we share useful features and tips to help you get the most out of Zoho Learn. Today, we’ll look at adding multimedia to quiz questions. While text-based questions often work well, there can
UI Layout Issue After Activating New FSM Theme
Hello Team, I recently activated the new theme in FSM, and after doing so, I noticed some layout issues. The first issue is with the Merge function. When I try to merge records, I am unable to see the Merge button at the browser's default zoom level.
email migration from gmail to zoho
so I want to migrate all my old emails from a gmail account to zoho account. I go to Mail Administration under Control Panel > Migration, set the destination and source. I started the process, but i waited for quite a bit of time already, the status is still showing "in progress", and there's no error displayed what so ever. I don't have a lot of old mails in my gmail account, so it shouldn't take too long. I have no idea if the process is stuck or it's really doing the work.
Button or Links order
Is there a way to re-order the buttons or links that are created? Moderation Update: With our recent enhancement to custom button creation from the layout editor, administrators can now reorder custom buttons directly from the layout editor, and this
Automatically calculate and include tax on quotes
I've recently been VAT registered and now need to include VAT on my quotes. I have been able to set the tax label and amount but still need to click the tax link and select the tax I wish to include before it appears on the quote. Does anyone know of
Zoho mail shared inbox filter action add to workdrive
The shared inbox feature has been really great. Are there any plans when creating a filter for a shared inbox to have the action add to workdrive? This feature would be super helpful. ~Thank you
seller productivity: zcalendar + zmeeting + zcrm
Hello, As many zCRM users, I handle a lot of online meetings - many of them using my zMeeting subscription. Althought you guys say there is an integration between zCRM and zCalendar, the fact is that is poorly designed, built and incomplete. Integration
SalesIQ's Summer '26 Release: For The Moments That Matter
Every customer journey is made up of moments. The moment someone discovers your business. The moment they need help. The moment you decide to reach out. The moment a simple chat turns into something more. And the moments that continue long after the conversation
Add Setting Values to the Rules
Hi, It would be great to use the rules to set values in fields for submission, such as if a Type is X then set the Field Y to 10. Thanks Dan
Migrate zoho mail to yahoo mail
Hi , We would like to migrate our zoho mails to yahoo paid mails . There are some questions : 1 . how can we access our zoho mail account after the ourdomain.com record transferred to the yahoo paid mail ? 2 . any suggested tools or ways to transfer or import the email in zoho to the yahoo paid email account (emls , imap or other tools) ? Thanks . Jonathan
Introducing Workqueue: your all-in-one view to manage daily work
Hello all, We’re excited to introduce a major productivity boost to your CRM experience: Workqueue, a dynamic, all-in-one workspace that brings every important sales activity, approval, and follow-up right to your fingertips. What is Workqueue? Sales
Emails Failing with “Relaying Issues – Mail Sending Blocked” in ZeptoMail
Hello ZeptoMail Support Team, We are facing an email delivery issue in our ZeptoMail account where emails are failing with the status “Process failed” and the reason “Relaying issues – Mail sending blocked.” Issue Details Agent Name: mail_agent_iwwa From
Zoho Cliq not working on airplanes
Hi, My team and I have been having this constant issue of cliq not working when connected to an airplane's wifi. Is there a reason for this? We have tried on different Airlines and it doesn't work on any of them. We need assistance here since we are constantly
Forum Text Formatting
Hello, I'm not sure where the best place is to post this... It appears that there's some forced formatting that occurs whenever a message is posted in the forums that removes any spaces or tabs at the beginning of each new line. As someone who occasionally
Dashboards for Customers
Is it possible to build dashboards for each customers in the community for their tickets?
Export on More options disappear when open personalized report view
Hello everybody, I have a public report and I can export my report on More options After I hide some columns on my report, I save changes to create a personalized report view. I saved it with the test view name But, if I open personalized report view the
Arattai App Features Update
1. Offline Messaging & Sync Enable users to compose messages without internet and deliver them automatically via peer-to-peer methods (Bluetooth/WiFi Direct) when nearby users are available. This would be a game-changer for rural India with unreliable
Annoying Social Messaging Auto-Prompts
Hello! I love the idea of integrating SalesIQ with messaging channels like Facebook Messenger and Instagram. However, the way the SIQ throws the initial prompts feels annoying and too robotic. I'm attaching a few screenshot samples, just the resent ones.
Can Timesheets be utilized without Jobs?
We are looking to streamline timesheets with our technicians and thought that Zoho People's Time Logs/Timesheets would be beneficial. However, it looks like all time entries and timesheets need to be associated with a job. The way we track time is just
Introducing Bigin's latest AI features, built for the way you work!
Hi Biginners! In continuation of our AI journey that began on mobile and grew with the MCP release, we're bringing AI features right inside your Bigin web interface, where it makes the most impact for your business. At Bigin, we believe in building features
Introducing Product Catalog in Bigin
Greetings, I hope all of you are doing well. For many small businesses, sharing products and collecting customer interest often involves multiple tools, manual follow-ups, or even building a full ecommerce website. To address this challenge, we're excited
Default Reminder for tasks set to Pop-up instead of email
Try to save a click every time we create a task we want it to default to pop-up instead of email. Also default is to have reminder unchecked anyway to change so reminder is checked and method is pop-up default instead of email? Attached picture. Thanks,
Add Claude in Zoho Cliq
Let’s add a real AI assistant powered by Claude to your workspace this week, that your team can chat with, ask questions, and act on conversations to run AI actions on. This guide walks you through exactly how to do it, step by step, with all the code
Issue with SalesIQ Chats Automatically Closing Due to the 24-Hour Idle Timeout?
Hello, I am experiencing a significant issue with SalesIQ automatically closing chats due to the Idle Timeout setting. I use SalesIQ through the integration between SalesIQ and Line App. To be honest, this issue has become extremely frustrating. Problems
The Autopilot Trap: Why You Might Be Missing Zoho One's Best Updates
It is well known that we are creatures of habit. Every morning, we get to our workplace, open our laptops, and let muscle memory take over. We click the exact same icons, navigate to the exact same tabs, and do the exact same tasks we have been doing
Next Page