Appearance
QA Checklist ​
Purpose: Task-oriented test checklist by feature area. Audience: QA, Developer, Product Prerequisites: Seeded data or test users; admin and non-admin accounts.
Listings
- Create listing:
/create-listing→ status draft → submit for review - Admin review:
/admin/listings→ add comment → approve → visible in/exploreand/listing/:id - Blurred fields: free user sees blurred financials; Starter/Pro sees full
- Edit listing: seller can update limited fields when active
- SQL quick checksql
select id, status, verification_status from listings order by created_at desc limit 5;
Offers & Deals
- Buyer:
/listing/:id→ Make offer → see in/my-offers - Seller: sees buyer offer; accept → Deal created →
/deal/:id - Funding: buyer uses test card; deal status advanced via webhook
- Admin payout/refund in
/admin/transactions - SQL quick checkssql
select id, listing_id, buyer_id, seller_id, status from offers order by created_at desc limit 5; select id, amount, status, stripe_payment_id from transactions order by created_at desc limit 5;
Subscriptions
- Upgrade Starter/Pro with
get-price-id→create-checkout→ Stripe Checkout URL opens - Customer portal opens from account settings
- Feature gating changes after activation (messaging limit, blurred fields)
- SQL quick checksql
select user_id, subscription_level, subscription_status, current_period_end from subscriptions order by updated_at desc limit 5;
Messaging
- Start conversation from listing; send message
- Mark read on opening thread; unread count decreases
- Email notification for new message (email logs)
- SQL quick checksql
select conversation_id, sender_id, read, created_at from messages order by created_at desc limit 10;
Notifications
- Realtime: new offer triggers seller email (and in-app) only for that seller
- Listing approved triggers seller email
- Admin polling discovers pending listings and reports
- SQL quick checksql
select user_id, type, message, read, created_at from notifications order by created_at desc limit 10;
Blog & Pages
- Blog:
/bloglists posts; open/blog/:slug - Admin blog: create/edit post, categories, publish → visible on public index
- Pages:
/page/:slugrenders published markdown with locale fallbacks - SQL quick checksql
select id, slug, published from blog_posts order by created_at desc limit 5;
Price Alerts
- Create alert; run
run-price-alertslocally; check events - Admin price alerts page shows latest
- SQL quick checksql
select id, alert_type, active, created_at from price_alerts order by created_at desc limit 5; select alert_id, listing_id, channel, status from price_alert_events order by created_at desc limit 5;
Admin flows
- Listings moderation, profile verification, templates test, contact messages
- See playbooks:
docs/operations/admin-flows-playbook.mddocs/operations/deals-payments-playbook.mddocs/operations/reports-analytics-playbook.md
Acceptance notes
- Verify RLS: guest/public can only see active listings; user can only modify own data
- Validate email_logs entries on all email flows (send_status, error_message)
- Confirm no secrets in client logs; env placeholders used in docs