Daily Meta Ads Campaign Performance
Business Case
A marketer needs to monitor Meta Ads campaign performance daily: tracking key metrics (spend, impressions, clicks, CTR, CPC, conversions), comparing figures with the previous day, quickly spotting anomalies, and making decisions about budget adjustments. This requires an automatic update every morning without a manual run.
Connections
This report requires one connection: Meta Ads.
- Connector:
meta-ads - Mode of operation: reads ad data via the Meta Graph API
- Required permissions:
ads_read(read ad campaigns),read_insights(statistics),business_management(list of ad accounts) - Connection status: must be
active— ifexpired, refresh the token under Connections → Meta Ads → Reconnect - Data in the report: ad accounts, campaigns, ad sets, ads, and their statistics
When adding the connection, make sure the correct ad account is selected from the list of accounts available in Business Manager. If you need to report on several accounts at once, add multiple Meta Ads connections with different accounts.
Report Settings
- Name:
Daily Meta Ads Performance - Report type: standard single-source report
- Data source: all
meta-adsconnections in the workspace - Date range:
last_7_days— shows the past week with day-over-day comparison - Comparison period:
previous_period— automatically pulls in the previous 7 days for trend comparison - Grouping: by date (
date) and campaign (campaign_name) - Sorting: by spend (
spend) descending - Timezone:
Europe/Moscow(UTC+3)
Parameters
{
"date_range": "last_7_days",
"compare": "previous_period",
"group_by": ["date", "campaign_name"],
"sort": { "field": "spend", "direction": "desc" },
"timezone": "Europe/Moscow",
"limit": 500
}The compare: "previous_period" parameter adds columns with data from the previous period, plus columns with the absolute and percentage change for each metric. The limit: 500 parameter caps the maximum number of rows — with a large number of campaigns and days, the data won't get truncated.
If you need to look further back than 7 days, replace date_range with last_30_days or this_month. Keep in mind that on the Solo plan the maximum range depth is 365 days.
Metrics
For a baseline analysis of campaign performance, the following standard Meta Ads metrics are selected:
| Metric | Type | Description |
|---|---|---|
spend | currency | Budget spent in rubles |
impressions | number | Number of ad impressions |
clicks | number | Number of ad clicks |
ctr | percent | Click-through rate (Clicks / Impressions × 100%) |
cpc | currency | Average cost per click |
cpm | currency | Cost per 1,000 impressions |
reach | number | Unique user reach |
frequency | number | Average impression frequency per user |
results | number | Number of target actions |
cost_per_result | currency | Cost per target action |
Calculated metric — daily spend trend:
{
"name": "trend_spend",
"formula": "ROUND(([spend] - [spend_prev]), 2)",
"type": "money",
"description": "Change in spend compared to the previous day"
}Filters
To exclude test and irrelevant campaigns from the report, the following filters are applied:
{
"logic": "AND",
"conditions": [
{
"field": "campaign_name",
"operator": "NOT_CONTAIN",
"value": "тест"
},
{
"field": "spend",
"operator": "GREATER_THAN",
"value": 0
},
{
"field": "impressions",
"operator": "GREATER_THAN",
"value": 100
}
]
}campaign_name NOT_CONTAIN "тест"— excludes campaigns with test names (Russian for "test")spend > 0— only campaigns that actually had budget spentimpressions > 100— excludes campaigns with a statistically insignificant number of impressions
If needed, add a filter for specific campaigns using the IN: ["campaign1", "campaign2"] operator, or filter by campaign objective via the objective field.
Write Mode
The daily ad report uses Replace mode.
- Mode:
replace - Logic: on every run, data for the specified date range is fully overwritten
- Why Replace: ad data can be updated retroactively (conversion attribution, delayed data loading), so it's important to get an up-to-date picture of the entire period every time
- Alternative: if the data definitely doesn't change retroactively and speed matters, use
RewriteFromLast— only data from yesterday gets overwritten, and history is preserved
Schedule
{
"schedule": {
"enabled": true,
"interval": "daily",
"time": "07:00",
"timezone": "Europe/Moscow",
"retry_on_failure": true,
"max_retries": 3
}
}The report runs daily at 7:00 Moscow time — the data is ready by the start of the workday. On error (for example, temporary Meta API unavailability), the system makes up to 3 retries at 5, 15, and 30-minute intervals. If the data still can't be retrieved after three attempts, the report status moves to failed.
Expected Result
After the report runs successfully, you get a table with a daily breakdown by campaign:
- Status:
completed— all data retrieved successfully - Row count: depends on the number of active campaigns × 7 days (typically 50–200 rows)
- Key takeaways: you can see which campaigns are spending the most budget, which ones have declining CTR, and where CPC is rising
- Comparison: columns with the previous period let you instantly spot red/green trends
- Export: the data can be exported to CSV, Google Sheets, or via the API
Screenshot
[Screenshot]
[Screenshot]