P0 Validation

Mobile Booking & Pricing Checks

Findings from code-level audit of the booking flow, October pricing tiers, and pre-checkout clarity. No app code or settings were changed.

P0-A: Mobile Booking Link Matrix

Both platforms · all available in-app browsers

DeviceBrowserEntry LinkStatusNotes
iOSSafari/book?vehicle=red-skyManual test neededOpen link → verify SPA loads → reach PayPal/checkout → verify return redirect
iOSFacebook In-App/book?vehicle=red-skyManual test neededOpen link → verify SPA loads → reach PayPal/checkout → verify return redirect
iOSInstagram In-App/book?vehicle=red-skyManual test neededOpen link → verify SPA loads → reach PayPal/checkout → verify return redirect
iOSWhatsApp In-App/book?vehicle=red-skyManual test neededOpen link → verify SPA loads → reach PayPal/checkout → verify return redirect
iOSChrome/book?vehicle=red-skyManual test neededOpen link → verify SPA loads → reach PayPal/checkout → verify return redirect
AndroidChrome/book?vehicle=red-skyManual test neededOpen link → verify SPA loads → reach PayPal/checkout → verify return redirect
AndroidFacebook In-App/book?vehicle=red-skyManual test neededOpen link → verify SPA loads → reach PayPal/checkout → verify return redirect
AndroidInstagram In-App/book?vehicle=red-skyManual test neededOpen link → verify SPA loads → reach PayPal/checkout → verify return redirect
AndroidSamsung Internet/book?vehicle=red-skyManual test neededOpen link → verify SPA loads → reach PayPal/checkout → verify return redirect
AndroidWhatsApp In-App/book?vehicle=red-skyManual test neededOpen link → verify SPA loads → reach PayPal/checkout → verify return redirect

⚠ Code-level risk identified

PayPalButton uses window.location.href = url to redirect. In Facebook/Instagram in-app browsers (webviews), the PayPal return URL uses window.location.origin. Verify the return redirect lands back in the same in-app browser session and the booking confirmation renders.

P0-B: October Rate Tier Matrix

All vehicles × all duration tiers · pickup in October

VehicleScenarioTierDaily RateCleaningTotal
bigredOct 10–12 (2 days)october_promo$70$0$140.00
bigredOct 10–13 (3 days)october_promo$70$0$210.00
bigredOct 5–12 (7 days · T1)october_promo$70$0$490.00
bigredOct 1–15 (14 days · T2)october_promo$70$0$980.00
bigredOct 1–31 (30 days · T3)october_promo$70$0$2100.00
bigredOct 15 (1 day)single_day$125$50$175.00
skyOct 10–12 (2 days)october_promo$70$0$140.00
skyOct 10–13 (3 days)october_promo$70$0$210.00
skyOct 5–12 (7 days · T1)october_promo$70$0$490.00
skyOct 1–15 (14 days · T2)october_promo$70$0$980.00
skyOct 1–31 (30 days · T3)october_promo$70$0$2100.00
skyOct 15 (1 day)single_day$150$50$200.00
red-skyOct 10–12 (2 days)october_promo$70$0$140.00
red-skyOct 10–13 (3 days)october_promo$70$0$210.00
red-skyOct 5–12 (7 days · T1)october_promo$70$0$490.00
red-skyOct 1–15 (14 days · T2)october_promo$70$0$980.00
red-skyOct 1–31 (30 days · T3)october_promo$70$0$2100.00
red-skyOct 15 (1 day)single_day$150$50$200.00

Code-vs-DB Default Mismatches

Low-season Wrangler rate: code default vs DB

Frontend defaults to $80, backend defaults to $90. DB has $80. If config fails to load, frontend shows $80 but backend returns $90.

Single-day cleaning fee: code default vs DB

Code defaults to $35. DB has $50. If config fails, customer sees $35 but DB expects $50.

Child seat daily: display vs charge

Fixed: Step2TripDetails and Step3Extras now read the rate via getChildSeatDaily(), which always matches the value calculatePricing() charges. DB config: $10/day (fallback $9/day if config load fails).

Half-payment discount: code default vs DB

Code defaults to 7% discount. DB has 0%. If config fails, 7% discount is wrongly applied.

✓ October promo is consistent

Sky & Red Sky at $70/day for 2+ day rentals with October pickup — matching between frontend getDisplayRate and backend getDynamicPricing. Big Red stays at $80/day (low-season Wrangler rate).

P0-C: Coverage, Liability & Final Price Clarity

What the customer sees before confirming

Itemized price breakdown on mobile at checkout

Step5Payment shows the payment amount and PreCheckoutDisclosure. Full itemized breakdown is on Step 1 and the desktop sidebar; mobile shows a compact total bar.

Liability waiver visible on payment step

PreCheckoutDisclosure (added to Step5Payment) surfaces the no-insurance summary and a "View full requirements" link to the Insurance tab.

$150 deposit hold mentioned before checkout

PreCheckoutDisclosure on Step5Payment shows the $150 refundable hold before the customer pays. Also in BookingPriceSidebar.

RentalCover.com link on payment step

Present in Step5Payment.

Free cancellation policy visible

Shown on Step5Payment: "Full refund when canceled more than 2 hours before pickup."

All-inclusive pricing (no hidden tax)

Prices are all-inclusive; taxAmount is 0 in calculatePricing.

⚠ Key gap

On mobile, the itemized price breakdown (daily rate × days, add-ons, discounts, delivery) is shown on Step 1 but NOT repeated on the final Payment step. The customer sees only the total and the payment amount. The liability waiver and $150 deposit hold live on a separate Insurance tab — a customer who goes straight to /book may never see them before confirming.

Summary

1 issue fixed · 2 advisories remaining

Child seat display

Fixed — display and charge now use the same configured rate

Mobile checkout clarity

PreCheckoutDisclosure added to payment step (hold + liability)

Config default risk

3 advisory defaults still differ between code and DB