Kaizen 200 - OAuth and Token Management using Zoho CRM Python SDK

Kaizen 200 - OAuth and Token Management using Zoho CRM Python SDK



We’re incredibly excited to bring you the 200th post in our Kaizen series!

Idea
This journey has been as much about listening as it has been about sharing. And today, we’re making both count. Over the past few weeks, we’ve collected your feedback through the Kaizen feedback form added in our earlier posts. Thank you for the time and thought you’ve put into it.

Starting today, we’ll be actively addressing your most requested topics. 

Overview – OAuth 2.0 and Zoho CRM SDKs

In this Kaizen, we’ll walk you through how OAuth 2.0 authentication is handled using the Zoho CRM Python SDK, and how the SDK simplifies token refresh, storage, and management for multiple users and organizations across multiple data centers.

Introduction:


OAuth2.0 Recap:



Token Management using Zoho CRM SDKs:


Sample Project Overview

We’ve used a fully working sample project to demonstrate the OAuth flow in action.

Frontend

A static interface built using HTML, CSS, and JavaScript.
Files include:
  • index.html – login and data input page
  • script.js – client-side login and record handling
  • redirect.html – used to capture the grant token from Zoho

Backend

A Python server using Zoho CRM SDK to:
  • Authenticate users using OAuth 2.0
  • Store and manage tokens
  • Fetch and manipulate CRM records

Note:

Before running the project, you’ll need to register your client in the Zoho API Console. Once registered, use the generated Client ID and Client Secret in your server code.
If you're planning to support users across multiple Zoho Data Centers (DCs):
  • Be sure to enable Multi-DC for your client.
  • Use the same client credentials (Client ID and Secret) for all the DCs during authentication.

Implementation Demo:

How the SDK Maps Tokens to Users

One of the key challenges in multi-user apps is ensuring that each user's tokens are stored and retrieved correctly. The Zoho CRM Python SDK handles this automatically.
As part of the OAuth flow, the SDK retrieves the user's email and organization info in the background using the scopes ZohoCRM.users.READ and ZohoCRM.org.READ. It then uses this unique user–org combination to:
  • Store access and refresh tokens separately for each user
  • Automatically update tokens when a user logs in again
  • Ensure that all API calls are authorized with the correct tokens
If you're implementing Login with Zoho using the standard OAuth redirect flow, all of this is handled internally by the SDK using the user and org information retrieved during login. There’s no need to manually pass a UserSignature in the token object.
 
If you're not implementing Login with Zoho, or if you’d prefer to explicitly associate a token with a known user, you can pass a UserSignature object during initialization:
  1. from zohocrmsdk.src.com.zoho.api.authenticator import UserSignature

    user = UserSignature(email)
    token = OAuthToken(..., user_signature=user)
    Initializer.initialize(..., user=user)
This ensures the SDK can correctly identify the token's owner and separate tokens for different users or orgs in a multi-user application.

Multi-User & Multi-DC Token Management


Authentication can often be one of the trickiest parts of any integration, especially when you're dealing with multiple users, environments, and token refresh cycles. With the Zoho CRM SDKs, much of that complexity is handled for you, from generating and persisting tokens, to refreshing them silently when they expire, and managing user-org mappings behind the scenes.

We hope this Kaizen gave you a clearer picture of how to use our SDKs confidently in your apps. Try out the project, play around, and see how it all works in real time. 

