Skip to content
<- Guides
AMC · Market intelligence

Amazon Organic vs Paid Keywords in One View

Search Query Performance shows the whole search funnel for a query. Amazon Marketing Cloud shows what your sponsored ads did on the same query. Put them side by side at one grain, never subtract one from the other, and keep ad math in the paid columns.

Amazon organic vs paid keywords: put Search Query Performance beside AMC paid search-term traffic, one row per query and week, with no ad math leaking.

Kuudo
Reviewed by Kuudo Engineering
A Claude session building one row per search query and week, as a matrix of column groups: SQP query totals and volume, never summed across ASINs; SQP ASIN funnel and shares, never mixed with ad spend; AMC sponsored_ads_traffic impressions and clicks, never subtracted from SQP; AMC attributed ad purchases, never put in a ratio with SQP purchases.
Two columns of evidence on one row. Neither is derived from the other.
TL;DR
  • Search Query Performance (SQP, GET_BRAND_ANALYTICS_SEARCH_QUERY_PERFORMANCE_REPORT) counts impressions, clicks, cart adds and purchases per search query for the ASINs (Amazon Standard Identification Numbers) you request. It has no ad spend field and doesn't split sponsored from organic, so organic can't be computed by subtracting your ad numbers from it.
  • Amazon Marketing Cloud (AMC) carries customer_search_term on every sponsored ads impression in sponsored_ads_traffic, including impressions nobody clicked. The Sponsored Products search term report keeps only terms with at least 1 ad click.
  • Aggregate each side to one row per search query and week before the join. SQP's total fields describe the whole query and repeat on every ASIN row, and paid rows repeat per campaign and keyword.
  • Ad spend and ad-attributed sales stay in the paid columns. SQP purchases and ad-attributed purchases count different things, so no ratio mixes them.

Amazon organic vs paid keywords can't be split by subtracting one report from another. Put Brand Analytics Search Query Performance beside your paid search-term traffic instead: aggregate each to one row per search query and week, join on the query, and keep ad spend and ad-attributed sales in the paid columns only.

A brand manager asked me for the "organic version" of our top keywords. The tempting shortcut was SQP clicks minus ad clicks, which assumes the two reports measure the same thing on the same calendar. They don't. Search Query Performance vs. Search Terms covers which report is which; this guide builds the view that puts them on one row.

The decision on the table was whether to cut bids on queries where we already win the search funnel. That depends on which queries our team defends no matter what, and a generic keyword report doesn't know that list. Our agent pulls SQP through the Selling Partner MCP, runs the paid side in Amazon Marketing Cloud through the Amazon Ads MCP, and checks our defended list before it marks any query as a bid-cut candidate.

Search Query Performance counts the whole search funnel, so organic can't be backed out of it

Search Query Performance is GET_BRAND_ANALYTICS_SEARCH_QUERY_PERFORMANCE_REPORT, and Amazon Agent Atlas holds Amazon's definition of it. It returns impressions, clicks, cart adds and purchases per search query for a space-separated list of ASINs, capped at 200 characters. It needs the Brand Analytics Selling Partner API role and Amazon Brand Registry, and it can only be requested, not scheduled through the API.

Each row carries two kinds of numbers:

Field familyExample fieldsDescribes
Query totalstotalQueryImpressionCount, totalClickCountThe whole query, every product
Your ASINasinClickCount, asinPurchaseCountOne requested ASIN
SharesasinClickShare, asinPurchaseShareASIN count over query total
DemandsearchQueryVolume, searchQueryScoreHow often, how important

Nothing in that schema holds ad spend or ad-attributed sales, and nothing separates sponsored placements from organic results. So "organic" can't be derived from SQP by removing your ad clicks: Amazon doesn't document that the ad clicks sit inside these counts, on the same week, for the same ASINs.

AMC sponsored_ads_traffic gives the paid side per search term, including impressions nobody clicked

Amazon Marketing Cloud records the keyword and the customer_search_term on every sponsored ads impression in sponsored_ads_traffic, including impressions from users who didn't click. That matters for the join. The Sponsored Products search term report includes only search terms that resulted in at least 1 ad click, so a query your ad showed on without a click never appears there.

This query is adapted from Amazon's instructional query in the AMC playbook "Use case: How to query sponsored ads keywords", with spend added. The agent runs it through the Amazon Ads MCP for the same Sunday-to-Saturday week as the SQP request:

/* Adapted from the instructional query: Traffic by keyword and search term */
SELECT
  targeting AS keyword,
  customer_search_term,
  match_type,
  campaign,
  ad_product_type,
  SUM(impressions) AS impressions,
  SUM(clicks) AS clicks,
  SUM(spend) AS spend_microcents
