Migration plan (draft)
From: Next + Convex on bookdirect.ng / com-bookdirect.com / /extranet
To: Marketplace · MelonQ · Middleware · Core · subdomain Booking Engine
Principles
- Middleware wins when both layers expose a path
- One writer per SSOT (inventory, bookings, email triggers)
- Guest refs, manage links, and PSP webhooks stay valid
- Shadow email / ARI / rate-match before switch
- Amenities stay local slugs — migrate labels → slugs once
Do not
- Map rooms into rates-packages — live folder is
/api/v1/bookdirect/rooms - Reset booking refs below live max
- Fetch Google Places on import day — copy stored
google*snapshots - Paste email TSX into DevDocs
Phases
| Phase | Exit |
|---|---|
| A Foundations | Staging property bookable via API |
| B Guest slice | UAT book + pay; email shadow OK |
| C MelonQ slice | Staff accept a staging booking on MelonQ |
| D Direct + ARI | Google test booking on {HotelName}.com-bookdirect.com |
| E Rate match + finance | Matched rate visible in one scan; finance CC |
| F Cutover | Seed counter; DNS; webhooks → Middleware; /extranet 301 |
| G Decommission | Convex traffic off; delete multi-link engine code |
Live remount (/api/v1/bookdirect/*) is a separate promote from MelonQ hosts.
Booking ID at F3
Seed bookingReference = 9999 → next 010000 only if legacy max < 10000. Else max + 1. See booking ID.
Data
| Dataset | Strategy |
|---|---|
| Properties + CDN URLs | Export → Core |
| Rooms / rate plans | Rooms folder + rates-packages |
| Inventory | Only after ARI SSOT exists; else keep computed availability |
| Open bookings | Preserve reference / meta_key exactly |
| Users | Split guest vs partner clients |
| Email hub | Port by triggerId → live template keys |
| Amenity arrays | Map "Free WiFi" → free_wifi |
Promote rows into v1 activation as each folder is signed off.