Run everything you never had time to implement. Define your process once, and keep it running with Qore.

All reports
Amazon Ads Console
Advertising Performance

Amazon Sponsored Products Auto Targeting Report

The Sponsored Products targeting report gives you one row per day for every target Amazon files under its automatic vocabulary — the close-match, loose-match, substitute and complement groups Amazon creates for you, plus the category and product targeting expressions an advertiser adds — with impressions, clicks, cost, top-of-search share and the attributed purchases, units and sales behind them at four attribution windows. It is the auto-targeting half of the spTargeting report; the manual keywords come out of the same request as the keyword report.

Known upstream as
spTargeting
One row is
One row per target
Refreshed
Daily
Columns
52
Marketplaces
All marketplaces
History
Amazon retains 95 days of Sponsored Products spTargeting data and caps a single request at a 31-day range, so a full window takes four requests and anything older has to be accumulated by pulling daily; a re-pull of a window fully restates every day in it. The console's own targeting report offers a 90-day lookback.
Latency
Amazon publishes initial impression and click data within 12 hours, and says impressions and clicks can still change for up to three days while invalid traffic is filtered. Initial conversion data lands within 24 hours and is restated 1, 7 and 28 days after the conversion event, so with the 30-day attribution columns a recent day keeps restating for weeks. Report generation itself can take as long as three hours after the request.
Requires
Amazon Ads API access

What this report contains

One row per automatic target per day, for Sponsored Products. This is the auto-targeting half of Amazon's spTargeting report: the same request that produces the keyword report, filtered to keywordType values TARGETING_EXPRESSION and TARGETING_EXPRESSION_PREDEFINED instead of BROAD, PHRASE and EXACT. Across 16 production files and 259,154 rows, (keyword_id, date) was unique on every one, so a target-day is genuinely the grain.

"Automatic" here names the filter, not the author of every row. TARGETING_EXPRESSION_PREDEFINED is the four groups Amazon creates for every auto ad group without being asked. TARGETING_EXPRESSION — 74,797 of the 259,154 measured rows — is the category and product targeting expressions, which Amazon documents as clauses an advertiser adds to a manual campaign. Both arrive in this file because both sit in Amazon's automatic keywordType vocabulary, so read keyword_type before assuming who chose a target.

The columns fall into four groups. Where the target lives — campaign_, ad_group_, portfolio_id, with the campaign's budget and its currency on every row. The target itself — keyword_id, keyword, targeting, keyword_type, match_type and keyword_bid. Yes, the columns are called keyword_ on a report about targets that are not keywords; keyword_id is the target's id, and keyword_type tells you which kind of automatic target the row is. Delivery — impressions, clicks, click_through_rate, top_of_search_impression_share, cost and cost_per_click. Outcomes, repeated at 1, 7, 14 and 30 days for purchases, units and sales, then again for the same-SKU subset of each — and, at 7 days only, the other-SKU remainder. acos_clicks_ and roas_clicks_* at 7 and 14 days are Amazon's own ratios of the money columns already in the row.

The one column pair worth knowing before you open the file: keyword and targeting are the same string on 96.4% of rows and different on the rest. Where they differ the row is a category target, keyword holds the category id (category="2892944031") and targeting holds its name (category="Intimo da uomo"). That is the opposite of the manual keyword report, where the two are equal on every row.

How to get it

In the Amazon Ads console, this is Measurement & Reporting → Sponsored ads reports → Create report, ad product Sponsored Products, report type Targeting, daily time unit — the console offers the targeting report at two time units, summary or daily.

Through the Amazon Ads API v3, you POST to /reporting/reports with reportTypeId: spTargeting, adProduct: SPONSORED_PRODUCTS, groupBy: ["targeting"], timeUnit: DAILY and format: GZIP_JSON, listing the 52 columns above, and a keywordType filter of ["TARGETING_EXPRESSION", "TARGETING_EXPRESSION_PREDEFINED"] — which is Amazon's own sample request for this report. Every v3 report request uses that one endpoint; it returns a reportId with status PENDING, and you poll GET /reporting/reports/{reportId} until the status is COMPLETED and a url appears, then download the gzipped JSON array from it. Generation can take as long as three hours.

