KA26 Pre-Launch QA Checklist
Target launch: Thursday/Friday this week (2026-04-23 / 04-24) Owner: Siddu Last updated: 2026-04-18
This is the master pre-launch verification checklist. Every item is a real action you (or a tester) takes against production (ka26.shop, docs.ka-26.com, the v16 APK from ka-26.com/downloads/ka26-latest.apk). Check items off as you verify them. Items marked ๐จ BLOCKER must pass before going live; everything else is nice-to-have.
How to use this doc
- Pick a section. Run through every item. Replace
[ ]with[x]when verified.- If something fails, file it as a
### Bugblock at the bottom of this file with: surface, steps, expected vs actual, severity. Then fix or hand off.- Re-run the section after every fix to catch regressions.
- Three full clean passes through this doc = ship.
0. Pre-flight (do this once, before any QA session)โ
- Confirm hourly health cron is green: https://github.com/sidgk/ka26-marketplace/actions/workflows/health-check.yml โ last 24h all green
- Confirm Sentry has zero unresolved Critical issues for
ka26-marketplaceandka26-mobileprojects - Confirm Cloud Run service
ka26-marketplace(us-central1) is on the latest revision (gcloud run services describe ka26-marketplace --region us-central1 --format="value(status.latestReadyRevisionName)") - APK at https://ka-26.com/downloads/ka26-latest.apk reports v16 in the page UI AND is at least 89 MB (smaller = corrupted)
- DB has zero stuck
pendingorders older than 1 hour (SELECT id, createdAt FROM "Order" WHERE status='pending' AND "createdAt" < NOW() - INTERVAL '1 hour') - No env-var drift:
gcloud run services describe ka26-marketplace --region us-central1 --format="value(spec.template.spec.containers[0].env[].name)"includes all of:DATABASE_URL,JWT_SECRET,SMTP_USER,SMTP_PASS,EMAIL_FROM_ADDRESS,SENTRY_DSN,NEXT_PUBLIC_SENTRY_DSN,SENTRY_ENV,PAYMENTS_ONLINE_ENABLED,REELS_COMMERCE_ENABLED - Confirm
PAYMENTS_ONLINE_ENABLED=false(we go live with offline payments only) andREELS_COMMERCE_ENABLED=false
1. Consumer registration + auth (web AND mobile, both surfaces)โ
1A. Web (https://ka26.shop)โ
- ๐จ BLOCKER Open https://ka26.shop/consumer-auth in incognito, click "Sign up", fill name/email/8-char-password, submit โ see "Check your email for verification code"
- ๐จ BLOCKER Receive the OTP email at the inbox you used (sender:
noreply@ka-26.com, NOT spam folder, arrives within 2 min) - ๐จ BLOCKER Enter the 6-digit code โ land on
/shoplogged in - Try to sign up with a 6-char password โ instant inline error (NOT submit-then-reject)
- Try to sign up with
alllowercaseโ readable error "Password must contain at least one uppercase letter" (NOT[object Object]) - Try to sign up with an email that already exists โ readable error "An account with this email already exists"
- Try to sign up with no name โ readable error
- Try to log in with the wrong password โ "Invalid email or password" (no info leak about whether email exists)
- Click "Forgot password?" โ enter email โ receive reset email โ click link โ set new password โ can log in with new password
- Resend OTP cooldown works (60s)
- Logout button visible in profile โ clicking it logs out and lands on a public page
- After logout, accessing
/shopredirects to login (NOT crash, NOT empty state)
1B. Mobile (v16 APK, fresh install)โ
Repeat all of section 1A on the mobile app. Specifically check:
- ๐จ BLOCKER Password hint reads "8+ chars, A-Z, a-z, 0-9" (NOT "min 6 characters")
- OTP screen accepts pasting the full 6-digit code from the email
- No crash on backgrounding the app mid-OTP and returning
- Sentry mobile project shows no new errors during this flow
- If you intentionally trigger an error (e.g., turn off WiFi mid-submit), the error renders as readable text โ never
[object Object]or a raw stack trace
2. Consumer browse + discoveryโ
2A. Shop tabโ
- ๐จ BLOCKER
/shoploads within 5 sec on first visit (cold start), 1 sec subsequent - All store cards have non-broken images (look for the broken-image icon or empty squares)
- Tap a store card โ store detail loads, products visible, prices visible
- "My Ads" filter pill works (shows your own ads if you have any, empty state if not โ NOT
[object Object]) - Categories filter pills work (tap โ list narrows)
- Search bar filters in real-time
2B. Reels tabโ
- First reel autoplays
- Swipe down โ next reel plays
- Tap a reel โ like, comment, share buttons work
- Comment input opens keyboard (mobile), keyboard doesn't cover the input
- If REELS_COMMERCE_ENABLED=false, no product/store tag UI visible in any reel
2C. Requests tab (community)โ
- List loads, filter pills work (Newest/All/My Requests/I Helped)
- Public discussion requests show "PUBLIC" badge AND "Open Discussion" CTA (emerald)
- Private requests show "X/3" supporters count
- Tap a request โ detail opens
- Post a new request โ choose Public OR Private โ posts successfully
- On a private request, tap "Help" โ get added as supporter
- Receive push notification when someone comments on your request (if push permission granted)
2D. Profile tabโ
- Edit profile โ save โ reflected immediately
- My Ads tab in profile shows your ads (mobile bug fix from yesterday โ verify field is
adsnotproducts) - My Orders tab shows your past orders
- Settings โ notifications โ can toggle push on/off
- Language switcher (6 languages) โ pick Kannada โ all UI strings render in Kannada (no English fallbacks except brand names)
3. Order flow (end-to-end, BLOCKER for launch)โ
This is the revenue funnel. Every step must work.
- ๐จ BLOCKER From
/shop, find a real store, tap it - ๐จ BLOCKER Add a product to cart (the "Add" button must persist โ see
bugs_fixed.mdrule about AsyncStorage) - ๐จ BLOCKER Increase quantity from cart (quantity stepper +/โ works)
- ๐จ BLOCKER Proceed to checkout
- ๐จ BLOCKER Address selection works (existing address loaded OR can add new one)
- ๐จ BLOCKER Pickup option visible AND defaulted (since
PAYMENTS_ONLINE_ENABLED=false) - ๐จ BLOCKER Online payment option HIDDEN (must not be selectable while flag is off)
- ๐จ BLOCKER Place pickup order โ success screen with order number
- ๐จ BLOCKER Order appears in My Orders within 5 seconds
- ๐จ BLOCKER Seller receives notification (push + bell icon in seller dashboard)
- ๐จ BLOCKER Seller can see the order, mark it as "Ready for pickup" in their dashboard
- ๐จ BLOCKER Consumer receives push when order moves to "Ready"
- Try to switch payment method to "online" by editing the request โ server REJECTS (must return 503)
- Order detail page renders without errors (no
[object Object], no missing fields) - Cancel order flow works for an order in
pendingstate
4. Seller app (web, since you said /seller redirects)โ
4A. Seller registration + onboardingโ
- Open https://ka26.shop/seller/register in incognito
- Sign up as a brand new seller โ no "Restaurant" picker should appear (Eats was archived)
- Receive verification email
- Enter OTP, lands in seller dashboard
- If your seller plan from yesterday's deferred work was implemented, follow the onboarding wizard โ otherwise log into the existing test seller account
4B. Store managementโ
- Create a new store with name + address + phone
- Upload a store logo (โค 5 MB JPEG)
- Edit store hours
- Set store discount (e.g., 10% off)
- Save โ discount badge appears on consumer side
- Mark store as "Coming soon" โ consumer side shows "Coming soon" not "Live"
4C. Product managementโ
- Add a new product: name, price, description, image
- Image uploads (โค 5 MB, gets compressed to 1200x1200)
- Add 2nd, 3rd image โ carousel works on consumer detail page
- Edit product price โ reflects on consumer side within 30 sec (Cloud Run cache)
- Mark product "Out of Stock" โ consumer side shows greyed-out + "Back in Stock soon" โ NOT removed
- Delete product โ confirmation dialog โ product gone from consumer side
- Set per-product discount (originalPrice) โ strikethrough renders correctly
4D. Ordersโ
- Orders tab shows the order from section 3
- Mark order Ready โ consumer notified
- Mark order Picked Up โ consumer notified
- Filter by date range works
- Earnings tab shows correct total
4E. Notificationsโ
- Bell icon in seller header shows unread count
- Click bell โ notification list opens
- Mark all read โ count clears
- Browser push notification received when test consumer places an order (if permission granted)
5. Admin appโ
- Login at /admin with admin credentials (siddugkattimani@gmail.com)
- ๐จ BLOCKER Dashboard loads โ no
[object Object]anywhere - Stores tab โ list of all stores, can search/filter
- Sellers tab โ can edit a seller's status (active/disabled/pending)
- Disabling a seller โ that seller cannot log in next attempt
- Re-enabling โ seller can log in again
- Orders tab โ global view of all orders
- Cancel an order from admin โ works, consumer + seller both notified
- Categories CRUD โ can add a new category
- Reels admin โ can hide a reported reel
6. Delivery partner appโ
- Login at
/delivery_partner - Toggle online โ become available for assignments
- Test assignment from a delivery-mode order (NOT pickup) โ if delivery is enabled
- Accept order โ see pickup address, navigation link
- Mark picked up โ consumer notified
- Mark delivered โ order completes
Note: If delivery is disabled for launch (offline-only), skip section 6 โ but verify there's no leaked delivery UI on consumer side.
7. Cross-surface parity (web โ mobile)โ
For each feature, confirm the same data + behavior appears on both web and mobile (we caught 3 silent mismatches in one day last week):
- My Ads โ same ads visible on both
- My Orders โ same orders, same statuses, same details
- Public Discussion โ same PUBLIC badge logic on requests
- Categories โ same list of categories
- A store's products โ exact same list, prices, stock states
- Profile data โ name, phone, avatar all match
8. Performance + loadโ
- ๐จ BLOCKER Cold homepage load < 5 sec (first visit, fresh tab) on a 4G phone
- ๐จ BLOCKER Warm homepage load < 1 sec
- No layout shift during load (CLS < 0.1)
- Mobile app launch (cold) < 4 sec
- APK install size < 100 MB (currently 89 MB โ)
- No memory leak: leave the mobile app open for 30 min, switch tabs frequently โ RAM should stabilize, not grow unbounded
9. Security smoke (BLOCKER)โ
- ๐จ BLOCKER
/api/health?key=wrongreturns 401, not the health payload - ๐จ BLOCKER Cannot SQL-inject anywhere (try
' OR '1'='1in search, login email, address fields) - ๐จ BLOCKER XSS attempts on profile name
<script>alert(1)</script>get escaped, not executed - ๐จ BLOCKER Logged-out consumer cannot hit
/api/orders(401) - ๐จ BLOCKER Consumer A cannot read consumer B's orders by guessing IDs (
/api/orders/123returns 403/404) - ๐จ BLOCKER Seller cannot edit another seller's products
- All forms have CSRF protection (web) or token-based auth (mobile)
- HTTPS enforced โ http:// redirects to https://
- No secrets visible in browser dev tools (Network tab response bodies, console)
10. Mobile-specific edge casesโ
- App handles airplane mode gracefully โ readable error, not crash
- App handles slow 2G โ loading spinners, no infinite hang
- App handles backgrounding mid-action โ state preserved on return
- App handles permission denied (camera, location) โ graceful fallback UI
- App handles being killed by Android OOM killer โ relaunches into a sensible screen
- OTP autofill works on Android (read SMS permission, if granted)
- Deep links work: tapping a notification โ opens correct screen, not just the home
- Back button on Android exits the app (or shows confirm) from home, never crashes
11. Email deliverability (post-cutover sanity check)โ
- OTP email arrives in inbox (not spam) at gmail.com, outlook.com, yahoo.com โ test all three
- Order confirmation email arrives within 5 min of placing order
- Password reset email arrives within 5 min of request
- All emails render correctly on mobile email clients (Gmail mobile, Apple Mail)
- All emails contain unsubscribe link (legal requirement) โ broken? Add one before launch
- No emails contain
[object Object]orundefinedtext anywhere - DMARC report (rua=mailto:siddugkattimani@gmail.com) โ confirm zero failures in the last 24h
12. Monitoring + observability (must be set up BEFORE launch)โ
- Hourly health cron green for at least 24h consecutive
- Sentry web project receiving events
- Sentry mobile project receiving events
- UptimeRobot configured (per
docs/MONITORING-SETUP.mdLayer 1) โ at least one human-readable alert channel works - You have phone/email alerts configured for: Cloud Run service down, Cloud SQL instance down, hourly health cron failure
- You can find Cloud Run logs in GCP console within 10 sec (bookmarked URL?)
- You can roll back to the previous Cloud Run revision in 1 command (rehearse it)
13. Disaster rehearsals (do at least once before launch)โ
- Cold rollback drill: simulate a bad deploy by pushing a commit that throws on
/shopโ confirm hourly cron alerts you within 1 hour โ roll back viagcloud run services update-trafficto previous revision โ verify recovery - DB connection loss drill: temporarily revoke the Cloud SQL user's permissions โ verify
/api/healthreturns degraded โ restore permissions โ verify recovery - Email outage drill: rotate SMTP_PASS to a wrong value โ verify EmailLog records the failure โ restore โ verify retries succeed
- APK swap drill: build a v17 with a 1-line change, push the website, verify users with v16 can update without losing local data (logged-in state, draft posts, cart contents)
14. Legal / content (must be done before public launch)โ
- /terms page exists and reflects current policies
- /privacy page exists and mentions data we collect (name, phone, email, location, payment-method-but-no-payment-data-yet)
- /disclaimer page reviewed by lawyer (Tuesday meeting per MEMORY.md)
- /grievance page exists with grievance@ka-26.com contact (compliance for India e-commerce)
- About page mentions company name, address (registered office), customer support contact
15. Day-of-launch sanity (run this morning of launch day)โ
- Hourly cron last run is green (within last 60 min)
- Sentry critical issue count = 0
- Cold load https://ka26.shop in incognito โ < 5 sec
- APK download from ka-26.com/downloads โ installs cleanly, opens to login
- Place a real test order end-to-end as a fresh consumer
- Send a test OTP email โ arrives within 2 min
- WhatsApp number (+918197363421) responds (if you have a bot or person staffing it)
- Status page (if you have one) reflects green
If any of the above is red, DO NOT LAUNCH TODAY. Fix and re-run.
Bug log (open issues found during QA)โ
Use this format for any bug you find:
Bug templateโ
Surface: web / mobile / seller / admin / delivery Severity: blocker / high / medium / cosmetic Steps to reproduce: 1. 2. 3. Expected: Actual: Sentry link (if applicable): Status: open / fixing / fixed (commit hash)
(no bugs found yet โ this section will fill up during testing)โ
Pass log (when each section is fully green)โ
| Section | Pass 1 (date) | Pass 2 (date) | Pass 3 (date) |
|---|---|---|---|
| 0. Pre-flight | |||
| 1. Consumer auth | |||
| 2. Consumer browse | |||
| 3. Order flow | |||
| 4. Seller app | |||
| 5. Admin app | |||
| 6. Delivery (skip if offline) | |||
| 7. Cross-surface parity | |||
| 8. Performance | |||
| 9. Security | |||
| 10. Mobile edge cases | |||
| 11. Email | |||
| 12. Monitoring | |||
| 13. Disaster rehearsals | |||
| 14. Legal | |||
| 15. Day-of-launch |
Three full clean passes = ship. Two passes = ship cautiously. One pass = absolute minimum.