The fastest way to build a useful custom GA4 report is to define the decision first, then specify the property, date range, row grain, metrics, filters, comparison, sort order, and output. AI can translate that brief into a valid GA4 Data API request, check the field combination, run a small sample, and export the complete result.
The important distinction: this workflow creates an on-demand report in your AI workspace. It does not save or publish a report in the GA4 Reports Library.
A custom report is a reporting contract
“Show me traffic performance” is not a report specification. It leaves the AI to guess which property, acquisition scope, dates, dimensions, metrics, and conversion definition you intended.
A reliable brief answers eight questions:
Question | Example |
|---|---|
What decision will this support? | Which landing pages need paid-traffic fixes? |
Which GA4 property? | Production website property, not the staging property |
What does one row represent? | One landing page plus session source/medium |
Which measures matter? | Sessions, engaged sessions, key events, total revenue |
Which dates should be included? | Last complete 28 days versus the previous 28 days |
What should be filtered? | Google CPC sessions only; exclude internal hostnames if available |
How should rows be ordered? | Sessions descending, then key events descending |
What output is needed? | Short summary plus a complete CSV |
The most important choice is row grain. If one row combines a landing page, campaign, device, country, and date, the result may be too fragmented to guide a decision. Start with the fewest dimensions that answer the question. Add detail only when it changes the action.
How to build a custom GA4 report with AI
1. Confirm the property and its configuration
Begin with property discovery instead of pasting an ID from memory. Confirm the property name, website, currency, reporting timezone, data streams, key events, Google Ads links, and registered custom definitions.
This prevents three common errors: querying a staging property, comparing dates in the wrong timezone, and asking for a custom field that belongs to another property.
2. Discover the current field names
GA4 report requests use API names, not whatever shorthand appears in a dashboard or internal spreadsheet. Search the property’s reporting metadata for the concept you need – such as landing page, session campaign, engaged sessions, or a registered custom dimension – and review the descriptions before choosing.
Do not invent custom field names. Property-specific metadata is the safest source because it includes registered custom dimensions and metrics available to that property.
3. Match the row grain to the measurement scope
Dimensions determine the rows; metrics provide the values. Their scopes must make sense together.
For acquisition work, keep these distinctions explicit:
First-user dimensions answer how users were originally acquired.
Session dimensions answer how sessions were acquired.
Event and item dimensions answer what happened within those scopes.
A report can be syntactically valid and still answer the wrong question. For example, a first-user campaign is not a substitute for the campaign that generated the current session.
4. Check compatibility before running the report
GA4 does not allow every dimension and metric in the same Core report. Run a compatibility check on the proposed combination before adding filters or exporting thousands of rows.
Compatibility is a schema gate, not a quality guarantee. It does not confirm that your dates are sensible, the filters express the intended audience, the tracking is correct, or the report supports the business conclusion. It also applies to Core reporting; realtime reporting has a different field set and different rules.
5. Run a small sample first
Start with a modest row limit and a clear sort order. Inspect:
column names and row grain;
whether filters included the intended traffic;
(not set) and blank values;
unexpectedly sparse or zero rows;
totals and date labels;
whether the comparison periods are complete and equal.
A five-minute sample review is cheaper than interpreting a polished but incorrectly scoped export.
6. Add filters and comparisons deliberately
Use dimension filters for row attributes such as country, device category, session source, page path, or campaign. Use metric filters for aggregated measures such as sessions greater than 100 or revenue above zero.
Keep boolean logic visible. “Google Ads traffic from India or Singapore, excluding brand campaigns” should be represented as explicit AND, OR, and NOT groups – not compressed into an ambiguous sentence.
For trend decisions, compare complete, equal-length periods. Label each date range so the output remains readable. Current-day data is provisional, and recent event attribution can still change, so avoid treating a partial period as final.
7. Check coverage before requesting the full export
Large GA4 results are paginated. A useful response should tell you the total matching row count, how many rows were collected, the starting offset, and whether the result was truncated.
Do not confuse the inline preview with the complete dataset. A workflow can show 200 rows in chat while exporting many more to CSV. If the collected-row cap is below the total matching rows, raise the cap or narrow the question before analysis.
8. Preserve the report recipe with the result
The CSV is only half the deliverable. Save the report brief alongside it:
property ID and property name;
date ranges and comparison labels;
dimensions and metrics;
filters and ordering;
collection cap and returned-row coverage;
generated timestamp;
known caveats or tracking gaps.
This makes the report reproducible and gives reviewers enough context to challenge the conclusion.

