Reports by age, gender, placement and region
One breakdown at a time and coverage against the total
Cost and result by breakdown
Report, dashboard and AI agent
What it solves
- Each breakdown is read on its own and never added to another.
- The client knows how much of the budget the breakdown covers before drawing conclusions.
- Region, age and placement have the same names on Meta and Google.
Business questions it answers
Ask your agent these questions once the case is live.
What you need
- Meta and Google breakdown reports connected per client
- The portfolio's media table, which is the reference for the total
- Google's location names table to translate the codes
What you get
- A long-format table, one breakdown type at a time, with budget coverage
- Cost per result by age range, gender, placement and region
- A coverage badge on every breakdown chart
- An AI agent that reads one breakdown at a time
Where to activate
Cost per result by range, region and placement, with coverage in the footer.
Ranges and regions with spend and no results, to exclude or adjust bids.
Answers which audience converts best, always one breakdown type at a time.
The sources are ready-made platform reports. The care is never adding across breakdowns and always showing coverage. The detailed view has the business rules, the pitfalls and the acceptance test. Or send everything straight to your agent with the Nekt MCP.
Platforms split the same spend by age, by gender, by placement and by region. Whoever stacks the breakdowns in one table and sums everything multiplies the budget. On Google, Performance Max does not publish age or gender, so the breakdown covers only part of the spend, and the largest range is often the unidentified one.
How it is usually done, and the rule
Each row is a mistake that already happened in practice.
Store breakdowns in long format (ad, day, breakdown type, value) and always filter one type. Within a type the sum closes; across types, the same spend appears several times. In a real base, summing every row gave about four times the spend.
spend.The client's total spend comes from the daily campaign performance table. Breakdowns answer relative composition. Every reading shows coverage: breakdown spend / total spend for the same period and accounts.
On Google, Performance Max does not publish age or gender: breakdown coverage is 100% minus the PMax share, and in accounts heavy on PMax it fell below 30%. Do not work around it by prorating PMax spend across ranges: say the reading applies only to spend outside PMax.
AGE_RANGE_UNDETERMINED, UNDETERMINED and unknown are the part the platform could not attribute. On Google, the unidentified range can be larger than the largest real range. Show it separately and compute range shares over the identified total and over the full total, labeling each.
Reach is not additive across ads, days or ranges. Breakdown tables carry only additive measures: spend, impressions, clicks, link clicks, leads, purchases and purchase value. Rates are computed at read time from the sums.
On Google, the location type separates where the person was (presence) from the place they showed interest in. Both split the same spend and, added together, exceed the real spend. Treat them as different breakdown types.
On Google, criteria_id becomes a name through the geo targets table; the same city name exists with different IDs, and a region is not always a state. On Meta, the region comes with suffixes like (state): normalize before matching with Google. Store the code and the label.
Cost per result by range uses the same action_type of the ad set objective as the main table. A reach campaign breakdown has no cost per lead. A range with few results is not a conclusion: show volume next to the rate and a declared minimum.
On Meta, the real placement is publisher_platform plus platform_position (Instagram Reels, Facebook Feed, Stories). Device (impression_device) is another breakdown type. Do not mix the two on the same axis.
Breakdown types and coverage
Where each breakdown comes from and whether it closes with total spend.
Definitions
spend for the rows of one breakdown type and one value, in the periodspend / breakdown type spend, same client, accounts and periodspend / type spend excluding unidentifiedspend / total spend in the media table, same accounts and periodspend / objective result for that value, in the periodPitfalls that already happened
Summing every row of the segments table, without filtering the type, gave about four times the real spend.
Filter one breakdown type at a time.
Google's age report was used as the client's total and came in well below the account, because Performance Max is not in it.
Total from the media table, coverage alongside.
The unidentified age range had more spend than the 25-34 range, which the report presented as the main audience.
Unidentified on its own row.
Meta returned the state with a suffix and Google without it, and the regional comparison left half the states unpaired.
Normalize labels and use the code as key.
Adding Google's two location types gave more spend than the account actually had.
Treat presence and interest as separate breakdowns.
spend for closed months, within cents, and unknown age or gender stays below 1% of spend. The coverage gap is a Google Performance Max issue, not a Meta one.Acceptance test
The case is done when every item passes.
- Within each breakdown type, spend is equal to or lower than the media table total for the same accounts and period, and coverage shows on every reading.
- No query sums rows from different breakdown types.
- On Meta, each breakdown type for a closed month closes with total spend (difference below 0.1%).
- On Google, age breakdown coverage equals 100% minus Performance Max's share of the account's spend.
- Unidentified appears as its own row in age and gender.
Agent package
Paste into Claude, ChatGPT or any client with the Nekt MCP connected.
Audience breakdowns - Breakdowns are in long format. Always filter one breakdown type; never sum across types. - The client's total spend comes from the media table, not from breakdowns. Show breakdown coverage. - Google: Performance Max has no age or gender. The reading applies only to spend outside PMax. - Unidentified (UNDETERMINED, AGE_RANGE_UNDETERMINED, unknown) is its own row, not an audience. - Reach is not in the breakdowns. Rates are recomputed from sums. - Google location: presence and interest are different breakdowns. The location code is the key; the name is a label. - Result by breakdown uses the ad set objective's result. Show volume next to the rate and do not conclude with fewer than <n> results. Per-client exceptions: - <client>: regions of interest <list>; other regions grouped as Other. - <client>: account <id> with <x>% in Performance Max; demographic breakdown only for the rest. - <client>: target audience is the <range> range; highlight it.
Build the "Audience breakdowns" case in my Nekt workspace following the rules at https://academy.nekt.com/en/industrias/agencias/recortes-de-publico.md. 1) Find the source tables and confirm the columns the rules use. 2) Create a transformation at the stated grain applying every rule. 3) Run the acceptance test and show me the result of each item. 4) Create the case's context document in the workspace, leaving my clients' exceptions open for me to fill in.
Variations
Assign age, gender and platform to the form lead by matching entry order within the same ad and day.
Apply GA4 shares by device, city and age to the official order and revenue totals.
The hourly report shows when leads arrive, to schedule ads and customer service.