Reports
Find the reports
Open an index, click Analytics, and scroll past the headline numbers and the timeline. Each report is a table over the same window and filters as the rest of the page; see Window, comparison and filters.
- Opportunities sits at the top of the page, above the headline numbers.
- The other reports are tabs under Searches over time: Queries, No clicks, Products, Click positions, Filters, Autocomplete, Rules and Refinements.
Click a column header to sort a table by it, and again to reverse the order. Click a query to open the one-query view. Download CSV above each table saves its rows; see CSV.
Queries are grouped after lowercasing, trimming and collapsing spaces, so "Bubble Wrap" and "bubble wrap" count as one. Empty queries count as searches but never appear in a list. Rates are shares of distinct searches. A table shows at most 50 rows.
Opportunities
The queries that cost you the most, ordered by the revenue at stake, then by searches. The table has the columns Query, Problem, Searches and Revenue at stake. Problem is one of three kinds:
| Problem | kind in the API | The query | Searches counts |
|---|---|---|---|
| No results | zero_results | found nothing | every search |
| No clicks | no_click | found results but got no click | every search |
| Clicks, no sale | no_sale | got clicks but no purchase | the share of searches that were clicked |
Revenue at stake (revenueAtStake) is what those searches would have brought in had they converted like the rest of the index: the counted searches, times the index's own conversion rate in the window, times its average order value. It is an estimate for ranking, not a forecast. Without purchase events the conversion rate is unknown and the estimate is 0, so the list falls back to ordering by searches.
Fix a query from the list
Each row has two buttons. Only organization owners and admins see them.
To add a synonym for the query:
- Click Add synonym in its row. A form opens under the table with the query in Terms.
- Type what shoppers mean under Means (target), for example
tapefor the queryscotch. - Click Add synonym. The page confirms it with Added synonym and the rule.
The cabinet creates a one-way synonym, so the query also searches the target from the next search on. No reindex is needed.
To pin or boost products for the query, click Pin or boost with a rule. The rule editor opens with the query already filled in. Pick the products to put first, or lift a brand or category, test it and save.
Both show up as markers in the per-query view, with the numbers before and after.
| Why a query finds nothing | What to do |
|---|---|
| Shoppers use another word for a product you have ("scotch" for tape, "carton" for box) | Add a synonym. |
| A misspelling the typo tolerance does not catch | Add a one-way synonym from the misspelling to the right word. |
| The word is in a field the profile does not search (a SKU, a color) | Add the field to the profile's query fields, with a modest weight. |
| You want to show specific products for that query | Add a rule that pins them. |
| You do not sell it | Nothing to fix. A custom autocomplete suggestion can steer shoppers to what you do sell. |
Queries
The 50 most searched queries, with per query: searches, zeroResultRate, ctr, addToCartRate, conversionRate, revenue, avgClickPosition and previousSearches (searches over the comparison window, null with compare=none). The cabinet shows the comparison as the Before column.
Queries without clicks
The No clicks tab. Queries that found results but never got a click: searches and avgResults, the mean number of results they found. A query with many results and no clicks usually ranks the wrong products first; a query with one or two results probably matches by accident.
Top products
The Products tab. The 50 most clicked products from search: itemId, clicks, addToCarts, purchases, revenue and topQueries, the queries that led to the product most often. Use it to check that the products you merchandise are the ones shoppers pick, and to find products that get clicks but no sales.
Click positions
Clicks per result position, from 1: clicks and share of all clicks. A long tail means shoppers scroll because the first results miss; a steep first position after a pin rule means the pin works.
Filters
Which facets shoppers use: one row per field and value with searches that applied it and the ctr of those searches. value is null for the row that sums a whole field, and range for range filters. Values are logged for keyword and boolean filters only.
Autocomplete
Which suggestions shoppers click, from suggestion_click events: suggestion and clicks. Suggest requests themselves are not logged, so this report is empty until the storefront sends the events.
Ranking rules
The Rules tab. Per rule that fired in the window: ruleId, name (null when the rule was deleted since), searches, ctr, ctrLift, conversionRate and revenue. ctrLift (CTR vs. index) is the rule's click-through rate relative to the index's overall rate, minus 1: 0.25 means a quarter more clicks than the average search. A campaign rule that lowers it is costing you clicks.
Refinements
Zero-result queries that the same session fixed by hand: from (the query that found nothing), to (what they searched within 60 seconds that found results) and count. In the cabinet the columns are Found nothing, Then searched and Times. Each row is a synonym candidate written by your shoppers: from => to. Click the query under Found nothing to open it and add the synonym from there.
One query
Click a query in any table to see it on its own. A panel opens from the side with:
- Add synonym and Pin or boost with a rule at the top, for owners and admins.
- Searches per day, a bar chart over the window.
- Fixes in this window: every synonym and rule that mentions the query and was added or changed in the window.
- 14 days before and after the latest fix, side by side.
- By day: searches, CTR and revenue per day.
With the API, call the query route:
GET/v1/projects/:projectId/indices/:indexId/analytics/queryProject member or any secret keyq is the query, plus the usual window and filter parameters. Over MCP the tool is get_query_analytics.
curl "https://api.search.zaproo.cloud/v1/projects/$PROJECT_ID/indices/$INDEX_ID/analytics/query?q=scotch&from=2026-10-01T00:00:00Z&to=2026-10-15T00:00:00Z" \
-H "Authorization: Bearer $ZS_KEY"
The answer holds:
daily: one row per day withsearches,ctrandrevenue.markers: every synonym and rule of the index that mentions the query and was created or updated in the window, withts,kind,id,nameandchange.beforeAfter: the 14 days before and after the latest marker, each withsearches,ctr,conversionRateandrevenue;nullwithout markers.
CSV
Download CSV on each table writes the rows the table shows, with the table's column labels as the header. Lists, such as the top queries of a product, are joined with "; ". The file is built in your browser from the JSON the cabinet loaded, so a filtered table downloads filtered rows, in the order you sorted them.
With the API
All nine reports come from one route. Use it to pull a report into your own tools.
GET/v1/projects/:projectId/indices/:indexId/analytics/:reportProject member or any secret keyreport is one of queries, no-click, products, positions, filters, autocomplete, rules, refinements or opportunities. The query parameters are the same as the overview's: from, to, compare, device, country, includeInternal. The answer is { report, from, to, rows }, at most 50 rows. Rates are null when there is nothing to divide by.
curl "https://api.search.zaproo.cloud/v1/projects/$PROJECT_ID/indices/$INDEX_ID/analytics/opportunities?from=2026-10-01T00:00:00Z&to=2026-10-15T00:00:00Z" \
-H "Authorization: Bearer $ZS_KEY"
Over MCP, get_analytics_report takes report and the same parameters.
Related
Search analytics
What the analytics page counts, which traffic it leaves out, how the headline numbers are defined, how comparisons and retention work, and how to get the weekly digest.
Event tracking
Send clicks, add-to-cart, purchases and suggestion clicks from your storefront, tie them to the search with searchId, and a copy-paste script that does it.