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:
Meta Ads — connector
meta-ads- Permissions:
ads_read,read_insights - Status:
active
- Permissions:
Google Ads — connector
google-ads- Permissions:
google_ads_read - Status:
active
- Permissions:
TikTok Ads — connector
tiktok-ads- Permissions:
tiktok_ads_read - Status:
active
- Permissions:
Kommo CRM — connector
kommo- Permissions:
crm_read - Status:
active
- Permissions:
Matching scheme:
- Matching Presets: three separate presets are applied sequentially:
- Meta Ads + Kommo (UTM) — matched via
utm_content/utm_campaign - Google Ads + Kommo (GCLID) — matched via GCLID
- TikTok Ads + Kommo (UTM) — matched via
utm_source=tiktok
- Meta Ads + Kommo (UTM) — matched via
- The results of the three matches are combined into a single report with a
sourcefield 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, andkommoconnections - 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
{
"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:
| Metric | Type | Description |
|---|---|---|
spend | currency | Budget spent (sum across all ad channels) |
impressions | number | Total impressions |
clicks | number | Total clicks |
cpc | currency | Average cost per click |
leads | number | Number of leads in Kommo |
deals_created | number | Deals created |
deals_won | number | Deals won |
revenue | currency | Revenue from won deals |
Calculated metrics:
{
"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
{
"logic": "AND",
"conditions": [
{
"field": "spend",
"operator": "GREATER_THAN",
"value": 1000
},
{
"field": "leads",
"operator": "GREATER_THAN",
"value": 10
}
]
}spend > 1000— excludes channels/campaigns with minimal budgetleads > 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
{
"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]