Peapod User Manual - Guest Guide Appendix

Version: v0.19.0 Last Updated: December 17, 2025 Platform: iOS (iPhone, iPad)

← Back to Guest Guide | Back to Index


Table of Contents


Appendix A: Commute Filter Technical Details

Geocoding Details

The filter accepts various address formats: - Full address: β€œ123 Main St, San Francisco, CA 94102” - Partial address: β€œGolden Gate Park, SF” - Landmarks: β€œMoscone Center” - Business names: β€œApple Park”

Geocoding Support: - Uses Apple’s MapKit geocoding service - Converts address text to GPS coordinates (latitude/longitude) - Green checkmark appears when location is successfully verified - Red error message shows if address can’t be found

Troubleshooting Geocoding: - β€œUnable to geocode address”: Try a more specific address or use a landmark name - β€œLocation verified” not showing: Tap β€œSet” button after entering address - Wrong location: Re-enter address with more detail (add city, state)

Filtering Algorithm

How Travel Time is Calculated: 1. User enters destination address 2. System geocodes destination to GPS coordinates 3. For each listing in database: - Calculate travel time from listing to destination - Use selected transport mode (Drive/Transit/Bicycle/Walk) - Compare against maximum time threshold 4. Only show listings within time limit

Transport Mode Details: - Drive: Uses car routing with real-time traffic data - Transit: Uses public transportation routes (bus, subway, train schedules) - Bicycle: Uses bike-friendly routes and paths - Walk: Uses pedestrian walkways

Per-Mode Persistence: Each transport mode remembers its own time setting: - Drive: 20 minutes - Transit: 40 minutes - Bicycle: 30 minutes - Walk: 15 minutes

When you switch modes, the last-used time for that mode is restored.

Performance

Session Memory: Your destination and time settings are saved when you close the app using UserDefaults:

UserDefaults.standard.set(destination, forKey: "commute_destination")
UserDefaults.standard.set(drivingTime, forKey: "commute_time_drive")
UserDefaults.standard.set(transitTime, forKey: "commute_time_transit")

Example User Flow:

Day 1: Set "123 Market St, SF" as destination
       Configure Drive: 20 min, Transit: 40 min
       Find and book a property

Day 2: Reopen app - settings automatically restored!
       Same destination, same time limits
       Continue searching without re-entering

Limitations

Known Limitations: - Travel times are estimates and may vary with traffic conditions - Transit times assume service is running (check schedules) - Bicycle times assume moderate fitness level - Walking times assume average walking speed (3-4 mph) - Remote areas may have limited transit/bicycle routing data

Best Practices: - Set realistic times per mode (20 min drive β‰  20 min walk!) - Use landmarks for easier entry (β€œSalesforce Tower” vs full address) - Compare Drive vs Transit modes (transit often faster in cities) - Increase max time if no results found - Combine with price filters for affordable & convenient options


Appendix B: Map View Technical Details

Search Circle Architecture

Visual Feedback: - Pink Circle Overlay: Shows your active search radius - Circle Center: Your search location (pin icon) - Dynamic Sizing: Circle grows/shrinks as you adjust radius - Auto-Zoom: Map zooms to fit entire circle when radius changes

Radius Control: - Range: 5-50 miles (8-80 km) - Default: 25 miles (40 km) - Adjustable: Via inline slider - Persistent: Saved in UserDefaults (survives app restart)

Understanding the Search Circle: - Pink circle overlay shows your active search radius - Default radius: 25 miles - Circle center marks your search location - Only listings inside the circle are displayed - Map automatically zooms to fit the entire circle

Inline Radius Control

What Changed (v0.14.7): - Before: Radius control buried in Filter sheet (4 taps to adjust) - After: Inline slider directly on map (instant adjustment)

Slider Interface: - Location: Bottom of map view (above listing cards) - Design: Horizontal slider with value labels - Range: 5 mi ←●─────→ 50 mi - Value Display: β€œ25 mi” updates in real-time - Interaction: Drag slider, circle updates immediately - Persistence: Preference saved to UserDefaults

How to Adjust Radius: 1. Open Map view 2. Find the inline slider at the bottom showing current radius (e.g., β€œ25 mi”) 3. Drag slider left to decrease radius: - Circle shrinks in real-time - Listings outside new radius disappear - Result count updates 4. Drag slider right to increase radius: - Circle expands - More listings appear - Result count increases 5. Release slider - map updates with new results

Session Persistence:

// Saved to UserDefaults
UserDefaults.standard.set(radiusMiles, forKey: "search_radius_preference")

