Home · Intelligence Suite · Ads Reporting

The dashboard says you made money.
This says which campaign did.

Two pages, one for each network. Google Ads goes campaign → ad group → keyword; Meta Ads goes campaign → ad set → ad. Every metric is shown beside its change against the period immediately before, of the same length — so every comparison is like-for-like by construction. Both read your live account on every request. There is no sync to wait for.

Open Ads Reporting → Read the guide
Last 7 daysLast 30 daysCustomCompare: previous periodShow: spending
1 Jul – 30 Jul (30 days) compared with 1 Jun – 30 Jun (30 days)
Campaign / ad group / keywordCostConv.Cost / conv.
Search — Emergency Plumbing$8,410+12.4%63+31.3%$133−14.4%
Burst Pipe — Phoenix$4,980+9.1%41+36.7%$121−20.2%
[burst pipe repair]$2,140+6.0%24+41.2%$89−24.9%
[emergency plumber near me]$1,905+18.7%11−8.3%$173+29.4%
Water Heater — Mesanew$1,2609$140
Display — Remarketingno spend this period−100%−100%

How it reads

Built so the numbers can't quietly lie

Most reporting tools are wrong in ways that look right. These are the decisions that stop that happening.

📐

Equal-Length Windows

One comparison mode: the period immediately before yours, of the same length. It replaced WoW / MoM / QoQ, which with "Last 30 days" selected compared two 30-day windows overlapping by 23 days under a label saying week.

%

Percent vs Points

Counts move in percentages; proportions — impression share, CTR, conversion rate — move in percentage points. 55% to 60% is +5pp, not +9.1%.

🛑

Rows That Stopped Still Show

Something that ran in the comparison window and not in this one is listed, blanked and badged. "$4,000 last month, nothing this month" is the most useful thing a comparison can say, and it is invisible in the current window by definition.

💸

Filtered by Spend, Not Status

It opens showing rows that spent money inside the range, because most accounts carry more retired campaigns than live ones. A paused campaign that spent real money still shows — so the visible rows always sum to what the account actually spent.

🧮

Averages Recomputed, Never Averaged

CPC, CTR and cost per conversion are recalculated from the totals in view rather than averaged from the platform's per-row averages — which is a different number the moment rows differ in click volume.

📈

Gaps Are Gaps

On the daily trend chart a day with no delivery is a gap, never a zero and never omitted. A zero asserts the campaign ran and achieved nothing; a bridged line draws spend that never happened.

What each platform can actually report

The two pages are deliberately not identical, because the two platforms do not measure the same things.

Google Ads

campaign → ad group → keyword
Columns

Cost, Impressions, Clicks, CTR, CPC, Conversions, Conversion rate, Cost / conv., Search impression share, Lost IS (rank), Lost IS (budget) — plus keyword-grain Final URL, URL suffix (UTM) and Tracking template.

Worth knowing

Impression share is never derived: Google computes it over the whole range, and a campaign's share is not the average of its ad groups'. Google clamps the figure, so the table prints > 90% and < 10% rather than false precision. Lost IS (budget) exists only on a campaign, because budgets are a campaign resource.

Meta Ads

campaign → ad set → ad
Columns

Spend, Impressions, Reach, Frequency, Clicks, CTR, CPC, CPM, Results, Result rate, Cost / result.

Worth knowing

Meta publishes no impression share at any level, so those columns are absent rather than permanently empty — CPM is the closest read on auction pressure, and rising frequency against flat reach is the saturation signal. Reach and frequency deliberately don't add up: Meta deduplicates people across an ad set's ads, so each level is queried on its own rather than rolled up.

Change it without leaving the page

Reporting that can only report sends you to another tab to act, and the context goes with you. These writes are deliberate clicks by a person — never something an AI agent can trigger.

Pause or enable
At campaign, ad group or keyword level on Google; campaign, ad set or ad on Meta. The confirmation names the current state and the new one.
Edit a budget
Campaign budgets on Google, and on Meta the budget wherever it actually lives — the ad set, or the campaign when the campaign owns it. Meta budgets are handled in the account's own currency, including currencies with no minor unit.
Retarget a keyword
Final URL, URL suffix and tracking template, edited under Google's own names — so you can point a keyword at a Bulk Pages landing page in one click.
Swap a Meta creative
Replace the creative on a live ad. The creative is checked to be in the same ad account first, rather than trusted from an id.
Before and after, recorded
Every write reads the current value first and stores both sides on an audit row — so "who turned this off" is answerable months later. A refused write is recorded too.
Warned when it's irreversible
Google has no "move a keyword" API — doing it removes and recreates the criterion, losing its history and Quality Score. The confirmation says so before you agree, not after.

Find the campaign that actually paid

Three levels, both networks, every metric beside its change — and the pause button in the same place as the number that justifies it.

Open Ads Reporting → All Intelligence tools