FROM
  sponsored_ads_traffic
WHERE
  match_type IN ('PHRASE', 'BROAD', 'EXACT')
GROUP BY
  1,
  2,
  3,
  4,
  5

The match_type filter keeps keyword-targeted traffic only. That leaves out automatic and product-attribute targeting, where Amazon's search term report shows alphanumeric ASIN strings in place of typed queries; those are product pages, not searches. AMC holds Sponsored Products keywords and search terms from the instance's creation date or 12.5 months back, whichever is sooner. The Ads API search term report keeps 65 days, at most 31 days per request.

Paid purchases and sales come from the same playbook's second query, with total_product_sales added, attributed to the search term the ad served on:

/* Adapted from the instructional query: Attributed conversions by keyword and search term */
SELECT
  targeting AS keyword,
  customer_search_term,
  match_type,
  campaign,
  ad_product_type,
  SUM(total_detail_page_view) AS total_dpv,
  SUM(total_purchases) AS total_purchases,
  SUM(total_product_sales) AS total_product_sales
FROM
  amazon_attributed_events_by_traffic_time
WHERE
  match_type IN ('PHRASE', 'BROAD', 'EXACT')
GROUP BY
  1,
  2,
  3,
  4,
  5

Aggregate each side to one row per query and week before the join, or the join multiplies SQP

Both outputs repeat rows the join can't see. The AMC results carry one row per keyword, match type and campaign for each search term. SQP carries one row per requested ASIN for each query, and its total fields describe the whole query, so they repeat identically on every ASIN row.

Join the raw rows on the search query and every SQP row fans out across every paid row for that query. The agent applies these rules, from the grain Atlas grounds for each report, before it writes a single joined row:

StepSQP sideAMC paid side
GrainQuery, weekSearch term, same week
Your-ASIN countsSum across your ASINsSum across campaigns, keywords
Query totalsTake once, never sumNot applicable
SharesSum across your ASINsNot applicable
Join keySearch query, normalizedSearch term, normalized

Normalizing the key means the same case and spacing on both sides before matching. A query that exists on only one side stays in the view with the other side empty; a missing side is evidence, not an error.

Ad spend and ad-attributed sales stay in the paid columns

The joined row keeps two sets of columns that never feed each other. SQP's columns describe the search funnel and carry no cost. The paid columns carry impressions, clicks, spend, ad-attributed purchases and ad-attributed sales, and any cost or return ratio is computed there and only there.

Two units matter:

  • spend is in microcents. Divide it by 100,000,000 to get your currency.
  • total_product_sales is already in local currency, and it includes brand halo sales: other products from the same brand bought after the ad.

SQP purchases and AMC's total_purchases count different events. One is a purchase SQP counts in the query's search funnel; the other is a purchase attributed to an ad that served on that search term. They don't share a denominator, so the view shows both and computes no blended rate.

The SQP side has its own published Skill. The SQP ASIN N-gram Skill (a Reference Skill) scores each query and ASIN pair and tags every action as organic, operational or advertising, and its scope note rules out paid-search bid rules. The Sponsored Products Search Terms Skill (also Reference) works the paid report. No published Skill builds the joined view, so the agent runs it on request or from a Skill your team writes.

What happens next: refresh the joined view every week after SQP lands

Amazon Agent Flow, the Amazon Agent Data layer, schedules both pulls and lands them in your private lake. Brand Analytics data is generally available within 72 hours of a period's close, so the weekly run goes in this order:

  1. Request SQP for last week's Sunday-to-Saturday period, for the ASINs you track.
  2. Run both AMC queries for the same window through the Amazon Ads MCP.
  3. Re-run the attributed-conversions query for every earlier week that ended within the last 30 days, and replace those weeks' paid purchase and sales columns. amazon_attributed_events_by_traffic_time can add conversions up to 30 days after a window closes, so a week's paid conversions are provisional until then.
  4. Aggregate each side to query and week, then join them in the lake with query_lake_sql.
  5. List queries where the brand's SQP share is strong and paid clicks are high, and check each against the team's defended list. Treat a week still inside its 30 days as provisional.

Any bid change that comes out of step 5 goes through the Amazon Ads MCP and, depending on your workspace policy, may wait for your approval. Two reports, one row, no subtraction: that's the whole pattern.

Next: how a query from this view becomes a bid rule that doesn't thrash, in The Agent Bidding Rulebook That Prevents Bid Thrash.

Private beta

See organic and paid evidence for the same query, on your own data