Three useful custom-report patterns
Landing-page quality for paid traffic
Decision: Which paid landing pages need a message, speed, or conversion-path review?
Rows: Landing page plus session source/medium.
Measures: Sessions, engaged sessions, engagement rate, key events, session key-event rate, and revenue where relevant.
Filters: Paid sources or campaign rules that match the team’s definition. Avoid assuming every CPC-tagged session is Google Ads if other networks use the same medium.
Review gate: Join CRM or lead-quality evidence before reallocating budget. GA4 behavior alone does not establish downstream lead value.
Campaign comparison across complete periods
Decision: Which campaigns changed materially, and what needs investigation?
Rows: Session campaign, optionally adding session source/medium.
Measures: Sessions, engaged sessions, key events, and revenue.
Comparison: Last complete 28 days versus the previous 28 days.
Review gate: Check naming changes and (not set) rows before ranking campaigns. A renamed campaign can appear as two separate rows.
Key-event diagnosis
Decision: Which traffic segments reach a key event, and where does the path appear to break?
Rows: Event name plus one diagnostic dimension such as device category, landing page, or session campaign.
Measures: Event count, users, sessions, and the relevant key-event metric.
Review gate: Confirm the event is registered and firing correctly. A reporting query cannot prove the browser event or consent flow works.
Filters without accidental logic
Filters are where otherwise good reports often go wrong.
Dimension filters select or exclude row attributes. Common operations include exact match, contains, regular expression, and in-list matching. Metric filters are evaluated against aggregated values, similar to a spreadsheet filter applied after the totals are calculated.
Write the logic in plain language before translating it:
Include session medium exactly cpc.
Include country in India or Singapore.
Exclude campaigns whose name contains brand.
Keep rows with at least 50 sessions.
Then ask the AI to restate the final boolean logic before it runs the report. This creates a small but valuable review gate.
Common failures and what they mean
Symptom | Likely cause | Next check |
|---|---|---|
Invalid field error | UI label or invented custom field used | Search property metadata and use the API name |
Incompatible request | Dimensions and metrics cannot coexist | Remove fields, check scope, rerun compatibility |
Zero rows | Wrong property, dates, filters, or uncollected event | Run an unfiltered sample and inspect configuration |
Many (not set) rows | The dimension was unavailable for those records | Review tagging, scope, campaign parameters, and consent |
(other) appears | High-cardinality rows were grouped | Reduce cardinality or query a more focused breakdown |
Today looks weak | Intraday processing is incomplete | Use complete periods and annotate provisional data |
CSV contains fewer rows than expected | Collection cap or request limit truncated output | Compare total row count with collected rows |
Demographic rows disappear | Privacy thresholds may apply | Treat missing data as withheld, not automatically zero |
A copyable prompt
Use this as a starting point, then replace the bracketed details:
Build an on-demand GA4 Core report for the business decision: [decision]. First list accessible properties and confirm the exact property with me from the provided context. Inspect its timezone, currency, streams, key events, Ads links, and custom definitions. Search current property metadata for the fields needed; do not guess API names.
Make one row represent [row grain]. Use [dimensions] and [metrics] for [date range], compared with [comparison range]. Apply these explicit rules: [dimension filters], then [metric filters]. Sort by [field and direction].
Check Core-report compatibility before running. If any field is incompatible or ambiguous, explain the issue and propose the smallest valid alternative. Run a small sample first and show the final field names, filter logic, period labels, row count, returned rows, offset, and truncation status. Do not interpret the report until I approve the sample.
After approval, collect up to [row cap] rows, return a concise decision-oriented summary, and create a CSV export. Keep tracking gaps, thresholding, partial periods, and causality limits separate from observed results. Do not modify GA4 or save a report in the GA4 Reports Library.Review checklist before acting
The property name, timezone, and currency are correct.
One row has a clear, useful meaning.
Dimensions and metrics use current API names.
The field combination passed a Core compatibility check.
Filters match the written AND/OR/NOT logic.
Comparison periods are equal and complete.
The total row count and collected-row count reconcile.
(not set), (other), thresholds, and tracking gaps are disclosed.
The conclusion describes observed association, not unproven causation.
A human reviews any budget, campaign, tracking, or site change.
How HireOtto supports the workflow
HireOtto can handle the mechanical reporting sequence inside Claude, ChatGPT, or another compatible AI client: discover accessible GA4 properties, inspect property configuration, search property-specific metadata, check a Core dimension-and-metric combination, run filtered and ordered reports with multiple date ranges, and return an inline sample or CSV export. It can also surface coverage details so the reviewer can distinguish a preview from a complete result.
The current GA4 connection is read-only. HireOtto does not save reports in the GA4 interface, change streams or key events, register custom definitions, edit attribution settings, publish tracking changes, or prove that a browser-side event fired. It also should not be presented as a first-class replacement for every GA4 reporting surface, such as Explorations, funnel reports, pivot reports, or audience exports. The marketer still owns the decision, KPI definition, tracking validation, interpretation, and approval of any downstream action.
See the GA4 tools reference and custom reporting guide for supported inputs and limits. Then use the GA4 quickstart and AI-client connection guide to get started.
Frequently asked questions
Can AI create a saved custom report in the GA4 Reports Library?
Not through this HireOtto workflow. It creates an on-demand, read-only Core report and can export the result. Saving or publishing a report in the GA4 interface remains a separate manual workflow with the appropriate GA4 permissions.
Should I use a Core or realtime report?
Use Core reporting for historical analysis, comparisons, most acquisition questions, and complete exports. Use realtime only for the recent activity supported by the realtime schema. Do not assume a Core field is available in realtime.
Why does a compatibility check pass but the report still look wrong?
Compatibility only checks whether the selected Core fields can be requested together. It does not validate your dates, filters, tracking implementation, business definition, or interpretation.
How many dimensions can a Core report include?
The GA4 Data API currently allows up to nine dimensions in a Core runReport request. That is a technical ceiling, not a recommended design. Most decision reports are clearer with far fewer.
Why does the CSV have more rows than the chat preview?
Inline display and CSV export are separate output controls. The preview stays compact for review, while the export can contain the larger collected dataset. Always compare matching rows with collected rows and check the truncation indicator.
Can the report prove why performance changed?
No. It can reveal patterns, comparisons, and segments worth investigating. Causality may require experiment design, CRM evidence, site diagnostics, or other data outside GA4.
About Me
I’m Suyash – badminton junkie, ex‑GroupM ad‑ops grunt, first marketer at a B2B SaaS startup, and creator of Hiretto: MCP servers for performance marketers.
My mission: less clicking, more thinking.
Let’s build leverage together.

