CtrlK
BlogDocsLog inGet started
Tessl Logo
PluginPublic

kuudoai/kuudo-skills

22 Agent Skills for Amazon sellers and advertisers: Sponsored Products and Brands audits, search-term mining, budget pacing, DSP and Amazon Marketing Cloud, reporting, listing optimization and compliance, product images, repricing, FBA inbound, stockout, refunds, buyer messaging, and profitability. Built for Kuudo's hosted Amazon Ads and Selling Partner MCP servers; price, budget, listing, and shipment writes are previewed and wait for explicit approval.

68

1.65x
Quality

93%

Does it follow best practices?

Impact

66%

1.65x

Average score across 22 eval scenarios

SecuritybySnyk

Medium

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

targeting.mdskills/amazon-ads-reporting/references/reports/sp/

Amazon Ads API v1 Report Template

Equivalent to v3 Sponsored_Products_Targeting_report — 25 v3 columns mapped to v1 fields across two reports

Summary

This template replicates the v3 Sponsored Products Targeting report on the Amazon Ads API v1 cross-product reporting endpoint (CreateReport). Twenty-three v3 columns map cleanly to v1 field_ids on a single targeting-grain report. Two columns require special handling: 'Retailer' has no v1 equivalent and is dropped, and 'Top-of-search Impression Share' is incompatible with portfolio/adGroup/country dimensions in v1 and must be requested as a separate campaign-level report and joined back to the main report on (date.value, campaign.id).

Both report payloads were validated against the packaged v1 catalog: zero unknown fields, zero missing required, zero incompatible pairs.

Two-report architecture

The validator caught that metric.topOfSearchImpressionShare is INCOMPATIBLE with portfolio.portfolioId, portfolio.name, adGroup.id, adGroup.name, country.code, country.name — and REQUIRES adProduct.value and advertiserAccount.id. This means the metric only lives at the campaign grain in v1. Build two reports and union them in the warehouse:

  • Report 1 (main): all 23 mappable v3 columns at the date × portfolio × campaign × ad group × country × target × match-type grain.

  • Report 2 (supplemental): metric.topOfSearchImpressionShare at the date × campaign grain. Join to Report 1 on (date.value, campaign.id) — TOS impression share will repeat across all targets within the same campaign-day.

Report 1 — field list (grouped by role)

Time dimension (exactly one required)

  • date.value

Level-of-detail dimensions

  • portfolio.portfolioId
  • portfolio.name
  • campaign.id
  • campaign.name
  • campaign.currencyCode
  • adGroup.id
  • adGroup.name
  • country.code
  • country.name
  • target.value
  • target.matchType

Required supporting field

  • budgetCurrency.value

Delivery metrics

  • metric.impressions
  • metric.clicks
  • metric.ctr
  • metric.cpc
  • metric.totalCost

Attributed conversion metrics

  • metric.sales
  • metric.purchases
  • metric.unitsSold
  • metric.purchaseRate
  • metric.purchaseRateOverClicks
  • metric.salesPromoted
  • metric.salesHalo
  • metric.unitsSoldPromoted
  • metric.unitsSoldHalo
  • metric.roas

Filter (limits the report to SP)

  • adProduct.value = SPONSORED_PRODUCTS

v3 → v1 field mapping

