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
bigredNov 10–12 (2 days)november_promo$79$0$158.00
bigredNov 10–13 (3 days)november_promo$79$0$237.00
bigredNov 5–12 (7 days · T1)weekly$67.86$0$553.00
bigredNov 1–15 (14 days · T2)weekly$60.72$0$1106.00
bigredNov 1–30 (30 days · T3)weekly$55.99$0$2370.00
bigredNov 15 (1 day)single_day$89$50$154.99
skyNov 10–12 (2 days)november_promo$79$0$158.00
skyNov 10–13 (3 days)november_promo$79$0$237.00
skyNov 5–12 (7 days · T1)november_promo$79$0$553.00
skyNov 1–15 (14 days · T2)november_promo$79$0$1106.00
skyNov 1–30 (30 days · T3)weekly$62.99$0$2370.00
skyNov 15 (1 day)single_day$99$50$166.14
red-skyNov 10–12 (2 days)november_promo$79$0$158.00
red-skyNov 10–13 (3 days)november_promo$79$0$237.00
red-skyNov 5–12 (7 days · T1)november_promo$79$0$553.00
red-skyNov 1–15 (14 days · T2)november_promo$79$0$1106.00
red-skyNov 1–30 (30 days · T3)weekly$62.99$0$2370.00
red-skyNov 15 (1 day)single_day$99$50$166.14

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: $9/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.

✓ November promo is consistent

Every model at $79/day with IVU included for 2+ day rentals with November pickup, and cheaper configured weekly tiers still honoured — matching between frontend getDisplayRate and backend getDynamicPricing.

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/$500 deposit hold mentioned before checkout

PreCheckoutDisclosure on Step5Payment shows the refundable incidental hold ($500 for rentals of 2 days or less, $150 for 3 days or more) 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."

Transparent tax disclosure (Puerto Rico IVU)

Pricing shows the pre-tax subtotal, the 11.5% IVU (state 10.5% + municipal 1%), and the tax-inclusive total. Rates come from the centralized Tax Center configuration.

⚠ 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 refundable deposit hold ($150, or $500 for rentals of 2 days or less) 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