What these pages are
There are two of them, under Intelligence: Google Ads Reporting and Meta Ads Reporting. Each is a three-level accordion — campaign → ad group → keyword on Google, campaign → ad set → ad on Meta — with period-over-period deltas on every metric and a daily trend chart above the table.
Both read the platform live on every request. Nothing is stored, which means there is no sync to wait for, and equally no history beyond what Google and Meta themselves retain. Children load when you expand a row: a mid-size account carries somewhere between 5,000 and 50,000 keywords, and fetching them all up front would simply time out.
What you need connected: the matching account. Google Ads — per workspace, or through your agency's MCC. Meta Ads — the workspace's Meta connection. A client riding the agency's shared Google grant is connected even though its own card shows no separate OAuth.
The period, and how to read the deltas
Everything on the page is scoped to a date range, and optionally compared against another one. Four things are worth knowing before you read a single number.
The comparison is always equal-length
There is one comparison mode: Previous period — the window immediately before yours, of the same length — toggled off or on. It replaced a WoW / MoM / QoQ selector which, with "Last 30 days" selected, compared two 30-day windows overlapping by 23 days under a label saying week. Equal-length windows mean every count is like-for-like by construction, and the caption under the controls names both windows and their day counts so what is being compared to what is never a guess.
Percent for counts, points for proportions
Counts — cost, clicks, conversions — move in percentages. Proportions — impression share, CTR, conversion rate — move in percentage points. A conversion rate going from 55% to 60% is +5pp, not +9.1%. Mixing the two is how a modest improvement gets reported as a dramatic one.
Rows that stopped are still listed
Something that ran in the comparison window and not in this one is still shown — blanked, and badged no spend this period. "$4,000 last month, nothing this month" is one of the most useful things a comparison can tell you, and it is invisible in the current window by definition. The mirror case — something that didn't run in the comparison window, so has nothing to be measured against — is badged new rather than shown as an infinite rise.
Money is in the account's own currency
Amounts are formatted in the ad account's currency rather than assumed to be dollars.
The table
It opens filtered to rows that spent. Most accounts carry far more retired campaigns than live ones, so Spending is the default and the control under the date line (Show: Spending / All) says so. The rule is spend, not status: a paused campaign that spent real money inside the window still shows, so the visible rows always sum to what the account actually spent. Switch to All for everything.
Columns are chosen from a picker that sets the table width and remembers your choice per network. On top of that, a column is dropped automatically when no visible row can report it — so a column you picked while keywords were open doesn't linger as a wall of markers once they're collapsed.
A muted · is not a dash. The dot means the platform has no such metric at that level; the em dash means no data. Lost IS (budget) exists only on a campaign, because budgets are a campaign resource — reading "budget is not my constraint" off an ad-group row would send you to raise bids when you should raise budget.
Conversion rate is 0%, not a dash, when clicks converted none. That is a measured fact and usually the most actionable number on the row. The dash is reserved for "there were no clicks, so the question doesn't arise".
Where a keyword's clicks go — Final URL, URL suffix (UTM) and Tracking template are keyword-grain columns, hidden by default because a campaign and an ad group have no final URL. They are kept as three separate columns under Google's own names.
The trend chart
Above the table, a daily line for the metric you pick. Switching metric is free: every metric is fetched at once per range and scope, so only changing the range or the scope costs a request.
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. And a metric the current scope can't report says so rather than drawing an empty box.
What each network reports
| Page | Levels | Columns |
|---|---|---|
| Google Ads | Campaign → ad group → keyword | Cost, Impr., Clicks, CTR, CPC, Conv., Conv. rate, Cost / conv., Search IS, Lost IS (rank), Lost IS (budget), plus the keyword-only Final URL, URL suffix (UTM) and Tracking template. |
| Meta Ads | Campaign → ad set → ad | Spend, Impr., Reach, Freq., Clicks, CTR, CPC, CPM, Results, Result rate, Cost / result. |
Google specifics
Impression share is never derived. Google computes it over the whole date range, and a campaign's share is not the average of its ad groups'. Google also clamps the reported figure, so the table prints > 90% and < 10% rather than a false-precision number.
Meta specifics
There is no impression share. Meta publishes none 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 don't add up, on purpose. Meta deduplicates people across an ad set's ads, so an ad set's reach is usually less than its ads' summed. Each level is its own query rather than a roll-up, which would overstate reach and understate frequency without ever looking wrong.
Results is Meta's own aggregate lead action. A blank means Meta reported no action data at all, which is not the same as zero leads.
Averages are 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.
The Meta creative panel
Click an ad row on the Meta page and a panel opens showing the creative itself: the images or video, the primary text, headline and description, the destination URL and the UTM tags, all as selectable text, with a link out to the real post. It is rendered from the ad's own assets rather than by embedding Meta's preview iframe, whose URL carries a live access token that cannot be stripped.
Changing things from the reporting page
Reporting that can only report sends you to another tab to act, and the context goes with you. Both pages carry a small set of writes. They are deliberate clicks by a person — none of them is registered as a tool the AI ad agents can call, so no chat message can pause a campaign as a side effect.
- Pause or enable — campaign, ad group or keyword on Google; campaign, ad set or ad on Meta.
- Edit a budget — campaign budgets on Google; on Meta, the budget wherever it actually lives, which is the ad set except when the campaign owns it. Meta budgets are handled in the account's own currency, including currencies that have no minor unit.
- Retarget a keyword — Final URL, URL suffix and tracking template, under Google's own names.
- Swap a Meta creative — the replacement is checked to be in the same ad account first, rather than trusted from an id.
Every mutation reads the current value first and returns both sides, so the confirmation names the current state and the new one, and an audit row records both. A refused write is recorded too — a rejected pause is as interesting as an applied one.
One irreversible case, and it warns you. Google has no "move a keyword" API. Doing it removes the criterion and creates a replacement in the target ad group, which loses the keyword's history and resets its Quality Score. That cost is real and permanent, so the confirmation says so before you agree.
Frequently asked questions
What is the comparison comparing against?
The period immediately before the one you picked, of the same length. One mode, Previous period, toggled off or on. Because the two windows are always the same length, every count is like-for-like by construction.
Why are some campaigns missing from the table?
The page opens filtered to rows that spent money inside the date range. Flip the Spending / All control under the date line to see everything. The filter is on spend, never on status — a paused campaign that spent real money inside the window still shows.
Why does Meta have no impression share column?
Meta publishes none at any level, so the 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.
Can I change anything from the reporting page?
Yes — pause or enable a row, edit a campaign or ad set budget, edit a keyword's final URL, URL suffix and tracking template, and swap the creative on a Meta ad. Every write reads the current value first and records both before and after.
How far back can I look?
As far back as Google or Meta themselves retain. These pages store nothing of their own, so there is no PPC TNT-side history to fall back on — and equally nothing to wait for after you connect an account.