// Restored on app launch
let savedRadius = UserDefaults.standard.double(forKey: "search_radius_preference")

Example User Flow:

Day 1: User sets radius to 10 miles β†’ Searches San Francisco β†’ Quits app
Day 2: User launches app β†’ Radius automatically 10 miles (not 25 default!)
Day 3: User increases to 35 miles β†’ Searches Seattle β†’ Closes app
Day 4: User launches app β†’ Radius still 35 miles βœ…

Map Search Controls

Top Navigation Bar:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ [Search πŸ”] [AI Search ✨]         [Sort] [Filter]  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Search Button (Left Side): - Icon: Magnifying glass - Label: β€œSearch” - Action: Opens SearchView sheet - Behavior: Search results update map immediately - Use Case: Enter specific city, address, or landmark

AI Search Button (Left of Sort): - Icon: Sparkles (✨) - Label: β€œAI Search” - Action: Opens AI natural language search - Behavior: AI interprets query β†’ Updates map pins - Use Case: β€œBeachfront condos under $200 with pool”

Sort Button (Top Right): - Icon: Sparkles (default) or arrows (price sort) - Label: β€œSort” - Color: Gray (default) β†’ Pink (custom sort active) - Action: Opens SimpleSortSheet - Behavior: Re-orders map pins and list cards

Using Map Search: 1. Tap β€œSearch” button (top left) on Map view 2. Enter your destination (e.g., β€œSan Diego”) 3. Map pans to the location and loads nearby listings

Using Map AI Search: 1. Tap β€œAI Search” button (sparkles icon) on Map view 2. Describe what you’re looking for (e.g., β€œDog-friendly cabins near Lake Tahoe under $150”) 3. AI interprets your query and updates the map with matching properties

Distance Display on Listing Cards

Distance Badge Design: - Location: Top-right corner of listing card - Format: β€œX.X mi” or β€œX.X km” - Background: White with shadow - Font: System, 12pt, semibold - Precision: 1 decimal place (e.g., β€œ2.4 mi”, not β€œ2.37 mi”)

When Distance Shows: - βœ… Map view (always visible) - βœ… List view (if Nearby Search used or β€œNearest First” sort active) - ❌ List view with no location context (search by city name only)

Distance Calculation:

// Haversine formula for accurate geodesic distance
func distance(from: CLLocationCoordinate2D, to: CLLocationCoordinate2D) -> Double {
    let earthRadius = 3959.0 // miles (use 6371.0 for km)
    let dLat = (to.latitude - from.latitude) * .pi / 180.0
    let dLon = (to.longitude - from.longitude) * .pi / 180.0

    let a = sin(dLat/2) * sin(dLat/2) +
            cos(from.latitude * .pi / 180.0) * cos(to.latitude * .pi / 180.0) *
            sin(dLon/2) * sin(dLon/2)

    let c = 2 * atan2(sqrt(a), sqrt(1-a))
    return earthRadius * c
}

Map Style Toggle

Map Styles:

  1. Standard (Default)
    • Clean street map
    • Labels for streets, landmarks, neighborhoods
    • Best for: General browsing, urban areas
    • Colors: Light gray roads, green parks, blue water
  2. Satellite
    • Aerial imagery
    • No street labels (pure satellite view)
    • Best for: Beachfront, scenic areas, understanding terrain
    • Use Case: β€œIs this really on the beach?” β€œHow close to mountains?”
  3. Hybrid
    • Satellite imagery + street labels
    • Best of both worlds
    • Best for: Detailed location verification
    • Use Case: β€œWhich side of highway?” β€œExact building location?”

How to Change Map Style: 1. Tap map style button (bottom-right corner) 2. Choose from Standard, Satellite, or Hybrid 3. Map transitions to your selected style 4. Your preference is automatically saved for future sessions

Saved Preference:

// UserDefaults key: "map_style_preference"
// Values: "standard" | "satellite" | "hybrid"
UserDefaults.standard.set("satellite", forKey: "map_style_preference")

PostGIS Backend Integration

Backend Filtering Benefits: - PostgreSQL PostGIS extension performs circle filtering on server - 30-40% less data transferred (only listings in radius sent to client) - Accurate geodesic distance calculations (not approximations) - Faster performance with database spatial indexes (GIST)

Before v0.14.7 (Frontend Filtering):

Client β†’ "Get all listings in San Diego" β†’ Server
Server β†’ Sends 10,000 listings β†’ Client
Client β†’ Filters 10,000 down to 142 in 25-mile radius
Result: 9,858 listings transferred but discarded (wasted bandwidth)

