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.
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.
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
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
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
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.