Article Read Time:

8 Min

Search

Subcribe :

Train Your Team:

Our Extensions:

Join For FREE:

How to Track Paid Ad ROI in Zoho CRM and Zoho Analytics

This tutorial walks through how to connect Google Ads spend to Zoho CRM outcomes using UTM campaign tracking, Zoho Analytics, a SQL union table, and aggregate formulas. The end result is a reporting model that lets you measure leads, deals, revenue, profit, and true return on ad spend from your paid campaigns.

What You’ll Build

  • UTM-aware lead capture: A form setup that captures campaign attribution data and passes it into Zoho CRM.
  • CRM field mapping for attribution: The UTM campaign value is stored on Leads and carried into Contacts and Deals during lead conversion.
  • Zoho Analytics data model: CRM data and Google Ads tables are synced into Zoho Analytics for reporting.
  • A SQL master table: Ad spend, leads created, deals created, and closed won revenue are combined into one reporting structure.
  • Consolidated ROI reporting: Aggregate formulas make it easy to build pivot tables, charts, and dashboards that connect ad spend to closed won revenue.

Full Tutorial Video: Google Ads & Zoho CRM+Analytics // Calculate your Return on Ad Spend

A Google Ads ROI reporting workflow in Zoho is not just about counting clicks or form submissions. When it is built correctly, it gives your team a clean way to compare ad spend against real CRM outcomes such as leads created, deals created, closed won count, closed won revenue, and overall campaign profit.

Main takeaway: The metric leadership usually cares about most is simple: for the money spent on advertising, how much revenue did the business actually generate?

Part 1: Capture UTM Campaign Data in Your Form

Why does UTM campaign tracking matter?

The entire reporting model depends on preserving the campaign identifier from the original ad click all the way into Zoho CRM. In most cases, the most important field is UTM Campaign, which often stores the ad platform’s campaign ID.

How do I capture UTM data in Zoho Forms?

  1. Open Zoho Forms.
  2. Go to Share.
  3. Open the UTM Tracking settings.
  4. Enable the relevant UTM parameters.
  5. Copy the provided tracking JavaScript.
  6. Place that script at the end of the body section of your webpage.

That setup ensures the form submission includes the campaign data needed for later reporting in Zoho CRM and Zoho Analytics.

Can I use a different form tool?

Yes. Zoho Forms is used in this walkthrough, but the same approach works with other form tools as long as they capture the campaign parameter and pass it into Zoho CRM correctly.

Part 2: Map UTM Campaign into Zoho CRM

Where should the UTM campaign value be stored in Zoho CRM?

At minimum, you should create a field in the Leads module to store the UTM campaign value. That value needs to land on the lead record when the form is submitted.

Should the UTM campaign also be mapped to Contacts and Deals?

Yes. During lead conversion, the field should pass to both Contacts and Deals. For this style of ROI reporting, the Deal record is especially important because that is where revenue and pipeline outcomes are measured.

Best practice: Keep the UTM campaign field on Contacts as well. That preserves attribution data for future reporting even if additional deals are created later.

Why does lead conversion mapping matter?

If the UTM campaign only exists on the original lead, attribution breaks once the lead converts. Proper conversion mapping is what allows ad-origin data to follow the record into the sales pipeline.

Part 3: Sync CRM and Google Ads Data into Zoho Analytics

Which CRM tables need to sync into Zoho Analytics?

For this reporting model, make sure the following modules sync into Zoho Analytics with the UTM campaign field included:

  • Leads
  • Contacts
  • Deals

What Google Ads data should be imported?

The two most important Google Ads tables are:

  • Campaigns
  • Campaign Performance

The Campaigns table gives you the campaign name and campaign ID. The Campaign Performance table gives you spend by date, which is the core input for paid advertising ROI analysis.

Does this process only work for Google Ads?

No. The same reporting pattern can generally be adapted for LinkedIn Ads, Facebook Ads, and Instagram Ads because the data structure is similar enough for this kind of attribution model.

Part 4: Why Standard Reports Are Not Enough

What is the reporting problem this solves?

If you only look at lead counts by campaign, you still do not know whether the campaign was profitable. A campaign can generate a large number of low-quality leads and still perform badly if those leads never become real opportunities or revenue.

What you actually need is a single model that connects:

  • Ad Spend
  • Leads Created
  • Deals Created
  • Deals Closed Won (Count)
  • Deals Closed Won (Revenue)

That is where the SQL union table comes in.

Part 5: Create a SQL Union Table in Zoho Analytics

Why use a SQL union table?

A SQL union table lets you combine multiple source tables into one master reporting table with a consistent structure. Instead of reporting separately on ad platform data and CRM data, you create one data set that can be used in pivot tables, charts, and dashboards.

What fields should the master table include?

In this tutorial, each block of SQL outputs the same four core columns:

  • Type
  • Campaign Name
  • Date
  • Amount