After v0.14.7 (Backend Filtering):

Client β†’ "Get listings within 25 miles of (32.7157Β°N, 117.1611Β°W)" β†’ Server
Server β†’ PostGIS ST_DWithin() query β†’ Filters to 142 listings
Server β†’ Sends only 142 listings β†’ Client
Result: 30-40% less data, faster load times

Database Query (PostGIS ST_DWithin):

-- Migration 061: Added PostGIS extension
CREATE EXTENSION IF NOT EXISTS postgis;

-- Query listings within radius (meters)
SELECT *
FROM listings
WHERE ST_DWithin(
    geography(ST_MakePoint(longitude, latitude)),
    geography(ST_MakePoint(-117.1611, 32.7157)),
    40233.6  -- 25 miles in meters
);

-- Performance: Uses GIST spatial index
CREATE INDEX idx_listings_geog ON listings
USING GIST (geography(ST_MakePoint(longitude, latitude)));

Performance Benefits: - ⚑ 30-40% faster map loads (less data over network) - ⚑ Accurate distances (geodesic, not Euclidean approximation) - ⚑ Scalable (handles millions of listings efficiently) - ⚑ Battery savings (less client-side processing)


Appendix C: Experience Bundles (Future Feature)

⚠️ Note: Experience Bundles are NOT available in CN Release 1.0. This feature is planned for a future release.

What Are Experience Bundles?

Optional add-ons during booking that let you enhance your stay with curated local activities, services, and amenities. Think of them as pre-packaged experiences that complement your accommodation.

Current Status: Not Available

Experience Bundles are NOT available in CN Release 1.0 (China). This section describes the planned functionality for future releases.

How Experience Bundles Will Work:

During checkout, you’ll see optional bundles tailored to: - Your destination city/region - Trip duration and dates - Detected trip type (romantic, family, adventure, etc.) - Property amenities and location - Seasonal events and activities

Example Bundle Categories:

🍷 Welcome & Essentials: - Welcome basket (local snacks, wine, coffee) - Pre-stocked groceries (breakfast essentials, dinner ingredients) - Fresh flowers and candles - Local guidebook and maps

🎯 Adventure & Activities: - Guided hiking tours - Kayak/paddleboard rentals - Wine tasting passes - Surf lessons - Rock climbing day passes - Bike rental packages

πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦ Family Experiences: - Zoo/aquarium tickets - Theme park passes - Kids’ activity kits - Babysitting service (2-4 hours) - Family photo session

πŸ’‘ Romantic Add-Ons: - Couples massage (in-unit or spa) - Champagne and chocolate - Rose petal setup - Private chef dinner - Sunset sailing

πŸ’Ό Business & Productivity: - Mobile hotspot rental (high-speed backup internet) - Printer/scanner rental - Meeting room access (coworking space) - Executive car service to meetings

πŸ• Food & Dining: - Restaurant reservations (hard-to-book spots) - Private chef dinner service - Wine/beer tasting tour - Cooking class - Meal delivery credits

How Bundles Will Be Presented:

  1. During Booking Flow:
    • After selecting dates and guests
    • Before payment confirmation
    • Bundles displayed as optional add-ons
  2. Smart Recommendations:
    • AI suggests 3-5 most relevant bundles
    • Based on trip intent, season, and property location
    • Examples: β€œPopular with families” or β€œGreat for couples”
  3. Bundle Details:
    • Clear pricing (one-time fee added to booking total)
    • What’s included (itemized)
    • When it’s delivered/activated (upon check-in, day 2, etc.)
    • Cancellation policy (refundable up to 48 hours before check-in)
    • Provider information (vetted local partners)

Example Booking Flow:

Booking Summary:
- 3 nights Γ— $120/night = $360
- Cleaning fee = $50
- Service fee = $41
───────────────────────
Subtotal: $451

Add Experience Bundles:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 🍷 Welcome Wine & Snacks Bundle     β”‚
β”‚ Local wine, artisan cheese, crackersβ”‚
β”‚ Delivered upon check-in             β”‚
β”‚ + $45                                β”‚
β”‚ [Add to Booking]                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 🚴 Mountain Bike Rental (2 days)    β”‚
β”‚ 2 bikes + helmets + trail map       β”‚
β”‚ Pick up at property                 β”‚
β”‚ + $80                                β”‚
β”‚ [Add to Booking]                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

[Skip and Continue to Payment]