The filter is the report. The keyword report is this exact request with keywordType set to BROAD, PHRASE and EXACT; leave the filter off and you get both halves in one file with the same 52 columns and nothing but the values in keyword_type to tell them apart. Keep the two pulls separate and keep them separately named, because the files behave differently where it matters — see keyword versus targeting above.

Two properties of v3 to rely on. You get exactly the columns you asked for: across 16 files all 52 arrived every time, in one identical set, so a missing column is your request, not Amazon's. And the order of keys in the JSON is whatever Amazon felt like that day — it differed in all 16 files — so read by name, never by position. Reports are per-profile: a seller in five marketplaces runs five requests and gets five files, each in its own currency.

Sample rows

Illustrative values, not data from a real account. Shown to give the shape of the file.

datecampaign_nametargetingmatch_typeimpressionsclickscostpurchases_7dsales_7dacos_clicks_7d
2026-09-14Auto - Catch Allclose-matchTARGETING_EXPRESSION_PREDEFINED58420731512.43411638.5931.27
2026-09-14Auto - Catch Allloose-matchTARGETING_EXPRESSION_PREDEFINED121350904596.6422879.7867.82
2026-09-14Auto - Catch AllsubstitutesTARGETING_EXPRESSION_PREDEFINED33710402321.6019759.8142.33
2026-09-14Auto - Catch AllcomplementsTARGETING_EXPRESSION_PREDEFINED98656139.0400.00
2026-09-14Category - Athletic Sockscategory="Athletic Socks"TARGETING_EXPRESSION17240143118.696233.9450.74

Field reference

