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

attributed_purchases.mdskills/amazon-ads-reporting/references/reports/sb/

Sponsored Brands Attributed Purchases mapping

Equivalent to v3 Sponsored_Brands_Attributed_Purchases_report — 18 v3 columns mapped (with attribution-type restructured into metric variants)

Summary

This template replicates the v3 Sponsored Brands Attributed Purchases report on the Amazon Ads API v1 cross-product reporting endpoint (CreateReport). The grain is (date, campaign, purchased ASIN) with attribution split — but unlike v3 where 'Attribution type' is a row-level dimension, v1 encodes click-vs-view in metric variants, so the v1 layout is wider rows with click-only and total columns side-by-side.

Of the 18 v3 columns: 14 map cleanly to v1 fields, 1 is restructured (Attribution type → metric variants), and 3 are derived client-side (% of Sales NTB, % of Units NTB are derived; ACOS isn't applicable to this report).

The 17-field payload was validated against the packaged v1 catalog: zero unknown fields, zero missing required, zero incompatible pairs.

Why this report has the same constraints as SP Purchased Product

Like the SP Purchased Product report, this is a HALO-style report whose grain pins down the actual purchased ASIN (convertedProduct.id). v1's catalog explicitly marks metric.impressions, metric.clicks, and metric.totalCost as INCOMPATIBLE with the convertedProduct.* family — and that's why the v3 SB Attributed Purchases report omits Impressions/Clicks/Spend/CTR/CPC. v3 hid this constraint by giving you a sparse 18-column conversion-only report; v1 surfaces it via the validator.

This report's primary use case is decomposition: showing which Purchased ASINs an SB campaign drove sales for, and how much of that was new-to-brand. v1 covers this use case completely — but with one validator-detected restriction (the percent-of-sales NTB metric is blocked when grouping by purchased ASIN). The percent-of-purchases NTB variant survives, and the missing percentages are simple downstream divisions.

Layout difference: attribution type

In v3, 'Attribution type' is a column with values like 'Total' (all-attribution = click + view) and 'Click'. Each combination of (date, campaign, attribution type, purchased ASIN) is one row. So a single (date, campaign, ASIN) appears in TWO rows — one with the totals, one with the click-only numbers.

In v1 the same data is one wider row per (date, campaign, ASIN) with both metric.sales (total) and metric.salesFromClicks (click-only) populated together. This is the same shape v3 reports like SB Keyword and SB Search Term use for their click-only variants. It is generally cleaner for downstream warehouses — joins and pivots get simpler when click-vs-view is on the same row.

If your downstream consumers absolutely require the v3 long-format shape, rebuild it in the warehouse: take the v1 rows once with attribution_type 'Total' and col_value from sales, append them (UNION ALL) to the same rows with attribution_type 'Click' and col_value from salesFromClicks. Same for purchases and unitsSold.

Field list (grouped by role)

Time dimension (exactly one required)

  • date.value

Level-of-detail dimensions

  • campaign.id
  • campaign.name
  • campaign.currencyCode
  • campaign.costType
  • convertedProduct.id
  • convertedProductMarketplace.value

Required supporting field

  • budgetCurrency.value

All-attribution conversion (14-day)

  • metric.sales
  • metric.purchases
  • metric.unitsSold

Click-only attribution variants

  • metric.salesFromClicks
  • metric.purchasesFromClicks
  • metric.unitsSoldFromClicks

New-to-brand

  • metric.newToBrandSales
  • metric.newToBrandPurchases
  • metric.newToBrandUnitsSold
  • metric.percentOfPurchasesNewToBrand

Filter (limits the report to SB)

  • adProduct.value = SPONSORED_BRANDS

v3 → v1 field mapping

v3 Column (Sponsored_Brands_Attributed_Purchases)v1 field_idRoleNotes
Datedate.valueTime dimensionRequired time dimension.
Currencycampaign.currencyCodeDimensionPair with budgetCurrency.value.
Campaign Namecampaign.nameDimensionPair with campaign.id.
—campaign.idDimensionStable join key.
Attribution type(NOT a dimension in v1 — encoded in metric variants)—v1 has NO 'attribution type' dimension. Click-vs-view attribution is encoded in the *FromClicks vs *FromViews metric variants instead. The v3 layout (one row per attribution type with metrics per row) becomes a v1 layout (one row per date+campaign+convertedProduct.id with click and total columns side-by-side). v3's 'View' attribution = (total - clicks-only); v1 surfaces both metric.sales (total = click+view) and metric.salesFromClicks (click-only) on the same row.
Purchased ASINconvertedProduct.idDimensionDirect equivalent — Primary Key for the converted-product family.
—convertedProductMarketplace.valueDimensionREQUIRED supporting field for convertedProduct.id (validator-confirmed). Also disambiguates same-ASIN purchases across marketplaces.
Cost typecampaign.costTypeDimensionCPC / CPM / vCPM. Native dimension in v1.
—budgetCurrency.valueRequired supportv1 minimal-baseline supporting field.
14 Day Total Salesmetric.salesMetricAll-attribution sales. The 14-day window is set on the report request.
14 Day Total Orders (#)metric.purchasesMetricEquivalent — orders → purchases.
14 Day Total Units (#)metric.unitsSoldMetricDirect.
14 Day New-to-brand Salesmetric.newToBrandSalesMetricDirect.
14 Day New-to-brand Orders (#)metric.newToBrandPurchasesMetricDirect.
14 Day New-to-brand Units (#)metric.newToBrandUnitsSoldMetricDirect.
14 Day % of Sales New-to-brand(derive client-side)Derivedmetric.percentOfSalesNewToBrand is INCOMPATIBLE with convertedProduct.id (validator-confirmed). Compute as newToBrandSales / NULLIF(sales, 0).
14 Day % of Orders New-to-brandmetric.percentOfPurchasesNewToBrandMetricDIRECT — and notably, this percent IS compatible with convertedProduct.id (validator-confirmed). The sales-NTB% variant isn't, but the purchases-NTB% variant is.
14 Day % of Units New-to-brand(derive client-side)Derivedv1 has no metric.percentOfUnitsNewToBrand anywhere. Compute as newToBrandUnitsSold / NULLIF(unitsSold, 0).
14 Day Total Sales - (Click)metric.salesFromClicksMetricClick-only attribution.
14 Day Total Orders (#) - (Click)metric.purchasesFromClicksMetricClick-only attribution.
14 Day Total Units (#) - (Click)metric.unitsSoldFromClicksMetricClick-only attribution.

Red row: Attribution type is restructured into metric variants. Yellow rows are derived client-side.

Critical differences from the v3 report

ChangeWhat it means for the request
v3 'Attribution type' is NOT a dimension in v1v1 has no attribution-type dimension. Click-vs-view is encoded in metric variants: metric.salesFromClicks vs metric.salesFromViews vs metric.sales (total = click + view). The v3 layout (one row per attribution type) becomes a v1 layout (one row per (date, campaign, convertedProduct.id) with click-only and total metrics on the same row). v3's 'View' attribution = total − click — derive in the warehouse if downstream consumers expect three rows per group.
This is a HALO-style report — most metrics are forbidden at this grainSame constraint as the SP Purchased Product report: convertedProduct.id is incompatible with metric.impressions, metric.clicks, and metric.totalCost. Only conversion-event metrics (sales, purchases, unitsSold and their *FromClicks / *FromViews / *NewToBrand variants) coexist with convertedProduct.id.
Filter on adProduct.value = SPONSORED_BRANDSThe v1 endpoint is shared across all ad products.
Only ONE of the percent-NTB metrics survives convertedProduct.idmetric.percentOfPurchasesNewToBrand IS compatible with convertedProduct.id; metric.percentOfSalesNewToBrand is INCOMPATIBLE (validator-confirmed). All Halo and Promoted variants of the SALES NTB% are also incompatible. Workaround: derive percent-of-sales-NTB downstream as newToBrandSales / NULLIF(sales, 0). The percent-of-units-NTB has no v1 field anywhere — derive as newToBrandUnitsSold / NULLIF(unitsSold, 0).
convertedProduct.id requires convertedProductMarketplace.value as a supporting fieldValidator surfaced this requirement on probe — convertedProductMarketplace.value must be in the field list when convertedProduct.id is. It also serves a useful purpose: distinguishing same-ASIN purchases across regional marketplaces.
Attribution windows leave the field namev3's '14 Day' prefix is gone; the 14-day window is set on the report request.

Operational notes

  • Reproducing the v3 long-format attribution shape: UNION two SELECT statements over the v1 wide-format result. v3 'Total' = metric.sales; v3 'Click' = metric.salesFromClicks; v3 'View' (if present in your downstream consumers) = metric.sales − metric.salesFromClicks (or use metric.salesFromViews directly — also compatible with convertedProduct.id).

  • Adding metric.salesFromViews / metric.purchasesFromViews / metric.unitsSoldFromViews: all three are compatible with convertedProduct.id and provide the view-only column directly. Add them if your warehouse prefers explicit view metrics over (total − clicks).

  • Enriching with brand/category: convertedProduct.brand, convertedProduct.category, convertedProduct.subcategory, convertedProduct.parentProductId, convertedProduct.productGroup are all compatible with this metric set. Add convertedProduct.brand to roll halo purchases up by brand.

  • Derivations: percentOfSalesNewToBrand = newToBrandSales / NULLIF(sales, 0); percentOfUnitsNewToBrand = newToBrandUnitsSold / NULLIF(unitsSold, 0). Persist raw inputs alongside the derived views.

skills

LICENSE.md

README.md

tile.json