Key Features:

  • βœ… Curated Quality - All providers pre-vetted by Peapod team
  • βœ… Seamless Integration - One payment, one confirmation
  • βœ… Host Coordination - Bundles coordinated with host for delivery/access
  • βœ… Flexible Cancellation - Refundable up to 48 hours before check-in
  • βœ… Local Expertise - Partnerships with best local providers
  • βœ… Dynamic Pricing - Discounts for bundling multiple experiences

Benefits to Guests:

  • Save Time - No need to research and book activities separately
  • Guaranteed Quality - Vetted partners and experiences
  • Better Pricing - Bundle discounts vs booking individually
  • Convenience - Everything coordinated and delivered
  • Local Discovery - Curated by people who know the area

Pricing Model:

  • Most bundles: $25-$150 per bundle
  • Premium experiences: $150-$500 (private chef, guided tours)
  • Add-on fee charged once (not per night)
  • Taxes included in displayed price
  • Payment processed with booking (single transaction)

Cancellation & Refunds:

  • Full refund if cancelled 48+ hours before check-in
  • 50% refund if cancelled 24-48 hours before check-in
  • No refund if cancelled <24 hours before check-in
  • Bundle cancellation does NOT cancel the accommodation booking

Provider Network:

Peapod partners with: - Licensed tour operators - Verified local businesses - Background-checked service providers - Insured activity companies - Established restaurants and venues

Safety & Quality Standards:

All experience providers must meet: - βœ… Proper licensing and insurance - βœ… Background checks for service providers - βœ… Safety certifications (for adventure activities) - βœ… 4+ star ratings from previous customers - βœ… COVID-19 safety protocols (as applicable)

Future Enhancements (Post-Launch):

  • Multi-Day Packages - Bundles spanning entire trip (e.g., β€œ3-Day Ski Package”)
  • Group Discounts - Pricing tiers for larger parties
  • Loyalty Integration - Earn points on bundle purchases
  • Host-Created Bundles - Hosts can offer custom local experiences
  • Gift Bundles - Purchase bundles for other guests as gifts

Feedback Welcome:

This feature is in active development. If you have ideas or requests for experience bundles you’d like to see, please contact support or leave feedback in the app.

Stay Updated:

  • Follow Peapod on social media for launch announcements
  • Check the app for beta testing opportunities
  • Email notifications when bundles launch in your area

Appendix D: Cancellation & Refund Policy (CN Release 1.0)

This appendix explains the cancellation policies available on Peapod. When you book a property, the host’s chosen cancellation policy is displayed before you confirm your reservation.

Understanding Cancellation Policies

Hosts choose one of the following cancellation policies for their listings:

Flexible Policy

Best for: Travelers who need maximum flexibility

When You Cancel Refund Amount
24+ hours before check-in 100% refund
Less than 24 hours before check-in No refund

Moderate Policy

Best for: Travelers with reasonably firm plans

When You Cancel Refund Amount
5+ days before check-in 100% refund
2-5 days before check-in 50% refund
Less than 2 days before check-in No refund

Strict Policy

Best for: Budget-conscious travelers who commit early

When You Cancel Refund Amount
7+ days before check-in 100% refund
7-30 days before check-in 50% refund
Less than 7 days before check-in No refund

How to Cancel a Booking

  1. Go to Trips tab
  2. Select the booking you want to cancel
  3. Tap Cancel Booking
  4. Review the refund amount based on the property’s cancellation policy
  5. Confirm cancellation
  6. Refund is processed automatically

Refund Processing Time

  • Credit/Debit Card: 5-10 business days
  • Apple Pay: 5-10 business days
  • Bank Account: 5-10 business days

Refunds are issued to the original payment method used for the booking.

Service Fees

  • Service fees are refundable only if the cancellation results in a full refund of the accommodation fees
  • Partial refunds do not include a service fee refund

Host Cancellations

If a host cancels your booking: - You receive a full refund including all service fees - You may receive booking credits for the inconvenience - Hosts who cancel frequently may have their listings penalized

Extenuating Circumstances

Full refunds may be provided outside the normal cancellation policy for: - Natural disasters affecting the property or your travel - Government-mandated travel restrictions - Serious illness or death (documentation required) - Other documented emergencies

Contact Peapod Support with documentation to request an extenuating circumstances review.

Tips for Guests

  • βœ… Check the policy before booking – it’s displayed on the listing detail page and at checkout
  • βœ… Book Flexible if your plans may change
  • βœ… Cancel early to maximize your refund
  • βœ… Message the host – some hosts may offer goodwill refunds outside their stated policy

← Back to Guest Guide | Back to Index