ColumnTypeDescription
datedateThe advertising day the row's metrics are attributed to, as ISO YYYY-MM-DD with no time component. It is the column the requested window filters by and the one to partition on.
campaign_idstringAmazon's numeric campaign identifier, carried as a string because it is a join key.
campaign_namestringThe campaign name as reported. Join on campaign_id, not on this.
campaign_statusstringWhether the campaign is enabled, paused or archived, as reported.
campaign_budget_amountdecimalThe campaign's configured budget, in campaign_budget_currency_code. Every auto target in a campaign shares the same value, so it does not sum across rows.
campaign_budget_typestringWhether campaign_budget_amount is a daily or a lifetime figure.
campaign_budget_currency_codestringThe currency of campaign_budget_amount. Populated on every row, and across the 16 measured files it always agrees with the profile's marketplace — BRL, CAD, EUR, GBP, INR, MXN or USD — so it is a safe proxy for the row's currency, though strictly it names only the budget's.
ad_group_idstringAmazon's ad group identifier. An auto target belongs to exactly one ad group.
ad_group_namestringThe ad group name as reported.
portfolio_idstringThe portfolio the campaign sits in. Null on roughly 8.5% of rows — campaigns that are in no portfolio — rather than absent from the file.
keyword_idstringThe target's identifier, despite the name. Together with date it is unique — 259,154 distinct pairs over 259,154 measured rows — so it is the key to join and deduplicate on.
keywordstringThe target expression as Amazon stores it. For a category target this carries the category id, e.g. category="2892944031", where targeting carries the name. Differs from targeting on about 3.6% of rows, so do not assume one stands in for the other.
targetingstringThe target expression as Amazon displays it — Amazon's reference defines it only as a string representation of the targeting expression. For a category target this is the readable name, e.g. category="Intimo da uomo", while keyword holds the id. Equal to keyword on the other 96.4% of rows. Only the category form is evidenced — Amazon documents the four predefined auto groups and their API names (CLOSE_MATCH, LOOSE_MATCH, SUBSTITUTES, COMPLEMENTS) but states nowhere what string this column carries for them, so treat the sample's wording as an illustration.
keyword_typestringWhich kind of automatic target the row is — TARGETING_EXPRESSION_PREDEFINED (Amazon's predefined auto groups, about 71% of measured rows) or TARGETING_EXPRESSION (an expression such as a category target). This vocabulary is the filter that makes it the targeting report rather than the keyword report.
match_typestringIdentical to keyword_type on every measured row. Both are requested and both carried; read either, never treat them as two facts.
keyword_biddecimalThe bid set on this target, in the campaign's currency. Null on about 0.6% of rows, where the campaign's bidding strategy leaves no per-target bid.
impressionsint64Times an ad was shown against this target.
clicksint64Clicks on those ads. The billable event.
click_through_ratefloat64Clicks divided by impressions, as a percentage bounded at 100, not a 0–1 fraction. Null on about 10.6% of rows — those with no impressions. Recompute from the counts when aggregating.
top_of_search_impression_sharefloat64The share of top-of-search impressions this target won, as a percentage bounded at 100. Null on about 35.6% of rows.
costdecimalWhat the clicks cost. The only spend column in this report — unlike the campaign report, spend is not requested, so there is nothing to reconcile it against.
cost_per_clickdecimalAverage cost per click for the row, typed as money because it multiplies back into it (cpc × clicks = cost). Recompute from cost and clicks rather than averaging the column.
purchases_1dint64Orders attributed to a click on this target within 1 day.
purchases_7dint64Orders attributed within 7 days. Includes everything in purchases_1d.
purchases_14dint64Orders attributed within 14 days. Includes everything in purchases_7d.
purchases_30dint64Orders attributed within 30 days — the widest window, and the slowest to settle.
purchases_same_sku_1dint64The subset of purchases_1d that were the advertised SKU itself rather than another product the shopper bought after clicking.
purchases_same_sku_7dint64Same-SKU subset of purchases_7d.
purchases_same_sku_14dint64Same-SKU subset of purchases_14d.
purchases_same_sku_30dint64Same-SKU subset of purchases_30d.
units_sold_clicks_1dint64Units sold from click-attributed orders within 1 day. Counts units where purchases_1d counts orders.
units_sold_clicks_7dint64Units sold from click-attributed orders within 7 days.
units_sold_clicks_14dint64Units sold from click-attributed orders within 14 days.
units_sold_clicks_30dint64Units sold from click-attributed orders within 30 days.
units_sold_same_sku_1dint64Units of the advertised SKU specifically, within 1 day.
units_sold_same_sku_7dint64Units of the advertised SKU specifically, within 7 days.
units_sold_same_sku_14dint64Units of the advertised SKU specifically, within 14 days.
units_sold_same_sku_30dint64Units of the advertised SKU specifically, within 30 days.
units_sold_other_sku_7dint64Units of products other than the advertised SKU, within 7 days — the halo side of units_sold_clicks_7d. Only the 7-day window is requested for other-SKU.
sales_1ddecimalAttributed sales value within 1 day.
sales_7ddecimalAttributed sales value within 7 days — the denominator of acos_clicks_7d.
sales_14ddecimalAttributed sales value within 14 days — the denominator of acos_clicks_14d.
sales_30ddecimalAttributed sales value within 30 days.
attributed_sales_same_sku_1ddecimalThe portion of sales_1d from the advertised SKU itself.
attributed_sales_same_sku_7ddecimalSame-SKU portion of sales_7d. Amazon defines this, sales_other_sku_7d and sales_7d independently — same SKU as advertised, different SKU, and the total — and states no identity between them, so that the two parts add to the whole is Amazon's definition rather than something measured here. Check it on your own file before relying on it.
attributed_sales_same_sku_14ddecimalSame-SKU portion of sales_14d.
attributed_sales_same_sku_30ddecimalSame-SKU portion of sales_30d.
sales_other_sku_7ddecimalAttributed sales of products other than the advertised SKU, within 7 days — the halo. Only the 7-day window is requested. Typed as decimal here where the inferred schema used to flip between integer and double depending on whether a seller had a fractional value that week.
acos_clicks_7dfloat64Amazon's ACOS at 7 days, cost divided by sales_7d as a percentage — 25.0 means 25%, and values above 100 are common. Null on about 98.5% of rows, wherever there were no attributed sales. A rounded ratio; divide the two money columns yourself when it matters.
acos_clicks_14dfloat64Amazon's ACOS at 14 days, cost divided by sales_14d as a percentage. Null wherever sales_14d is zero.
roas_clicks_7dfloat64Amazon's ROAS at 7 days, sales_7d divided by cost as a bare multiple — 4.0 means four times spend back. Null on about 91.5% of rows, wherever there were no clicks. Not a percentage, unlike ACOS.
roas_clicks_14dfloat64Amazon's ROAS at 14 days, sales_14d divided by cost as a bare multiple. Null wherever there were no clicks.

Use cases

Deciding which automatic targets to keep bidding on. Group by keyword_type and targeting, sum cost and sales_7d, and compute ACOS yourself. The predefined groups behave very differently for most catalogues, and this is the only report that separates them by day. Amazon creates four of these groups for every auto ad group — close match, loose match, substitutes and complements — and lets you bid on each separately, which is what makes splitting them worth the trouble.

Setting per-target bids. keyword_bid is the bid you set and cost_per_click is what the auction actually charged. A target whose CPC sits well below its bid has headroom you are not using; one whose CPC equals its bid is being capped by you, not by competition.

Working with category targets. TARGETING_EXPRESSION rows include category targets. Join on keyword when you need the category id — it is stable and language-independent — and display targeting, which carries the name in the marketplace's own language. Never join the two files of different marketplaces on targeting.

Buying top of search deliberately. top_of_search_impression_share sits on the same row as cost and purchases_7d, so you can see whether the targets winning the top slot are the ones that convert, or just the ones that cost most.

Separating halo from direct sales. sales_other_sku_7d and units_sold_other_sku_7d are the products people bought other than the one advertised. An auto target with weak same-SKU ACOS and strong total ACOS is introducing shoppers to the range; judged on attributed_sales_same_sku_7d alone it looks like waste.

Reconciling against the campaign report. Sum cost by campaign_id and date, and the auto-target rows plus the keyword report's manual rows should meet the campaign report's total. When they do not, the usual reason is a missing filter value or a marketplace left out of one pull.

Limitations and gotchas

Attribution windows nest — never add them. purchases_30d contains purchases_14d contains purchases_7d contains purchases_1d, and the same holds for units and sales. Summing the four inflates the number roughly fourfold.

keyword is not targeting. They differ on 3.6% of rows — every category target — with the id on one side and the name on the other. A pipeline that assumes they are equal because they were equal on the keyword report will silently mismatch category targets.

The ACOS and ROAS columns are mostly null, and that is correct. acos_clicks_7d is null on 98.5% of rows (no attributed sales) and roas_clicks_7d on 91.5% (no clicks). They are present-and-null, not missing, and a null is not a zero: a target with spend and no sales has infinite ACOS, not 0%. Recompute both from cost and sales_7d over any aggregate.

ACOS is a percentage; ROAS is a multiple. In the measured files ACOS ran as high as 364.9 and ROAS as high as 15,463. click_through_rate and top_of_search_impression_share are percentages bounded at 100. None of the four is a 0–1 fraction.

Other-SKU exists only at 7 days. There is no sales_other_sku_14d or _30d, so a halo analysis has to be a 7-day analysis or has to approximate the remainder as sales_Nd minus attributed_sales_same_sku_Nd. Amazon defines all three columns independently — total, same SKU as advertised, different SKU — and asserts no identity between them, so the subtraction is a reasonable reading of the definitions and not a measured fact. Check it on your own file before you publish a number that depends on it.

keyword_type and match_type are the same column twice. Equal on every one of 259,154 rows, with the automatic vocabulary — never BROAD, PHRASE or EXACT. If you see those values you are holding the keyword report.

The predefined groups' literal names are not documented. Amazon publishes the four auto targeting groups and the API names for their expression types — CLOSE_MATCH, LOOSE_MATCH, SUBSTITUTES, COMPLEMENTS — but says nothing about what string the report's targeting column carries for each. The example rows on this page use the console's wording as an illustration; only the category form, category="…", comes from a measured file. Read the distinct values off your own first pull rather than hard-coding any of them.

Budget columns repeat per target. campaign_budget_amount is the campaign's budget, copied onto every target row in that campaign. Summing it across an ad group multiplies the budget by the number of targets.

There is no spend column. cost is the only spend figure, which is a difference from the campaign report where both names are carried and equal.

Recent days keep changing. Impressions and clicks land within about 12 hours but can still move for three days while Amazon filters invalid traffic; conversions land within 24 hours and are restated 1, 7 and 28 days after the conversion event. Because a click today can attribute a purchase up to 30 days out, the last month restates on every re-pull.

FAQ

Is this the same report as the keyword report?

Same request, different filter. Both are spTargeting grouped by targeting with the same 52 columns; the targeting report is filtered to automatic target types and the keyword report to broad, phrase and exact. The files differ in behaviour, most visibly in whether keyword and targeting are equal.

Why do the keyword and targeting columns disagree on some rows?

Those rows are category targets. The keyword column carries the category id and the targeting column carries the category name in the marketplace's language. On every other row the two are identical.

Why is acos_clicks_7d empty on almost every row?

Because most target-days have no attributed sales, and Amazon leaves the ratio null rather than dividing by zero. A null is not a zero ACOS. Compute ACOS over an aggregate from cost and sales_7d instead of averaging the column.

What is the difference between keyword_type and match_type?

Nothing, in this report. They are equal on every one of 259,154 measured rows, and both take the automatic values TARGETING_EXPRESSION_PREDEFINED or TARGETING_EXPRESSION. Both are carried because both are in Amazon's vocabulary.

Does this report tell me what shoppers actually searched for?

No. A row is an automatic target, not a search term. The shopper queries that an auto target matched against come from the Sponsored Products search term report for auto campaigns.

Which attribution window should I use?

Whichever you use everywhere else and label. The report gives you 1, 7, 14 and 30 days for purchases, units and sales, but only 7 and 14 for the ready-made ACOS and ROAS columns, so 7 or 14 days is the path of least resistance.

Sources

Every researched claim on this page, and the Amazon or Walmart page it came from.

  • marketplaces — advertising.amazon.com/faq — 'The reporting updates are available worldwide (NA, EU, FE) wherever you can run sponsored ads.' The per-marketplace feature list was rejected as a source: see the note below.
  • marketplaces — advertising.amazon.com/features — names 22 marketplaces for Sponsored Products campaign management (US, CA, MX, BR, DE, ES, FR, IT, UK, NL, SE, TR, PL, BE, UAE, EG, SA, JP, IN, AU, SG, ZA), and advertising.amazon.com/api-overview#api-endpoints names the same 22 across NA/EU/FE. Neither names Ireland, though production files of the sibling Sponsored Products advertised-product report come from there, so neither list is safe to enumerate from and `all` is used instead.
  • history_window — advertising.amazon.com/targeting — the spTargeting configuration table gives Sponsored Products a maximum date range of 31 days and data retention of 95 days. The 60 and 65-day retentions in the same row belong to Sponsored Brands and Sponsored Display, not to this report.
  • history_window — advertising.amazon.com/GPDYPV4AAYCAJFKP — Amazon's console help for the Sponsored Products targeting report: 'The targeting report has 2 time units available: summary or daily. The lookback window for this report is 90 days.' That is the console surface, not the API's 95 days.
  • latency — advertising.amazon.com/faq — 'Initial impression and click data is available using the API within 12 hours', changes 'may happen up to three days after the initial click date due to the traffic validation process', 'Initial conversion data is available within 24 hours', and 'Restatements of conversion data occur 1, 7, and 28 days after the conversion event.'
  • latency — advertising.amazon.com/get-started — 'Report generation can take as long as three hours.'
  • how-to-get-it — advertising.amazon.com/advertising-console — 'To access your reports, click ‘Measurement & Reporting’ in the sidebar, then click through to ‘Sponsored ads reports’. From here, click on ‘Create report’ to set up your new custom report.'
  • how-to-get-it — advertising.amazon.com/GBYSPTSLR337JMLH — the downloadable-reports table ticks Targeting for Sponsored Products (and Display), and describes it as covering 'targets in all campaigns that received at least 1 impression'.
  • how-to-get-it — advertising.amazon.com/GPDYPV4AAYCAJFKP — 'The targeting report has 2 time units available: summary or daily', which is the daily time unit this page documents.
  • how-to-get-it — advertising.amazon.com/get-started — 'All reports requests use a single endpoint: POST /reporting/reports'; the response carries a reportId with status PENDING, you poll GET /reporting/reports/{reportId} until status is COMPLETED and a url appears, then download from that url.
  • how-to-get-it — advertising.amazon.com/targeting — Amazon's own 'Sponsored Products: Targeting expressions only' sample is reportTypeId spTargeting, adProduct SPONSORED_PRODUCTS, groupBy ['targeting'], format GZIP_JSON with a keywordType filter of TARGETING_EXPRESSION and TARGETING_EXPRESSION_PREDEFINED; the sample below it is the same request filtered to BROAD, PHRASE and EXACT. The page's guidance is Amazon's own: 'To see only targeting expressions, set the keywordType filter to TARGETING_EXPRESSION and TARGETING_EXPRESSION_PREDEFINED. To see only keywords, set the keywordType filter to BROAD, PHRASE, and EXACT.'
  • use-cases — advertising.amazon.com/targeting-with-sponsored-products — 'There are four automatic targeting strategies: Close match, Loose match, Substitutes, Complements', each defined on that page; 'you can set bids by targeting group'.
  • use-cases — advertising.amazon.com/auto-targeting — four auto targeting expressions are created automatically with every auto ad group, and the API names them CLOSE_MATCH, LOOSE_MATCH, SUBSTITUTES and COMPLEMENTS.
  • doc vs evidence — keyword — advertising.amazon.com/columns — the reporting columns reference says of `keyword`: 'Text of the keyword or a representation of the targeting expression (for Sponsored Products). For Sponsored Products targeting reports, the same value is returned in the targeting metric.' In production files the two differ on 9,402 of 259,154 rows (3.6%), every one a category target carrying the category id in `keyword` and its name in `targeting`. The measured files win: the page goes on saying they differ and nothing was changed.
  • doc vs doc — top_of_search_impression_share — advertising.amazon.com/columns lists the report types for `topOfSearchImpressionShare` as spCampaigns, sbCampaigns and sbTargeting only, while advertising.amazon.com/targeting names it in the Sponsored Products base metrics for spTargeting. Amazon's two pages disagree with each other; 16 production files carry the column on every row (null on 35.6%), so the column stays.
  • summary framing — advertising.amazon.com/auto-targeting — 'Auto targeting expressions are automatically created for every auto targeting campaign; you do not need to manually create auto targeting expressions', while advertising.amazon.com/overview says 'Manual Sponsored Products campaigns require you to add at least one targeting clause' and that product targeting 'can be applied at either the product, category, or brand level'. The two keywordType values in advertising.amazon.com/columns are 'TARGETING_EXPRESSION or TARGETING_EXPRESSION_PREDEFINED'. So 'the targets Amazon chooses for you' is exact only for the predefined groups; the summary and the opening section were softened to say the expression rows are advertiser-added.
  • sample — targeting values: not sourced. — advertising.amazon.com/columns defines `targeting` only as 'A string representation of the expression object used in the targeting clause'; advertising.amazon.com/auto-targeting gives the four expression types as CLOSE_MATCH, LOOSE_MATCH, SUBSTITUTES and COMPLEMENTS in the campaign-management API, and advertising.amazon.com/targeting states nothing about the column's literal values. Amazon nowhere says what string the report carries for a predefined group, so the sample's `close-match`/`loose-match`/`substitutes`/`complements` are labelled on the page as the console's wording, not a measured value.
  • fields — sales_7d vs same-SKU and other-SKU — advertising.amazon.com/columns defines `sales7d` as 'Total value of sales occurring within 7 days of an ad click', `attributedSalesSameSku7d` as the subset 'where the purchased SKU was the same as the SKU advertised' and `salesOtherSku7d` as the subset 'where the purchased SKU was different from the SKU advertised', and asserts no identity between the three. The page now says the split is Amazon's definition rather than a measured identity.
  • fields — advertising.amazon.com/columns — keywordType is 'For Sponsored Products reports ... one of: TARGETING_EXPRESSION or TARGETING_EXPRESSION_PREDEFINED', matchType carries the identical definition, topOfSearchImpressionShare is 'The percentage of top-of-search impressions earned out of all the top-of-search impressions that were eligible', and sales7d, attributedSalesSameSku7d and salesOtherSku7d are each defined on their own with no identity asserted between them.