End-to-End Analytics for Meta Ads + Kommo
Business Case
A marketing director needs to see the full cycle: from a Meta Ads click to a closed deal in Kommo CRM. The key question is which campaigns, ad sets, and creatives actually generate paid deals, not just leads. This requires calculating CPL (cost per lead), CAC (customer acquisition cost), and ROAS (return on ad spend) based on CRM revenue data rather than ad account data.
Connections
This report requires two connections:
Meta Ads — the
meta-adsconnector- Permissions:
ads_read,read_insights - Status:
active
- Permissions:
Kommo CRM — the
kommoconnector- Permissions:
crm_read - Status:
active
- Permissions:
Critically important: both connections must be active. If Kommo is unavailable, you'll only see ad metrics without deal data — CPL and ROAS won't be calculable.
Matching scheme (matching preset):
Meta Ads and Kommo data are matched by UTM tags, which are passed from the ad into hidden CRM form fields when a lead is captured. LightLead automatically matches the campaign and ad from Meta Ads with the corresponding deal in Kommo using these fields:
meta_ads.ad_id→kommo.lead.utm_contentmeta_ads.campaign_id→kommo.lead.utm_campaignmeta_ads.date→kommo.lead.created_date
Report Settings
- Name:
End-to-End Analytics Meta Ads → Kommo - Report type: attribution report (end-to-end analytics) with a matching preset
- Matching Preset: Meta Ads + Kommo (UTM) — a built-in LightLead preset for this connector pair
- Data sources: all
meta-adsandkommoconnections - Date range:
last_30_days - Attribution window: 30 days (click → lead) + 60 days (lead → deal) = up to 90 days for the full cycle
- Grouping: by campaign (
campaign_name), ad set (adset_name), ad (ad_name), and pipeline (pipeline_name) - Sorting: by ROAS descending
- Timezone:
Europe/Moscow
Parameters
{
"date_range": "last_30_days",
"matching_preset": "meta-ads-kommo-utm",
"attribution_window": {
"click_to_lead_days": 30,
"lead_to_deal_days": 60
},
"group_by": ["campaign_name", "adset_name", "ad_name", "pipeline_name"],
"sort": { "field": "roas", "direction": "desc" },
"timezone": "Europe/Moscow",
"limit": 1000
}The meta-ads-kommo-utm matching preset is a pre-configured matching rule that requires no manual field-mapping setup. LightLead already knows that utm_content in Kommo corresponds to ad_id in Meta Ads.
Attribution window: click_to_lead_days: 30 means that if a click was more than 30 days ago, it isn't counted. lead_to_deal_days: 60 means that if a deal was created more than 60 days after the lead, it isn't attributed to that click. These are the standard recommended values, and you can adjust them to match your sales cycle.
Metrics
The Meta Ads + Kommo pairing provides end-to-end metrics:
| Metric | Type | Source | Description |
|---|---|---|---|
spend | currency | Meta Ads | Ad budget spent |
impressions | number | Meta Ads | Ad impressions |
clicks | number | Meta Ads | Clicks on ads |
ctr | percent | Meta Ads | Click-through rate |
leads | number | Kommo | Number of leads created |
qualified_leads | number | Kommo | Qualified leads |
deals_created | number | Kommo | Deals created |
deals_won | number | Kommo | Deals won |
revenue | currency | Kommo | Revenue from won deals |
Calculated metrics:
{
"calculated_metrics": [
{
"name": "cpl",
"formula": "IF([leads] > 0, [spend] / [leads], 0)",
"type": "money",
"description": "Cost per lead: how much it costs to acquire one lead"
},
{
"name": "cac",
"formula": "IF([deals_won] > 0, [spend] / [deals_won], 0)",
"type": "money",
"description": "CAC — cost of acquiring one customer"
},
{
"name": "roas",
"formula": "IF([spend] > 0, [revenue] / [spend] * 100, 0)",
"type": "percent",
"description": "ROAS: return on ad spend based on CRM revenue"
},
{
"name": "lead_to_deal_cr",
"formula": "IF([leads] > 0, ROUND([deals_created] / [leads] * 100, 1), 0)",
"type": "percent",
"description": "Lead-to-deal conversion rate"
}
]
}Key difference from standard ROAS: this metric uses actual revenue from the CRM (revenue) instead of purchase_value from Meta Ads. This is the only way to learn the true return on ad spend, cleaned of test orders, refunds, and cancellations.
Filters
{
"logic": "AND",
"conditions": [
{
"field": "spend",
"operator": "GREATER_THAN",
"value": 500
},
{
"field": "leads",
"operator": "GREATER_THAN",
"value": 5
}
]
}spend > 500— excludes campaigns with a minimal budget (not enough data)leads > 5— at least 5 leads for a statistically meaningful CPL and conversion rate
Write Mode
Mode: Replace
Pairing two sources requires full data consistency. If only Meta Ads is updated and Kommo isn't, ROAS will be calculated incorrectly. Replace guarantees that every run recalculates everything from scratch.
Schedule
{
"schedule": {
"enabled": true,
"interval": "daily",
"time": "08:00",
"timezone": "Europe/Moscow",
"retry_on_failure": true,
"max_retries": 3
}
}A daily run at 8:00. Keep in mind that deals can close with up to a 60-day delay, so ROAS for the last 2 weeks will look understated — that's normal. To see the full ROAS, look at data over last_90_days.
Expected Result
After a successful run:
- Status:
completed(both sources available) orpartial(one unavailable) - Row count: campaigns × ad sets × ads (typically 50-300 rows)
- End-to-end metrics: a complete picture from spend to revenue — you can see that campaign X has a ROAS of 250%, while campaign Y has 80% (running at a loss)
- Funnel conversion: out of 100 leads, 30 convert to a deal, and 10 of those are won — this is the actual CAC and ROAS
- Decisions: campaigns with ROAS < 100% get paused; campaigns with ROAS > 300% get scaled up
Screenshot
[Screenshot]
[Screenshot]