QCR Booking Bug — March 9, 2026

TestFlight Feedback

  • Reporter: Darrell “Vision” Alston (surrealistnation@gmail.com)
  • Device: iPhone 16 Pro, iOS 26.2
  • App: Quik Car Rental Dev 1.0.0 (93)
  • Date: March 9, 2026 at 9:35 AM
  • Quote: “I’ll send a screen recording but I cannot complete a booking even though the sample credit card data is saved.”

Video Analysis (30.7s screen recording, 16 frames extracted via OpenCV)

Full User Journey

FrameTimeScreenDetails
00sCheckout + “Booking Failed” modal”Payment setup incomplete. Please try again.” $9.27 total, “I Have My Own Insurance” selected
1-22-4sCheckout pageSun Mar 8 1PM → Tue Mar 10 10AM, Atlanta GA. Promo codes visible: WELCOME10, FIRSTTRIP15, FIRST50, WEEKEND5, WEEKLY20, OWNER30D15, OWNER90D25
3-46-8sPrice breakdown2), 1.00 communication fee, $3.99 technology fee
5-610-12sInsurance selectionQCR Standard (30, selected), Standard Full ($70)
714sInsurance selectedBasic Liability Coverage selected, total $42.09
816sSame viewStandard Full Coverage grayed out, Basic Liability still selected
918s”Booking Failed” modal #2Standard Full Coverage selected, total $85.29. Second attempt failed.
1020sAll insurance optionsPremium Full Coverage (0). Standard Full (6.02
1122s”Booking Failed” modal #3Third attempt. Total 9.22.
12-1324-26sCheckout”I Have My Own Insurance” selected, $9.27. “Free cancellation up to 24 hours before pick-up”
14-1528-30sPayment Methods pageVisa ending 4242 (test card), Default, Expires 10/2028. “Your payment info is securely stored with Stripe.”

Vision’s Testing Pattern

  1. First attempt with “I Have My Own Insurance” ($9.27) → FAILED
  2. Switched to Basic Liability (42.09 → FAILED
  3. Switched to Standard Full Coverage (85.29 → FAILED
  4. Tried again, total jumped to $128.49 → FAILED
  5. Went back to own insurance ($9.27)
  6. Navigated to Payment Methods to prove his card IS saved (Visa 4242 test card)
  7. Shows “stored with Stripe” — proving the issue is NOT on his end

Root Cause: TWO Separate Bugs

Bug 1 — STRIPE_NOT_SETUP (PRIMARY BLOCKER)

  • Car owner hasn’t completed Stripe Connect onboarding
  • canReceivePayments returns false (requires: isCarOwner && stripeOnboardingComplete && stripeChargesEnabled)
  • Backend throws STRIPE_NOT_SETUP at reservationPaymentResolvers.ts:308-314
  • Frontend shows generic “Payment setup incomplete” — no clear explanation
  • UX FAIL: Lets user fill out entire checkout form before failing at payment step

Bug 2 — DUPLICATE_BOOKING (RETRY LOOP)

  • Each failed attempt creates a PENDING reservation in the database
  • Backend duplicate check (outside transaction) blocks retries with DUPLICATE_BOOKING
  • Server logs showed 6+ duplicate booking errors in rapid succession
  • Fixed: Three-layer solution coded (useRef guard, transaction lock, context caching)

Fixes Applied (Not Yet Committed)

  1. BookingForm.tsx: useRef synchronous double-click guard
  2. reservationPaymentResolvers.ts: Duplicate check inside transaction with LOCK.UPDATE
  3. context.ts: 30-second in-memory cache for Clerk ID → DB user mapping

Still Needed

  • Car owner Stripe Connect onboarding must be completed for test vehicles
  • Frontend should check owner Stripe status BEFORE checkout — don’t let users reach payment if owner can’t accept
  • Better error message: Tell user the CAR OWNER needs to set up payments, not vaguely “payment setup incomplete”