Zoho CRM is common among the Indian B2B and services businesses I work with, and most of them run Google Ads to a web form. The ads are judged on cost per lead, the sales team complains about lead quality, and nobody can say which keywords produce deals. Offline conversion import closes that loop by sending CRM outcomes back to Google Ads against the original click. I have written separately about the IndiaMART version of this problem and about WhatsApp leads; this piece is the general case: a website form, Zoho CRM, and Google Ads.
Step one: capture the gclid on every form
Everything depends on the gclid, the click identifier Google appends to your landing page URL when auto-tagging is on. Zoho's help documentation on tracking Google Ads data describes the native flow: the integration adds the gclid to the web form submission and stores it on the lead. If you use Zoho's own web forms with the Google Ads integration enabled, that is handled for you. If you use a custom form, a WordPress plugin, Webflow or a landing page builder, you have to do it yourself: read the gclid from the URL, store it in a first-party cookie so it survives page navigation, and write it into a hidden field that maps to a gclid field on the Zoho Lead. I store it for at least the 90 days Google keeps it. Two common breaks: redirects that strip query parameters, and forms in iframes on a different domain that cannot read your cookie. Test by clicking a real ad, or appending a dummy gclid to the URL, and checking the record in Zoho.
Step two: keep the gclid alive through conversion
A lead record is not where revenue happens. In Zoho CRM, a lead is converted into a Contact, an Account and usually a Deal, and if the gclid field is not mapped during conversion, it stays behind on the converted lead and the deal has no link to the click. In Zoho's lead conversion mapping settings, map your gclid field from Leads to a matching field on Contacts and Deals. I also capture the conversion source fields, UTM campaign, landing page and first touch date, so the sales team can see where the lead came from without opening Google Ads. If leads also arrive by phone, chat or WhatsApp, those records will not have a gclid at all. That is expected. Do not try to invent one. Either capture an identifier at the start of the conversation, which I cover in the WhatsApp piece, or accept that those leads are measured through enhanced conversions using hashed email instead.
Step three: map stages to conversion actions
In Google Ads, create a separate conversion action for each stage you want to send, with the source set to import from clicks. A typical B2B mapping for Zoho is: Lead qualified, when the lead status changes to the qualified value your team uses; Deal created or Opportunity, when a Deal is created against the contact; and Closed won, when the Deal stage reaches Closed Won, carrying the deal amount as the value. Choose one as the primary goal for bidding. I usually start with the qualified stage because it happens often enough to give Smart Bidding a steady supply of data, and keep Closed won as a secondary action until volume allows otherwise. Write the stage definitions down and agree them with sales before launch. If one rep qualifies everything and another qualifies nothing, Google learns from that inconsistency. The sales and marketing SLA template on this site is a good place to fix those definitions.
Upload methods: native, file or API
There are three ways to get conversions from Zoho into Google Ads. The native Zoho Google Ads integration is the simplest. Zoho's help documentation says conversions are pushed back when a lead is qualified or a deal is won within 90 days of the click, and that failures appear in a Conversion Failures view which keeps entries for seven days, so someone needs to check it weekly. The limitation is flexibility: you are working with the stages and values Zoho exposes. The second option is a scheduled file upload in Google Ads, fed by a Zoho report exported to a Google Sheet or a hosted CSV, which is simple and auditable. The third is the Google Ads API, called from a Deluge function, Zoho Flow or a small cloud function, which gives you full control over stages, values and timing. For most clients I start native, then move to the API when they need custom stages or values. Whichever you choose, upload at least daily.
Timing rules and common errors
Google's documentation on offline conversion imports is clear on a few rules. The gclid is kept for 90 days, so a conversion that happens after that cannot be matched; if your sales cycle is longer, send an earlier stage. The conversion time must be after the click time, and the FAQ suggests checking the time zone in your upload if you see a conversion date precedes click date error. The gclid is case sensitive, so any spreadsheet step that changes case breaks matching. Google also advises waiting a few hours after a click before uploading, because very recent clicks may not be processed yet. On the Zoho side, the errors I see most are gclids that were never captured because the form was not mapped, gclids that did not survive lead conversion, and duplicate uploads when a deal moves back and forth between stages. Use an order or deal ID and a flag field so each stage is sent once.
Adding enhanced conversions as a fallback
gclid matching fails more often now than it did a few years ago, because of consent choices, browsers and users who switch devices between click and enquiry. Enhanced conversions for leads gives Google a second key: the hashed email captured by the Google tag on form submission, matched against a hashed email in your upload. I add it once the gclid flow is stable. The companion piece on enhanced conversions for leads with HubSpot and Zoho covers the setup and the 63-day limit that Google applies to conversions using personal data. Between the two, most qualified leads from paid search get matched, and the account can finally bid toward leads your sales team wants.
Sources
Zoho CRM Help, Tracking Google Ads data: https://help.zoho.com/portal/en/kb/crm-v2-1/integrations/google/google-ads/articles/crm-v2-track-google-ads-data . Google Ads Help, Set up offline conversion imports using GCLID: https://support.google.com/google-ads/answer/7012522 . Google Ads Help, Offline conversion imports FAQs: https://support.google.com/google-ads/answer/10029210
FAQ
Zoho's own web forms can capture it when the Google Ads integration is enabled. Custom forms on WordPress, Webflow or landing page builders need a hidden field and a small script that reads the gclid from the URL and stores it.
Usually the earliest stage that sales agrees reflects a real opportunity, such as a qualified lead or a created deal. It happens often enough to train bidding and well inside the 90-day gclid window. Keep closed won as a secondary action.
The usual causes are a missing or altered gclid, a conversion time before the click time, a conversion outside 90 days, or a conversion action name that does not match. Zoho's Conversion Failures view keeps entries for seven days, so check it weekly.