If you have any queries, let us know the comments below, or send an email to support@zohocrm.com. We'd love to hear from you.


    • Sticky Posts

    • Kaizen #197: Frequently Asked Questions on GraphQL APIs

      🎊 Nearing 200th Kaizen Post – We want to hear from you! Do you have any questions, suggestions, or topics you would like us to cover in future posts? Your insights and suggestions help us shape future content and make this series better for everyone.
    • Kaizen #198: Using Client Script for Custom Validation in Blueprint

      Nearing 200th Kaizen Post – 1 More to the Big Two-Oh-Oh! Do you have any questions, suggestions, or topics you would like us to cover in future posts? Your insights and suggestions help us shape future content and make this series better for everyone.
    • Celebrating 200 posts of Kaizen! Share your ideas for the milestone post

      Hello Developers, We launched the Kaizen series in 2019 to share helpful content to support your Zoho CRM development journey. Staying true to its spirit—Kaizen Series: Continuous Improvement for Developer Experience—we've shared everything from FAQs
    • Kaizen #193: Creating different fields in Zoho CRM through API

      🎊 Nearing 200th Kaizen Post – We want to hear from you! Do you have any questions, suggestions, or topics you would like us to cover in future posts? Your insights and suggestions help us shape future content and make this series better for everyone.
    • Client Script | Update - Introducing Commands in Client Script!

      Have you ever wished you could trigger Client Script from contexts other than just the supported pages and events? Have you ever wanted to leverage the advantage of Client Script at your finger tip? Discover the power of Client Script - Commands! Commands
    • Recent Topics

    • No Experiment Visitors

      I have an experiment running for five days. PageSense web analytics data shows the page is getting visitors, but the experiment data itself says zero visitors. I am in trial mode, not sure if that's related. A week ago, I contacted support through chat
    • How do I get at the data in "Partially Saved Entries"?

      Hi, Zoho Newbie here - I'm helping to support an existing Zoho installation, so this is all a bit new to me. I have to say, I'm liking what I've seen so far! We've just spotted that we have a number of respondents to our forms who don't end up submitting
    • SOLVED: Stopping Multiple Invitations when sync with Google Calendar

      I wanted to share this solution as I wasn't able to find it when searching through the Zoho community and via web search. The issue: When requestor books a meeting through Zoho Bookings, the requestor receives a confirmation email from both Bookings and
    • Help Needed with Creating Close % Reporting

      Now that our company has a good data set to work with we want to use ZCRM reports ways to track the performance metrics we have established. Specifically, I want to be able to calculate closing % for individual salespeople and individual support people.
    • Restricting Calendar View to Working Hours

      Hi: I'm trying to implement a calendar which displays all of my customer appointments.  Currently, the calendar shows all 24 hours of the day.  Is there a way to restrict the hours to simply the times my business is open? Thanks!
    • Static Prefill URLs Functionality in the App

      Hi, It would be great to be able to use the same functionality within the App, so create the Static Prefill URL as today and be able to use online as today, and then have an area within the App showing these Entries that can be pressed and opens the form
    • Outbound Gateway

      Hi, Is it possible to configure the Outbound Gateway to route external domains only and keep inter-domain emails locally delivered? When one of my users sends an email to another user within our own domain, I want user1@mydomain.com to user2@mydomain.com not to exit. However, if anyone within our domain sends to an external address, I want that email to be routed using the Outbound Gateway. Thanks. P.
    • Free Webinar : Unlock AI driven business insights with Zoho Inventory + Zoho Analytics

      Are you tired of switching between apps and exporting data to build customized reports? Say hello to smarter & streamlined insights! Join us for this exclusive webinar where we explore the power of the Zoho Inventory–Zoho Analytics integration. Learn
    • Delivery Note Delivered item must be reduce in inventory stock

      When I create any Delivery note with product like mobile In our stock if it was 10 Unit I sold thru invoice, 4 unit And thru Delivery note, 2 Unit and I also change Delivery note status as delivered So in my stock it should display remaining 4 unit But write now it display 6 unit only. Please help me for that Because when I creating new invoice it display 6 unit in stock but actually in my physical stock its only 4. So I miss guide with stock display
    • Adding bills from docs *** Internal Error ***

      Same internal errors in Chrome & Edge !
    • Response time when adding customers to the database is increasing over time.

      Response time when adding customers to the ZoHo books database is increasing over time. The response time to retrieve a newly added customer is now 1.5 to 2 minutes. The database has approximately 2,000 customers. I think you need to reorganise the
    • Excluded transactions in Banking

      Why are the payees not checked when 2 payments are for the same amount to avoid exclusion? If there are 2 ( or more ) payment amounts which are the same then they are automatically excluded, this should not happen unless the payee names are the same
    • Introducing Zia AI in Zoho Show

      AI is no longer a distant concept. It’s one of our everyday tools, from answering casual questions to generating critical business documents. And presentations are one area where AI can be especially helpful. At Zoho Show, we’ve been deliberate in how
    • Plug Sample #10 - Simplify Ticket Management (Zoho Desk) with Chatbots

      Hi everyone! We're here with another simple yet effective plug for your chatbot to integrate with Zoho Desk. When a customer reports an issue/request during chat, it's logged as a ticket on Desk. When they return for updates, you end up searching through
    • Trigger a field rule when Choice Availability reaches 0

      First of all, thanks for shipping the new Choice Availability counter. It solves the basic “stop over-booking” problem. What’s missing, though, is a way to react when an option is sold out. Right now we can only disable/hide the choice; we can’t fire
    • Unattended Access on Android without Play Store

      I'm testing Zoho Assist for remote config and maintenance of our IoT devices. The devices are running Android 8.1 and do NOT have Google Play Store installed, nor can it be installed. I've been able to install Zoho Assist on the devices and load the enrollment
    • Zoho People > Performance Management > Appraisal cycle

      Hello All I am using this 2 users to test out how it work on Performance Management User 1 - Reportee User 2 - Reporting Manager : Li Ting Haley User 1 : Self Appraisal Error How do i fix this error?
    • What's New - June 2025 | Zoho Backstage

      Plans change. People cancel. Tickets get handed off. It happens, and we understand. As an organizer, you need tools that offer flexibility for attendees while protecting your event’s integrity. That’s why we’ve built features to help you manage these
    • Include Article Sync Details in SalesIQ–Desk Integration Notification Email

      Dear Zoho SalesIQ Team, Greetings, We are using the integration between Zoho SalesIQ and Zoho Desk to sync articles from the Zoho Desk Knowledge Base into SalesIQ. As part of this integration, we receive the following email notification: "Your scheduled
    • Naming a Visitor in SalesIQ Messes up First and Last Name

      When I go to Visitor History to manually associate a visitor with a known contact, I press the pencil symbol next to the system-generated ID number. I enter first and last name, then email. Looks good so far. However, when it syncs with CRM, first name
    • Partial Sync

      Hi, got an issue with syncing cards across windows app, web app and iphone app. If I create a card and add some text content then everything syncs across all platforms ok. If I create a card and add an attachment, be it pdf, jpg or movie then the card
    • Related activity records for custom modules

      For default modules in CRM, whenever I create a task for a contact, the task also appears in the record for the parent account. How do I replicate this with custom modules? My specific situation is that I have a custom module as a child module to Accounts.
    • Why Do My Portal Users Can't See Any Data in Reports

      In My zoho crm i have created a button automation which basically is it converts a quote into invoice and sales order , so initially when a person who is my app user submits a quotation form it goes into quote module and record is created and in each
    • Introducing Zoho Commerce 2.0 — It's more than just selling!

      Hello! We are proud to launch Zoho Commerce 2.0, a reimagination of how online businesses look, feel, and function. This launch is both timely and symbolic, as we reaffirm our commitment to empowering small and medium enterprises with powerful, yet simple-to-use
    • Introducing prompt builder in Zoho CRM

      We’ve introduced a new way to put Zia’s generative AI to work—right where your teams need it most. With the all new prompt builder for custom buttons, you can create your own AI instructions to generate tailored content, suggestions, or summaries across
    • Item Batch Creation/Updation

      I have a requirement to integrate a local system with Zoho Books. I need to create items in Zoho Books with batch tracking enabled, but I couldn't find a specific API for that in the Zoho Books API documentation. Is there a dedicated API endpoint to create
    • Education Zoho User Group (ZUG) virtual meetup featuring Zoho Sign

      Hi there! The educational sector often faces the hassle of handling extensive paperwork, which leads to increased operational costs. A digital signature solution like Zoho Sign can help you modernize your processes, go fully digital, and seamlessly collect
    • Troubleshooting Delays in Zoho CRM Automation Workflows for Lead Status Updates

      Dear Zoho Community, I am refining a sales pipeline in Zoho CRM, implemented in May 2025, to enhance efficiency for a small business managing client leads. While the CRM effectively tracks leads, I am encountering delays in automation workflows that update
    • 📣 [Webinar] Spikra shows how businesses leverage Zoho Bookings to increase revenue

      [Webinar] Spikra shows how businesses leverage Zoho Bookings to increase revenue Hi all, Service-based businesses need to be on top of their client experience game to stay ahead. Spikra, one of our Advanced Zoho Partners, has been helping businesses deliver
    • Kaizen #172 - Leveraging the 'crmAPIResponse' Object in Queries

      Hello everyone! Welcome back to another week of Kaizen! We released the Queries feature sometime back and hope you have tried it out. A little gist about this feature before we move on to our post. Zoho CRM's Queries feature enables dynamic data retrieval
    • transforming 1D tables to 2D and the other way round

      Does Dataprep have tools to convert 1D tables to 2D tables and the other way round? The actions that are commonly called "pivot" and "melt". What I mean is transitioning between these two kinds of table: 2D id ____ name ____ surname ____ age 00 ____ Matt
    • How I Migrate data from one SharePoint Tenant to another

      I want to perform SharePoint tenant to tenant migration, but the problem is I don't know how to do so. I’ve heard about different SharePoint Migrator, but I’m not sure which one is the best for this type of migration. Any guidance would be really he
    • Rebrand your CRM with the all-new custom domain mapping setup

      UPDATES TO THIS FEATURE! 19th Jan, 2024 — Custom domain mapping has been made available for portal users in Zoho One and CRM Plus. 23rd June, 2023 — Custom domain mapping has been made available for all users, in all DCs. Hello everyone! We are elated
    • authentication

      We cannot connect via IMAP. We are receiving the following error: Error: You are yet to enable IMAP for your account. Please contact your administrator (Failure)
    • Bad User: Authenticated but not connected

      Zoho CRM cannot send/receive emails and it appears as if it may be an api configuration change either via Zoho or MS. Does anyone have information on how to fix this error message? I am admin on all my accounts. Zoho and MS are blaming each other.
    • Edit email address that appears on invoice

      Hi How do I change the email address that appears on invoices, it is showing the email address that i used to sign up to zoho with but I want to change it to another email address that we use for accounts. also is there a way to edit the position of a
    • Zoho Tasks - Add Sorting by Priority

      We are able to Group by and Filter by Priority but for some reason we can't Sort by Priority on the Task lists. Please allow for sorting by priority if the current view is not grouped by priority.
    • customize payment page

      Is there a way to customize, other than the theme colour, the payment page that customers are taken to from invoices? I can't seem to find a way. I just don't like the formatting of the current page and would like to make it look better. I've looked at
    • Zoho People > Candidate Form > error Editable Primary Lookup is needed to set add permission

      Hello All I have try to turn on the add feature in the candidate form It show the error Editable Primary Lookup is needed to set add permission What is missing from my side?
    • 6 time-saving tips for working with tables in Zoho Writer

      Tables have always been the best way to represent data. They help you structure and categorize information systematically and present them in a simpler way. While tables in Zoho Writer are easy to implement, some tasks might not be that obvious.  Here are some time-saving tips to help you work better with tables in Zoho Writer:    1. Insert Multiple Rows / Columns in a Table Adding more rows and columns is the most common action performed while working with tables. Instead of using the Table tab,
    • Next Page