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
| Frame | Time | Screen | Details |
|---|---|---|---|
| 0 | 0s | Checkout + “Booking Failed” modal | ”Payment setup incomplete. Please try again.” $9.27 total, “I Have My Own Insurance” selected |
| 1-2 | 2-4s | Checkout page | Sun Mar 8 1PM → Tue Mar 10 10AM, Atlanta GA. Promo codes visible: WELCOME10, FIRSTTRIP15, FIRST50, WEEKEND5, WEEKLY20, OWNER30D15, OWNER90D25 |
| 3-4 | 6-8s | Price breakdown | 2), 1.00 communication fee, $3.99 technology fee |
| 5-6 | 10-12s | Insurance selection | QCR Standard (30, selected), Standard Full ($70) |
| 7 | 14s | Insurance selected | Basic Liability Coverage selected, total $42.09 |
| 8 | 16s | Same view | Standard Full Coverage grayed out, Basic Liability still selected |
| 9 | 18s | ”Booking Failed” modal #2 | Standard Full Coverage selected, total $85.29. Second attempt failed. |
| 10 | 20s | All insurance options | Premium Full Coverage (0). Standard Full (6.02 |
| 11 | 22s | ”Booking Failed” modal #3 | Third attempt. Total 9.22. |
| 12-13 | 24-26s | Checkout | ”I Have My Own Insurance” selected, $9.27. “Free cancellation up to 24 hours before pick-up” |
| 14-15 | 28-30s | Payment Methods page | Visa ending 4242 (test card), Default, Expires 10/2028. “Your payment info is securely stored with Stripe.” |
Vision’s Testing Pattern
- First attempt with “I Have My Own Insurance” ($9.27) → FAILED
- Switched to Basic Liability (42.09 → FAILED
- Switched to Standard Full Coverage (85.29 → FAILED
- Tried again, total jumped to $128.49 → FAILED
- Went back to own insurance ($9.27)
- Navigated to Payment Methods to prove his card IS saved (Visa 4242 test card)
- 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
canReceivePaymentsreturns false (requires:isCarOwner && stripeOnboardingComplete && stripeChargesEnabled)- Backend throws
STRIPE_NOT_SETUPatreservationPaymentResolvers.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)
- BookingForm.tsx:
useRefsynchronous double-click guard - reservationPaymentResolvers.ts: Duplicate check inside transaction with
LOCK.UPDATE - 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”