1 · Empty states
No matching data. Lead user to recovery — never just "Nothing here".
No deals match those filters
Try widening price drop, removing rank cap, or switching marketplace. Big drops are rare in 24h windows.
No products tracked yet
Start with a single product. We'll watch its price and alert you when it drops below your target.
No products found
Looked for "vintage boba tea machine".
Tracking just started
First data point arrives within an hour. Come back to see prices fill in.
2 · Loading states
Skeletons mirror the final layout. Shimmer = "data on the way", not a spinner over a blank page.
3 · Error states
Tell user what broke + what to do. Always include retry.
Couldn't load deals
Our data service is briefly unavailable. Your filters are saved — try again in a moment.
Too many requests
Free tier is capped at 50 lookups / hour. Upgrade to Pro for unlimited or wait 22 minutes.
Product not found
ASIN B0XX99FAKE isn't in our index. It may be regional or recently delisted.
4 · Page-level fallback
When the whole route fails (uncaught exception, network down). Always have an escape hatch.
Something went sideways
An unexpected error knocked this page over. Our team gets a ping automatically. Refresh to try again, or head somewhere else.
err_id: 7f3a · 2026-04-28T12:42:18Z
5 · Usage notes
Always: icon + headline + 1-line cause + recovery action. Avoid "No data" — say WHY there's none.
Skeleton matches final layout (size + count). 1.4s shimmer. Reserve full-screen spinners for hard waits > 3s.
Code (4xx/5xx) + plain-language cause + retry. Don't blame user; don't expose stack traces.