P0 Validation
Findings from code-level audit of the booking flow, October pricing tiers, and pre-checkout clarity. No app code or settings were changed.
Both platforms · all available in-app browsers
| Device | Browser | Entry Link | Status | Notes |
|---|---|---|---|---|
| iOS | Safari | /book?vehicle=red-sky | Manual test needed | Open link → verify SPA loads → reach PayPal/checkout → verify return redirect |
| iOS | Facebook In-App | /book?vehicle=red-sky | Manual test needed | Open link → verify SPA loads → reach PayPal/checkout → verify return redirect |
| iOS | Instagram In-App | /book?vehicle=red-sky | Manual test needed | Open link → verify SPA loads → reach PayPal/checkout → verify return redirect |
| iOS | WhatsApp In-App | /book?vehicle=red-sky | Manual test needed | Open link → verify SPA loads → reach PayPal/checkout → verify return redirect |
| iOS | Chrome | /book?vehicle=red-sky | Manual test needed | Open link → verify SPA loads → reach PayPal/checkout → verify return redirect |
| Android | Chrome | /book?vehicle=red-sky | Manual test needed | Open link → verify SPA loads → reach PayPal/checkout → verify return redirect |
| Android | Facebook In-App | /book?vehicle=red-sky | Manual test needed | Open link → verify SPA loads → reach PayPal/checkout → verify return redirect |
| Android | Instagram In-App | /book?vehicle=red-sky | Manual test needed | Open link → verify SPA loads → reach PayPal/checkout → verify return redirect |
| Android | Samsung Internet | /book?vehicle=red-sky | Manual test needed | Open link → verify SPA loads → reach PayPal/checkout → verify return redirect |
| Android | WhatsApp In-App | /book?vehicle=red-sky | Manual test needed | Open 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.
All vehicles × all duration tiers · pickup in October
| Vehicle | Scenario | Tier | Daily Rate | Cleaning | Total |
|---|---|---|---|---|---|
| bigred | Nov 10–12 (2 days) | november_promo | $79 | $0 | $158.00 |
| bigred | Nov 10–13 (3 days) | november_promo | $79 | $0 | $237.00 |
| bigred | Nov 5–12 (7 days · T1) | weekly | $67.86 | $0 | $553.00 |
| bigred | Nov 1–15 (14 days · T2) | weekly | $60.72 | $0 | $1106.00 |
| bigred | Nov 1–30 (30 days · T3) | weekly | $55.99 | $0 | $2370.00 |
| bigred | Nov 15 (1 day) | single_day | $89 | $50 | $154.99 |
| sky | Nov 10–12 (2 days) | november_promo | $79 | $0 | $158.00 |
| sky | Nov 10–13 (3 days) | november_promo | $79 | $0 | $237.00 |
| sky | Nov 5–12 (7 days · T1) | november_promo | $79 | $0 | $553.00 |
| sky | Nov 1–15 (14 days · T2) | november_promo | $79 | $0 | $1106.00 |
| sky | Nov 1–30 (30 days · T3) | weekly | $62.99 | $0 | $2370.00 |
| sky | Nov 15 (1 day) | single_day | $99 | $50 | $166.14 |
| red-sky | Nov 10–12 (2 days) | november_promo | $79 | $0 | $158.00 |
| red-sky | Nov 10–13 (3 days) | november_promo | $79 | $0 | $237.00 |
| red-sky | Nov 5–12 (7 days · T1) | november_promo | $79 | $0 | $553.00 |
| red-sky | Nov 1–15 (14 days · T2) | november_promo | $79 | $0 | $1106.00 |
| red-sky | Nov 1–30 (30 days · T3) | weekly | $62.99 | $0 | $2370.00 |
| red-sky | Nov 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.
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
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