Why Amazon sales move: the full diagnostic playbook

Updated 7 August 2026 · By Colin Raja · Works for drops and spikes

Sales move and nothing obvious explains it. This is the order to check things in — market first, then which half of the funnel moved, then a gate chain where the first failure names the cause. It works the same way when sales jump, which is the half most people never diagnose.

The four phases
  1. The whole decision tree — every gate connected
  2. Market filter — is it even your listing?
  3. Funnel split — discovery, conversion, or price?
  4. Discovery gates — 14 checks, first failure names the culprit
  5. Conversion gates — 5 page-level culprits

Work it top to bottom. The order matters: each phase eliminates a whole class of cause, so by the time you reach a gate chain you already know which chain to run. Skip to the gates and you will usually end up fixing something that was never broken.

The whole decision tree

every gate connected · phases below break it down
flowchart TD
  A(["📉📈  Sales moved sharply — down or up"]) --> K1["CHECK 1 — BSR relative check
your BSR %Δ vs last / compare date
same %Δ calc for each tracked competitor's BSR"] K1 --> K2{"Your BSR %Δ ≈
competitors' %Δ?
(moved together)"} K2 -->|"Yes — whole niche moved"| M(["🌊 MARKET MOVE — not the listing
category demand shift / seasonality / external event.
Down: hold strategy, don't panic-change price or listing.
Up: it's a tide, not your genius — check stock cover to ride it"]) K2 -->|"No — your BSR diverged drastically
from competitors (either direction)"| B["CHECK 2 — discovery-driven or conversion-driven?
Pull Business Report → Detail Page Sales & Traffic by ASIN
two equal windows: current vs prior (e.g. 30d vs previous 30d)"] B --> C{"Compare
Sessions - Total vs Unit Session %"} C -->|"Sessions moved ≥25% vs norm
CVR flat (±10%)"| D["🔍 DISCOVERY-DRIVEN
visibility changed — listing itself unchanged.
Down: find what broke. Up: find what's working & feed it"] C -->|"Sessions moved <25% (flat)
CVR moved >10% relative"| E["🛒 CONVERSION-DRIVEN
same traffic, different buy rate.
Down: something on the page broke. Up: recent change worked — lock it in"] C -->|"Both moved
(sessions ≥25% AND CVR >10%)"| F{"Day-by-day:
which moved first?"} C -->|"Neither moved
(sessions <25% AND CVR ±10%)"| N["💲 PRICE / MIX-DRIVEN — funnel didn't move
same traffic, same buy rate, different $ per order. Check:
avg selling price change (sales $ vs units diverging) ·
units-per-order / bundle mix · coupon or deal margin ·
Buy Box share shifting sales to another seller ·
if none of these: window too short — re-run on a longer compare"] F -->|"Sessions led"| D F -->|"CVR led"| E D --> Q1{"1. Listing
suppressed?"} Q1 -->|"Yes"| R1(["🚫 Suppression is the cause. Fix the flagged
attribute / policy issue, republish, confirm searchable"]) Q1 -->|"No"| QG{"2. Product type / item type /
GL code / category (browse node)
changed?"} QG -->|"Yes"| RG(["🗂️ Reclassification broke your indexing. A changed product-type,
item-type keyword, GL code, or browse node re-maps which queries you
index for AND which category's BSR you compete in — a rank 'collapse'
may really be a category shift. Diff listing attributes vs the stored
snapshot; correct the classification or open a case to re-map it"]) QG -->|"No"| QT{"3. Title or key content
changed recently?"} QT -->|"Yes"| RT(["✏️ Content change reset indexing. A title edit re-indexes the
ASIN — keywords you ranked for can drop or deindex entirely, and it
looks like a mystery rank collapse. Compare stored title vs today;
if it changed near the sales break: revert or re-optimize, then verify
indexing keyword-by-keyword (SQP impressions > 0)"]) QT -->|"No"| Q2{"4. Hijacker
on the listing?"} Q2 -->|"Yes"| R2(["🏴 Hijacker splitting the Buy Box.
Test buy → IP complaint / Brand Registry takedown;
reprice meanwhile to hold the box"]) Q2 -->|"No"| Q3{"5. Buy Box
share > 90%?"} Q3 -->|"No"| R3(["📦 Buy Box leak. Check price vs the competing offer,
account health, fulfillment channel — reprice to reclaim"]) Q3 -->|"Yes"| Q4{"6. Coupon
still active?"} Q4 -->|"No"| R4(["🏷️ Coupon expired or budget exhausted. The green
badge lifts tile CTR — its silent disappearance reads as a
discovery drop. Relaunch or accept the new baseline"]) Q4 -->|"Yes"| Q5{"7. Two-day / Prime
delivery promise showing?"} Q5 -->|"No"| R5(["🚚 Delivery promise degraded. The shown delivery date
sits on the search tile — a slower promise cuts CTR & CVR.
Cause is almost always inventory placement → run check 9"]) R5 -.-> Q7 Q5 -->|"Yes"| Q6{"8. Total inventory ≥ ~30 days
at current daily sales?"} Q6 -->|"No"| R6(["📉 Low stock. Amazon dampens traffic to offers about
to strand buyers; reorder now + slow velocity deliberately
(trim PPC, lift price) rather than stock out"]) Q6 -->|"Yes"| Q7{"9. Per-warehouse: any top-moving
region's stock at / near 0?"} Q7 -->|"Yes"| R7(["🗺️ Regional stockout — the hidden killer. Delivery promise is
computed per customer from the nearest FC's stock. Zero units in a
high-velocity region = no two-day promise there → badge gone for those
shoppers → CTR/CVR fall regionally → regional rank decays. Total inventory
looks fine while sales bleed. Rebalance / inbound to that region's FCs"]) Q7 -->|"No"| QA{"10. Own tile changed:
price · discount % · rating?"} QA -->|"Yes"| RA(["💲⭐ Your tile got weaker. Price up, strikethrough / discount %
shrunk, or rating display ticked down (4.5 → 4.4 stars) — each cuts
CTR at the SAME rank, which reads as a discovery drop. Quantify:
which attribute changed, on what date, and vs which competitor price"]) QA -->|"No"| QB{"11. SERP top-10 changed: new listing
priced BELOW yours above you, or a
new player took the top position?"} QB -->|"Yes"| RB(["🥊 Someone re-shaped the shelf. A low-price entrant or a competitor
jumping to top position absorbs clicks even when YOUR rank held.
Compare the top-10 lineup vs the compare date: who's new, their price
vs yours, their deal/coupon badges, their review count. Respond on
price/coupon — or outbid them on top-of-search placement"]) QB -->|"No"| Q8{"12. PPC spend reduced
vs compare window?"} Q8 -->|"Yes"| R8(["💸 Name the exact keywords whose spend fell
budget cap hit, bids outcompeted, campaign paused,
or dayparting gap. Restore spend on those terms first"]) Q8 -->|"No"| Q9{"13. Organic rank: any money keyword
fallen from top 1–25 to 25+ ?
BA keyword count vs yesterday?"} Q9 -->|"Yes"| R9(["🔻 Organic slip — point to the exact terms: list each keyword
that left the top 25 with old → new position, and the net Brand
Analytics keywords lost vs yesterday. Rank-recovery PPC on
precisely those terms while rank is still recoverable"]) Q9 -->|"No"| QC{"14. External-traffic signature?
Sessions ↓ · PPC spend flat (<±10%) ·
no listing change · any BRANDED keyword
(or other) dropped out of Brand Analytics?"} QC -->|"Yes"| RC(["🌐 External traffic dried up. A branded keyword vanishing from BA
means people stopped searching your brand — the demand source that
fed those searches stopped: influencer / TikTok / social post faded,
Google ads or email campaign paused, affiliate link died. Amazon looks
unchanged because the leak is OUTSIDE Amazon. Check external campaign
status & Amazon Attribution tags; restart the source or replace it"]) QC -->|"No"| R10(["🧐 All fourteen gates pass — widen the compare window
and run the SQP cross-check below"]) R10 --> G["Cross-check Search Query Performance per keyword:
impressions collapsed → rank / indexing loss (true discovery)
impressions OK but clicks ↓ → tile lost the click: main image, price, rating
clicks OK but purchases ↓ → it's actually detail-page conversion"] R9 -.-> G R8 -.-> G G --> BS["📝 Known blind spots — log for the record (no data source today):
· a different variation (child ASIN) showing for the keyword instead of yours
· product displayed in an upper / wrong category (browse-node change)
· top-of-search ad share & SERP layout shifts (extra sponsored slots, video / editorial widgets pushing organic down)
· badge changes: Amazon's Choice / Best Seller / Deal badge gained or lost
· strikethrough (reference) price removed by Amazon — kills the perceived discount"] G --> H(["✅ Down: restart / raise PPC on historical terms,
rank-recovery campaign, resolve suppression, reprice for Buy Box.
✅ Up: feed the winning lever — raise budget on the scaling
keywords, protect rank, verify stock covers the new velocity"]) E --> E0{"CHECK 3 — did clicks move too?
PPC clicks + SQP clicks
vs compare window"} E0 -->|"Yes — clicks moved with sales"| E5(["Not pure conversion — the tile gained/lost the click:
main image, price shown, rating, badge.
Treat as discovery/CTR → run the SQP cross-check"]) E5 -.-> G E0 -->|"No — clicks held, purchases moved
= confirmed conversion issue"| V1{"C1. Price & offer changed?
price moved · coupon gone ·
'lowest price in 30 days' basis
changed or strikethrough disappeared"} V1 -->|"Yes"| W1(["💲 The offer got worse on the page. Price hike, lost coupon
badge, or Amazon dropped the 30-day-lowest reference price —
the strikethrough vanishes and the perceived deal dies at identical
traffic. Compare the full offer stack vs the compare date; restore
the coupon or hold price steady 30 days to re-earn the reference"]) V1 -->|"No"| V2{"C2. Delivery & Buy Box intact?
two-day / fast shipping showing?
Buy Box present on the page?"} V2 -->|"No — either missing"| W2(["🚚 Detail-page offer degraded. A slow delivery date beside the
buy button cuts CVR hard; NO Buy Box at all ('See All Buying Options')
collapses it. Causes: regional/total stockout, price outside guardrails,
account health. Fix placement or eligibility → also run discovery check 9"]) W2 -.-> Q7 V2 -->|"Yes"| V3{"C3. Social proof shifted?
rating down · top-10 reviews reordered ·
a negative review now on top ·
review videos changed ·
'What customers say' AI summary changed"} V3 -->|"Yes"| W3(["⭐ Social proof is the killer. Shoppers read the top 3 reviews —
a fresh negative rising to the top, a reshuffled top-10, a removed
review video, or a harsher 'What customers say' AI summary tanks CVR
with zero listing change on your side. Respond to the negative, drive
fresh positives, address the complaint in bullets & images"]) V3 -->|"No"| V4{"C4. Page content changed?
main image · bullet points · description / A+ ·
item details · user guide / docs"} V4 -->|"Yes"| W4(["🖼️ Content regression. Diff the stored listing snapshot vs today —
image swap, edited bullets, changed A+ / description / item details. Revert whichever
change coincides with the CVR break date, then re-test"]) V4 -->|"No"| V5{"C5. Competitor running a deal
or coupon beside you?"} V5 -->|"Yes"| W5(["🔥 Competitor deal siphoning buyers. Their Lightning / Best Deal
or coupon makes your unchanged page look expensive. Check their
price-drop dates (Keepa). Usually self-resolves — decide: match with a
coupon or wait it out; don't permanently reprice against a 7-day deal"]) V5 -->|"No"| E2{"Page Views ÷ Sessions
ratio rising?"} E2 -->|"Yes"| E3(["🤔 Shoppers returning & comparing
→ hesitation — price issue most likely"]) E2 -->|"No"| E4(["📄 Straight conversion loss
→ content, images, reviews, offer"]) classDef default fill:#121722,stroke:#1c2333,color:#e8ecf4,font-size:13px classDef decision fill:#241d0e,stroke:#8a6d1f,color:#ffd97a classDef discovery fill:#0e1a2e,stroke:#3b6db0,color:#9ec5ff classDef conversion fill:#0f231a,stroke:#2e8f63,color:#7fe0b2 classDef fix fill:#0f231a,stroke:#34d399,color:#a7f3d0 classDef start fill:#2a1216,stroke:#b04a4a,color:#ffb3b3 class C,F,E2,K2,E0,Q1,QG,QT,Q2,Q3,Q4,Q5,Q6,Q7,QA,QB,Q8,Q9,QC,V1,V2,V3,V4,V5 decision class D,G,E5,R10 discovery classDef culprit fill:#2a1216,stroke:#b04a4a,color:#ffc9c9 class R1,RG,RT,R2,R3,R4,R5,R6,R7,RA,RB,R8,R9,RC,W1,W2,W3,W4,W5 culprit classDef note fill:#0b0e14,stroke:#3a4356,stroke-dasharray:5 4,color:#7e8aa3 class BS note class E conversion class H,E3,E4 fix class A start class K1 default classDef market fill:#1a1330,stroke:#7c5cbf,color:#cdb8ff class M market classDef price fill:#231a0e,stroke:#b0813b,color:#ffd9a0 class N price
1

Market filter — is it even your listing?

BSR %Δ: you vs. every tracked competitor
flowchart LR
  A(["📉📈 Sales moved sharply"]) --> K1["BSR relative check
your BSR %Δ vs compare date ·
same calc per competitor"] K1 --> K2{"moved
together?"} K2 -->|"Yes"| M(["🌊 MARKET MOVE — not the listing
Down: hold, don't panic-reprice
Up: it's a tide — check stock cover"]) K2 -->|"No — you diverged"| NEXT(["→ Phase 2
Funnel Split"]) classDef default fill:#121722,stroke:#1c2333,color:#e8ecf4,font-size:13px classDef decision fill:#241d0e,stroke:#8a6d1f,color:#ffd97a classDef market fill:#1a1330,stroke:#7c5cbf,color:#cdb8ff classDef start fill:#2a1216,stroke:#b04a4a,color:#ffb3b3 classDef go fill:#0e1a2e,stroke:#3b6db0,color:#9ec5ff class K2 decision class M market class A start class NEXT go
BSR lag rule: BSR trails sales by ~24h and is smoothed — never let same-day BSR veto a sharp sales signal; check the next day's BSR too.
2

Funnel split — where did the money move?

Sessions × Unit Session % · four exhaustive branches
flowchart TD
  C{"Compare Sessions - Total
vs Unit Session %"} C -->|"Sessions ≥25%Δ · CVR flat"| D(["🔍 DISCOVERY
→ Phase 3 gate chain"]) C -->|"Sessions flat · CVR >10%Δ"| E{"Clicks test: did PPC + SQP
clicks move with sales?"} C -->|"Both moved"| F{"day-by-day:
which moved first?"} C -->|"Neither moved"| N(["💲 PRICE / MIX
avg price · units-per-order ·
coupon margin · Buy Box share leak ·
else: widen the window"]) F -->|"sessions led"| D F -->|"CVR led"| E E -->|"clicks moved too"| D2(["🖼️ Tile lost/gained the click
image · price · rating → treat as
DISCOVERY, run SQP cross-check"]) E -->|"clicks held"| V(["🛒 CONVERSION confirmed
→ Phase 4 gate chain"]) classDef default fill:#121722,stroke:#1c2333,color:#e8ecf4,font-size:13px classDef decision fill:#241d0e,stroke:#8a6d1f,color:#ffd97a classDef disc fill:#0e1a2e,stroke:#3b6db0,color:#9ec5ff classDef conv fill:#0f231a,stroke:#2e8f63,color:#7fe0b2 classDef price fill:#231a0e,stroke:#b0813b,color:#ffd9a0 class C,E,F decision class D,D2 disc class V conv class N price
3

Discovery gate chain — 14 gates

run top → bottom · first failure names the culprit
  • 1
    Listing suppressed / search-suppressed?
    YESSuppression. Fix flagged attribute, republish, confirm searchable.
  • 2
    Product type · item type · GL · category (browse node) changed?
    diff vs stored attribute snapshot
    YESReclassification. Re-maps indexed queries + BSR category. Correct it or open a case.
  • 3
    Title or key content changed?
    exact string diff vs snapshot
    YESRe-indexing reset. Keywords can drop or deindex (SQP impressions = 0). Revert / re-optimize.
  • 4
    Hijacker on the listing?
    YESBuy Box split. Test buy → IP complaint / Brand Registry takedown; reprice meanwhile.
  • 5
    Buy Box share > 90%?
    NOBuy Box leak. Price vs competing offer, account health, fulfillment — reclaim it.
  • 6
    Coupon still active?
    NOBadge gone. Expired coupon / exhausted budget silently cuts tile CTR. Relaunch it.
  • 7
    Two-day / Prime promise showing?
    NODelivery degraded. Promise sits on the search tile. Root cause ≈ gate 9.
  • 8
    Total inventory ≥ ~30 days at current velocity?
    Total Inv = 0 while Available > 0 → data glitch, not stockout
    NOLow stock. Reorder now; slow velocity deliberately (trim PPC / lift price) over stocking out.
  • 9
    Any top-moving region's FC stock at / near 0? FC location count dropped >30%?
    YESRegional stockout — hidden killer. Promise is per-customer from nearest FC: badge vanishes regionally, CTR/CVR fall, regional rank decays while totals look fine. Rebalance inbound.
  • 10
    Own tile changed: price · discount % · rating?
    YESWeaker tile. Same rank, fewer clicks (e.g. 4.5→4.4 display). Name the attribute + date.
  • 11
    SERP top-10 reshaped: new lower-priced listing, or new player at top position?
    YESShelf re-shaped. Who's new, their price vs yours, deal badges, reviews. Respond on price/coupon or outbid top-of-search.
  • 12
    PPC spend reduced vs compare window?
    YESName the exact keywords whose spend fell — budget cap, lost bids, paused campaign. Restore those first.
  • 13
    Any money keyword out of top 25? BA keyword count vs yesterday?
    YESOrganic slip. List each term old → new position + net BA keywords lost. Rank-recovery PPC on exactly those.
  • 14
    External signature: sessions ↓ · PPC flat (<±10%) · no listing change · a branded keyword gone from BA?
    YESExternal traffic dried up. Influencer / social / Google ads / affiliate stopped. Check campaigns + Attribution tags.
🧐 All 14 pass → widen the compare window and run the SQP cross-check per keyword: impressions collapsed = rank/indexing loss · impressions OK but clicks ↓ = tile CTR (image, price, rating) · clicks OK but purchases ↓ = it's actually conversion → Phase 4.
📝 Blind spots — log for the record (no data source): different variation showing for the keyword · displayed in upper/wrong category · top-of-search ad share & SERP layout shifts · Amazon's Choice / Best Seller / deal badge changes · strikethrough reference price removed.
4

Conversion gate chain — C1–C5

shelf changes hit CVR with ~1-day lag — compare vs date−1 too
  • C1
    Price & offer changed?
    price · coupon gone · "lowest in 30 days" basis / strikethrough disappeared
    YESOffer got worse. Restore the coupon, or hold price steady 30 days to re-earn the reference price.
  • C2
    Delivery & Buy Box intact on the page?
    fast promise beside the buy button · Buy Box present
    NODetail-page offer degraded. "See All Buying Options" = collapse. Root cause ≈ discovery gate 9 (regional stock) or eligibility.
  • C3
    Social proof shifted?
    rating · top-10 review order · negative on top · review videos · "What customers say" AI summary
    YESSocial proof is the killer. Shoppers read the top 3 reviews. Respond, drive fresh positives, answer the complaint in bullets/images.
  • C4
    Page content changed?
    main image · bullets · description / A+ · item details · docs — diff vs snapshot
    YESContent regression. Revert whichever change coincides with the CVR break date.
  • C5
    Competitor running a deal / new low-price entrant beside you?
    strongest evidence: your CVR inversely tracks their price series
    YESDeal siphoning buyers. Check price-drop dates (Keepa). Usually self-resolves — match with a coupon or wait; never permanently reprice against a 7-day deal.
All five pass → Page Views ÷ Sessions ratio: rising = shoppers returning & comparing → hesitation, most likely price · flat = straight conversion loss → content, images, reviews, offer.
trigger / culprit market move decision discovery path conversion path price / mix
Most of these gates need yesterday's data.

Read back through them: diff vs stored attribute snapshot, exact string diff vs snapshot, FC location count dropped >30%, BA keyword count vs yesterday. Every one compares today against a record of before — and Amazon keeps almost none of it for you. That is the actual work: capturing listing, offer, inventory and rank state daily, so the comparison already exists when sales move.

Asina tracks around 300 attributes per listing every day and runs this decision tree automatically — naming the failing gates, ranked, with the dates they broke.

Join the waitlist Or check whether a listing is set up to rank at all — free listing check, no account needed.
More answers Why did my Amazon sales drop suddenly? A diagnostic checklist Amazon conversion rate dropped — finding the cause Amazon keyword ranking dropped — what to check