The workhorse analytics tool: pivot-table aggregation over the connected PublisherChamp account's sales, royalties, KU reads, and ad spend. Use it for ANY aggregation question (earnings, units sold, pages read, spending — by book, author, series, marketplace, platform, format, or time period). Available dimensions (nestable, outermost first): title, asin, author, series, marketplace, platform, book_format, book_tag, year, quarter, month, year_month, date, published_date, attribution_campaign, attribution_ad_group, attribution_campaign_ad_group, facebook_campaign, facebook_ad_group, facebook_ad, facebook_ad_id, facebook_ad_account, journal_event. Requests must use `dimensions` (plural), an array of strings, even for one dimension: dimensions=["marketplace"] returns a country breakdown. The singular `dimension` field in response rows identifies the row grouping; it is not the request parameter. Do not send `dimension` or `breakdown` as request parameters. Omitting `dimensions` defaults to title-level results. For a series-by-country matrix, use dimensions=["series", "marketplace"] with result_shape="flat"; follow pagination for the complete matrix. To restrict either example to a specific series, also pass selected_book_series=["Exact series name"]. Available measures: total_ratings, overall_rating, paperbacks, paperbacks_royalty, expanded_distribution, expanded_distribution_royalty, hardcovers, hardcovers_royalty, ebooks_paid, ebooks_paid_royalty, ebooks_free, audiobooks, audiobooks_royalty, reads, full_reads, reads_royalty, all_stars_bonus, other_royalty, gross_royalties, royalty_per_unit, amz_spending, fb_spending, bookbub_spending, external_expenses, spending, total_ad_sales, amazon_attribution_orders, amazon_attribution_borrows, amazon_attribution_total_units_sold, amazon_attribution_click_throughs, amazon_attribution_detail_page_view_clicks, amazon_attribution_add_to_cart_clicks, amazon_attribution_conversion_rate, amazon_attribution_cost_per_sale, amazon_attribution_book_royalties, amazon_attribution_read_royalties, amazon_attribution_total_royalties, amazon_attribution_roas, amazon_attribution_net_sales, ad_impressions, ad_clicks, amazon_ad_impressions, amazon_ad_clicks, facebook_ad_impressions, facebook_ad_clicks, bookbub_ad_impressions, bookbub_ad_clicks, ad_orders, ad_kenp_reads, amazon_ad_kenp_reads, amazon_attribution_kenp_reads, estimated_ad_kenp_royalties, cpc, amazon_cpc, facebook_cpc, bookbub_cpc, ctr, amazon_ctr, facebook_ctr, bookbub_ctr, cpm, amazon_cpm, facebook_cpm, bookbub_cpm, cost_per_ad_order, ad_conversion_rate, acos, tacos, inorganic_orders_percentage, net_royalties, total_paid_units, sell_through, read_through, listen_through, royalties_per_reader, rpr_contribution, roi, roas, number_in_series, bsr, journal_events. Spending sources: amz_spending is Amazon Ads only; fb_spending is Meta/Facebook Ads; bookbub_spending is BookBub Ads plus included paid Featured Deal fees; external_expenses is recorded External Expenses. spending is Total Spending, the sum of those four components. When explaining costs or warning about ad spend, request all five measures together and check the breakdown before attributing costs to a platform. Never describe spending or BookBub costs as Amazon Ads spend; only amz_spending represents that. Synchronized BookBub costs already reduce net royalties; do not advise re-entering the same costs as External Expenses, which would double-count them. NEVER guess or calculate the current date. For requests using relative language, leave start_date and end_date empty and set date_range to the matching server-resolved value (for example today, yesterday, this_week, or this_month). PublisherChamp resolves it in the account timezone and returns the authoritative current and resolved dates in date_context. Use concrete YYYY-MM-DD start_date/end_date only when the user supplied an explicit calendar range. The default range is the current month to date. Money is in the account's preferred currency unless `currency` is set — the response states the currency used. For Sell-Through, `include_free_units` defaults to true to match the Power Table's default; set it to false to exclude free ebooks. This setting does not affect Read-Through, and neither calculation adds Borrows to Sell-Through. Listen-Through uses only audiobook units, skips series positions without an audiobook edition, and is an aggregate progression estimate rather than verified completion. For Facebook-ad attribution analysis, request attribution_campaign_ad_group with the Facebook dimensions and the canonical Amazon Attribution measures. Use amazon_attribution_total_royalties for book plus attributed read royalties; use amazon_attribution_book_royalties and amazon_attribution_read_royalties for the breakdown. Read royalties use Amazon's reported value or the same KENP-rate estimate as Attribution data. These values belong to the tag and can repeat across linked ads: never sum Facebook-ad rows; use one row per attribution tag for totals. Pagination is capped at 200 rows per page; the response includes overall totals, per-row values, is_complete, and next_page. When the user asks for all data, a complete dataset, or equivalent, retrieve pages sequentially using the same arguments except page until is_complete=true. Never stop after a response with is_complete=false, and do not sum the repeated overall totals across pages. For a complete multi-dimensional breakdown such as 'sales by country and pen name', set result_shape='flat': every requested dimension combination is returned as a row in one paginated query, so do not issue separate calls for each dimension or group. Omitting result_shape automatically uses flat for an initial query. Do not pass parent_path with an explicitly flat shape. To drill into one nested group, set result_shape='nested' and pass parent_path=[{"dimension": ..., "key": ...}] using row keys from a previous response. Shared-access account scope is chosen per request with selected_accounts. If the response status is account_selection_required, do not guess or run analytics yet: tell the user the exact aliases/emails in account_scope.available_accounts and ask whether to use all accounts or specific ones. Retry with selected_accounts=['all'] or the user's exact choices. When account_scope contains one account, the tool selects it automatically. Call this tool with schema_only=true before account-specific queries to discover custom book-format measure keys and the exact available/custom platform names accepted by the platform dimension and selected_platforms filter. Validation errors come back as {"error": ...} with instructions — read them and correct the request. Use list_books or list_series first when you need to resolve a user's phrase into exact titles or series to filter on.
query_performance_table