Bring us the keywords you defend and the ones you are paying for. In a private-beta session we'll map the Selling Partner MCP and Amazon Ads MCP pulls, the Amazon Marketing Cloud query, and the Agent Flow schedule that keeps the side-by-side view current in your own lake.

Run this workflow in beta

What you need to run organic vs paid keyword views

MCP
Selling Partner MCP for GET_BRAND_ANALYTICS_SEARCH_QUERY_PERFORMANCE_REPORT; Amazon Ads MCP for the Amazon Marketing Cloud sponsored_ads_traffic and attributed-events queries (and the Sponsored Products search term report when AMC isn't provisioned)
Skill
No published Kuudo Skill builds the joined view. The SQP ASIN N-gram Skill (amazon-sp-sqp-asin-ngram) works the SQP side per ASIN and query; the Sponsored Products Search Terms Skill (amazon-ads-sp-search-term-explorer) works the paid search term report and routes ASIN-shaped terms to product targeting.
Atlas collection
amazon_sellers and amazon_ads (playbooks: Use case: How to query sponsored ads keywords; Search term report for Sponsored Products; Search term reports; Analytics report type values)
dataLayer
Amazon Agent Flow schedules both pulls, lands them in your private lake, and runs the join with query_lake_sql
access
SQP needs the Brand Analytics Selling Partner API role and Amazon Brand Registry; the AMC queries need an AMC instance with Sponsored Products or Sponsored Brands keyword-targeted campaigns
Last verified
2026-10-04

What success and failure look like for organic vs paid keyword views

conditioninterpretation
Joined row shows SQP impressions several times the query's real volumeThe join ran before aggregation. SQP rows fanned out across paid rows per campaign and keyword, or total fields were summed across ASIN rows. Aggregate each side to query and week first.
Query has SQP clicks and purchases but no paid columnsNo sponsored ad in the AMC instance served an impression on that query in the week. AMC omits search terms that never triggered one of your impressions. That's a coverage gap to review, not an organic win to subtract.
Paid columns exist but the query has no SQP rowThe ASIN wasn't in the SQP request, the account lacks Brand Analytics access, or the query isn't among that ASIN's SQP queries. The paid side is the only evidence for this query.
A paid search term is an alphanumeric ASIN stringIt's a product detail page an ad displayed on, from an automatic campaign or a product-attribute-targeted ad group, not a typed query. Drop it from any join keyed on search query; the AMC query's match_type filter (PHRASE, BROAD, EXACT) keeps to keyword-targeted traffic.
Related reading

Keep exploring organic vs paid keyword views

Use these companion guides to understand the inputs, follow-on analysis, and adjacent workflows behind this playbook.

Start here
Amazon Search Query Performance vs. Search Terms

Which report is which, and who can request each one, before you join any of them.

Also useful
The Agent Bidding Rulebook That Prevents Bid Thrash

Where a side-by-side organic and paid view feeds an actual bid rule.

FAQ

Can I calculate organic clicks on Amazon by subtracting ad clicks from Search Query Performance?

No. Search Query Performance counts impressions, clicks, cart adds and purchases per search query, and Amazon's schema doesn't split sponsored from organic activity. Subtracting ad clicks assumes the ad clicks are inside those counts, on the same window and the same ASINs, and none of that is documented.

Why are search terms missing from my Sponsored Products search term report?

The report includes only search terms that resulted in at least 1 ad click, so a query your ad showed on without a click never appears. Amazon Marketing Cloud's sponsored_ads_traffic carries customer_search_term on every impression, including users who didn't click.

How far back can I compare SQP with paid search term data?

The Amazon Ads API keeps Sponsored Products search term data for 65 days, with a 31-day maximum per request. AMC holds Sponsored Products keywords and search terms from the instance's creation date or 12.5 months back, whichever is sooner.

What week does Search Query Performance use?

A WEEK request must start on a Sunday and end on a Saturday, and a request can't span two periods. Set the AMC query's time window to the same Sunday-to-Saturday week before joining.

Why does my joined SQP and paid table show impossible numbers?

The join probably ran on raw rows. Paid rows repeat per campaign, keyword and match type, and SQP's total fields repeat on every ASIN row, so a raw join multiplies them. Aggregate each side to one row per search query and week, then join.

Can I compute ACoS for organic keywords?

No. ACoS (advertising cost of sales) needs ad spend. Search Query Performance has no ad spend or ad-attributed sales fields, so any cost or return ratio belongs to the paid columns only. SQP purchases and ad-attributed purchases are different counts and don't share a ratio.

Sources