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 | Oct 10–12 (2 days) | october_promo | $70 | $0 | $140.00 |
| bigred | Oct 10–13 (3 days) | october_promo | $70 | $0 | $210.00 |
| bigred | Oct 5–12 (7 days · T1) | october_promo | $70 | $0 | $490.00 |
| bigred | Oct 1–15 (14 days · T2) | october_promo | $70 | $0 | $980.00 |
| bigred | Oct 1–31 (30 days · T3) | october_promo | $70 | $0 | $2100.00 |
| bigred | Oct 15 (1 day) | single_day | $125 | $50 | $175.00 |
| sky | Oct 10–12 (2 days) | october_promo | $70 | $0 | $140.00 |
| sky | Oct 10–13 (3 days) | october_promo | $70 | $0 | $210.00 |
| sky | Oct 5–12 (7 days · T1) | october_promo | $70 | $0 | $490.00 |
| sky | Oct 1–15 (14 days · T2) | october_promo | $70 | $0 | $980.00 |
| sky | Oct 1–31 (30 days · T3) | october_promo | $70 | $0 | $2100.00 |
| sky | Oct 15 (1 day) | single_day | $150 | $50 | $200.00 |
| red-sky | Oct 10–12 (2 days) | october_promo | $70 | $0 | $140.00 |
| red-sky | Oct 10–13 (3 days) | october_promo | $70 | $0 | $210.00 |
| red-sky | Oct 5–12 (7 days · T1) | october_promo | $70 | $0 | $490.00 |
| red-sky | Oct 1–15 (14 days · T2) | october_promo | $70 | $0 | $980.00 |
| red-sky | Oct 1–31 (30 days · T3) | october_promo | $70 | $0 | $2100.00 |
| red-sky | Oct 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).
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
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