The Type column labels the row as Ad Spend, Leads Created, Deals Created, Closed Won Revenue, or Closed Won Count. The Amount column stores either a count value of 1 or a revenue/spend value depending on the row type.

SQL template used in the walkthrough

You can also view the code-share version here: Template SQL Script for Managing Google Ads Data in Zoho Analytics

SELECT
     'Ad Spend' as 'Type',
     "Campaigns (Google Ads)"."Campaign" as 'Campaign Name',
     "Campaign Performance (Google Ads)"."Day" as 'Date',
     "Campaign Performance (Google Ads)"."Costs" as 'Amount'
FROM  "Campaign Performance (Google Ads)"
JOIN "Campaigns (Google Ads)" ON "Campaign Performance (Google Ads)"."Campaign ID"  = "Campaigns (Google Ads)"."Campaign ID"  
UNION ALL
 SELECT
     'Leads Created' as 'Type',
     "Campaigns (Google Ads)"."Campaign" as 'Campaign Name',
     "Leads (Zoho CRM)"."Lead Created Date" as 'Date',
     1 as 'Amount'
FROM  "Leads (Zoho CRM)"
JOIN "Campaigns (Google Ads)" ON "Leads (Zoho CRM)"."UTM Campaign"  = "Campaigns (Google Ads)"."Campaign ID"  
UNION ALL
 SELECT
     'Deals Created' as 'Type',
     "Campaigns (Google Ads)"."Campaign" as 'Campaign Name',
     "Leads (Zoho CRM)"."Lead Created Date" as 'Date',
     1 as 'Amount'
FROM  "Deals (Zoho CRM)"
JOIN "Leads (Zoho CRM)" ON "Deals (Zoho CRM)"."Id"  = "Leads (Zoho CRM)"."Converted Deal" 
JOIN "Campaigns (Google Ads)" ON "Leads (Zoho CRM)"."UTM Campaign"  = "Campaigns (Google Ads)"."Campaign ID"  
UNION ALL
 SELECT
     'Deals Closed Won (Revenue)' as 'Type',
     "Campaigns (Google Ads)"."Campaign" as 'Campaign Name',
     "Leads (Zoho CRM)"."Lead Created Date" as 'Date',
     "Deals (Zoho CRM)"."Amount" as 'Amount'
FROM  "Deals (Zoho CRM)"
JOIN "Leads (Zoho CRM)" ON "Deals (Zoho CRM)"."Id"  = "Leads (Zoho CRM)"."Converted Deal" 
JOIN "Campaigns (Google Ads)" ON "Deals (Zoho CRM)"."UTM Campaign"  = "Campaigns (Google Ads)"."Campaign ID"  
WHERE  "Deals (Zoho CRM)"."Stage"  = 'Closed Won'
UNION ALL
 SELECT
     'Deals Closed Won (Count)' as 'Type',
     "Campaigns (Google Ads)"."Campaign" as 'Campaign Name',
     "Leads (Zoho CRM)"."Lead Created Date" as 'Date',
     1 as 'Amount'
FROM  "Deals (Zoho CRM)"
JOIN "Leads (Zoho CRM)" ON "Deals (Zoho CRM)"."Id"  = "Leads (Zoho CRM)"."Converted Deal" 
JOIN "Campaigns (Google Ads)" ON "Deals (Zoho CRM)"."UTM Campaign"  = "Campaigns (Google Ads)"."Campaign ID"  
WHERE  "Deals (Zoho CRM)"."Stage"  = 'Closed Won'

Important modeling concept: For count-based events such as Leads Created or Deals Created, the SQL uses 1 as Amount. That makes it easy to sum counts later in aggregate formulas.

Part 6: Use Aggregate Formulas with sum_if

Why use aggregate formulas instead of raw report math?

Once the SQL master table is built, aggregate formulas make the reporting layer much easier to manage. Rather than dragging the Type field around in every report, you can create reusable formulas that summarize each metric cleanly.

What is an example aggregate formula for Ad Spend?

sum_if("Google Ads + CRM Data Master Table"."Type" = 'Ad Spend',"Google Ads + CRM Data Master Table"."Amount")

You would create similar aggregate formulas for:

  • Leads Created
  • Deals Created
  • Deals Closed Won (Count)
  • Deals Closed Won (Revenue)

What can I calculate from those aggregate formulas?

Once the base formulas exist, you can easily create higher-level metrics such as:

  • Cost Per Lead = Ad Spend / Leads Created
  • Lead Conversion Percent = Deals Created / Leads Created
  • Campaign Profit = Closed Won Revenue – Ad Spend
  • ROI Percent = Campaign Profit / Ad Spend

Part 7: Build Pivot Tables and Charts in Zoho Analytics

How should I visualize the data?

Once your aggregate formulas are ready, you can use them in Pivot Tables and Charts to build clean campaign reporting.

Common report dimensions include:

  • Campaign Name
  • Month and Year
  • Date Range

What reports are most useful?

  • Monthly ad spend by campaign
  • Ad spend vs leads created
  • Ad spend vs closed won revenue
  • Campaign profit by month
  • Lead conversion percent by campaign

