Product Metrics MCP tools
Every tool the Product Metrics MCP server gives an AI assistant, what each one is for, and the arguments it takes.
The Product Metrics MCP server gives an AI assistant such as Claude or ChatGPT 24 tools to read your store, your products and your Google Ads account. Every tool reads, except propose_change, which files a proposal that a person approves in Priorities. No tool changes Google Ads or your store. To connect an assistant, see Connect Claude or ChatGPT.
How the tools work
- Pick a store first. One connection covers every store (property) you can open in Product Metrics. The assistant calls
list_properties, then passesproperty_idto every other tool. If you have one store, it can leaveproperty_idout. - Your role applies. Any member of a workspace can use the read tools. Only editors and admins can file proposals.
- Arguments are forgiving. A limit above the maximum, a plural value or a camelCase name is corrected instead of refused, and the answer starts with what was corrected.
- Hourly limits. Up to 5,000 tool calls per person and 20,000 per store each hour. Expensive tools (marked below) have a lower limit: 30 calls per person and 120 per store each hour.
- Answers are text. Each tool returns a readable summary with figures, dates and currency, cut off at about 40,000 characters. Narrow the request to see more.
Stores
Pick the store (property) to work on and read its own sales numbers.
list_properties
Properties · Read-only · reads Product Metrics data · any workspace member
The Product Metrics properties (one store’s Google Shopping account each) the signed-in person can open, with the company, the linked Google Ads customer id and the currency. Call this first when no property is chosen yet, then pass its propertyId as property_id to every other tool. If there is exactly one, use it without asking; if there are several and the question names none, ask which store or answer per store.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
name_contains | string | No | Up to 100 characters. |
get_store_overview
Store overview · Read-only · reads Product Metrics data · any workspace member
The store’s own numbers next to the ads: web analytics from GA4 for the period (sessions on product pages, sessions with a purchase, revenue, product views, add to carts, checkouts, conversion rate, revenue per session) with the comparison period, an optional daily, weekly or monthly trend and the top products by revenue, plus shop orders from the connected shop when order tracking is set up, over the same range with the comparison and the same trend (orders, revenue ex tax, average order value, new and returning customers, refunds, profit). Use it for how the store is doing overall, whether a change in ads shows up in store revenue, and the ad share of revenue. GA4 figures count sessions that landed on a product page, not every session; shop order figures are the shop’s own.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
date_range | enum or object { start, end } | No | last_30_days | One of yesterday, last_7_days, last_14_days, last_30_days, last_90_days, last_365_days, last_4_weeks, last_8_weeks, last_13_weeks, this_month, last_month, this_year. Or { "start": "YYYY-MM-DD", "end": "YYYY-MM-DD" }. |
compare | enum | No | previous_period | One of previous_period, previous_year, none. |
breakdown | enum | No | none | day, week or month adds a trend series. One of none, day, week, month. |
top_products | integer | No | 10 | From 0 to 50. |
Google Ads analysis
Read the Google Ads account linked to the store, live. These tools only read: nothing here changes the account.
explain_google_ads_change
Explain a Google Ads change · Read-only · reads your Google Ads account live · any workspace member · counts towards the hourly limit for expensive tools
Explains why a Google Ads metric changed, in one call: use it first for ‘what happened to …’, ‘why did … drop or rise’, ‘something is off since …’. For the scope (the account, campaign ids, types or a name), it reads the daily series and finds the day the metric stepped to a new level (or says the change is gradual), compares the days after with as many days before, splits the change into its funnel (impressions, CTR, clicks, CPC, conversion rate, value per conversion), ranks which campaigns, asset groups, ad groups, products, devices, networks and conversion actions carry it (concentrated in one, or spread over all), counts how many products got impressions and spend before and after (a widened product mix), flags an asset group or product that started or stopped delivering, estimates how much value is still to come from conversion delay, lists the account changes made in the days before (budget, status, targets, by whom, and listing group edits Google Ads records without values), and sets the store’s own revenue and orders next to it, so a tracking problem can be told apart from a real drop. Follow up with get_google_ads_report only to drill further.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
metric | enum | No | conversion_value | One of conversion_value, roas, conversions, cpa, cost, clicks. |
date_range | enum or object { start, end } | No | last_30_days | Where to look for the change (at most 90 days); the same number of days before it is read as the baseline. One of yesterday, last_7_days, last_14_days, last_30_days, last_90_days, last_365_days, last_4_weeks, last_8_weeks, last_13_weeks, this_month, last_month, this_year. Or { "start": "YYYY-MM-DD", "end": "YYYY-MM-DD" }. |
change_date | date | No | The first day of the change, when the person names it; otherwise it is found in the daily series. | |
campaign_ids | array of string | No | 1 to 50 items. | |
campaign_types | array of enum | No | Each one of SEARCH, SHOPPING, PERFORMANCE_MAX, DISPLAY, VIDEO, DEMAND_GEN. 1 to 6 items. | |
campaign_name_contains | string | No | Up to 100 characters. |
get_google_ads_report
Google Ads report · Read-only · reads your Google Ads account live · any workspace member
Live Google Ads performance for the property’s linked account, at any level: account totals, campaigns (with type, status, budget, bidding, target ROAS and search impression share lost to budget and rank), ad groups, Performance Max asset groups, search terms, keywords (with quality score), products, conversion actions, device, network, day of week or hour. Each row has impressions, clicks, cost, conversions, conversion value, CTR, CPC, conversion rate, CPA and ROAS, plus the comparison period and its change. Filter by campaign ids, campaign name or type, row name, spend or clicks, or rows with spend and no conversions (wasted spend); sort by any metric or by its change; break down by day, week or month for trends. Use it for Google Ads questions about levels, splits and lists: spend, ROAS, wasted search terms, budget-limited campaigns, device or hour splits, trends. Money is in the account currency. Totals cover every matching row, not just the rows shown. To find out why something dropped or rose, call explain_google_ads_change instead: it does the drill-down in one call. When CPA looks fine but ROAS does not, read level conversion_action for that campaign: each action shows whether it is primary, and a primary action without value (sign-up, call) inflates conversions. For profit, margin, POAS or stock, use get_poas_report instead.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
level | enum | No | campaign | Row grain: account (one totals row), campaign, ad_group, asset_group (Performance Max), search_term (Search and Shopping queries), keyword, product (Shopping and Performance Max item ids), product_label (one row per value of a custom label, e.g. the Product Metrics segments, with how many products got impressions and spend), conversion_action (conversions per action; no cost or clicks), conversion_lag (conversions by days from the ad interaction to the conversion: how much value arrives late), device, network, day_of_week, hour_of_day. One of account, campaign, ad_group, asset_group, search_term, keyword, product, conversion_action, device, network, day_of_week, hour_of_day, conversion_lag, product_label. |
date_range | enum or object { start, end } | No | last_30_days | A preset (day presets end yesterday; week presets are complete Monday–Sunday weeks ending last Sunday) or { start, end } as YYYY-MM-DD. One of yesterday, last_7_days, last_14_days, last_30_days, last_90_days, last_365_days, last_4_weeks, last_8_weeks, last_13_weeks, this_month, last_month, this_year. Or { "start": "YYYY-MM-DD", "end": "YYYY-MM-DD" }. |
compare | enum | No | previous_period | Adds the same metrics for the period before (or a year earlier) with changes. One of previous_period, previous_year, none. |
breakdown | enum | No | none | Split rows by day, week or month for a trend; level account + breakdown day is the account’s daily trend. One of none, day, week, month. |
campaign_ids | array of string | No | 1 to 50 items. | |
campaign_name_contains | string | No | Up to 100 characters. | |
campaign_types | array of enum | No | Each one of SEARCH, SHOPPING, PERFORMANCE_MAX, DISPLAY, VIDEO, DEMAND_GEN. 1 to 6 items. | |
name_contains | string | No | Case-insensitive filter on the row’s name: search term, keyword, product title or id, ad group. Up to 100 characters. | |
include_paused | boolean | No | true | false keeps only rows whose campaign is enabled now. |
min_clicks | integer | No | From 0 to 9007199254740991. | |
min_cost | number | No | At least 0. | |
only_without_conversions | boolean | No | false | Keep rows with spend and zero conversions: wasted spend. |
sort_by | enum | No | cost | One of cost, clicks, impressions, conversions, conversion_value, roas, cpa, ctr, conversion_rate, avg_cpc, cost_change, conversion_value_change, roas_change. |
order | enum | No | desc | One of desc, asc. |
limit | integer | No | 25 | From 1 to 500. |
label | enum | No | product_label level: the custom label to group by; defaults to the one Product Metrics writes its segments to. One of custom_label_0, custom_label_1, custom_label_2, custom_label_3, custom_label_4. | |
recent_days | integer | No | Also reads the last N days of the range per row (spend, its share of the row’s spend, ROAS, and ROAS adjusted for conversion delay) and flags rows that took a bigger share of spend recently while their ROAS fell: products, asset groups or campaigns that look good over the range but drain budget now. From 3 to 14. |
get_poas_report
Profit on ad spend (POAS) · Read-only · reads your Google Ads account live · any workspace member
Profit on ad spend: live Google Ads per product and campaign joined, in Product Metrics, with the store’s own margin (cost of goods), stock and the engine’s push/hold/reduce/pause decision. Gives per product, per campaign or for the account: cost, conversion value, ROAS, gross profit (conversion value × margin), POAS, profit after ads, the margin coverage, and per product the stock (on hand, weeks of cover, stockout date, slow mover) and decision; campaign rows add the spend on out-of-stock and low-cover products. Filter by stock (out_of_stock, low_cover, slow_movers) or to unprofitable rows (POAS below break-even); sort by profit after ads, POAS or cover. Use it for every question about profit, margin, POAS, ‘which products lose money on ads’, ‘are we advertising products we cannot deliver’, and budget moves that should follow profit or stock rather than ROAS. Search and Demand Gen campaigns sell no single product: their POAS uses the account’s average margin and is marked as estimated.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
level | enum | No | product | product: one row per advertised product with its margin, stock and decision; campaign: POAS per campaign from its products’ margins; account: totals. One of product, campaign, account. |
date_range | enum or object { start, end } | No | last_30_days | One of yesterday, last_7_days, last_14_days, last_30_days, last_90_days, last_365_days, last_4_weeks, last_8_weeks, last_13_weeks, this_month, last_month, this_year. Or { "start": "YYYY-MM-DD", "end": "YYYY-MM-DD" }. |
compare | enum | No | previous_period | One of previous_period, none. |
campaign_ids | array of string | No | 1 to 50 items. | |
campaign_types | array of enum | No | Each one of SEARCH, SHOPPING, PERFORMANCE_MAX, DISPLAY, VIDEO, DEMAND_GEN. 1 to 6 items. | |
item_ids | array of string | No | 1 to 50 items. | |
stock | enum | No | any | Keep products by stock: at_risk (out of stock or running out before restock: use it for ‘are we advertising what we cannot deliver’), out_of_stock, low_cover (fewer weeks of cover than the lead time, or a stockout before the next delivery), slow_movers (too much stock), in_stock. One of any, at_risk, in_stock, out_of_stock, low_cover, slow_movers. |
only_unprofitable | boolean | No | false | Keep rows whose POAS is below break-even: ad spend the margin does not pay back. |
sort_by | enum | No | cost | One of cost, profit_after_ads, gross_profit, poas, roas, conversion_value, cover_weeks. |
order | enum | No | desc | One of desc, asc. |
limit | integer | No | 25 | From 1 to 200. |
get_google_ads_changes
Google Ads change history · Read-only · reads your Google Ads account live · any workspace member
The Google Ads account’s change history (the last 30 days, which is all Google Ads keeps): who changed what and when, with each field’s value before and after: budgets, campaign and ad group status, bidding and target ROAS or CPA, and the rest; plus the edits Google Ads records only as ‘changed’ without values (listing group filters, asset groups, criteria), which the change history leaves out. Filter by campaign ids or name. Use it for ‘did anyone change something’, ‘who paused …’, and to check what was changed before a drop.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
date_range | enum or object { start, end } | No | last_30_days | Google Ads keeps change history for the last 30 days (the default reads all of it): last_7_days, last_14_days, last_30_days or { start, end } within them. One of yesterday, last_7_days, last_14_days, last_30_days, last_90_days, last_365_days, last_4_weeks, last_8_weeks, last_13_weeks, this_month, last_month, this_year. Or { "start": "YYYY-MM-DD", "end": "YYYY-MM-DD" }. |
campaign_ids | array of string | No | 1 to 50 items. | |
campaign_name_contains | string | No | Up to 100 characters. | |
limit | integer | No | 50 | From 1 to 200. |
get_product_targeting
Product targeting (listing groups) · Read-only · reads your Google Ads account live · any workspace member
Which products each Performance Max asset group and Shopping ad group may serve: its listing group filters as rules (custom label, item id, brand, product type; included or excluded; ‘everything else’ nodes), the custom label Product Metrics writes its segments to, and what conflicts: a product excluded in one asset group but still servable through another, a catch-all that serves every other label, filters on a different custom label than the segments. Use it for ‘is my campaign filtered on my segments’, ‘where are my Stars’, ‘why does this excluded product still spend’.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
campaign_ids | array of string | No | 1 to 50 items. | |
campaign_name_contains | string | No | Up to 100 characters. | |
include_paused | boolean | No | false |
compare_product_segments
Segments vs campaign setup and other labels · Read-only · reads your Google Ads account live · any workspace member
Product Metrics segments (Stars, Cash Cows, Question Marks, Ghosts, Drainers, Dogs) against how each campaign is actually set up and against the other labels in the feed, per campaign: which custom label each campaign’s listing groups filter on and what fills it (our segments, ProfitMetrics, Producthero, Channable or Flowboost labels, or the merchant’s own segmentation such as categories or margin bands); spend, conversion value and ROAS per segment and per value of the other labels; the segment × label cells with the most spend; and the spend where the two systems disagree (a product one calls good and the other bad), with examples. Use it for ‘is my campaign built on your segments or on ProfitMetrics’, ‘how do your segments compare with Producthero/Channable/Flowboost/my own labels’, ‘which products do the systems disagree on’.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
date_range | enum or object { start, end } | No | last_30_days | One of yesterday, last_7_days, last_14_days, last_30_days, last_90_days, last_365_days, last_4_weeks, last_8_weeks, last_13_weeks, this_month, last_month, this_year. Or { "start": "YYYY-MM-DD", "end": "YYYY-MM-DD" }. |
campaign_ids | array of string | No | 1 to 50 items. | |
campaign_types | array of enum | No | Each one of SEARCH, SHOPPING, PERFORMANCE_MAX, DISPLAY, VIDEO, DEMAND_GEN. 1 to 6 items. | |
campaign_name_contains | string | No | Up to 100 characters. | |
compare_with | enum | No | The custom label to set against the segments; by default every other filled label (another tool’s first, then the merchant’s own). One of custom_label_0, custom_label_1, custom_label_2, custom_label_3, custom_label_4. |
run_google_ads_query
Google Ads query (GAQL) · Read-only · reads your Google Ads account live · any workspace member · counts towards the hourly limit for expensive tools
Runs one read-only GAQL (Google Ads Query Language) SELECT against the property’s linked Google Ads account, for what the other Google Ads tools cannot answer: ad copy and asset performance, landing pages, geography, bid strategies, conversion action settings, listing groups, or an unusual combination of fields. Costs more than the report tool: prefer the report. Resources: customer, campaign, ad_group, asset_group, ad_group_ad, keyword_view, search_term_view, shopping_performance_view (segments.product_item_id, segments.product_title, segments.product_brand, segments.product_type_l1), campaign_budget, bidding_strategy, conversion_action (settings: conversion_action.name, status, category, primary_for_goal, counting_type; no metrics: per-action conversions come FROM campaign with segments.conversion_action_name), change_event (prefer get_google_ads_changes), geographic_view, user_location_view, landing_page_view, asset_group_listing_group_filter. Dates: segments.date DURING LAST_7_DAYS | LAST_30_DAYS | THIS_MONTH | LAST_MONTH, or segments.date BETWEEN ‘YYYY-MM-DD’ AND ‘YYYY-MM-DD’. Money fields ending in _micros are millionths of the account currency (divide by 1,000,000); the result adds the divided value as <field> without _micros. No OR in WHERE; use IN. A segment in WHERE must also be in SELECT (segments.date excepted). metrics.search_impression_share and friends cannot be combined with segments.device or hour. Rows come back flattened (campaign.name, metrics.clicks) and capped at max_rows.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
query | string | Yes | One GAQL SELECT, e.g. SELECT campaign.name, metrics.cost_micros FROM campaign WHERE segments.date DURING LAST_30_DAYS ORDER BY metrics.cost_micros DESC LIMIT 20. Up to 6000 characters. | |
max_rows | integer | No | 200 | From 1 to 1000. |
Products and segments
Find products worth a look, read everything Product Metrics knows about one product, and see how segments and categories are doing.
list_products_to_investigate
Products to investigate · Read-only · reads Product Metrics data · any workspace member
Ranked list of products that need attention now, across ads performance, web traffic, competitor prices, margin and stock. Ranked by severity and money at stake per week. Start here when the user asks what to look at, what changed or where money is lost. Each row has the decision (push/hold/reduce/pause) and its strongest signal; call get_product_context for the full picture. Filter by segment or category to drill into a group from summarize_groups; then the reply can also list the group’s highest-spend products the assistant does not store (beyondStore: ad totals only, no decision).
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
signal_kinds | array of enum | No | Only products with at least one of these signals. Each one of ads_performance_drop, traffic_drop, priced_above_market, competitor_price_drop, stock_risk, slow_mover, spend_while_out_of_stock, below_break_even, scale_opportunity. | |
action | enum | No | Only products with this decision. One of push, hold, reduce, pause. | |
sort | enum | No | attention (default): products that need attention, most urgent first. spend / conversion_value: every stored product by ad spend or by conversion value (sales from ads) in the window, also those with nothing to investigate; use them for the top spenders and the best sellers. One of attention, spend, conversion_value. | |
segment | enum | No | Only products in this Product Segmentation segment (see summarize_groups by=‘segment’). One of stars, question_marks, cash_cows, dogs, drainers, ghosts. | |
category | string | No | Only products with this value of the category column (see summarize_groups by=‘category’); ‘Unknown’ for products without one. Up to 200 characters. | |
limit | integer | No | 10 | From 1 to 50. |
cursor | string | No | nextCursor from a previous page. |
search_products
Search products · Read-only · reads Product Metrics data · any workspace member
Find products by title, brand, item_id, offer id or product type. Use when the user names a product; returns item_ids for the other tools.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
query | string | Yes | Words from the title or brand, or an id. Up to 200 characters. | |
limit | integer | No | 10 | From 1 to 25. |
get_product_context
Product Context · Read-only · reads Product Metrics data · any workspace member
Full Product Context for up to 10 products: the five layers (advertising, journeys, market prices, margin, inventory) with their freshness, the decision with each layer’s vote and reason, signals and suggested Merchant Center labels. detail=‘detailed’ adds the figures behind the layers: advertising window totals and series summaries, journey next buys, competitor rows, and stock planning (weekly sales, cover, stockout and reorder dates, suggested quantity, lead time). Use it when the answer needs those figures; concise is enough to explain a decision.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
item_ids | array of string | Yes | 1 to 10 items. | |
detail | enum | No | concise | One of concise, detailed. |
summarize_groups
Segments and categories · Read-only · reads Product Metrics data · any workspace member
Totals per Product Segmentation segment (Stars, Cash Cows, Question Marks, Dogs, Drainers, Ghosts) or per value of the property’s category column: products, spend, conversion value, ROAS, share of spend and of conversion value, and the mix of decisions (push/hold/reduce/pause). With coverage ‘catalogue’ the totals cover every product in the catalogue; the decision mix only counts the products the assistant stores (storedProducts). Use for questions about a segment or category, or where spend goes without conversions; then drill in with list_products_to_investigate segment/category. Totals are for Product Segmentation’s date range; there is no previous period. The segments: Stars sell at volume at or above target; Cash Cows return strongly on smaller volume; Question Marks are mid performers, or above target on too little traffic; Dogs had enough traffic and stayed below par; Drainers take clicks and spend with little or no conversion value (and low-volume products that never got enough traffic to be judged); Ghosts get impressions but no clicks.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
by | enum | Yes | segment, or category (the property’s category column). One of segment, category. | |
limit | integer | No | 20 | Most groups, by spend. From 1 to 50. |
get_changes
What changed · Read-only · reads Product Metrics data · any workspace member
What changed in the property, precomputed at the last refresh: the last delivered week against the week before (spend, conversion value, ROAS) for all products and per segment or category; the products that gained or lost the most conversion value and those whose spend rose most; signals that appeared or cleared and decisions that changed since about a week ago; and how much of the ad spend the daily history covers. Start here for ‘what changed’, ‘how was this week’, a weekly briefing or ‘anything unusual’, then drill into products with get_product_context or get_product_timeseries. Week figures cover only the products with daily history (see coverage): name the two weeks’ dates and how much of the spend the history covers.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
group_by | enum | No | segment | Break the week-over-week totals down by segment or by category. One of segment, category. |
limit | integer | No | 5 | Products per list (risers, fallers, spend up, new and cleared signals). From 1 to 20. |
get_insights
Store insights · Read-only · reads Product Metrics data · any workspace member
Store insights, precomputed per feed after the nightly feed run: Stars that run out of stock while advertised (dashboard_run_out), return rates per category (category_returns), break-even ROAS of Shopping and Performance Max campaigns (campaign_break_even, information only), low-stock products that the next save would put in Stars (save_settings_stock) and products where competitors undercut us while we spend (competitor_comparison). Each card has a state: ready (shown in the app), below_threshold (computed, too little at stake to show) or not_applicable (a source is missing: say which and how to connect it). Population: every catalogue item matched to a Google Ads item of the feed, not only the products get_product_context stores; computed for properties with a Product Segmentation subscription only. Quote the numbers with their dataAsOf per source and the footnote; describe what happened together, never a cause, and never turn break-even into a bid change.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
spots | array of enum | No | Only these spots. Each one of dashboard_run_out, category_returns, campaign_break_even, save_settings_stock, competitor_comparison. 1 to 5 items. | |
feed_key | string | No | Only this feed’s cards (feedKey of an earlier result). Up to 200 characters. | |
limit | integer | No | 10 | From 1 to 20. |
get_highlights
Product Segmentation highlights · Read-only · reads Product Metrics data · any workspace member
The property’s Product Segmentation highlights over its saved date range: revenue, ad spend and ROAS in total, the spend going to Drainers (products that spend without returning) and the ROAS Product Segmentation estimates if that spend earned what Stars and Question Marks earn. Use for how the account is doing overall, to size the waste before drilling into products, or to open a monitoring update. These are Product Segmentation’s numbers and segments: explain them, never relabel products or promise the uplift.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. |
get_inventory_state
Inventory state · Read-only · reads Product Metrics data · any workspace member
Stock from the connected shop: on hand, units sold per week, weeks of cover, stockout and reorder dates, the suggested reorder quantity and slow movers, with the lead time behind them. Pass item_ids for specific products, or leave them out and pick a filter (‘reorder_due’, ‘slow_movers’ or ‘all’) to list the shop’s products that need stock attention; list rows carry the shop’s product id, variant id and SKU (search_products with the SKU finds the item_id). Use for stock, reorder and ‘can we keep advertising this’ questions. Reorder dates and quantities are the planner’s: report them, do not order or pause anything.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
item_ids | array of string | No | 1 to 20 items. | |
filter | enum | No | List mode, without item_ids; default ‘all’. One of reorder_due, slow_movers, all. | |
limit | integer | No | 20 | From 1 to 50. |
cursor | string | No | nextCursor from a previous page. Up to 2048 characters. |
get_competitor_offers
Competitor offers · Read-only · reads Product Metrics data · any workspace member
The latest price of every seller of one product from the competitor price scraper over the last days: our own offer first, then competitors from cheapest, each with its gap to our price in percent and when it was seen. Use for ‘who is cheaper’, ‘what does this seller charge’ or to check a price-position signal from get_product_context. One product per call: to rank many products use the market layer of get_product_context instead. Report the gaps and their age; price and label changes are the merchant’s and the algorithm’s call.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
item_id | string | Yes | Merchant Center item_id as returned by another tool; a lake canonical_item_id or GA4 item id also works when it matches one item after ignoring case and punctuation. | |
days | integer | No | 30 | From 1 to 90. |
History
Day-by-day history of a product, a group of products or the segments.
get_product_timeseries
Product history · Read-only · reads Product Metrics data · any workspace member
Daily or weekly history for one product. By default returns a summary per measure (total, recent change, trend per week, level shift date, outliers), which is what you should reason from. Ask for format=‘csv’ only when you must inspect individual points; prefer grain=‘week’ for more than 60 days. History holds about 90 days, for the top products by spend only, and only the measures the sources record (ad and session measures; stock, price and gross profit series only where connected): the result names measures that are not recorded. Ratios such as ROAS/POAS are not series: compute them from the summed measures, or use the advertising window in get_product_context.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
item_id | string | Yes | Merchant Center item_id as returned by another tool; a lake canonical_item_id or GA4 item id also works when it matches one item after ignoring case and punctuation. | |
measures | array of enum | No | ["clicks","cost","conversionValue"] | Which measures to return. Each one of impressions, clicks, cost, conversions, conversionValue, grossProfit, sessions, purchases, unitsSold, onHand, ownPrice, marketMedianPrice. 1 to 6 items. |
days | integer | No | 90 | How many days back from the latest day with data (about 90 are stored). From 7 to 400. |
grain | enum | No | day | Daily points, or weeks summed. One of day, week. |
format | enum | No | summary | summary: totals, change, trend and level shifts per measure; csv: every point. One of summary, csv. |
get_group_timeseries
Group history · Read-only · reads Product Metrics data · any workspace member
Summed daily or weekly history across several products: the top products by ad spend or conversion value (optionally within a Product Segmentation segment or a category), or a list of item_ids. Use it for the trend of a group or the portfolio (is revenue growing, week by week for our top 20, did a segment change) instead of reading products one by one. Returns the summed series as a table, a summary per measure, the dates the data covers and how many of the products have history (only some do): say which products and weeks the result covers. Ratios such as ROAS come from the summed conversionValue and cost.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
item_ids | array of string | No | These products instead of a ranked selection. 1 to 50 items. | |
top_by | enum | No | spend | Rank the stored products by ad spend or by conversion value. One of spend, conversion_value. |
segment | enum | No | Only products in this Product Segmentation segment. One of stars, question_marks, cash_cows, dogs, drainers, ghosts. | |
category | string | No | Only products with this value of the category column. Up to 200 characters. | |
limit | integer | No | 20 | How many products to add up. From 1 to 50. |
measures | array of enum | No | ["clicks","cost","conversionValue"] | Additive measures (and onHand); prices cannot be added up. Each one of impressions, clicks, cost, conversions, conversionValue, grossProfit, sessions, purchases, unitsSold, onHand, ownPrice, marketMedianPrice. 1 to 6 items. |
days | integer | No | 56 | How many days back from the latest day with data (about 90 are stored). From 7 to 400. |
grain | enum | No | week | Weeks summed, or daily points (a table of the days for up to 31 days). One of day, week. |
get_segment_history
Segment history · Read-only · reads Product Metrics data · any workspace member
How one product moved between segments (stars, cash_cows, question_marks, dogs, drainers, ghosts, or not_in_feed) over the last days, from the daily segment snapshots of its feed. Each move comes with the product’s Google Ads spend and conversion value in the 7 days before vs the 7 days from the move (null where not cached) and the campaign and Product Segmentation settings changes within 7 days of it. Use when the user asks why a product changed segment, when it dropped out of Stars or Cash Cows, or whether a move followed a settings change; point to the spend and value before vs after the move and the changes around it. A segment describes the 30 days of results before the day it was captured: say plainly that it explains the past and does not predict future profit.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
item_id | string | Yes | Merchant Center item_id as returned by another tool; a lake canonical_item_id or GA4 item id also works when it matches one item after ignoring case and punctuation. | |
days | integer | No | 90 | From 7 to 400. |
Proposals
File a proposed change for a person to approve in Priorities, and list existing proposals. Filing a proposal never changes Google Ads or the store by itself.
propose_change
Propose a change · Files a proposal · reads Product Metrics data · editors and admins only
Propose a change for a person to approve: a Merchant Center custom label, a priority, or a task (e.g. reorder). Nothing is written to Merchant Center until a person approves it. Always pass the context_version you based the proposal on and a rationale that cites the layers and signals behind it.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
item_id | string | Yes | Merchant Center item_id as returned by another tool; a lake canonical_item_id or GA4 item id also works when it matches one item after ignoring case and punctuation. | |
change | object { kind, slot, from, to } or object { kind, from, to } or object { kind, text } | Yes | set_label (slot, from, to), set_priority, or a task with its text. | |
rationale | string | Yes | Why, citing the layers and signals behind it (at least 20 characters). Up to 2000 characters. | |
context_version | string | Yes | contextVersion of the product context the proposal is based on. |
list_proposals
Proposals · Read-only · reads Product Metrics data · any workspace member
Proposals in the Priorities ledger with their status and, once measured, an outcome: the 28 days after the change was applied versus the 28 days before. An outcome with verdict “causal” carries outcome.did, an estimate against matched products that did not change: causal: compared with matched products that did not change, the 95% interval of the effect excludes zero and a placebo check 28 days earlier found none. Only for that verdict may you say the change caused the effect, quoting the estimate and its interval. Every other outcome is directional: before/after, may reflect season, budget or competitors: report how the numbers moved and never say the change caused it. Use to avoid duplicate proposals and to report how metrics moved after earlier changes.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
status | array of enum | No | Each one of proposed, approved, rejected, superseded, expired, applied, failed, measured. | |
item_id | string | No | Merchant Center item_id as returned by another tool; a lake canonical_item_id or GA4 item id also works when it matches one item after ignoring case and punctuation. | |
limit | integer | No | 20 | From 1 to 50. |
Advanced
Raw SQL over the store’s data, for questions the other tools cannot answer.
query_lake
Query the lake · Read-only · reads Product Metrics data · any workspace member · counts towards the hourly limit for expensive tools
Last resort, costing far more than the other tools: one read-only SELECT over this property’s lake tables, for what they cannot answer, e.g. a custom daily breakdown, a total across all products or a window the context does not hold. Use the logical table names below exactly (the tenant scope is applied for you). Lake column names are not the other tools’ field names: use the columns listed below and the mapping after them. No comments, UNION or writes. Results are capped and carry the data age per source; dates outside a table’s range are missing, not zero, so state the first and last date the result covers. Aggregate in SQL; never select raw rows you do not need.
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
property_id | string | No | The store to read: a propertyId from list_properties. Optional when you have access to one store only. | |
sql | string | Yes | One SELECT statement; the tenant scope is applied for you. Up to 4000 characters. | |
max_rows | integer | No | 100 | From 1 to 500. |