Skip to content

Meta Ads and Google Ads Conversion Report

Business Case

A marketer needs to compare the conversion performance of two key ad channels — Meta Ads and Google Ads — in a single report. This requires unifying metrics from different systems, calculating ROAS for each channel, understanding which source delivers more purchases at a lower cost, and making decisions about reallocating budget between platforms.

Connections

This report requires two connections:

  1. Meta Ads — the meta-ads connector

    • Permissions: ads_read, read_insights
    • Status: active
  2. Google Ads — the google-ads connector

    • Permissions: google_ads_read
    • Status: active

Both connections must be active. If one of them is in expired or error status, the report will run in partial status — data will come only from the working source. Check the statuses in the Connections section before running the report.

Report Settings

  • Name: Meta Ads vs Google Ads Conversions
  • Report type: multi-source report — data from two connectors is combined
  • Data sources: all meta-ads and google-ads connections
  • Unification: metrics from different sources are mapped to universal fields — impressions, clicks, cost, conversions, revenue
  • Date range: last_30_days
  • Comparison period: previous_period
  • Grouping: by source (source), campaign (campaign_name), and date (date)
  • Sorting: by ROAS descending
  • Timezone: Europe/Moscow

Parameters

json
{
  "date_range": "last_30_days",
  "compare": "previous_period",
  "group_by": ["source", "campaign_name", "date"],
  "sort": { "field": "roas", "direction": "desc" },
  "timezone": "Europe/Moscow",
  "limit": 1000
}

Adding date to group_by makes the report show ROAS trends by day for each campaign — this makes it possible to spot the day ROAS dropped sharply and correlate it with changes in the campaign.

Metrics

The multi-source report uses universal metrics that LightLead automatically maps from each connector's specific fields:

Universal MetricMeta Ads FieldGoogle Ads FieldType
impressionsimpressionsimpressionsnumber
clicksclicksclicksnumber
costspendcostcurrency
ctrctrctrpercent
conversionspurchasesconversionsnumber
revenuepurchase_valueconversion_valuecurrency

Calculated metrics:

json
{
  "calculated_metrics": [
    {
      "name": "roas",
      "formula": "IF([cost] > 0, [revenue] / [cost] * 100, 0)",
      "type": "percent",
      "description": "Return on ad spend"
    },
    {
      "name": "profit",
      "formula": "[revenue] - [cost]",
      "type": "money",
      "description": "Profit = Revenue minus Cost"
    },
    {
      "name": "romi",
      "formula": "IF([cost] > 0, ([revenue] - [cost]) / [cost] * 100, 0)",
      "type": "percent",
      "description": "ROMI — return on ad investment"
    }
  ]
}

ROAS > 100% means the ad spend is paying off. ROAS < 100% means the channel is running at a loss. Compare Meta Ads and Google Ads ROAS directly in a single table.

Filters

json
{
  "logic": "AND",
  "conditions": [
    {
      "field": "cost",
      "operator": "GREATER_THAN",
      "value": 500
    },
    {
      "field": "impressions",
      "operator": "GREATER_THAN",
      "value": 1000
    }
  ]
}
  • cost > 500 — only campaigns with a meaningful budget (excludes tests)
  • impressions > 1000 — sufficient reach for statistical significance

To focus on a specific channel, add a filter of source EQUAL "meta-ads" or source EQUAL "google-ads".

Write Mode

Mode: Replace

Multi-source reports use Replace by default, since data from different sources needs to stay consistent. A partial update of one source while the other's data stays unchanged would cause the data to fall out of sync.

If the data volume is very large (hundreds of thousands of rows), consider RewriteFromLast with the rewrite start date set to last_3_days — only the last 3 days get rewritten, and older history is preserved. But make sure data older than 3 days doesn't change.

Schedule

json
{
  "schedule": {
    "enabled": true,
    "interval": "daily",
    "time": "08:00",
    "timezone": "Europe/Moscow",
    "retry_on_failure": true,
    "max_retries": 3
  }
}

Daily at 8:00. By this time, data in both ad systems is usually already updated. If using hourly, keep in mind that Google Ads may not have finished updating conversion data yet.

Expected Result

  • Status: completed (if both sources are available) or partial (if one is unavailable)
  • Row count: total campaigns from both sources × 30 days (typically 100–500 rows)
  • Channel comparison: ROAS, ROMI, and profit for each channel visible in a single table — immediately clear which channel performs better
  • Trends: grouping by date shows how ROAS changes day by day
  • Export: export to Google Sheets to build a consolidated channel performance dashboard

Screenshot

[Screenshot]

[Screenshot]

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