Google Ads Lead Cost Control
Business Case
A head of marketing needs to monitor lead acquisition cost (CPL) and conversion cost (CPA) from Google Ads daily. The key goal is to keep CPL from drifting outside an acceptable range. When the threshold of 500 rubles per lead is exceeded, budgets need to be quickly reallocated between campaigns, or underperforming ones paused. The report should automatically flag problem campaigns.
Connections
This report requires a Google Ads connection.
- Connector:
google-ads - Required permissions:
google_ads_read(access to the Google Ads API) - Connection status:
active - Special requirement: the Google Ads API requires a developer token and Client ID — make sure they're entered correctly in the connection settings
- Settings: select the Google Ads accounts (MCC or individual) that should be included in the report
Lead and conversion data in Google Ads depends on the conversion tracking settings in the ad account itself. If conversion goals aren't configured in Google Ads, the conversions and conversion_value metrics will be empty. Set up conversion tracking in Google Ads before creating the report.
Report Settings
- Name:
Google Ads CPL Control - Report type: analytical report with threshold monitoring
- Data source: all
google-adsconnections - Date range:
last_30_days— a month gives a sufficient sample for a stable CPL - Grouping: by campaign (
campaign_name) and ad group (ad_group_name) - Sorting: by CPL ascending — cheapest leads first
- Timezone:
Europe/Moscow
Parameters
{
"date_range": "last_30_days",
"group_by": ["campaign_name", "ad_group_name"],
"sort": { "field": "cpl", "direction": "asc" },
"timezone": "Europe/Moscow",
"limit": 500
}For more granular control, you can add a breakdown by keyword (keyword_name) — this reveals which search queries lead to the most expensive leads.
Metrics
| Metric | Type | Description |
|---|---|---|
impressions | number | Google Ads ad impressions |
clicks | number | Clicks on ads |
ctr | percent | Click-through rate |
cpc | currency | Average cost per click |
cost | currency | Budget spent |
conversions | number | Number of conversions |
conversion_value | currency | Conversion value |
conversion_rate | percent | CR = Conversions / Clicks * 100% |
Calculated metrics:
{
"calculated_metrics": [
{
"name": "cpa",
"formula": "IF([conversions] > 0, [cost] / [conversions], 0)",
"type": "money",
"description": "Cost per conversion"
},
{
"name": "cpl_alert",
"formula": "IF([cpa] > 500, 1, 0)",
"type": "integer",
"description": "CPL threshold flag: 1 = the 500-ruble threshold was exceeded"
}
]
}The cpl_alert metric works as a flag: 1 means CPL exceeded the 500-ruble threshold, 0 means it's within the normal range. In the LightLead interface, such rows can be highlighted in red using conditional formatting.
Filters
{
"logic": "AND",
"conditions": [
{
"field": "cost",
"operator": "GREATER_THAN",
"value": 100
},
{
"field": "clicks",
"operator": "GREATER_THAN",
"value": 10
}
]
}cost > 100— excludes campaigns with a minimal budget, where CPL isn't statistically reliableclicks > 10— at least 10 clicks for any meaningful conversion metrics
To focus on problem campaigns, add an additional filter after the calculation — for example, filter rows with cpl_alert = 1 in the interface.
Write Mode
Mode: Replace
Google Ads conversion data can be updated retroactively (attribution window of up to 30 days), so Replace mode guarantees that every morning you get a complete, up-to-date picture of the last month, including any conversions credited after the fact.
Important: the Google Ads API has a data update delay — conversions from the last 24-48 hours may be incomplete. Keep this in mind when analyzing recent data.
Schedule
{
"schedule": {
"enabled": true,
"interval": "daily",
"time": "06:30",
"timezone": "Europe/Moscow",
"retry_on_failure": true,
"max_retries": 3
}
}A daily run at 6:30 AM gets fresh data before the workday starts. If more frequent monitoring is needed (for example, during an active ad campaign), switch to hourly — on the Solo plan, the minimum interval is 1 hour.
Expected Result
- Status:
completedorpartial(if some Google Ads accounts are unavailable) - Row count: number of campaigns × number of ad groups (typically 20-100 rows)
- Key insights: you can see which campaigns deliver cheap leads (CPL < 300 rubles) and which are expensive (CPL > 500 rubles); you can compare the performance of different ad groups within the same campaign
- Alerts: rows with
cpl_alert = 1require immediate attention — you may need to lower the bid, change audiences, or pause the ad group
Screenshot
[Screenshot]
[Screenshot]