Analysis Date: July 2025
Iteration: 2 (builds on ANALYSIS.md — all 10 original features now implemented)
Codebase Size: ~6,291 lines across 40 source files
Maturity: Advanced MVP — full vertical slice with 21 committed features
The original ANALYSIS.md proposed 10 features. All 10 have been implemented:
| # | Feature | Status | Evidence |
|---|---|---|---|
| 1 | Real Booking & Payments | ✅ Built | booking/[experienceId]/page.tsx — 3-step flow with date/guest selection, price calc (10% platform fee), Stripe-ready fields in Prisma |
| 2 | Authentication & User Accounts | ✅ Built | auth/login/page.tsx, auth/register/page.tsx, lib/auth.ts — session-cookie auth, role-based (tourist/host/admin), magic link UI, Google OAuth button |
| 3 | Multi-Language (i18n) | ✅ Built | lib/i18n/translations.ts — 712 lines, 5 locales (it/en/de/fr/es), full UI string coverage, language-switcher.tsx dropdown |
| 4 | Persistent Database & Full Prisma Schema | ✅ Built | prisma/schema.prisma — 12 models (User, Session, HostProfile, Experience, Availability, Booking, Payment, Review, Wishlist, SavedItinerary, CyclingRoute, CyclingRouteExperience) |
| 5 | Interactive Map Experience | ✅ Built | experience-map.tsx — category-colored pins, grouped by location, selected-experience drawer, deep links |
| 6 | AI-Powered Itinerary Engine | ✅ Built | itinerary/page.tsx + api/itinerary/ai/route.ts — chat-style prompt, multi-day generation from real experience data |
| 7 | Host Dashboard & Listing Management | ✅ Built | dashboard/ — 4 pages (overview, listings, bookings, analytics), stat cards, mock charts, auth-gated |
| 8 | SEO & Content Engine | ✅ Built | json-ld.tsx (Website/TouristTrip/SportsActivity schemas), sitemap.ts, robots.ts, per-page metadata |
| 9 | Review & Rating System | ✅ Built | review-form.tsx + api/reviews/route.ts — star rating, verified reviews, host responses, experience-linked |
| 10 | Cycling Routes Module | ✅ Built | cycling/ — 5 seed routes, difficulty filters, elevation profiles, GPX data field, linked experiences, e-bike upsell CTA |
Current Architecture Summary:
- 40 source files, 12 Prisma models, 10 API endpoints, 14 page routes
- In-memory data stores with Prisma schema ready for migration
- Session-cookie auth (no real OAuth/JWT yet)
- Simulated payments (Stripe fields in schema, no SDK integration)
- 5-locale translation system (localStorage-based, no route-based locale switching)
- All seed data: 11 experiences, 5 cycling routes, 2 users, generated availability
Before proposing new features, here are the critical integration gaps in the current implementation:
| Gap | Severity | Detail |
|---|---|---|
| No real Stripe SDK | 🔴 Critical | Prisma has stripePaymentId/stripeAccountId fields but no Stripe library is installed. Booking flow simulates payment. |
| No real OAuth provider | 🟡 High | Login page has Google/magic link buttons but lib/auth.ts is a 24-line cookie reader. No NextAuth/Auth.js installed. |
| i18n not route-based | 🟡 High | Language switcher stores locale in localStorage but there's no /en/, /de/ route prefixing — SEO loses multilingual indexing. No next-intl installed. |
| InMemory → Prisma gap | 🟡 High | 12-model Prisma schema exists but all runtime data comes from InMemoryStore. No migration path wired. |
| Map is CSS-only | 🟠 Medium | experience-map.tsx renders a custom SVG/CSS map, not Mapbox/MapLibre. No real tile rendering or geospatial features. |
| No image upload pipeline | 🟠 Medium | All visuals are CSS gradients. No Cloudinary/S3, no next/image optimization for real photos. |
| No email/notification system | 🟠 Medium | Booking confirmations, review prompts, host alerts — all absent. No Resend/SendGrid. |
| No testing | 🟠 Medium | Zero test files. No unit, integration, or E2E tests. |
| Dashboard analytics are mock | 🟡 Low | Bar charts use hardcoded monthly arrays, not derived from real booking data. |
Since Iteration 1, the platform has moved from "catalog prototype" to "full vertical slice." The competitive gap analysis shifts:
| Dimension | Then (Iter 1) | Now (Iter 2) | Next Gap to Close |
|---|---|---|---|
| Booking capability | ❌ No booking | ✅ Full booking flow | Real payment processing |
| User accounts | ❌ Anonymous only | ✅ Auth + roles | OAuth + social login |
| Multilingual | ❌ Italian-only | ✅ 5-language strings | Route-based locale URLs for SEO |
| Data persistence | ❌ InMemory | Actual Prisma migration | |
| Discovery | ❌ List only | ✅ Map + filters + AI | Real map tiles + search |
| Social proof | ❌ Seed reviews | ✅ Review system | Photo reviews + trust signals |
| Cycling | ❌ None | ✅ Full module | Strava/Komoot integration |
| Host tools | ❌ None | ✅ Dashboard + analytics | Real listing CRUD + photo upload |
With the foundation built, the next growth vector shifts from "build the basics" to "create defensible moats and network effects":
- Guest-to-guest referrals — no viral loop exists; every booking is a dead end
- Host-side network effects — hosts can't message guests, share content, or cross-promote
- Seasonal demand shaping — no pricing intelligence, no seasonal campaigns
- Mobile experience gap — no PWA, no offline capability for tourists on poor rural connectivity
- Data moat — no analytics flywheel turning bookings into better recommendations
- B2B channel — no group booking, corporate events, or travel agency integration
Scoring Criteria: User Impact (40%) · Market Differentiation (30%) · Adoption Potential (20%) · Technical Leverage (10%)
| # | Feature Name | Description | Why Implement | Complexity | Impact |
|---|---|---|---|---|---|
| 1 | Guest Messaging & Host Chat | Real-time messaging between guests and hosts, pre-booking inquiries, post-booking coordination (meeting point reminders, dietary preferences, group details). Notification system via email + in-app. | Tourism bookings need human coordination. 60%+ of Airbnb bookings involve pre-booking messages. Without messaging, complex experiences (private dinners, group cycling) can't coordinate logistics. Enables trust-building that converts browsers to bookers. | High | 10 |
| 2 | Smart Pricing & Revenue Engine | Dynamic pricing system: seasonal multipliers (grape harvest +30%, winter -20%), weekend premiums, early-bird discounts, last-minute deals, group discount tiers. Dashboard for hosts to set pricing rules. AI-suggested optimal pricing based on demand patterns and competitor analysis. | Static pricing leaves 20-30% revenue on the table. Grape harvest weekends in Bertinoro should cost more than a Tuesday in February. This is the difference between a marketplace and a catalog — and creates a data moat competitors can't replicate. | Medium | 9 |
| 3 | Progressive Web App (PWA) with Offline Mode | Service worker for offline access, cached itineraries/maps/booking confirmations, push notifications (booking reminders, review prompts, seasonal campaigns). Install prompt for home screen. Offline-first architecture for rural areas with poor connectivity. | Romagna's hill towns have spotty mobile coverage. A tourist driving from Bertinoro to Premilcuore loses signal for 20+ minutes. Cached itineraries, meeting point directions, and offline maps are not a luxury — they're a necessity. PWA also enables push notifications, the highest-converting re-engagement channel. | Medium | 9 |
| 4 | Photo & Media Pipeline | Cloudinary/S3 integration for experience photos, host avatars, review images. Auto-optimization via next/image, responsive srcsets, WebP/AVIF conversion. Host photo upload with drag-and-drop, reordering, and auto-crop. Professional photography booking service as an upsell (€99/listing). |
The #1 conversion killer right now is gradient placeholders instead of real photos. Tourism is a visual-first industry — listings with professional photos convert 3-5x better. This unblocks the entire platform from "demo" to "production." | Medium | 9 |
| 5 | Gift Cards & Experience Vouchers | Purchasable gift cards (€25/50/100/custom) with branded PDF/email delivery. Redeemable against any experience. Corporate bulk purchase API for team-building gifts. Expiration management, partial redemption, transferability. | Gift cards solve the "cold start" problem for a marketplace. They generate revenue without requiring immediate supply-side fulfillment, create pre-committed demand, and are the #1 requested feature for experience platforms (30%+ of Airbnb Experience revenue in December is gift purchases). Perfect for Christmas/Valentine's/birthday gifting. | Medium | 8 |
| 6 | Seasonal Content & Campaign Engine | Automated seasonal landing pages: Vendemmia (Sep-Oct), Tartufo (Nov), Olio Nuovo (Dec), Primavera Ciclabile (Mar-Apr). Each campaign gets a dedicated URL, curated experience collection, blog content, email blast template, and social media assets. Admin CMS to create/schedule campaigns. | Tourism is intensely seasonal. The platform currently treats all months equally. A "Vendemmia 2025" landing page targeting "grape harvest Italy" keywords would capture high-intent traffic that currently goes nowhere. Campaign pages also give hosts something to share on social media, creating organic distribution. | Medium | 8 |
| 7 | Group Booking & Corporate Events | Multi-experience group booking for 10-50+ people: corporate retreats, wedding parties, bachelor/ette groups, school trips. Custom quote request flow, dedicated event coordinator assignment, combined invoicing, group transportation add-on. | Corporate and group events are 5-10x higher AOV than individual bookings. A company booking a team-building day (cooking + wine + cycling) for 20 people = €2,000+ single transaction. This segment is completely underserved in Romagna and represents the fastest path to meaningful revenue. | High | 8 |
| 8 | Referral & Loyalty Program | Guest referral system: share a unique link → referred friend gets €10 off first booking → referrer gets €10 credit after friend completes experience. Loyalty tiers: Bronze (1 booking) → Silver (3) → Gold (5+) with escalating perks (early access, free upgrades, exclusive experiences). | The platform currently has zero viral mechanics. Every booking is a dead end. Referrals are the lowest-CAC acquisition channel for marketplace businesses. Combined with loyalty tiers, this creates switching costs that lock in repeat visitors — critical for building a defensible user base before competitors notice the opportunity. | Medium | 8 |
| 9 | Strava & Komoot Deep Integration | OAuth-connect Strava/Komoot accounts. Auto-import completed rides on VisitRomagna cycling routes. Leaderboard for route segments. "Ride this route" deep links into Strava/Komoot apps. Social sharing of completed routes with experience photos. Strava Club for VisitRomagna community. | Cycling tourism is the highest-growth segment (€8B+ European market). Strava has 100M+ users. Deep integration creates a distribution channel that reaches exactly the right audience — fitness-oriented travelers who spend 3-5x more than average tourists. No Romagna cycling platform has this integration. | Medium | 7 |
| 10 | Multi-Stop "Book Entire Itinerary" Checkout | One-click checkout for entire AI-generated or manually-curated itineraries. Split payments across multiple hosts, combined calendar validation, unified confirmation with day-by-day schedule PDF. "Add to itinerary" button on every experience detail page. Shareable itinerary links for group coordination. | The AI itinerary builder generates multi-day plans but each experience must be booked individually — a massive conversion leak. Competitors don't offer multi-stop checkout for rural tourism. This is the killer feature that turns VisitRomagna from "experience marketplace" into "trip platform," dramatically increasing AOV (€150-300 per itinerary vs €35 per experience). | High | 7 |
- Effort Estimate: 5-6 person-weeks
- Prerequisites: Auth system active (done), real database migration (needed), email provider setup
- Implementation Phases:
- Data Model & API — New Prisma models:
Conversation(participants, experienceId, bookingId),Message(senderId, content, readAt, attachments). REST endpoints for CRUD + mark-as-read. Server-Sent Events or polling for real-time updates — 1.5 weeks - Chat UI — Inbox page at
/messageswith conversation list (unread badges). Chat thread view with message bubbles, timestamps, typing indicators. Pre-booking inquiry flow: "Ask host a question" button on experience detail → creates conversation — 2 weeks - Notification Layer — Email notifications via Resend: new message alert, booking confirmation, review prompt (3 days post-experience). In-app notification bell in navbar with unread count. Notification preferences in user profile — 1.5 weeks
- Host Automation — Quick-reply templates for hosts. Auto-messages: booking confirmation with meeting point/directions, day-before reminder with weather forecast link, post-experience thank you + review prompt — 1 week
- Data Model & API — New Prisma models:
- Success Metrics: 50%+ of bookings have at least one pre-booking message; host response time <4 hours median; 30%+ of messages lead to booking
- Risks & Mitigations:
- Real-time complexity → Start with polling (30s interval), upgrade to SSE/WebSocket when traffic justifies
- Spam/abuse → Rate limit messages per conversation; require auth; content moderation on report
- Host overwhelm → "Quick reply" templates; auto-reply for common questions (directions, parking, dietary options)
- Effort Estimate: 4-5 person-weeks
- Prerequisites: Booking data persistence, availability system, host dashboard
- Implementation Phases:
- Pricing Rules Engine — Define pricing rule types: seasonal multiplier (date range → percentage), day-of-week adjustment, group size tiers, early-bird (>30 days) / last-minute (<48h) modifiers. Store as JSON rules on Experience or Availability model — 1.5 weeks
- Host Pricing Dashboard — UI for hosts to configure pricing rules: calendar heatmap showing price per date, drag-to-select date ranges for seasonal pricing, preview of price changes. "Suggested price" based on category averages — 1.5 weeks
- Price Calculation Service — Server-side price resolver that applies all applicable rules in priority order. Price breakdown shown to guest: base price + seasonal adjustment + group discount = total. Cache computed prices for 15-minute windows — 1 week
- Demand Analytics — Track views-to-booking conversion by date/price. Surface insights to hosts: "Your Tuesday slots are 80% empty — consider a 15% weekday discount." A/B testing framework for price experiments — 1 week
- Success Metrics: 60%+ of hosts set at least one pricing rule; 15%+ revenue increase from dynamic pricing vs flat; weekday booking rate increases 25%
- Risks & Mitigations:
- Pricing complexity for hosts → Default to flat pricing; advanced rules optional; "smart pricing" toggle that auto-optimizes
- Guest confusion → Always show price breakdown; no hidden fees; "price lock" for 15 minutes after viewing
- Effort Estimate: 3-4 person-weeks
- Prerequisites: None (can begin immediately on current codebase)
- Implementation Phases:
- Service Worker & Manifest —
next-pwaor custom service worker. Cache static assets, API responses for viewed experiences, and user's booked itinerary. Web app manifest with Romagna-themed icons and splash screens. Install prompt logic — 1 week - Offline Experience Pages — Pre-cache detail pages for booked experiences and saved itineraries. Offline fallback page with cached content. IndexedDB for offline booking confirmations with meeting point directions — 1 week
- Push Notifications — Web Push API registration. Notification types: booking confirmation, day-before reminder with weather, review prompt (3 days post), seasonal campaign alerts. User preference management — 1 week
- Offline Maps — Cache map tiles for Romagna region (Forlì-Cesena bounding box). Offline cycling route display from cached GPX data. "Download for offline" button on cycling route detail pages — 1 week
- Service Worker & Manifest —
- Success Metrics: 15%+ of returning users install PWA; offline page loads <500ms; push notification opt-in rate >30%; 2x engagement from push-notified users
- Risks & Mitigations:
- Cache staleness → Stale-while-revalidate strategy; version-based cache busting; max 24h cache for availability data
- iOS PWA limitations → Test on Safari/iOS; graceful fallback for unsupported features; focus on Android-first (larger European market share)
- Effort Estimate: 3-4 person-weeks
- Prerequisites: Cloud storage account (Cloudinary free tier or S3), database migration for image URLs
- Implementation Phases:
- Upload Infrastructure — Cloudinary SDK integration. Signed upload URLs from API endpoint. Client-side image preview, crop (aspect ratio enforcement: 16:9 hero, 1:1 avatar), and compression before upload. Max 10 photos per experience, 5 per review — 1.5 weeks
- Image Optimization — Replace all gradient placeholders with
next/imagecomponent using Cloudinary loader. ResponsivesrcSetfor mobile/tablet/desktop. WebP/AVIF auto-format. Blur placeholder generation (BlurHash) — 1 week - Host Photo Management — Drag-and-drop photo reordering in listing editor. Cover photo selection. Gallery management with delete/replace. Alt text input for accessibility and SEO — 1 week
- Photography Service — "Book a photographer" CTA on host dashboard. Simple form → email to local photography partner. Track photography status per listing. Before/after conversion metrics — 0.5 weeks
- Success Metrics: 90%+ of listings have real photos within 60 days; page load time stays <3s with images; image-equipped listings convert 3x better than gradient placeholders
- Risks & Mitigations:
- Storage costs → Cloudinary free tier: 25GB storage, 25GB bandwidth/month. Sufficient for first 500 listings
- Photo quality variance → Provide hosts with photography guidelines (lighting, composition); auto-enhance via Cloudinary transformations
- Legal/copyright → Terms of service requiring photo ownership; EXIF metadata stripping for privacy
- Effort Estimate: 4-5 person-weeks
- Prerequisites: Stripe integration (for payment processing), email system (for delivery)
- Implementation Phases:
- Gift Card Model — New Prisma models:
GiftCard(code, amount, balance, purchaserId, recipientEmail, expiresAt, status).GiftCardRedemption(giftCardId, bookingId, amount). Unique code generation (8-char alphanumeric) — 1 week - Purchase Flow —
/gift-cardspage with denomination options (€25/50/100/custom). Recipient details (name, email, personal message). Stripe checkout for gift card purchase. Immediate email delivery with branded PDF attachment — 1.5 weeks - Redemption & Checkout Integration — "Have a gift card?" input on booking checkout. Balance validation, partial redemption support, remaining balance display. Apply gift card as payment method alongside card payment for any remainder — 1 week
- Corporate & Bulk —
/gift-cards/corporatepage. Bulk purchase form (quantity, per-card amount, company name). Volume discount tiers (10+ cards: 5% off, 50+: 10% off). CSV upload for recipient list. API endpoint for programmatic purchase — 1 week
- Gift Card Model — New Prisma models:
- Success Metrics: €5K+ gift card revenue in first holiday season; 60%+ redemption rate within 6 months; 15%+ of redeemers become repeat bookers
- Risks & Mitigations:
- Fraud/abuse → Rate limit purchases; velocity checks; require card verification for high-value purchases
- Accounting complexity → Gift cards are deferred revenue (liability until redeemed); track in Stripe as separate product
- Expiration regulations → EU consumer law requires minimum 2-year validity; configure accordingly
- Effort Estimate: 3-4 person-weeks
- Prerequisites: CMS integration (or markdown-based content), i18n for multilingual campaigns
- Implementation Phases:
- Campaign Data Model — New Prisma model:
Campaign(slug, title, description, heroImage, startDate, endDate, experienceIds, status). Admin UI to create/edit campaigns with WYSIWYG content — 1 week - Campaign Pages — Dynamic
/campaigns/[slug]route. Hero section with seasonal imagery, curated experience grid, blog-style editorial content, booking CTAs. Auto-generate from template: "Vendemmia 2025" → pre-filled with wine experiences from Sep-Oct — 1 week - SEO & Distribution — Campaign-specific JSON-LD (Event schema). Auto-add to sitemap. Open Graph images per campaign. Email blast template with Resend: subscriber list, scheduled send, A/B subject line testing — 1 week
- Year-Round Calendar — Admin calendar view showing all campaigns. One-click "clone last year's campaign" with date shift. Performance dashboard: campaign page views → bookings attribution — 0.5 weeks
- Campaign Data Model — New Prisma model:
- Success Metrics: 4+ seasonal campaigns per year; campaign pages rank top-10 for seasonal keywords within 2 months; 20%+ of campaign email recipients click through; 5%+ book
- Risks & Mitigations:
- Content creation burden → Template system reduces effort to 2-3 hours per campaign; AI-assisted copy generation
- Seasonal demand concentration → Use campaigns to promote off-season activities (winter cooking classes, thermal spa)
- Effort Estimate: 5-6 person-weeks
- Prerequisites: Messaging system (Feature 1), payment system, availability calendar
- Implementation Phases:
- Group Booking Model — New Prisma models:
GroupBooking(organizerId, type [corporate/wedding/school/private], guestCount, dateRange, experiences[], status, notes).GroupQuote(groupBookingId, totalPrice, validUntil, terms). Extend Booking to reference optional GroupBooking — 1 week - Request Flow —
/groupslanding page with use case cards (team building, weddings, school trips). Multi-step inquiry form: event type → group size → preferred dates → experience interests → budget range → dietary/accessibility needs. Auto-generate quote based on selected experiences × group size with volume discount — 2 weeks - Coordinator Dashboard — Admin/host view for managing group requests. Quote builder: mix-and-match experiences, apply custom pricing, add transportation/logistics notes. Send quote as branded PDF via email. Accept/negotiate/decline flow — 1.5 weeks
- Post-Booking Coordination — Group organizer dashboard: guest list management, dietary preference collection, shared itinerary view. Day-of logistics: meeting times, bus pickup points, emergency contacts. Post-event photo gallery shared with all participants — 1 week
- Group Booking Model — New Prisma models:
- Success Metrics: 5+ group bookings per month by month 6; average group booking AOV >€1,500; 30%+ of corporate clients rebook within 12 months
- Risks & Mitigations:
- Coordination complexity → Assign dedicated coordinator for groups >20; automated email sequences for logistics
- Cancellation risk → 50% deposit required; tiered cancellation policy (full refund >30 days, 50% >14 days, no refund <7 days)
- Effort Estimate: 3-4 person-weeks
- Prerequisites: User accounts (done), booking system (done), email system
- Implementation Phases:
- Referral System — New Prisma models:
ReferralCode(userId, code, usageCount).ReferralRedemption(codeId, referredUserId, bookingId, creditAmount). Generate unique 6-char referral code per user. Track referral chain — 1 week - Referral UI & Flow — Post-booking "Share & earn €10" card with copy-able referral link. Referred user sees "€10 off your first experience" banner. Credit applied at checkout. Referrer notified when credit earned. Shareable link generates custom Open Graph preview — 1 week
- Loyalty Tiers — Calculate tier from completed booking count. Bronze (1+): early access to new experiences. Silver (3+): 5% discount + priority booking. Gold (5+): 10% discount + free upgrade when available + exclusive invite-only experiences. Tier badge on profile — 1 week
- Analytics & Optimization — Referral dashboard: viral coefficient (referrals per user), conversion rate per step, top referrers leaderboard. A/B test credit amounts (€5 vs €10 vs €15). Loyalty cohort analysis: retention rate by tier — 0.5 weeks
- Referral System — New Prisma models:
- Success Metrics: 10%+ of users share referral link; 3%+ viral coefficient; Gold-tier users have 4x higher LTV than one-time bookers; referral CAC <€5
- Risks & Mitigations:
- Gaming/fraud → One referral credit per referred user per first booking; same-household detection; minimum booking value to earn/redeem credit
- Credit liability → Credits expire after 12 months; cap outstanding credit balance at €50 per user
- Effort Estimate: 4-5 person-weeks
- Prerequisites: Cycling routes module (done), OAuth infrastructure, real GPX data
- Implementation Phases:
- OAuth & Account Linking — Strava OAuth 2.0 integration (read activity, write routes). Komoot API connection. User settings page to connect/disconnect accounts. Store refresh tokens securely — 1 week
- Route Sync — "Open in Strava" / "Open in Komoot" deep links for each cycling route. GPX export formatted for both platforms. Auto-create Strava Route from VisitRomagna route data — 1 week
- Activity Tracking — Webhook listener for completed Strava activities matching VisitRomagna routes (geo-fence matching). Auto-log "Completed" badge on route. Activity feed: "Marco just rode the Bertinoro Wine Loop!" Social sharing cards with ride stats — 1.5 weeks
- Community Features — VisitRomagna Strava Club creation/management. Monthly cycling challenges: "Ride all 5 Romagna routes" → unlock exclusive wine tasting experience. Leaderboard for each route segment. Integration with cycling route detail page showing recent completions — 1 week
- Success Metrics: 20%+ of cycling route viewers connect Strava; 100+ route imports to Strava/month; 15%+ of Strava-connected users book a cycling experience; 50+ Strava Club members in 3 months
- Risks & Mitigations:
- Strava API rate limits → 100 requests/15 min, 1000/day. Cache aggressively; batch webhook processing
- Komoot API access → Komoot API is more restrictive; start with deep links and GPX export, defer full integration
- Privacy → Clear consent for activity tracking; opt-in only; easy disconnect
- Effort Estimate: 5-6 person-weeks
- Prerequisites: Booking system (done), AI itinerary engine (done), payment system, availability calendar
- Implementation Phases:
- Itinerary Cart Model — New Prisma model:
ItineraryCart(userId, items: [{experienceId, date, guests}], status). "Add to itinerary" button on every experience detail page. Cart drawer/sidebar showing running itinerary with dates and total cost. Drag-to-reorder days — 1.5 weeks - Multi-Experience Availability Validation — Server-side validation that all experiences in cart are available on selected dates. Conflict detection (overlapping times, impossible driving distances). Suggested date alternatives when conflicts found. Calendar view of full itinerary with time blocks — 1.5 weeks
- Split Payment Checkout — Single Stripe checkout for multiple experiences. Platform creates individual bookings per experience. Split payout to multiple hosts via Stripe Connect transfers. Combined receipt/invoice. Cancellation policy: cancel individual experiences or entire itinerary — 1.5 weeks
- Shareable Itineraries — Generate unique share link for any itinerary. Recipient sees read-only itinerary with "Book this same trip" one-click copy. Social sharing cards. PDF export with day-by-day schedule, maps, meeting points, and contact info — 1 week
- Itinerary Cart Model — New Prisma model:
- Success Metrics: 15%+ of AI-generated itineraries convert to multi-stop booking; average itinerary AOV >€200 (vs €35 single experience); shared itinerary links generate 20%+ new user signups
- Risks & Mitigations:
- Partial cancellation complexity → Allow individual experience cancellation within itinerary; recalculate remaining total; partial refund to guest
- Multi-host coordination → Each host receives independent booking notification; platform coordinates unified timeline
- Date change cascades → Changing one date may invalidate others; offer "revalidate itinerary" flow that finds next-best dates for all experiences
┌─────────────────────────────────────────────────────────┐
│ PROJECT VIABILITY SCORECARD (Iteration 2) │
├─────────────────────────────────────────────────────────┤
│ Current Market Fit: 8/10 ████████░░ │
│ Growth Potential: 9/10 █████████░ │
│ Technical Foundation: 8/10 ████████░░ │
│ Community Health: 3/10 ███░░░░░░░ │
│ Competitive Position: 9/10 █████████░ │
├─────────────────────────────────────────────────────────┤
│ OVERALL SCORE: 7.4/10 ███████▍░░ │
│ (up from 7.0 in Iteration 1) │
└─────────────────────────────────────────────────────────┘
Score Changes from Iteration 1:
- Current Market Fit (7→8): The platform now has a complete booking flow, authentication, multilingual support, and a cycling module — all critical for a tourism marketplace. Still docked because payments are simulated and data is in-memory.
- Technical Foundation (7→8): 12-model Prisma schema, structured data, sitemap, reviews, dashboard analytics — significantly more production-ready architecture. Gap remains in real integrations (Stripe, OAuth, Cloudinary).
- Growth Potential (9→9): Unchanged — the market opportunity is as strong as ever. New transport links, growing agritourism demand, and zero incumbents.
- Community Health (3→3): Still a solo project. No change until open-sourced or team is built.
- Competitive Position (9→9): No competitor has entered the space. First-mover advantage intact.
HIGH REVENUE IMPACT
│
┌──────────────────────┼──────────────────────┐
│ Gift Cards (5) │ Messaging (1) │
│ Referrals (8) │ Smart Pricing (2) │
│ │ Group Booking (7) │
│ │ Itinerary Checkout(10│
├──────────────────────┼──────────────────────┤
│ Strava/Komoot (9) │ Photo Pipeline (4) │
│ Loyalty Tiers (8) │ PWA + Offline (3) │
│ │ Campaigns (6) │
│ │ │
└──────────────────────┼──────────────────────┘
LOW EFFORT │ HIGH EFFORT
Phase 1 — Revenue Foundation (Weeks 1-8):
- Photo & Media Pipeline (#4) — Unblocks the entire platform from "demo" to "production." No amount of features matter without real images.
- Guest Messaging (#1) — Enables the human coordination that complex experiences require. Direct revenue enabler.
- Smart Pricing (#2) — Turns on the revenue optimization engine that grows AOV without growing traffic.
Phase 2 — Growth Engines (Weeks 9-16): 4. Gift Cards (#5) — Holiday season revenue without supply-side friction. 5. Seasonal Campaigns (#6) — Content marketing engine for organic acquisition. 6. Referral & Loyalty (#8) — Viral loop + retention mechanics.
Phase 3 — Platform Differentiation (Weeks 17-24): 7. Group Booking (#7) — High-AOV segment with zero competition. 8. Multi-Stop Checkout (#10) — The "killer feature" that differentiates from Airbnb Experiences. 9. PWA + Offline (#3) — Mobile-first experience for tourists in the field. 10. Strava Integration (#9) — Distribution channel into 100M+ cycling enthusiasts.
Bottom Line: VisitRomagna has successfully built the complete vertical slice in Iteration 1 — booking, auth, i18n, reviews, cycling, AI itineraries, host dashboard. The platform is now feature-comparable to an early Airbnb Experiences for a niche market. The single most important next step is the Photo & Media Pipeline (#4) — replacing gradient placeholders with real photography is the highest-leverage change possible. After that, the focus shifts to revenue mechanics (messaging, smart pricing, gift cards) and growth loops (referrals, campaigns) that turn a functional prototype into a revenue-generating marketplace. Target: first real-photo, real-payment booking by end of August 2025.
visit-romagna/ # ~6,291 LOC across 40 files
├── prisma/
│ └── schema.prisma # 12 models: User, Session, HostProfile, Experience,
│ # Availability, Booking, Payment, Review, Wishlist,
│ # SavedItinerary, CyclingRoute, CyclingRouteExperience
├── src/
│ ├── app/
│ │ ├── layout.tsx # Root layout: Navbar + Footer + JSON-LD + i18n alternates
│ │ ├── page.tsx # Homepage: Hero + Categories + Featured + CTAs
│ │ ├── globals.css # Tailwind v4 imports
│ │ ├── sitemap.ts # Dynamic sitemap (experiences + cycling routes)
│ │ ├── robots.ts # Allow all, block /api/ /dashboard/ /booking/
│ │ ├── auth/
│ │ │ ├── login/page.tsx # Login: email + password + magic link + Google OAuth UI
│ │ │ └── register/page.tsx # Register: name + email + role selection (tourist/host)
│ │ ├── booking/
│ │ │ └── [experienceId]/page.tsx # 3-step booking: date/guests → payment → confirmation
│ │ ├── cycling/
│ │ │ ├── page.tsx # Cycling directory: difficulty filters, route cards
│ │ │ └── [slug]/page.tsx # Route detail: elevation profile, GPX, linked experiences
│ │ ├── dashboard/
│ │ │ ├── page.tsx # Host overview: stat cards, recent bookings/listings
│ │ │ ├── analytics/page.tsx # Mock charts: revenue + bookings over time
│ │ │ ├── bookings/page.tsx # Host booking management
│ │ │ └── listings/page.tsx # Host experience management
│ │ ├── experiences/
│ │ │ ├── page.tsx # Filterable directory + interactive map
│ │ │ └── [id]/page.tsx # Detail: gallery, host, reviews, booking CTA, JSON-LD
│ │ ├── host/page.tsx # Host acquisition landing page
│ │ ├── itinerary/page.tsx # Trip planner + AI itinerary chat
│ │ └── api/
│ │ ├── auth/ # login, register, me, logout endpoints
│ │ ├── availability/ # GET availability slots per experience
│ │ ├── bookings/ # GET/POST/PATCH bookings
│ │ ├── experiences/ # GET (filtered) / POST / GET by ID
│ │ ├── itinerary/ai/ # POST AI itinerary generation
│ │ └── reviews/ # GET/POST reviews + host responses
│ ├── components/
│ │ ├── dashboard.tsx # DashboardShell + StatCard
│ │ ├── experience-map.tsx # Interactive map with category pins + drawer
│ │ ├── features.tsx # FeatureCard + FeatureGrid
│ │ ├── footer.tsx # Site footer
│ │ ├── hero.tsx # Reusable hero section
│ │ ├── json-ld.tsx # JSON-LD builders (Website/TouristTrip/SportsActivity)
│ │ ├── language-switcher.tsx # Locale dropdown (localStorage-based)
│ │ ├── navbar.tsx # Responsive nav with auth state + language switcher
│ │ ├── pricing.tsx # Pricing tiers section
│ │ └── review-form.tsx # Star rating + comment form
│ └── lib/
│ ├── auth.ts # Session cookie reader → user lookup
│ ├── data.ts # 1,388 LOC: types, seed data, CRUD functions, stores
│ ├── db.ts # Generic InMemoryStore<T>
│ ├── i18n/translations.ts # 712 LOC: 5-locale translation dictionary
│ └── utils.ts # cn() utility
└── package.json # Next.js 16.2.6, React 19, Prisma 7.8, Tailwind 4