<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Kuudo — Run real Amazon work from any AI client</title>
  <subtitle>Kuudo connects Amazon Ads, AMC, SP-API, and Vendor Central to ChatGPT, Claude, Cursor, and any MCP client so teams can run governed Amazon workflows from chat.</subtitle>
  <link href="https://www.kuudo.com/feed.xml" rel="self"/>
  <link href="https://www.kuudo.com/"/>
  <id>https://www.kuudo.com/</id>
  <updated>2026-08-20T00:00:00Z</updated>
  <author>
    <name>Kuudo</name>
  </author>
  
  <entry>
    <title>Launch a DSP Campaign Without Half-Built Entities</title>
    <link href="https://www.kuudo.com/guides/amazon-ads-create-dsp-campaign/"/>
    <id>https://www.kuudo.com/guides/amazon-ads-create-dsp-campaign/</id>
    <published>2026-08-20T00:00:00Z</published>
    <updated>2026-08-20T00:00:00Z</updated>
    <summary>Zero eligible DSP tactics is almost always a goal-KPI mismatch, not an outage. Create every entity paused, verify each write, then activate parent-first.</summary>
    <content type="html">&lt;p&gt;Launching a DSP (demand-side platform) Performance+ or Brand+ campaign end to end is one ordered write sequence: every write is read back before the next step depends on it, every entity is created paused, and activation runs parent-first. Our &lt;strong&gt;create-DSP-campaign Skill&lt;/strong&gt; runs that sequence through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt;, grounded by &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; where a retrieved rule decides what a step is even allowed to send, and it confirms real delivery in &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt;&#39;s DSP traffic tables rather than trusting a create response.&lt;/p&gt;
&lt;p&gt;The ask arrived as a Slack message on a Thursday: &lt;em&gt;&amp;quot;Can you spin up a Performance+ campaign for the Q4 ASINs? Display and streaming TV, five thousand dollars, starts Monday.&amp;quot;&lt;/em&gt; Straightforward request. The last time someone ran it by hand we ended up with a campaign that existed, ad groups that did not, and an activation call returning NOT_FOUND on an ad group the API had confirmed creating seconds earlier. Half-built and live is worse than not built at all, because the spend starts before anyone notices the gap.&lt;/p&gt;
&lt;p&gt;Why not just ask &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;ChatGPT or Claude&lt;/a&gt; to do it? A plain chat hits the same three walls on any Amazon job. It has &lt;strong&gt;no access to your data&lt;/strong&gt;, so it cannot resolve your DSP advertiser ID or ask Amazon which tactics your campaign is actually eligible for. It has &lt;strong&gt;no way to take action&lt;/strong&gt;, so it cannot create a campaign, create an ad group, or flip anything to ENABLED; the most it can do is hand you JSON to paste into an API client yourself. And it runs on &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt;, so it does not know that the inventory type you set on the campaign is spelled differently one level down. What you get is disconnected, generic, manual work that ships silent mistakes. The Amazon Ads MCP supplies your account plus the tools to act on it, &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; supply the ordered workflow, and Atlas supplies the rule book.&lt;/p&gt;
&lt;h2 id=&quot;create-every-entity-paused-and-read-each-write-back-before-anything-depends-on-it&quot; tabindex=&quot;-1&quot;&gt;Create every entity paused and read each write back before anything depends on it&lt;/h2&gt;
&lt;p&gt;Nothing in this workflow is born live. The campaign is created with &lt;code&gt;state: &amp;quot;PAUSED&amp;quot;&lt;/code&gt;, every ad group is created paused, and activation is a deliberate final step. That ordering is what makes a failure halfway through recoverable instead of expensive.&lt;/p&gt;
&lt;p&gt;The budget lives on the flight, not the campaign. There is no campaign-level budget field, so the single budget, start date, and end date the operator gave us map to one flight inside the campaign:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;Amazon-Ads-AccountId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;dspAdvertiserId&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;campaigns&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;adProduct&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AMAZON_DSP&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;DSP|PB|Campaign 2026-08-20_14-02-11&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;countries&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;US&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;PAUSED&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;flights&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;startDateTime&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-08-24T00:00:00Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;endDateTime&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2027-08-24T00:00:00Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;budget&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;budgetType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MONETARY&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;budgetValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token property&quot;&gt;&quot;monetaryBudgetValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;&quot;monetaryBudget&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5000&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;optimizations&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;bidSettings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;bidStrategy&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SPEND_BUDGET_IN_FULL&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;goalSettings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;kpi&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ROAS&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;primaryInventoryTypes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;DISPLAY&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;VIDEO_STV&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every datetime carries the &lt;code&gt;Z&lt;/code&gt; suffix because the API rejects naive datetimes outright.&lt;/p&gt;
&lt;p&gt;Then the part that turns this from racy into deterministic: the Skill does not move on. It waits 100 milliseconds, queries the campaign it just created, and retries up to three times at one-second intervals if the record is not visible yet. The Amazon Ads API v1 makes no read-after-write guarantee, so a create can return successfully and the very next call can fail to find what it created. Worst case this adds about 3.1 seconds per step, which is a fair trade against a half-built campaign.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT cannot query your account to find the DSP advertiser ID that every later call depends on. It will confidently leave you a &lt;code&gt;&amp;lt;dspAdvertiserId&amp;gt;&lt;/code&gt; placeholder, and you get to go find the real value yourself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Claude cannot create the campaign or read it back afterwards. If you paste its payload into an API client by hand, you also inherit the verification step, which means you are the one retrying on an eventually consistent API at the exact moment you thought you were done.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask where the budget goes and you will likely be told to put it on the campaign. There is no campaign-level budget field, so Amazon rejects that shape and you debug a payload that was wrong before you sent it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;zero-eligible-tactics-is-a-goal-kpi-mismatch-not-an-outage&quot; tabindex=&quot;-1&quot;&gt;Zero eligible tactics is a goal-KPI mismatch, not an outage&lt;/h2&gt;
&lt;p&gt;Once the campaign exists, ASIN conversion tracking gets attached: between 1 and 2,000 products per call, with a campaign ceiling of 500,000 products. Each entry carries the product ID, a domain derived as &lt;code&gt;AMAZON_&lt;/code&gt; plus the country code, and a product association of &lt;code&gt;FEATURED&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That step has to land before the next one is meaningful, and it gets its own verification read for a specific reason. Eligible tactics are computed asynchronously, and the recomputation has its own propagation lag on top of the products landing. So the Skill verifies the products are present, then re-queries the campaign for &lt;code&gt;eligibleAutomatedTargetingTactics&lt;/code&gt;, and retries three times at one-second intervals if the list comes back empty.&lt;/p&gt;
&lt;p&gt;When the list is still empty after retries, the cause is almost never an outage. It is that the campaign&#39;s goal KPI cannot produce the tactic you asked for:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tactic&lt;/th&gt;
&lt;th&gt;Compatible KPIs&lt;/th&gt;
&lt;th&gt;Goal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CUSTOMER_ACQUISITION (P+)&lt;/td&gt;
&lt;td&gt;ROAS&lt;/td&gt;
&lt;td&gt;Conversions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REMARKETING (P+)&lt;/td&gt;
&lt;td&gt;ROAS&lt;/td&gt;
&lt;td&gt;Conversions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RETENTION (P+)&lt;/td&gt;
&lt;td&gt;ROAS&lt;/td&gt;
&lt;td&gt;Conversions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MAXIMIZE_PERFORMANCE (P+)&lt;/td&gt;
&lt;td&gt;COST_PER_DETAIL_PAGE_VIEW, DETAIL_PAGE_VIEW_RATE&lt;/td&gt;
&lt;td&gt;Conversions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PROSPECTING (B+)&lt;/td&gt;
&lt;td&gt;REACH, FREQUENCY_AVERAGE, COST_PER_VIDEO_COMPLETION, VIDEO_COMPLETION_RATE&lt;/td&gt;
&lt;td&gt;Awareness&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ROAS there is return on ad spend, and the KPI is set back at campaign creation, which is why this failure surfaces two steps after the decision that caused it. Ask for Brand+ prospecting on a campaign built with a ROAS goal and the eligible list is empty, correctly, forever.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask ChatGPT why your eligible tactics list is empty and you get generic API troubleshooting: check your credentials, check your permissions, try again later. The actual answer is a compatibility table it has never seen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Claude cannot see that your campaign was created with a ROAS goal while you are asking for PROSPECTING, because it cannot read the campaign. You would have to know to paste that detail in, which means knowing the answer already.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; A chat cannot retry the eligibility query for you, so it cannot tell the difference between propagation lag and a permanent mismatch. Those two look identical in a single response and need opposite fixes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;the-ad-group-renames-the-inventory-type-the-campaign-just-used&quot; tabindex=&quot;-1&quot;&gt;The ad group renames the inventory type the campaign just used&lt;/h2&gt;
&lt;p&gt;This is the single most common rejection in the whole workflow, and it is pure API naming inconsistency rather than anything conceptual. The same inventory type has one spelling at the campaign level and another at the ad-group level:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Intent&lt;/th&gt;
&lt;th&gt;Campaign field&lt;/th&gt;
&lt;th&gt;Ad group field&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Display&lt;/td&gt;
&lt;td&gt;DISPLAY&lt;/td&gt;
&lt;td&gt;DISPLAY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Streaming TV&lt;/td&gt;
&lt;td&gt;VIDEO_STV&lt;/td&gt;
&lt;td&gt;STREAMING_TV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Online video&lt;/td&gt;
&lt;td&gt;VIDEO_OLV&lt;/td&gt;
&lt;td&gt;ONLINE_VIDEO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live events&lt;/td&gt;
&lt;td&gt;LIVE_EVENTS&lt;/td&gt;
&lt;td&gt;LIVE_EVENTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio&lt;/td&gt;
&lt;td&gt;AUDIO&lt;/td&gt;
&lt;td&gt;AUDIO&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The eligible-tactics response hands back campaign-level names, so the value you receive is not the value you send one call later. The Skill translates on the way through, which is exactly the kind of mechanical rule that should live in a workflow rather than in someone&#39;s memory.&lt;/p&gt;
&lt;p&gt;The second trap is the field allowlist. A Performance+ or Brand+ tactic ad group accepts six fields and nothing else:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;Amazon-Ads-AccountId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;dspAdvertiserId&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;adGroups&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;adProduct&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AMAZON_DSP&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;campaignId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;campaignId&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;DSP|PB|STREAMING_TV|CUSTOMER_ACQUISITION 2026-08-20_14-02-11&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;PAUSED&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;inventoryType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;STREAMING_TV&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;targetingSettings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;automatedTargetingTactic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;CUSTOMER_ACQUISITION&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bid, budgets, pacing, optimization, start and end times, creative rotation, viewability: all of them are auto-managed for tactic ad groups, and all of them are rejected if you send them. When this returns &lt;code&gt;INVALID_ARGUMENT&lt;/code&gt;, the fix is to strip fields, not to correct values. That distinction saves a long debugging session, because the error text reads like a validation failure on the values you did send.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask Claude to write the ad-group payload and it will helpfully include a bid and a budget, because that is what ad groups take everywhere else in advertising. Send that by hand and Amazon rejects the whole call.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT cannot read the eligible-tactics response, so it cannot know which inventory types came back for your campaign or that they need translating before you send them onward.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; A chat cannot create the ad group, so it cannot see the rejection and correct itself. You paste, you get INVALID_ARGUMENT, you paste the error back, and you iterate by hand against an API that is telling you something specific.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;activate-parent-first-or-the-ad-groups-fail-against-a-campaign-amazon-cannot-see&quot; tabindex=&quot;-1&quot;&gt;Activate parent-first, or the ad groups fail against a campaign Amazon cannot see&lt;/h2&gt;
&lt;p&gt;Activation is two moves in a fixed order: the campaign flips to &lt;code&gt;ENABLED&lt;/code&gt; first, then each ad group flips to &lt;code&gt;ENABLED&lt;/code&gt;. Never the reverse, and never in parallel.&lt;/p&gt;
&lt;p&gt;If the campaign fails to activate, the Skill stops and does not touch the ad groups at all. Activating children under a parent that is still paused produces either an outright failure or, worse, a confusing half-state where some entities are live and the thing that governs them is not. Reporting what did succeed is more useful than pushing on and leaving someone to reconstruct the order afterwards.&lt;/p&gt;
&lt;p&gt;This is also where the verification reads from every earlier step pay off. Activation immediately follows creation, and an update against a record the API cannot see yet is precisely how NOT_FOUND appears on an entity you watched get created.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Neither ChatGPT nor Claude can flip anything to ENABLED. The activation sequence is something you execute manually, in order, while remembering which ad group IDs came back from which create call.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; A chat cannot check whether the campaign actually reached ENABLED before you activate the ad groups, so it cannot stop you from creating the half-state it just advised you to avoid.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;And your data is now exposed.&lt;/strong&gt; To get a chat this far you have pasted advertiser IDs, campaign IDs, ASINs, and budget figures into a conversation history you do not control. The Skill never copies your account into a prompt; the MCP reads and writes over an authorized connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;confirm-delivery-in-the-dsp-tables-not-in-the-create-response&quot; tabindex=&quot;-1&quot;&gt;Confirm delivery in the DSP tables, not in the create response&lt;/h2&gt;
&lt;p&gt;A successful activation call means the entities are enabled. It does not mean a single impression has served. Those are different claims, and only one of them is what the operator actually asked for.&lt;/p&gt;
&lt;p&gt;Amazon Marketing Cloud carries three DSP traffic tables that answer the delivery question: &lt;code&gt;dsp_impressions&lt;/code&gt;, &lt;code&gt;dsp_views&lt;/code&gt;, and &lt;code&gt;dsp_clicks&lt;/code&gt;. They cover all Amazon DSP campaigns across ad product types including display, online video, streaming TV, and audio. &lt;code&gt;dsp_clicks&lt;/code&gt; is a subset of &lt;code&gt;dsp_impressions&lt;/code&gt; that captures the impressions that were clicked, so a campaign with rows in impressions and none in clicks is delivering and not being clicked, which is a very different problem from not delivering.&lt;/p&gt;
&lt;p&gt;The dimension that makes this readable per tactic is &lt;code&gt;line_item&lt;/code&gt;, which holds the name of the DSP line item responsible for the event, in the shape &lt;code&gt;&#39;Widgets - DISPLAY - O&amp;amp;O - RETARGETING&#39;&lt;/code&gt;. Amazon&#39;s own example encodes the inventory type and the tactic directly in that name, which is the same grain the Skill created against: one entity per inventory type and tactic pair. Read delivery at that grain and a tactic that never served shows up immediately instead of hiding inside a campaign total. Check how your own line item names resolve the first time you run it, because the create surface and the reporting surface are different systems and nothing guarantees the strings match. Attributed conversions are a separate question again, and come from &lt;code&gt;amazon_attributed_events&lt;/code&gt; rather than the traffic tables.&lt;/p&gt;
&lt;p&gt;One caveat worth knowing before you panic at an empty result. The DSP traffic tables contain inputs only from the DSP advertising accounts that have been added to that Marketing Cloud instance. A campaign can be delivering perfectly and still return nothing if its advertiser was never added.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT cannot query your Marketing Cloud instance, so it cannot tell you whether your new campaign delivered. It can only describe what DSP reporting generally looks like.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask Claude why your instance returns no DSP rows and it will suggest a date range or a typo. The real answer, that the advertiser account was never added to the instance, is instance configuration it cannot see and has no reason to guess.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; A chat cannot run the check on a schedule, so nobody finds out that a tactic never delivered until someone thinks to look.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;The launch is the easy half. What makes it durable is that the whole sequence is a &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; rather than a runbook, so it re-runs the same way for the next campaign, and the delivery check re-runs on a schedule instead of when someone remembers. The &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt; is what turns that check into something standing: the DSP tables land next to the rest of your Amazon data, alongside the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; pulls behind your catalog and order history, so a per-tactic delivery question is a query rather than a project.&lt;/p&gt;
&lt;p&gt;The decision rule we run on is simple. Give a tactic a defined window after activation, then check &lt;code&gt;line_item&lt;/code&gt; delivery. A tactic with no impressions in that window is not a slow start, it is a signal to look at eligibility and inventory rather than to wait longer. A tactic delivering impressions with no clicks is a creative problem, not a targeting one, and those two findings route to different people.&lt;/p&gt;
&lt;p&gt;Once the campaign has enough delivery to compare against everything else running, the next question is usually how much of it is incremental rather than overlapping what your sponsored ads already reached.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next: the &lt;a href=&quot;https://www.kuudo.com/guides/amc-sponsored-ads-dsp-overlap-4way/&quot;&gt;four-way sponsored ads and DSP overlap audit&lt;/a&gt;, which measures exactly that.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>The Data-Mode Router That Stops Bad ACoS Math</title>
    <link href="https://www.kuudo.com/guides/rules-data-mode-router/"/>
    <id>https://www.kuudo.com/guides/rules-data-mode-router/</id>
    <published>2026-08-07T00:00:00Z</published>
    <updated>2026-08-07T00:00:00Z</updated>
    <summary>Your SQP export has no cost column. Atlas blocks ACoS there and routes to Conversion Performance Index instead, the fix for nonsense report numbers.</summary>
    <content type="html">&lt;p&gt;The nonsense ACoS numbers show up because your SQP export has no cost or revenue columns in it, and Amazon&#39;s own export doesn&#39;t flag that gap for you, nothing in the raw Ads or Selling Partner APIs tags a dataset as ads-backed or organic. Any report that hands you ACoS anyway skipped a check our &lt;strong&gt;data-mode-router Skill&lt;/strong&gt; runs before every metric: a reusable, structured process, grounded by &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;&#39;s Keyword Analysis Decision Framework, that inspects the columns actually present in a dataset before it lets ACoS, ROAS (return on ad spend), or any spend-based number get computed. I asked our agent why a batch of n-gram reports kept returning ACoS on exports that never carried a spend column, and the answer was structural, not a bug. The Skill tags every dataset &lt;code&gt;ads&lt;/code&gt;, &lt;code&gt;organic&lt;/code&gt;, or &lt;code&gt;mixed&lt;/code&gt; from its column set and hard-blocks ACoS/ROAS outside &lt;code&gt;ads&lt;/code&gt;-backed data. Search Query Performance exports, pulled through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt;, are organic by construction. There&#39;s no spend column in there to blend.&lt;/p&gt;
&lt;p&gt;Why not just paste that export into &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;ChatGPT or Claude&lt;/a&gt; and ask for ACoS? A plain chat hits the same three walls on any Amazon job. It has &lt;strong&gt;no access to your data&lt;/strong&gt;, so it only sees the columns you pasted and can&#39;t check whether &lt;code&gt;total_median_click_price&lt;/code&gt; is real spend or a market proxy. It has &lt;strong&gt;no way to take action&lt;/strong&gt;, so the best it can do is hedge in prose instead of blocking the computation outright. And it runs on &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt;, so it has no idea ACoS in organic mode is a codified Amazon violation. What you get is disconnected, generic, manual work that ships silent mistakes. &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; and the Selling Partner MCP give an agent your data and the tools to act, Atlas supplies the rule book, &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; packages the workflow.&lt;/p&gt;
&lt;h2 id=&quot;the-router-tags-every-dataset-ads-organic-or-mixed-before-a-metric-runs&quot; tabindex=&quot;-1&quot;&gt;The router tags every dataset ads, organic, or mixed before a metric runs&lt;/h2&gt;
&lt;p&gt;Before our agent computes anything, the data-mode-router Skill runs its Quick Router logic to look at which columns a dataset actually has. This step doesn&#39;t exist in the raw Amazon data, it&#39;s the Skill applying Atlas&#39;s codified rules as a structured process, the same way every time. Ad signals are cost or spend, &lt;code&gt;campaign_id&lt;/code&gt;, &lt;code&gt;ad_group_id&lt;/code&gt;, keyword, match type, placement, the columns that exist because the Amazon Ads MCP mirrors those fields straight out of your live account, not because someone typed labels into a spreadsheet. Organic signals are &lt;code&gt;search_query&lt;/code&gt;, &lt;code&gt;total_impressions&lt;/code&gt;, &lt;code&gt;asin_impression_share&lt;/code&gt;, and the rest of the Search Query Performance schema. If a dataset has ad signals and no organic ones, it&#39;s tagged &lt;code&gt;ads&lt;/code&gt;. If it has organic signals and no ad ones, like every SQP export, it&#39;s tagged &lt;code&gt;organic&lt;/code&gt;. Both together, it&#39;s &lt;code&gt;mixed&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That tag isn&#39;t a note in a log somewhere, it&#39;s the first field on every record the Skill emits. Here&#39;s what an ads-mode row looks like coming out of the n-gram rollup:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;data_mode&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;ngram&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wireless headset&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;imp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12450&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;clk&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;386&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;cost&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;782.14&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;orders&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;41&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;revenue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4312.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;metrics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;ctr&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.031&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;cvr&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.1061&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;cpc&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.027&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;roas&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5.514&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;acos&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.181&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice &lt;code&gt;data_mode&lt;/code&gt; comes before the metrics that depend on it, not after. This is also the point where the router&#39;s job ends and a different rulebook picks up. Once a keyword resolves to &lt;code&gt;ads&lt;/code&gt;, whether to actually change a bid on it is a separate question, governed by a different Quick Router keyed on &lt;code&gt;bidding_state&lt;/code&gt;, not &lt;code&gt;data_mode&lt;/code&gt;, over in the Sponsored Ads Bidding Configuration Decision Framework. The &lt;code&gt;data_mode&lt;/code&gt; router decides what a signal even means. That framework decides whether to act on it.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; You paste one export into ChatGPT or Claude, and that&#39;s the only schema they&#39;ll ever see, neither one has a standing check that would catch you accidentally blending two different report exports into a single paste.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Even when ChatGPT or Claude correctly guesses &amp;quot;this looks like SQP,&amp;quot; you get a sentence back, not a machine-readable &lt;code&gt;data_mode&lt;/code&gt; field your dashboard or next automation step can route on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask ChatGPT or Claude why a column belongs to &amp;quot;ads&amp;quot; versus &amp;quot;organic&amp;quot; and you get a plausible guess built from header names, not the actual Amazon report taxonomy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;acos-in-organic-mode-isnt-a-style-nitpick-its-priority-1-forbidden&quot; tabindex=&quot;-1&quot;&gt;ACoS in organic mode isn&#39;t a style nitpick, it&#39;s priority #1 forbidden&lt;/h2&gt;
&lt;p&gt;Our data-mode-router Skill doesn&#39;t treat &amp;quot;don&#39;t compute ACoS on organic data&amp;quot; as a soft preference, it enforces it as code, every run. It&#39;s rule one of seven in the decision-precedence ladder the Skill applies, grounded by Atlas, ranked above thin-data holds, safety negatives, pull-back actions, scale moves, and mining or hygiene work. Invalid computations get dropped and repaired before any other business rule even gets evaluated. Nothing outranks it, and nothing in Amazon&#39;s own reporting enforces this ranking for you.&lt;/p&gt;
&lt;p&gt;The Skill&#39;s config defaults reinforce the same rule structurally, not just procedurally: &lt;code&gt;target_acos&lt;/code&gt;, &lt;code&gt;target_roas&lt;/code&gt;, and &lt;code&gt;break_even_acos&lt;/code&gt; only exist under the ads branch of the targets config. There&#39;s no organic branch for an ACoS target to live in, because organic data was never going to have spend to target against. Those same three constants (0.25, 4.0, 0.30 in our defaults) are actually anchored at the ad-group level by the Sponsored Ads Bidding Configuration Decision Framework mentioned above, the data-mode-router Skill just reads them, it doesn&#39;t own them.&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;precedence&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; invalid_computation   &lt;span class=&quot;token comment&quot;&gt;# drop/repair, e.g. ACoS computed in organic mode&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hold_thin_data
  &lt;span class=&quot;token key atrule&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; safety_negative
  &lt;span class=&quot;token key atrule&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pull_back
  &lt;span class=&quot;token key atrule&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; scale_unlock
  &lt;span class=&quot;token key atrule&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mining_hygiene
  &lt;span class=&quot;token key atrule&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; creative_ops
&lt;span class=&quot;token key atrule&quot;&gt;targets&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ads&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;target_acos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.25&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;target_roas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4.0&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;break_even_acos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.30&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# organic has no target_acos / target_roas key at all&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT and Claude can&#39;t verify whether the &amp;quot;cost&amp;quot; or &amp;quot;revenue&amp;quot; figure you pasted is real ad spend or a market estimate, they have no route into your account data to check its provenance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; ChatGPT or Claude can warn you in a sentence, but they can&#39;t drop the computation and substitute a repair action the way a rule ranked above every other business rule does.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; ChatGPT and Claude have no concept of &amp;quot;ACoS in organic mode is an invalid computation, priority one.&amp;quot; That&#39;s a severity ranking our Skill enforces, grounded in real Amazon operational patterns, and neither one can derive it from the ACoS formula alone.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;mixed-data-doesnt-get-blended-into-one-number-it-gets-split-into-two&quot; tabindex=&quot;-1&quot;&gt;Mixed data doesn&#39;t get blended into one number, it gets split into two&lt;/h2&gt;
&lt;p&gt;Some exports carry both column families at once, a keyword report joined against a campaign report, say. When that happens, the Skill&#39;s mixed-dataset guardrail doesn&#39;t average the two into one blended figure. It computes ads metrics only where ads-backed cost and revenue actually exist, applies organic rules only to signals backed by SQP, and emits two separate records for the same keyword, each carrying its own &lt;code&gt;data_mode&lt;/code&gt; tag, with no cross-mixing of numerators and denominators between them.&lt;/p&gt;
&lt;p&gt;For &amp;quot;wireless headset,&amp;quot; that looks like this:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;data_mode&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;ngram&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wireless headset&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;imp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12450&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;clk&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;386&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;cost&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;782.14&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;orders&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;41&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;revenue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4312.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;metrics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;ctr&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.031&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;cvr&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.1061&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;cpc&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.027&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;roas&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5.514&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;acos&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.181&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;data_mode&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;organic&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;ngram&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wireless headset&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;search_query&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wireless headset&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;total_impressions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;58210&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;total_clicks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1904&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;conversion_performance_index&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;96&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;share_funnel_gaps&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;impression_to_click_gap_pp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-0.4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;click_to_purchase_gap_pp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.6&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two records, two tags, nothing shared between their numerators and denominators. The alternative, one blended row with an ACoS computed against a mix of real spend and organic volume, is exactly the invalid computation rule one exists to catch.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; You&#39;d have to manually label which rows in a combined export are ads-backed and which are organic-backed, ChatGPT and Claude have no cross-reference to your actual campaign IDs to do it for you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Ask ChatGPT or Claude to &amp;quot;split this out&amp;quot; and you get a one-time answer for that message, next week&#39;s paste starts from zero with no consistency guarantee across reports.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; The generic instinct is to hand you one clean, helpful number per keyword. ChatGPT and Claude don&#39;t know Amazon operational convention treats that single blended number as the invalid output, not the goal.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;organic-mode-routes-to-conversion-performance-index-not-acos&quot; tabindex=&quot;-1&quot;&gt;Organic mode routes to Conversion Performance Index, not ACoS&lt;/h2&gt;
&lt;p&gt;Blocking ACoS on organic data is only half the rule, the Skill also has to route to something valid, and for &lt;code&gt;organic&lt;/code&gt; that&#39;s Conversion Performance Index and the impression-to-click-to-purchase share funnel. Neither is a field Amazon&#39;s Search Query Performance report gives you directly, the Skill calculates both from the shares Amazon does report. CPI is &lt;code&gt;(your_purchase_rate / market_purchase_rate) x 100&lt;/code&gt;, banded under 80 as underperforming, 80 to 120 as competitive, and above 120 as outperforming. Alongside it, &lt;code&gt;impression_to_click_gap_pp&lt;/code&gt; and &lt;code&gt;click_to_purchase_gap_pp&lt;/code&gt; show exactly where your ASIN is losing share against the market baseline for that query.&lt;/p&gt;
&lt;p&gt;Below the CPI sufficiency floor (&lt;code&gt;asin_clicks &amp;gt;= 20&lt;/code&gt; and &lt;code&gt;total_clicks &amp;gt;= 100&lt;/code&gt;), the Skill holds the decision instead of guessing on thin data. The ASIN-level diagnostic layer downstream adds its own floor (&lt;code&gt;total_impressions &amp;gt;= 200&lt;/code&gt;) before it turns a share gap into a strong claim, and cooldowns run 7 to 14 days per query and ASIN so the same finding doesn&#39;t refire every day. Here&#39;s a full routed decision for one query, including the guardrail check that blocked ACoS on the way in:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;report_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sqp-ngram-2026-08-07&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;routing&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;columns_detected&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;search_query&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;total_impressions&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;total_clicks&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;asin_impression_share&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;asin_click_share&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;asin_purchase_share&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;total_median_click_price&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;ads_signals_present&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;organic_signals_present&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;resolved_data_mode&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;organic&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;guardrail_checks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;rule&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;invalid_computation&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;precedence_rank&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;trigger&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ACoS/ROAS requested but data_mode=organic (no cost/spend columns)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;result&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blocked&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;drop_and_repair&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;repair&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;substitute Conversion Performance Index + share funnel gaps&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;decisions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;data_mode&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;organic&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;search_query&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dog bed large&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;asin&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;B00XYZ...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;market&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;total_impressions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;123456&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;total_clicks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3456&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;purchase_rate&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.018&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;asin_metrics&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;impression_share&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.024&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;click_share&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.031&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;purchase_share&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.020&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;conversion_performance_index&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;64.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;share_funnel_gaps&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;impression_to_click_gap_pp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;click_to_purchase_gap_pp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-1.1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;thin_data&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;recommendations&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;pdp_update&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A CPI of 64.5 lands below 80, underperforming the market, which is exactly why &lt;code&gt;recommendations&lt;/code&gt; queues &lt;code&gt;pdp_update&lt;/code&gt; rather than a bid change. Behind that field sits the ASIN-level diagnostic layer, running its own IF-THEN rules on top of the share funnel: high query volume with low impression share routes to &lt;code&gt;seo_update&lt;/code&gt; plus &lt;code&gt;pdp_update&lt;/code&gt;, purchase share trailing click share alongside slow shipping routes to &lt;code&gt;shipping_speed_fix&lt;/code&gt;. ACoS was never going to point you at any of that.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; CPI needs a market denominator, total purchases over total clicks across every seller on that query. ChatGPT and Claude only have what you pasted, they can&#39;t hold that baseline steady from one report to the next.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Even if ChatGPT or Claude computes CPI once in chat, neither can enforce your data-sufficiency floor or turn a share-gap into a queued &lt;code&gt;pdp_update&lt;/code&gt;, you&#39;re back to opening a ticket by hand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask &amp;quot;how&#39;s my organic doing&amp;quot; and ChatGPT and Claude both gravitate back toward ACoS, because neither one knows a metric built for this exact dataset already exists.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;When I run this against a fresh batch of reports, our agent doesn&#39;t just resolve &lt;code&gt;data_mode&lt;/code&gt;, fire the guardrail check, and hand back a JSON blob to stop there. It pushes the routed decision into &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Flow&lt;/a&gt;, the data layer that holds routed decisions alongside the raw SP-API (Selling Partner API) and Ads API pulls they came from, so next week&#39;s report starts from the same schema instead of guessing again. The recommendation it queued, &lt;code&gt;pdp_update&lt;/code&gt;, &lt;code&gt;seo_update&lt;/code&gt;, &lt;code&gt;shipping_speed_fix&lt;/code&gt;, becomes a scheduled run of the same Skill that reruns on the 7-to-14-day cooldown instead of a one-off answer you have to remember to ask for again.&lt;/p&gt;
&lt;p&gt;If the resolved mode had come back &lt;code&gt;ads&lt;/code&gt; instead, the same decision hands off to a different ladder entirely, applied by a different Skill: the bid-thrash precedence covered in &lt;a href=&quot;https://www.kuudo.com/guides/rules-agent-bidding-rulebook/&quot;&gt;the bidding rulebook guide&lt;/a&gt;, which decides whether to actually move a bid once the signal underneath it is already confirmed valid. The data-mode-router Skill decides what a number means. The bidding rulebook&#39;s Skill decides what to do about it once it does.&lt;/p&gt;
&lt;p&gt;That&#39;s the pattern underneath the whole rulebook: validate the signal before you ever act on it, structured Skill logic doing work Amazon&#39;s raw reports never do on their own, and never let the two ladders answer each other&#39;s questions.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next in the series: how the ASIN-level diagnostic decision object turns a Conversion Performance Index gap into a queued PDP or SEO fix.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Auditing FBA Reimbursements: What Amazon Owes You</title>
    <link href="https://www.kuudo.com/guides/seller-fba-reimbursement-audit/"/>
    <id>https://www.kuudo.com/guides/seller-fba-reimbursement-audit/</id>
    <published>2026-08-07T00:00:00Z</published>
    <updated>2026-08-07T00:00:00Z</updated>
    <summary>The reimbursement portal lists events but never classifies, window-checks, or values them. A Skill audits every event against three windows, two rules.</summary>
    <content type="html">&lt;p&gt;Grounded by &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;, the &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;fba-reimbursement-audit Skill&lt;/a&gt; is what actually answers &amp;quot;how much in FBA (Fulfillment by Amazon) loss and damage reimbursements has Amazon already paid us, and how much are we missing,&amp;quot; because Amazon&#39;s own Inventory Defect and Reimbursement portal can&#39;t: it lists individual defect events across its Eligible, In Progress, and Resolved tabs, but it never classifies an event into a claim type, checks it against that type&#39;s own window, or applies the correct valuation rule. I went looking for this number after our reconciliation spreadsheet fell three months behind the portal. Once I asked our agent to pull every eligible event through &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt;, classify it, and check it against Amazon&#39;s actual policy, the picture changed: real money sitting unclaimed, and real deadlines closing on it.&lt;/p&gt;
&lt;p&gt;Before building anything, I asked &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;ChatGPT and Claude&lt;/a&gt; the same question. Both hit the same three walls: &lt;strong&gt;no access to your data&lt;/strong&gt; (they&#39;ve never seen our Inventory Defect and Reimbursement portal or Ledger report), &lt;strong&gt;no way to take action&lt;/strong&gt; (they can&#39;t file a claim or submit a sourcing cost), and &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt; specific rules (they default to textbook reimbursement logic, not FBA policy). The answer stayed a guess. MCP supplies the data and the tools to act, Atlas supplies the cited rule book, the Skill runs the workflow safely.&lt;/p&gt;
&lt;h2 id=&quot;a-loss-or-damage-event-isnt-one-claim-its-three-claim-types-with-three-different-windows&quot; tabindex=&quot;-1&quot;&gt;A loss or damage event isn&#39;t one claim, it&#39;s three claim types with three different windows&lt;/h2&gt;
&lt;p&gt;Every lost or damaged unit Amazon owes us for falls into one of three claim types, and each type carries its own deadline, not a shared one. Shipment to Amazon claims (units lost or damaged in transit to a fulfillment center or third-party facility) have to be filed no later than nine months after the verified delivery date. Fulfillment Center Operations claims (units lost or damaged inside Amazon&#39;s own operations) have to be filed no later than sixty days after the item was reported lost or damaged in the Inventory Defect and Reimbursement portal or the Inventory Ledger report. Customer Return claims are the one most sellers get wrong: file no sooner than sixty days and no later than 120 days after the refund or replacement, a window with a floor as well as a ceiling.&lt;/p&gt;
&lt;p&gt;Classifying comes first. The Skill sorts every raw defect and return event by type, then computes each one&#39;s window status, open, closing soon, or expired, as a flagged field in the audit report. That&#39;s the step the portal skips: it&#39;ll show an event happened, but it won&#39;t say which of the three clocks is running on it, let alone how many days are left.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;event_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;EVT-00113&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;classified_claim_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fulfillment_center_operations&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;reported_date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-06-12&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;window&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;end&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-08-11&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;closing_soon&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;days_remaining&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Ask ChatGPT which of your events is approaching deadline and you&#39;re the one pasting them in, and you&#39;d already need to know which of the three windows applies before it can check the math.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Even a correct window calculation from Claude doesn&#39;t file anything for you. You still have to go into Seller Central and submit the claim before it closes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask either one for &amp;quot;the reimbursement deadline&amp;quot; and you&#39;re as likely to get one universal answer as three separate ones, with no particular reason to know the customer-return window has a sixty-day floor, not just a limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;eligibility-isnt-a-spectrum-its-seven-gates-that-all-have-to-hold&quot; tabindex=&quot;-1&quot;&gt;Eligibility isn&#39;t a spectrum, it&#39;s seven gates that all have to hold&lt;/h2&gt;
&lt;p&gt;Amazon doesn&#39;t reimburse partial eligibility. A unit has to be FBA-registered at the time of loss, compliant with FBA restrictions, shipped in the exact quantities on the shipping plan, part of a shipment that wasn&#39;t canceled or deleted, not pending or actioned for disposal, not customer-damaged or defective, and tied to an account that stays in normal status all the way through the claim and any appeal. Seven gates, and every single one has to be true. Fail one and the claim is void, no matter what the item was worth.&lt;/p&gt;
&lt;p&gt;The Skill checks all seven gates automatically before an event counts toward the &amp;quot;recoverable&amp;quot; total, splitting the result into eligible-and-unclaimed versus ineligible, and naming the specific gate that failed on each ineligible event instead of just marking it &amp;quot;no.&amp;quot; That distinction matters when we&#39;re deciding whether to spend appeal time on a claim that was never going to qualify.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT can recite the seven rules from memory, but ChatGPT can&#39;t check your actual account status, your shipping-plan quantities, or whether a given shipment was canceled.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; If your account drops out of normal status while a claim is under review, the claim voids, and Claude has no visibility into your account health to warn you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; It&#39;s easy to assume &amp;quot;lost is lost.&amp;quot; Ask ChatGPT and it&#39;s unlikely to flag that a disposal-pending or customer-damaged item is excluded categorically, no matter how clearly the loss was Amazon&#39;s fault otherwise.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;valuation-depends-on-when-the-loss-happened-not-what-the-item-is-worth&quot; tabindex=&quot;-1&quot;&gt;Valuation depends on when the loss happened, not what the item is worth&lt;/h2&gt;
&lt;p&gt;Pre-order events pay differently than post-order ones, and that split runs through every lost unit on the sheet. Shipment-to-Amazon losses, removals, and fulfillment center operations events pay our sourcing cost: what we paid to source the unit, not what we&#39;d have sold it for. Customer return events pay the refund or replacement amount minus applicable fees instead. Either way, $5,000 per unit is the ceiling: Amazon caps a single unit&#39;s reimbursement at that amount regardless of which of the two rules set the value. Most sellers, including me before I looked closely, mentally price every lost unit at retail. The policy doesn&#39;t work that way, and the gap between the two numbers is where the missed money hides.&lt;/p&gt;
&lt;p&gt;Inside the Skill, the valuation engine applies the correct rule per event based on its classified claim type, and for every pre-order event it checks whether we&#39;ve actually submitted our own sourcing cost or whether Amazon is still defaulting to its own estimate. The audit report shows both numbers side by side, Amazon&#39;s likely valuation against our sourcing-cost-corrected valuation, with the $5,000 cap applied wherever it binds.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;artifact_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;audit_report&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;skill&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fba-reimbursement-audit&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;grounded_by&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amazon-agent-atlas&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;summary&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;events_audited&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;214&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;reimbursed_total_usd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8420.15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;eligible_unclaimed_total_usd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1180.40&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;at_risk_window_closing_usd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;340.00&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;disputable_valuation_total_usd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;265.75&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;events&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;event_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;EVT-00113&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;classified_claim_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fulfillment_center_operations&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;order_relationship&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pre_order&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;valuation&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;rule_applied&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sourcing_cost&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;sourcing_cost_submitted&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;amazon_estimate_usd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14.20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;unit_cap_usd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5000&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eligible_not_filed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;window_closes_in_4_days&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sourcing_cost_not_submitted&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;event_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;EVT-00087&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;classified_claim_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;customer_return&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;order_relationship&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;post_order&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;valuation&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;rule_applied&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;refund_minus_fees&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;refund_amount_usd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;42.00&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;fees_deducted_usd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6.30&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;reimbursement_actual&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;issued&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;amount_usd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30.00&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;variance_vs_expected_usd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-5.70&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;disputable&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;eligible_for_valuation_dispute&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT doesn&#39;t know your actual sourcing cost, your actual refund amounts, or which events were pre-order versus post-order.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Even when Claude correctly says &amp;quot;this should be sourcing cost, not retail,&amp;quot; you still have to go submit the figure on the Manage Your Sourcing Cost page yourself and validate it if Amazon asks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; ChatGPT&#39;s training-data instinct says reimbursement equals what you&#39;d have made on the sale, and without the policy text right in front of ChatGPT, it will confidently give you the wrong valuation logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;reimbursement-isnt-a-one-shot-event-its-a-loop-most-sellers-never-run&quot; tabindex=&quot;-1&quot;&gt;Reimbursement isn&#39;t a one-shot event, it&#39;s a loop most sellers never run&lt;/h2&gt;
&lt;p&gt;Getting paid once isn&#39;t the end of it. There&#39;s a recovery loop layered on top of the three windows and seven gates: submitting our own sourcing cost instead of accepting Amazon&#39;s estimate, respecting the thirty-day cooldown before resubmitting without new information, disputing a valuation within sixty days of an issued reimbursement, and handling the customer-return special case correctly. If a customer is refunded but never returns the item to a fulfillment center within sixty days, Amazon typically charges the customer and reimburses us. If the item does come back within sixty days and it&#39;s sellable, it goes back into inventory and we get no reimbursement. If it comes back unsellable and Amazon caused the damage, we get reimbursed and the item isn&#39;t restocked.&lt;/p&gt;
&lt;p&gt;Tracking doesn&#39;t stop at filing. The Skill follows every event&#39;s reimbursement status across its full lifecycle, not just at the moment a claim gets filed, flagging &amp;quot;sourcing cost not yet submitted,&amp;quot; &amp;quot;eligible for valuation dispute, window closes in nine days,&amp;quot; and &amp;quot;resubmission blocked until August 20th, no new information supplied,&amp;quot; so the backlog of things we could still do doesn&#39;t quietly age out.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Neither ChatGPT nor Claude knows which of your reimbursements were already issued, on what date, at what amount, or which ones are still inside their sixty-day dispute window.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Filing the dispute, submitting sourcing-cost documentation, or waiting out the thirty-day cooldown are all Seller Central actions. Claude can draft the dispute language, but it can&#39;t track the clock or click submit for you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; The sellable-versus-unsellable branching logic on customer returns is easy to get backwards from memory. Ask ChatGPT and it&#39;s as likely to say &amp;quot;you get reimbursed either way&amp;quot; as to correctly explain that a sellable return within sixty days forfeits reimbursement entirely.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Once the audit report is built, it doesn&#39;t sit still. We feed it into &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Flow&lt;/a&gt;, the same data layer that holds &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; and Selling Partner MCP pulls side by side, so recovered reimbursement dollars sit next to the ad spend they help offset. The Skill schedules the same pass weekly and hands off anything newly flagged: a window closing inside seven days, a sourcing cost still unsubmitted, a dispute that just opened, so it shows up as a task instead of a line buried in a spreadsheet.&lt;/p&gt;
&lt;p&gt;Recovery is only half the ledger. The other half, what we pay out rather than what Amazon owes back, is covered in the &lt;a href=&quot;https://www.kuudo.com/guides/seller-fba-inventory-health-post-2024/&quot;&gt;FBA inventory health guide&lt;/a&gt;: storage fees, capacity limits, aged-inventory surcharges. Running both audits is how we see the full ledger instead of half of it.&lt;/p&gt;
&lt;p&gt;Same pattern every time: Amazon publishes the rule, leaves the classifying and window-checking to the seller, and pays out only what gets claimed correctly and on time.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next in the series: what happens when Amazon denies a valid claim outright, and the appeal window most sellers let expire.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>The ARA Report and Metric Glossary for Vendors</title>
    <link href="https://www.kuudo.com/guides/vendor-ara-reports-metric-glossary/"/>
    <id>https://www.kuudo.com/guides/vendor-ara-reports-metric-glossary/</id>
    <published>2026-08-07T00:00:00Z</published>
    <updated>2026-08-07T00:00:00Z</updated>
    <summary>Every ARA dashboard maps to an SP-API report type. Amazon&#39;s own docs define Conversion two ways on one page; a Skill routes the question and flags it.</summary>
    <content type="html">&lt;p&gt;The ARA report router &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt;, grounded by &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;, is what actually answers which ARA report answers a given question, and what the metric inside it actually measures. Amazon&#39;s Vendor Central UI doesn&#39;t do that: it hands you a dashboard tab. Raw SP-API (Selling Partner API) reports don&#39;t do it either: they hand you a payload full of fields, not an interpretation of which field you needed or what its number means. I run into this constantly. Someone on my team asks why sell-through dropped, or what &amp;quot;Conversion&amp;quot; means in the export we&#39;re staring at, and the honest answer depends on which report, which account view, and which section of Amazon&#39;s own help docs you&#39;re reading, not on which tab happened to be open when you logged in.&lt;/p&gt;
&lt;p&gt;Why not just ask &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;ChatGPT or Claude&lt;/a&gt; the same question? A plain chat hits the same three walls on any Amazon job. It has &lt;strong&gt;no access to your data&lt;/strong&gt;, so neither knows if your login has Sourcing or Manufacturing view, or whether you&#39;re Brand Registry enrolled, and can&#39;t name your dashboard. It has &lt;strong&gt;no way to take action&lt;/strong&gt;, so neither can call SP-API to verify a report type actually exists. And it runs on &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt;, so the answer is uncited and primed to ship a silent mistake. What you get is disconnected, generic, manual work. MCP is your data and the tools to act, Atlas is the cited rule book, the Skill is the safe workflow.&lt;/p&gt;
&lt;h2 id=&quot;every-ara-dashboard-has-a-mirrored-sp-api-report-type-so-naming-the-dashboard-is-only-half-the-job&quot; tabindex=&quot;-1&quot;&gt;Every ARA dashboard has a mirrored SP-API report type, so naming the dashboard is only half the job&lt;/h2&gt;
&lt;p&gt;Sales maps to &lt;code&gt;GET_VENDOR_SALES_REPORT&lt;/code&gt;. Inventory maps to &lt;code&gt;GET_VENDOR_INVENTORY_REPORT&lt;/code&gt;. Forecasting maps to &lt;code&gt;GET_VENDOR_FORECASTING_REPORT&lt;/code&gt;. Traffic maps to &lt;code&gt;GET_VENDOR_TRAFFIC_REPORT&lt;/code&gt;. Net PPM maps to &lt;code&gt;GET_VENDOR_NET_PURE_PRODUCT_MARGIN_REPORT&lt;/code&gt;. Knowing the dashboard name gets you nowhere near an API call, and knowing a report type string with no dashboard context doesn&#39;t tell you which metric definition governs it. The ARA report router Skill resolves both in a single lookup, calling through &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; to fetch the report once it knows which one you actually need.&lt;/p&gt;
&lt;p&gt;When I asked our agent why sell-through dropped on a set of ASINs, the Skill didn&#39;t guess. It resolved the question to the Inventory dashboard, the &lt;code&gt;GET_VENDOR_INVENTORY_REPORT&lt;/code&gt; report type, and the &lt;code&gt;sellThroughRate&lt;/code&gt; field inside it, then pulled the report through the same call path. It&#39;s also the reason the Skill catches a retirement most operators don&#39;t think to check: the Sales and Inventory EDI transactions (X12 852, EDIFACT SLSRPT) and the Forecast EDI transaction (X12 830, EDIFACT DELFOR) were retired after June 30, 2022, so API is now required to pull them. Traffic and Net PPM never had an EDI form at all; they&#39;ve been API-only from day one. If the question resolves to Net PPM specifically, that&#39;s where &lt;a href=&quot;https://www.kuudo.com/guides/vendor-net-ppm-margin-leakage/&quot;&gt;the margin-leakage guide&lt;/a&gt; picks up. This guide is upstream of it: once the router names the dashboard and the report type, that guide is where you go hunting for the actual leak.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;operator_question&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Which report do I pull to find products dragging my margin?&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;resolution&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;dashboard&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Net PPM&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;sp_api_report_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GET_VENDOR_NET_PURE_PRODUCT_MARGIN_REPORT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;view_required&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;manufacturing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;metric&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Net pure product margin (Net PPM)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;definitions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;formula&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;(shipped revenue - shipped PCOGS + CCOGS - sales discounts) / shipped revenue&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;cited_section&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Net PPM dashboard&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;conflicting_definition&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;caveat_flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;excludes_warehouse_deals&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;manufacturer_only_dashboard&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge.&lt;/strong&gt; Ask ChatGPT or Claude which SP-API report matches a dashboard and you&#39;ll often get retired EDI-era vocabulary back, because that&#39;s what dominates older training data, not the current API-first framing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; ChatGPT or Claude can describe a report type name in prose, but neither can verify the literal enum string against Amazon&#39;s schema or confirm it against a live call on your account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT or Claude doesn&#39;t know whether your integration is still EDI-based or already migrated to API, so neither can tell you if the 2022 retirement even applies to your account.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;ara-and-aba-are-different-products-gated-by-different-rules-so-i-cant-find-my-dashboard-means-two-different-problems&quot; tabindex=&quot;-1&quot;&gt;ARA and ABA are different products gated by different rules, so &amp;quot;I can&#39;t find my dashboard&amp;quot; means two different problems&lt;/h2&gt;
&lt;p&gt;Every vendor gets ARA. No Brand Registry requirement, no enrollment gate, it&#39;s part of the vendor relationship. ABA, Amazon Brand Analytics, is a different product entirely: it requires Brand Registry enrollment and being the brand-selling party on the ASINs in question. Before the Skill routes an operator&#39;s question to a dashboard, it classifies the question against those access rules first, so it doesn&#39;t send you looking for a dashboard your account structurally cannot have.&lt;/p&gt;
&lt;p&gt;Beyond the access gate, the two products measure different things entirely. ABA&#39;s Search feature covers search popularity, click share, and conversion share for a search term. Its market basket analysis shows co-purchased products. Its repeat purchase behavior tracks order counts and unique customers over time. None of that lives in ARA, which is built around sales and operational dashboards, not search or purchase-pattern analytics. Conflating the two doesn&#39;t just point you at the wrong tab, it points you at a feature set that doesn&#39;t exist in the product you&#39;re looking at.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Neither ChatGPT nor Claude can see your account&#39;s Brand Registry status, so neither can tell you which of the two products you should even expect to see.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge.&lt;/strong&gt; &amp;quot;Brand Analytics&amp;quot; and &amp;quot;Retail Analytics&amp;quot; sound like variants of the same phrase, so if you ask ChatGPT or Claude to tell them apart, expect ABA&#39;s market basket analysis attributed to ARA.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Even when ChatGPT or Claude correctly names Brand Registry as the gate, checking your actual enrollment status is an account action on Amazon&#39;s side. You have to go look yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;amazons-own-ara-docs-define-conversion-two-different-ways-on-the-same-overview-page&quot; tabindex=&quot;-1&quot;&gt;Amazon&#39;s own ARA docs define &amp;quot;Conversion&amp;quot; two different ways on the same overview page&lt;/h2&gt;
&lt;p&gt;This is the one that made me stop trusting my own memory of ARA definitions. The Traffic dashboard section of Amazon&#39;s ARA overview defines Conversion as ordered revenue divided by glance views. The General dashboard information section, on the same overview page, defines Conversion as ordered units divided by glance views. Not a typo in one section and a fix in the other, both are live, current documentation. Amazon&#39;s own help content disagrees with itself two sections apart, and neither section says so.&lt;/p&gt;
&lt;p&gt;Rather than pick a side, the Skill attaches both formulas to the resolution whenever it resolves a question to Conversion, citing each one&#39;s exact source section and flagging the metric as having a conflicting definition instead of silently returning one number as &amp;quot;the&amp;quot; answer. That flag matters more than it sounds: if your internal reporting was built against one formula and a teammate pulled a number using the other, you&#39;d see two different Conversion rates and no obvious reason why, unless something told you to check.&lt;/p&gt;
&lt;p&gt;ROOS and Rep OOS get the same treatment, for a related reason: they sound interchangeable and aren&#39;t. ROOS, procurable product out-of-stock, considers procurable ASINs, a broader cohort than Rep OOS&#39;s replenishable-ASINs-only scope. Because the ROOS cohort is larger, ROOS usually reads as a lower percentage than Rep OOS on the same account, which is exactly the kind of thing that looks like an error until you know it&#39;s a definitional difference. Sourceable Product OOS is a third, related but distinct glossary entry, not a synonym for either: OOS glance views on sourceable ASINs divided by total glance views, also Manufacturing view only. The Skill keeps all three as separate glossary entries so it never treats one as a stand-in for another. Sell Through Rate gets its own definition too: shipped units minus customer returns, divided by on-hand units plus received units, a formula with no ambiguity but plenty of adjacent metrics it gets confused with.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;operator_question&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;What does Conversion mean in my ARA dashboard, and which report is it in?&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;resolution&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;dashboard&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Traffic&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;sp_api_report_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GET_VENDOR_TRAFFIC_REPORT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;view_required&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;manufacturing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;metric&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Conversion&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;definitions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;formula&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ordered revenue / glance views&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;cited_section&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Traffic dashboard&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;formula&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ordered units / glance views&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;cited_section&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;General dashboard information&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;conflicting_definition&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;resolution_note&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Amazon&#39;s ARA overview defines Conversion two different ways in two sections of the same page. Both sections are current, confirm which formula your internal reporting matches before comparing numbers across teams.&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;caveat_flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;manufacturer_only_dashboard&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;conflicting_definition&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, and this is the flagship problem.&lt;/strong&gt; Ask ChatGPT or Claude what the Conversion formula in ARA is and you&#39;ll get one formula stated with full confidence. Neither can notice that Amazon&#39;s own help page disagrees with itself two sections apart.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data, compounded by generic knowledge.&lt;/strong&gt; Two people on your team asking ChatGPT or Claude the same question a week apart could get genuinely different formulas back and never know to reconcile them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; If ChatGPT or Claude conflates ROOS, Rep OOS, and Sourceable Product OOS, neither can pull your actual account data and check which cohort your number is scoped to, that&#39;s a live-data check only you can run.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;four-recurring-distortions-make-an-ara-number-look-complete-when-it-isnt&quot; tabindex=&quot;-1&quot;&gt;Four recurring distortions make an ARA number look complete when it isn&#39;t&lt;/h2&gt;
&lt;p&gt;Warehouse Deals sales are excluded from the Sales and Net PPM dashboards, so if your internal reporting reconciles against ARA and includes Warehouse Deals in its own totals, the two will never match, by design, not by error. Sourcing view versus Manufacturing view changes which ASINs and even which metrics appear at all: Traffic, Net PPM, Forecasting, Sourceable Product OOS, and ROOS are Manufacturing-view-only, so a Sourcing-view login won&#39;t show them regardless of what the operator asked for. Customer returns and cancellations get booked against the original date of the sale, not the date the return happened, which means a return processed this month can quietly revise a number from three months ago. And ASIN mapping issues, once corrected, can take up to fourteen days to actually show up in the dashboards, so a &amp;quot;fixed&amp;quot; product can look missing for two more weeks.&lt;/p&gt;
&lt;p&gt;Net PPM itself is (shipped revenue minus shipped PCOGS plus CCOGS minus sales discounts) divided by shipped revenue, and the Warehouse Deals exclusion applies to it the same way it applies to Sales. The decision_plan the Skill produces carries these as caveat flags attached to the resolution itself, not buried in a footnote: &lt;code&gt;excludes_warehouse_deals: true&lt;/code&gt; on Sales and Net PPM, &lt;code&gt;view_required: manufacturing&lt;/code&gt; on Traffic, Net PPM, Forecasting, Sourceable OOS, and ROOS. The flag travels with the number, so whoever reads the resolution sees the caveat before they build a decision on the metric, not after.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Neither ChatGPT nor Claude can see which view your Vendor Central login has. You have to go check.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; If your internal reporting reconciles against ARA and includes Warehouse Deals, neither ChatGPT nor Claude can pull both numbers and diff them, that&#39;s an action against live data, not a description of one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge.&lt;/strong&gt; The return-date attribution rule is easy to get backwards, so if you ask ChatGPT or Claude, you&#39;re as likely to get the intuitive-but-wrong version, booked to the return date, as the correct one.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;A decision_plan isn&#39;t a one-off answer, it&#39;s structured output the Skill can hand off downstream. Once the Skill has resolved a question to a dashboard, a report type, and a set of caveat flags, that resolution feeds into &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Flow&lt;/a&gt;, the same data layer that holds &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; and Selling Partner MCP pulls side by side, so a routed ARA answer sits next to the ad-spend numbers it eventually gets compared against. The Skill can schedule the same lookup as a recurring check instead of a one-time query, useful for anything with a mapping delay attached, since a &amp;quot;missing&amp;quot; ASIN today might just need another look in two weeks. For questions that resolve to Net PPM, the handoff goes straight to the margin-leakage guide, because routing tells you where to look and that guide is where you actually go digging for the leak itself.&lt;/p&gt;
&lt;p&gt;The pattern underneath all four sections is the same: get the question routed to a cited, current answer before you build anything on top of it, not after you&#39;ve already shipped a number that was wrong in a way nobody flagged.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next in the series: ARA vs. ABA, which dashboard actually answers which question.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Listing Suppression Diagnosis: Stranded or Buyable</title>
    <link href="https://www.kuudo.com/guides/seller-listing-suppression-diagnosis/"/>
    <id>https://www.kuudo.com/guides/seller-listing-suppression-diagnosis/</id>
    <published>2026-07-30T00:00:00Z</published>
    <updated>2026-07-30T00:00:00Z</updated>
    <summary>Use live listing status, the suppression reason report, and FBA evidence to diagnose a silent ASIN before applying the wrong fix.</summary>
    <content type="html">&lt;p&gt;Create this workflow as a reusable Skill called &lt;code&gt;silent-asin-diagnosis&lt;/code&gt;. It reads live &lt;code&gt;BUYABLE&lt;/code&gt; and &lt;code&gt;DISCOVERABLE&lt;/code&gt; status through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt;, uses &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; to interpret the exact suppression or stranded-inventory rule, and returns the reason-specific fix plus its deadline before anyone edits the listing. I start there when a top ASIN suddenly has no orders or impressions. Search suppression, a non-buyable offer, a block, a deletion, and stranded Fulfillment by Amazon (FBA) stock can look identical from the sales graph, but each demands a different repair.&lt;/p&gt;
&lt;p&gt;A plain ChatGPT or Claude conversation hits three walls: &lt;strong&gt;no access to your data&lt;/strong&gt;, including the live SKU, &lt;code&gt;ListingsItemStatus&lt;/code&gt;, FBA units, listing issues, or current report; &lt;strong&gt;no way to take action&lt;/strong&gt;, such as requesting evidence or applying an approved fix; and &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt; exact reason fields and deadlines. You must paste disconnected snapshots, expose account data, and carry out every step yourself. Connected &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;AI clients&lt;/a&gt; get past those walls through the MCP&#39;s reads and actions, Atlas-grounded rules, reusable &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt;, and the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt; that records the decision.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Live state&lt;/th&gt;
&lt;th&gt;Diagnosis&lt;/th&gt;
&lt;th&gt;Next evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BUYABLE&lt;/code&gt; + &lt;code&gt;DISCOVERABLE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Listing is live&lt;/td&gt;
&lt;td&gt;Diagnose traffic and demand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BUYABLE&lt;/code&gt;, not &lt;code&gt;DISCOVERABLE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Search suppressed&lt;/td&gt;
&lt;td&gt;Pull reason and issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not &lt;code&gt;BUYABLE&lt;/code&gt;; FBA units&lt;/td&gt;
&lt;td&gt;Possible stranded stock&lt;/td&gt;
&lt;td&gt;Confirm no active offer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not &lt;code&gt;BUYABLE&lt;/code&gt;; no stranded units&lt;/td&gt;
&lt;td&gt;Offer-side failure&lt;/td&gt;
&lt;td&gt;Check quantity, window, restrictions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;buyable-and-discoverable-separate-suppression-from-stranding&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;BUYABLE&lt;/code&gt; and &lt;code&gt;DISCOVERABLE&lt;/code&gt; separate suppression from stranding&lt;/h2&gt;
&lt;p&gt;When a listing is search suppressed, Amazon removes discoverability but can leave the offer buyable; stranded inventory is FBA stock in a fulfillment center that does not have an active offer. That distinction is the first branch, not a semantic detail.&lt;/p&gt;
&lt;p&gt;The Skill reads &lt;code&gt;ListingsItemStatus&lt;/code&gt;, whose relevant values are &lt;code&gt;BUYABLE&lt;/code&gt;, &lt;code&gt;DISCOVERABLE&lt;/code&gt;, and &lt;code&gt;DELETED&lt;/code&gt;. &lt;code&gt;BUYABLE&lt;/code&gt; without &lt;code&gt;DISCOVERABLE&lt;/code&gt; points to search suppression. An absent &lt;code&gt;BUYABLE&lt;/code&gt; status establishes that the offer is not buyable, but it does not establish stranding until the agent also finds FBA units and no active offer. If both status flags are healthy, I move the investigation away from catalog repair.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data:&lt;/strong&gt; ChatGPT or Claude cannot read the live status, offer, or FBA unit count. You can paste a search result, but that does not prove buyability or inventory state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action:&lt;/strong&gt; ChatGPT or Claude can give you a checklist. You must retrieve each status and compare the records by hand; the Selling Partner MCP performs the connected read.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s:&lt;/strong&gt; ChatGPT or Claude can collapse “suppressed” and “stranded” into one diagnosis. Atlas keeps the branch tied to Amazon&#39;s status definitions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;the-suppression-reason-chooses-the-repair&quot; tabindex=&quot;-1&quot;&gt;The suppression reason chooses the repair&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;GET_MERCHANTS_LISTINGS_FYP_REPORT&lt;/code&gt; contains only suppressed listings, the reason for each suppression, and instructions for removing it. It can be requested for a current investigation or scheduled for continuous monitoring.&lt;/p&gt;
&lt;p&gt;I use the report to identify the affected SKU, then add its live listing issues to the evidence. The &lt;strong&gt;Suppressed Listings Management&lt;/strong&gt; playbook routes the result through Fix Your Products: image failures go to image requirements, missing attributes expose the absent value, and newly required compliance attributes get patched directly. Rewriting unrelated copy or adding stock does not repair those causes.&lt;/p&gt;
&lt;p&gt;The bulk report is not real-time proof. Later report calls can be 1 to 6 hours old, and the stock-data freshness commitment is three hours, so the Skill pairs that evidence with the live listing read before proposing a patch.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data:&lt;/strong&gt; ChatGPT or Claude cannot request the suppressed-listings report or inspect the SKU&#39;s current issues. You would have to paste a manual snapshot into the chat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action:&lt;/strong&gt; ChatGPT or Claude can draft replacement text only. You must find the named field and apply the correction yourself; the Selling Partner MCP can execute an approved, scoped patch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s:&lt;/strong&gt; ChatGPT or Claude may suggest a broad rewrite. Atlas distinguishes image, attribute, and compliance causes, including the exact missing value.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;the-stranded-reason-chooses-relist-restore-or-removal&quot; tabindex=&quot;-1&quot;&gt;The stranded reason chooses relist, restore, or removal&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Stranded reason&lt;/code&gt; determines whether the operator should relist the SKU, restore an offer, correct price or condition, fix the fulfillment channel, or remove the units. The Fix stranded inventory page is the most accurate source when Manage Inventory and stranded status disagree. Until the active offer returns, those FBA units cannot sell and continue to accumulate storage fees.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Resolve stranded inventory issues&lt;/strong&gt; playbook reads &lt;code&gt;Stranded reason&lt;/code&gt; and the accompanying &lt;code&gt;Additional information&lt;/code&gt; or Recommendations. Common evidence includes a missing listing, a missing price or condition, or a merchant-fulfilled listing attached to FBA units. For a catalog-wide repair, the same playbook uses the Bulk Fix Stranded Inventory workflow.&lt;/p&gt;
&lt;p&gt;The clock matters. If the seller does not create a listing or order removal within 30 days of Amazon&#39;s notice, Amazon designates the inventory unsellable and it must be removed. The deadline begins with Amazon&#39;s notice, not with the day I diagnose it.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data:&lt;/strong&gt; ChatGPT or Claude cannot see your FBA units, active-offer state, &lt;code&gt;Stranded reason&lt;/code&gt;, or recommended action. You must collect and paste those facts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action:&lt;/strong&gt; ChatGPT or Claude can describe relisting or removal. You must complete the selected Seller Central step yourself; the connected workflow runs supported MCP actions and keeps any Seller Central-only step explicit for you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s:&lt;/strong&gt; ChatGPT or Claude may tell you to create a second listing when price, condition, offer state, or fulfillment channel is the actual fault. Atlas supplies the reason-specific path and 30-day rule.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;a-repair-is-complete-only-when-status-returns&quot; tabindex=&quot;-1&quot;&gt;A repair is complete only when status returns&lt;/h2&gt;
&lt;p&gt;A submitted change is not a completed repair. Suppression closes when discoverability returns; stranded stock closes when buyability and an active offer return.&lt;/p&gt;
&lt;p&gt;The Skill watches &lt;code&gt;LISTINGS_ITEM_STATUS_CHANGE&lt;/code&gt;, schedules &lt;code&gt;GET_MERCHANTS_LISTINGS_FYP_REPORT&lt;/code&gt;, and re-reads the affected SKU after Amazon&#39;s processing window. It records the branch, approved action, evidence, and stranded deadline in the run log. If &lt;code&gt;BUYABLE&lt;/code&gt; and &lt;code&gt;DISCOVERABLE&lt;/code&gt; are both healthy but demand is still absent, the workflow hands the ASIN to the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; instead of misclassifying a traffic problem as a listing problem.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data:&lt;/strong&gt; ChatGPT or Claude cannot observe a later status change or verify that the active offer returned. You must collect another snapshot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action:&lt;/strong&gt; ChatGPT or Claude can remind you to check. You must schedule and perform every recheck; the Skill monitors the expected status and preserves the deadline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s:&lt;/strong&gt; ChatGPT or Claude can stop at “submitted.” Atlas keeps the completion test tied to discoverability, buyability, and the active offer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;I route the completed diagnosis to one owner. Product-data issues go to the team approving an image, attribute, or compliance patch. Offer and FBA issues go to the inventory team with the reason-specific action packet. A healthy listing with no demand moves to the advertising team with its catalog state already cleared.&lt;/p&gt;
&lt;p&gt;That handoff can run as one recurring Skill through &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Flow&lt;/a&gt;, so each new silent-ASIN alert arrives with its evidence and owner instead of becoming another unclassified ticket.&lt;/p&gt;
&lt;p&gt;The pattern is status, reason, scoped action, and verified return. That keeps a silent ASIN from turning into an expensive guess.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next, use the &lt;a href=&quot;https://www.kuudo.com/guides/seller-listing-agentic-audit-to-patch/&quot;&gt;listing audit-to-patch guide&lt;/a&gt; to turn a verified attribute issue into the smallest safe catalog change.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>The Agent Bidding Rulebook That Prevents Bid Thrash</title>
    <link href="https://www.kuudo.com/guides/rules-agent-bidding-rulebook/"/>
    <id>https://www.kuudo.com/guides/rules-agent-bidding-rulebook/</id>
    <published>2026-07-26T00:00:00Z</published>
    <updated>2026-07-26T00:00:00Z</updated>
    <summary>A bid should move only when sufficiency, an ACoS deadband, and a daily clamp all agree. The bounded rulebook an agent runs, with the thresholds.</summary>
    <content type="html">&lt;p&gt;A bidding rulebook stops thrashing when a bid can only move after three independent gates agree: the n-gram clears data sufficiency, its ACoS sits outside a deadband around target, and the resulting change fits inside a hard daily clamp. That is the whole answer. I handed the question to &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;our agent&lt;/a&gt;, which runs it as a &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; over the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt;, grounded by &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; in two corpus playbooks: the Keyword Analysis Decision Framework (N-Grams) and the Sponsored Ads Bidding Configuration Decision Framework. The question that sent me looking came from our PPC lead, in Slack, on a Tuesday: every tool she had used either overcorrected or undercorrected, and she wanted to know what a sane rulebook actually looks like underneath.&lt;/p&gt;
&lt;p&gt;Ask a plain ChatGPT or Claude chat and you hit three walls on any Amazon job. It has no access to your data: it cannot read your search-term report, your ad group configuration, or your trailing 30-day spend, so you paste a CSV that is stale the moment you paste it. It has no way to take action: it cannot change a bid, set a placement multiplier, or add a negative, so the most you get is text you retype into Campaign Manager by hand. And it runs on generic public knowledge, not Amazon&#39;s: it will produce thresholds that sound right and are not. The result is disconnected, generic, manual work that ships silent mistakes into a live account. The &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; supplies your data and the tools to act on it, Atlas supplies the private rule book, and the Skill supplies the bounded workflow that keeps the two honest.&lt;/p&gt;
&lt;h2 id=&quot;thin-data-gets-a-hold-not-a-bid-change&quot; tabindex=&quot;-1&quot;&gt;Thin data gets a hold, not a bid change&lt;/h2&gt;
&lt;p&gt;Most thrash is not a bad threshold, it is a threshold applied to a sample too small to mean anything. The rulebook gates on sufficiency before any rule is allowed to evaluate. For 1-grams that means &lt;code&gt;IMP_g &amp;gt;= 50&lt;/code&gt; and either &lt;code&gt;CLK_g &amp;gt;= 10&lt;/code&gt; or &lt;code&gt;ORD_g &amp;gt;= 2&lt;/code&gt;. Longer n-grams need proportionally more: 2-grams require &lt;code&gt;IMP_g &amp;gt;= 100&lt;/code&gt;, 3-grams &lt;code&gt;IMP_g &amp;gt;= 150&lt;/code&gt;, with the same click-or-order condition.&lt;/p&gt;
&lt;p&gt;There is a second gate one level up, at the ad group. The starvation guard in the Sponsored Ads Bidding Configuration Decision Framework holds everything when &lt;code&gt;CLK_l30d &amp;lt; 50&lt;/code&gt; and &lt;code&gt;ORD_l30d &amp;lt; 5&lt;/code&gt;. The prescribed action is &lt;code&gt;hold_thin_data&lt;/code&gt; with no destructive change, and the advice is to consolidate or extend the observation window rather than act early. An agent that respects both gates spends most of its first run reporting that it is not going to do anything yet.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; It cannot see impression counts per n-gram, so it cannot tell a 4,000-impression term from a 40-impression one. Paste a top-50 rows sample and it will confidently rank terms that have no statistical business being ranked. And your search-term data is now sitting in someone else&#39;s chat log.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Even when it correctly says &amp;quot;this needs more data,&amp;quot; it cannot set a hold, record a cooldown, or stop a downstream job. Nothing enforces the wait except you remembering.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask for a minimum impression threshold and you get a plausible round number. The real gates are versioned per n-gram length in the corpus playbook, and they are not the numbers a public model guesses.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;scale-and-pull-back-fire-at-fixed-distances-from-target&quot; tabindex=&quot;-1&quot;&gt;Scale and pull-back fire at fixed distances from target&lt;/h2&gt;
&lt;p&gt;This is the part that actually prevents thrash. The scale rule and the pull-back rule do not trigger at target ACoS, they trigger at fixed distances on either side of it, leaving a gap where nothing happens at all.&lt;/p&gt;
&lt;p&gt;A scale decision needs &lt;code&gt;ORD_g &amp;gt;= 10&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;code&gt;ACOS_g &amp;lt;= 0.9 x TARGET_ACOS&lt;/code&gt;, and produces &lt;code&gt;increase_bid&lt;/code&gt; at +5 to 10% on keywords containing that n-gram. A pull-back needs &lt;code&gt;ORD_g &amp;gt;= 10&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;code&gt;ACOS_g &amp;gt; 1.1 x TARGET_ACOS&lt;/code&gt;, and produces &lt;code&gt;decrease_bid&lt;/code&gt; at -10%, plus a 10% reduction to the Top-of-Search multiplier if one is in use. Both re-evaluate in 5 days.&lt;/p&gt;
&lt;p&gt;Between 0.9x and 1.1x of target, no bid rule fires. That deadband is the single most load-bearing number in the rulebook. A bidder without one sits exactly at target and oscillates forever, correcting every run in whichever direction last week&#39;s noise pointed.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Re-eval&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ORD_g &amp;gt;= 10&lt;/code&gt;, &lt;code&gt;ACOS_g &amp;lt;= 0.9x target&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;increase_bid&lt;/code&gt; +5 to 10%&lt;/td&gt;
&lt;td&gt;5 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ORD_g &amp;gt;= 10&lt;/code&gt;, &lt;code&gt;ACOS_g &amp;gt; 1.1x target&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;decrease_bid&lt;/code&gt; -10%&lt;/td&gt;
&lt;td&gt;5 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ACoS inside the deadband&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;next run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ROAS_g &amp;gt;= target&lt;/code&gt;, impressions bottom quartile&lt;/td&gt;
&lt;td&gt;&lt;code&gt;increase_bid&lt;/code&gt; +5 to 8%, TOS +10%&lt;/td&gt;
&lt;td&gt;5 days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; It does not know your &lt;code&gt;TARGET_ACOS&lt;/code&gt;, so it cannot compute a deadband around it. Tell it your target and it will still evaluate against the single number rather than a band, which is the behavior that thrashes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; It can describe a +8% bid increase. It cannot apply one. If you retype that change into Campaign Manager yourself, nothing records that the entity is now in a 5-day review window, so next week you may well move it again.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; The 0.9 and 1.1 multipliers, the +5 to 10% magnitudes, and the 5-day re-evaluation are all specified in the retrieved playbook. A public model has no reason to produce those particular numbers and generally does not.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;every-lever-is-clamped-before-it-ships&quot; tabindex=&quot;-1&quot;&gt;Every lever is clamped before it ships&lt;/h2&gt;
&lt;p&gt;Gates decide whether a rule fires. Clamps decide how far it can go when it does. The global controls are short enough to memorize: a daily bid change clamp of plus or minus 20%, a Top-of-Search placement cap of 1.50, and a standard review window of 5 days for Ads and 7 to 14 days for Organic and Ops work.&lt;/p&gt;
&lt;p&gt;The clamp matters most in the case where the rulebook is most confident. An n-gram at half of target ACoS with 200 orders is a genuinely strong signal, and the temptation is to move the bid a long way at once. The clamp refuses. Twenty percent per day, then look again in five days. Every decision record the agent emits carries its own &lt;code&gt;max_change_pct&lt;/code&gt; and &lt;code&gt;cooldown_days&lt;/code&gt;, the latter defaulting to 5 to 14 depending on the action type, so the bounds travel with the decision rather than living in a settings page nobody re-reads.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;decision_category&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;scale_winner&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;action_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;increase_bid&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;action_scope&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ADS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;selector&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;ngram&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;stainless steel&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;match_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;phrase&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;magnitude_pct&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;max_change_pct&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;cooldown_days&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;confidence&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;high&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;reason&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ORD_g=31, ACOS_g=0.19 &amp;lt;= 0.9 x TARGET_ACOS(0.25); sufficiency met&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;badges&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;data_sufficient&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;cooldown_ok&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;thin_data_reason&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; It cannot see what the bid was yesterday, so it cannot tell you whether a proposed change is inside the daily clamp. Apply its suggestion by hand two days running and you can move a bid 40% without noticing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Placement multipliers are a good example: it can tell you to raise Top-of-Search by 10%, but it cannot read the current multiplier, so neither of you knows whether that crosses the 1.50 cap until you are in the console.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask for safe bid-change bounds and you get advice, not a contract. The clamp here is a field on the decision record, which means a downstream job can reject anything that violates it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;precedence-decides-which-rule-wins&quot; tabindex=&quot;-1&quot;&gt;Precedence decides which rule wins&lt;/h2&gt;
&lt;p&gt;Real accounts produce conflicts. A keyword can look wasteful on one metric and efficient on another, and two rules will match the same entity in the same run. Rather than letting whichever rule evaluated last take the entity, the framework fixes an order: invalid computations first, then thin data, then safety negatives, then pull back, then scale, then mining and hygiene, and creative or ops work last.&lt;/p&gt;
&lt;p&gt;The tiebreak is explicit and conservative. When a rule suggests both scale and pull-back, prefer pull-back, unless credible intervals support scaling with high confidence. That is where the reliability layer earns its place: the recommended signals are Bayesian credible intervals at 95%, Beta for CTR and CVR, Gamma for spend and revenue ratios, alongside recency weighting with a 14-day half-life and peer medians computed with trimming. The interval, not the point estimate, is what lets a scale decision beat a pull-back decision.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; With no click and order counts it cannot compute a credible interval at all, so the one mechanism that resolves a scale-versus-pull-back tie is unavailable to it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Ask it to arbitrate two conflicting recommendations and it will pick one in prose. Nothing stops both from reaching the account if you work through its list by hand and apply each item as you read it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; A seven-level precedence ladder with a documented tiebreak is not something a public model reconstructs. It will produce a reasonable-sounding ordering that differs from the one your rulebook actually uses, which is worse than no ordering because it looks authoritative.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;The output is a decision plan, not an applied change. Each record names the entity, the bounded action, the clamp, the cooldown, and the reason it fired, which makes it reviewable before anything reaches the account. That review step is the same pattern as a &lt;a href=&quot;https://www.kuudo.com/guides/human-approval-for-amc-activation/&quot;&gt;human approval gate&lt;/a&gt; on &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; activation: the agent assembles the artifact, a person signs it, the platform ships it.&lt;/p&gt;
&lt;p&gt;Once a plan is approved, the review windows do the pacing. Ads actions re-evaluate in 5 days, Organic and Ops in 7 to 14, and each record&#39;s &lt;code&gt;cooldown_days&lt;/code&gt; prevents the next run from touching an entity still inside its window. Wired as a recurring Skill over the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;, the agent reads a fresh rollup, skips everything on cooldown, and emits a much shorter plan the second week. A rulebook that is working produces fewer decisions over time, not more. The &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; covers the catalog side of the same account when a decision turns out to be a listing problem rather than a bidding one.&lt;/p&gt;
&lt;p&gt;The pattern is worth stating plainly: bounded actions with explicit gates beat continuous optimization because they are auditable, and an agent that can explain why it did nothing is more trustworthy than one that always has a change to make.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next: the data-mode router, and why computing ACoS on organic search-query data is the fastest way to poison a rulebook.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Recover Featured Offer Eligibility Without Guessing</title>
    <link href="https://www.kuudo.com/guides/seller-buy-box-eligibility-recovery/"/>
    <id>https://www.kuudo.com/guides/seller-buy-box-eligibility-recovery/</id>
    <published>2026-07-25T00:00:00Z</published>
    <updated>2026-07-25T00:00:00Z</updated>
    <summary>A grounded workflow separates Featured Offer eligibility from placement, then traces price-health warnings to the exact offer evidence.</summary>
    <content type="html">&lt;p&gt;The fastest way to recover a missing Featured Offer is to identify the failed gate first: account eligibility, price health, or competition among eligible offers. The agent reads the live Fulfillment by Amazon (FBA) inventory offer for the Amazon Standard Identification Number (ASIN) through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Amazon Selling Partner MCP&lt;/a&gt;, applies a reusable &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt;, and uses &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; to ground the diagnosis in Amazon&#39;s Featured Offer rules. The same evidence can flow through &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Flow&lt;/a&gt; and the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt; when the recovery check spans selling and advertising signals.&lt;/p&gt;
&lt;p&gt;That distinction matters because “we lost the Buy Box” describes two different situations. An offer can be ineligible before Amazon ranks it, or it can be eligible and still lose the placement to another offer. Amazon also announced a gradual July 2026 rollout removing the seller-eligibility step, so a historical rule cannot be treated as universal across every store yet. If the offer&#39;s demand context matters, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; can add campaign-side evidence without turning a plain chat into a live data connection.&lt;/p&gt;
&lt;p&gt;Why not ask &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;ChatGPT&lt;/a&gt; or Claude? A disconnected chat has &lt;strong&gt;no access to your data&lt;/strong&gt;, &lt;strong&gt;no way to take action&lt;/strong&gt;, and &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt;. It cannot read the live offer, inspect a &lt;code&gt;PRICING_HEALTH&lt;/code&gt; notification, or verify which eligibility rollout applies to your store. The human can paste facts into a chat, but the result is still manual and easy to misclassify. The workflow below keeps the MCP, Skill, Atlas, and your approval step connected.&lt;/p&gt;
&lt;h2 id=&quot;eligibility-is-a-gate-not-proof-of-placement&quot; tabindex=&quot;-1&quot;&gt;Eligibility is a gate, not proof of placement&lt;/h2&gt;
&lt;p&gt;The first check is whether Amazon currently allows the offer to compete. The Atlas-grounded Featured Offer Eligibility playbook says a Professional selling account and performance-based requirements have historically been part of that gate, while Amazon&#39;s July 2026 announcement says the seller-eligibility step is being removed gradually. The agent should therefore read the current account state and store rollout status instead of returning a fixed yes/no from old rules.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;asin&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;B0EXAMPLE12&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;account_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Professional&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;store&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;US&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eligibility_gate&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;verify_current_policy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;performance_evidence&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;read_live_account_metrics&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Seller Central account health&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;rollout_note&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Eligibility rules are changing during the July 2026 rollout&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT or Claude cannot read your current account type, performance state, or store-level rollout. It can only reason from what you paste.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; A chat may repeat the Professional-account rule as if it were permanent. The agent checks the current policy context and labels uncertainty instead of treating a historical gate as universal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; The chat cannot inspect the account or confirm the offer&#39;s current eligibility. You still have to verify the state in Seller Central yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;pricinghealth-isolates-a-price-driven-ineligibility&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;PRICING_HEALTH&lt;/code&gt; isolates a price-driven ineligibility&lt;/h2&gt;
&lt;p&gt;When the agent receives &lt;code&gt;PRICING_HEALTH&lt;/code&gt;, the immediate question is not “did a competitor undercut me?” Amazon says the notification means the offer is ineligible at its current price, independent of competitor changes. Compare the offer&#39;s total price, including shipping, with the Competitive External Price and the &lt;code&gt;referencePrices&lt;/code&gt; values such as &lt;code&gt;averageSellingPrice&lt;/code&gt;, &lt;code&gt;msrpPrice&lt;/code&gt;, and &lt;code&gt;competitivePriceThreshold&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;price_ineligible&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;notification&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;PRICING_HEALTH&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_price&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;32.98&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;competitive_external_price&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;29.99&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;reference_prices&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;averageSellingPrice&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30.49&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;msrpPrice&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;34.99&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;competitivePriceThreshold&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;29.99&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;recommended_action&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;review price and shipping; approval required&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; A chat cannot inspect the notification payload or the live shipping charge, so it may compare the wrong number.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; It may treat &lt;code&gt;ANY_OFFER_CHANGED&lt;/code&gt; as the same signal. &lt;code&gt;PRICING_HEALTH&lt;/code&gt; means Amazon considers this offer ineligible; &lt;code&gt;ANY_OFFER_CHANGED&lt;/code&gt; reports offer changes and can include different context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; ChatGPT or Claude cannot validate a proposed price against Amazon. You must check the evidence and apply any change yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;eligible-offers-still-compete-on-price-shipping-and-experience&quot; tabindex=&quot;-1&quot;&gt;Eligible offers still compete on price, shipping, and experience&lt;/h2&gt;
&lt;p&gt;Passing the gate does not win the placement. The Atlas playbooks describe the next stage as a competition among eligible offers; Amazon evaluates competitive price and compelling shipping options, and the detail page can show one New and one Used Featured Offer where applicable. The &lt;strong&gt;Get to Know the Product Detail Page&lt;/strong&gt; playbook is the reference for how those offers appear and compete. The recovery artifact should label this state &lt;code&gt;eligible_not_featured&lt;/code&gt;, not &lt;code&gt;eligibility_failure&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Skill: featured-offer-recovery&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;offer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; live price&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; shipping&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; condition&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fulfillment
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;account&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; current eligibility and performance state
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;notifications&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; PRICING_HEALTH&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ANY_OFFER_CHANGED
&lt;span class=&quot;token key atrule&quot;&gt;compare&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; total_price_plus_shipping
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; competitive_external_price
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; reference_prices
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; delivery_and_availability
&lt;span class=&quot;token key atrule&quot;&gt;classify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; account_gate
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; price_ineligible
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; eligible_not_featured
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; insufficient_evidence&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; A chat cannot see the competing offers, shipping promises, or availability that shape the ranking.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; It may promise that matching one price guarantees the placement. Amazon says eligibility does not guarantee being featured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; The chat cannot monitor the next offer change or confirm that a price adjustment changed the placement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;the-recovery-artifact-should-recommend-not-silently-reprice&quot; tabindex=&quot;-1&quot;&gt;The recovery artifact should recommend, not silently reprice&lt;/h2&gt;
&lt;p&gt;The Skill turns the evidence into a small decision plan. It names the failed gate, cites the notification or account evidence, proposes the narrowest next step, and keeps approval on any price or fulfillment change. If evidence is incomplete, it returns &lt;code&gt;insufficient_evidence&lt;/code&gt; instead of guessing. For related operational context, compare the same evidence-first pattern in the &lt;a href=&quot;https://www.kuudo.com/guides/seller-fba-inventory-health-post-2024/&quot;&gt;FBA inventory health guide&lt;/a&gt; and use &lt;a href=&quot;https://www.kuudo.com/features/agent-crawl/&quot;&gt;Agent Crawl&lt;/a&gt; only when the workflow explicitly needs current external-market evidence.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;asin&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;B0EXAMPLE12&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;price_ineligible&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;evidence&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;PRICING_HEALTH&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;total price $32.98 &gt; competitive threshold $29.99&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;recommended_action&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;review price and shipping options&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;requires_approval&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;monitor&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;PRICING_HEALTH&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ANY_OFFER_CHANGED&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; It cannot produce a trustworthy evidence trail from the live offer, so its “fix” is usually a generic repricing suggestion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; It cannot distinguish a price-health failure from an eligible offer that simply lost the ranking.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; You remain the operator applying and monitoring the change by hand. The Skill keeps the approval step explicit and watches the relevant notification stream.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Once the artifact identifies the gate, the team can approve one narrow change, continue monitoring, or route an account issue to Seller Central support. The Skill rechecks &lt;code&gt;PRICING_HEALTH&lt;/code&gt; and &lt;code&gt;ANY_OFFER_CHANGED&lt;/code&gt; after the decision so a recovered offer is measured instead of assumed.&lt;/p&gt;
&lt;p&gt;Featured Offer recovery is a diagnosis problem before it is a pricing problem: verify the gate, read the evidence, then approve the smallest action that addresses it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next in the series: diagnosing a listing that is suppressed or stranded before its inventory keeps accruing storage cost.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>FBA Inventory Health After the 2024 Fee Change</title>
    <link href="https://www.kuudo.com/guides/seller-fba-inventory-health-post-2024/"/>
    <id>https://www.kuudo.com/guides/seller-fba-inventory-health-post-2024/</id>
    <published>2026-07-24T00:00:00Z</published>
    <updated>2026-07-24T00:00:00Z</updated>
    <summary>Amazon removed one FBA fee, but monthly storage, capacity limits, and aged inventory surcharges still need a repeatable review your agent can run.</summary>
    <content type="html">&lt;p&gt;The post-2024 Fulfillment by Amazon (FBA) inventory playbook is not “stop watching capacity.” It is to separate three signals before the next fee cycle: cubic-foot capacity usage, monthly storage cost, and units approaching the aged-inventory threshold. An agent can run that review through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Amazon Selling Partner MCP&lt;/a&gt; as a reusable &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt;, grounded by &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; so the policy window and report fields are not guessed.&lt;/p&gt;
&lt;p&gt;Amazon ended FBA inventory storage overage fees effective July 1, 2024 in the United States, Europe, United Kingdom, and Canada stores. That change does not remove monthly inventory storage fees or the aged inventory surcharge. The operator question is therefore narrower and more useful: which inventory is consuming capacity, which inventory is accumulating storage cost, and which inventory is close to the next age threshold? The same review can join Amazon Standard Identification Number (ASIN) inventory context to the campaign and demand signals available through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Why not just ask &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;ChatGPT&lt;/a&gt; or Claude? A disconnected chat has &lt;strong&gt;no access to your data&lt;/strong&gt;, &lt;strong&gt;no way to take action&lt;/strong&gt;, and &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt;. It cannot see your current FBA inventory, retrieve the reports, or apply the store-specific rules that determine which fee is relevant. The workflow below keeps those boundaries explicit: read live data, ground the interpretation, then decide what action deserves approval.&lt;/p&gt;
&lt;h2 id=&quot;separate-the-fee-policy-from-the-inventory-decision&quot; tabindex=&quot;-1&quot;&gt;Separate the fee policy from the inventory decision&lt;/h2&gt;
&lt;p&gt;The first move is a policy check, not a removal recommendation. The FBA Inventory Storage Overage Fees playbook says the overage fee stopped being charged in the named stores on July 1, 2024. The same source still describes monthly storage fees and an aged inventory surcharge as separate charges. Atlas returns that distinction with the retrieval context, so the agent does not collapse “overage fee removed” into “storage is free.”&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;p&gt;A chat can repeat a fee announcement, but it cannot verify which store, date, or fee family the announcement applies to. The agent reads the current seller context and Atlas-grounded policy before it labels an inventory issue.&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;The output should be a short policy record: store scope, effective date, fee families still in play, and the source playbooks used. That record becomes the explanation for every downstream recommendation.&lt;/p&gt;
&lt;h2 id=&quot;measure-capacity-in-cubic-feet-not-units&quot; tabindex=&quot;-1&quot;&gt;Measure capacity in cubic feet, not units&lt;/h2&gt;
&lt;p&gt;Capacity is a volume problem. The report exposes &lt;code&gt;capacity_usage_volume&lt;/code&gt;, &lt;code&gt;capacity_limit&lt;/code&gt;, &lt;code&gt;overage_volume&lt;/code&gt;, and &lt;code&gt;volume_unit&lt;/code&gt;; the unit is cubic feet. A unit count can rise while volume stays flat, or a small number of bulky units can create the larger constraint. The agent should read the Capacity Monitor or Inventory Performance view, then reconcile the report fields before ranking action.&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;inventory_health_snapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;storage_type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; oversize
  &lt;span class=&quot;token key atrule&quot;&gt;capacity_usage_volume&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;600&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;capacity_limit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;overage_volume&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;volume_unit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cubic feet
  &lt;span class=&quot;token key atrule&quot;&gt;decision&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; investigate slow&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;moving bulky inventory&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;p&gt;A chat usually turns “too much inventory” into a unit count because that is what a seller pasted into the prompt. The MCP can read the capacity fields and preserve the volume unit, while the Skill keeps a bulky ASIN from being hidden inside an account-wide average.&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;The useful artifact is not a generic “reduce stock” list. It is a ranked queue by storage type, cubic-foot contribution, velocity, and removal or replenishment option. Keep &lt;code&gt;volume_unit&lt;/code&gt; attached to every number so a later operator does not mistake volume for units.&lt;/p&gt;
&lt;h2 id=&quot;review-monthly-storage-separately&quot; tabindex=&quot;-1&quot;&gt;Review monthly storage separately&lt;/h2&gt;
&lt;p&gt;Monthly storage fees remain a distinct operating signal after the overage-fee change. Review the Monthly Storage Fee report by ASIN, then identify the SKUs whose storage cost is persistent without a matching sell-through or replenishment need. Atlas retrieval also surfaces storage-utilization surcharge and AWD waiver context, so the agent can mark a fee as a policy exception rather than treating every charge as a capacity breach.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;p&gt;A chat can suggest liquidation, but it cannot tell whether a SKU is driving base storage, a utilization surcharge, or a fee covered by a program benefit. The agent reads the relevant report and explains which cost layer moved before anyone chooses a removal order.&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;This is where the operator separates diagnosis from action. A high monthly storage charge may justify a sell-through, liquidation, return, or replenishment change, but the action belongs after the evidence review. The Skill should present the report rows, the decision rule, and the expected trade-off together.&lt;/p&gt;
&lt;h2 id=&quot;catch-aged-inventory-before-the-fifteenth-day-snapshot&quot; tabindex=&quot;-1&quot;&gt;Catch aged inventory before the fifteenth-day snapshot&lt;/h2&gt;
&lt;p&gt;The aged inventory surcharge applies to units stored 181 days or longer and is assessed using an inventory snapshot on the fifteenth day of each month. The FBA Inventory tool can show inventory that is already subject or will become subject within 60 days. The review should therefore sort by days-to-threshold, cubic-foot exposure, and available action window.&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;next_snapshot: 2026-08-15
asin: B0EXAMPLE12
age_days: 176
days_to_181_day_threshold: 5
per_unit_volume: 0.102 cubic feet
recommended_review: removal, sell-through, or return economics&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;p&gt;A chat can calculate “181 days” from a pasted date, but it cannot see the current age distribution or the next snapshot. The agent reads live FBA inventory, grounds the threshold in Atlas, and gives the team time to act before the charge is assessed.&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;The Aged Inventory Surcharge report is the evidence layer after the decision. It provides itemized SKU quantities, per-unit volume, surcharge tier, and amount charged. Keep the pre-snapshot queue and the post-charge report together so the team can compare the avoided cost with the action it chose. For a related report-driven workflow, see &lt;a href=&quot;https://www.kuudo.com/guides/seller-fbm-orders-reports/&quot;&gt;FBA order and report review&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Run the review on a schedule: policy check first, capacity volume second, monthly storage third, and aged-inventory countdown last. The agent should return a compact report with source playbooks, report fields, affected ASINs, and proposed actions. A human then approves removals, returns, liquidation, or replenishment changes through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt;. The &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Data layer&lt;/a&gt; keeps the policy context attached to the decision, and the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Flow&lt;/a&gt; can carry the approved workflow forward.&lt;/p&gt;
&lt;p&gt;If your FBA review still asks only whether the overage fee exists, it is looking at one policy line instead of inventory health. Separate volume, storage, and age, then decide with the evidence in front of you.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next in the series: turning the same age and volume queue into a controlled removal recommendation without losing the audit trail.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Find ASIN Margin Leakage with Net PPM</title>
    <link href="https://www.kuudo.com/guides/vendor-net-ppm-margin-leakage/"/>
    <id>https://www.kuudo.com/guides/vendor-net-ppm-margin-leakage/</id>
    <published>2026-07-20T00:00:00Z</published>
    <updated>2026-07-20T00:00:00Z</updated>
    <summary>Find which Vendor Central ASINs are dragging Net PPM by ranking rate deterioration and separating cost, funding, and discount pressure.</summary>
    <content type="html">&lt;p&gt;Run an Amazon Standard Identification Number (ASIN)-level Net PPM comparison, rank each negative rate contribution, then decompose the largest drags into shipped COGS/PCOGS, CCOGS, and sales-discount pressure where the connected report exposes those fields. The ranking is Kuudo-derived, not an Amazon metric. Amazon&#39;s dashboard identifies products driving profitability up or down after costs, funding, and discounts.&lt;/p&gt;
&lt;p&gt;That answers my question: &lt;em&gt;&amp;quot;Our Vendor Central revenue looks fine but margin is sliding. Which ASINs are actually dragging down our pure product margin?&amp;quot;&lt;/em&gt; Revenue cannot show which equation term changed. The report must answer materiality first, then cause where the component fields support it.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;Report output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Biggest drag?&lt;/td&gt;
&lt;td&gt;Rate-leakage proxy&lt;/td&gt;
&lt;td&gt;Ranked ASINs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost pressure?&lt;/td&gt;
&lt;td&gt;PCOGS/revenue up&lt;/td&gt;
&lt;td&gt;Cost flag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funding pressure?&lt;/td&gt;
&lt;td&gt;CCOGS/revenue down&lt;/td&gt;
&lt;td&gt;Funding flag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discount pressure?&lt;/td&gt;
&lt;td&gt;Discounts/revenue up&lt;/td&gt;
&lt;td&gt;Discount flag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The rate-leakage proxy and driver tests are Kuudo-derived from the sourced equation. Amazon does not name these fields.&lt;/p&gt;
&lt;p&gt;A plain &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;ChatGPT and Claude chat&lt;/a&gt; hits three walls: &lt;strong&gt;No access to your data&lt;/strong&gt;, &lt;strong&gt;No way to take action&lt;/strong&gt;, and &lt;strong&gt;Generic knowledge, not Amazon&#39;s&lt;/strong&gt;. &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; supplies vendor-account context, a &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; produces the repeatable report and review queue, and &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; supplies the metric definitions, access rules, exclusions, and timing caveats. Without those pieces, the work stays disconnected, generic, and manual, which ships silent mistakes.&lt;/p&gt;
&lt;h2 id=&quot;the-net-ppm-dashboard-identifies-products-driving-profitability-up-or-down&quot; tabindex=&quot;-1&quot;&gt;The Net PPM dashboard identifies products driving profitability up or down&lt;/h2&gt;
&lt;p&gt;The Net PPM dashboard identifies products that raise or lower profitability. It lives in Amazon Retail Analytics, which Amazon&#39;s reports index separates from Brand Analytics. An ABA customer or search dashboard is not the source.&lt;/p&gt;
&lt;p&gt;The retrieved &lt;strong&gt;Amazon Retail Analytics and Reports Overview&lt;/strong&gt; defines Net PPM around cost of goods, vendor funding, and sales discounts. That keeps the Skill focused on profitability instead of treating revenue as a margin answer.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run field&lt;/th&gt;
&lt;th&gt;Bound value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Skill&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vendor-net-ppm-margin-leakage&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;td&gt;Account and two periods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Selected ASIN set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connector&lt;/td&gt;
&lt;td&gt;Selling Partner MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grounding&lt;/td&gt;
&lt;td&gt;Atlas &lt;code&gt;amazon_vendors&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;&lt;code&gt;analysis_report&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Report header&lt;/th&gt;
&lt;th&gt;Recorded value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Report&lt;/td&gt;
&lt;td&gt;ASIN Net PPM analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor scope&lt;/td&gt;
&lt;td&gt;Connected account or group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketplace&lt;/td&gt;
&lt;td&gt;Connected marketplace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;View&lt;/td&gt;
&lt;td&gt;Manufacturing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Current period&lt;/td&gt;
&lt;td&gt;Selected closed period&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comparison period&lt;/td&gt;
&lt;td&gt;Selected comparable period&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data as of&lt;/td&gt;
&lt;td&gt;Close and refresh status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warehouse Deals&lt;/td&gt;
&lt;td&gt;Excluded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Material move&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{material_ratio_move_pp}}&lt;/code&gt; pp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Residual tolerance&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{residual_tolerance_pp}}&lt;/code&gt; pp&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The report renders its executive answer instead of hiding it in a notebook:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Executive result&lt;/th&gt;
&lt;th&gt;Bound result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ASINs reviewed&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{asins_reviewed}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Negative PPM changes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{negative_change_count}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Top-five leakage share&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{top_five_leakage_share}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Largest flagged driver&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{largest_driver}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boundary warnings&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{boundary_warnings}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Only the connected run populates those values. When a component field is unavailable, the executive answer keeps the ASIN ranking and marks the driver analysis incomplete.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;p&gt;Without a connected account, you must export and paste the dashboard data. ChatGPT or Claude can discuss margin, but neither can inspect the current ASIN rows or determine whether the selected account exposes the Net PPM dashboard.&lt;/p&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;net-ppm-separates-revenue-pcogs-ccogs-and-sales-discount-pressure&quot; tabindex=&quot;-1&quot;&gt;Net PPM separates revenue, PCOGS, CCOGS, and sales-discount pressure&lt;/h2&gt;
&lt;p&gt;Net PPM separates four signed components, so each available ratio&#39;s direction supports a first-pass driver flag. The normalized equation is:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Net PPM =
  (shipped revenue
   - shipped COGS [PCOGS]
   + CCOGS
   - sales discounts)
  / shipped revenue&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;Amazon Retail Analytics Metric Glossary&lt;/strong&gt; defines Shipped COGS as Amazon&#39;s item procurement price, also called Product Cost of Goods Sold (PCOGS). Contra-COGS (CCOGS) is vendor funding collected for agreements tied to purchases, customer sales, or marketing.&lt;/p&gt;
&lt;p&gt;CCOGS includes Vendor Allowance, Quick Pay Discounts, and Discretionary COOP, but excludes display-ads Contra-COGS. One glossary rendering says &amp;quot;shipped CCOGS&amp;quot; in the subtraction term. The report normalizes it to shipped COGS/PCOGS because CCOGS is separately defined as the added funding term.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Report field&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Observed&lt;/td&gt;
&lt;td&gt;Shipped revenue&lt;/td&gt;
&lt;td&gt;Shipment-item price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observed&lt;/td&gt;
&lt;td&gt;Shipped COGS/PCOGS&lt;/td&gt;
&lt;td&gt;Amazon procurement cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observed&lt;/td&gt;
&lt;td&gt;CCOGS&lt;/td&gt;
&lt;td&gt;Collected vendor funding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observed&lt;/td&gt;
&lt;td&gt;Sales discounts&lt;/td&gt;
&lt;td&gt;Discount formula term&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Derived&lt;/td&gt;
&lt;td&gt;PCOGS ratio&lt;/td&gt;
&lt;td&gt;PCOGS divided by revenue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Derived&lt;/td&gt;
&lt;td&gt;CCOGS ratio&lt;/td&gt;
&lt;td&gt;CCOGS divided by revenue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Derived&lt;/td&gt;
&lt;td&gt;Discount ratio&lt;/td&gt;
&lt;td&gt;Discounts divided by revenue&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The run records a material-move threshold and a residual tolerance. Those are operator inputs, not Amazon thresholds.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Driver flag&lt;/th&gt;
&lt;th&gt;Derived rule&lt;/th&gt;
&lt;th&gt;Interpretation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PCOGS pressure&lt;/td&gt;
&lt;td&gt;Cost magnitude clears threshold&lt;/td&gt;
&lt;td&gt;Procurement cost drag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funding pressure&lt;/td&gt;
&lt;td&gt;Funding magnitude clears threshold&lt;/td&gt;
&lt;td&gt;Less vendor funding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discount pressure&lt;/td&gt;
&lt;td&gt;Discount magnitude clears threshold&lt;/td&gt;
&lt;td&gt;More sales discount&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mixed&lt;/td&gt;
&lt;td&gt;Two magnitudes clear threshold&lt;/td&gt;
&lt;td&gt;Shared cause&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unclassified&lt;/td&gt;
&lt;td&gt;No clear or complete cause&lt;/td&gt;
&lt;td&gt;Check scope or rounding&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each component effect is signed: a negative value reduces Net PPM. Its pressure magnitude is &lt;code&gt;max(-component_effect_pp, 0)&lt;/code&gt;. A single-driver label requires exactly one pressure magnitude greater than or equal to &lt;code&gt;{{material_ratio_move_pp}}&lt;/code&gt; percentage points, and that magnitude must be the largest. &lt;strong&gt;Mixed&lt;/strong&gt; requires two or more pressure magnitudes to clear the same threshold. &lt;strong&gt;Unclassified&lt;/strong&gt; covers a missing component, no magnitude that clears the threshold, or an absolute residual greater than &lt;code&gt;{{residual_tolerance_pp}}&lt;/code&gt; percentage points. The output records both inputs beside every label so another run can reproduce the classification.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;p&gt;A pasted topline-revenue prompt can produce a plausible but unverified formula. You still have to supply current PCOGS, CCOGS, discounts, and revenue, and generic chat can conflate Product Cost of Goods Sold with Contra-COGS unless you provide the definitions.&lt;/p&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;a-rate-leakage-proxy-ranks-material-asin-deterioration-before-investigation&quot; tabindex=&quot;-1&quot;&gt;A rate-leakage proxy ranks material ASIN deterioration before investigation&lt;/h2&gt;
&lt;p&gt;Holding current revenue constant and multiplying it by a negative Net PPM rate change prioritizes ASINs with material sales and worsening margin. A large swing on a tiny ASIN cannot automatically outrank a larger drag.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kuudo-derived calculations, not Amazon metrics&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;net_ppm_delta_pp
  = current_net_ppm_pct - prior_net_ppm_pct

current_margin_dollars_proxy
  = current_shipped_revenue * current_net_ppm_pct / 100

rate_leakage_dollars_proxy
  = current_shipped_revenue
    * max(prior_net_ppm_pct - current_net_ppm_pct, 0)
    / 100

pcogs_ratio_delta_pp
  = current_pcogs_ratio_pct - prior_pcogs_ratio_pct

ccogs_ratio_delta_pp
  = current_ccogs_ratio_pct - prior_ccogs_ratio_pct

discount_ratio_delta_pp
  = current_discount_ratio_pct - prior_discount_ratio_pct

pcogs_effect_pp
  = -pcogs_ratio_delta_pp

ccogs_effect_pp
  = ccogs_ratio_delta_pp

discount_effect_pp
  = -discount_ratio_delta_pp

component_pressure_magnitude_pp
  = max(-component_effect_pp, 0)

explained_delta_pp
  = pcogs_effect_pp + ccogs_effect_pp + discount_effect_pp

residual_delta_pp
  = net_ppm_delta_pp - explained_delta_pp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Holding revenue constant isolates rate deterioration from volume. The dollar fields are prioritization proxies, not booked loss, reimbursement value, or Amazon-calculated fields. Rounding and unavailable components can prevent reconciliation.&lt;/p&gt;
&lt;p&gt;The report sorts &lt;code&gt;rate_leakage_dollars_proxy&lt;/code&gt; descending and fills five rows from the connected periods. The bindings contain no sample ASINs or percentages.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;ASIN&lt;/th&gt;
&lt;th&gt;Current revenue&lt;/th&gt;
&lt;th&gt;Prior revenue&lt;/th&gt;
&lt;th&gt;Prior PPM&lt;/th&gt;
&lt;th&gt;Current PPM&lt;/th&gt;
&lt;th&gt;Delta&lt;/th&gt;
&lt;th&gt;Leakage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_revenue}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_prior_revenue}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_prior_ppm}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_current_ppm}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_delta_pp}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_leakage}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_revenue}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_prior_revenue}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_prior_ppm}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_current_ppm}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_delta_pp}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_leakage}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_revenue}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_prior_revenue}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_prior_ppm}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_current_ppm}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_delta_pp}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_leakage}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_revenue}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_prior_revenue}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_prior_ppm}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_current_ppm}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_delta_pp}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_leakage}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_revenue}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_prior_revenue}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_prior_ppm}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_current_ppm}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_delta_pp}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_leakage}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I would not hand operations a rank-only table. The same rows continue into the causal review and ownership queue:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ASIN&lt;/th&gt;
&lt;th&gt;Cost effect&lt;/th&gt;
&lt;th&gt;Funding effect&lt;/th&gt;
&lt;th&gt;Discount effect&lt;/th&gt;
&lt;th&gt;Residual&lt;/th&gt;
&lt;th&gt;Driver&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_pcogs_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_ccogs_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_discount_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_residual}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_driver}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_pcogs_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_ccogs_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_discount_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_residual}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_driver}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_pcogs_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_ccogs_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_discount_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_residual}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_driver}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_pcogs_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_ccogs_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_discount_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_residual}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_driver}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_pcogs_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_ccogs_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_discount_effect}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_residual}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_driver}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ASIN&lt;/th&gt;
&lt;th&gt;Investigation note&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Evidence request&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_note}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_owner}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_1_evidence}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_note}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_owner}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_2_evidence}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_note}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_owner}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_3_evidence}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_note}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_owner}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_4_evidence}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_asin}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_note}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_owner}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{rank_5_evidence}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If components are unavailable, the rank still ships, the driver reads &lt;strong&gt;Unclassified&lt;/strong&gt;, and the queue requests the missing evidence rather than fabricating a cause.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;p&gt;ChatGPT or Claude can suggest ranking logic after you paste data. You must still assemble comparable periods, normalize percentages, run the calculations, and carry the ranked result into a separate work queue.&lt;/p&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;manufacturing-view-access-and-warehouse-deals-exclusions-define-the-report-boundary&quot; tabindex=&quot;-1&quot;&gt;Manufacturing-view access and Warehouse Deals exclusions define the report boundary&lt;/h2&gt;
&lt;p&gt;ARA access does not guarantee Net PPM access. All vendors have Sourcing views; manufacturers also receive a Manufacturing view for ASINs they manufacture. Amazon displays Traffic, Net PPM, and Forecasting only to manufacturers. If an eligible manufacturer cannot see Net PPM, contact retail partners or open a Contact Us case.&lt;/p&gt;
&lt;p&gt;Amazon&#39;s wording says Brand Analytics, including ARA, excludes Warehouse Deals because vendors do not collect the proceeds. Retail-partner tools may include those sales, so a vendor-facing and internal number can legitimately differ.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Boundary check&lt;/th&gt;
&lt;th&gt;Report status&lt;/th&gt;
&lt;th&gt;Next step&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;View&lt;/td&gt;
&lt;td&gt;Manufacturing required&lt;/td&gt;
&lt;td&gt;Check entitlement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Period&lt;/td&gt;
&lt;td&gt;Closed and populated&lt;/td&gt;
&lt;td&gt;Rerun after refresh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data as of&lt;/td&gt;
&lt;td&gt;Status recorded&lt;/td&gt;
&lt;td&gt;Avoid instant-data claim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warehouse Deals&lt;/td&gt;
&lt;td&gt;Excluded consistently&lt;/td&gt;
&lt;td&gt;Reconcile internal scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metric labels&lt;/td&gt;
&lt;td&gt;PCOGS differs from CCOGS&lt;/td&gt;
&lt;td&gt;Re-map before ranking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Derived fields&lt;/td&gt;
&lt;td&gt;Explicitly labeled&lt;/td&gt;
&lt;td&gt;Keep separate from Amazon&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Amazon aims to update weekly reports within 72 hours, but reports can take up to a week after period close. The report records its period and as-of status instead of calling the data instantaneous.&lt;/p&gt;
&lt;p&gt;The provenance footer records exact evidence instead of counts:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence type&lt;/th&gt;
&lt;th&gt;Identifier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source ref&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3dff9404cf730721&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source ref&lt;/td&gt;
&lt;td&gt;&lt;code&gt;42c4d79b31a1eefd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source ref&lt;/td&gt;
&lt;td&gt;&lt;code&gt;285ce9ce068d666c&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content hash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f334dd577810b7ca&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content hash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;647fba2b2a4cc729&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content hash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;927f70d802757798&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content hash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2d8af27996d3f246&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content hash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8e9bd73e5f629c0a&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content hash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;33460c203219fb4b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content hash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5dde3db908638908&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;It also records Atlas collection &lt;code&gt;amazon_vendors&lt;/code&gt;, corpus version &lt;code&gt;794a9c3de8380dfa&lt;/code&gt;, connected periods, run timestamp, and the exact titles &lt;strong&gt;Amazon Retail Analytics and Reports Overview&lt;/strong&gt;, &lt;strong&gt;Amazon Retail Analytics Metric Glossary&lt;/strong&gt;, and &lt;strong&gt;Vendor Reports and Analytics Overview&lt;/strong&gt;. Derived prioritization fields remain labeled as non-native Amazon metrics.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;p&gt;Generic chat cannot inspect view entitlements or reconcile a vendor export with an internal retail-partner number. You must supply both scopes, and any answer that omits the Warehouse Deals boundary can misdiagnose a legitimate difference.&lt;/p&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Turn the ranked report into an investigation queue, not an automatic commercial decision. Review the top ASINs and, where PCOGS, CCOGS, and sales-discount fields are exposed, confirm the largest component effect. When they are not, preserve the rank, mark the driver unclassified, and request the missing evidence. Then assign an owner. Run the workflow on closed, comparable periods and preserve the as-of status.&lt;/p&gt;
&lt;p&gt;If Warehouse Deals or an internal retail-partner scope explains a mismatch, flag the row for reconciliation instead of rewriting the vendor-facing metric. Amazon did not supply remediation thresholds or an automatic action policy in the retrieved material, so the operator reviews the evidence before changing terms or escalating.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt; combines &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt;, &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt;, &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;, and &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; so the report can be grounded, rerun, reviewed, and handed to an operator as one workflow.&lt;/p&gt;
&lt;p&gt;Revenue can stay stable while ASIN economics deteriorate; a sourced Net PPM decomposition turns that ambiguity into a ranked investigation queue.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next, use the same evidence-first pattern when &lt;a href=&quot;https://www.kuudo.com/guides/vendor-po-chargeback-disputes/&quot;&gt;disputing PO on-time accuracy chargebacks&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Brand Registry: Fix &#39;Trademark Already Enrolled&#39;</title>
    <link href="https://www.kuudo.com/guides/seller-brand-registry-trademark-conflict/"/>
    <id>https://www.kuudo.com/guides/seller-brand-registry-trademark-conflict/</id>
    <published>2026-07-16T00:00:00Z</published>
    <updated>2026-07-16T00:00:00Z</updated>
    <summary>Fix the &#39;trademark is already enrolled&#39; error: get added as an additional user by the Administrator, or continue to apply and share your contact info.</summary>
    <content type="html">&lt;p&gt;The &amp;quot;trademark is already enrolled&amp;quot; error is a role-request problem, not an enrollment problem: someone already holds the Administrator role for your brand, and the fix is getting added as an additional user, not filing again from scratch. &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;Our agent&lt;/a&gt; produced that answer, and the resolution plan behind it, by running a &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; on the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt;, grounded in the Brand Registry rules &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; retrieves.&lt;/p&gt;
&lt;p&gt;That plan exists because of a message from our brand manager: &lt;em&gt;&amp;quot;We&#39;re trying to enroll our brand in Amazon Brand Registry and getting the &#39;trademark is already enrolled&#39; error. What do we do?&amp;quot;&lt;/em&gt; Nobody on the team had enrolled anything; the person who set the brand up left last year. So I asked the agent before anyone opened a support case blind.&lt;/p&gt;
&lt;p&gt;Why not just paste the error into ChatGPT or Claude? A plain chat hits three walls on any Amazon job. &lt;strong&gt;No access to your data&lt;/strong&gt;: it can&#39;t see who holds the brand or where your application stands. &lt;strong&gt;No way to take action&lt;/strong&gt;: it can&#39;t file anything on Amazon; you drive every screen. &lt;strong&gt;Generic knowledge, not Amazon&#39;s&lt;/strong&gt;: it answers from public training data, not Amazon&#39;s current role rules. That&#39;s disconnected, generic, manual work that ships silent mistakes. The MCP reads the live state, the Skill runs the decision tree, and Atlas supplies the rule book.&lt;/p&gt;
&lt;h2 id=&quot;trademark-is-already-enrolled-means-an-administrator-already-exists-and-the-fix-is-becoming-an-additional-user&quot; tabindex=&quot;-1&quot;&gt;&amp;quot;Trademark is already enrolled&amp;quot; means an Administrator already exists, and the fix is becoming an additional user&lt;/h2&gt;
&lt;p&gt;The first thing the Skill pulled was the rule the error actually points at. Atlas retrieves it from the &lt;strong&gt;Brand Registry FAQ&lt;/strong&gt; playbook in the &lt;code&gt;amazon_sellers&lt;/code&gt; corpus: if a trademark is already enrolled in Brand Registry, you contact the brand&#39;s Administrator and request to be added as an &lt;strong&gt;additional user&lt;/strong&gt;. An Administrator always exists: the &lt;strong&gt;Brand Registry Protection Roles&lt;/strong&gt; playbook says the user who enrolls a brand is automatically assigned the Administrator and Rights Owner roles, and only Administrators can assign roles to others. Three protection roles exist in total, Administrator, Rights Owner, and Registered Agent, and the last two are mutually exclusive. Amazon&#39;s own routing for this message is its Brand Registry Access: Troubleshooting Guide; the fix mechanics live in the FAQ and role playbooks the agent retrieved. The diagnosis: not a trademark dispute, not a second enrollment. A role request, aimed at whoever enrolled first.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT can&#39;t see whether your trademark number is already enrolled in Brand Registry or under whose account; you only discover the conflict when the enrollment flow throws the error. The MCP-connected agent reads the live state before you burn an application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask Claude about the error and it reaches for trademark-office advice: dispute the mark, call your attorney. The grounded answer is a role request to the existing Administrator, a rule that lives in Amazon&#39;s documentation, not public training data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;And your data is now exposed.&lt;/strong&gt; To get even the wrong answer, you pasted your trademark number and account details into a chat history you don&#39;t control. The MCP reads them over an authorized connection, and they stay inside your account.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;request-an-invitation-from-a-known-administrator-or-continue-to-apply-and-share-your-contact-information&quot; tabindex=&quot;-1&quot;&gt;Request an invitation from a known Administrator, or continue to apply and share your contact information&lt;/h2&gt;
&lt;p&gt;Branch one is the shortcut: if you know the identity of a current Administrator, reach out to them directly and request an invitation to the brand. On their side the flow is &lt;strong&gt;Invite a user to your brand&lt;/strong&gt;, then &lt;strong&gt;Send invitation&lt;/strong&gt;, and you have to accept the invitation before anything changes. We had no name to call, which is the branch the Brand Registry FAQ covers next: if you&#39;re unsure who to contact, or the current Administrator is inactive, you can &lt;strong&gt;continue to apply&lt;/strong&gt; for Brand Registry with the same trademark. If you&#39;re an eligible user, the application gives you a step to &lt;strong&gt;share your contact information&lt;/strong&gt; with the Administrator. Approval is discretionary by design: an active Administrator will use that information to add your Brand Registry account to the brand, &lt;em&gt;if they choose to do so&lt;/em&gt;. The Brand Registry Protection Roles playbook shows where the request lands: in the Administrator&#39;s &lt;strong&gt;User Permissions&lt;/strong&gt; tool under &lt;strong&gt;Access requests&lt;/strong&gt;, where they approve or decline each request at their discretion.&lt;/p&gt;
&lt;p&gt;The Skill assembled all of it into the decision plan, every branch traced to a retrieved rule:&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;decision_plan&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;error_message&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Trademark is already enrolled&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;surface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Brand Registry enrollment flow&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;facts_to_gather&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;administrator_known&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Do you know the identity of a current Administrator?&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;administrator_active&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Is that Administrator active and reachable?&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;other_brand_enrolled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Do you have another brand enrolled in Brand Registry?&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; administrator&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;known&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;active
      &lt;span class=&quot;token key atrule&quot;&gt;condition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;You know a current Administrator and they are active&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Reach out directly and request an invitation as an additional user&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;admin_side&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Invite a user to your brand &gt; Send invitation; you accept it&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;outcome&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Added to the brand with the assigned protection role&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; administrator&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;unknown
      &lt;span class=&quot;token key atrule&quot;&gt;condition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Unsure who the Administrator is, or cannot reach them&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Continue to apply with the same trademark&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;during_flow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Share your contact information (step shown to eligible users)&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;admin_side&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Request lands in User Permissions &gt; Access requests&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;decision_rule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Approved or declined at their discretion (if they choose to do so)&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;outcome_if_approved&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Your Brand Registry account is added to the brand&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;outcome_if_no_response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fall through to administrator-inactive&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; administrator&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;inactive
      &lt;span class=&quot;token key atrule&quot;&gt;condition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;No active Administrator (inactive, or left the company)&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; appeal&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;form
          &lt;span class=&quot;token key atrule&quot;&gt;entry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Same flow: a warning links to the Share Contact Information form&quot;&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Click &#39;use this form&#39;; the bottom link opens Appeal Submission&quot;&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;gate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Appeal Submission link is visible only to eligible users&quot;&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;outcome&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Success adds you with Administrator and Rights Owner roles&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; brand&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;registry&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;support
          &lt;span class=&quot;token key atrule&quot;&gt;gate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;One other enrolled brand plus Brand Registry site access&quot;&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Open a case; select &#39;Update brand ownership&#39; as the topic&quot;&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;outcome&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Request reviewed; response follows&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;while_waiting&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;review_sla&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Average 10 business days; identity checks can extend it&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;deadlines&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Complete the application within three days or it shows Expired&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Reply to the case within 10 days with the verification code and case ID&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Brand applications page for status changes&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;statuses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Approved&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Rejected&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Pending submission&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Expired&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Ineligible&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      Pending review&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Withdrawn&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Removed from Brand Registry&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;if_rejected&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Rejected can&#39;t be edited: click Copy, correct, resubmit&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; ChatGPT can&#39;t submit the Brand Registry application or complete the share-contact step for you; the most it produces is a draft message. The Skill scripts the exact click path, continue to apply and then share contact information, so you execute it correctly the first time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Claude can&#39;t see the Administrator&#39;s &lt;strong&gt;Access requests&lt;/strong&gt; queue, so it can&#39;t tell you whether your request is pending, approved, or declined. Silence from Amazon reads like rejection when it may just be an Administrator who hasn&#39;t opened &lt;strong&gt;User Permissions&lt;/strong&gt; yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;an-inactive-administrator-opens-two-escalation-paths-the-use-this-form-appeal-and-an-update-brand-ownership-support-case&quot; tabindex=&quot;-1&quot;&gt;An inactive Administrator opens two escalation paths: the &amp;quot;use this form&amp;quot; appeal and an &amp;quot;Update brand ownership&amp;quot; support case&lt;/h2&gt;
&lt;p&gt;If the Administrator is inactive, the FAQ&#39;s instruction is literal: click &lt;strong&gt;use this form&lt;/strong&gt; to submit your request form. The label undersells what&#39;s behind it. You re-enter the already-registered trademark number during the application, a warning appears offering a link to a form for sharing your contact information, and that link opens the &lt;strong&gt;Share Contact Information&lt;/strong&gt; form. At the bottom of that form sits one more link, available only to eligible users, leading to an &lt;strong&gt;Appeal Submission&lt;/strong&gt; form. Neither playbook defines who counts as eligible, so if you&#39;ve hunted for the appeal form and never found it, that gate is why. When an appeal succeeds, you&#39;re added to the brand with the Administrator and Rights Owner roles, which makes you the brand&#39;s new front door.&lt;/p&gt;
&lt;p&gt;There&#39;s a parallel escalation path with its own gate. If you have at least one other brand already enrolled in Brand Registry and you can access the Brand Registry site, you can submit the request through Brand Registry Support and select &lt;strong&gt;Update brand ownership&lt;/strong&gt; as the topic. Amazon asks that you identify the nature of the error before contacting support, and that&#39;s exactly the triage the plan encodes: it checks the gates and routes you to the path your account qualifies for, instead of letting you file a case that bounces.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Neither ChatGPT nor Claude knows the &lt;strong&gt;use this form&lt;/strong&gt; fallback exists, that it hides at the bottom of the &lt;strong&gt;Share Contact Information&lt;/strong&gt; form, or that the &lt;strong&gt;Appeal Submission&lt;/strong&gt; link is eligibility-gated. You get routed to generic Seller Support and never see the appeal path. Atlas carries the exact rule.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; The support path is gated on having at least one other brand already enrolled under your account. A chat can&#39;t read your Brand Registry account, so it can&#39;t tell you which of the two escalation paths you qualify for. One MCP read settles it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;once-you-reapply-the-clock-is-amazons-10-business-days-of-review-a-3-day-completion-deadline-a-10-day-reply-window&quot; tabindex=&quot;-1&quot;&gt;Once you reapply, the clock is Amazon&#39;s: 10 business days of review, a 3-day completion deadline, a 10-day reply window&lt;/h2&gt;
&lt;p&gt;Reapplying starts a review that takes an average of &lt;strong&gt;10 business days&lt;/strong&gt;, and Amazon may need additional information to verify your identity, which can extend the review period. Two more deadlines ride along, both pulled from the &lt;strong&gt;Brand Registry Application Process&lt;/strong&gt; playbook and both easy to miss. An application that isn&#39;t completed within three days flips to &lt;strong&gt;Expired&lt;/strong&gt;. And when Amazon sends a verification code, you reply to the case within 10 days with the code and the case ID. Those are two different tens: ten business days is how long Amazon takes on average; ten days is how long you get to reply.&lt;/p&gt;
&lt;p&gt;Every application surfaces on the &lt;strong&gt;Brand applications&lt;/strong&gt; page with one of eight statuses: &lt;strong&gt;Approved&lt;/strong&gt;, &lt;strong&gt;Rejected&lt;/strong&gt;, &lt;strong&gt;Pending submission&lt;/strong&gt;, &lt;strong&gt;Expired&lt;/strong&gt;, &lt;strong&gt;Ineligible&lt;/strong&gt;, &lt;strong&gt;Pending review&lt;/strong&gt;, &lt;strong&gt;Withdrawn&lt;/strong&gt;, or &lt;strong&gt;Removed from Brand Registry&lt;/strong&gt;. A rejected application can&#39;t be edited. You locate it on the &lt;strong&gt;Brand applications&lt;/strong&gt; page, click &lt;strong&gt;Copy&lt;/strong&gt;, correct the details, and resubmit. Before that resubmission, the Skill runs the decline-reason pre-checks from the &lt;strong&gt;Manage Brand Registry Application Issues&lt;/strong&gt; playbook: expired trademarks aren&#39;t eligible, supplemental trademarks aren&#39;t accepted (the Principal Register is required), and Amazon currently accepts only text-based marks or image-based marks with words, letters, or numbers.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT can&#39;t check the &lt;strong&gt;Brand applications&lt;/strong&gt; page, so it can&#39;t tell &lt;strong&gt;Pending review&lt;/strong&gt; from &lt;strong&gt;Expired&lt;/strong&gt;, and it can&#39;t warn you that an incomplete application dies after three days. The MCP-connected agent watches the page for you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Claude doesn&#39;t know the verification-code reply window is 10 days against the case ID. Miss it and the enrollment silently stalls, with nobody telling you why.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;The plan isn&#39;t a document the agent hands over and forgets; it&#39;s a watch list. The agent monitors the &lt;strong&gt;Brand applications&lt;/strong&gt; page through the Selling Partner MCP and reports status changes instead of letting the team infer them from silence. It flags the three-day completion deadline the moment an application sits in &lt;strong&gt;Pending submission&lt;/strong&gt;, and it counts down the 10-day verification-code window against the case ID so the reply goes out with days to spare. If the outreach branch stalls with no Administrator response, the plan falls through to the appeal branch instead of waiting for someone to remember.&lt;/p&gt;
&lt;p&gt;The complete workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: the Selling Partner MCP supplies the live Brand Registry and application state, &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; covers the advertising side of the same account when it&#39;s needed, and Atlas grounds every branch of the plan. Scheduled as a recurring Skill, the same triage re-runs until the application lands on &lt;strong&gt;Approved&lt;/strong&gt;, and every Amazon-facing step, the outreach message, the appeal submission, waits for a person to say yes, the gate pattern from &lt;a href=&quot;https://www.kuudo.com/guides/human-approval-for-amc-activation/&quot;&gt;human approval for agent activation&lt;/a&gt;. That&#39;s the whole pattern: read the live state first, walk Amazon&#39;s real decision tree, and put the deadlines on a clock the agent owns instead of a person&#39;s memory.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next in the series: &lt;a href=&quot;https://www.kuudo.com/guides/seller-listing-agentic-audit-to-patch/&quot;&gt;letting the agent fix a failing listing without editing it blind&lt;/a&gt;, the same read-first, approve-before-ship discipline pointed at your live catalog.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Dispute a PO On-Time Accuracy Chargeback</title>
    <link href="https://www.kuudo.com/guides/vendor-po-chargeback-disputes/"/>
    <id>https://www.kuudo.com/guides/vendor-po-chargeback-disputes/</id>
    <published>2026-07-13T00:00:00Z</published>
    <updated>2026-07-13T00:00:00Z</updated>
    <summary>Dispute an Amazon Vendor Central PO on-time accuracy chargeback with the right evidence, route, letter, and 30-day deadline.</summary>
    <content type="html">&lt;p&gt;Dispute a PO on-time accuracy chargeback with evidence that directly contradicts Amazon&#39;s recorded data, and file it through Operational Performance within 30 days of the notification. The strongest submission is not a long explanation. It names the wrong field, supplies the matching PO or carrier record, and asks Amazon to reverse the specific chargeback.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Deadline&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wrong CRDD or PRO&lt;/td&gt;
&lt;td&gt;Appointment or PRO record&lt;/td&gt;
&lt;td&gt;Dispute by data&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External event&lt;/td&gt;
&lt;td&gt;Event evidence&lt;/td&gt;
&lt;td&gt;External exception&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate amount&lt;/td&gt;
&lt;td&gt;Chargeback IDs&lt;/td&gt;
&lt;td&gt;Raise dispute&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First refusal&lt;/td&gt;
&lt;td&gt;New contrary evidence&lt;/td&gt;
&lt;td&gt;Second dispute&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;That is the answer to the message that landed in our queue: &lt;em&gt;&amp;quot;Vendor Central just hit us with a PO on-time accuracy chargeback we believe is wrong. How do we dispute it before the 30-day window closes?&amp;quot;&lt;/em&gt; I gave the chargeback record and PO context to our agent through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt;, with &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; grounding the dispute rules.&lt;/p&gt;
&lt;p&gt;A plain &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;ChatGPT or Claude chat&lt;/a&gt; hits three walls. It has &lt;strong&gt;no access to your data&lt;/strong&gt;, so it cannot compare the chargeback with the PO, appointment, or dispute history. It has &lt;strong&gt;no way to take action&lt;/strong&gt;, so a person still has to find the record and submit the response. It has &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt;, so it can confuse this Vendor Central operational chargeback with a consumer payment dispute. The result is disconnected, generic, manual work that ships silent mistakes.&lt;/p&gt;
&lt;h2 id=&quot;the-first-dispute-is-a-30-day-evidence-deadline-not-a-support-case&quot; tabindex=&quot;-1&quot;&gt;The first dispute is a 30-day evidence deadline, not a support case&lt;/h2&gt;
&lt;p&gt;Amazon&#39;s &lt;strong&gt;How to Dispute a Chargeback in Vendor Operational Performance&lt;/strong&gt; says the initial dispute is due within 30 days of the notification date. If Amazon rejects it, the second dispute is due within 30 days of the first refusal notification. Those are separate clocks, so the agent records both dates instead of treating the first deadline as the whole lifecycle.&lt;/p&gt;
&lt;p&gt;Start in &lt;strong&gt;Reports &amp;gt; Operational Performance&lt;/strong&gt;, open the full chargeback list, locate the chargeback ID, and confirm that &lt;strong&gt;Dispute this chargeback&lt;/strong&gt; is available. The same help content limits a chargeback to two disputes. After two rejections, it is no longer eligible, and a Contact Us case cannot substitute for those two dashboard submissions.&lt;/p&gt;
&lt;p&gt;The practical rule is simple: preserve the first attempt. Submit the cleanest contrary record you have, keep the dispute ID and attachments together, and reserve the second attempt for new evidence or a precise correction to Amazon&#39;s refusal reason.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Chat cannot see whether the button is available, whether the charge is pending, or whether a prior dispute already used one attempt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; A generic answer may tell you to open support immediately, even though Amazon&#39;s policy requires two dashboard disputes first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Plain chat cannot create the deadline, attach the evidence, or submit through Operational Performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;the-evidence-must-contradict-the-exact-po-on-time-data-point&quot; tabindex=&quot;-1&quot;&gt;The evidence must contradict the exact PO on-time data point&lt;/h2&gt;
&lt;p&gt;Amazon&#39;s &lt;strong&gt;Vendor Central Chargebacks Support and Policies&lt;/strong&gt; says PO on-time accuracy covers confirmed products that miss the PO window, including items placed on backorder. The indexed policy measures the prepaid case against the carrier requested delivery date (CRDD). A statement that the shipment was &amp;quot;on time&amp;quot; is weak; an appointment record showing the CRDD inside the delivery window directly contests Amazon&#39;s recorded value.&lt;/p&gt;
&lt;p&gt;Smart Aggregation gives the agent four routes, and choosing the wrong one can end the review before the evidence is considered.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Correct route&lt;/th&gt;
&lt;th&gt;Core input&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wrong Amazon field&lt;/td&gt;
&lt;td&gt;Dispute by data&lt;/td&gt;
&lt;td&gt;PRO or contrary value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Severe external event&lt;/td&gt;
&lt;td&gt;External exception&lt;/td&gt;
&lt;td&gt;Event evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other non-data concern&lt;/td&gt;
&lt;td&gt;Non-data problem&lt;/td&gt;
&lt;td&gt;Issue explanation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not in Smart Aggregation&lt;/td&gt;
&lt;td&gt;Legacy dispute&lt;/td&gt;
&lt;td&gt;Chargeback record&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &lt;strong&gt;Vendor Central Chargebacks - Smart Aggregation Dashboard&lt;/strong&gt; says Dispute by data can validate a core attribute such as a PRO and return a near-real-time indication of whether the evidence is sufficient. External-events exceptions are for circumstances such as severe weather; an unrelated accuracy complaint submitted there is automatically denied. Smart Aggregation is also limited to supported vendors and chargeback types, so the agent falls back to the legacy dashboard when the record is not present.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Chat cannot compare Amazon&#39;s CRDD or PRO with the appointment record in your account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Claude may recommend a persuasive narrative when the workflow expects one contrary data point.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Chat cannot choose the live dispute route or verify that Smart Aggregation is available for the record.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;a-useful-dispute-letter-names-one-error-and-one-contrary-record&quot; tabindex=&quot;-1&quot;&gt;A useful dispute letter names one error and one contrary record&lt;/h2&gt;
&lt;p&gt;The agent produced the following dispute letter after matching the chargeback ID, PO, defect field, and attachment names. Keep the merge fields intact until the corresponding record has been verified. Do not submit a field whose evidence you cannot attach.&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Subject: PO on-time accuracy dispute for chargeback {{CHARGEBACK_ID}}

We dispute PO on-time accuracy chargeback {{CHARGEBACK_ID}} for
PO {{PO_NUMBER}}, notified on {{NOTIFICATION_DATE}}, in the amount of
{{DISPUTED_AMOUNT}}.

Amazon&#39;s chargeback record shows:
- Defect type: {{DEFECT_TYPE}}
- Recorded value: {{AMAZON_RECORDED_VALUE}}

Our source record shows:
- Correct value: {{VENDOR_SOURCE_VALUE}}
- Source: {{SOURCE_SYSTEM_OR_DOCUMENT}}
- Record date: {{SOURCE_RECORD_DATE}}

The attached {{ATTACHMENT_NAME}} ties the PO and shipment to the correct
{{CONTESTED_FIELD}}. It contradicts the value shown in the chargeback record.

Please review the attached evidence and reverse chargeback
{{CHARGEBACK_ID}}. If another field is controlling the decision, please name
that field and its recorded value in the resolution.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For a duplicate, replace the source-record paragraph with both chargeback IDs and state which amount is duplicated. Amazon&#39;s Smart Aggregation guidance explicitly says to raise a dispute when duplicate chargebacks appear so the duplicate can be reversed. For a second dispute, lead with the first dispute ID and Amazon&#39;s refusal reason, then identify the new evidence that answers that reason.&lt;/p&gt;
&lt;p&gt;The letter stays short because the evidence carries the claim. Every sentence either identifies the disputed record, links the contrary evidence to it, or requests a correction.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Chat can fill the template only with values a person pastes into the conversation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; A generic letter often argues fairness without naming the controlling field or dashboard route.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Plain chat cannot attach the source record, preserve the dispute ID, or route a refusal into a second review.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;smart-aggregation-separates-previews-confirmed-charges-and-reversals&quot; tabindex=&quot;-1&quot;&gt;Smart Aggregation separates previews, confirmed charges, and reversals&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Vendor Central Chargebacks - Smart Aggregation Dashboard&lt;/strong&gt; surfaces unconfirmed chargebacks in the &lt;strong&gt;Processing&lt;/strong&gt; tab every seven days. Those rows are projections, not invoices. Once confirmed, a chargeback moves to &lt;strong&gt;Confirmed&lt;/strong&gt;. Starting April 30, 2024, Amazon&#39;s indexed guidance gives 30 days&#39; notice before invoicing PO on-time accuracy chargebacks.&lt;/p&gt;
&lt;p&gt;That preview creates useful working time. The agent can open an evidence task while the item is still processing, pull the PO and carrier references, and flag a likely duplicate before the confirmed amount reaches the dispute queue. Smart Aggregation groups chargebacks at the most granular available attribute, shows the final confirmed amount, and removes duplicates from that view. If a duplicate still appears, the guidance says to dispute it.&lt;/p&gt;
&lt;p&gt;The status is part of the workflow. &lt;strong&gt;Under review&lt;/strong&gt; means wait for the dispute team. &lt;strong&gt;Reversed&lt;/strong&gt; means the payment returns in the next payment cycle. &lt;strong&gt;Waived&lt;/strong&gt; means Amazon did not charge it. &lt;strong&gt;Charged&lt;/strong&gt; means the amount was enforced and remains eligible for the dispute process if the button is available.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Chat cannot distinguish a Processing preview from a confirmed or already reversed charge in the account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; An ungrounded answer can treat every row as money already deducted and start the dispute too late.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Plain chat cannot monitor the seven-day preview cycle or reconcile a reversal with the next payment cycle.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Turn the dispute into a reviewed recurring &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt;, not an auto-submit rule. On each seven-day Processing refresh, the Skill identifies new PO on-time records, collects the controlling PO and carrier fields through the Selling Partner MCP, checks the deadline and prior-attempt count, then prepares the letter and attachments for human approval.&lt;/p&gt;
&lt;p&gt;The complete workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: the Selling Partner MCP supplies live PO and catalog context, &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; supplies the advertising side of the same business when needed, Atlas grounds the chargeback rules, and Skills preserve the evidence and approval trail. The final submission remains a deliberate operator action.&lt;/p&gt;
&lt;p&gt;The letter is the last step; the winning work is matching one chargeback data point to one contrary record before the clock expires.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next, see why &lt;a href=&quot;https://www.kuudo.com/guides/why-mcp-needs-run-logs/&quot;&gt;MCP workflows need run logs&lt;/a&gt; when a reversal, refusal, or second dispute depends on what the agent did the first time.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Measure Off-Amazon Conversions in AMC</title>
    <link href="https://www.kuudo.com/guides/amc-off-amazon-conversion-events-manager/"/>
    <id>https://www.kuudo.com/guides/amc-off-amazon-conversion-events-manager/</id>
    <published>2026-07-11T00:00:00Z</published>
    <updated>2026-07-11T00:00:00Z</updated>
    <summary>Measure DTC web, app, store, and offline conversions in Amazon Marketing Cloud with Events Manager signals and a grounded AMC SQL query.</summary>
    <content type="html">&lt;p&gt;Yes, &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; (AMC) can measure DTC web, app, store, and offline conversions once Events Manager receives them through Amazon Ad Tag (AAT), Conversions API (CAPI), or a Mobile Measurement Partner (MMP), the event is defined in the Amazon demand-side platform (DSP), and it is associated with a DSP order. The practical difference from Amazon conversions is the setup and taxonomy: off-Amazon subtypes arrive as numeric codes, purchase sales and non-purchase value mean different things, and the complete history starts on October 20, 2023. I handed the question to our agent through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt;, grounded by &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;, and asked it to prove each gate before running AMC SQL.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Can AMC read DTC events?&lt;/td&gt;
&lt;td&gt;Yes, through Events Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Required ingestion&lt;/td&gt;
&lt;td&gt;AAT, CAPI, or MMP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Required DSP setup&lt;/td&gt;
&lt;td&gt;Define event; link DSP order&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Purchase revenue&lt;/td&gt;
&lt;td&gt;&lt;code&gt;off_amazon_product_sales&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-purchase value&lt;/td&gt;
&lt;td&gt;&lt;code&gt;off_amazon_conversion_value&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total product sales&lt;/td&gt;
&lt;td&gt;&lt;code&gt;combined_sales&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complete history&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10/20/2023&lt;/code&gt; onward&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;That answers the Slack question: &lt;em&gt;&amp;quot;We&#39;re running DSP ads to our DTC site. Can we measure those conversions inside AMC the same way we measure Amazon conversions?&amp;quot;&lt;/em&gt; A plain &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;ChatGPT or Claude chat&lt;/a&gt; hits three walls. It has &lt;strong&gt;no access to your data&lt;/strong&gt;, so it cannot inspect the advertiser&#39;s Events Manager or AMC instance. It has &lt;strong&gt;no way to take action&lt;/strong&gt;, so a human must copy, validate, and run its SQL. It has &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt;, so it can miss the DSP-order gate, numeric subtype map, or coverage date. That becomes disconnected, generic, manual work that ships silent mistakes. The MCP supplies account access, Atlas supplies Amazon&#39;s current rules, and &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; make the checks repeatable.&lt;/p&gt;
&lt;h2 id=&quot;events-manager-data-reaches-amc-only-after-the-event-is-linked-to-a-dsp-order&quot; tabindex=&quot;-1&quot;&gt;Events Manager data reaches AMC only after the event is linked to a DSP order&lt;/h2&gt;
&lt;p&gt;Sending an event to Amazon DSP is necessary but not sufficient. The &lt;strong&gt;Introduction to Events Manager&lt;/strong&gt; instructional query names three prerequisites: set up AAT, CAPI, or MMP; define the event in Amazon DSP; and associate that event with an Amazon DSP order. If the order association is missing, the data does not flow into AMC. The empty result can look like zero customer activity even though the failure is configuration.&lt;/p&gt;
&lt;p&gt;The agent therefore runs a preflight before SQL. It checks the ingestion source, event definition, order association, AMC instance, and requested start date, then returns a pass or a named setup failure. That sequence also keeps the claim precise: Events Manager covers off-Amazon web, offline, and app events used for attribution, reporting, optimization, and targeting, but the event must pass the DSP setup gate first.&lt;/p&gt;
&lt;p&gt;All Events Manager signals are available in AMC whether ad-exposed or not, and the playbook says the paid &lt;code&gt;conversions_all&lt;/code&gt; subscription is not required to query non-ad-exposed Events Manager signals. That makes non-ad-exposed analysis possible without making it causal proof. It is a comparison and audience-discovery input, not evidence that advertising created an outcome in a user who was never exposed.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT cannot see whether the event definition is actually linked to the order. You would have to inspect DSP yourself and paste the result back into chat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Claude can write plausible AMC SQL while omitting the order-association gate. The query then returns no rows, and the setup failure is mistaken for zero conversions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Plain chat cannot run the preflight or execute the AMC workflow. The Amazon Ads MCP can perform those account-bound checks through an authorized connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;purchase-sales-and-non-purchase-conversion-value-are-different-measurements&quot; tabindex=&quot;-1&quot;&gt;Purchase sales and non-purchase conversion value are different measurements&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;off_amazon_product_sales&lt;/code&gt; is monetary sales from off-Amazon purchases. &lt;code&gt;off_amazon_conversion_value&lt;/code&gt; is an advertiser-defined, unitless value for non-purchase events such as a page view, app install, lead, or form submission. Do not add the second field to revenue or use it in return on ad spend (ROAS) unless the advertiser has explicitly documented a monetary scoring convention outside the schema.&lt;/p&gt;
&lt;p&gt;Events Manager also represents off-Amazon &lt;code&gt;conversion_event_subtype&lt;/code&gt; values as numeric codes. The retrieved mapping is:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th style=&quot;text-align:right&quot;&gt;Code&lt;/th&gt;
&lt;th&gt;Monetary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subscribe&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sign-up&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;21&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App first start&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;37&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add to cart&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;53&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Off-Amazon purchase&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;54&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;133&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page view&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;134&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;135&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contact&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;136&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkout&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;140&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lead&lt;/td&gt;
&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;141&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The event formerly labeled &lt;strong&gt;Product purchased&lt;/strong&gt; is now &lt;strong&gt;Off-Amazon purchase&lt;/strong&gt;. The Skill keeps the mapping versioned and leaves an unknown code visible instead of coercing it to a familiar label. That is safer than silently converting an unrecognized future subtype into revenue.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; ChatGPT may compare the subtype to &lt;code&gt;purchase&lt;/code&gt; or &lt;code&gt;add_to_cart&lt;/code&gt;, but Events Manager sends the numeric codes &lt;code&gt;54&lt;/code&gt; and &lt;code&gt;53&lt;/code&gt; for those off-Amazon events.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Claude may call every configured value revenue or reuse the old Product purchased label. That inflates ROAS and hides a renamed event.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Plain chat cannot see the advertiser-defined event names or determine whether an unknown subtype has entered the instance. The agent checks the returned taxonomy before labeling the output.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;the-canonical-total-impact-query-joins-campaign-delivery-to-conversion-outcomes&quot; tabindex=&quot;-1&quot;&gt;The canonical Total Impact query joins campaign delivery to conversion outcomes&lt;/h2&gt;
&lt;p&gt;Amazon&#39;s canonical &lt;strong&gt;Total Impact Analysis&lt;/strong&gt; query from &lt;strong&gt;Introduction to Events Manager&lt;/strong&gt; joins campaign cost, impressions, and unique reach from &lt;code&gt;dsp_impressions&lt;/code&gt; to Amazon and off-Amazon outcomes from &lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt;. It keeps purchase sales, non-purchase value, combined sales, and conversion counts separate, then calculates Amazon and off-Amazon ROAS from the corresponding monetary sales fields. Set the workflow&#39;s date range in the AMC query editor to October 20, 2023 or later before running it.&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;-- Instructional Query: How to query Events Manager Signals - Total Impact Analysis --&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- AD PRODUCTS: Amazon DSP&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*
 ------- Customization Instructions -------
 1) Set the &quot;Date range&quot; in the Query Editor to define the time range.
 1a) It is recommended to query events after 10/20/2023, as events before this date may be missing dimensions and metrics.
 */&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Gather campaign cost and impression data&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; traffic &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    campaign_id_string&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    campaign&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_cost &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_cost&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; unique_reach
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;
    dsp_impressions
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;
    user_id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Gather Amazon and off-Amazon (Events Manager events) conversion data&lt;/span&gt;
conversions &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    campaign_id_string&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    conversion_event_source_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    conversion_event_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    conversion_event_category&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt;
      conversion_event_subtype
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;53&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Add to shopping cart&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Application&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;140&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Checkout&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;136&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Contact&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;141&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Lead&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;54&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Off-Amazon purchase&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;133&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Other&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;134&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Page View&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;135&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Search&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;21&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Sign-up&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Subscribe&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;ELSE&lt;/span&gt; conversion_event_subtype
    &lt;span class=&quot;token keyword&quot;&gt;END&lt;/span&gt; amazon_conversion_event&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;off_amazon_conversion_value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; off_amazon_conversion_value&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;off_amazon_product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; off_amazon_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;conversions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; conversions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_purchases&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;combined_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; combined_sales
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;
    amazon_attributed_events_by_traffic_time
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;-- Join cost and impressions with conversions&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conversion_event_category&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conversion_event_source_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conversion_event_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;amazon_conversion_event&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_cost&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_cost&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;unique_reach&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; unique_reach&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;off_amazon_conversion_value&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; off_amazon_conversion_value&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;off_amazon_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; off_amazon_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conversions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; conversions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;combined_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; combined_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_cost&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_cost&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;ELSE&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; amazon_roas&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_cost&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;off_amazon_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_cost&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;ELSE&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; off_amazon_roas
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;
  traffic t
  &lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; conversions c &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_id_string &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_id_string
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt;
  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The query stays faithful to the retrieved instructional query, including Amazon&#39;s &lt;code&gt;total_cost / 100000&lt;/code&gt; normalization and campaign-ID join. Inspect the returned source names and event definitions before operationalizing it; unknown subtype codes stay visible through the &lt;code&gt;ELSE&lt;/code&gt; branch instead of being silently relabeled.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;combined_sales&lt;/code&gt; is Amazon &lt;code&gt;total_product_sales&lt;/code&gt; plus &lt;code&gt;off_amazon_product_sales&lt;/code&gt;; it does not include the unitless value assigned to non-purchase conversions. The query reports Amazon and off-Amazon ROAS separately, so leads and page views never enter either monetary numerator. A combined-sales return can be derived downstream only after the output grain and cost allocation have been reviewed.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT cannot discover the source names and custom event names in your AMC instance. You would have to run the query, export the result, and paste it back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Claude may calculate total impact from Amazon sales alone or add &lt;code&gt;off_amazon_conversion_value&lt;/code&gt; to the numerator. Both change what ROAS means.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Plain chat cannot execute or schedule the AMC workflow. The Amazon Ads MCP runs the canonical query, while the Skill validates returned codes before downstream calculation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;events-manager-history-is-complete-only-from-october-20-2023-onward&quot; tabindex=&quot;-1&quot;&gt;Events Manager history is complete only from October 20, 2023 onward&lt;/h2&gt;
&lt;p&gt;Treat October 20, 2023 as the completeness boundary for the named Events Manager dimensions and metrics in &lt;code&gt;amazon_attributed_events_by_*&lt;/code&gt; and &lt;code&gt;conversions*&lt;/code&gt; tables. Earlier periods can be missing those fields. A range before the boundary can also omit 30-day ad-unexposed events from &lt;code&gt;conversions&lt;/code&gt; and &lt;code&gt;conversions_with_relevance&lt;/code&gt;, so a lower historical count is not safely interpreted as lower customer activity.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Off-Amazon Conversions Playbook&lt;/strong&gt; carries the result beyond reporting into campaign measurement, segmentation, and separately reviewed audience creation. Examples include users who added to cart off Amazon but did not purchase, converters who were not ad-exposed, and non-ad-exposed purchasers of product A who may be candidates for product B. Those are useful hypotheses. They do not prove incrementality, and measurement SQL does not activate an audience by itself.&lt;/p&gt;
&lt;p&gt;AMC only returns aggregated, pseudonymized outputs that meet its aggregation thresholds. The agent keeps the output at campaign and event grain, avoids &lt;code&gt;SELECT *&lt;/code&gt;, rejects unsafe start dates, and reports suppressed or unknown results instead of turning them into zeros.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; ChatGPT may query the advertiser&#39;s full history and interpret missing pre-boundary data as zero. The agent applies the &lt;code&gt;10/20/2023&lt;/code&gt; guard before execution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Claude cannot see whether sparse event groups were suppressed by AMC thresholds or whether the requested window crosses the completeness boundary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Plain chat cannot schedule a corrected run or route a reviewed segment into a separate audience workflow. The Skill can stop the run, explain the guard, and continue only with an approved window.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;After the preflight and subtype checks pass, schedule the total-impact analysis as a recurring Skill. Keep Amazon product sales, DTC purchase sales, and non-purchase conversion value in separate output columns; use &lt;code&gt;combined_sales&lt;/code&gt; for the Amazon-plus-DTC product-sales view; and review any unknown subtype before the run reaches a dashboard or optimization rule.&lt;/p&gt;
&lt;p&gt;The complete workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; supplies live AMC access, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; adds catalog or retail context when the decision needs it, &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; make the checks recurring, and Amazon Agent Atlas grounds the taxonomy, date rule, and setup gates. If a segment is worth activating, hand it to a separate reviewed audience workflow rather than making activation an invisible side effect of measurement.&lt;/p&gt;
&lt;p&gt;Events Manager turns DTC outcomes into dependable AMC measurement only when ingestion, DSP association, event taxonomy, and revenue semantics are all correct.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next, place those captured outcomes inside &lt;a href=&quot;https://www.kuudo.com/guides/amc-path-to-conversion-sankey/&quot;&gt;the full AMC path across DSP and sponsored ads&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Rebuild Your Listing Images From Your Own Photos</title>
    <link href="https://www.kuudo.com/guides/seller-listing-image-regeneration-seeded/"/>
    <id>https://www.kuudo.com/guides/seller-listing-image-regeneration-seeded/</id>
    <published>2026-06-25T00:00:00Z</published>
    <updated>2026-06-25T00:00:00Z</updated>
    <summary>Seed new Amazon listing images from your own photos, grade each against Amazon&#39;s image rules, and approve before anything publishes, grounded by Atlas.</summary>
    <content type="html">&lt;p&gt;Rebuilding a thin listing gallery is one conversation: the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-iris/&quot;&gt;Amazon Agent Iris&lt;/a&gt; Skill seeds new images from your own product photos, fills factual details from the listing&#39;s own catalog data, grades every image against Amazon&#39;s rules through &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;, and waits for you to approve before it publishes a single one through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt;. One photo in, a full compliant set out, nothing live until you say yes.&lt;/p&gt;
&lt;p&gt;That sequence exists because of a Slack message I get some version of every month: &lt;em&gt;&amp;quot;Can the agent use our existing product photos as seeds to make better listing images that still pass Amazon&#39;s image rules, and let me approve before anything publishes?&amp;quot;&lt;/em&gt; The pain underneath is the long tail. Most catalogs stay underbuilt because fixing every laggard meant a photographer, a studio, a designer, and a round of manual uploads, and that was never worth it for a SKU doing twelve units a month. Good imagery used to mean picking two of fast, cheap, and safe. So I handed a thin water-bottle listing to &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;our agent&lt;/a&gt; with one rule: seed from our real photos, check before you publish, and stop at my approval.&lt;/p&gt;
&lt;p&gt;Why not just do this in ChatGPT or Claude? A generic chat hits the same three walls on any Amazon job. It has &lt;strong&gt;no access to your data&lt;/strong&gt;, so it cannot read your live listing or your existing photos and works only from what you paste in. It has &lt;strong&gt;no way to take action&lt;/strong&gt;, so it cannot check an image against Amazon&#39;s policy, publish it, or confirm it landed; the most it can do is hand you a file to upload by hand in Seller Central, where images can take up to 24 hours to appear and uploading does not guarantee display. And it runs on &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt;, public training data rather than Amazon&#39;s current, in-depth image rules (white background, the zoom threshold, per-category main-image rules, suppression triggers). What you get is disconnected, generic, manual work that ships silent mistakes, and a non-compliant image can suppress the listing from search until you fix it. Each section below clears one of those walls with the Selling Partner MCP (your data, plus the tools to act and publish), Atlas (the private Amazon image rule book), and the Amazon Agent Iris Skill (the seed, check, approve, publish loop).&lt;/p&gt;
&lt;h2 id=&quot;seeding-from-your-own-product-photos-turns-a-photographer-studio-designer-upload-chain-into-one-conversation&quot; tabindex=&quot;-1&quot;&gt;Seeding from your own product photos turns a photographer-studio-designer-upload chain into one conversation&lt;/h2&gt;
&lt;p&gt;The benefit first: you get studio-quality images without a studio, and the time and cost of that whole chain collapse into a single run. The Amazon Agent Iris Skill on the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; reads the listing and its existing images, then generates new images seeded from the seller&#39;s own product photos, so the real product identity, logos, and printed text stay intact rather than becoming generic stock. It fills factual details, like size-guide measurements, from the listing&#39;s own catalog data, so the specs are exact and not invented. The whole loop runs in one conversation with no manual Seller Central uploads.&lt;/p&gt;
&lt;p&gt;Here is what it looked like. The water-bottle listing started with one image and ended with four candidates in a single run: a sharpened white-background main shot, a true lifestyle scene of the bottle in use, a precise size guide whose measurements came straight from the listing&#39;s own data, and a detail shot the validator bounced for falling under the zoom threshold. That gate is the point, and the surviving set still cleared the four-image target shape, which is not arbitrary. It follows the recommended set in Amazon&#39;s image guidance: one image of the product on a white background, one in an environment, and one with product information such as dimensions. The Skill seeded all of it from photos we already owned.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT cannot see your listing or your existing photos, so it cannot seed from your real product. You would have to describe it or paste images, and it invents a generic-looking product that is not quite yours. The Skill reads your real photos through the MCP and seeds from them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Even if Claude drafts an image, it cannot get it onto Amazon. You export it and upload it by hand in Seller Central, where it can take up to 24 hours to appear and may not display at all. The Skill publishes through the MCP and confirms it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;And your data is now exposed.&lt;/strong&gt; To get this far you pasted product photos and account context into a chat history you do not control. The Skill never copies your data into a prompt; the MCP reads it over an authorized connection and it stays in your account.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;when-cost-per-image-and-effort-per-listing-crater-the-math-flips-every-listing-gets-brought-up-to-standard-not-just-the-heroes&quot; tabindex=&quot;-1&quot;&gt;When cost-per-image and effort-per-listing crater, the math flips: every listing gets brought up to standard, not just the heroes&lt;/h2&gt;
&lt;p&gt;The benefit here is catalog-wide quality that was never economically possible before. Because the loop is a reusable &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt;, the same seed, check, approve, publish run scales across the catalog. The long tail of thin and single-image listings was never worth a studio shoot, so it stayed underbuilt and under-converting. When the per-listing cost collapses, the recovered conversion from that long tail becomes reachable, and the recommended set (white-background main, an environment image, a product-information image, ideally six or more images per the &lt;strong&gt;Product Image Requirements for Amazon Listings&lt;/strong&gt; guidance) is now within reach for a SKU doing twelve units a month, not just the flagship.&lt;/p&gt;
&lt;p&gt;The standard each listing is brought up to is Amazon&#39;s, not a house style. I run it as a recurring Skill across the catalog, often kicked off when the &lt;a href=&quot;https://www.kuudo.com/guides/seller-listing-agentic-audit-to-patch/&quot;&gt;audit-to-patch workflow&lt;/a&gt; flags an image laggard, so a thin gallery gets re-merchandised the same week it is found instead of next quarter.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; A chat cannot run the same fix across 400 ASINs (Amazon Standard Identification Numbers). You would repeat the paste, export, upload dance by hand for each one, which is exactly why the long tail never gets fixed. The Skill re-runs the loop unattended up to the approval gate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask a chat to batch-improve listings and it gives the same generic advice for every product type, missing that a Fashion main image follows different rules from a shoe or a kids&#39; item. The Skill grades each against the per-category rule (next section).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; A chat cannot tell which of your listings are actually underbuilt, because it cannot see your catalog. The MCP reads which listings are thin and worth upgrading.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;every-generated-image-is-graded-against-amazons-image-rules-before-it-can-publish-and-a-human-approves-the-final-set&quot; tabindex=&quot;-1&quot;&gt;Every generated image is graded against Amazon&#39;s image rules before it can publish, and a human approves the final set&lt;/h2&gt;
&lt;p&gt;This is the part that makes the speed safe: nothing publishes that breaks Amazon&#39;s rules or that you did not approve. The Skill checks each generated image against Amazon&#39;s image policy before anything publishes, a policy validator that returns a per-image verdict, grounded by Atlas against the &lt;strong&gt;Product Image Requirements for Amazon Listings&lt;/strong&gt;, &lt;strong&gt;Suppressed Listings Management&lt;/strong&gt;, and the per-category style guides such as the &lt;strong&gt;Fashion Category Style Guide&lt;/strong&gt; (the &lt;code&gt;listing_categories_style_guide&lt;/code&gt; set). That verdict set is the audit report the Skill produces:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;asin&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;B0EXAMPLE34&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;sku&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;BOTTLE-32OZ&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;seeded_from&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;existing main product photo + 1 detail photo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;starting_images&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;proposed_images&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;slot&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;kind&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;white-background product shot&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;verdict&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pass&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;checks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;pure white background (255,255,255)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;product ~85% of frame&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;no text/logos&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&gt;1,000 px longest side&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;grounded_in&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Product Image Requirements for Amazon Listings&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;slot&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary-1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;kind&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lifestyle / environment scene&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;verdict&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pass&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;checks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;represents real product&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;no added accessories not included&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;grounded_in&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Product Image Requirements for Amazon Listings&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;slot&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary-2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;kind&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;size guide (measurements from catalog data)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;verdict&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;needs changes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;fix&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;specs pulled from listing&#39;s own catalog data; confirm dimensions before approve&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;grounded_in&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Product Image Requirements for Amazon Listings (product-information image)&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;slot&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;secondary-3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;kind&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;detail / texture shot&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;verdict&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;reject&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;fix&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;longest side under 1,000 px; regenerate at higher resolution for zoom&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;grounded_in&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Product Image Requirements for Amazon Listings (1,000 pixels)&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;suppression_risk_if_published_uncorrected&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;awaiting&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;human approval before publish&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Read the verdicts left to right. &lt;strong&gt;Pass&lt;/strong&gt; means compliant and ready. &lt;strong&gt;Needs changes&lt;/strong&gt; is a human judgment call, like confirming the size-guide dimensions the Skill pulled from the catalog. &lt;strong&gt;Reject plus fix&lt;/strong&gt; is a hard rule failure with the exact remedy attached. The rules behind those verdicts are Amazon&#39;s, retrieved through Atlas, not paraphrased from training data. The main image must have a pure &lt;strong&gt;white background&lt;/strong&gt; (RGB 255,255,255), the product must fill about 85 percent of the frame, and there can be no text, logos, or watermarks. Images over &lt;strong&gt;1,000 pixels&lt;/strong&gt; on the longest side enable the zoom Amazon prioritizes, with all images between 500 and 10,000 pixels. The image must accurately represent the product&#39;s real scale, quantity, and color. And the reason the check runs before publish rather than after: a non-compliant image will suppress the listing from search until compliant images are provided, the rule grounded in &lt;strong&gt;Suppressed Listings Management&lt;/strong&gt;. Which rule applies to the main image depends on the category, so the validator grades a Fashion item against the &lt;strong&gt;Fashion Category Style Guide&lt;/strong&gt; and a different product type against its own guide. The agent never makes the judgment call of whether an image truly represents the product; a human signs off, and only then does the Skill publish through the MCP and verify ingestion.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; A chat cannot test an image against Amazon&#39;s validator, so nothing catches a bad image before it is live. You only learn it failed when the listing gets suppressed from search and stops converting. The Skill grades each image before publish and ships only what passed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Claude does not know the 1,000-pixel zoom threshold, the pure-white-background rule, or that a category like Fashion has its own main-image rules, so if you upload its output by hand, Amazon can reject or suppress it. The agent is grounded in Amazon&#39;s current image rules through Atlas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; A chat will happily invent measurements for a size-guide image. The Skill pulls them from your listing&#39;s own catalog data, and a human approves that the image truly represents the product before it ships, the call a machine should not make alone.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Once the verdicts are clean and the human approves the set, the Skill publishes the approved images through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; and then confirms ingestion. It verifies the images actually went live rather than assuming success, the opposite of the manual path where images can take up to 24 hours and may never display. Anything that cannot clear forks off: an image marked reject goes back through the seed-and-check loop at higher resolution, and an underlying suppression that no image can fix is the audit-to-patch concern. I run the whole thing as a recurring &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; across the catalog so newly thin or newly suppressed listings get re-merchandised, with the same approval gate in front of every run. Run this way, the loop is one lane of the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: the same Amazon Agent Flow fabric that wires the Selling Partner MCP, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt;, and Atlas into automation your team approves rather than babysits. This is the image side of the &lt;a href=&quot;https://www.kuudo.com/guides/seller-listing-agentic-audit-to-patch/&quot;&gt;audit-to-patch workflow&lt;/a&gt;, which forks an image-suppression finding straight into this loop.&lt;/p&gt;
&lt;p&gt;The pattern is the same one that makes any of this safe: seed from your own truth, check before publish, approve before live. That is not model cleverness. It is the product surface doing its job.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next in the series: bringing a suppressed FBA (Fulfillment by Amazon) listing back into search when the problem is not the image but the inventory state behind it.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Amazon FBM Orders Reports: What to Request and Why</title>
    <link href="https://www.kuudo.com/guides/seller-fbm-orders-reports/"/>
    <id>https://www.kuudo.com/guides/seller-fbm-orders-reports/</id>
    <published>2026-06-22T00:00:00Z</published>
    <updated>2026-06-22T00:00:00Z</updated>
    <summary>Choose Seller Central FBM reports for fulfillment data and SP-API All Orders reports for tracking, support, and finance cuts.</summary>
    <content type="html">&lt;p&gt;Use Seller Central FBM Order Reports for fulfillment data, and use the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Amazon Selling Partner API (SP-API) MCP&lt;/a&gt; to request SP-API All Orders reports when the job is tracking, support, reconciliation, or a finance period cut. Those are different files with different risk profiles, even though operators often call both &amp;quot;FBM orders.&amp;quot;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operator need&lt;/th&gt;
&lt;th&gt;Request&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fulfill seller-fulfilled packages&lt;/td&gt;
&lt;td&gt;Seller Central &lt;code&gt;FBM Order Reports&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Includes buyer information needed to fulfill FBM orders.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catch changed orders since the last sync&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns all Merchant Fulfilled Network (MFN) and Fulfillment by Amazon (FBA) orders updated in the period.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cut orders by purchase period&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET_FLAT_FILE_ALL_ORDERS_DATA_BY_ORDER_DATE_GENERAL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns all MFN and FBA orders placed in the period.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backfill older placed orders&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET_FLAT_FILE_ARCHIVED_ORDERS_DATA_BY_ORDER_DATE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retrieves archived orders by order date.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The practical question came from an ops lead: &lt;em&gt;&amp;quot;We need a daily FBM order file for the warehouse and a support file for changed orders. Can the agent just pull the FBM report through SP-API?&amp;quot;&lt;/em&gt; The answer is yes for the support file, not by that name for the warehouse file. &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; retrieved the Seller Central &lt;strong&gt;FBM Order Reports&lt;/strong&gt; article and Amazon&#39;s &lt;strong&gt;SP-API order report type values&lt;/strong&gt; reference, and the distinction matters: one is a fulfillment file with buyer data; the other is an order-tracking report family that Amazon explicitly says is not for driving seller fulfillment.&lt;/p&gt;
&lt;p&gt;A plain &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;ChatGPT or Claude client&lt;/a&gt; hits the same three walls on this job. It has &lt;strong&gt;no access to your data&lt;/strong&gt;, so it cannot see your seller account, marketplaces, or last successful report window. It has &lt;strong&gt;no way to take action&lt;/strong&gt;, so it cannot call &lt;code&gt;createReport&lt;/code&gt;, poll &lt;code&gt;getReport&lt;/code&gt;, or retrieve the report document. And it runs on &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt;, so it easily collapses Seller Central FBM reports, restricted fulfillment reports, and SP-API All Orders tracking reports into one imaginary endpoint. The MCP brings account access and report tools; Atlas brings the exact Amazon rule corpus; Skills make the request, polling, download, and archival loop repeatable.&lt;/p&gt;
&lt;h2 id=&quot;start-with-the-fulfillment-question-not-the-api-endpoint&quot; tabindex=&quot;-1&quot;&gt;Start with the fulfillment question, not the API endpoint&lt;/h2&gt;
&lt;p&gt;Amazon&#39;s Seller Central &lt;strong&gt;FBM Order Reports&lt;/strong&gt; article says the FBM order report is a tab-delimited text file for seller-fulfilled products sold during a selected period. It includes the buyer information needed to fulfill orders, but not confidential billing or credit-card information. It can be generated manually for the past 1, 2, 7, 15, or 30 days, and it can be scheduled. Because Seller Central does not generate those reports beyond 30 days, the operational pattern is simple: archive the daily file if it is your warehouse record.&lt;/p&gt;
&lt;p&gt;The SP-API All Orders report family answers a different question. In Amazon&#39;s &lt;strong&gt;order report type values&lt;/strong&gt; reference, Amazon describes the All Orders reports as order-tracking reports available in all regions and for all sellers. They return all orders regardless of fulfillment channel or shipment status, but they are intended for tracking, not fulfillment, because they do not include customer-identifying information and scheduling is not supported.&lt;/p&gt;
&lt;p&gt;For a warehouse, that distinction is not academic. A warehouse dispatch queue needs shipment-ready buyer data. A support or operations queue often needs &amp;quot;what changed since yesterday&amp;quot; and can safely operate from order ID, SKU, status, channel, quantities, city/state/postal/country, and prices. The agent should branch on that intent before it asks the SP-API MCP for anything.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask for an &amp;quot;FBM orders report&amp;quot; and it may invent one endpoint or hand you the All Orders report for fulfillment. Atlas surfaces the Seller Central FBM report and the SP-API All Orders report family as separate sources, so the agent does not confuse dispatch data with tracking data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; The chat cannot inspect your marketplaces, fulfillment mix, or last archive date. The Selling Partner MCP reads the seller context through an authorized connection before choosing the report.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; It cannot schedule or request anything. It can only tell an operator to click around, which is exactly where daily report archives get missed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;request-all-orders-by-last-update-when-operations-need-changed-orders&quot; tabindex=&quot;-1&quot;&gt;Request all-orders by last update when operations need changed orders&lt;/h2&gt;
&lt;p&gt;When support asks &amp;quot;what changed since the last sync,&amp;quot; the MCP should request &lt;code&gt;GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL&lt;/code&gt;. Amazon&#39;s reference says this report contains all orders updated in the specified period, covers MFN and FBA, is available to sellers, and returns a tab-delimited flat file. It is a requested report, not a scheduled one, and the date range is limited to 30 days. For self-fulfilled pending orders, Amazon also notes that item price is not shown, so do not use this report as a pending-order revenue ledger.&lt;/p&gt;
&lt;p&gt;This is the right operational feed for support queues, warehouse exception review, cancellations, shipment-status changes, and downstream systems that reconcile on &lt;code&gt;last-updated-date&lt;/code&gt;. It also avoids a common off-by-one mistake: if a customer changes or cancels an older order today, an order-date report for today&#39;s placed orders will miss it, but a last-updated report will catch it.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;mcp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amazon-spapi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;tool&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;reports.createReport&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;arguments&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;reportType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;marketplaceIds&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ATVPDKIKX0DER&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;dataStartTime&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-06-21T00:00:00Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;dataEndTime&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-06-22T00:00:00Z&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The agent should store the successful window boundary with the run log, then make the next request from the prior &lt;code&gt;dataEndTime&lt;/code&gt;. That is a &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; responsibility, not something an operator should remember in a prompt.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; A chat cannot know your last completed report window or whether yesterday&#39;s run failed halfway through download. The MCP-backed Skill can read the run log and request only the missing window.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; It often chooses order date because that sounds natural. Amazon&#39;s reference says last update is the report type for orders updated in the period, which is the support and exception-management question.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Even with the right report type, a chat cannot submit &lt;code&gt;createReport&lt;/code&gt; or watch processing status. The agent can.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;request-all-orders-by-order-date-when-finance-needs-a-period-cut&quot; tabindex=&quot;-1&quot;&gt;Request all-orders by order date when finance needs a period cut&lt;/h2&gt;
&lt;p&gt;When finance or planning asks &amp;quot;what orders were placed in this period,&amp;quot; request &lt;code&gt;GET_FLAT_FILE_ALL_ORDERS_DATA_BY_ORDER_DATE_GENERAL&lt;/code&gt;. The same SP-API order type values reference says this report contains all orders placed in the specified period, with MFN and FBA rows in a tab-delimited file. Use it for daily sales cuts, month-to-date order extracts, reconciliation against BI tables, and date-based audits.&lt;/p&gt;
&lt;p&gt;For FBM-only analysis, do not request a different report just because the business says &amp;quot;FBM.&amp;quot; Request the All Orders period cut, then filter the rows where the fulfillment channel is merchant fulfilled. The report&#39;s value is that it holds both MFN and FBA orders, so the same extract can support FBM exception analysis and whole-account reporting.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;mcp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amazon-spapi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;tool&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;reports.createReport&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;arguments&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;reportType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GET_FLAT_FILE_ALL_ORDERS_DATA_BY_ORDER_DATE_GENERAL&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;marketplaceIds&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ATVPDKIKX0DER&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;dataStartTime&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-06-01T00:00:00Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;dataEndTime&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-06-22T00:00:00Z&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the request is a historical backfill by order date, Amazon&#39;s archived order report reference identifies &lt;code&gt;GET_FLAT_FILE_ARCHIVED_ORDERS_DATA_BY_ORDER_DATE&lt;/code&gt; as the archived-orders report type. Keep that as a deliberate backfill path, not the default daily workflow.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; It may tell you &amp;quot;order date&amp;quot; and &amp;quot;last update&amp;quot; are interchangeable. They are not. The report names encode different selection rules, so the wrong one silently drops the orders you meant to include.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; It cannot see whether the finance period crosses marketplaces, whether a run was already completed, or whether the extract should be filtered to MFN after download.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; It cannot request the period cut or retrieve the tab-delimited file. The SP-API MCP can submit the request and pass the result into the next workflow.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;let-the-sp-api-mcp-handle-polling-retrieval-and-storage-discipline&quot; tabindex=&quot;-1&quot;&gt;Let the SP-API MCP handle polling, retrieval, and storage discipline&lt;/h2&gt;
&lt;p&gt;Atlas also pulled Amazon&#39;s Reports API tutorials for requesting a report, verifying report processing, and retrieving a report document. The sequence is mechanical, which is exactly why it belongs in a Skill.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Call &lt;code&gt;createReport&lt;/code&gt; with &lt;code&gt;reportType&lt;/code&gt;, &lt;code&gt;marketplaceIds&lt;/code&gt;, and optional &lt;code&gt;dataStartTime&lt;/code&gt; / &lt;code&gt;dataEndTime&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Poll &lt;code&gt;getReport&lt;/code&gt; with the returned &lt;code&gt;reportId&lt;/code&gt; until &lt;code&gt;processingStatus&lt;/code&gt; is &lt;code&gt;DONE&lt;/code&gt;, &lt;code&gt;CANCELLED&lt;/code&gt;, or &lt;code&gt;FATAL&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;DONE&lt;/code&gt; includes &lt;code&gt;reportDocumentId&lt;/code&gt;, call &lt;code&gt;getReportDocument&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Download the returned pre-signed &lt;code&gt;url&lt;/code&gt; before it expires, applying &lt;code&gt;compressionAlgorithm&lt;/code&gt; if present.&lt;/li&gt;
&lt;li&gt;Keep encryption at rest; Amazon&#39;s retrieve tutorial warns against storing unencrypted report content on disk, even temporarily.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;mcp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amazon-spapi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;tool&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;reports.getReport&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;arguments&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;reportId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amzn1.spapi-report.example&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;mcp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amazon-spapi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;tool&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;reports.getReportDocument&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;arguments&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;reportDocumentId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amzn1.spdoc.example&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The failure states matter. &lt;code&gt;CANCELLED&lt;/code&gt; can mean Amazon found no eligible data. &lt;code&gt;FATAL&lt;/code&gt; can still include a document that explains the failure. &lt;code&gt;IN_QUEUE&lt;/code&gt; and &lt;code&gt;IN_PROGRESS&lt;/code&gt; are not terminal, so the agent should keep polling instead of telling the operator the report is missing.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; A chat cannot poll &lt;code&gt;getReport&lt;/code&gt;, retrieve a pre-signed URL, or download before expiry. It will leave the operator with a checklist.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; It often misses the terminal states and treats any non-DONE status as an error. Amazon distinguishes queued, in-progress, cancelled, done, and fatal states.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; It cannot apply the seller&#39;s storage policy or write the artifact to the approved encrypted location. The MCP workflow can route the document through the account&#39;s governed path.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;In production, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt;, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt;, &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt;, and the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt; sit behind one agent surface, so a support request can pull the right SP-API order report, archive it, and hand downstream teams the same audited artifact. The same pattern powers the approval loop in &lt;a href=&quot;https://www.kuudo.com/guides/seller-listing-agentic-audit-to-patch/&quot;&gt;Preview Listing Patches Before They Go Live&lt;/a&gt;: retrieve the governed source, perform the narrow action, write the run log, and keep the operator out of manual repeat work.&lt;/p&gt;
&lt;p&gt;For this guide, the narrow action is report selection. A warehouse dispatch workflow needs the Seller Central FBM fulfillment file or a restricted fulfillment path. A support, finance, or reconciliation workflow should ask the SP-API MCP for the All Orders report type that matches the date logic.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next in the series: using SP-API order status changes to decide when an agent should notify support, warehouse operations, or finance without turning every report row into an alert.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Find Your Optimal DSP Frequency Cap in AMC</title>
    <link href="https://www.kuudo.com/guides/amc-optimal-frequency-cap/"/>
    <id>https://www.kuudo.com/guides/amc-optimal-frequency-cap/</id>
    <published>2026-06-13T00:00:00Z</published>
    <updated>2026-06-13T00:00:00Z</updated>
    <summary>Find your optimal Amazon DSP frequency cap in AMC: bucket impressions and conversions, then cap where cumulative cost outruns cumulative return.</summary>
    <content type="html">&lt;p&gt;Your optimal Amazon demand-side platform (DSP) frequency cap is not the bucket with the highest purchase rate. That rate climbs forever (0.48% at one impression, 1.10% at two, 3.86% at three, 5.10% at four), so it always says never cap. The cap is the frequency bucket where cumulative return % stops outrunning cumulative cost %. The &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; (AMC) Optimal Frequency Analysis method finds it, the agent runs it on your &lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt; conversions through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt;, and hands you a single number to set in DSP, grounded by &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That sequence came out of one Slack question: &lt;em&gt;&amp;quot;What&#39;s our optimal DSP frequency cap, and at what impression count are we paying for ad fatigue instead of conversions?&amp;quot;&lt;/em&gt; It is easy to ask and easy to answer wrong. I trusted the best-converting bucket until the cost column flipped it. So I handed it to &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;our agent&lt;/a&gt; with one instruction: don&#39;t read the cap off the rate column, run the cumulative cost-and-return method and show me where it crosses.&lt;/p&gt;
&lt;p&gt;A plain ChatGPT or Claude chat hits the same three walls on this job. It has &lt;strong&gt;no access to your data&lt;/strong&gt;, so it can&#39;t read your DSP impression logs or your attributed conversions, and has no per-user frequency distribution to bucket. It has &lt;strong&gt;no way to take action&lt;/strong&gt;, so it can&#39;t run the AMC query and can&#39;t push a cap to your DSP line item or campaign; the most it does is hand you a number to type in by hand. And it runs on &lt;strong&gt;generic knowledge, not Amazon&#39;s&lt;/strong&gt;, so it doesn&#39;t know the cumulative cost-and-return method or that AMC&#39;s aggregation thresholds quietly suppress your sparse high-frequency tail. The platform pieces get past each wall: the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; is your impression-and-conversion data plus the query runner, Amazon Agent Atlas is the Optimal Frequency Analysis rule book, Skills are the recurring re-check, and the Amazon Agent Data layer unifies it all into one grounded surface.&lt;/p&gt;
&lt;h2 id=&quot;optimal-frequency-analysis-starts-by-bucketing-every-user-by-impression-count-not-by-reading-one-average&quot; tabindex=&quot;-1&quot;&gt;Optimal frequency analysis starts by bucketing every user by impression count, not by reading one average&lt;/h2&gt;
&lt;p&gt;The raw shape every later step reads from is a per-bucket table, not a single average frequency. The Amazon Ads MCP runs the bucketing query and the agent grades the columns against the rules Atlas retrieves. Frequencies group into buckets &lt;code&gt;frequency_01&lt;/code&gt; through &lt;code&gt;frequency_25+&lt;/code&gt;, where &lt;code&gt;25+&lt;/code&gt; means exposed 25 or more times. The output schema is the AMC convention verbatim: &lt;code&gt;frequency_bucket&lt;/code&gt;, &lt;code&gt;users_in_bucket&lt;/code&gt;, &lt;code&gt;impressions_in_bucket&lt;/code&gt;, &lt;code&gt;purchases&lt;/code&gt;, and purchase rate. Conversions attach through &lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt;, the corpus-backed source for attributed purchases and product sales. This step is the &lt;strong&gt;&amp;quot;Measuring Optimal Impression Frequency for Amazon DSP Campaigns&amp;quot;&lt;/strong&gt; playbook joined to the bucketing schema, with the reach distribution from &lt;strong&gt;&amp;quot;Calculating Reach and Impression Frequency in AMC.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The data pull below is an illustrative scaffold, not a query retrieved from Atlas. The corpus guarantees the output schema and the method, not these exact table and column names, so it carries the skip marker and ships unverified by design (the canonical runnable query is the linked Amazon instructional query).&lt;/p&gt;
&lt;!-- amc-sql: skip — DSP-sourced frequency pull; validate in an AMC instance with DSP data. Canonical query: linked Amazon IQ --&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; impressions &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_cost&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; cost
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; dsp_impressions_by_user_segments
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
conversions &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;purchases&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; product_sales
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; amazon_attributed_events_by_traffic_time
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
by_user &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cost&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         LEAST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;     &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; frequency&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;     &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; product_sales
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; impressions i
  &lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; conversions c &lt;span class=&quot;token keyword&quot;&gt;USING&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; CONCAT&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;frequency_&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              LPAD&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;CAST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;frequency &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VARCHAR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;0&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token keyword&quot;&gt;IF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;frequency &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;+&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; frequency_bucket&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;     &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; users_in_bucket&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;   &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impressions_in_bucket&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cost&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;          &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; cost&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;purchases&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;     &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; product_sales
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; by_user
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT can&#39;t read your impression logs, so it can&#39;t build a single frequency bucket. You&#39;d have to hand-export and paste a table, and your account data would land in a chat history you don&#39;t control. The Amazon Ads MCP reads it over an authorized connection and the data stays inside your account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask Claude how to bucket and it invents a column. AMC&#39;s convention is &lt;code&gt;frequency_01&lt;/code&gt; through &lt;code&gt;frequency_25+&lt;/code&gt;, and conversions attach through &lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt;. Get the table or the bucket scheme wrong and the query returns nothing. The agent reads the real schema first.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;the-highest-purchase-rate-bucket-is-the-wrong-cap-because-it-always-tells-you-to-never-cap&quot; tabindex=&quot;-1&quot;&gt;The highest purchase-rate bucket is the wrong cap, because it always tells you to never cap&lt;/h2&gt;
&lt;p&gt;Purchase rate rises monotonically with frequency: 0.48% at one impression, 1.10% at two, 3.86% at three, 5.10% at four across the first four buckets. Cap at the highest-rate bucket and you would cap at the top, which is the same as never capping at all. Atlas surfaces the &lt;strong&gt;&amp;quot;Measuring Optimal Impression Frequency for Amazon DSP Campaigns&amp;quot;&lt;/strong&gt; result table that shows the climb, and the playbook&#39;s own warning that optimal frequency on Amazon may not be optimal across all advertising channels. The agent flags the trap unprompted rather than chasing the best-looking number.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask ChatGPT &amp;quot;which frequency converts best?&amp;quot; and it points at the top bucket, the trap. Rate never stops rising, so that answer is &amp;quot;never cap,&amp;quot; which is how you keep paying for fatigue. The agent knows the optimum lives on the cost side, not the rate column.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Even if you spotted the trap, Claude can&#39;t compute the cost-side correction. It has no cost-per-bucket and no way to run the cumulative math. The Amazon Ads MCP has both, run over your real campaign window.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;the-cap-is-the-last-bucket-where-percent-change-is-still-above-zero&quot; tabindex=&quot;-1&quot;&gt;The cap is the last bucket where Percent Change is still above zero&lt;/h2&gt;
&lt;p&gt;Set the cap at the last frequency bucket where Percent Change (cumulative return % minus cumulative cost %, differenced bucket-over-bucket) is still above zero. Past that bucket, each added impression costs more than it returns. This is the &lt;strong&gt;&amp;quot;Optimal Frequency Analysis in Amazon Marketing Cloud&amp;quot;&lt;/strong&gt; method, and it is the analysis report the agent produces. Per bucket it computes cumulative cost, cumulative return, cumulative cost %, cumulative return %, Percent Difference (cumulative return % minus cumulative cost %), and Percent Change (this bucket&#39;s Percent Difference minus the prior bucket&#39;s). The cap is the last bucket where Percent Change is above zero. You can gloss it as the inflection point where the curve of added value goes flat, but the mechanical rule is the zero-crossing, not a fitted curve.&lt;/p&gt;
&lt;p&gt;The post-processing table is the artifact. Here is the playbook&#39;s worked example, with the cap read off where Percent Change first goes negative:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;frequency_bucket&lt;/th&gt;
&lt;th&gt;conversions&lt;/th&gt;
&lt;th&gt;cumul. conversions&lt;/th&gt;
&lt;th&gt;cost&lt;/th&gt;
&lt;th&gt;cumul. cost&lt;/th&gt;
&lt;th&gt;cumul. return %&lt;/th&gt;
&lt;th&gt;cumul. cost %&lt;/th&gt;
&lt;th&gt;Pct Difference&lt;/th&gt;
&lt;th&gt;Pct Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;9,203&lt;/td&gt;
&lt;td&gt;9,203&lt;/td&gt;
&lt;td&gt;$7,801&lt;/td&gt;
&lt;td&gt;$7,801&lt;/td&gt;
&lt;td&gt;19%&lt;/td&gt;
&lt;td&gt;9%&lt;/td&gt;
&lt;td&gt;9.90%&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;6,532&lt;/td&gt;
&lt;td&gt;15,735&lt;/td&gt;
&lt;td&gt;$7,933&lt;/td&gt;
&lt;td&gt;$15,734&lt;/td&gt;
&lt;td&gt;32%&lt;/td&gt;
&lt;td&gt;18%&lt;/td&gt;
&lt;td&gt;14.18%&lt;/td&gt;
&lt;td&gt;4.28%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;5,024&lt;/td&gt;
&lt;td&gt;20,759&lt;/td&gt;
&lt;td&gt;$7,492&lt;/td&gt;
&lt;td&gt;$23,226&lt;/td&gt;
&lt;td&gt;43%&lt;/td&gt;
&lt;td&gt;27%&lt;/td&gt;
&lt;td&gt;15.87%&lt;/td&gt;
&lt;td&gt;1.69%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4,157&lt;/td&gt;
&lt;td&gt;24,916&lt;/td&gt;
&lt;td&gt;$7,060&lt;/td&gt;
&lt;td&gt;$30,286&lt;/td&gt;
&lt;td&gt;51%&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;16.28%&lt;/td&gt;
&lt;td&gt;0.41% (last &amp;gt;0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3,569&lt;/td&gt;
&lt;td&gt;28,485&lt;/td&gt;
&lt;td&gt;$6,621&lt;/td&gt;
&lt;td&gt;$36,907&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;td&gt;42%&lt;/td&gt;
&lt;td&gt;15.99%&lt;/td&gt;
&lt;td&gt;-0.29% (crosses)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Bucket 5&#39;s -0.29% is the first negative, so the cap is frequency 4. The ROAS (return on ad spend) sanity check confirms it: at this cap cumulative ROAS is about $1.17, and a looser cap of 9 dropped cumulative ROAS to $0.95, where overall spend exceeded sales.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; ChatGPT doesn&#39;t know this method exists. No cumulative cost %, no Percent Change column, no zero-crossing rule. It guesses a round number like &amp;quot;cap at 3.&amp;quot; The agent runs the exact AMC Optimal Frequency Analysis bookkeeping and the table is auditable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; The whole method needs per-bucket cost and conversion volume run over your real campaign window. Claude can&#39;t query it and can&#39;t carry the cumulative sums across buckets. The Amazon Ads MCP runs it and the result is reproducible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;your-high-frequency-tail-is-too-thin-to-trust&quot; tabindex=&quot;-1&quot;&gt;Your high-frequency tail is too thin to trust&lt;/h2&gt;
&lt;p&gt;Roughly 90% of users are exposed three times or fewer, so the high-frequency buckets thin out fast and fall below AMC&#39;s aggregation thresholds. Read the cap off where the data is dense, not off a noisy tail. This is where the &lt;strong&gt;&amp;quot;Calculating Reach and Impression Frequency in AMC&amp;quot;&lt;/strong&gt; distribution and the prerequisites from &lt;strong&gt;&amp;quot;Optimal Frequency Analysis in Amazon Marketing Cloud&amp;quot;&lt;/strong&gt; land. The prerequisites are an AMC instance, at least 7 days of backfilled data, and 4 or more active campaigns, plus the AMC concept of data aggregation thresholds. Atlas carries both, and the agent surfaces them unprompted along with the caveat that optimal frequency is not one size fits all: it depends on the goal (awareness versus conversion), campaign length, audience size, and whether the campaign is a new launch or steady state.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; ChatGPT will happily compute a cap off your &lt;code&gt;frequency_18&lt;/code&gt; bucket as if it were solid, never warning that about 90% of users sit at three or fewer and the tail is statistically empty, or that AMC won&#39;t even return rows below its aggregation threshold. The agent knows the distribution and the threshold and reads the cap off dense buckets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Claude can&#39;t see that your campaign only ran 5 days or has 2 active campaigns, below the playbook&#39;s 7-day, 4-campaign floor, so it can&#39;t tell you the answer isn&#39;t ready yet. The Amazon Ads MCP knows your real backfill and campaign count.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;The artifact is a decision: one cap number. You set it in Amazon DSP at the line-item or campaign level, the lever the playbook names as the actionable output. Then schedule the analysis as a recurring &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; so the cap re-checks itself as spend shifts and campaigns evolve, rather than going stale after one run. Amazon&#39;s point-and-click Optimal Frequency solution is a fine quick read, but the AMC SQL path wins on campaign-level control and custom KPIs (key performance indicators). The whole thing rides the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer / Agent Flow&lt;/a&gt; that unifies the Amazon Ads MCP and the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Amazon Selling Partner MCP&lt;/a&gt; under one grounded surface, so the conversions you join here come from the same place the rest of your Amazon work reads from.&lt;/p&gt;
&lt;p&gt;A frequency cap is one number, but it only means anything when it sits on the cost side of the math instead of the rate side. Set it there and you stop paying for impressions past the point where added cost outruns added return.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next in the series: where that capped DSP impression actually sits in the full conversion path, mapped end to end in &lt;a href=&quot;https://www.kuudo.com/guides/amc-path-to-conversion-sankey/&quot;&gt;the path-to-conversion Sankey&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Map AMC Paths Across DSP and Sponsored Ads</title>
    <link href="https://www.kuudo.com/guides/amc-path-to-conversion-sankey/"/>
    <id>https://www.kuudo.com/guides/amc-path-to-conversion-sankey/</id>
    <published>2026-06-09T00:00:00Z</published>
    <updated>2026-06-09T00:00:00Z</updated>
    <summary>Use AMC Campaign Groups to map DSP and sponsored ads paths into Sankey-ready source-to-destination rows you can chart without reshaping them.</summary>
    <content type="html">&lt;p&gt;Ask the agent in &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;your AI client&lt;/a&gt; to map the customer journey, and the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; runs the path-to-conversion workflow live in your &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; (AMC) instance: it joins &lt;code&gt;dsp_impressions&lt;/code&gt;, &lt;code&gt;sponsored_ads_traffic&lt;/code&gt;, and &lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt; on &lt;code&gt;user_id&lt;/code&gt;, groups campaigns the way the current &amp;quot;Path to Conversion by Campaign Groups&amp;quot; pattern prescribes, and returns a Sankey-ready source-to-destination dataset. &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; keeps it honest by surfacing that pattern from the &lt;strong&gt;Customer Journey Analytics Playbook&lt;/strong&gt; instead of letting the agent guess. The answer exists because our media lead asked in Slack: &lt;em&gt;&amp;quot;What&#39;s the actual journey our customers take across demand-side platform (DSP), Sponsored Products, Sponsored Brands, and Sponsored Display before they convert?&amp;quot;&lt;/em&gt; Everyone had an opinion about which campaign deserved credit. Nobody had the path.&lt;/p&gt;
&lt;p&gt;A plain ChatGPT or Claude chat hits the same three walls here. &lt;strong&gt;No access to your data&lt;/strong&gt;: the journey lives in pseudonymized, instance-scoped AMC tables. &lt;strong&gt;No way to take action&lt;/strong&gt;: a chat cannot submit an AMC workflow or re-pull it when attribution closes. &lt;strong&gt;Generic knowledge, not Amazon&#39;s&lt;/strong&gt;: it does not know which journey query is current. That adds up to disconnected, generic, manual work that ships silent mistakes. The MCP brings your data plus the tools to act, Atlas the private rule book, Skills the repeatable run.&lt;/p&gt;
&lt;h2 id=&quot;the-whole-journey-lives-in-exactly-three-amc-tables-joined-on-userid&quot; tabindex=&quot;-1&quot;&gt;The whole journey lives in exactly three AMC tables, joined on user_id&lt;/h2&gt;
&lt;p&gt;The Customer Journey Analytics Playbook&#39;s &amp;quot;Tables used&amp;quot; list has exactly three entries: &lt;code&gt;dsp_impressions&lt;/code&gt;, &lt;code&gt;sponsored_ads_traffic&lt;/code&gt;, and &lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt;. Not one table per ad product. &lt;code&gt;sponsored_ads_traffic&lt;/code&gt; carries the traffic events, impressions and clicks, for Sponsored Products, Sponsored Brands, Sponsored Display, and Sponsored Television in one table; you split it by &lt;code&gt;ad_product_type&lt;/code&gt; (&lt;code&gt;&#39;sponsored_products&#39;&lt;/code&gt;, &lt;code&gt;&#39;sponsored_brands&#39;&lt;/code&gt;, &lt;code&gt;&#39;sponsored_display&#39;&lt;/code&gt;). The third table holds the conversion events: purchases, new_to_brand_purchases, detail page views.&lt;/p&gt;
&lt;p&gt;The join rule comes straight from Amazon&#39;s guidance: join on &lt;code&gt;user_id&lt;/code&gt; when you are interested in understanding user behavior. Every branch of the query filters &lt;code&gt;user_id IS NOT NULL&lt;/code&gt; so the paths stay user-level.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask ChatGPT for the journey SQL and it invents per-product tables, an &lt;code&gt;sp_impressions&lt;/code&gt; here, an &lt;code&gt;sb_traffic&lt;/code&gt; there, that do not exist in AMC. All sponsored ads traffic lives in one table split by &lt;code&gt;ad_product_type&lt;/code&gt;; the agent reads the real schema through the MCP before writing a line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Even with correct table names, the joined journey only exists inside your AMC instance after the query runs there. You cannot paste &lt;code&gt;user_id&lt;/code&gt;-level impression rows into a chat, so the chat never sees a single path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge fails again on the third table.&lt;/strong&gt; The classic miss is joining the two traffic tables and stopping. Without &lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt; there is no conversion endpoint, only exposure. Atlas surfaces the exact three-table list, so the query lands complete.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;group-your-campaigns-or-aggregation-thresholds-swallow-most-of-the-path-as-null-rows&quot; tabindex=&quot;-1&quot;&gt;Group your campaigns, or aggregation thresholds swallow most of the path as NULL rows&lt;/h2&gt;
&lt;p&gt;The old &amp;quot;Path to Conversion by Campaign&amp;quot; instructional query (IQ) is retired. Amazon&#39;s notice reads: &amp;quot;As of August 31, 2022, an improved version of this IQ has been made available in AMC. We recommend advertisers to use the new version: Path to Conversion by Campaign Groups.&amp;quot; The improvements are operator-facing: grouping reduces the likelihood of violating aggregation thresholds so &amp;quot;users will see a smaller number of NULL rows,&amp;quot; campaign and Amazon Standard Identification Number (ASIN) filters exist, and Sponsored Display conversions are included.&lt;/p&gt;
&lt;p&gt;The grouping mechanism is a small &lt;code&gt;VALUES&lt;/code&gt; mapping: list each campaign with its group, then &lt;code&gt;COALESCE&lt;/code&gt; everything ungrouped into &lt;code&gt;&#39;DSP-Others&#39;&lt;/code&gt;, &lt;code&gt;&#39;SP-Others&#39;&lt;/code&gt;, &lt;code&gt;&#39;SD-Others&#39;&lt;/code&gt;, or &lt;code&gt;&#39;SB-Others&#39;&lt;/code&gt; so no row falls below the thresholds. (The playbook also ships a campaign-category variant that maps campaign names to funnel stages with &lt;code&gt;CASE ... SIMILAR TO&lt;/code&gt;, but those categories depend on each advertiser&#39;s naming conventions.) Here is the workflow the agent submitted through the Amazon Ads MCP:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;-- Path to conversion across DSP + sponsored ads, Sankey-ready output&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Pattern: &quot;Path to Conversion by Campaign Groups&quot; IQ (supersedes the&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- &quot;Path to Conversion by Campaign&quot; IQ as of 2022-08-31)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; campaign_group &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;campaign&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; campaign_group&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;-- placeholder campaign names/IDs; ungrouped rows fall back to&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;-- &#39;&amp;lt;product&gt;-Others&#39; so aggregation thresholds aren&#39;t violated&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;111111111111111111&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;group 1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;222222222222222222&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;group 1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;SP_campaign&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;group 2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;SD_campaign&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;group 3&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;SB_campaign&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;group 4&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
impressions &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;DSP-Others&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; campaign_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&#39;DSP&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; product_type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MIN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impression_dt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impression_dt_first&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impression_dt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impression_dt_last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_cost&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_cost
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; dsp_impressions i
    &lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; campaign_group g &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; g&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;UNION&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ALL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;SP-Others&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; campaign_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&#39;SP&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; product_type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MIN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;event_dt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impression_dt_first&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;event_dt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impression_dt_last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;spend&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_cost
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; sponsored_ads_traffic a
    &lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; campaign_group g &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; g&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ad_product_type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sponsored_products&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;UNION&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ALL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;SD-Others&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; campaign_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&#39;SD&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; product_type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MIN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;event_dt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impression_dt_first&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;event_dt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impression_dt_last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;spend&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_cost
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; sponsored_ads_traffic a
    &lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; campaign_group g &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; g&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ad_product_type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sponsored_display&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;UNION&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ALL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;SB-Others&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; campaign_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&#39;SB&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; product_type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MIN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;event_dt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impression_dt_first&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;event_dt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impression_dt_last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;spend&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_cost
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; sponsored_ads_traffic a
    &lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; campaign_group g &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; g&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ad_product_type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sponsored_brands&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
converted &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;-- conversions attributed to in-window traffic; events can land up to&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;-- 30 days after the window, so totals move until attribution closes&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;conversions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; conversions
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; amazon_attributed_events_by_traffic_time
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; user_id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
ranked &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    campaign_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    ROW_NUMBER&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;OVER&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; user_id
      &lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; impression_dt_first
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; path_rank
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; impressions
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
steps &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;-- explode the path into source -&gt; destination pairs: QuickSight&#39;s&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;-- Sankey visual needs one source and one destination dimension per row&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    r1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    r1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_group &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; path_step_source&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    r2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_group &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; path_step_destination
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; ranked r1
    &lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; ranked r2
      &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; r2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; r1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id
      &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; r2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path_rank &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; r1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path_rank &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path_step_source&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path_step_destination&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; path_occurrences&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conversions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; conversions
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; steps s
  &lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; converted c &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- NO ORDER BY here: AMC rejects ORDER BY in the outer query of a&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- workflow (&quot;ORDER BY unexpected&quot;). Sort downstream, post-export.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Swap the placeholder &lt;code&gt;VALUES&lt;/code&gt; rows for your own campaign names or IDs and the rest runs as-is.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; A chat reproduces the deprecated by-campaign pattern from stale training data. Run campaign-level paths in an instance of any real size and the aggregation thresholds NULL the small rows, exactly what the 2022 notice says grouping fixes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; The chat hands you SQL to carry by hand. The first hand-carried draft of this exact analysis died in AMC&#39;s parser with &amp;quot;ORDER BY unexpected&amp;quot; because it sorted in the outer query. The agent submits through the MCP, sees the parser&#39;s verdict immediately, and corrects the workflow; the version above sorts downstream, after export.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;conversions-keep-landing-for-30-days-after-your-window-so-day-zero-numbers-are-not-final&quot; tabindex=&quot;-1&quot;&gt;Conversions keep landing for 30 days after your window, so day-zero numbers are not final&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt; has a property that surprises people: the traffic events all sit inside your query window, but the attributed conversions &amp;quot;may have occurred up to 30 days after the time window.&amp;quot; Amazon extends the conversion range automatically and says plainly that &amp;quot;the output of a workflow that uses this table may change over time.&amp;quot; The lookback itself is fixed per campaign and cannot be changed in AMC: 14 days for Brands, 7 days for Sellers&#39; Sponsored Products.&lt;/p&gt;
&lt;p&gt;I was skeptical when the agent flagged this, so we re-pulled the identical workflow later in the attribution window. The conversion column grew, and nothing was wrong; attribution was still filling in. Run the analysis the morning after your window closes and you under-count whatever is still inside that 14-day lookback, which is why the agent derives a safe re-pull date from the lookback rather than treating day-zero output as final.&lt;/p&gt;
&lt;p&gt;One eligibility wrinkle from the Custom Attribution Overview is worth knowing too: DSP conversions require a viewable impression and Sponsored Products require a click, so impression-only SP exposures never appear in the attributed datasets at all.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; ChatGPT treats your query window as the whole story. It will not warn you that the same by_traffic_time workflow returns different numbers tomorrow, or that a path analysis run too early under-counts conversions still in flight.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; A chat cannot wait out the attribution window and re-pull. You rerun by hand, if you remember to. The agent schedules the re-run for after attribution closes and compares the two outputs side by side.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;sankey-ready-means-source-to-destination-rows-and-the-agent-returns-the-dataset-already-in-that-shape&quot; tabindex=&quot;-1&quot;&gt;Sankey-ready means source-to-destination rows, and the agent returns the dataset already in that shape&lt;/h2&gt;
&lt;p&gt;Amazon&#39;s path output arrives as ranked arrays, paths like &lt;code&gt;[[1, DSP-Display], [2, DSP-Video], [3, BSI], [4, SB-Others]]&lt;/code&gt; with &lt;code&gt;path_occurrences&lt;/code&gt; and &lt;code&gt;impressions&lt;/code&gt; alongside. QuickSight cannot chart that directly. The playbook is explicit: the &amp;quot;Sankey diagram is a visual type within Amazon QuickSight and requires a one dimension in source and one dimension in destination.&amp;quot; A four-element path &amp;quot;will &#39;explode into&#39; 3 separate steps/rows,&amp;quot; metrics repeated on every exploded row; the playbook does this in a notebook ending with &lt;code&gt;df_final.to_csv(&#39;Sankey-Diagram_Input.csv&#39;, index=False)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The query above skips the notebook step. The &lt;code&gt;ROW_NUMBER&lt;/code&gt; self-join in the &lt;code&gt;steps&lt;/code&gt; CTE emits the exploded pairs directly, one row per hop, ordered by first impression time. A user&#39;s terminal step carries a NULL destination (single-exposure users keep one row); label that terminal node from the &lt;code&gt;converted&lt;/code&gt; join and the diagram shows where each journey ends. Read the &lt;code&gt;conversions&lt;/code&gt; column as the conversion total of users who traversed that hop, not as credit attributed to the hop itself.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Ask a plain chat for &amp;quot;path to conversion&amp;quot; and you get a flat table, one row per campaign. No source/destination pairs means nothing QuickSight&#39;s Sankey visual can ingest.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Even when Claude explains the explode correctly, the chat cannot apply it to results it never had. You re-shape rows by hand in a spreadsheet; the agent hands back rows that already are the chart&#39;s input.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Reading the diagram is the fast part. The playbook&#39;s worked example charts the top 20 paths by purchase, with high-purchase users usually exposed to loyalty and consideration campaign categories and awareness overlap comparatively lower. The move: reuse what the high-overlap groups share (impression frequency, cost, line items) in the next campaign, and seed lookalikes from those audiences. One row to ignore: the &amp;quot;none&amp;quot; exposure group, purchasers with no impression recorded under their &lt;code&gt;user_id&lt;/code&gt;; Amazon says to skip it.&lt;/p&gt;
&lt;p&gt;From there I have the agent re-run the workflow as a recurring &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt;, timed past attribution close, so each month&#39;s diagram compares settled numbers to settled numbers.&lt;/p&gt;
&lt;p&gt;When the fixed 14-day window is the wrong lens, the custom attribution IQs (First Touch, Last Touch, Linear, Position Based) extend the lookback to 28 days and re-credit the same journey; that choice is its own guide: &lt;a href=&quot;https://www.kuudo.com/guides/amc-custom-attribution-models/&quot;&gt;choosing a custom attribution model in AMC&lt;/a&gt;. The path query is one surface of &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Flow&lt;/a&gt;, the Amazon Agent Data layer connecting the Amazon Ads MCP, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt;, Atlas, and Skills into end-to-end workflows.&lt;/p&gt;
&lt;p&gt;The pattern is the one this series keeps landing on: the agent runs Amazon&#39;s current query in your instance, grounded in Amazon&#39;s own playbook, and returns an artifact you can act on the same day. The journey was always in your data. The walls were in the chat.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next up: how much your DSP and sponsored ads audiences actually overlap, and what that says about incrementality, in &lt;a href=&quot;https://www.kuudo.com/guides/amc-sponsored-ads-dsp-overlap-4way/&quot;&gt;the four-way sponsored ads and DSP overlap analysis&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Preview Listing Patches Before They Go Live</title>
    <link href="https://www.kuudo.com/guides/seller-listing-agentic-audit-to-patch/"/>
    <id>https://www.kuudo.com/guides/seller-listing-agentic-audit-to-patch/</id>
    <published>2026-05-28T00:00:00Z</published>
    <updated>2026-05-28T00:00:00Z</updated>
    <summary>An Atlas-grounded agent audits a live listing, previews a patchListingsItem update with VALIDATION_PREVIEW, and waits for approval.</summary>
    <content type="html">&lt;p&gt;The Slack message came in right before a weekend push: &lt;em&gt;&amp;quot;Our luggage listing is converting badly, the bullets read like a wall of text, and one image got rejected last week. Can the agent just fix it? But I don&#39;t want it quietly editing a live listing without me seeing what changed first.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That last clause is the whole job. Fixing a listing is easy to ask for and dangerous to automate, because a single wrong attribute name can wipe a field you never meant to touch. So I handed it to &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;our agent&lt;/a&gt;, backed by &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;, with one rule: audit first, show me the diff, and do not write anything live until I say yes.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong&lt;/h2&gt;
&lt;p&gt;I gave the same prompt to a frontier model with no retrieval. The plan it produced looked reasonable and would have caused real damage.&lt;/p&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Four failure modes in a single un-grounded response&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It proposed a full &lt;code&gt;putListingsItem&lt;/code&gt; replace instead of a &lt;code&gt;patchListingsItem&lt;/code&gt; partial update. A full replace requires every attribute to be resent; the omitted ones get wiped. The agent only wanted to change two bullets.&lt;/li&gt;
&lt;li&gt;It submitted the change directly, with no validation step. The Listings Items API offers &lt;code&gt;mode=VALIDATION_PREVIEW&lt;/code&gt;, which runs the real validation and returns errors without committing. Skipping it means the first time you learn the patch is malformed is after the listing breaks.&lt;/li&gt;
&lt;li&gt;It rewrote the bullets with an emoji and the phrase &amp;quot;eco-friendly.&amp;quot; Amazon removes bullets containing emojis, trademark symbols, and prohibited phrases like eco-friendly or anti-microbial. The model had no idea the copy would be silently stripped.&lt;/li&gt;
&lt;li&gt;It assumed a generic &lt;code&gt;bullets&lt;/code&gt; attribute. Attribute names are product-type specific. The correct path is &lt;code&gt;/attributes/bullet_point&lt;/code&gt;, and the model would have gotten a rejected patch for an unknown attribute.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;None of this is exotic. It is all in Amazon&#39;s own documentation, scattered across the Selling Partner API (SP-API) reference and a handful of Seller Central help pages that only surface when you already know the exact term to search.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves&lt;/h2&gt;
&lt;p&gt;When the agent gets the question, it runs a semantic search across the &lt;code&gt;amazon_sellers&lt;/code&gt; collection and pulls the governing documents before it writes a single attribute:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Partially Update a Listing&lt;/strong&gt; reference, which establishes that &lt;code&gt;patchListingsItem&lt;/code&gt; applies a JSON Patch to one or more attributes without disturbing the rest of the listing.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Preview Errors Before Partially Updating a Listing&lt;/strong&gt; tutorial, the source of the &lt;code&gt;mode=VALIDATION_PREVIEW&lt;/code&gt; parameter that turns a blind submission into a dry run.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Catalog Items API&lt;/strong&gt; reference, whose &lt;code&gt;getCatalogItem&lt;/code&gt; call returns the live &lt;code&gt;attributes&lt;/code&gt;, &lt;code&gt;images&lt;/code&gt;, and &lt;code&gt;summaries&lt;/code&gt; for an ASIN (Amazon Standard Identification Number), keyed to the product type definition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suppressed Listings Management&lt;/strong&gt;, which explains how to download the suppressed listings report and why a listing is hidden from search in the first place.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Product Image Requirements for Amazon Listings&lt;/strong&gt;, which states plainly that non-compliant images suppress the listing from search until compliant images are provided.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suggest Changes to Your Product Detail Page&lt;/strong&gt;, Amazon&#39;s own surface for recommended detail-page improvements, which the agent reads as a second opinion on what to fix.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Atlas does not write the patch. It surfaces the rules the patch has to obey, wired through &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;the Amazon Selling Partner MCP&lt;/a&gt;, and the agent adapts them to this specific listing.&lt;/p&gt;
&lt;h2 id=&quot;the-agents-working-output&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s working output&lt;/h2&gt;
&lt;p&gt;The agent did not start by editing anything. It pulled the live listing state through &lt;code&gt;getCatalogItem&lt;/code&gt; and produced an audit report that names each finding, its severity, and the document it is grounded in:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;asin&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;B0EXAMPLE12&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;sku&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;LUG-HARDSIDE-28&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;listing_status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;active&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;findings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;field&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bullet_point&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;severity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;high&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;finding&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Two bullets exceed 255 characters and one contains an emoji&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Product Bullet Points Requirements&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;field&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;main_image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;severity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;medium&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;finding&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Main image background is not pure white; at risk of suppression&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Product Image Requirements for Amazon Listings&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;field&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;item_name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;severity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;low&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;finding&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Title repeats the brand token three times&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Suggest Changes to Your Product Detail Page&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;From that audit, the agent built a JSON Patch that touches only the bullet points, leaving every other attribute untouched. This is the body it would send to &lt;code&gt;patchListingsItem&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;productType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;LUGGAGE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;patches&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;op&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;replace&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/attributes/bullet_point&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hardside shell resists scuffs and cracking on checked flights&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;marketplace_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ATVPDKIKX0DER&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Spinner wheels roll in four directions for tight gate turns&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;marketplace_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ATVPDKIKX0DER&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;TSA-approved combination lock built into the side panel&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;marketplace_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ATVPDKIKX0DER&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then the part the operator actually asked for. The agent submitted that body with &lt;code&gt;mode=VALIDATION_PREVIEW&lt;/code&gt;, read the returned &lt;code&gt;issues&lt;/code&gt; array, and refused to go live until a human approved:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; requests

SPAPI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://sellingpartnerapi-na.amazon.com&quot;&lt;/span&gt;
MARKETPLACE &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ATVPDKIKX0DER&quot;&lt;/span&gt;
SELLER_ID &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;A1EXAMPLESELLER&quot;&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;preview_patch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sku&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; body&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; token&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;patch&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;SPAPI&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/listings/2021-08-01/items/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;SELLER_ID&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;sku&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        params&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;marketplaceIds&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; MARKETPLACE&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mode&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;VALIDATION_PREVIEW&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        headers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;x-amz-access-token&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; token&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        json&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;submit_patch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sku&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; body&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; token&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;patch&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;SPAPI&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/listings/2021-08-01/items/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;SELLER_ID&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;sku&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        params&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;marketplaceIds&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; MARKETPLACE&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        headers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;x-amz-access-token&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; token&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        json&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;raise_for_status&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sku&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; patch_body&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; token&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; approver&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    preview &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; preview_patch&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sku&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; patch_body&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; token&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    errors &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; preview&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;issues&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;severity&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ERROR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; errors&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blocked&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;errors&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; errors&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; approver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;approves&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sku&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; patch_body&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; preview&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;declined&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; submit_patch&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sku&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; patch_body&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; token&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The design choice that matters is that the preview call and the live call send the &lt;em&gt;same&lt;/em&gt; body. The only difference is the &lt;code&gt;mode&lt;/code&gt; query parameter. That means the thing the human approves is byte-for-byte the thing that ships, with no second translation step where a new error can creep in. The agent also kept the patch scoped to &lt;code&gt;/attributes/bullet_point&lt;/code&gt; rather than rewriting the whole listing, so an approval reviewer reads one diff instead of auditing the entire item. And because the audit flagged the main image as a suppression risk, the agent explicitly declined to claim the copy fix would lift a suppression. It cannot, and saying so is part of being honest about what a patch can do.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaced-unprompted&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaced unprompted&lt;/h2&gt;
&lt;p&gt;This is where retrieval grounding pulls away from fluent guessing. Without being asked, the agent attached the caveats an operator needs but rarely thinks to request:&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Things Atlas surfaced that the operator didn&#39;t ask for&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Preview error codes are changing.&lt;/strong&gt; The &lt;code&gt;VALIDATION_PREVIEW&lt;/code&gt; error codes are being revised; Amazon supports both old and new codes during the transition, so match on issue meaning, not just the literal code string.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bullet rules are strict.&lt;/strong&gt; Each bullet must be 10 to 255 characters, carry no end punctuation, and exclude emojis, the registered or trademark symbols, and prohibited phrases like eco-friendly or anti-microbial. Include at least three.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An image-suppressed listing will not un-suppress from a copy edit.&lt;/strong&gt; Fix the non-compliant image first; a clean bullet patch on a suppressed listing changes nothing a shopper can see.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Throttle is five requests per second per operation.&lt;/strong&gt; Submit only items with material changes. Resubmitting unchanged attributes inflates processing backlogs and slows the whole queue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefer notifications over polling.&lt;/strong&gt; Subscribe to &lt;code&gt;LISTINGS_ITEM_ISSUES_CHANGE&lt;/code&gt; to get near-real-time SKU, severity, and enforcement-action updates instead of repeatedly calling the API to check whether the issue cleared.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An ASIN must represent one product.&lt;/strong&gt; Editing a detail page to describe a different product is a policy violation, not an optimization. The agent will refuse a patch that changes what the listing fundamentally is.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;Any one of these would have cost an afternoon to rediscover after a failed submission.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Once &lt;code&gt;VALIDATION_PREVIEW&lt;/code&gt; returns a clean &lt;code&gt;issues&lt;/code&gt; array and the human approves, the agent resends the identical body without the &lt;code&gt;mode&lt;/code&gt; parameter and the change goes live. It then watches the &lt;code&gt;LISTINGS_ITEM_ISSUES_CHANGE&lt;/code&gt; notification stream to confirm the issue actually cleared, rather than assuming success. For the findings a text patch cannot solve, the path forks: the image flagged as a suppression risk is handed to the seeded image-regeneration workflow, and recurring audits are wired up as a scheduled &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; so the listing is re-checked after every catalog change instead of once a quarter. The same approval gate applies every time, which is the pattern explored in &lt;a href=&quot;https://www.kuudo.com/guides/human-approval-for-amc-activation/&quot;&gt;human approval for agent activation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; reads and previews listing changes, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; can add &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; (AMC) campaign-side performance context, Atlas grounds the catalog rules, and Skills keep every recurring patch behind a reviewable approval gate.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters&quot; tabindex=&quot;-1&quot;&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;A foundation model can draft a better bullet point. What it cannot reliably do is read the live product-type schema, scope the edit to a JSON Patch that leaves the rest of the listing intact, run it through Amazon&#39;s own validation before committing, and tell you that the real problem was the image all along. That sequence is not model cleverness. It is a corpus of Amazon&#39;s own listing rules, indexed and addressable by an agent at the moment it is about to act, with a human holding the final yes.&lt;/p&gt;
&lt;p&gt;If your agent can edit a live listing, it should be able to show you the diff first.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Next in the series: using your current product photos as seeds for OpenAI image generation to regenerate listing visuals that still pass Amazon&#39;s image requirements, with the same approve-before-publish gate sitting in front of every upload.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Count New-to-Brand Customers in AMC</title>
    <link href="https://www.kuudo.com/guides/amc-ntb-customers/"/>
    <id>https://www.kuudo.com/guides/amc-ntb-customers/</id>
    <published>2026-05-17T00:00:00Z</published>
    <updated>2026-05-17T00:00:00Z</updated>
    <summary>Use the conversion-time table to count new-to-brand customers in AMC without confusing users, purchases, or traffic-time attribution drift.</summary>
    <content type="html">&lt;h2 id=&quot;what-is-the-ntb-customer-question&quot; tabindex=&quot;-1&quot;&gt;What is the NTB customer question?&lt;/h2&gt;
&lt;p&gt;A Slack from our paid team last Tuesday: &lt;em&gt;&amp;quot;Of all the customers our campaigns reached who actually bought, how many were buying our brand for the first time?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The honest answer is: nobody at the agency knows, the Amazon Ads console gives a partial number that excludes Amazon&#39;s demand-side platform (DSP), and ChatGPT will hand back a SQL query that compiles and counts the wrong table. The right answer lives in three &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; (AMC) instructional queries plus a schema doc, none of which a model has cleanly in its training data. I handed the question to &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;our agent&lt;/a&gt;, backed by &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The matrix the agent grounded in before writing a line of SQL:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Use it for&lt;/th&gt;
&lt;th&gt;Don&#39;t use it for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;amazon_attributed_events_by_conversion_time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Recurring NTB measurement, by promoted Amazon Standard Identification Number (ASIN)&lt;/td&gt;
&lt;td&gt;Anything time-of-impression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same-day pacing only&lt;/td&gt;
&lt;td&gt;Recurring workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;amazon_retail_purchases&lt;/code&gt; (NTB gateway IQ)&lt;/td&gt;
&lt;td&gt;Custom NTB lookback (e.g. 1095 days)&lt;/td&gt;
&lt;td&gt;Ad-attribution analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;conversions&lt;/code&gt; (custom attribution)&lt;/td&gt;
&lt;td&gt;Pixel + off-Amazon NTB&lt;/td&gt;
&lt;td&gt;Sponsored Ads NTB counts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The IQ behind the answer is &lt;strong&gt;New to brand customers&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong&lt;/h2&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Four failure modes I watched in a single un-grounded draft of this query&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It picked &lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt; because the name sounds neutral. That table re-extends the conversion window by up to 30 days after the query, so the output changes after the workflow runs. A recurring NTB report pinned to it drifts.&lt;/li&gt;
&lt;li&gt;It forgot &lt;code&gt;purchases &amp;gt; 0&lt;/code&gt; and counted every user the campaign reached, not just buyers. The denominator was wrong and so was the percentage.&lt;/li&gt;
&lt;li&gt;It put &lt;code&gt;SELECT user_id&lt;/code&gt; in the final output and the query ran but the column came back blocked. &lt;code&gt;user_id&lt;/code&gt; carries an aggregation threshold and can only live inside a CTE that aggregates it away.&lt;/li&gt;
&lt;li&gt;It confused the &lt;strong&gt;New-to-brand customers&lt;/strong&gt; IQ with the &lt;strong&gt;New-to-brand purchases&lt;/strong&gt; IQ. They use the same table but different denominators. The first counts distinct users; the second counts orders. The model swapped them and the answer to &amp;quot;how many first-time buyers did we acquire&amp;quot; came back as a purchase count inflated by repeat NTB orders.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;None of these failures throw an error. The query runs. The number is wrong.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves&lt;/h2&gt;
&lt;p&gt;The agent didn&#39;t write SQL from training data. It pulled five chunks from Atlas and grounded the query in them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;New to brand customers&lt;/strong&gt; instructional query: the canonical AMC IQ for this exact operator question, including the requirement language (&amp;quot;ASINs must be tracked to campaigns&amp;quot;) and the policy window (&amp;quot;previous 365 day period&amp;quot;).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Amazon Attributed Events Overview&lt;/strong&gt; schema doc: defines the &lt;code&gt;new_to_brand&lt;/code&gt; boolean column and the stability difference between &lt;code&gt;amazon_attributed_events_by_conversion_time&lt;/code&gt; and the traffic-time variant. This is the source for the &amp;quot;use conversion_time for recurring workflows&amp;quot; rule. The table is wired through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt;, so the agent could resolve the column without resorting to a live web fetch via &lt;a href=&quot;https://www.kuudo.com/features/agent-crawl/&quot;&gt;Amazon Agent Crawl&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;New to brand purchases analysis&lt;/strong&gt; IQ, adjacent to the customer IQ and the one a model would otherwise confuse with this one. Atlas surfaced it so the agent could write Section 8 distinguishing the two.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Understanding New-to-Brand ASINs on Amazon&lt;/strong&gt; IQ, the natural follow-up. Once the operator knows the portfolio-level NTB%, the question becomes &amp;quot;which ASINs are the front door for NTB acquisition.&amp;quot;&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Data aggregation thresholds in AMC&lt;/strong&gt; reference: the privacy-safeguard doc that explains why &lt;code&gt;user_id&lt;/code&gt; SELECTs get blocked at a final-output grain.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-the-agents-ntb-sql-output-works&quot; tabindex=&quot;-1&quot;&gt;How the agent&#39;s NTB SQL output works&lt;/h2&gt;
&lt;p&gt;The SQL the agent returned, copy-pasteable into the AMC query editor:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;-- New-to-brand customers: count and percentage by campaign.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Source IQ: New to brand customers (AMC instructional query).&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- NTB lookback: 365 days (Amazon-managed; not parameterizable in this IQ).&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Run on the analytics table, NOT the for_audiences variant.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; ad_buyers &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    advertiser&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    campaign&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;new_to_brand&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; new_to_brand_flag
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; amazon_attributed_events_by_conversion_time
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; purchases &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
ntb_only &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; advertiser&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; campaign
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; ad_buyers
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; new_to_brand_flag &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;TRUE&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;advertiser&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; users_that_purchased&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; ntb_users_that_purchased&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.0&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; ntb_users_percentage
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; ad_buyers b
&lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; ntb_only n
  &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt;  b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id    &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id
  &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;advertiser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;advertiser
  &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign   &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; ntb_users_percentage &lt;span class=&quot;token keyword&quot;&gt;DESC&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three decisions in this query would otherwise cost an operator an afternoon. The table choice is &lt;code&gt;amazon_attributed_events_by_conversion_time&lt;/code&gt;, not the traffic-time variant. The Atlas chunk for &lt;code&gt;Amazon Attributed Events Overview&lt;/code&gt; is explicit: traffic-time will re-extend the conversion window by up to 30 days &lt;em&gt;after&lt;/em&gt; the query runs, so a recurring NTB report pinned to it produces a different answer each time. Conversion-time is the only safe table for a recurring measurement workflow.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;WITH&lt;/code&gt; CTE exists because &lt;code&gt;user_id&lt;/code&gt; carries an aggregation threshold. AMC will block any final SELECT that tries to expose &lt;code&gt;user_id&lt;/code&gt; directly. The CTE collapses each user into a single row tagged with their NTB flag, and the outer SELECT operates only on COUNT DISTINCT. That is legal; it is also why the IQ template uses a CTE rather than a single-pass SELECT.&lt;/p&gt;
&lt;p&gt;The grouping is by &lt;code&gt;campaign&lt;/code&gt;, not by &lt;code&gt;advertiser&lt;/code&gt; alone. A portfolio-level NTB% hides the campaigns doing the actual acquisition work. If three campaigns are running and one is a loyalty-retargeting campaign with deliberately low NTB%, the aggregate percentage drops and looks like a problem. Grouping by campaign separates the loyalty workload from the acquisition workload so each campaign gets judged on its own goal.&lt;/p&gt;
&lt;h2 id=&quot;what-ntb-footnotes-the-agent-surfaced&quot; tabindex=&quot;-1&quot;&gt;What NTB footnotes the agent surfaced&lt;/h2&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Five things the agent surfaced unprompted, the ones an un-grounded model wouldn&#39;t include because it didn&#39;t know to&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Amazon&#39;s docs phrase the NTB window two ways: the IQ chunk says &amp;quot;previous 365 day period&amp;quot; and the events table schema doc says &amp;quot;previous 12 months.&amp;quot; Same definition, different wording. The IQ language is the authoritative one for this query; surface the inconsistency to the reader so nobody chases a ghost.&lt;/li&gt;
&lt;li&gt;The pixel-only path is a different query. Advertisers without a promoted ASIN that resulted in an ad-attributed purchase cannot run this IQ at all. The Atlas retrieval surfaced the &lt;code&gt;amazon_retail_purchases&lt;/code&gt; NTB gateway IQ as the alternative, with a custom-lookback parameter (1095 days = 3 years is a common pick).&lt;/li&gt;
&lt;li&gt;The DSP NTB count includes only promoted-ASIN purchases. Sponsored Ads NTB also includes Brand Halo (related ASINs). A mixed-product portfolio measured by this IQ under-counts NTB on the DSP side relative to Sponsored Ads. The contrast with the &lt;a href=&quot;https://www.kuudo.com/guides/amc-custom-attribution-models/&quot;&gt;custom-attribution data sources&lt;/a&gt; is sharper here than the IQ doc admits.&lt;/li&gt;
&lt;li&gt;The column is &lt;code&gt;tracked_asin&lt;/code&gt;. The IQ doc prose refers to &amp;quot;promoted ASIN.&amp;quot; Same thing. Operators who grep the table schema for &lt;code&gt;promoted_asin&lt;/code&gt; come up empty and assume the data isn&#39;t there.&lt;/li&gt;
&lt;li&gt;If a campaign was deliberately set up as existing-only (a Subscribe &amp;amp; Save win-back, for example), NTB% will be near zero. That is correct, not a bug. The IQ explicitly requires campaigns to &amp;quot;target both new and existing customers&amp;quot; for the result to be interpretable, and an existing-only campaign violates that requirement on purpose.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;The single-run query is the first step. The repeatable workflow is what the operator actually wanted.&lt;/p&gt;
&lt;p&gt;Activate this query as a recurring &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; on a weekly cadence. Push the per-campaign NTB% to a BI dashboard so brand managers can read the trend without re-running SQL. Wire the underlying retrieval through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; so the agent surfaces the same context to a human reviewer mid-month that it had at compose time.&lt;/p&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: Amazon Ads MCP brings campaign and AMC signals, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; can add catalog context, Atlas grounds the table choice, and Skills turn the query into a reviewed recurring automation.&lt;/p&gt;
&lt;p&gt;The rule that fires off this measurement: campaigns below the brand&#39;s target NTB% get re-allocated toward upper-funnel placements (DSP awareness inventory, Sponsored Display NTB audiences). Campaigns above target hold steady. Campaigns dramatically below target with no upper-funnel exposure are the strongest signal that the budget is being spent on existing customers who would have purchased anyway.&lt;/p&gt;
&lt;p&gt;The natural follow-on is the per-ASIN NTB breakdown. The portfolio number tells you whether acquisition is happening. The ASIN-level number tells you which products are doing the work.&lt;/p&gt;
&lt;h2 id=&quot;why-this-ntb-count-matters&quot; tabindex=&quot;-1&quot;&gt;Why this NTB count matters&lt;/h2&gt;
&lt;p&gt;If your acquisition number is just &amp;quot;total buyers,&amp;quot; you are not measuring acquisition.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next up: the per-ASIN NTB gateway analysis, which ASINs are the front door for new-customer purchases, and how to find them in the &lt;a href=&quot;https://www.kuudo.com/guides/amc-path-to-conversion-sankey/&quot;&gt;path-to-conversion data&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Sponsored Ads x DSP Overlap: The 4-Way AMC Analysis</title>
    <link href="https://www.kuudo.com/guides/amc-sponsored-ads-dsp-overlap-4way/"/>
    <id>https://www.kuudo.com/guides/amc-sponsored-ads-dsp-overlap-4way/</id>
    <published>2026-05-17T00:00:00Z</published>
    <updated>2026-05-17T00:00:00Z</updated>
    <summary>Measure Sponsored Ads and DSP overlap in AMC without mixing up impressions, attribution timing, or campaign comparability.</summary>
    <content type="html">&lt;p&gt;The Slack question was blunt: &lt;em&gt;&amp;quot;When a shopper sees both our demand-side platform (DSP) ads and our Sponsored Products ads, does the combination actually move purchase rate, or are we paying twice for the same conversion?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That is not a campaign-reporting question. Standard reports can show spend, clicks, impressions, and attributed sales by product line. They cannot tell you whether exposure to multiple ad products changes the purchase rate versus exposure to one. The answer lives in &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; (AMC), but the wrong query gives a very confident wrong answer. I handed the question to our agent, backed by &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;, and asked it to build the overlap analysis before we made a budget call.&lt;/p&gt;
&lt;p&gt;The decision matrix it used before writing SQL:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Use this query&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DSP plus Sponsored Products only&lt;/td&gt;
&lt;td&gt;Sponsored Products and DSP Display Overlap&lt;/td&gt;
&lt;td&gt;Narrow legacy comparison&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sponsored Display plus DSP only&lt;/td&gt;
&lt;td&gt;Sponsored Display and DSP Overlap&lt;/td&gt;
&lt;td&gt;Older two-way comparison&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DSP plus Sponsored Products, Brands, or Display&lt;/td&gt;
&lt;td&gt;Sponsored Ads and DSP Overlap&lt;/td&gt;
&lt;td&gt;Improved 2/3/4-way query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ordered touch sequence&lt;/td&gt;
&lt;td&gt;Path-to-conversion sankey&lt;/td&gt;
&lt;td&gt;Sequence, not overlap&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For this operator question, the right artifact is &lt;strong&gt;Analyzing Sponsored Ads and DSP Overlap&lt;/strong&gt;, run through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; so the agent can keep the table names, filters, and waiting rules intact.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong&lt;/h2&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Four silent failure modes showed up in the un-grounded version&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It used the older Sponsored Display and DSP overlap query even though the newer Sponsored Ads and DSP overlap IQ supersedes it for broader full-funnel analysis.&lt;/li&gt;
&lt;li&gt;It treated Sponsored Products exposure as clicks. The IQ says exposure means impressions, including Sponsored Products impressions.&lt;/li&gt;
&lt;li&gt;It skipped the 14-day attribution-close rule and produced a report that would undercount conversions if run immediately after the media window.&lt;/li&gt;
&lt;li&gt;It compared campaigns that had not run for the same products in the same period. That makes the overlap group look like a performance difference when it is really a campaign-design difference.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;None of those mistakes has to fail at runtime. The SQL can compile. The chart can look clean. The budget call that follows can still be wrong.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves&lt;/h2&gt;
&lt;p&gt;Atlas pulled the relevant chunks before the agent wrote the query:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Analyzing Sponsored Ads and DSP Overlap&lt;/strong&gt;: the improved instructional query. It states that the IQ measures 2-way, 3-way, and 4-way overlap and is an improved version of the older Sponsored Display and DSP overlap query.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sponsored Products and DSP Display Overlap Analysis&lt;/strong&gt;: the narrower prior IQ. Atlas surfaced it as a contrast case so the agent could avoid using the two-product template for a broader Sponsored Ads question.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joining and Unioning Sponsored Ads Traffic with Conversions&lt;/strong&gt;: the join pattern that points overlap queries at &lt;code&gt;SPONSORED_ADS_TRAFFIC&lt;/code&gt; and &lt;code&gt;AMAZON_ATTRIBUTED_EVENTS_BY_TRAFFIC_TIME&lt;/code&gt; through &lt;code&gt;user_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Creating Audiences from Clicked Sponsored Ads Without Purchases&lt;/strong&gt;: the adjacent audience workflow. It reminded the agent that overlap measurement can become an activation workflow later, but measurement comes first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyzing the Overlap of Amazon DSP Display, Streaming TV, and Sponsored Products&lt;/strong&gt;: the three-way precedent. It has the same one-week co-running and 14-day waiting logic, which is useful when the operator expands from two products to a larger full-funnel plan.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The important thing is not just that Atlas found a query. It found the older query, the improved query, the join pattern, and the timing constraints together. That bundle is what keeps an agent from solving the wrong version of the problem.&lt;/p&gt;
&lt;h2 id=&quot;the-agents-working-output&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s working output&lt;/h2&gt;
&lt;p&gt;The agent returned the AMC SQL as a measurement query, not as an audience. I kept the campaign filters in place but commented, matching the IQ style. Run it unfiltered first to validate the exposure groups, then narrow it to the campaign IDs you actually want to compare.&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;-- Instructional Query: Sponsored Ads and DSP Overlap&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Use after all compared ad products ran for at least one week&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- in the same period. Wait 14 full days after the query end date.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; dsp_campaigns &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;campaign_id_string&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;1111111111111&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;2222222222222&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
sa_campaigns &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;campaign_id_string&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;3333333333333&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;4444444444444&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
impressions_cte &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    ARRAY_SORT&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;COLLECT&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; ad_product_type&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; exposure_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MIN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;impression_dt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; min_impression_dt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impressions
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
      i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&#39;DSP&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; ad_product_type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impression_dt
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; dsp_impressions i
    &lt;span class=&quot;token comment&quot;&gt;/* Optional DSP filter:
    WHERE i.campaign_id_string IN (
      SELECT campaign_id_string FROM dsp_campaigns
    )
    */&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;UNION&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ALL&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
      i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ad_product_type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;event_dt &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impression_dt
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; sponsored_ads_traffic i
    &lt;span class=&quot;token comment&quot;&gt;/* Optional Sponsored Ads filter:
    WHERE i.campaign_id_string IN (
      SELECT campaign_id_string FROM sa_campaigns
    )
    */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
reach_by_group &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    exposure_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; ad_exposed_users
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; impressions_cte
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
purchases_by_group &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exposure_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; users_purchased&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_purchases&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_product_sales
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; amazon_attributed_events_by_traffic_time p
  &lt;span class=&quot;token keyword&quot;&gt;INNER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; impressions_cte i
    &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;
    p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_purchases &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conversion_event_dt &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;min_impression_dt
    &lt;span class=&quot;token comment&quot;&gt;/* Optional matched campaign filter:
    AND (
      p.campaign_id_string IN (SELECT campaign_id_string FROM dsp_campaigns)
      OR p.campaign_id_string IN (SELECT campaign_id_string FROM sa_campaigns)
    )
    */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exposure_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ad_exposed_users &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; unique_reach&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;users_purchased&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; users_that_purchased&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;users_purchased&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.0&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ad_exposed_users&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; purchase_rate
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; reach_by_group r
&lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; purchases_by_group p
  &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exposure_group &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exposure_group
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; purchase_rate &lt;span class=&quot;token keyword&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The output is a table of exposure groups. A row might be &lt;code&gt;[&#39;DSP&#39;]&lt;/code&gt;, &lt;code&gt;[&#39;sponsored_products&#39;]&lt;/code&gt;, or &lt;code&gt;[&#39;DSP&#39;,&#39;sponsored_products&#39;]&lt;/code&gt;, depending on what the shopper saw during the window. The comparison that matters is not total sales. It is purchase rate by exposure group after the same products, same period, and attribution-close rules are satisfied.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;ARRAY_SORT(COLLECT(DISTINCT ad_product_type))&lt;/code&gt; choice matters. Without sorting and distinct collection, the same set of exposures can appear as different labels depending on event order. The agent grouped the exposures as a set, not as a sequence. If you need sequence, that is a different guide: the &lt;a href=&quot;https://www.kuudo.com/guides/amc-path-to-conversion-sankey/&quot;&gt;path-to-conversion sankey&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The conversion join uses &lt;code&gt;AMAZON_ATTRIBUTED_EVENTS_BY_TRAFFIC_TIME&lt;/code&gt; because this is an exposure-window analysis. The query asks whether users who saw an ad product later purchased, so the conversion event has to occur after the user&#39;s minimum impression timestamp. That &lt;code&gt;conversion_event_dt &amp;gt; min_impression_dt&lt;/code&gt; predicate is the line that turns a raw join into a causal sanity check.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaced&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaced&lt;/h2&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Five caveats the agent brought back before I asked&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The improved Sponsored Ads and DSP overlap IQ is not the same as the older Sponsored Display and DSP overlap IQ. Use the improved one when Sponsored Products or Sponsored Brands are part of the comparison.&lt;/li&gt;
&lt;li&gt;Sponsored Products exposure in this IQ means impressions. If the team expects click-only logic, say that before anyone interprets the result.&lt;/li&gt;
&lt;li&gt;Every ad type in the comparison should advertise the same products during the same period and run for at least one week. Otherwise the exposure groups are not comparable.&lt;/li&gt;
&lt;li&gt;Wait at least 14 full days after the query end date. Running earlier makes the multi-exposure group look weaker because conversions have not fully closed.&lt;/li&gt;
&lt;li&gt;The result is set overlap, not touch order. If the business question is &amp;quot;which touch came first,&amp;quot; use the path-to-conversion workflow instead.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;Those are the guardrails that make the chart reviewable. A generic model can write a join. The hard part is knowing which join should not be trusted yet.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Run the unfiltered query once to see whether the overlap groups exist at a usable volume. If the &lt;code&gt;[&#39;DSP&#39;,&#39;sponsored_products&#39;]&lt;/code&gt; row is tiny, do not make a purchase-rate call yet. Extend the window, widen the campaign set, or accept that the campaigns did not create enough overlap to measure.&lt;/p&gt;
&lt;p&gt;If the overlap group is large enough, package the query as a recurring &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; with an approval gate. The agent should check the three preconditions before each run: same products, at least one week of co-running media, and 14 full days since query end date. If one fails, the Skill should report &amp;quot;not ready&amp;quot; instead of sending a chart to Slack.&lt;/p&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: Amazon Ads MCP brings the DSP, Sponsored Products, Sponsored Brands, and Sponsored Display signals; the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; can add Amazon Standard Identification Number (ASIN) and catalog context; Atlas grounds the timing rules; and Skills keep the recurring run reviewable.&lt;/p&gt;
&lt;p&gt;The budget action comes after review. If the combined exposure group has materially higher purchase rate than either single-exposure group, the DSP and Sponsored Ads plan is doing real full-funnel work. If the combined group is flat and reach is duplicated, move budget toward the ad product that drives incremental reach or test new audience definitions before increasing spend.&lt;/p&gt;
&lt;h2 id=&quot;the-point&quot; tabindex=&quot;-1&quot;&gt;The point&lt;/h2&gt;
&lt;p&gt;Overlap analysis is only useful when the setup rules are as visible as the result.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next up: use the same exposure groups as inputs to a &lt;a href=&quot;https://www.kuudo.com/guides/amc-path-to-conversion-sankey/&quot;&gt;path-to-conversion sankey&lt;/a&gt; so the agent can separate overlap from sequence.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Choose the Right AMC Attribution Source</title>
    <link href="https://www.kuudo.com/guides/amc-custom-attribution-models/"/>
    <id>https://www.kuudo.com/guides/amc-custom-attribution-models/</id>
    <published>2026-05-16T00:00:00Z</published>
    <updated>2026-05-16T00:00:00Z</updated>
    <summary>Pick the right AMC attribution data source before custom modeling, audience building, or standard-report reconciliation.</summary>
    <content type="html">&lt;p&gt;The Slack message came in mid-afternoon, from our paid-media lead: &lt;em&gt;&amp;quot;Our attribution model defaults are leaving us blind. Can we build a custom attribution view in AMC, and which data source do we use?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is the kind of ask that sounds like one question and is really three. There is not &amp;quot;one&amp;quot; &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; (AMC) attribution table. There are several, they are not interchangeable, and the obvious moves get you the wrong one. Ask ChatGPT for the AMC attribution table and you get back a single name with no context. Search Amazon&#39;s docs and the Custom Attribution Overview instructional query (IQ) surfaces, but the data-source comparison is buried in section 3.6 where most readers never scroll. Ping the agency and they default to &lt;code&gt;amazon_attributed_events_by_conversion_time&lt;/code&gt; because that is the standard reporting source used by the Amazon DSP (demand-side platform) UI.&lt;/p&gt;
&lt;p&gt;So I handed it to our agent, which has &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; behind it. Atlas indexes the AMC documentation, the instructional queries, the schema reference for every Amazon Standard Identification Number (ASIN) the catalog tracks, and the privacy framework that governs which columns you can put in a SELECT. Here is what came back.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong&lt;/h2&gt;
&lt;p&gt;I ran the same prompt through a frontier model with no retrieval. The output looked plausible. It was wrong in five specific, silent ways.&lt;/p&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Five failure modes I saw on a single un-grounded prompt&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It treated &lt;code&gt;amazon_attributed_events_by_conversion_time&lt;/code&gt; as a custom-attribution source. That table is the standard-reporting source: competition-aware, 14-day last-touch, de-duped across campaigns. You cannot build a custom model on it.&lt;/li&gt;
&lt;li&gt;It wrote &lt;code&gt;SELECT user_id&lt;/code&gt; from &lt;code&gt;conversions_with_relevance&lt;/code&gt; for an audience-building query. &lt;code&gt;user_id&lt;/code&gt; carries the aggregation threshold &amp;quot;Very high&amp;quot; and can never appear in the final SELECT of an analytics table. The only data source that permits audience-building semantics is &lt;code&gt;conversions_with_relevance_for_audiences&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It filtered &lt;code&gt;WHERE engagement_scope = &#39;PROMOTED&#39;&lt;/code&gt; against &lt;code&gt;conversions&lt;/code&gt;. &lt;code&gt;engagement_scope&lt;/code&gt; lives on &lt;code&gt;conversions_with_relevance&lt;/code&gt;; the plain &lt;code&gt;conversions&lt;/code&gt; table excludes every campaign-dependent column.&lt;/li&gt;
&lt;li&gt;It assumed &lt;code&gt;conversions&lt;/code&gt; and &lt;code&gt;conversions_with_relevance&lt;/code&gt; have the same row counts. They do not. In &lt;code&gt;conversions_with_relevance&lt;/code&gt;, a single conversion can appear on multiple rows, one per relevant campaign. The IQ example splits conversion_id 123456 across campaign_a and campaign_b.&lt;/li&gt;
&lt;li&gt;It quoted a 14-day pixel lookback to size pixel volume in custom attribution. That is the standard-reporting lookback. Inside custom attribution, the pixel lookback is bounded only by when the pixel was tracked to the campaign, or by the query time window.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;None of these failures throw an error. The query runs. The numbers look like attribution numbers. They are the wrong ones, and you only find out when the downstream model contradicts a sanity check.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves&lt;/h2&gt;
&lt;p&gt;When the agent gets the question, it does a semantic search across the &lt;code&gt;amazon_ads&lt;/code&gt; collection, which is the corpus that backs the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt;. It pulls six chunks before it writes anything:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Custom Attribution Overview&lt;/strong&gt; (dataset &lt;code&gt;conversions&lt;/code&gt;) defines the two custom-attribution data sources, the 28-day ASIN relevancy rules, and the section 3.6 comparison table that names all four AMC attribution sources.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Amazon Ads Conversions with Relevance&lt;/strong&gt; chunk (dataset &lt;code&gt;conversions_with_relevance&lt;/code&gt;) names both physical variants: the Analytics table (&lt;code&gt;conversions_with_relevance&lt;/code&gt;) and the Audience table (&lt;code&gt;conversions_with_relevance_for_audiences&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Amazon Attributed Events Overview&lt;/strong&gt; (dataset &lt;code&gt;amazon_attributed_events&lt;/code&gt;) is the schema reference for the standard-reporting attribution data, including the LOW-threshold dimension columns.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Data Aggregation Thresholds in AMC&lt;/strong&gt; chunk (dataset &lt;code&gt;amazon_attributed_events_by_conversion_time&lt;/code&gt;) classifies every column as None, Low, Medium, High, or Very high, and explains why &lt;code&gt;user_id&lt;/code&gt; cannot be SELECTed from a normal analytics table.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Custom Attribution Linear Model&lt;/strong&gt; IQ template shows how a chosen base table plugs into the standard-vs-custom comparison.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Joining and Unioning Sponsored Ads Traffic with Conversions&lt;/strong&gt; chunk (dataset &lt;code&gt;sponsored_ads_traffic&lt;/code&gt;) demonstrates that &lt;code&gt;sponsored_ads_traffic&lt;/code&gt; joins to &lt;code&gt;conversions_with_relevance&lt;/code&gt;, not &lt;code&gt;conversions&lt;/code&gt;, because campaign columns are required.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Atlas does not pick the table for you. It surfaces the rules and lets the agent make the call.&lt;/p&gt;
&lt;h2 id=&quot;the-agents-output&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s output&lt;/h2&gt;
&lt;p&gt;The artifact for this kind of question is not SQL. It is a decision plan: a matrix of every AMC attribution data source side by side, then a rule set keyed off the operator&#39;s actual use case. Here is the machine-readable form the agent returned, before the prose write-up:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;artifact&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;decision_plan&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amc-custom-attribution-base-table&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;rules&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;use_case&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;align with Amazon DSP / Sponsored Ads UI numbers&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;pick&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amazon_attributed_events_by_conversion_time&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;why&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;standard-reporting source; custom attribution will not reconcile by design&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;use_case&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Prime Day delivered-impression effect on conversions&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;pick&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amazon_attributed_events_by_traffic_time&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;why&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;anchors on traffic time, matching the campaign window&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;use_case&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;de-duped pixel volume across all campaigns, exposed and un-exposed users&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;pick&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;conversions&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;why&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;excludes campaign columns; one row per conversion&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;use_case&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;linear / position-based / first-touch / last-touch multi-touch model with per-campaign credit&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;pick&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;conversions_with_relevance&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;why&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;campaign columns + engagement_scope required to split credit; one row per (conversion x relevant campaign)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;use_case&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;build an audience from users satisfying a custom-attribution rule&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;pick&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;conversions_with_relevance_for_audiences&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;why&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;only data source permitting SELECT user_id for audience materialization&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;use_case&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;measure halo lift specifically&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;pick&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;conversions_with_relevance&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;why&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;filter engagement_scope = &#39;BRAND_HALO&#39; vs &#39;PROMOTED&#39; on the relevance table&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The JSON is the compact answer the Skill can hand to an operator or downstream workflow. The matrix below is the human review layer for the same decision: every row shows where the source is safe, where it silently drifts, and whether it can materialize users for activation.&lt;/p&gt;
&lt;h2 id=&quot;which-amc-attribution-source-should-you-choose&quot; tabindex=&quot;-1&quot;&gt;Which AMC attribution source should you choose?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data source&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;ASIN coverage&lt;/th&gt;
&lt;th&gt;Pixel coverage&lt;/th&gt;
&lt;th&gt;&lt;code&gt;engagement_scope&lt;/code&gt;?&lt;/th&gt;
&lt;th&gt;&lt;code&gt;SELECT user_id&lt;/code&gt;?&lt;/th&gt;
&lt;th&gt;Lookback&lt;/th&gt;
&lt;th&gt;Dedup behavior&lt;/th&gt;
&lt;th&gt;Use it for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;amazon_attributed_events_by_conversion_time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Standard-reporting attribution, by conversion time&lt;/td&gt;
&lt;td&gt;Ad-attributed only&lt;/td&gt;
&lt;td&gt;Ad-attributed only&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;No (&lt;code&gt;user_id&lt;/code&gt; is Very high)&lt;/td&gt;
&lt;td&gt;14-day last-touch (pixel)&lt;/td&gt;
&lt;td&gt;De-duped across campaigns&lt;/td&gt;
&lt;td&gt;Aligning with the standard Amazon DSP and Sponsored Ads reports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Standard-reporting attribution, by traffic time&lt;/td&gt;
&lt;td&gt;Ad-attributed only&lt;/td&gt;
&lt;td&gt;Ad-attributed only&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;14-day last-touch (pixel)&lt;/td&gt;
&lt;td&gt;De-duped across campaigns&lt;/td&gt;
&lt;td&gt;Campaign-window analyses, like Prime Day delivered impressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;conversions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Custom-attribution base; relevant conversions only, no campaign columns&lt;/td&gt;
&lt;td&gt;Promoted plus brand halo&lt;/td&gt;
&lt;td&gt;All pixel conversions tracked to the campaign, exposed and un-exposed users&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;28-day ASIN relevancy; pixel lookback bounded by tracking start&lt;/td&gt;
&lt;td&gt;De-duped&lt;/td&gt;
&lt;td&gt;Volume questions and de-duped pixel performance across campaigns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;conversions_with_relevance&lt;/code&gt; (Analytics table)&lt;/td&gt;
&lt;td&gt;Custom-attribution base plus campaign and advertiser columns&lt;/td&gt;
&lt;td&gt;Same conversions as &lt;code&gt;conversions&lt;/code&gt;, one row per relevant campaign&lt;/td&gt;
&lt;td&gt;Same conversions as &lt;code&gt;conversions&lt;/code&gt;, one row per relevant campaign&lt;/td&gt;
&lt;td&gt;Yes (PROMOTED, BRAND_HALO, null)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Same as &lt;code&gt;conversions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Duplicated across relevant campaigns&lt;/td&gt;
&lt;td&gt;Multi-touch and split-credit custom models (linear, position-based, first-touch, last-touch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;conversions_with_relevance_for_audiences&lt;/code&gt; (Audience table)&lt;/td&gt;
&lt;td&gt;Audience-table variant of &lt;code&gt;conversions_with_relevance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same as &lt;code&gt;conversions_with_relevance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same as &lt;code&gt;conversions_with_relevance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes, the only data source that permits &lt;code&gt;SELECT user_id&lt;/code&gt; for audience-building&lt;/td&gt;
&lt;td&gt;Same as &lt;code&gt;conversions_with_relevance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;td&gt;Materializing custom-attribution audiences for activation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A note on framing: Atlas&#39;s section 3.6 comparison lists four AMC attribution data sources by splitting &lt;code&gt;amazon_attributed_events&lt;/code&gt; into the &lt;code&gt;_by_conversion_time&lt;/code&gt; and &lt;code&gt;_by_traffic_time&lt;/code&gt; variants. Other framings collapse those two into one and treat &lt;code&gt;conversions_with_relevance_for_audiences&lt;/code&gt; as the fourth distinct surface. The matrix above shows all five rows so both views are visible; the decision rules below collapse to the four-way operator choice.&lt;/p&gt;
&lt;h3 id=&quot;decision-rules&quot; tabindex=&quot;-1&quot;&gt;Decision rules&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If the use case is &amp;quot;align my custom model output with the numbers in the Amazon DSP or Sponsored Ads UI,&amp;quot; pick &lt;code&gt;amazon_attributed_events_by_conversion_time&lt;/code&gt;, because it is the standard-reporting source and custom attribution will not reconcile by design.&lt;/li&gt;
&lt;li&gt;If the use case is &amp;quot;Prime Day delivered-impression effect on conversions,&amp;quot; pick &lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt;, because it anchors on traffic time and matches the campaign window.&lt;/li&gt;
&lt;li&gt;If the use case is &amp;quot;de-duped pixel volume across all campaigns the pixel is tracked to, exposed and un-exposed users,&amp;quot; pick &lt;code&gt;conversions&lt;/code&gt;, because it excludes campaign columns and emits one row per conversion.&lt;/li&gt;
&lt;li&gt;If the use case is &amp;quot;linear, position-based, first-touch, or last-touch custom model with per-campaign credit,&amp;quot; pick &lt;code&gt;conversions_with_relevance&lt;/code&gt;, because campaign columns and &lt;code&gt;engagement_scope&lt;/code&gt; are required to split credit; expect one row per (conversion x relevant campaign).&lt;/li&gt;
&lt;li&gt;If the use case is &amp;quot;build an audience from the users who satisfy a custom attribution rule,&amp;quot; pick &lt;code&gt;conversions_with_relevance_for_audiences&lt;/code&gt;, because it is the only data source that permits &lt;code&gt;SELECT user_id&lt;/code&gt; for audience materialization.&lt;/li&gt;
&lt;li&gt;If the use case is &amp;quot;measure halo lift specifically,&amp;quot; pick &lt;code&gt;conversions_with_relevance&lt;/code&gt; and filter on &lt;code&gt;engagement_scope = &#39;BRAND_HALO&#39;&lt;/code&gt; versus &lt;code&gt;&#39;PROMOTED&#39;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few things to notice about how the agent broke this apart.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;amazon_attributed_events_*&lt;/code&gt; family is not a custom-attribution base table. It is competition-aware, de-duped across campaigns, and follows fixed last-touch logic. Use it when you need to align with standard reporting numbers. Never use it when you are modeling, because the model logic is already baked in and you cannot unbake it.&lt;/p&gt;
&lt;p&gt;The split between &lt;code&gt;conversions&lt;/code&gt; and &lt;code&gt;conversions_with_relevance&lt;/code&gt; is a row-shape difference, not a coverage difference. Both tables cover the same set of relevant conversions. &lt;code&gt;conversions_with_relevance&lt;/code&gt; adds campaign and advertiser dimensions, and as a consequence it emits one row per relevant campaign per conversion. A dedup-aware question like &amp;quot;how many users converted in the window, period&amp;quot; uses &lt;code&gt;conversions&lt;/code&gt;. A multi-touch model that splits credit across campaigns uses &lt;code&gt;conversions_with_relevance&lt;/code&gt; because the per-campaign rows are exactly what gets weighted.&lt;/p&gt;
&lt;p&gt;The audience-table variant exists because of aggregation thresholds, not because someone wanted three tables instead of two. &lt;code&gt;user_id&lt;/code&gt; is classified Very high, which means a normal analytics table cannot put it in a final SELECT, cannot filter it against a literal value, and cannot use it as a join or group-by key against literals. The &lt;code&gt;_for_audiences&lt;/code&gt; companion is the data source that allows audience-building semantics, and it is the only one. Anything materializing user-level audiences from custom attribution flows through it.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;engagement_scope&lt;/code&gt; column on &lt;code&gt;conversions_with_relevance&lt;/code&gt; is the lever for halo measurement. Values are &lt;code&gt;PROMOTED&lt;/code&gt; for the promoted ASIN, &lt;code&gt;BRAND_HALO&lt;/code&gt; for halo conversions to other ASINs from the same brand, and null for pixel conversions. Any custom model that wants to isolate halo lift filters on this column. Any custom model that ignores it is silently treating halo and promoted as the same thing.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaced-unprompted&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaced unprompted&lt;/h2&gt;
&lt;p&gt;This is the part where retrieval grounding earns its keep. None of these were asked for. All of them mattered.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Six things the agent surfaced that the operator did not ask about&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The 28-day ASIN relevancy window for custom attribution is double the brand-based 14-day window in &lt;code&gt;amazon_attributed_events_by_conversion_time&lt;/code&gt; and &lt;code&gt;_by_traffic_time&lt;/code&gt;. Higher per-ASIN conversion counts in custom attribution are expected, not a bug.&lt;/li&gt;
&lt;li&gt;The custom-attribution data sources are not competition-aware and include both viewable and non-viewable impressions. Two more reasons custom-attribution conversion counts run higher than the attributed-events numbers.&lt;/li&gt;
&lt;li&gt;Pixel conversions in &lt;code&gt;conversions&lt;/code&gt; and &lt;code&gt;conversions_with_relevance&lt;/code&gt; do not require an ad impression or click to be relevant. If a pixel was tracked to a DSP campaign, all pixel conversions appear, including from users who were never exposed.&lt;/li&gt;
&lt;li&gt;Pixel lookback inside custom attribution is bounded by when the pixel was tracked to the campaign, or by the query time window. It is not the 14-day last-touch lookback that &lt;code&gt;amazon_attributed_events_*&lt;/code&gt; uses. Sizing pixel volume with the wrong lookback is a common silent error.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;engagement_scope&lt;/code&gt; is always &lt;code&gt;PROMOTED&lt;/code&gt; for pixel conversions (when &lt;code&gt;event_category = &#39;pixel&#39;&lt;/code&gt;), and &lt;code&gt;halo_code&lt;/code&gt; is null for pixels. Both columns are LOW-threshold dimensions and both live only on &lt;code&gt;conversions_with_relevance&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user_id&lt;/code&gt; (aggregation threshold Very high) can never appear in the final SELECT, cannot be filtered with literal values, and cannot be used as a join or group-by key against literals. It can, however, be COUNT or COUNT DISTINCTed, which is how reach, optimal-frequency, and customer-journey queries get written. The &lt;code&gt;_for_audiences&lt;/code&gt; audience table exists as a separate physical surface precisely because the analytics tables cannot do the audience-shaped thing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;Most of these would have cost an hour each to discover the hard way. Compounded across a quarter, they are the difference between a custom attribution program that ships and one that gets quietly abandoned.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;The decision plan is the input, not the output. Once you have picked the base table, the operational moves diverge.&lt;/p&gt;
&lt;p&gt;If you picked &lt;code&gt;conversions_with_relevance&lt;/code&gt; for a multi-touch model, the next step is to schedule the linear or position-based IQ as a recurring AMC workflow. Package it as a verified &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; and export the campaign-weighted credit to a dashboard. If you picked &lt;code&gt;conversions_with_relevance_for_audiences&lt;/code&gt;, the next step is to activate the resulting user set as an AMC audience, following the same pattern documented in the &lt;a href=&quot;https://www.kuudo.com/guides/amc-cart-abandoner-audience/&quot;&gt;cart-abandoner audience guide&lt;/a&gt;. If you picked &lt;code&gt;conversions&lt;/code&gt; for de-duped pixel volume across campaigns, feed it into the same pipeline pattern used in the &lt;a href=&quot;https://www.kuudo.com/guides/amc-subscribe-and-save-lift/&quot;&gt;Subscribe &amp;amp; Save lift workflow&lt;/a&gt;, substituting your custom-attribution filters.&lt;/p&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; brings AMC and campaign signals, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; can add catalog context when ASIN eligibility matters, Atlas grounds the source selection, and Skills keep the attribution model on a reviewable schedule.&lt;/p&gt;
&lt;p&gt;If you picked &lt;code&gt;amazon_attributed_events_by_conversion_time&lt;/code&gt; or &lt;code&gt;_by_traffic_time&lt;/code&gt;, stop. You are doing standard reporting alignment, not custom modeling. Route the work to the standard-reports surface and save AMC for the questions standard reports cannot answer.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters&quot; tabindex=&quot;-1&quot;&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;Pick the wrong base table and every downstream model inherits the wrong numbers, silently, for as long as the workflow runs.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Next in the series: building a path-to-conversion view in AMC that stitches DSP, Sponsored Products, Sponsored Brands, and Sponsored Display into a single touch-ordered timeline. Custom attribution sets the base table; path analysis is what you do with it.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Evaluate Prime Day AMC Lookalikes</title>
    <link href="https://www.kuudo.com/guides/amc-lookalike-audience-evaluation/"/>
    <id>https://www.kuudo.com/guides/amc-lookalike-audience-evaluation/</id>
    <published>2026-05-13T00:00:00Z</published>
    <updated>2026-05-13T00:00:00Z</updated>
    <summary>Evaluate a Prime Day AMC lookalike against last year&#39;s rule-based audience using new-to-brand share, incremental reach, and cost per acquisition.</summary>
    <content type="html">&lt;p&gt;The Slack message came in two days after the Prime Day campaign closed: &lt;em&gt;&amp;quot;The lookalike audience shipped. Did it actually beat last year&#39;s rule-based audience, or did we just add a new prospecting line item?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That question should not be answered from an Amazon DSP screenshot. The operator needs a matched-window read in &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt;: same promotional period, comparable spend, and the same conversion definition. If the lookalike audience reached more shoppers but bought new-to-brand customers at a worse cost, it did not win. It scaled noise. If it held cost per new-to-brand customer while expanding reach, the seed is worth keeping.&lt;/p&gt;
&lt;p&gt;So I asked our agent in Claude. The agent has &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; behind it: a corpus of AMC playbooks, instructional queries, reporting patterns, and audience notes. The same prompt would work in ChatGPT because Kuudo exposes that Amazon context through standards-based &lt;a href=&quot;https://www.kuudo.com/features/mcp/&quot;&gt;Model Context Protocol (MCP)&lt;/a&gt;, not through one chat app. If the follow-up belongs in code, Cursor or Codex can use the same server. If it needs to run weekly, n8n or Make can call the same workflow. The &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;AI client&lt;/a&gt; changes; the grounded Amazon context does not.&lt;/p&gt;
&lt;h2 id=&quot;what-chatgpt-or-claude-without-atlas-gets-wrong-in-lookalike-evaluation&quot; tabindex=&quot;-1&quot;&gt;What ChatGPT or Claude without Atlas gets wrong in lookalike evaluation&lt;/h2&gt;
&lt;p&gt;I ran the same ask without retrieval. The answer sounded reasonable: pull conversions, compare totals, report lift. That is not enough for a Prime Day audience decision.&lt;/p&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Five failure modes in the un-grounded response&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It compared the lookalike audience to total campaign performance instead of to last year&#39;s rule-based audience baseline. That makes the lookalike inherit credit from every other tactic in the flight.&lt;/li&gt;
&lt;li&gt;It treated reach as the win condition. For Prime Day prospecting, reach only matters if new-to-brand efficiency holds.&lt;/li&gt;
&lt;li&gt;It ignored the attribution settling period. Reading the audience too early undercounts late conversions and can make the model look worse than the baseline.&lt;/li&gt;
&lt;li&gt;It did not normalize for spend. A line item with 40% more spend should produce more conversions; the question is whether it produced cheaper or more incremental customers.&lt;/li&gt;
&lt;li&gt;It did not create a next action. The operator needs a keep, rotate, or rebuild decision, not a dashboard summary.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;This is the same problem as the seed post in reverse. The model can write the query-shaped thing. The Atlas-grounded agent knows which comparison decides the next Prime Day seed.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves-for-prime-day-lookalike-measurement&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves for Prime Day lookalike measurement&lt;/h2&gt;
&lt;p&gt;When the agent gets the question, it pulls the audience-building post&#39;s downstream playbook pieces before writing SQL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;AMC Lookalike Audiences for Promotional Events&lt;/strong&gt; playbook: the source of the Prime Day lead-in and lead-out logic, plus the expectation that performance is evaluated after activation rather than at seed creation.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Introduction to AMC Lookalike Audiences&lt;/strong&gt; instructional query: the expansion-type context that explains why Balanced, Similar, and Broad should be evaluated differently.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Customer Journey Analytics&lt;/strong&gt; playbook: the follow-on analysis path for checking whether the lookalike is creating new conversion journeys or entering journeys the rule-based audience already covered.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;DSP and AMC conversion reporting table notes&lt;/strong&gt;: the table-shape reminders for &lt;code&gt;dsp_impressions&lt;/code&gt;, &lt;code&gt;dsp_clicks&lt;/code&gt;, and &lt;code&gt;amazon_attributed_events_by_traffic_time&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Subscribe &amp;amp; Save lift analysis&lt;/strong&gt; pattern: the upstream check that tells the operator whether SnS behavior was strong enough to be a seed in the first place.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The seed can also be rebuilt around Amazon Standard Identification Number (ASIN) behavior if the evaluation shows that subscription buyers reached well but did not produce enough new customers.&lt;/p&gt;
&lt;p&gt;The retrieved set matters because this is not just a measurement query. It is a decision about whether the next seed should stay SnS, rotate to multi-ASIN purchasers, or use a spend threshold.&lt;/p&gt;
&lt;h2 id=&quot;the-agents-working-output-amc-lookalike-lift-sql&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s working output: AMC lookalike lift SQL&lt;/h2&gt;
&lt;p&gt;The agent produced an evaluation skeleton that compares the activated lookalike line item with a prior rule-based audience baseline. The placeholder IDs are intentionally visible so the operator can audit what is being compared before running it.&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* AMC lookalike audience evaluation skeleton
   Run after the promotional flight closes and attribution has settled.
   Last verified: 2026-05-13.

   Replace:
  - LOOKALIKE_CAMPAIGN_ID with the Prime Day lookalike line item/campaign
   - BASELINE_CAMPAIGN_ID with last year&#39;s rule-based audience campaign
   - flight windows with matched Prime Day periods
*/&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; comparison_windows &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&#39;lookalike_2026&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; cohort&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;TIMESTAMP&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;2026-07-01 00:00:00&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; window_start&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;TIMESTAMP&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;2026-07-15 23:59:59&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; window_end&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&#39;LOOKALIKE_CAMPAIGN_ID&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; campaign_id
  &lt;span class=&quot;token keyword&quot;&gt;UNION&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ALL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&#39;rule_based_2025&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; cohort&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;TIMESTAMP&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;2025-07-01 00:00:00&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; window_start&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;TIMESTAMP&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;2025-07-15 23:59:59&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; window_end&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&#39;BASELINE_CAMPAIGN_ID&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; campaign_id
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
impressions &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cohort&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_cost&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; spend
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; comparison_windows w
  &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; dsp_impressions i
    &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_id
   &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impression_dt_utc &lt;span class=&quot;token operator&quot;&gt;BETWEEN&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;window_start &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;window_end
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
conversions &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cohort&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; orders&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;new_to_brand &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;TRUE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ELSE&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;END&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; ntb_orders
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; comparison_windows w
  &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; amazon_attributed_events_by_traffic_time a
    &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;campaign_id
   &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;event_dt_utc &lt;span class=&quot;token operator&quot;&gt;BETWEEN&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;window_start &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;window_end
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;conversion_event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
cohort_rollup &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cohort&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; reached_users&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;impressions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; impressions&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;spend&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; spend&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; converting_users&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;orders&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; orders&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ntb_orders&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; ntb_orders
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; impressions i
  &lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; conversions c
    &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cohort &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cohort
   &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  cohort&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  reached_users&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  spend&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  orders&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  ntb_orders&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  orders &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;reached_users&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; conversion_rate&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  ntb_orders &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;orders&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; ntb_share&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  spend &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ntb_orders&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; cost_per_ntb_order&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  sales &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;spend&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; roas
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; cohort_rollup
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; cohort&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three choices matter in that SQL. First, the comparison is campaign-scoped, not account-scoped. The lookalike line item should not borrow credit from branded search, retargeting, or other Prime Day tactics.&lt;/p&gt;
&lt;p&gt;Second, the windows are explicit. If you compare a 2026 lead-in window to a 2025 full-event window, the result will look precise and be useless. The agent forces both cohorts into matched promotional periods.&lt;/p&gt;
&lt;p&gt;Third, the output includes &lt;code&gt;cost_per_ntb_order&lt;/code&gt;, not just return on ad spend (ROAS). For a lookalike audience, the question is not only whether it sold product. The question is whether it found new customers at a cost worth repeating in Amazon demand-side platform (DSP) activation.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaces-before-you-trust-the-lift-read&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaces before you trust the lift read&lt;/h2&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Things Atlas surfaced that the operator did not ask for&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Do not evaluate before attribution settles.&lt;/strong&gt; A same-day read can undercount late attributed conversions and distort the lookalike result.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spend-normalize before calling lift.&lt;/strong&gt; More spend usually means more orders. Efficiency metrics decide whether the audience actually improved the plan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compare to the right baseline.&lt;/strong&gt; Last year&#39;s rule-based audience is a better baseline than total Prime Day performance because it isolates audience strategy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treat expansion type as a test variable.&lt;/strong&gt; If Balanced scaled reach but lost new-to-brand efficiency, test Similar next. If Similar is efficient but too small, test Broad.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use path analysis as the next diagnostic.&lt;/strong&gt; If the lookalike appears in the same journeys as existing retargeting, it may not be creating new demand.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;The footnotes change the shape of the readout. Without them, the operator gets a table. With them, the operator gets a decision tree.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next-keep-rotate-or-rebuild-the-seed&quot; tabindex=&quot;-1&quot;&gt;What happens next: keep, rotate, or rebuild the seed&lt;/h2&gt;
&lt;p&gt;The agent turns the output into three possible decisions. If the lookalike improves new-to-brand share and lowers cost per new-to-brand order, keep the seed and test a tighter expansion type. If reach improves but efficiency falls, rotate the seed from SnS subscribers to multi-ASIN purchasers or a spend threshold. If the rule-based audience still wins on conversion rate and cost, keep lookalikes in the lead-in phase and use rule-based audiences for lead-out retargeting.&lt;/p&gt;
&lt;p&gt;This is where the standards-based setup matters operationally. If you are in Claude, ask for the recommendation in plain language. If your team works in ChatGPT, ask the same question there. If the marketing analyst wants to inspect the SQL, open it in Cursor or Codex. If the read should run every Monday after a promotional flight, schedule it in n8n or Make. Kuudo speaks MCP, so the same Amazon context follows the work into whichever standards-supporting client your team prefers.&lt;/p&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; brings AMC and DSP signals, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; can add catalog and ASIN context, Atlas grounds the baseline comparison, and &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; keep the post-flight read on a repeatable schedule.&lt;/p&gt;
&lt;p&gt;The follow-on analysis is the conversion path. If the lookalike wins, use the &lt;a href=&quot;https://www.kuudo.com/guides/amc-path-to-conversion-sankey/&quot;&gt;path-to-conversion Sankey workflow&lt;/a&gt; to see whether it is creating new journeys or merely joining paths your existing campaigns already owned.&lt;/p&gt;
&lt;h2 id=&quot;why-standards-based-ai-clients-make-this-more-useful&quot; tabindex=&quot;-1&quot;&gt;Why standards-based AI clients make this more useful&lt;/h2&gt;
&lt;p&gt;This is not a Claude workflow, a ChatGPT workflow, or a Cursor workflow. It is an Amazon Marketing Cloud workflow exposed through a standard interface. The useful part is the stable context: the tables, playbooks, thresholds, and audience history. The chat or coding tool is just where the operator happens to be working.&lt;/p&gt;
&lt;p&gt;That is the same reason the evaluation produces an action instead of a report. The agent can move from question to SQL to scheduling because the context is portable. It can answer in chat, edit in code, and run in a workflow tool without rewriting the operating logic.&lt;/p&gt;
&lt;p&gt;If your lookalike readout stops at reach and ROAS, it has not answered the Prime Day question.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next: use path-to-conversion analysis to see whether the lookalike audience created new customer journeys or just overlapped with existing retargeting paths.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Segment AMC Customers by CLTV</title>
    <link href="https://www.kuudo.com/guides/amc-cltv-cohort-segmentation/"/>
    <id>https://www.kuudo.com/guides/amc-cltv-cohort-segmentation/</id>
    <published>2026-05-11T00:00:00Z</published>
    <updated>2026-05-11T00:00:00Z</updated>
    <summary>Build AMC CLTV segments with the four-segment taxonomy, the correct audience table variant, and a cohort migration diagnostic you can re-run.</summary>
    <content type="html">&lt;p&gt;&amp;quot;Which of our customer cohorts are actually worth the most over time, and which look profitable but aren&#39;t?&amp;quot; — that was my Slack question on a Tuesday, and I handed it to our &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; with a strict brief: no fluffy summaries, just a query-first proof of concept. I already tried three obvious approaches: a ChatGPT-style single-shot which ignored &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt;&#39;s 12-month customer lifetime value (CLTV) cohort window, the AMC docs alone that described CLTV but didn&#39;t surface the exact AVG(... ) OVER () CASE pattern we needed, and an agency pitch deck that happily swapped segment labels and ignored activation timing. I asked the agent to return a per-user labeling of High Value / Growth Potential / Revenue Potential / Low Value ready for a 48-hour Amazon demand-side platform (DSP) activation window for resulting audiences.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong&lt;/h2&gt;
&lt;p&gt;I ran the same prompt through a frontier model with no retrieval. The output read confidently. It was wrong in five places, each subtle enough that an operator would only catch the failures at activation time, when the DSP audience comes back empty or the segment labels don&#39;t match the deck.&lt;/p&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Five failure modes I saw in a single un-grounded response&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;used &lt;code&gt;conversions&lt;/code&gt; rather than &lt;code&gt;conversions_for_audiences&lt;/code&gt; (the audience-build table variant), which produces the wrong user set for RBA exports.&lt;/li&gt;
&lt;li&gt;omitted &lt;code&gt;AVG(lifetime_score) OVER ()&lt;/code&gt; and &lt;code&gt;AVG(value_score) OVER ()&lt;/code&gt; semantics, producing non-comparable thresholds across the two axes.&lt;/li&gt;
&lt;li&gt;failed to include the 48-hour DSP activation window, so audiences can&#39;t be scheduled correctly in DSP.&lt;/li&gt;
&lt;li&gt;returned generic tiers instead of the four AMC segments: High Value, Growth Potential, Revenue Potential, Low Value.&lt;/li&gt;
&lt;li&gt;omitted the year-over-year diagnostic dimension for cohort migration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;This is the differentiator. The model isn&#39;t lying. It is producing a plausible-looking artifact that fails against the AMC playbook&#39;s actual mechanics: the audience-build table variant, the composite window-function semantics, the activation timing, the named segment taxonomy, and the diagnostic dimension that catches drift over time.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Understanding Customer Long-Term Value (CLTV)&amp;quot; playbook: the canonical AMC CLTV reference that explains CLTV versus return on ad spend (ROAS) and reminds us the AMC long-term window is bounded to 12 months. (source: Customer long-term value (CLTV): Amazon Marketing Cloud)&lt;/li&gt;
&lt;li&gt;&amp;quot;Lifetime * Value CLTV SQL Export Logic&amp;quot;: the composite-score template that defines the Lifetime Ratio and the overall Lifetime × Value construct. This includes the formula Lifetime Ratio = Purchase Frequency × Purchase Quantity × User Lifetime ratios. (source: Lifetime * Value CLTV SQL Export Logic)&lt;/li&gt;
&lt;li&gt;&amp;quot;Audience Labeling&amp;quot; CASE statement for the four segments: the exact AVG(...) OVER () CASE pattern you need to convert scores into High Value, Growth Potential, Revenue Potential, and Low Value labels. (source: Audience segmentation (based on CLTV))&lt;/li&gt;
&lt;li&gt;&amp;quot;Identify high value customer segments&amp;quot;: a data-interpretation guide with percentile examples and audience-size guidance so you can pick seed thresholds and respect rule-based audience (RBA) and lookalike (LAL) guardrails. (source: Identifying High Value Customer Segments: Flexible Amazon shopping insights)&lt;/li&gt;
&lt;li&gt;&amp;quot;CLTV Audience Segmentation (Year-Over-Year)&amp;quot;: the diagnostic view and recommended recurring check to detect cohort migration between segments over time. (source: Customer long-term value (CLTV): Year-over-year guidance)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-agents-output&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s output&lt;/h2&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;-- Per-user CLTV segmentation skeleton for AMC&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- 1) base events: filter to the 12-month AMC window and to the audience build table&lt;/span&gt;
events &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
        user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        event_time&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        tracked_asin&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;-- optional: later join to ASIN-&gt;category mapping for descriptive stats&lt;/span&gt;
        quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        sale_price&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;-- revenue per event (use Paid Features mappings if available)&lt;/span&gt;
        ad_spend      &lt;span class=&quot;token comment&quot;&gt;-- spend attributed to the event (nullable; a proxy may be filled for off-Amazon)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_for_audiences &lt;span class=&quot;token comment&quot;&gt;-- use conversions_all for sizing/coverage experiments&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_time &lt;span class=&quot;token operator&quot;&gt;BETWEEN&lt;/span&gt; DATE_ADD&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;month&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;CURRENT_DATE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;CURRENT_DATE&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;-- 2) per-user purchase aggregates&lt;/span&gt;
user_purchases &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
        user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; event_time&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                             &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; purchase_count&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                                         &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_units&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sale_price&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_revenue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ad_spend&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                             &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_ad_spend&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;MIN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_time&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                                       &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; first_purchase_ts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_time&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                                       &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; last_purchase_ts
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; events
    &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; user_id
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;-- 3) derived per-user metrics required by the playbook&lt;/span&gt;
user_metrics &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
        user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        purchase_count&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        total_units&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        total_revenue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        total_ad_spend&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;-- user lifetime in days within the 12-month window (inclusive)&lt;/span&gt;
        DATE_DIFF&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;day&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; first_purchase_ts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last_purchase_ts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; user_lifetime_days&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;-- purchase frequency: purchases per active 30-day period (approx)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; DATE_DIFF&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;day&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; first_purchase_ts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last_purchase_ts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; purchase_count &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;GREATEST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;DATE_DIFF&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;day&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; first_purchase_ts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last_purchase_ts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;ELSE&lt;/span&gt; purchase_count
        &lt;span class=&quot;token keyword&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; purchase_frequency&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;-- purchase quantity per purchase&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; purchase_count &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; total_units &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; CAST&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;purchase_count &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DOUBLE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ELSE&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; purchase_quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;-- customer cost: currently only ad spend; retention_cost can be added to this field&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_ad_spend&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; customer_cost
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; user_purchases
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;-- 4) cohort selection: cohort_month as a simple acquisition cohort; replace with channel or category as needed&lt;/span&gt;
cohorted &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
        um&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        DATE_FORMAT&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;first_purchase_ts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;%Y-%m&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; cohort_month
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; user_metrics &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; um
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;-- 5) cohort-level means used to normalize into ratios&lt;/span&gt;
cohort_stats &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
        cohort_month&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;purchase_frequency&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;     &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; avg_purchase_frequency&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;purchase_quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;      &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; avg_purchase_quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user_lifetime_days&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;     &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; avg_user_lifetime_days&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_revenue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;          &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; avg_revenue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;customer_cost&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;          &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; avg_cost&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                    &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; cohort_size
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; cohorted
    &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; cohort_month
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;-- 6) per-user ratios (Lifetime and Value components)&lt;/span&gt;
ratios &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
        c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cohort_month&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;-- Lifetime Ratio = Purchase Frequency Ratio × Purchase Quantity Ratio × User Lifetime Ratio&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;purchase_frequency&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;avg_purchase_frequency&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;purchase_quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;avg_purchase_quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_lifetime_days&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;avg_user_lifetime_days&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; lifetime_ratio&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;-- Value side: revenue vs cost ratios (higher revenue and lower cost should increase value)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_revenue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;avg_revenue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; revenue_ratio&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;customer_cost&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;avg_cost&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; cost_ratio
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; cohorted c
    &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; cohort_stats s &lt;span class=&quot;token keyword&quot;&gt;USING&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cohort_month&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;-- 7) per-user scores: lifetime_score (product) and value_score (revenue - cost composite)&lt;/span&gt;
scores &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
        r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cohort_month&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lifetime_ratio &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; lifetime_score&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;revenue_ratio &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cost_ratio&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; value_score
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; ratios r
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;-- Final: label users using global AVG(...) OVER () thresholds so both legs compare to the same population&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cohort_month&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lifetime_score&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value_score&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lifetime_score &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lifetime_score&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;OVER&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value_score &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value_score&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;OVER&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;High Value&#39;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lifetime_score &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lifetime_score&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;OVER&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value_score &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;  &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value_score&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;OVER&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Growth Potential&#39;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lifetime_score &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;  &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lifetime_score&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;OVER&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value_score &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value_score&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;OVER&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Revenue Potential&#39;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lifetime_score &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;  &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lifetime_score&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;OVER&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value_score &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;  &lt;span class=&quot;token function&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value_score&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;OVER&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Low Value&#39;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;ELSE&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Unlabeled&#39;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; customer_segment
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; scores s&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I kept the SQL intentionally modular so the parts are pluggable into our pipeline. The agent used the composite formula from the &amp;quot;Lifetime * Value CLTV SQL Export Logic&amp;quot;: Lifetime Ratio = Purchase Frequency × Purchase Quantity × User Lifetime ratios, and modeled value_score as a revenue-minus-cost composite so that higher revenue and lower cost increase value. Cohorting is done by first_purchase month as a placeholder; replace cohort_month with acquisition_channel or tracked_asin category if that&#39;s more meaningful for your ops.&lt;/p&gt;
&lt;p&gt;I also made two operational choices: use conversions_for_audiences for the canonical audience build exports and run the same query against conversions_all only when you need a sizing or coverage experiment. Finally, ensure the AVG(...) OVER () comparisons are computed over the same population so the thresholds are comparable.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaced-unprompted&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaced unprompted&lt;/h2&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Agent footnotes added without asking&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;audiences ready for DSP activation have a 48-hour activation window.&lt;/li&gt;
&lt;li&gt;AMC long-term = one-year window; cohorts are bounded to 12 months.&lt;/li&gt;
&lt;li&gt;use percentile examples (e.g., top 71-100, ~748k out of 2.5M) and audience-size guardrails when creating RBA/LAL; avoid seed sizes below the platform minimum.&lt;/li&gt;
&lt;li&gt;AVG(lifetime_score) OVER () and AVG(value_score) OVER () must use the SAME population to produce comparable thresholds.&lt;/li&gt;
&lt;li&gt;run the year-over-year cohort migration check to spot cohorts moving from Growth Potential into High Value or sliding to Low Value.&lt;/li&gt;
&lt;li&gt;include non-ad-attributed conversions (Paid Features shopping insights) for a fuller revenue picture when available.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Export the four labeled audiences as rule-based audience manifests and activate into Amazon DSP with differentiated bidding: Higher bid for High Value, conversion-first creatives for Growth Potential, revenue-focused bids for Revenue Potential while excluding low-margin ASINs, and exclude or suppress Low Value audiences from high-cost buys. (See Swim Lane #3 and #4 from the Off-Amazon Conversions Playbook.)&lt;/li&gt;
&lt;li&gt;Schedule this query as a recurring AMC job monthly, aligned to cohort_month granularity, and push audiences after respecting the 48-hour DSP activation window for resulting audiences.&lt;/li&gt;
&lt;li&gt;Run the year-over-year diagnostic at the same cadence and produce cohort-migration charts that bucket users by percentile so you can detect movement between Growth Potential and High Value or slides toward Low Value.&lt;/li&gt;
&lt;li&gt;For ops handoff: publish an audience manifest with Amazon Standard Identification Number (ASIN) category mappings, provide audience sizes and seed counts, and filter out cohorts under minimum seed thresholds before requesting DSP activation. Consider running overlap scoring against Persona Builder API outputs to avoid audience saturation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; brings AMC and campaign signals, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; can add catalog context for ASIN grouping, Atlas grounds the CLTV taxonomy, and &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; turn the segment export into a reviewed recurring automation.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters&quot; tabindex=&quot;-1&quot;&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;A foundation model can write CLTV-shaped SQL. What it cannot reliably do is produce a query that compiles against the AMC table variants Audiences actually accepts, uses the exact composite window-function pattern the CLTV playbook prescribes, labels users with the four-segment taxonomy operators downstream are already wired for, and bakes in the 48-hour activation window plus the year-over-year diagnostic. The agent didn&#39;t have to remember any of that. It had to know where to look.&lt;/p&gt;
&lt;p&gt;Composite Lifetime × Value cohorting.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next guide in the series: moving from segmentation to actual bidding rules. What &lt;code&gt;amazon_rules&lt;/code&gt; says you should do once you have a High Value cohort: &lt;a href=&quot;https://www.kuudo.com/guides/amc-path-to-conversion-sankey/&quot;&gt;Path to conversion sankey&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Build High-Value AMC Audience Seeds</title>
    <link href="https://www.kuudo.com/guides/amc-high-value-audience-segmentation/"/>
    <id>https://www.kuudo.com/guides/amc-high-value-audience-segmentation/</id>
    <published>2026-05-11T00:00:00Z</published>
    <updated>2026-05-11T00:00:00Z</updated>
    <summary>Build high-value AMC audience seeds with the right table variant, a seed-size buffer, and the lookalike activation checks that keep them usable.</summary>
    <content type="html">&lt;p&gt;The Slack ping landed on a Thursday from our CRM lead: &lt;em&gt;&amp;quot;Who are our actual best customers, and can we build a demand-side platform (DSP) audience that targets people who look like them?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It sounds like a five-minute question. Ask ChatGPT and you get a single &amp;quot;high value&amp;quot; SQL block, almost always a total-spend filter, usually against the wrong table variant, almost never inside the seed-size band &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; actually requires. Search the AMC console&#39;s Instructional Query library and you find the answer, except it lives in two separate playbooks you have to stitch together yourself. By the time you&#39;ve reconciled them, the campaign launch has slipped a day.&lt;/p&gt;
&lt;p&gt;So I asked our agent. It runs on &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;, a curated corpus of AMC playbooks, DSP activation guides, and event-subtype references indexed for semantic retrieval. The answer came back in the shape the IQ library actually recommends: three seed audiences, tested separately, each sized into the 1,000 to 450,000 buffer before activation.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong&lt;/h2&gt;
&lt;p&gt;I ran the same prompt through a frontier model with no retrieval first. The SQL it produced looked competent. It would have failed at audience creation in at least four distinct ways.&lt;/p&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Five failure modes I saw in a single un-grounded response&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It selected &lt;code&gt;user_id&lt;/code&gt; from &lt;code&gt;conversions_all&lt;/code&gt;. Audience-build queries that return user IDs must run against the &lt;code&gt;_for_audiences&lt;/code&gt; variant, in this case &lt;code&gt;conversions_all_for_audiences&lt;/code&gt;. The sizing wrapper does the opposite: it counts user IDs against &lt;code&gt;conversions_all&lt;/code&gt;. The Atlas chunk is explicit, &amp;quot;change &lt;code&gt;user_id&lt;/code&gt; to &lt;code&gt;count(user_id)&lt;/code&gt;, remove the suffix of &lt;code&gt;_for_audiences&lt;/code&gt; in the table name.&amp;quot;&lt;/li&gt;
&lt;li&gt;It returned one blended seed that combined SnS, multi-purchase, and a spend threshold joined with &lt;code&gt;AND&lt;/code&gt;. The result was an overly specific cohort of around 300 users. The IQ guidance is the opposite, &amp;quot;we recommend testing these audiences separately to avoid overly specific seeds.&amp;quot;&lt;/li&gt;
&lt;li&gt;It hallucinated the event filter as &lt;code&gt;event_subtype = &#39;SnS&#39;&lt;/code&gt;. The real values are &lt;code&gt;event_subtype IN (&#39;firstSnSOrder&#39;, &#39;repeatSnSOrder&#39;)&lt;/code&gt;. The &lt;code&gt;repeatSnSOrder&lt;/code&gt; value was added to Flexible Shopping Insights on 02/05/2024, so any model with a training cutoff before that date does not know it exists and will quietly miss every recurring SnS shipment.&lt;/li&gt;
&lt;li&gt;It said nothing about the 500 to 500,000 hard sizing bound. Audience refresh fails outside that range, silently for the operator until the DSP line item runs empty.&lt;/li&gt;
&lt;li&gt;It left a comment as the final line of the SQL. AMC&#39;s audience pusher rejects any query whose last line is a comment, with an error message that does not tell you which line.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;Any one of these would have cost the launch day. The combination would have looked like a working audience right up until the DSP line item failed to spend.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves&lt;/h2&gt;
&lt;p&gt;When the agent gets the question, it does a semantic search across the &lt;code&gt;amazon_ads&lt;/code&gt; collection and pulls six chunks before writing a single line of SQL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Introduction to AMC Lookalike Audiences&lt;/strong&gt; playbook, section 3.2, which enumerates the three high-value seed strategies (Subscribe and Save, Multiple Purchases, Total Purchase Value) and gives the verbatim recommendation to test them separately to avoid overly specific seeds.&lt;/li&gt;
&lt;li&gt;The same &lt;strong&gt;Introduction to AMC Lookalike Audiences&lt;/strong&gt; chunk on the companion measurement query template, the 500 to 500,000 hard bound, and the recommended 1,000 to 450,000 seed-size buffer.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Understanding Amazon&#39;s Subscribe &amp;amp; Save Repeat Purchases&lt;/strong&gt; chunk, which documents the &lt;code&gt;firstSnSOrder&lt;/code&gt; and &lt;code&gt;repeatSnSOrder&lt;/code&gt; event subtypes, the 02/05/2024 enhancement date when repeat signals were added, and the Sandbox restriction on SnS data.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Flexible Shopping Insights Trial Guide&lt;/strong&gt; chunk, which carries the working &lt;code&gt;conversions_all_for_audiences&lt;/code&gt; template for the SnS seed and the audience-vs-sizing table-name swap pattern.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Identifying High Value Customer Segments&lt;/strong&gt; chunk, which frames Total Spend seeds through percentile rank (top 71-100, top 96-100) rather than a flat dollar threshold, and endorses these segments specifically as lookalike seeds.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;AMC Lookalike Audiences for Promotional Events&lt;/strong&gt; chunk, which explains the gap lookalikes fill (the high-value new-to-brand and impulse buyers that DSP rule-based audiences miss) and warns against using lookalikes in the lead-out phase of a promotion.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Atlas does not generate the SQL. It surfaces the playbooks with the right caveats attached, and the agent adapts them.&lt;/p&gt;
&lt;h2 id=&quot;the-agents-output&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s output&lt;/h2&gt;
&lt;p&gt;The agent returned four SQL blocks: three seed audience queries and one companion sizing wrapper. The seed queries go into the AMC Audiences query editor, the sizing wrapper runs in the main query editor against the non-&lt;code&gt;_for_audiences&lt;/code&gt; table.&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;-- =========================================================================&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Companion measurement query (sizing): runs in the MAIN AMC query editor&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- against conversions_all (not _for_audiences). Use this BEFORE pushing each&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- seed to audience creation. Hard fail: &amp;lt;500 or &gt;500,000.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Recommended buffer: 1,000 to 450,000.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- =========================================================================&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; user_count
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    {&lt;span class=&quot;token keyword&quot;&gt;UPDATE&lt;/span&gt;: paste one &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; the three seed queries below here&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; but swap
     conversions_all_for_audiences &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; conversions_all &lt;span class=&quot;token operator&quot;&gt;and&lt;/span&gt;
     &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; user_id &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; user_id }
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;


&lt;span class=&quot;token comment&quot;&gt;-- =========================================================================&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- SEED 1: Subscribe &amp;amp; Save subscribers&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Run in the AMC AUDIENCES query editor (NOT the main editor) because it&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- selects individual user_id values.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- STRIP ALL COMMENT LINES before pushing to audience creation. The trailing&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- GROUP BY 1 at the very end is what makes the push succeed.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- =========================================================================&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; sns_users &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
        user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; conversion_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; sns_purchase_times
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_all_for_audiences
    &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;firstSnSOrder&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;repeatSnSOrder&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;-- Optional: scope to your ASIN(s). Remove this AND clause to capture&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;-- all SnS purchasers across the brand.&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; tracked_asin &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;{ASIN_1}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{ASIN_2}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;-- {UPDATE} or remove&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; user_id
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; user_id
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; sns_users
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; sns_purchase_times &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;


&lt;span class=&quot;token comment&quot;&gt;-- =========================================================================&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- SEED 2: Multi-Purchase (users with multiple distinct ASIN orders)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- =========================================================================&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; multi_asin_users &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
        user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; tracked_asin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; distinct_asin_count
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_all_for_audiences
    &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; tracked_asin &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;{ASIN_1}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;{ASIN_2}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;{ASIN_3}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;-- {UPDATE}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; user_id
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; user_id
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; multi_asin_users
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; distinct_asin_count &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;-- {UPDATE: raise to 3+ if seed &gt; 450k}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;


&lt;span class=&quot;token comment&quot;&gt;-- =========================================================================&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- SEED 3: Total Spend threshold&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Threshold is configurable. Atlas recommends a percentile-rank approach&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- (e.g., top 71-100 percentile) rather than a hardcoded dollar value.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- A flat dollar threshold is shown here for simplicity.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- =========================================================================&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; spend_by_user &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
        user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;purchase_amount&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_spend
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_all_for_audiences
    &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; tracked_asin &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;{ASIN_1}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;{ASIN_2}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;{ASIN_3}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;-- {UPDATE}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; user_id
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; user_id
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; spend_by_user
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; total_spend &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; {SPEND_THRESHOLD}   &lt;span class=&quot;token comment&quot;&gt;-- {UPDATE: configurable, e.g., 200}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three queries, not one. The IQ library explicitly recommends testing these audiences separately to avoid overly specific seeds, and the math agrees: combining filters with &lt;code&gt;AND&lt;/code&gt; collapses the overlap into a cohort that often falls under the 500-user hard bound. The operator runs all three through the companion sizing query first, confirms each lands in the 1,000 to 450,000 buffer, and only then optionally unions them. The agent does not start by unioning. The table name swaps between the seed and the sizing wrapper: &lt;code&gt;conversions_all_for_audiences&lt;/code&gt; is required for the seed queries because AMC&#39;s audience builder only permits &lt;code&gt;SELECT user_id&lt;/code&gt; against the &lt;code&gt;_for_audiences&lt;/code&gt; table variants, while the sizing wrapper runs in the main query editor against the regular &lt;code&gt;conversions_all&lt;/code&gt; table. The agent stages the swap inside the wrapper so the operator cannot paste the wrong table name into the wrong editor.&lt;/p&gt;
&lt;p&gt;The SnS filter includes both &lt;code&gt;firstSnSOrder&lt;/code&gt; and &lt;code&gt;repeatSnSOrder&lt;/code&gt;. Limiting to &lt;code&gt;repeatSnSOrder&lt;/code&gt; alone would exclude users on their first scheduled subscription order, which is exactly the cohort you want to lookalike against. Both values together capture the full SnS-engaged audience that became available on 02/05/2024 when Flexible Shopping Insights was enhanced to include repeat purchase signals. The Multi-Purchase and Total Spend queries are not verbatim Atlas snippets. The agent adapted the SnS template pattern, swapping the WHERE filter to &lt;code&gt;event_subtype = &#39;order&#39;&lt;/code&gt; and the aggregation to either &lt;code&gt;COUNT(DISTINCT tracked_asin)&lt;/code&gt; or &lt;code&gt;SUM(purchase_amount)&lt;/code&gt; per user.&lt;/p&gt;
&lt;p&gt;The Total Spend threshold is a placeholder. The right number is corpus-specific. Atlas points at a percentile-rank approach (top 71-100 percentile, or the tighter top 96-100 for premium-spend seeds) rather than a hardcoded dollar value. The &lt;code&gt;{SPEND_THRESHOLD}&lt;/code&gt; token in the SQL is operator-configurable, and the parenthetical &amp;quot;e.g., 200&amp;quot; is illustrative only, not a recommendation.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaced-unprompted&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaced unprompted&lt;/h2&gt;
&lt;p&gt;This is the part that separates retrieval-grounded responses from fluent guesses. Without being asked, the agent attached a short list of caveats to the artifact.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;What Atlas surfaced that the operator didn&#39;t ask for&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hard sizing bounds: 500 and 500,000.&lt;/strong&gt; Audience refresh fails if the seed size falls below 500 or above 500,000. Aim for the 1,000 to 450,000 buffer to keep refreshes alive as the cohort drifts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sandbox gap.&lt;/strong&gt; The &lt;code&gt;sns_subscription_id&lt;/code&gt; field and the repeat SnS purchase signals are not available in AMC Sandbox. You cannot dry-run the SnS seed there. Run against production, or you will see zero rows and assume the seed is broken.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version cliff on 02/05/2024.&lt;/strong&gt; Repeat SnS purchase signals were added to Flexible Shopping Insights on that date. Any model whose training data predates it will produce a SnS seed that returns zero rows. This is one of the cleanest examples of what Atlas catches that an ungrounded model cannot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment-line trap.&lt;/strong&gt; Per the IQ playbook, we recommend removing all comment lines from the query before pushing to audience creation. The trailing &lt;code&gt;GROUP BY 1&lt;/code&gt; works as a safe terminator because the audience pusher will not accept a query whose last line is a comment, but only if the comments above are also stripped.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category eligibility.&lt;/strong&gt; Only certain product categories (Beauty, Grocery, and a handful of others) are eligible for Subscribe &amp;amp; Save. If your catalog sits outside those categories, the SnS seed will undersize regardless of how broad you make the ASIN filter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not for the lead-out phase.&lt;/strong&gt; Lookalike audiences are not appropriate for the lead-out phase of a promotional campaign, where the NTB mix shifts. For lead-out, switch to AMC rule-based audiences instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;Each of these would have cost the operator at least an hour to discover by hitting the failure first.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Once each seed lands inside the 1,000 to 450,000 buffer, the operator pushes it to AMC Audiences from the Audiences query editor. AMC compiles the audience and activates it to Amazon DSP. The standard DSP activation lag is around 48 hours before the audience materializes and becomes targetable in line items, so the push has to land at least two days before the campaign launch, not on the day of.&lt;/p&gt;
&lt;p&gt;The agent also recommends setting each seed query as a recurring AMC workflow so the lookalike model rebuilds on a cadence. Weekly is typical for high-value cohorts, because the SnS seed in particular grows as repeat purchase signals accumulate week over week. Static lookalikes age out fast.&lt;/p&gt;
&lt;p&gt;For the DSP build, the agent targets each lookalike in a separate line item rather than stacking them in one. Three line items, one per seed, gives a clean read on NTB rate and return on ad spend (ROAS) by seed strategy after the first 14 days. The Total Spend lookalike usually wins on order value, the Multi-Purchase lookalike on order frequency, and the SnS lookalike on retention. Knowing which is which informs the next round of seeds.&lt;/p&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; brings AMC and DSP signals, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; can add catalog and Amazon Standard Identification Number (ASIN) context, Atlas grounds the seed rules, and &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; keep each seed test on a reviewable cadence.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters&quot; tabindex=&quot;-1&quot;&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;Three seeds, three sizes, one DSP activation: the difference between a good guess and a working audience. The seed strategies are not novel, but the constraints around them are, and most of those constraints are not in any single playbook. The agent&#39;s value is not that it wrote better SQL than a model could write from memory. The agent&#39;s value is that it pulled the right two playbooks, applied the right table swap, surfaced a six-month-old &lt;code&gt;event_subtype&lt;/code&gt; that most models still do not know about, and attached the activation timing the operator needed before they hit it.&lt;/p&gt;
&lt;p&gt;If your agents are guessing at AMC high-value seeds, they don&#39;t have to be.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Part of an ongoing series on how agents grounded in Amazon Agent Atlas approach real AMC workflows. Next: &lt;a href=&quot;https://www.kuudo.com/guides/amc-lookalike-audience-prime-day/&quot;&gt;lookalike audiences for Prime Day&lt;/a&gt;, taking these three seeds through the promotional-event activation playbook, including the lead-in versus lead-out split that determines whether a lookalike belongs in the line item at all.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Re-Engage Lapsed AMC Loyalists</title>
    <link href="https://www.kuudo.com/guides/amc-lapsed-customer-reengagement/"/>
    <id>https://www.kuudo.com/guides/amc-lapsed-customer-reengagement/</id>
    <published>2026-05-11T00:00:00Z</published>
    <updated>2026-05-11T00:00:00Z</updated>
    <summary>Build a lapsed-loyalist AMC audience with EXTEND_TIME_WINDOW, non-ad-exposed filters, and the activation-size checks DSP needs before launch.</summary>
    <content type="html">&lt;p&gt;The Slack message landed during a retention review: &lt;em&gt;&amp;quot;We have customers who bought from us three or more times last year, and we haven&#39;t heard from them in 90 days. Can we get them into a demand-side platform (DSP) campaign before they churn for good?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It sounds like a five-minute audience build. In practice the trap is in the tables, the lookback, and the size floor. &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; (AMC) Audiences uses a different set of tables than the main query editor. The lookback you actually want is a 180-day rolling window, not a calendar quarter. The audience won&#39;t activate at all if it resolves to fewer than 2,000 distinct users, and you find that out only after pushing it. So I asked our agent, which has &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; behind it. Here is what came back.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong&lt;/h2&gt;
&lt;p&gt;I ran the same prompt through a frontier model with no retrieval. The response looked workable. It wasn&#39;t.&lt;/p&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Four failure modes in a single un-grounded response&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It pulled from &lt;code&gt;conversions_all&lt;/code&gt;. The Audiences editor only accepts the &lt;code&gt;_for_audiences&lt;/code&gt; variants for &lt;code&gt;SELECT user_id&lt;/code&gt; queries. The right table for this workflow is &lt;code&gt;conversions_all_for_audiences&lt;/code&gt;, and pasting the un-suffixed name produces a &amp;quot;user_id not selectable&amp;quot; rejection in the AMC Audiences UI.&lt;/li&gt;
&lt;li&gt;It built the 180-day lookback by hardcoding &lt;code&gt;event_dt_utc &amp;gt;= CURRENT_DATE - INTERVAL &#39;180 day&#39;&lt;/code&gt;. The Atlas playbook uses &lt;code&gt;TABLE(EXTEND_TIME_WINDOW(&#39;conversions_all_for_audiences&#39;, &#39;P180D&#39;, &#39;P0D&#39;))&lt;/code&gt;, which is the only construct that reaches outside the AMC Audiences query editor&#39;s default analysis window. Without it, your &amp;quot;180-day lookback&amp;quot; is silently truncated.&lt;/li&gt;
&lt;li&gt;It dropped the &lt;code&gt;exposure_type = &#39;non-ad-exposed&#39;&lt;/code&gt; filter. The lapsed-loyalist audience is the one Atlas explicitly recommends building from organic repeat buyers, customers who came back on their own. Without the filter, the audience scoops up everyone you already retargeted, which is exactly the population you don&#39;t need to spend on.&lt;/li&gt;
&lt;li&gt;It didn&#39;t mention the 2,000-user activation floor. AMC Audiences refuses to push an audience smaller than 2,000 distinct users to Amazon DSP. The query returns no error in that case; the audience appears to compile, then quietly fails to land in DSP. You discover the floor by missing a campaign launch.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;Every one of these would have produced a query that runs without complaint and an audience that never activates. The combination would have eaten a week of debugging.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves&lt;/h2&gt;
&lt;p&gt;When the agent gets the question, it does a semantic search across the &lt;code&gt;amazon_ads&lt;/code&gt; collection and pulls a handful of chunks before writing any SQL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Flexible Shopping Insights Trial Guide&lt;/strong&gt;, section 4.2 &amp;quot;Engage lapsed customers&amp;quot;: the canonical AMC template for exactly this workflow, complete with the &lt;code&gt;EXTEND_TIME_WINDOW&lt;/code&gt; lookback, the &lt;code&gt;conv_cnt &amp;gt; 2&lt;/code&gt; filter on repeat purchases, and the &lt;code&gt;BUILT_IN_PARAMETER(&#39;TIME_WINDOW_START&#39;)&lt;/code&gt; exclusion that defines &amp;quot;haven&#39;t bought recently.&amp;quot;&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;AMC Audiences table-variant rule&lt;/strong&gt;, indexed from &amp;quot;Creating an Audience for Wishlist or Registry Additions&amp;quot;: why &lt;code&gt;conversions_all_for_audiences&lt;/code&gt; is the only table that permits &lt;code&gt;SELECT user_id&lt;/code&gt;, and the suffix pattern that distinguishes Audiences-editor tables from main-editor tables.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Engage non-ad-exposed audience&lt;/strong&gt; section of the same FSI Trial Guide: the sister query in section 4.1 that establishes the &lt;code&gt;count(user_id)&lt;/code&gt; sizing trick, run in the main editor against the un-suffixed table, before any audience is pushed.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Introduction to AMC Lookalike Audiences&lt;/strong&gt; playbook: the downstream activation path if the seed turns out to be too small to use directly, with the 500-to-500,000 lookalike seed constraint and the model-expansion behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Atlas doesn&#39;t generate the SQL. It surfaces the playbook with its constraints intact, and the agent adapts the template to the operator&#39;s hero ASINs and window.&lt;/p&gt;
&lt;h2 id=&quot;the-agents-output&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s output&lt;/h2&gt;
&lt;p&gt;Here is the audience query the agent produced. It pastes directly into the AMC Audiences query editor, uses the 180-day extended window, and filters to customers with three or more organic purchases who have gone silent inside the current analysis window:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;-- Audience Instructional Query: Re-engage lapsed three-time buyers&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Source: AMC FSI Trial Guide, section 4.2 &quot;Engage lapsed customers&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Run in: AMC Audiences query editor (not the main editor)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Table:  conversions_all_for_audiences (_for_audiences variant required)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; purchase &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;-- Count distinct organic conversions per user over the trailing 180 days,&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;-- and capture each user&#39;s most recent purchase date.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; conversion_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; conv_cnt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_date_utc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; event_max
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;EXTEND_TIME_WINDOW&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;conversions_all_for_audiences&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;P180D&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;P0D&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; exposure_type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;non-ad-exposed&#39;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; user_id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; user_id
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
multiple_purchase &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;-- Keep only the customers with three or more organic orders in the lookback.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; event_max
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; purchase
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; conv_cnt &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Final seed: three-plus buyers whose most recent order predates the analysis&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- window. With a 90-day window, that means no purchase in the last 90 days.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; user_id
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; multiple_purchase
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; user_id &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; user_id
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; multiple_purchase
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_max &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; BUILT_IN_PARAMETER&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;TIME_WINDOW_START&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three things to notice about what the agent chose to do. First, the lookback uses &lt;code&gt;EXTEND_TIME_WINDOW(&#39;conversions_all_for_audiences&#39;, &#39;P180D&#39;, &#39;P0D&#39;)&lt;/code&gt;, not a hand-rolled date filter. Inside the AMC Audiences editor, the default analysis window is shorter than the 180 days this audience needs, and &lt;code&gt;EXTEND_TIME_WINDOW&lt;/code&gt; is the only mechanism that opens it. The &lt;code&gt;P180D&lt;/code&gt; is an ISO-8601 duration; &lt;code&gt;P0D&lt;/code&gt; means the window ends at the current analysis-window boundary. The agent inherited this directly from the FSI playbook.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;exposure_type = &#39;non-ad-exposed&#39;&lt;/code&gt; filter is the entire point of the audience. The retention lead wanted organic loyalists, the customers who came back without seeing ads, because those are the ones whose silence is a churn signal rather than ad fatigue. Without the filter, the seed is contaminated with customers you&#39;ve already retargeted, and the DSP campaign you build from it overlaps with campaigns you&#39;re already running.&lt;/p&gt;
&lt;p&gt;Finally, the lapsed condition is expressed as a &lt;code&gt;NOT IN&lt;/code&gt; against the same &lt;code&gt;multiple_purchase&lt;/code&gt; CTE, gated on &lt;code&gt;BUILT_IN_PARAMETER(&#39;TIME_WINDOW_START&#39;)&lt;/code&gt;. That parameter resolves to the start of the analysis window the operator sets in the editor, so a 90-day analysis window automatically defines &amp;quot;lapsed&amp;quot; as &amp;quot;no order in the last 90 days.&amp;quot; Change the window in the editor, and the lapsed definition shifts with it. No code edits required.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaced-unprompted&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaced unprompted&lt;/h2&gt;
&lt;p&gt;This is the part that separates a retrieval-grounded response from a fluent guess. Without being asked, the agent attached a short list of things the retention lead needed to know but didn&#39;t think to ask about:&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;What Atlas surfaced that the operator didn&#39;t ask for&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Size the audience before you push it.&lt;/strong&gt; AMC Audiences refuses to activate any audience under 2,000 distinct users. Run the query in the main editor first with &lt;code&gt;user_id&lt;/code&gt; swapped for &lt;code&gt;count(user_id)&lt;/code&gt; and the &lt;code&gt;_for_audiences&lt;/code&gt; suffix removed from the table name; that returns the seed size without creating anything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loosen the conditions when the floor isn&#39;t met.&lt;/strong&gt; The FSI playbook calls out the relaxation order explicitly: change &lt;code&gt;conv_cnt &amp;gt; 2&lt;/code&gt; to &lt;code&gt;conv_cnt &amp;gt; 1&lt;/code&gt; first (two-plus buyers instead of three-plus), then extend the lookback from 180 to 270 days. Both are documented adjustments, not hacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&#39;t end the query on a comment line.&lt;/strong&gt; AMC&#39;s audience editor rejects any submission whose last non-blank line is a &lt;code&gt;--&lt;/code&gt; comment. Strip trailing annotations before pasting, or the editor will swallow the query without a useful error.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;event_subtype = &#39;order&#39;&lt;/code&gt; is required.&lt;/strong&gt; &lt;code&gt;conversions_all_for_audiences&lt;/code&gt; carries every conversion subtype Amazon tracks, not just purchases. Without the &lt;code&gt;&#39;order&#39;&lt;/code&gt; filter, detail-page views, wishlist adds, and Subscribe &amp;amp; Save subscription events count toward the &lt;code&gt;conv_cnt&lt;/code&gt; and inflate the seed with users who never actually bought.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible Shopping Insights is a paid feature.&lt;/strong&gt; The &lt;code&gt;exposure_type&lt;/code&gt; column and the non-ad-exposed signal only populate when FSI is enabled on the AMC instance. Without it, the filter returns zero rows and the audience appears empty for reasons the editor will not surface.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;Any one of these would have cost the operator a half-day to discover. The compounding effect is why this kind of audience normally takes a week to ship and not an afternoon.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Once the seed sizes above 2,000 users, the agent flips into activation mode and routes the audience through the standard AMC Audiences-to-DSP path: paste the query into the Audiences editor, push it to a named audience, wait for the activation window to close, and verify the audience appears as targetable in Amazon DSP. If the seed comes back undersized even after both relaxations, the agent recommends pivoting to AMC Lookalike Audiences, using the lapsed loyalists as a seed (even a small one) and letting the lookalike model expand it. That path uses the same workflow we walked through for &lt;a href=&quot;https://www.kuudo.com/guides/amc-cart-abandoner-audience/&quot;&gt;cart abandoners&lt;/a&gt;, but with the loyalist seed in place of the cart-abandoner seed and a 500-to-500,000 lookalike size band instead of the 2,000-user activation floor. Either way, the agent doesn&#39;t stop at SQL: it carries the audience to the activation handoff and tells you which path it took and why.&lt;/p&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; brings AMC and DSP signals, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; can add catalog context, Atlas grounds the lapsed-loyalist rules, and &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; keep the reengagement audience on a reviewed refresh cadence.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters&quot; tabindex=&quot;-1&quot;&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;The lapsed-loyalist workflow is the kind of audience build that is easy to ask for, hard to ship, and impossible to debug after the fact. The query has to use the right table variant, the right time-window construct, the right exposure filter, and the right size floor; miss any one of them and the audience either fails to compile, fails to activate, or activates against the wrong population. None of this is exotic knowledge, but it lives in four different sections of two different playbooks, and a model without retrieval has to guess at all of it.&lt;/p&gt;
&lt;p&gt;If your retention agents are guessing at AMC Audiences, they don&#39;t have to be.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Part of an ongoing series on how agents grounded in Amazon Agent Atlas approach real AMC workflows. Next: turning a too-small loyalist seed into an activated audience through &lt;a href=&quot;https://www.kuudo.com/guides/amc-cart-abandoner-audience/&quot;&gt;AMC Lookalike Audiences&lt;/a&gt;, and the rules the lookalike model uses to expand a seed without diluting it.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Build Prime Day AMC Lookalikes</title>
    <link href="https://www.kuudo.com/guides/amc-lookalike-audience-prime-day/"/>
    <id>https://www.kuudo.com/guides/amc-lookalike-audience-prime-day/</id>
    <published>2026-05-11T00:00:00Z</published>
    <updated>2026-05-11T00:00:00Z</updated>
    <summary>Build a Prime Day AMC lookalike audience with seed SQL, sizing checks, and the 500 to 500,000 user window Amazon requires before activation.</summary>
    <content type="html">&lt;p&gt;The Slack message landed six weeks before Prime Day: &lt;em&gt;&amp;quot;Can we build a lookalike audience of customers similar to our best buyers, sized correctly so it actually activates?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This sounds like one SQL query. It is really four decisions: which customers count as &amp;quot;best,&amp;quot; which &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; table variant allows &lt;code&gt;SELECT user_id&lt;/code&gt;, which Amazon Standard Identification Number (ASIN) filters belong in the seed, how large the seed can be before the lookalike model refuses it, and how to size the seed before spending two days waiting on a refresh. Get one of those wrong and the audience either fails silently or trains on the wrong population.&lt;/p&gt;
&lt;p&gt;So I asked our agent. The agent has &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; behind it: a corpus of AMC playbooks, instructional queries, and audience patterns indexed for semantic retrieval. Here&#39;s what came back.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong-in-amc-lookalike-seed-generation&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong in AMC lookalike seed generation&lt;/h2&gt;
&lt;p&gt;I ran the same prompt through a frontier model with no retrieval. The output was confident, would have compiled in the wrong query editor, and was wrong about every threshold that decides whether the audience activates.&lt;/p&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Five failure modes in the un-grounded response&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It picked one seed definition, &amp;quot;top 20% of spenders,&amp;quot; and committed to it. The actual playbook recommends three distinct seed strategies tested separately first: Subscribe &amp;amp; Save (SnS) subscribers, multi-ASIN purchasers, and a total-spend threshold.&lt;/li&gt;
&lt;li&gt;It quoted a seed size minimum of &amp;quot;a few thousand users&amp;quot; and no upper bound. The real guardrail is specific: the seed should contain between 500 and 500,000 distinct &lt;code&gt;user_id&lt;/code&gt; values.&lt;/li&gt;
&lt;li&gt;It wrote the seed query against &lt;code&gt;conversions&lt;/code&gt; and used &lt;code&gt;SELECT DISTINCT user_id&lt;/code&gt; in the outer query. AMC Audiences requires the &lt;code&gt;_for_audiences&lt;/code&gt; table family, specifically &lt;code&gt;conversions_for_audiences&lt;/code&gt;, for this seed shape.&lt;/li&gt;
&lt;li&gt;It did not size the seed before submission. The playbook has a companion measurement query that runs in the main editor against &lt;code&gt;conversions_all&lt;/code&gt; and returns the seed count before the audience refresh starts.&lt;/li&gt;
&lt;li&gt;It ended the query on a &lt;code&gt;--&lt;/code&gt; comment line. AMC Audiences can reject submissions whose last line is a comment, so the template intentionally ends on executable SQL.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;None of these failures look wrong on a casual read. They are the kind of mistakes you catch after submitting an audience, waiting for refresh, and watching the status sit there.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves-for-an-amc-prime-day-lookalike-audience&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves for an AMC Prime Day lookalike audience&lt;/h2&gt;
&lt;p&gt;When the agent gets the question, it does a semantic search across the &lt;code&gt;amazon_ads&lt;/code&gt; collection and pulls five chunks before writing a line of SQL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;AMC Lookalike Audiences for Promotional Events&lt;/strong&gt; playbook, version-tagged &lt;code&gt;2023-10-01&lt;/code&gt;: the canonical Prime Day and Black Friday workflow covering ASIN selection, seed creation, flight-time analysis, and activation.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Introduction to AMC Lookalike Audiences&lt;/strong&gt; instructional query (IQ): the mechanics behind seed scoring, the five expansion types, and the three-seed template for high-value customers.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Companion measurement query&lt;/strong&gt; chunk from the lookalike audiences IQ: the &lt;code&gt;SELECT COUNT(user_id) FROM (...)&lt;/code&gt; pattern that runs in the main AMC editor.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Creating Audiences Based on High Value Customer Segments&lt;/strong&gt; playbook: the percentile-rank variant for &amp;quot;top X% by spend&amp;quot; seeds.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Flexible Shopping Insights Trial Guide&lt;/strong&gt; Section 5: SnS-specific seed patterns, including &lt;code&gt;firstSnSOrder&lt;/code&gt; and &lt;code&gt;repeatSnSOrder&lt;/code&gt; event subtype notes for advertisers with Flexible Shopping Insights (FSI).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The agent does not invent the SQL. It surfaces the right template with the right caveats, then adapts it.&lt;/p&gt;
&lt;h2 id=&quot;seed-strategies-and-expansion-types-for-amc-lookalike-audiences&quot; tabindex=&quot;-1&quot;&gt;Seed strategies and expansion types for AMC lookalike audiences&lt;/h2&gt;
&lt;p&gt;The playbook gives the operator two taxonomies to make explicit before submission.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Taxonomy&lt;/th&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;When to use it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Seed strategy&lt;/td&gt;
&lt;td&gt;SnS subscribers&lt;/td&gt;
&lt;td&gt;Use when repeat subscription behavior is the clearest signal of loyalty.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seed strategy&lt;/td&gt;
&lt;td&gt;Multi-ASIN purchasers&lt;/td&gt;
&lt;td&gt;Use when cross-catalog buying is more important than a single-product purchase.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seed strategy&lt;/td&gt;
&lt;td&gt;Total spend threshold&lt;/td&gt;
&lt;td&gt;Use when revenue concentration matters more than purchase frequency.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expansion type&lt;/td&gt;
&lt;td&gt;Most Similar&lt;/td&gt;
&lt;td&gt;Start here when performance matters more than reach.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expansion type&lt;/td&gt;
&lt;td&gt;Similar&lt;/td&gt;
&lt;td&gt;Use when the seed is strong but the campaign needs more scale.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expansion type&lt;/td&gt;
&lt;td&gt;Balanced&lt;/td&gt;
&lt;td&gt;Practical default for Prime Day prospecting when you need both reach and relevance.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expansion type&lt;/td&gt;
&lt;td&gt;Broad&lt;/td&gt;
&lt;td&gt;Use when the seed is valid but projected audience size is too constrained.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expansion type&lt;/td&gt;
&lt;td&gt;Most Broad&lt;/td&gt;
&lt;td&gt;Use for reach-first testing, not for the first high-efficiency launch.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This block matters because it prevents the model from collapsing three separate operator decisions into one vague &amp;quot;high-value lookalike&amp;quot; audience.&lt;/p&gt;
&lt;h2 id=&quot;the-agents-working-output-amc-seed-sql-for-subscribe-and-save&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s working output: AMC seed SQL for Subscribe &amp;amp; Save&lt;/h2&gt;
&lt;p&gt;The agent produced two artifacts. First, the seed query, lifted from the three-seed template in the &lt;strong&gt;Introduction to AMC Lookalike Audiences&lt;/strong&gt; instructional query with the optional clauses set for the SnS strategy:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Audience instructional query: Introduction to lookalike audiences (High Value Customers)
   Run in the AMC Audiences query editor, not the main editor.
   Last verified: 2026-05-13.

   Three seed strategies are supported below. Test them separately first:
   [1 of 4]: ASIN filter
   [2 of 4]: SnS subscribers
   [3 of 4]: Multi-ASIN purchasers
   [4 of 4]: Total purchase value threshold

   Keep the final GROUP BY 1 as executable SQL so the query does not end
   on a comment line.
*/&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; user_sales_cte &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;snsSubscription&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;ELSE&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; sns_flag&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_units_sold&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; tracked_item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; unique_items_purchased
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_for_audiences
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;snsSubscription&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* AND tracked_asin IN (&#39;B0HERO0001&#39;,&#39;B0HERO0002&#39;) */&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; user_id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
user_aggregate &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; unique_items_purchased &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ELSE&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; multi_purchase_flag&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sns_flag&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; sns_flag&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_purchases&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;unique_items_purchased&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; unique_items_purchased
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; user_sales_cte
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
audience_grouping &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    sns_flag&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;multi_purchase_flag&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; multi_purchase_flag&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_purchases&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;unique_items_purchased&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; unique_items_purchased
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; user_aggregate
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; user_id
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; audience_grouping
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; sns_flag &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;-- AND multi_purchase_flag = 1&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;-- AND total_product_sales &gt;= 250&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;event_subtype IN (&#39;snsSubscription&#39;, &#39;order&#39;)&lt;/code&gt; filter keeps the inner CTE focused on purchase behavior. That prevents cart additions, wishlist saves, or other engagement events from diluting the seed. Filtering there is cheaper and cleaner than trying to fix the population at the final &lt;code&gt;WHERE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;audience_grouping&lt;/code&gt; CTE looks redundant, and the agent kept it anyway. The playbook leaves that pass in place because the model trainer expects a clean row-grain. Stripping it can still work, but the failure mode is opaque enough that the safer version is worth the extra CTE.&lt;/p&gt;
&lt;p&gt;The optional clauses stay visible because the operator should run SnS, multi-ASIN, and spend-threshold seeds separately before combining anything. Pre-baking that comparison into the template matches the way operators actually test seeds.&lt;/p&gt;
&lt;h2 id=&quot;how-to-size-an-amc-seed-audience-before-submission&quot; tabindex=&quot;-1&quot;&gt;How to size an AMC seed audience before submission&lt;/h2&gt;
&lt;p&gt;Before submitting any seed to AMC Audiences, the agent produced the sizing companion. This is the part the un-grounded model skipped.&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Companion measurement query.
   Run in the main AMC query editor, not the Audiences editor.
   Last verified: 2026-05-13.

   Change conversions_for_audiences to conversions_all for sizing.
   Keep SELECT user_id inside the subquery; COUNT() wraps it outside.
*/&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; user_count
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; user_sales_cte &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
      user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;snsSubscription&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;ELSE&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; sns_flag&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_units_sold&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; tracked_item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; unique_items_purchased
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_all
    &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;snsSubscription&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; user_id &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  user_aggregate &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
      user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sns_flag&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; sns_flag
    &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; user_sales_cte
    &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; user_id
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; user_aggregate
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; sns_flag &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The query returns one number: the distinct &lt;code&gt;user_id&lt;/code&gt; count of the seed. If it is under 500, the audience refresh can fail. If it is over 500,000, the refresh can also fail. The practical habit is to stay comfortably inside the band so a seasonal data swing does not push the audience across either edge.&lt;/p&gt;
&lt;p&gt;The diagnostic table above is the operator checkpoint. The fourth row, &lt;code&gt;Total spend &amp;gt;= $500&lt;/code&gt; returning 470 users, is the negative result that saves the most time. Without the sizing companion, the operator would discover that failure only after submitting the audience.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaces-for-amc-audiences&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaces for AMC Audiences&lt;/h2&gt;
&lt;p&gt;This is the part that separates an Atlas-grounded agent from a fluent one. The agent did not wait to be asked. It surfaced the caveats the operator was about to need:&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Things Atlas surfaced that the operator did not ask for&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Seed size has hard boundaries.&lt;/strong&gt; The seed should contain 500 to 500,000 &lt;code&gt;user_id&lt;/code&gt; values. Always run the sizing query first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test the three seed strategies separately.&lt;/strong&gt; Combining SnS, multi-ASIN, and spend thresholds too early can create a seed that is technically valid but strategically empty.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expansion type is a decision, not a default.&lt;/strong&gt; Balanced is a practical starting point, but Most Similar, Similar, Broad, and Most Broad change the reach-performance tradeoff.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lookalikes address the non-ad-exposed gap.&lt;/strong&gt; Rule-based audiences are useful for remarketing; Prime Day prospecting usually needs users who share seed traits but were not already in the ad-exposed pool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The query should not end on a comment line.&lt;/strong&gt; Keep an executable final line such as &lt;code&gt;GROUP BY 1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The promotional-event variant uses a fixed window.&lt;/strong&gt; For Prime Day, the API payload should use the prior promotional window rather than a rolling relative window.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;Any one of these can eat an afternoon after submission. Getting all six before the first API call is the difference between a day-one launch and a day-three debugging thread.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next-submit-the-amc-audiences-api-payload&quot; tabindex=&quot;-1&quot;&gt;What happens next: submit the AMC Audiences API payload&lt;/h2&gt;
&lt;p&gt;The seed query, sizing query, and diagnostic table close the loop on creation but not activation. The next move is to flatten the chosen seed SQL into an AMC Audiences API payload, submit it with &lt;code&gt;audienceName&lt;/code&gt;, &lt;code&gt;advertiserId&lt;/code&gt;, &lt;code&gt;timeWindowStart&lt;/code&gt;, &lt;code&gt;timeWindowEnd&lt;/code&gt;, &lt;code&gt;refreshRateDays&lt;/code&gt;, &lt;code&gt;timeWindowRelative&lt;/code&gt;, and &lt;code&gt;lookalikeAudienceExpectedReach&lt;/code&gt;, then wait for the audience to become available for Amazon demand-side platform (DSP) activation.&lt;/p&gt;
&lt;p&gt;For Prime Day, &lt;code&gt;timeWindowRelative&lt;/code&gt; should be &lt;code&gt;false&lt;/code&gt; because the seed is tied to a fixed promotional window. &lt;code&gt;refreshRateDays: 7&lt;/code&gt; keeps the audience fresh without turning the seed into a rolling interpretation of last year&#39;s event. &lt;code&gt;lookalikeAudienceExpectedReach: &amp;quot;BALANCED&amp;quot;&lt;/code&gt; is a defensible first pass because it gives the team enough scale to test without starting at the loosest expansion setting.&lt;/p&gt;
&lt;p&gt;The evaluation pass comes after activation. Compare the lookalike audience against last year&#39;s rule-based audience baseline, then decide whether to keep the SnS seed, rotate to multi-ASIN purchasers, or loosen the spend threshold.&lt;/p&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; brings AMC and DSP signals, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; can add catalog and ASIN context, Atlas grounds the sizing and payload rules, and &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; keep the audience refresh reviewable.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters-for-prime-day-audience-activation&quot; tabindex=&quot;-1&quot;&gt;Why this matters for Prime Day audience activation&lt;/h2&gt;
&lt;p&gt;A lookalike audience that fails silently is worse than no audience. The operator has staged creative and media against an audience assumption, and the refresh can still be pending when the event opens. The rules that decide success are knowable, but they are scattered across a playbook, an instructional query, an API reference, and paid-feature notes.&lt;/p&gt;
&lt;p&gt;Atlas is not a model upgrade. It is the corpus made available at the moment of need. The agent did not have to remember the 500-to-500,000 band, the &lt;code&gt;_for_audiences&lt;/code&gt; suffix rule, the fixed-window payload, or the comment-line restriction. It looked them up.&lt;/p&gt;
&lt;p&gt;If your agents are guessing at AMC seed sizes, they do not have to be.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next: use the &lt;a href=&quot;https://www.kuudo.com/guides/amc-lookalike-audience-evaluation/&quot;&gt;lookalike evaluation workflow&lt;/a&gt; to test whether the shipped audience outperformed the rule-based audience from the previous Prime Day.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Build an AMC Cart-Abandoner Audience</title>
    <link href="https://www.kuudo.com/guides/amc-cart-abandoner-audience/"/>
    <id>https://www.kuudo.com/guides/amc-cart-abandoner-audience/</id>
    <published>2026-05-10T00:00:00Z</published>
    <updated>2026-05-10T00:00:00Z</updated>
    <summary>Build a cart-abandoner audience in AMC with the right table variant, a seed-size check, and the DSP activation timing that avoids a stale segment.</summary>
    <content type="html">&lt;p&gt;The Slack message came in on a Tuesday: &lt;em&gt;&amp;quot;Can you build me a demand-side platform (DSP) audience of people who added one of our hero Amazon Standard Identification Numbers (ASINs) to cart in the last 30 days but never bought? I want to retarget them before the next promotion.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is the kind of ask that should take ten minutes. In practice, it eats an afternoon - not because the SQL is hard, but because &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; has a dozen quiet rules that aren&#39;t in any one place. The query has to hit the right table. The user-level fields have to come from the variant table that AMC Audiences will actually accept. The seed has to land between 500 and 500,000 users or the audience refresh fails silently. Attribution windows have to close before the numbers stop lying to you.&lt;/p&gt;
&lt;p&gt;So I asked our agent instead. The agent has &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; behind it - a curated corpus of AMC playbooks, instructional queries, audience patterns, and decision rules indexed for semantic retrieval. Here&#39;s what came back.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong&lt;/h2&gt;
&lt;p&gt;I tested this same prompt against a frontier model with no retrieval. The response looked confident. It wasn&#39;t.&lt;/p&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Four failure modes in a single un-grounded response&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It pulled from &lt;code&gt;conversions&lt;/code&gt; instead of &lt;code&gt;conversions_for_audiences&lt;/code&gt;. AMC Audiences requires the &lt;code&gt;_for_audiences&lt;/code&gt; table variants - they&#39;re the only ones that permit &lt;code&gt;SELECT user_id&lt;/code&gt;. Pasting the wrong one into the Audiences query editor produces a &amp;quot;user_id not selectable&amp;quot; error that doesn&#39;t tell you which table to switch to.&lt;/li&gt;
&lt;li&gt;It used &lt;code&gt;event_type = &#39;add_to_cart&#39;&lt;/code&gt;. The real value is &lt;code&gt;event_subtype = &#39;shoppingCart&#39;&lt;/code&gt;. Close enough to look right; wrong enough to return zero rows.&lt;/li&gt;
&lt;li&gt;It didn&#39;t mention the seed-size constraint. An audience that resolves to 380 users will &lt;em&gt;appear&lt;/em&gt; to compile and then quietly fail to activate.&lt;/li&gt;
&lt;li&gt;It didn&#39;t mention the 48-hour activation lag in Amazon DSP. The operator was planning to launch retargeting &amp;quot;tomorrow.&amp;quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;None of this is exotic knowledge. It&#39;s all in Amazon&#39;s public docs. But it&#39;s scattered across a dozen pages, half of which surface in search rankings only when you already know what to type.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves&lt;/h2&gt;
&lt;p&gt;When the agent gets the question, it does a semantic search across the &lt;code&gt;amazon_ads&lt;/code&gt; collection and pulls four chunks before it writes a single line of SQL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Audience that added to cart but did not purchase&lt;/strong&gt; instructional query - the canonical AMC template for this exact use case&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;AMC Audiences table-variant rule&lt;/strong&gt; - why &lt;code&gt;conversions_for_audiences&lt;/code&gt; is the only table that allows &lt;code&gt;SELECT user_id&lt;/code&gt;, and the corresponding &lt;code&gt;_for_audiences&lt;/code&gt; suffix pattern across other AMC datasets&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;AMC Audiences activation guide&lt;/strong&gt; - the 500 to 500,000 seed-size constraint and the ~48-hour DSP activation window&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Introduction to AMC Audiences companion measurement query&lt;/strong&gt; - the trick of changing &lt;code&gt;user_id&lt;/code&gt; to &lt;code&gt;COUNT(user_id)&lt;/code&gt; and dropping the &lt;code&gt;_for_audiences&lt;/code&gt; suffix to size your audience &lt;em&gt;before&lt;/em&gt; you try to create it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Atlas doesn&#39;t generate the SQL. It surfaces the playbook, and the agent adapts it.&lt;/p&gt;
&lt;h2 id=&quot;the-agents-output&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s output&lt;/h2&gt;
&lt;p&gt;Here&#39;s the query the agent produced. It compiled on the first try and resolved to a seed of just over 12,000 users - comfortably inside the activation window:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* AMC Audiences IQ: Added to cart but did not purchase
   Adapted for hero-ASIN retargeting, 30-day window.
   Run in the AMC Audiences query editor (not the main editor) - _for_audiences
   table variants are required for SELECT user_id. */&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; asins &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;asin&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;-- hero ASIN #1&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;-- hero ASIN #2&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX3&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;-- hero ASIN #3&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
purchase &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_dt_utc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; purchase_dt_max
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_for_audiences
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; tracked_item &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; asin &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; asins&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
atc &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
    user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_dt_utc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; atc_dt_max
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_for_audiences
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;shoppingCart&#39;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; tracked_item &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; asin &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; asins&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; atc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; atc
&lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; purchase
  &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; atc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; purchase&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; atc_dt_max &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; purchase_dt_max
   &lt;span class=&quot;token operator&quot;&gt;OR&lt;/span&gt; purchase_dt_max &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three things to notice about what the agent chose to do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;ASIN filter is in the CTEs, not the final &lt;code&gt;SELECT&lt;/code&gt;&lt;/strong&gt;. Filtering at the CTE level is the difference between a query that scans a focused slice of the conversions table and one that scans everything and discards 99% of it. AMC&#39;s compute budget isn&#39;t infinite, and the Atlas playbook flagged this explicitly.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;&lt;code&gt;OR purchase_dt_max IS NULL&lt;/code&gt;&lt;/strong&gt; clause matters. Without it, the audience would only include people who &lt;em&gt;previously&lt;/em&gt; bought and then abandoned again, missing every first-time prospect who added to cart and walked. The agent inherited this from the AMC IQ template, which spells out the join semantics.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;outer query is a plain &lt;code&gt;SELECT user_id&lt;/code&gt;&lt;/strong&gt;, not &lt;code&gt;SELECT DISTINCT&lt;/code&gt;. AMC Audiences expects user IDs and de-duplicates internally. Adding &lt;code&gt;DISTINCT&lt;/code&gt; doesn&#39;t help performance and occasionally trips the audience compiler.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-companion-sizing-query-run-this-first&quot; tabindex=&quot;-1&quot;&gt;The companion sizing query - run this first&lt;/h2&gt;
&lt;p&gt;Before the agent suggested pushing the audience to DSP, it produced a sizing check. This is the part most ad-hoc workflows skip, and it&#39;s why most &amp;quot;build me an audience&amp;quot; requests fail their first activation:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Audience sizing check - run this in the MAIN AMC query editor (not Audiences).
   Note the table name change: conversions_all, not conversions_for_audiences. */&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; atc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; audience_size
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_dt_utc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; atc_dt_max
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_all
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;shoppingCart&#39;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; tracked_item &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX3&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; atc
&lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;MAX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event_dt_utc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; purchase_dt_max
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_all
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; tracked_item &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX3&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; purchase
  &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; atc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; purchase&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user_id
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; atc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;atc_dt_max &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; purchase&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;purchase_dt_max
   &lt;span class=&quot;token operator&quot;&gt;OR&lt;/span&gt; purchase&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;purchase_dt_max &lt;span class=&quot;token operator&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If this returns less than 500, the audience won&#39;t activate. If it returns more than 500,000, the audience won&#39;t refresh. The agent knows both thresholds and tells you to widen or tighten the ASIN list accordingly.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaced-unprompted&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaced unprompted&lt;/h2&gt;
&lt;p&gt;This is the part that separates a retrieval-grounded agent from a fluent one. Without being asked, the agent included a short list of things the operator needed to know but didn&#39;t think to ask about:&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Things Atlas surfaced that the operator didn&#39;t ask for&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Seed size: 500 to 500,000.&lt;/strong&gt; Outside that range, the audience either refuses to activate or refuses to refresh. Always run the sizing query first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DSP activation lag: ~48 hours.&lt;/strong&gt; Build the audience two days before the campaign launch, not the day of.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sandbox limitations.&lt;/strong&gt; AMC Sandbox doesn&#39;t populate certain event types reliably - including some Subscribe &amp;amp; Save signals. For audience work, run against production.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment-line restriction.&lt;/strong&gt; AMC Audiences queries cannot end on a comment line. Strip trailing &lt;code&gt;--&lt;/code&gt; annotations before pushing to audience creation, or the editor will reject the query.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upstream variants.&lt;/strong&gt; Swap &lt;code&gt;event_subtype = &#39;shoppingCart&#39;&lt;/code&gt; for &lt;code&gt;&#39;detailPageView&#39;&lt;/code&gt; to reach further up the funnel, or for &lt;code&gt;&#39;wishlist&#39;&lt;/code&gt; to capture lower-intent interest. The agent will adjust the seed-size expectations accordingly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;Any one of these would have cost the operator an hour to discover. The compounding effect is why the workflow took ten minutes instead of an afternoon.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;The agent doesn&#39;t stop at SQL. Once the audience compiles and the sizing check passes, Atlas&#39;s activation playbook covers the next two hops: pushing the audience definition to AMC Audiences from the Audiences query editor, waiting for the activation window to close, and verifying the audience appears as targetable in Amazon DSP. The agent also flags that the audience is &lt;em&gt;static at creation time&lt;/em&gt; - it doesn&#39;t auto-refresh as new users add to cart. For a retargeting program you&#39;d want to run continuously, the agent recommends scheduling the audience as a recurring AMC workflow with a 7-day refresh cadence, and points to the corresponding Atlas playbook chunk on workflow scheduling.&lt;/p&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; brings AMC and DSP context, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; can add catalog and ASIN context, Atlas grounds the audience rules, and &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; keep the refresh cadence reviewable.&lt;/p&gt;
&lt;p&gt;That&#39;s the loop closed: ask, retrieve, build, size, activate, monitor.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters&quot; tabindex=&quot;-1&quot;&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;A foundation model can write SQL. So can a junior analyst with a textbook. What neither can reliably do is produce a query that compiles against the specific table variants AMC exposes, respects the seed-size constraints DSP enforces, and bakes in the timing assumptions Amazon&#39;s attribution model requires - all without being told to.&lt;/p&gt;
&lt;p&gt;Atlas isn&#39;t a magic upgrade to model capability. It&#39;s a corpus of &lt;em&gt;Amazon&#39;s own playbook content&lt;/em&gt;, indexed and addressable by an agent at the moment of need. The agent doesn&#39;t have to remember any of this. It has to know where to look. That&#39;s a lower bar - and a much more reliable one.&lt;/p&gt;
&lt;p&gt;If your agents are guessing at AMC, they don&#39;t have to be.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;This is the first in a series on how agents grounded in Amazon Agent Atlas approach real Amazon Marketing Cloud workflows. Next: &lt;a href=&quot;https://www.kuudo.com/guides/amc-subscribe-and-save-lift/&quot;&gt;building a Subscribe &amp;amp; Save lift analysis&lt;/a&gt; that quantifies the spend gap between subscribers and one-off buyers, including the February 2024 &lt;code&gt;repeatSnSOrder&lt;/code&gt; signal that most ungrounded models still don&#39;t know exists.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Measure Subscribe &amp; Save Lift in AMC</title>
    <link href="https://www.kuudo.com/guides/amc-subscribe-and-save-lift/"/>
    <id>https://www.kuudo.com/guides/amc-subscribe-and-save-lift/</id>
    <published>2026-05-10T00:00:00Z</published>
    <updated>2026-05-10T00:00:00Z</updated>
    <summary>Measure Subscribe &amp; Save lift in AMC with the repeatSnSOrder signal, the conversions_all table, and a 90-day minimum window for a stable read.</summary>
    <content type="html">&lt;p&gt;The question came up in a quarterly review: &lt;em&gt;&amp;quot;Is Subscribe &amp;amp; Save actually doing anything for us, or are we just discounting the same customers who would have bought anyway?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It&#39;s the kind of question that sounds answerable in five minutes and isn&#39;t. Amazon&#39;s Subscribe &amp;amp; Save program - auto-replenishment with a small discount - generates a stream of conversion events that look like ordinary purchases in most reports. The standard Sponsored Ads reporting doesn&#39;t separate them. Brand Analytics doesn&#39;t separate them. The Business Reports in Seller Central treat an SnS unit the same as a one-off unit. To actually measure SnS lift - the spend gap between subscribers and one-off buyers - you have to query &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt;, against the right tables, with the right event subtypes, over the right window.&lt;/p&gt;
&lt;p&gt;So I asked our agent. The agent has &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; behind it, and Atlas has the AMC Flexible Shopping Insights playbook indexed in full. Here&#39;s what came back.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong&lt;/h2&gt;
&lt;p&gt;I ran the same prompt through a frontier model with no retrieval. The output was confident and wrong in a way that would have looked right until the numbers didn&#39;t make sense.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Four things the un-grounded model missed&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It didn&#39;t know &lt;code&gt;repeatSnSOrder&lt;/code&gt; exists. Amazon added this &lt;code&gt;event_subtype&lt;/code&gt; to Flexible Shopping Insights on &lt;strong&gt;February 5, 2024&lt;/strong&gt;. Without it, you only count the initial subscription event and the first SnS purchase - missing every recurring shipment, which is where the actual lift lives. Most models&#39; training data predates this change, so they confidently produce queries that undercount SnS revenue by 60–80%.&lt;/li&gt;
&lt;li&gt;It used &lt;code&gt;conversions&lt;/code&gt; instead of &lt;code&gt;conversions_all&lt;/code&gt;. AMC has multiple conversion tables and they don&#39;t carry the same fields. &lt;code&gt;conversions_all&lt;/code&gt; is the table Flexible Shopping Insights writes the SnS signals to.&lt;/li&gt;
&lt;li&gt;It didn&#39;t mention that Flexible Shopping Insights is a &lt;strong&gt;paid AMC feature&lt;/strong&gt; with regional availability. Running the query without an active FSI subscription returns empty results with no error - the table exists but contains no SnS rows for your account.&lt;/li&gt;
&lt;li&gt;It quoted a 30-day analysis window. The playbook recommends a &lt;strong&gt;minimum of 3 months&lt;/strong&gt; to capture SnS cadence, because subscription cycles run on 1, 2, 3, or 6-month schedules and a 30-day query misses the majority of repeat orders entirely.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;Any one of these would silently corrupt the lift number. The combination would tank a quarterly business case.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves&lt;/h2&gt;
&lt;p&gt;When the agent gets the question, it does a semantic search across the &lt;code&gt;amazon_ads&lt;/code&gt; collection and pulls four chunks before writing any SQL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Subscribe and Save repeat purchases&lt;/strong&gt; instructional query - the canonical AMC template, version-tagged &lt;code&gt;2024-02-05&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Flexible Shopping Insights trial guide&lt;/strong&gt; - the surrounding context on which AMC tables FSI writes to and which event subtypes are exposed&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;FSI access requirements note&lt;/strong&gt; - that FSI is a paid feature with regional restrictions, and Sandbox doesn&#39;t populate the repeat-SnS signals reliably&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;AMC query window guidance&lt;/strong&gt; - the 3-month minimum recommendation, the ASIN filter performance tip, and the join-grain rules for analyses that span event-level and weekly aggregations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Atlas doesn&#39;t write the SQL. It surfaces the right playbook with the right caveats, and the agent adapts.&lt;/p&gt;
&lt;h2 id=&quot;the-agents-output&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s output&lt;/h2&gt;
&lt;p&gt;Here&#39;s the lift comparison query the agent produced. It runs against the main AMC query editor (not the Audiences editor - we&#39;re measuring, not building an audience), uses the three event subtypes that together capture the full SnS lifecycle, and treats every other purchaser as the comparison group:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;-- Subscribe &amp;amp; Save lift: average spend by user type&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Source: AMC IQ &quot;Subscribe and save repeat purchases&quot; (v 2024-02-05)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Run window: last full 90 days (set Date range in Query Editor)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Table: conversions_all (main editor, not _for_audiences)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;CASE&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;WHEN&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&#39;snsSubscription&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;-- initial subscription event&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&#39;firstSnSOrder&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;-- first scheduled order after subscribing&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&#39;repeatSnSOrder&#39;&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;-- recurring orders (added 2024-02-05)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;subscriber&#39;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;ELSE&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;non-subscriber&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; user_type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                              &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; users_that_purchased&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                             &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_sales&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total_product_sales&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;DISTINCT&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;   &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; average_spend_per_user
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_all
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; tracked_item &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX3&#39;&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;-- restrict to ASINs in SnS program for perf&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three things to notice about what the agent chose to do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;three event subtypes are an &lt;code&gt;IN&lt;/code&gt; list, not a chain of &lt;code&gt;OR&lt;/code&gt;s&lt;/strong&gt;. The IQ template uses this exact pattern because it&#39;s the most readable way to express &amp;quot;any of these three states means the user is in the subscriber bucket.&amp;quot; If you swap in &lt;code&gt;event_subtype = &#39;snsSubscription&#39; OR event_subtype = &#39;firstSnSOrder&#39;&lt;/code&gt;, you&#39;ll get the same result and a query that&#39;s harder to maintain, and a future you will forget which subtypes you included.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;ASIN filter goes in the &lt;code&gt;WHERE&lt;/code&gt; clause of the main query&lt;/strong&gt;, not in a CTE. SnS lift analyses are usually run against the subset of your catalog that&#39;s actually enrolled in the SnS program; there&#39;s no reason to scan the rest of conversions_all and discard 90% of it. The Atlas playbook explicitly flags this as a performance pattern.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;comparison bucket is &amp;quot;every other purchaser,&amp;quot;&lt;/strong&gt; not &amp;quot;purchasers who explicitly opted out of SnS.&amp;quot; Amazon doesn&#39;t expose an opt-out signal; the inverse of an SnS subscriber is just any user whose purchase event doesn&#39;t carry one of the three SnS event subtypes. The agent inherited this from the IQ template and didn&#39;t try to over-engineer it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-companion-asin-level-query&quot; tabindex=&quot;-1&quot;&gt;The companion ASIN-level query&lt;/h2&gt;
&lt;p&gt;The lift number is the headline, but the question that follows it is always &lt;em&gt;&amp;quot;which Amazon Standard Identification Numbers (ASINs) are pulling their weight in SnS?&amp;quot;&lt;/em&gt; - and the playbook has a companion query for exactly that:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;-- SnS purchases by ASIN: volume + percentage of total purchases&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;-- Run alongside the lift query, same window, same ASIN scope&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;WITH&lt;/span&gt; sns &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; tracked_item &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; asin&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; sns_purchases
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_all
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;firstSnSOrder&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;repeatSnSOrder&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; tracked_item &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX3&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
total &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; tracked_item &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; asin&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; total_purchases
  &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; conversions_all
  &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; tracked_item &lt;span class=&quot;token operator&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;B0XXXXXXX3&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  total&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;asin&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  sns&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sns_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  total&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;ROUND&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100.0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; sns&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sns_purchases &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;NULLIF&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;total&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_purchases&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AS&lt;/span&gt; sns_share_pct
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; total
&lt;span class=&quot;token keyword&quot;&gt;LEFT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; sns &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; sns&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;asin &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; total&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;asin
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; sns_share_pct &lt;span class=&quot;token keyword&quot;&gt;DESC&lt;/span&gt; NULLS &lt;span class=&quot;token keyword&quot;&gt;LAST&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;NULLIF&lt;/code&gt; is the agent being defensive - a recently launched ASIN with zero recorded &lt;code&gt;order&lt;/code&gt; events would otherwise divide by zero. Small thing. Saves a re-run.&lt;/p&gt;
&lt;h2 id=&quot;how-to-read-the-numbers&quot; tabindex=&quot;-1&quot;&gt;How to read the numbers&lt;/h2&gt;
&lt;p&gt;The lift query returns two rows. Subscriber &lt;code&gt;average_spend_per_user&lt;/code&gt; divided by non-subscriber &lt;code&gt;average_spend_per_user&lt;/code&gt; is the headline lift ratio. A ratio of 2.4x means subscribers spend 2.4 times more than one-off buyers on the same ASIN set over the same window. The ASIN-level query then shows where that lift is concentrated - typically a handful of consumables (coffee, supplements, pet food, household goods) drive the majority of subscriber revenue, and the long tail of one-time products contributes almost nothing to the SnS program.&lt;/p&gt;
&lt;p&gt;The decision the marketing director was actually trying to make - &lt;em&gt;do we push more aggressively into SnS?&lt;/em&gt; - turns on whether the high-lift ASINs already have full SnS enrollment, or whether there&#39;s headroom. If your top-5 lift ASINs are already at 60%+ &lt;code&gt;sns_share_pct&lt;/code&gt;, the upside is in expanding the catalog. If they&#39;re at 15%, the upside is in conversion campaigns targeting existing buyers of those ASINs.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaced-unprompted&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaced unprompted&lt;/h2&gt;
&lt;p&gt;This is the part that separates retrieval-grounded responses from fluent guesses. Without being asked, the agent included a short list of things the operator needed to know but didn&#39;t think to ask about:&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;What Atlas surfaced that the operator didn&#39;t ask for&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flexible Shopping Insights subscription required.&lt;/strong&gt; If FSI isn&#39;t enabled on your AMC instance, the query will return empty results with no error message. Check the Paid Features tab in AMC, or talk to your AdTech account executive. Regional availability varies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sandbox doesn&#39;t carry repeat-SnS signals.&lt;/strong&gt; &lt;code&gt;sns_subscription_id&lt;/code&gt; and &lt;code&gt;repeatSnSOrder&lt;/code&gt; rows are not populated in AMC Sandbox. Run this against production, or you&#39;ll see a lift ratio of 1.0x and assume SnS is doing nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Three-month minimum window.&lt;/strong&gt; SnS cycles run on 1, 2, 3, or 6-month schedules. Anything shorter than 90 days will under-represent recurring orders. Six months is better if you have the data depth.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Household-level inflation.&lt;/strong&gt; AMC translates household purchases to user-level purchases by crediting the household event to each linked user. For total-sales analyses (like this one), be aware that subscriber totals may be slightly inflated when a single subscription serves a multi-person household. Adjust at the user level if precision matters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&#39;t end the query on a comment line.&lt;/strong&gt; AMC&#39;s query editor will reject any submission whose last line is a &lt;code&gt;--&lt;/code&gt; comment. Strip trailing annotations before running.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;The household-inflation footnote is the kind of thing that takes most operators a year of using AMC to discover. Atlas had it indexed from the start.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;The lift number is the input to a series of decisions, not the output of the analysis. The agent&#39;s next step - and the next guide in this series - is to take the high-lift ASINs identified here and build an AMC audience of non-subscribed buyers of those ASINs, then activate it as a Subscribe &amp;amp; Save promotion campaign in Amazon demand-side platform (DSP). That workflow uses the same &lt;code&gt;conversions_all_for_audiences&lt;/code&gt; table variant pattern we covered in the &lt;a href=&quot;https://www.kuudo.com/guides/amc-cart-abandoner-audience/&quot;&gt;cart-abandoner audience guide&lt;/a&gt;, with a different filter and a different activation playbook.&lt;/p&gt;
&lt;p&gt;The point is that no single query closes the loop. The agent runs the lift analysis, surfaces the high-lift ASINs, builds the audience, and pushes it to DSP - each step grounded in a different playbook, each playbook indexed and retrievable at the moment of need.&lt;/p&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; brings the AMC and DSP signals, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; can add catalog and inventory context, Atlas grounds the signal list, and &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; keep the analysis and follow-up audience refresh on schedule.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters&quot; tabindex=&quot;-1&quot;&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;The Subscribe &amp;amp; Save lift question is a perfect case for retrieval-grounded agents because the answer literally did not exist in most models&#39; training data. Amazon added the &lt;code&gt;repeatSnSOrder&lt;/code&gt; signal in February 2024. Models with knowledge cutoffs before that - which is most of them, even now, for the depth of detail required - will produce queries that compile, run, return data, and quietly undercount SnS revenue by the majority of its actual contribution. The operator gets a number. The number is wrong. There&#39;s no error to debug.&lt;/p&gt;
&lt;p&gt;An agent grounded in Atlas doesn&#39;t have this problem. It doesn&#39;t know SnS analysis from training data - it reads Amazon&#39;s own current IQ template and adapts it. When Amazon updates the playbook again (and they will), the corpus updates, and the agent gets the new answer without anyone retraining a model.&lt;/p&gt;
&lt;p&gt;If your agents are giving you confident SnS numbers that don&#39;t include &lt;code&gt;repeatSnSOrder&lt;/code&gt;, they&#39;re giving you the wrong numbers.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Part of an ongoing series on how agents grounded in Amazon Agent Atlas approach real AMC workflows. Next: turning a high-lift ASIN list into a DSP-activated audience of non-subscribed buyers - the activation half of the workflow this post leaves open.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Turn AMC Workflows into Agent Skills</title>
    <link href="https://www.kuudo.com/guides/amc-agent-workflows/"/>
    <id>https://www.kuudo.com/guides/amc-agent-workflows/</id>
    <published>2026-05-09T00:00:00Z</published>
    <updated>2026-05-09T00:00:00Z</updated>
    <summary>Package repeatable AMC analysis into agent Skills with Atlas retrieval, sufficiency checks, human approval, and run logging already built in.</summary>
    <content type="html">&lt;p&gt;The operator question was practical: &lt;em&gt;&amp;quot;We keep asking for the same AMC analyses. Can the agent remember the workflow instead of improvising every time?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Yes, but the reusable unit should be a Skill, not a prompt snippet. A prompt remembers wording. A Skill remembers the steps: retrieve the right &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; (AMC) playbook, choose the table, run the privacy or size check, produce the artifact, route the decision, and log what happened.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong&lt;/h2&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Four ways an un-grounded workflow turns brittle&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It stores a generic &amp;quot;run AMC analysis&amp;quot; prompt with no table-selection rule.&lt;/li&gt;
&lt;li&gt;It forgets that measurement and audience activation can require different table variants.&lt;/li&gt;
&lt;li&gt;It treats every output as read-only, even when the next step changes a DSP audience or budget.&lt;/li&gt;
&lt;li&gt;It has no run log, so the team cannot reproduce which parameters or rules produced the result.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;That is how a helpful demo becomes an unreviewable production process.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves&lt;/h2&gt;
&lt;p&gt;The agent starts by pulling the relevant Amazon Marketing Cloud playbooks from &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt;. For an audience workflow, it retrieves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The audience-source rule that decides whether the Skill can use an audience-safe table.&lt;/li&gt;
&lt;li&gt;The sizing pattern that tells the operator whether the seed can activate.&lt;/li&gt;
&lt;li&gt;The activation timing and companion measurement guidance that belong beside the output.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;AMC synthetic data&lt;/strong&gt; playbook context when the Skill needs a safe test surface before it touches production workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a measurement workflow, it retrieves the attribution table, lookback rule, and caveats that belong in the output.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; gives the Skill live access to the Ads and AMC surfaces. Atlas tells it what the current playbook says before it acts.&lt;/p&gt;
&lt;h2 id=&quot;the-agents-working-output&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s working output&lt;/h2&gt;
&lt;p&gt;The useful output is a workflow contract:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;skill&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amc_audience_workflow&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;mode&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;read_then_approve&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;steps&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;retrieve_atlas_playbook&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;resolve_table_window_filters&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;run_privacy_and_seed_checks&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;produce_sql_or_payload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;request_approval_for_writes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;write_run_log&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;writeBoundary&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;approval_required_before_dsp_activation&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That contract is deliberately more boring than an open-ended chat. Boring is what makes it repeatable.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaces&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaces&lt;/h2&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;The Skill should preserve these details every time it runs&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which Atlas chunks grounded the workflow.&lt;/li&gt;
&lt;li&gt;Which MCP tools were called and with which parameters.&lt;/li&gt;
&lt;li&gt;Whether the output was read-only or write-capable.&lt;/li&gt;
&lt;li&gt;Which approval policy applied.&lt;/li&gt;
&lt;li&gt;Which user approved or rejected the action.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;Those details are the difference between &amp;quot;the agent said so&amp;quot; and &amp;quot;we can audit the workflow.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: Amazon Ads MCP brings AMC and demand-side platform (DSP) campaign signals, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; can add catalog context, Atlas grounds the operating procedure, and &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; turn the workflow into a reviewed recurring automation.&lt;/p&gt;
&lt;p&gt;Once the Skill exists, the same workflow can run from chat, code, or an automation tool. The interface changes; the source rules and approval gates do not.&lt;/p&gt;
&lt;h2 id=&quot;the-point&quot; tabindex=&quot;-1&quot;&gt;The point&lt;/h2&gt;
&lt;p&gt;A Skill is how an agent stops improvising an operating procedure.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next: use durable &lt;a href=&quot;https://www.kuudo.com/guides/why-mcp-needs-run-logs/&quot;&gt;run logs&lt;/a&gt; to make every Skill execution reviewable after the fact.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Why MCP Needs Run Logs</title>
    <link href="https://www.kuudo.com/guides/why-mcp-needs-run-logs/"/>
    <id>https://www.kuudo.com/guides/why-mcp-needs-run-logs/</id>
    <published>2026-05-08T00:00:00Z</published>
    <updated>2026-05-08T00:00:00Z</updated>
    <summary>Define the run log fields MCP-based agents need before read, write, approval, and rollback workflows can be trusted in a real Amazon account.</summary>
    <content type="html">&lt;p&gt;The operator question was not about a single Amazon workflow: &lt;em&gt;&amp;quot;If an MCP-connected agent calls tools for us, how do we know what happened afterward?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The answer is a run log. &lt;a href=&quot;https://www.kuudo.com/features/mcp/&quot;&gt;Model Context Protocol&lt;/a&gt; (MCP) gives agents a clean way to call tools. Production teams need the durable record around those calls: who asked, which tool ran, what parameters were passed, what policy checks fired, what changed, and who approved the change.&lt;/p&gt;
&lt;h2 id=&quot;what-a-model-without-atlas-gets-wrong&quot; tabindex=&quot;-1&quot;&gt;What a model without Atlas gets wrong&lt;/h2&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;Four run-log gaps show up when tool access is treated like a demo&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Read and write calls are logged at the same level, so risky actions do not stand out.&lt;/li&gt;
&lt;li&gt;Approval state is stored outside the run, making the final artifact hard to reproduce.&lt;/li&gt;
&lt;li&gt;Retrieved source context is omitted, so nobody knows which playbook or rule grounded the action.&lt;/li&gt;
&lt;li&gt;Errors are recorded as chat text instead of structured failure states.&lt;/li&gt;
&lt;/ol&gt;
&lt;/aside&gt;
&lt;p&gt;That makes the agent hard to trust even when the output is correct.&lt;/p&gt;
&lt;h2 id=&quot;what-atlas-retrieves&quot; tabindex=&quot;-1&quot;&gt;What Atlas retrieves&lt;/h2&gt;
&lt;p&gt;Atlas is one of the sources a run log must name. If an agent uses &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; to ground an &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; (AMC) query, listing patch, or decision rule, the run log should capture:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Atlas corpus version used for the answer.&lt;/li&gt;
&lt;li&gt;The chunk identifiers that grounded the rule.&lt;/li&gt;
&lt;li&gt;The tool inputs, outputs, and policy checks from the MCP server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The same principle applies to live data called through an MCP server: capture the tool, inputs, outputs, and policy checks in the same run.&lt;/p&gt;
&lt;p&gt;For Amazon workflows, the &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; and &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; provide the live data surfaces. The run log is the connective record that explains why the agent used them.&lt;/p&gt;
&lt;h2 id=&quot;the-agents-working-output&quot; tabindex=&quot;-1&quot;&gt;The agent&#39;s working output&lt;/h2&gt;
&lt;p&gt;A production run log should answer five questions:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;event&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mcp_tool_run&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;riskTier&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;write&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;initiator&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;workspace&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;execution&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;skillId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;skillVersion&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;toolCall&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;server&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;tool&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;parametersHash&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;grounding&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;atlasCorpusVersion&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;chunkIds&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;controls&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;checks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;privacy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;permission&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;approval&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;approvalState&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;result&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;artifactHash&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;destination&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;rollbackContext&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If a field cannot be logged, the agent should treat that as a product gap before write access expands.&lt;/p&gt;
&lt;h2 id=&quot;the-footnotes-the-agent-surfaces&quot; tabindex=&quot;-1&quot;&gt;The footnotes the agent surfaces&lt;/h2&gt;
&lt;aside class=&quot;callout callout--important&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-exclamation&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;The run log details that matter most in production&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read-only runs can log lighter context, but write-capable runs need the exact artifact hash.&lt;/li&gt;
&lt;li&gt;Approval belongs in the run record, not in a separate chat transcript.&lt;/li&gt;
&lt;li&gt;Failed policy checks should be first-class states, not unstructured explanation text.&lt;/li&gt;
&lt;li&gt;Tool output should be redacted where needed, but the redaction itself should be visible.&lt;/li&gt;
&lt;li&gt;Rollback context should be captured before the write, not reconstructed afterward.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;Those details are mundane until something goes wrong. Then they are the product.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;The full workflow runs through the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: Amazon Ads MCP and Selling Partner MCP supply live Amazon context, Atlas grounds the answer, and &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skills&lt;/a&gt; make the tool sequence repeatable. The run log records every step so a human can review the decision after the agent acts.&lt;/p&gt;
&lt;p&gt;When a workflow graduates from analysis to activation, the run log becomes the audit surface for approval, debugging, and customer trust.&lt;/p&gt;
&lt;h2 id=&quot;the-point&quot; tabindex=&quot;-1&quot;&gt;The point&lt;/h2&gt;
&lt;p&gt;If a tool call cannot be reconstructed, it should not be trusted in production.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next: use the &lt;a href=&quot;https://www.kuudo.com/guides/amc-agent-workflows/&quot;&gt;AMC Skill workflow&lt;/a&gt; pattern to decide which tool calls need approval before they write.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Human Approval for AMC Activation</title>
    <link href="https://www.kuudo.com/guides/human-approval-for-amc-activation/"/>
    <id>https://www.kuudo.com/guides/human-approval-for-amc-activation/</id>
    <published>2026-05-07T00:00:00Z</published>
    <updated>2026-05-07T00:00:00Z</updated>
    <summary>Gate AMC audience activation behind human approval: size the seed, review the exact payload, then submit. 2000-user floor, 24 to 36 hour DSP lag.</summary>
    <content type="html">&lt;p&gt;Run the read-only half of an AMC workflow hands-off, and stop in one place: audience activation waits inside a &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;Skill&lt;/a&gt; until a human approves the exact creation payload. The &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; runs the sizing reads automatically and holds the gated submission, while &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; supplies the rules the approver checks against: the 2000-user rule-based floor, the 500 to 500,000 lookalike seed band, the 24-to-36-hour DSP lag. The policy answers a Slack message from our media lead: &lt;em&gt;&amp;quot;If the agent builds an &lt;a href=&quot;https://www.kuudo.com/features/amc/&quot;&gt;Amazon Marketing Cloud&lt;/a&gt; audience and the SQL compiles, does it push it into the demand-side platform (DSP) on its own, or does one of us sign off first?&amp;quot;&lt;/em&gt; &lt;a href=&quot;https://www.kuudo.com/features/ai-clients/&quot;&gt;Our agent&lt;/a&gt; could do either. It stops.&lt;/p&gt;
&lt;p&gt;Why not paste the audience SQL into ChatGPT or Claude for review? A plain chat hits three walls here. &lt;strong&gt;No access to your data&lt;/strong&gt;: it cannot run a sizing query against your AMC instance. &lt;strong&gt;No way to take action&lt;/strong&gt;: it cannot submit or watch anything on Amazon; you do every step by hand. &lt;strong&gt;Generic knowledge, not Amazon&#39;s&lt;/strong&gt;: it does not carry the activation thresholds. That is disconnected, generic, manual work that ships silent mistakes. The MCP closes the first two walls, Atlas the third; the Skill makes the gate repeatable.&lt;/p&gt;
&lt;h2 id=&quot;an-amc-audience-query-returns-nothing-you-can-review-so-the-gate-must-come-before-the-post&quot; tabindex=&quot;-1&quot;&gt;An AMC audience query returns nothing you can review, so the gate must come before the POST&lt;/h2&gt;
&lt;p&gt;One line of shared playbook boilerplate settles where the gate goes: &amp;quot;Unlike standard AMC queries, AMC Audience queries do not return visible results that you can download. Instead, the audience defined by the query is pushed directly to Amazon DSP.&amp;quot; A rule-based audience query selects &lt;code&gt;user_id&lt;/code&gt; values and nothing else; once submitted, there is no artifact left to inspect. Review after submission is not late, it is impossible.&lt;/p&gt;
&lt;p&gt;Activation queries even run on their own table surface: the &lt;code&gt;_for_audiences&lt;/code&gt; variants, &lt;code&gt;conversions_for_audiences&lt;/code&gt;, &lt;code&gt;conversions_all_for_audiences&lt;/code&gt;, &lt;code&gt;dsp_impressions_for_audiences&lt;/code&gt;, &lt;code&gt;sponsored_ads_traffic_for_audiences&lt;/code&gt;, &lt;code&gt;amazon_attributed_events_by_traffic_time_for_audiences&lt;/code&gt;. That suffix in a FROM clause is a machine-checkable signal that a query is an activation, not an analysis. One nuance: &lt;code&gt;conversions_all_for_audiences&lt;/code&gt; is the audience copy of &lt;code&gt;conversions_all&lt;/code&gt;, and the high-value-segments query built on it lists a Flexible Amazon shopping insights subscription as a requirement, so the runnable seed below stays on &lt;code&gt;conversions_for_audiences&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cost lands on the same line. The &lt;strong&gt;Off-Amazon Conversions Playbook&lt;/strong&gt; is explicit: &amp;quot;Submitting an audience to be created is not charged. There is no cost until the audience is activated in Amazon DSP.&amp;quot; In the console the write is a paste into the Audiences query editor; through the Amazon Ads MCP it is the POST method of the AMC rule-based Audience API, which the Skill refuses to send unsigned.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT drafts plausible audience SQL without knowing that submission returns nothing reviewable; you paste it into the Audiences query editor and find out after the audience exists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Claude will not reliably flag that a &lt;code&gt;_for_audiences&lt;/code&gt; table makes the query an activation, so the one query that needed a gate looks like all the others.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;And your data is now exposed.&lt;/strong&gt; Getting that draft meant pasting instance details and audience logic into a chat history you do not control.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;approval-is-a-numbers-check-2000-distinct-userids-for-a-rule-based-audience-a-500-to-500000-seed-for-a-lookalike&quot; tabindex=&quot;-1&quot;&gt;Approval is a numbers check: 2000 distinct user_ids for a rule-based audience, a 500 to 500,000 seed for a lookalike&lt;/h2&gt;
&lt;p&gt;Two thresholds decide approvability, and they never blend. For rule-based audiences the &lt;strong&gt;Off-Amazon Conversions Playbook&lt;/strong&gt; states that &amp;quot;the minimum is 2000 distinct user_ids for a rules-based audience to be activated in the market,&amp;quot; a floor the &lt;strong&gt;Programmatic Audience Framework Playbook&lt;/strong&gt; repeats. Lookalikes answer to a different band: &lt;strong&gt;Introduction to AMC Lookalike Audiences&lt;/strong&gt; requires a seed of between 500 and 500,000 user_ids, warns that refresh &amp;quot;will fail if the size falls below 500 or goes above 500k,&amp;quot; and recommends 1,000 to 450,000 as the working range. A correct approval card names the one threshold that applies and puts the measured number beside it.&lt;/p&gt;
&lt;p&gt;Measurement runs automatically. Before submission, the agent wraps the seed in the corpus&#39;s companion pattern, &lt;code&gt;SELECT COUNT(user_id) AS user_count FROM (seed query) GROUP BY 1&lt;/code&gt;, run as an ordinary measurement query. Sizing needs no approval because it changes nothing.&lt;/p&gt;
&lt;p&gt;The seed we gated most recently, purchasers from the standard audience table, built with the same query shape the &lt;a href=&quot;https://www.kuudo.com/guides/amc-cart-abandoner-audience/&quot;&gt;cart-abandoner workflow&lt;/a&gt; assembles upstream:&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt;
  user_id
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt;
  conversions_for_audiences
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt;
  event_subtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That seed&#39;s companion COUNT came back at 12,480 distinct user_ids: above the 2000 floor with room to decay across weekly refreshes. On a lookalike, the same COUNT places the seed inside the 500 to 500,000 band; DSP&#39;s expansion tiers then run from roughly 300K to 1M members (most similar) up to 900K to 10M (most broad), region-dependent and subject to change. The corpus suggests starting balanced; a seed pinned to a tier&#39;s edge should be revised, not shipped.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT cannot run that companion COUNT against your AMC instance, so the seed size the approval hinges on is a guess, not a measurement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Claude does not carry the 2000-user floor or the 500/500k band; it blesses an 1,800-user audience that never activates, or a 600,000-user seed whose refresh fails, and blends both rules into &amp;quot;make sure it&#39;s big enough.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; Neither chat can hold the submission until the checks pass; you carry every figure between tabs yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;the-approver-signs-the-json-that-ships-audiencename-advertiserid-the-flattened-query-the-window-and-refreshratedays&quot; tabindex=&quot;-1&quot;&gt;The approver signs the JSON that ships: audienceName, advertiserId, the flattened query, the window, and refreshRateDays&lt;/h2&gt;
&lt;p&gt;In front of the human sits the creation payload itself, not a summary. The fields match the promotional-events lookalike playbook&#39;s example: &lt;code&gt;audienceName&lt;/code&gt;, &lt;code&gt;audienceDescription&lt;/code&gt;, &lt;code&gt;advertiserId&lt;/code&gt;, the seed SQL flattened into &lt;code&gt;query&lt;/code&gt;, &lt;code&gt;timeWindowStart&lt;/code&gt;, &lt;code&gt;timeWindowEnd&lt;/code&gt;, &lt;code&gt;timeWindowRelative&lt;/code&gt;, and &lt;code&gt;refreshRateDays&lt;/code&gt;; lookalike submissions add &lt;code&gt;lookalikeAudienceExpectedReach&lt;/code&gt;, &lt;code&gt;&amp;quot;BALANCED&amp;quot;&lt;/code&gt; in the corpus example. The same playbook scopes two recommendations to its pattern: &lt;code&gt;refreshRateDays: 7&lt;/code&gt; &amp;quot;to ensure optimal performance,&amp;quot; and &lt;code&gt;timeWindowRelative: FALSE&lt;/code&gt; to keep each refresh looking at individuals from the previous event.&lt;/p&gt;
&lt;p&gt;Shipped text is not drafted text. &lt;strong&gt;Introduction to AMC Lookalike Audiences&lt;/strong&gt; recommends removing all comment lines from the query before pushing to audience creation, and the seed gets flattened into the JSON regardless, so what a human eyeballed in an editor is not automatically what ships. The Skill closes that gap by hashing the flattened, comment-stripped query and binding the approval to the hash: change &lt;code&gt;query&lt;/code&gt; by one character and the gate reopens.&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;artifact&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;audience_definition&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;workflow&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amc-activation-approval&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;requiresApproval&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;activation&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;audienceName&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AMC_Purchasers_Weekly_2026Q3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;audienceDescription&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Purchasers, June 2026 order window&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;advertiserId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;123456789&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;query&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SELECT user_id FROM conversions_for_audiences WHERE event_subtype=&#39;order&#39;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;timeWindowStart&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-06-01T00:00:00Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;timeWindowEnd&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2026-07-01T00:00:00Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;timeWindowRelative&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FALSE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;refreshRateDays&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;checks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;seedCount&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;measured&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12480&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;threshold&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2000 distinct user_ids rule-based activation floor&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;tableVariant&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FROM uses _for_audiences tables only&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;destination&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;advertiserId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;123456789&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;instanceId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;amcinstance01&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;querySha256&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5b3c9f1e0a4b2d83c56a1908d7e5bc2a4f8e6d0b1a9c8e7f5d3b2a1c0e9f8d7b&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;atlasChunks&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;6e39ff4c3e1ed64b&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;3592514e4137c936&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;9e1e29903178da48&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;9fadd181160a41e4&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;decision&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;approve | revise | cancel&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;records&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;audienceExecutionId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;statusReason&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;audienceCount&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;dspAudienceId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;lastRefreshedTime&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;approvedBy&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;approvedAt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two fields deserve more attention than the SQL. &lt;code&gt;advertiserId&lt;/code&gt; is the destination: the DSP seat the audience lands in, confirmed, not assumed. And &lt;code&gt;refreshRateDays&lt;/code&gt; makes activation a standing write, not a one-off: the query re-runs on cadence under this single approval, so the human is approving a recurring behavior, which is why the hash check stays live after the yes.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; ChatGPT can format a payload that looks exactly like this, but it cannot bind your approval to what ships; what you read and what you later paste can silently differ.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; Claude cannot see your DSP seat, so &lt;code&gt;advertiserId&lt;/code&gt; is a string it copies from your prompt, not a destination it verifies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Both read &lt;code&gt;refreshRateDays: 7&lt;/code&gt; as a field, not a standing weekly write running under a one-time approval.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;successful-in-amc-is-not-active-in-dsp-allow-24-to-36-hours-and-keep-your-own-run-log&quot; tabindex=&quot;-1&quot;&gt;&amp;quot;Successful&amp;quot; in AMC is not &amp;quot;active&amp;quot; in DSP: allow 24 to 36 hours and keep your own run log&lt;/h2&gt;
&lt;p&gt;The clock after the approved POST belongs to Amazon. The &lt;strong&gt;Programmatic Audience Framework Playbook&lt;/strong&gt; is precise: &amp;quot;Once an audience creation status is returned as &#39;successful&#39; in the AMC API, it can take between 24 and 36 hours to be &#39;active&#39; and ready for use in Amazon DSP.&amp;quot; I nearly resubmitted after one quiet day; the playbook says that quiet day is the system working.&lt;/p&gt;
&lt;p&gt;Amazon also leaves a hole in the audit trail. The same playbook admits there is currently &amp;quot;no unique id field that is common for both the AMC endpoint and Amazon DSP endpoint&amp;quot;; the only mapping for now is &amp;quot;by name and by the approximate creation date.&amp;quot; The monitoring output does include &lt;code&gt;dspAudienceId&lt;/code&gt; and &lt;code&gt;dspCanonicalId&lt;/code&gt; columns, but by the playbook&#39;s own statement those values cannot join the two systems, so lean on neither. Copy its working practice instead: filter the DSP audience list by &lt;code&gt;audienceName&lt;/code&gt; prefix, category &amp;quot;Custom-built,&amp;quot; subCategory &amp;quot;AMC,&amp;quot; which only works if the naming convention was enforced at approval time.&lt;/p&gt;
&lt;p&gt;So the run log is the join key, not bookkeeping. Per audience, the agent logs what it watches by &lt;code&gt;audienceExecutionId&lt;/code&gt;: &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;statusReason&lt;/code&gt;, &lt;code&gt;audienceCount&lt;/code&gt;, &lt;code&gt;lastRefreshedTime&lt;/code&gt;, the query, and the window, next to the approval record itself, the same argument that makes &lt;a href=&quot;https://www.kuudo.com/guides/why-mcp-needs-run-logs/&quot;&gt;run logs non-negotiable for MCP writes&lt;/a&gt;.&lt;/p&gt;
&lt;aside class=&quot;callout callout--info&quot; role=&quot;note&quot;&gt;
&lt;p class=&quot;callout__label&quot;&gt;&lt;i class=&quot;fa-regular fa-circle-info&quot; aria-hidden=&quot;true&quot;&gt;&lt;/i&gt;In plain ChatGPT or Claude&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No access to your data.&lt;/strong&gt; ChatGPT cannot watch the 24-to-36-hour window between AMC &amp;quot;successful&amp;quot; and DSP &amp;quot;active&amp;quot;; you refresh the console and wonder whether it failed or is not there yet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generic knowledge, not Amazon&#39;s.&lt;/strong&gt; Claude does not know the two endpoints share no common ID, so it cannot reconstruct which live DSP audience came from which approved payload.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No way to take action.&lt;/strong&gt; When a refresh stalls, no chat flags the line item still targeting the stale audience; a human has to notice on their own.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;what-happens-next&quot; tabindex=&quot;-1&quot;&gt;What happens next&lt;/h2&gt;
&lt;p&gt;Approval closes the gate once; the Skill keeps watching. It expects the DSP entry inside the 24-to-36-hour window and logs execution metadata on every refresh, keeping the name-plus-creation-date mapping current. When an audience stops refreshing, the playbook&#39;s diagnosis is blunt: &amp;quot;it is most likely the audience size has dropped below 2,000 unique users,&amp;quot; flagged after a one-day buffer past &lt;code&gt;refreshRateDays&lt;/code&gt;. After several failed refreshes the instruction turns operational: decrease or stop spending on that line item, because it keeps targeting the same users as they move down the funnel. Each refresh is also the moment to re-measure overlap against segments already live in Amazon DSP (via &lt;code&gt;conversions_all&lt;/code&gt;), at launch and mid-campaign, since affinity and size metrics do not necessarily indicate overlap.&lt;/p&gt;
&lt;p&gt;The loop runs on the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;Amazon Agent Data layer&lt;/a&gt;: the Amazon Ads MCP carries the AMC sizing reads, the gated submission, and the refresh monitoring, and the &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; joins when audience logic depends on catalog facts, like which ASINs a promotion actually covers. That is the whole pattern: reads run free, the one write stops at a person, and the approval binds to the exact artifact that ships.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next: turning gated analyses like this one into &lt;a href=&quot;https://www.kuudo.com/guides/amc-agent-workflows/&quot;&gt;repeatable AMC agent workflows&lt;/a&gt;, where the approval step is part of the Skill rather than a manual afterthought.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Everyone in Your Category Has the Same AI Now</title>
    <link href="https://www.kuudo.com/guides/everyone-has-the-same-ai/"/>
    <id>https://www.kuudo.com/guides/everyone-has-the-same-ai/</id>
    <published>2026-05-06T00:00:00Z</published>
    <updated>2026-05-06T00:00:00Z</updated>
    <summary>Every seller has the same AI now. Your edge is the operator knowledge it doesn&#39;t have, and today&#39;s AI listing tools are built to harvest it.</summary>
    <content type="html">&lt;p&gt;If you sell on Amazon, something quietly changed underneath you in the last two years, and most of your competitors haven&#39;t noticed what it actually means.&lt;/p&gt;
&lt;p&gt;Every seller in your category now has access to the same frontier AI you do. The same models, the same chat window, the same &amp;quot;analyze this search term report&amp;quot; prompt. The tools got extraordinary, and they got extraordinary for everyone at exactly the same moment. When the most powerful tool in your business is also sitting on your competitor&#39;s desk, the tool stops being the difference.&lt;/p&gt;
&lt;p&gt;So what is the difference?&lt;/p&gt;
&lt;h2 id=&quot;the-model-knows-about-amazon-you-know-amazon&quot; tabindex=&quot;-1&quot;&gt;The model knows &lt;em&gt;about&lt;/em&gt; Amazon. You &lt;em&gt;know&lt;/em&gt; Amazon.&lt;/h2&gt;
&lt;p&gt;Ask a frontier model how to structure a Sponsored Products campaign and it will give you a competent answer. It will give your competitor the same competent answer. It has read everything ever written about Amazon: the help docs, the blog posts, the courses, the conference talks, the prompt packs. But that&#39;s the tell. It knows &lt;em&gt;about&lt;/em&gt; Amazon the way someone who read a book about swimming knows about water. That knowledge is now the floor: table stakes, priced at twenty dollars a month.&lt;/p&gt;
&lt;p&gt;Because Amazon doesn&#39;t run on what&#39;s written down. It runs on unwritten rules, and those were never in anyone&#39;s training data. The gap between what Seller Central says and what Amazon actually does. What genuinely gets a suppressed listing reinstated, versus the case wording that earns you another canned bot reply. Why your attribute update silently loses to an upstream contribution, and which &amp;quot;errors&amp;quot; you can safely ignore. How the algorithm really behaves after a price move, how enforcement really works, how long things really take. The internals, the quirks, the behaviors, the operational know-how you only earn by running the machine for years and paying tuition every time it surprises you.&lt;/p&gt;
&lt;h3 id=&quot;the-layer-thats-only-yours&quot; tabindex=&quot;-1&quot;&gt;The layer that&#39;s only yours&lt;/h3&gt;
&lt;p&gt;And stacked on top of that sits the layer that&#39;s exclusively yours: the size-chart rewrite that cut your bestseller&#39;s return rate 40%, the fifty thousand dollars of wasted spend encoded in your negative keyword lists, why you never run deals on that one ASIN in Q3, the campaign structure you arrived at after three years of expensive lessons.&lt;/p&gt;
&lt;p&gt;That&#39;s your DNA. Some people call it tribal knowledge. It&#39;s the reason a customer chose you over the four identical-looking listings above and below you, and in the most literal sense, it&#39;s your IP. In a marketplace as brutally commoditized as Amazon, it may be the &lt;em&gt;only&lt;/em&gt; IP you have that can&#39;t be copied, undercut, or bought.&lt;/p&gt;
&lt;p&gt;We&#39;re not the only ones who see it this way. In late June 2026, Alex Karp&#39;s Palantir posted &lt;a href=&quot;https://thenextweb.com/news/palantir-ai-sovereignty-manifesto-tokenmaxxing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;a nine-point manifesto on AI sovereignty&lt;/a&gt;: data as treasure, knowledge as the asset that compounds, ownership as the precondition for having a future at all. He argues it from the world of defense and statecraft. We didn&#39;t need the confirmation, but we&#39;ll take it: it&#39;s the same signal we built Kuudo on. If it&#39;s existential for nations, believe that it&#39;s existential for a business fighting for the buy box.&lt;/p&gt;
&lt;h2 id=&quot;why-are-amazon-sellers-walking-into-this-trap-faster-than-anyone&quot; tabindex=&quot;-1&quot;&gt;Why are Amazon sellers walking into this trap faster than anyone?&lt;/h2&gt;
&lt;p&gt;The path of least resistance on a busy afternoon is to paste it all into a public chatbot. The search term report. The business report. The P&amp;amp;L. The strategy doc for your Q4 push. Every hard-won correction, typed into a tool you don&#39;t control.&lt;/p&gt;
&lt;p&gt;Do that long enough and your edge stops being yours. It gets absorbed into the same model your competitor opens tomorrow morning. The advantage that took years to earn doesn&#39;t fade. It gets donated.&lt;/p&gt;
&lt;h3 id=&quot;read-the-pitches-yourself&quot; tabindex=&quot;-1&quot;&gt;Read the pitches yourself&lt;/h3&gt;
&lt;p&gt;And you don&#39;t have to squint to see the machine, because a whole product category now advertises it right on the homepage. Look at the wave of AI listing-optimization tools and read their pitches carefully:&lt;/p&gt;
&lt;p&gt;ListingOptimization.ai leads with AI &lt;a href=&quot;https://listingoptimization.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&amp;quot;trained on thousands of winning listings&amp;quot;&lt;/a&gt; and a template library for cloning A/B test winners. Whose winning listings? Who paid for the losing variants?&lt;/p&gt;
&lt;p&gt;Pixii grades your listing against &lt;a href=&quot;https://www.pixii.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;a database of 100,000 top-performing listings&lt;/a&gt; and offers proven templates drawn from high-converting ones. Somebody earned those conversions.&lt;/p&gt;
&lt;p&gt;Nozam sells &lt;a href=&quot;https://www.nozam.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;review mining on any ASIN&lt;/a&gt;, yours or your competitor&#39;s, to surface exactly what customers hate about them.&lt;/p&gt;
&lt;p&gt;Clicco promises visuals and copy that learn from top competitors. And Selluna says it plainest of all: upload any competitor&#39;s image and it recreates the style with your product: &lt;a href=&quot;https://www.selluna.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&amp;quot;Their inspiration, your listing.&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;None of this is hidden. It&#39;s the value proposition. These are redistribution engines: they harvest what worked (the winning image, the converting layout, the review insight) and hand the distillation to the next subscriber for a monthly fee.&lt;/p&gt;
&lt;p&gt;Every one of those &amp;quot;winning listings&amp;quot; in the training data was some seller&#39;s tuition: the photoshoots, the failed variants, the split tests, the years of learning what actually converts in one category. That edge is now a template, available to the four listings above and below yours for a monthly fee.&lt;/p&gt;
&lt;h3 id=&quot;the-flywheel-only-spins-one-way&quot; tabindex=&quot;-1&quot;&gt;The flywheel only spins one way&lt;/h3&gt;
&lt;p&gt;Here&#39;s the part to sit with: the flywheel only spins one way. &lt;strong&gt;They learn from you, and they offer that learning to the next user.&lt;/strong&gt; Today you&#39;re the customer. The day your listing starts winning, you&#39;re the inventory. One of these tools even answers &amp;quot;Is my data private?&amp;quot; in its FAQ with &lt;em&gt;yes, for paid plans&lt;/em&gt;. Privacy as an upsell. That&#39;s the market telling you, in writing, what your knowledge is worth to them.&lt;/p&gt;
&lt;p&gt;But don&#39;t stop at the upsell, because a privacy line, even a sincere one, answers a narrower question than the one that matters. Several of these tools do promise they won&#39;t sell your data, and that promise can be entirely true while the flywheel spins anyway.&lt;/p&gt;
&lt;p&gt;The thing that compounds isn&#39;t your file. It&#39;s the learning stacked on top of it: which of the six generated main images you shipped, which template you cloned, which headline you kept and which you threw away, which &amp;quot;winner&amp;quot; you took into your split test. That&#39;s your operator judgment, years of expensive lessons, compressed into clicks, and it&#39;s exactly the signal a system like this needs to get smarter for the next subscriber in your category.&lt;/p&gt;
&lt;p&gt;Read the pitches again: a grader scored against &amp;quot;100,000 top-performing listings,&amp;quot; AI &amp;quot;trained on thousands of winning listings,&amp;quot; libraries of &amp;quot;proven templates from high-converting listings.&amp;quot; Proven by whom? Somebody&#39;s photoshoots, somebody&#39;s failed variants, somebody&#39;s tuition. The learning travels even when your name doesn&#39;t. They anonymize &lt;em&gt;you&lt;/em&gt;. They don&#39;t anonymize what they learned from you. That&#39;s the product.&lt;/p&gt;
&lt;h3 id=&quot;this-isnt-new-its-just-faster-now&quot; tabindex=&quot;-1&quot;&gt;This isn&#39;t new. It&#39;s just faster now&lt;/h3&gt;
&lt;p&gt;Sellers should recognize the pattern, because the Amazon software industry ran this play long before AI: tools that pooled your data into &amp;quot;category benchmarks&amp;quot; and sold the aggregate back to you and everyone you compete with.&lt;/p&gt;
&lt;p&gt;The new crowd is faster and slicker, but the business model is identical: build the product on top of your knowledge until your knowledge becomes the thing they sell. Take it to its end and they don&#39;t need you at all. The next seller just pays for access to the expertise you handed over. That isn&#39;t being out-competed. It&#39;s commoditizing yourself, one upload at a time.&lt;/p&gt;
&lt;p&gt;The brands still donating their edge to someone else&#39;s flywheel will look up one day and find they no longer have one.&lt;/p&gt;
&lt;h2 id=&quot;the-answer-isnt-less-ai-its-ai-in-a-private-place&quot; tabindex=&quot;-1&quot;&gt;The answer isn&#39;t less AI. It&#39;s AI in a private place.&lt;/h2&gt;
&lt;p&gt;This is &lt;a href=&quot;https://www.kuudo.com/why-kuudo/&quot;&gt;the conviction Kuudo is built on&lt;/a&gt;, and it&#39;s worth saying plainly: &lt;strong&gt;when everyone runs the same models, your advantage is the private knowledge only you have, and keeping it yours is no longer a matter of discipline. It&#39;s a choice.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The wrong response to the leak is abstinence. Refusing to use frontier AI while your category compounds with it isn&#39;t protecting your edge; it&#39;s forfeiting the game to protect the ball. The right response is to give AI your knowledge &lt;em&gt;and a private place to do the work&lt;/em&gt;, where your years of order history, campaign judgment, and catalog-specific wisdom accelerate the business instead of leaking out of it.&lt;/p&gt;
&lt;h3 id=&quot;thats-what-kuudo-is&quot; tabindex=&quot;-1&quot;&gt;That&#39;s what Kuudo is&lt;/h3&gt;
&lt;p&gt;A private place for AI to work on what only you know. It runs in your cloud, not ours. Nothing inside it trains anyone else&#39;s model: Google, Meta, Anthropic, and OpenAI can&#39;t learn from what you never gave them. There&#39;s no fine print about what counts as &amp;quot;your data,&amp;quot; because in your own cloud the definition is total: the inputs, the outputs, the choices, and everything the system learns from them are yours, the learning included. And if you ever walk away, what you built stays yours, because it lives in your cloud.&lt;/p&gt;
&lt;p&gt;Private. Trusted. Owned. In that order, always together.&lt;/p&gt;
&lt;p&gt;And because you supply what no vendor can (your choices, your judgment, the calls only your team would make), no two Kuudo deployments look alike. It isn&#39;t a finished product you rent. It&#39;s the ingredients: the &lt;a href=&quot;https://www.kuudo.com/features/amazon-agent-flow/&quot;&gt;data layer&lt;/a&gt;, with &lt;a href=&quot;https://www.kuudo.com/features/amazon-ads-mcp/&quot;&gt;Amazon Ads MCP&lt;/a&gt; steering spend and &lt;a href=&quot;https://www.kuudo.com/features/amazon-selling-partner-mcp/&quot;&gt;Selling Partner MCP&lt;/a&gt; touching your catalog; the &lt;a href=&quot;https://www.kuudo.com/features/agent-atlas/&quot;&gt;Amazon Agent Atlas&lt;/a&gt; grounding, and the &lt;a href=&quot;https://www.kuudo.com/features/skills/&quot;&gt;tools and skills&lt;/a&gt; your agents run. You keep the IP. You own the means of production.&lt;/p&gt;
&lt;h2 id=&quot;why-amazon-first&quot; tabindex=&quot;-1&quot;&gt;Why Amazon first&lt;/h2&gt;
&lt;p&gt;We start with Amazon deliberately, because it&#39;s where some of the densest, most defensible operator knowledge in the world already lives, and where the stakes of giving it away are highest. Millions of sellers, one search results page, and a customer who can&#39;t tell you apart until &lt;em&gt;something&lt;/em&gt; tells them to. That something was never the model.&lt;/p&gt;
&lt;p&gt;It was never the clever prompt. It was the unwritten rules, the hard-won know-how, the accumulated judgment about how the machine actually behaves and what actually works, earned by you, running your business, one expensive lesson at a time.&lt;/p&gt;
&lt;p&gt;Everyone has the same AI now. Your edge is what it doesn&#39;t know.&lt;/p&gt;
&lt;p&gt;Keep it that way. Build your moat, and let your competition give theirs away.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For how this plays out in practice (an agent doing real listing work with your knowledge staying yours), start with &lt;a href=&quot;https://www.kuudo.com/guides/seller-listing-agentic-audit-to-patch/&quot;&gt;how a suppressed listing gets diagnosed and fixed&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
</feed>
