Skip to content

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 — if expired, 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-ads connections 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

json
{
  "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:

MetricTypeDescription
spendcurrencyBudget spent in rubles
impressionsnumberNumber of ad impressions
clicksnumberNumber of ad clicks
ctrpercentClick-through rate (Clicks / Impressions × 100%)
cpccurrencyAverage cost per click
cpmcurrencyCost per 1,000 impressions
reachnumberUnique user reach
frequencynumberAverage impression frequency per user
resultsnumberNumber of target actions
cost_per_resultcurrencyCost per target action

Calculated metric — daily spend trend:

json
{
  "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:

json
{
  "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 spent
  • impressions > 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

json
{
  "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]

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