v3 Column (Sponsored_Products_Targeting)v1 field_idRoleNotes
Datedate.valueTime dimensionRequired time dimension.
Portfolio nameportfolio.nameDimensionPair with portfolio.portfolioId.
—portfolio.portfolioIdDimensionStable join key.
Currencycampaign.currencyCodeDimensionCurrency the campaign was set up in. Pair with budgetCurrency.value.
Campaign Namecampaign.nameDimensionPair with campaign.id.
—campaign.idDimensionStable join key — also used to join the supplemental TOS report.
Countrycountry.nameDimensionUse country.code for ISO joins.
—country.codeDimensionISO country code.
Ad Group NameadGroup.nameDimensionPair with adGroup.id.
—adGroup.idDimensionStable join key.
Retailer(no v1 equivalent — drop)Dimensionv1 has no retailer dimension. The validator returns it as unknown. country.code already partitions Amazon vs other regional marketplaces; if cross-retailer reporting is needed (e.g. Walmart Connect), use a separate platform's API.
Targetingtarget.valueDimensionThe keyword, product, or category target expression.
Match Typetarget.matchTypeDimensionBROAD / PHRASE / EXACT for keywords; EXPANDED / TARGETED for product targets; AUTO match types for auto campaigns.
—budgetCurrency.valueRequired supportv1 minimal-baseline supporting field for currency-denominated metrics.
Impressionsmetric.impressionsMetricDirect.
Top-of-search Impression Sharemetric.topOfSearchImpressionShareMetric — separate reportINCOMPATIBLE with portfolio.*, adGroup.*, country.* dimensions. Must be requested in a SEPARATE campaign-level report (see Report 2) and joined on date.value + campaign.id. Requires adProduct.value and advertiserAccount.id in the field list.
Clicksmetric.clicksMetricDirect.
Click-Thru Rate (CTR)metric.ctrMetricDirect.
Cost Per Click (CPC)metric.cpcMetricDirect.
Spendmetric.totalCostMetricv1 renames 'spend' to totalCost.
Total Advertising Cost of Sales (ACOS)(derive client-side)Derivedv1 has no metric.acos. Validator suggests metric.roas as replacement. Compute as totalCost / NULLIF(sales, 0) or 1 / roas.
Total Return on Advertising Spend (ROAS)metric.roasMetricDirect.
7 Day Total Salesmetric.salesMetricWindow is set on the report request, not in the field name.
7 Day Total Orders (#)metric.purchasesMetricEquivalent — orders → purchases.
7 Day Total Units (#)metric.unitsSoldMetricDirect.
7 Day Conversion Ratemetric.purchaseRate (or metric.purchaseRateOverClicks)Metricv1 has no 'conversionRate' field; validator suggests purchaseRate. purchaseRate = purchases / impressions. purchaseRateOverClicks = purchases / clicks. Pick whichever matches your v3 definition (most SP UIs use orders/clicks → purchaseRateOverClicks). The template includes both so you can pick downstream.
7 Day Advertised SKU Units (#)metric.unitsSoldPromotedMetricPromoted units sold.
7 Day Other SKU Units (#)metric.unitsSoldHaloMetricHalo units sold.
7 Day Advertised SKU Salesmetric.salesPromotedMetricPromoted sales.
7 Day Other SKU Salesmetric.salesHaloMetricHalo sales.

Yellow rows highlight columns that don't have a clean one-to-one v1 mapping (no v1 equivalent, derived client-side, or split across reports).

Critical differences from the v3 report

ChangeWhat it means for the request
Top-of-search Impression Share forces a SECOND reportmetric.topOfSearchImpressionShare is incompatible with portfolio.*, adGroup.*, country.* and requires adProduct.value + advertiserAccount.id. The v3 report had it on the targeting grain; in v1 you cannot get target-grain rows AND TOS impression share in one query. Run two reports and join on (date.value, campaign.id) — TOS impression share is a campaign-level metric in v1.
No 'Retailer' dimensionThe v3 'Retailer' column has no v1 equivalent — the validator returns retailer.* as unknown. country.code already partitions Amazon marketplaces; cross-retailer (e.g. Walmart Connect) data lives outside Amazon Ads.
No metric.acos fieldThe catalog rejects metric.acos and suggests metric.roas. ACOS is derived as totalCost / NULLIF(sales, 0) or 1 / roas in the warehouse.
No 'conversion rate' field — choose your definitionv1 exposes metric.purchaseRate (purchases / impressions) and metric.purchaseRateOverClicks (purchases / clicks). Most legacy SP UIs computed 7-day conversion rate as orders / clicks, which is purchaseRateOverClicks. The template includes both and lets you pick downstream.
'Spend' → metric.totalCostRenamed across all ad products in v1.
Attribution window moves out of the field nameThe v3 '7 Day' prefix on Sales/Orders/Units/Conversion Rate doesn't appear in v1 field names. metric.sales is the same logical metric — the 7-day window is configured on the report request, not encoded per-field.
Targeting expression and match type are split into two fieldsv3 had 'Targeting' (expression) + 'Match Type' (modifier). v1 keeps the same split: target.value (the keyword/product/category) + target.matchType (BROAD/PHRASE/EXACT for keywords, EXPANDED/TARGETED for product targets, the AUTO modifiers for auto campaigns).
Currency is exposed two waysv3 had a single 'Currency' column. v1 offers campaign.currencyCode (the campaign's currency) and budgetCurrency.value (required supporting field). They normally agree but populate independently — keep both for joining and validation.

Operational notes

  • Conversion-rate semantics: pick metric.purchaseRateOverClicks if your downstream consumers expect orders/clicks (legacy SP UI default). Pick metric.purchaseRate if they expect purchases/impressions. Including both lets the warehouse decide.

  • ACOS derivation in the warehouse: acos = totalCost / NULLIF(sales, 0). Persist the raw inputs alongside the computed view.

  • Joining the two reports: use a LEFT JOIN from Report 1 onto Report 2 on (date.value, campaign.id). Report 2 produces one row per campaign-day; the value will fan out across all (target, match type, ad group) rows in Report 1 — TOS impression share is a campaign-level metric, so this fan-out is correct, not a bug.

skills

LICENSE.md

README.md

tile.json