This gives marketing, sales, and leadership a much clearer picture of what is actually working in paid advertising.

Part 8: Decide How to Attribute Revenue by Date

Should I report revenue based on deal close date or lead creation date?

This is one of the most important reporting decisions in the entire workflow. In the walkthrough, one option shown is attributing deals and revenue back to the lead created date rather than the actual close date.

Why would I use lead creation date?

If your goal is to understand marketing performance, it often makes more sense to tie revenue back to the month when the ad spend generated the lead. That gives a more realistic view of which campaigns created valuable opportunities.

When would close date make more sense?

If your goal is operational sales or finance reporting, you may want to attribute revenue to the month the deal actually closed. Both approaches are valid. The right choice depends on what question the dashboard is supposed to answer.

Good question to ask stakeholders: Do you want to measure when the money was spent to generate the lead, or when the revenue officially closed?

Part 9: Add Filters and Dashboard Controls

What filters should I include in the dashboard?

Useful dashboard filters for this type of reporting usually include:

  • Campaign Name
  • Relative Date Range such as Last 6 Months
  • Custom Date Range

With those filters in place, users can quickly narrow the view to a specific campaign, time period, or reporting window without rebuilding the report.

Google Ads + Zoho Analytics Reporting Reference Table

Component Purpose Example in This Tutorial Best Practice
UTM Campaign Stores the campaign identifier from the ad click Mapped from form submission into Zoho CRM Make sure it is preserved through lead conversion into Deals
Campaigns Table Provides campaign names and campaign IDs Campaigns (Google Ads) Use campaign ID as the main join key
Campaign Performance Table Stores spend by campaign and date Campaign Performance (Google Ads) Use this as the ad spend source in your union table
SQL Union Table Combines multiple sources into one reporting model Ad Spend, Leads Created, Deals Created, Closed Won rows Standardize the output columns across every SELECT block
Aggregate Formula Summarizes one metric from the Type column sum_if(… Type = ‘Ad Spend’ …) Build reusable formulas before creating dashboards
Dashboard Filters Lets users explore performance by time and campaign Campaign + date filters Include both relative and custom date range options

Code Share Snippet

You can use the SQL template and walkthrough notes here:

Template SQL Script for Managing Google Ads Data in Zoho Analytics

Next, you’ll create some aggregate functions using sum_if statements against the Type column. One example to aggregate Ad Spend would be:

sum_if("Google Ads + CRM Data Master Table"."Type" = 'Ad Spend',"Google Ads + CRM Data Master Table"."Amount")

These can be easily used in Pivot tables and Charts to create consolidated reporting such that you can actually connect your Google Ads spend to CRM outcomes like Leads Created, Deals Created, and Deals Closed Won by both count and revenue amount.

Check out the video for the full walkthrough.

Frequently Asked Questions

How do I track Google Ads ROI in Zoho CRM?

Capture the UTM campaign value in your form, map it into Zoho CRM, sync the CRM data and Google Ads tables into Zoho Analytics, and use SQL plus aggregate formulas to compare ad spend against CRM outcomes and revenue.

What UTM field matters most for paid ad attribution?

The most important field is usually UTM Campaign because it gives you the campaign identifier needed to connect form submissions, CRM records, and ad spend data.

Why should I use a union table in Zoho Analytics?

A union table makes it possible to combine ad spend, lead creation, deal creation, and closed won revenue into one master reporting structure that can be used across pivots, charts, and dashboards.

What are aggregate formulas doing in this setup?

Aggregate formulas use the Type column to summarize metrics like Ad Spend, Leads Created, Deals Created, and Closed Won Revenue. They make it much easier to build clean reports from one SQL master table.

Should I report revenue by lead created date or close date?

Use lead created date if your focus is marketing attribution and campaign performance. Use close date if your focus is sales operations or finance reporting. Many teams benefit from seeing both views.

Need Help Connecting Google Ads, Zoho CRM, and Zoho Analytics?

If you want better paid advertising reporting inside Zoho, Zenatta can help you set up UTM tracking, CRM attribution fields, SQL reporting tables, aggregate formulas, and dashboards that actually show what your ad spend is producing.

Book a CRM Strategy Session

Billy Bates

Senior Web Developer

Billy is a Wordpress Developer with an eye for design. His knowledge will help our company website and client sites meet their goals. Billy and his young family have just moved to Ashland Oregon, and are looking forward to exploring the area’s amazing beer, wine, and food. He also has a passion for synthesizers and drum machines.

Lucas Sant'Anna

Consultant

With a background in Operations Research and Data Analysis, Lucas is a Brazilian programmer that likes to get stuff done quickly and reliably. In previous jobs, he implemented industrial job scheduling, fleet management and detailed long-haul route optimization – among other data-driven processes – to reach objectives of increased profit and reduced wasted resources. His goal is to make Zoho fully automated and with more meaningful data for spot-on decisions.

.

.