Skip to content

Multi-channel ROAS: Meta Ads + Google Ads + TikTok Ads → Kommo

Business task

A CMO or marketing director needs a single view of performance across all advertising channels — Meta Ads, Google Ads, and TikTok Ads — tied to actual sales in the Kommo CRM. You need to calculate ROAS, ROMI, and profit for each channel in one report to make strategic budget-reallocation decisions. The goal is to understand which channel delivers the best return per dollar spent.

Connections

This report requires four connections:

  1. Meta Ads — connector meta-ads

    • Permissions: ads_read, read_insights
    • Status: active
  2. Google Ads — connector google-ads

    • Permissions: google_ads_read
    • Status: active
  3. TikTok Ads — connector tiktok-ads

    • Permissions: tiktok_ads_read
    • Status: active
  4. Kommo CRM — connector kommo

    • Permissions: crm_read
    • Status: active

Matching scheme:

  • Matching Presets: three separate presets are applied sequentially:
    1. Meta Ads + Kommo (UTM) — matched via utm_content / utm_campaign
    2. Google Ads + Kommo (GCLID) — matched via GCLID
    3. TikTok Ads + Kommo (UTM) — matched via utm_source=tiktok
  • The results of the three matches are combined into a single report with a source field to distinguish channels

Critically important: all three ad connections and the CRM connection must be active. If even one ad channel is unavailable, the report will run with partial status — there will be no data for that channel. Check the status of all four connections in the Connections section before running the report.

Report settings

  • Name: Multi-channel ROAS → Kommo
  • Report type: multi-source attribution
  • Matching Presets: Meta Ads + Kommo (UTM), Google Ads + Kommo (GCLID), TikTok Ads + Kommo (UTM)
  • Data sources: all meta-ads, google-ads, tiktok-ads, and kommo connections
  • Date range: last_90_days — a quarter's depth for a stable ROAS
  • Attribution window: 30 days (click → lead) + 60 days (lead → deal)
  • Attribution model: last-click (default) — the order is attributed to the last click
  • Grouping: by source (source), campaign (campaign_name), and month (month)
  • Sorting: by ROAS, descending
  • Timezone: Europe/Moscow

Parameters

json
{
  "date_range": "last_90_days",
  "matching_presets": [
    "meta-ads-kommo-utm",
    "google-ads-kommo-gclid",
    "tiktok-ads-kommo-utm"
  ],
  "attribution_model": "last_click",
  "attribution_window": {
    "click_to_lead_days": 30,
    "lead_to_deal_days": 60
  },
  "group_by": ["source", "campaign_name", "month"],
  "sort": { "field": "roas", "direction": "desc" },
  "timezone": "Europe/Moscow",
  "limit": 3000
}

The last_click attribution model means that if a customer clicked a Meta Ads ad, then a Google Ads ad, and submitted a lead, the order is attributed to Google Ads. This is the standard model, but LightLead also supports others: first_click, linear, time_decay, position_based.

Grouping by month gives you month-over-month ROAS dynamics — you can see how channel performance changes over time.

Metrics

Universal cross-channel metrics, consistent across all channels:

MetricTypeDescription
spendcurrencyBudget spent (sum across all ad channels)
impressionsnumberTotal impressions
clicksnumberTotal clicks
cpccurrencyAverage cost per click
leadsnumberNumber of leads in Kommo
deals_creatednumberDeals created
deals_wonnumberDeals won
revenuecurrencyRevenue from won deals

Calculated metrics:

json
{
  "calculated_metrics": [
    {
      "name": "roas",
      "formula": "IF([spend] > 0, ROUND([revenue] / [spend] * 100, 1), 0)",
      "type": "percent",
      "description": "ROAS: return on ad spend"
    },
    {
      "name": "romi",
      "formula": "IF([spend] > 0, ROUND(([revenue] - [spend]) / [spend] * 100, 1), 0)",
      "type": "percent",
      "description": "ROMI: return on marketing investment"
    },
    {
      "name": "profit",
      "formula": "[revenue] - [spend]",
      "type": "money",
      "description": "Profit = Revenue minus Spend"
    },
    {
      "name": "cac",
      "formula": "IF([deals_won] > 0, [spend] / [deals_won], 0)",
      "type": "money",
      "description": "Customer acquisition cost"
    },
    {
      "name": "revenue_share",
      "formula": "IF([total_revenue] > 0, ROUND([revenue] / [total_revenue] * 100, 1), 0)",
      "type": "percent",
      "description": "Channel's share of total revenue"
    }
  ]
}

The revenue_share metric is critical for budget allocation: a channel can have a 500% ROAS but bring in only 5% of revenue — that's a niche channel that's hard to scale. A channel with a 150% ROAS but a 60% share is a core driver of the business.

Filters

json
{
  "logic": "AND",
  "conditions": [
    {
      "field": "spend",
      "operator": "GREATER_THAN",
      "value": 1000
    },
    {
      "field": "leads",
      "operator": "GREATER_THAN",
      "value": 10
    }
  ]
}
  • spend > 1000 — excludes channels/campaigns with minimal budget
  • leads > 10 — a minimum number of leads for statistically meaningful metrics

To isolate a single channel: source EQUAL "meta-ads", source EQUAL "google-ads", or source EQUAL "tiktok-ads".

Write mode

Mode: Replace

A multi-source attribution report with four sources and three matching presets is the most complex report type. Only a full rewrite guarantees data consistency. Alternative modes are not recommended.

Run time: this report can take longer than usual to run (5-15 minutes on the Solo plan) due to the large number of sources and volume of data. Plan your schedule accordingly.

Schedule

json
{
  "schedule": {
    "enabled": true,
    "interval": "daily",
    "time": "09:00",
    "timezone": "Europe/Moscow",
    "retry_on_failure": true,
    "max_retries": 3
  }
}

Daily at 9:00 AM. Given the long run time, interval: "hourly" is not recommended — it would create unnecessary load.

Expected result

After a successful run:

  • Status: completed (all 4 sources available)
  • Row count: channels (3) × campaigns × months (3) (typically 100-500 rows)
  • A unified view: ROAS, ROMI, profit, CAC, and revenue share for each channel in a single table
  • Comparison: Google Ads — 250% ROAS, 45% revenue share; Meta Ads — 180% ROAS, 35% share; TikTok — 120% ROAS, 20% share. It's clear that Google Ads is the most efficient channel, but TikTok is growing
  • Strategic decisions: budget is reallocated toward channels with the highest ROAS and scaling potential; channels with ROAS < 100% are optimized or shut down
  • Trends: grouping by month shows the trend — if a channel's ROAS is declining month over month, the causes need investigation

Screenshot

[Screenshot]

[Screenshot]

Maintained by the LightLead Documentation Team · Last verified: 2026-07-26