HotelHub HMSDocs

13 — Guest Portal #

Public-facing surface untuk tamu: booking engine (search → book → pay), self check-in, in-stay companion, post-stay (review, loyalty). Mobile-first.

URL: pakai domain hotel sendiri (/, /rooms, /booking, /portal/...). Tidak ada sub-path /panel atau /admin.


1. Komponen #

Komponen URL pattern Phase
Homepage hotel / 🟢
About / contact / policy /about, /contact, /privacy, /terms 🟢
Room types listing /rooms 🟢
Room type detail /rooms/{slug} 🟢
Booking engine search /booking 🟢
Booking engine results /booking/results 🟢
Booking engine checkout /booking/checkout 🟢
Booking confirmation /booking/confirmation/{ref} 🟢
pSEO pages (lihat 10-PSEO_STRATEGY.md) 🟢
Guest portal — Manage booking /portal/booking/{ref}?token=... 🟢
Guest portal — Pre check-in /portal/pre-checkin/{ref} 🟢
Guest portal — Self check-in (kiosk/mobile) /portal/checkin/{ref} 🟡
Guest portal — In-stay (request, info) /portal/stay/{token} 🟡
Guest portal — Folio view /portal/folio/{ref} 🟡
Post-stay review /portal/review/{ref} 🟡
Loyalty member portal /portal/loyalty 🟡
Gift voucher buy / redeem /voucher, /voucher/{code} 🟡
Wedding inquiry (banquet P2) /wedding, /wedding/inquiry 🟡

2. Booking engine flow (booking utama) #

Form di homepage / sticky widget:

Validation: max stay 90 days, check-in >= today, check-out > check-in, dewasa >= 1.

b) Results #

c) Checkout #

Single-page, vertical accordion sections:

  1. Booking summary — non-editable, link "edit" balik ke search
  2. Add-ons — breakfast, transfer, late checkout, extra bed (optional)
  3. Guest details — primary guest: nama, email, telepon, KTP/Paspor (opsional pre-check-in), country, special requests free-text
  4. Special requests — checkbox common (extra towel, rocking chair) + free-text
  5. Promo / voucher — apply
  6. Payment — BYOK PG redirect / embed / QRIS

Checkout = ATOMIC: reservation + folio created saat success payment callback, atau saat "pay later" untuk PG yang support deferred.

d) Confirmation #


3. Manage booking #

URL /portal/booking/{ref}?token={one-time-secure-token} — token di-email/WA, valid 30 hari.

Aksi:

Tabel booking_access_tokens (booking_id, token_hashed, expires_at, used_at).


4. Pre check-in #

Tujuan: kurangi antrean di front desk saat kedatangan.

Form online (sebelum tiba):

Status reservation.pre_checkin_complete = true → di FO, kartu reservasi tampil "✅ pre-checkin done", staff tinggal verify dokumen + serahkan kunci.


5. Self check-in (kiosk / mobile) #

Kalau hotel pakai door lock integration:

Phase 2, butuh integrasi lock (Salto/Onity/Vingcard).


6. In-stay companion (Phase 2) #

Setelah check-in, tamu dapat link /portal/stay/{token} (token unique per stay):


7. Folio view #

URL /portal/folio/{ref} — tamu lihat tagihan running:


8. Post-stay #

Review request #

Email + WA blast 24 jam setelah check-out:

Auto-share ke Google / OTA (P2) #

Kalau positif (>4 stars), prompt tamu auto-link ke Google review / TripAdvisor.

Loyalty enrollment / point credit #

Otomatis credit point untuk member, atau prompt enroll non-member.


9. Loyalty portal (P2) #


10. Gift voucher #


11. Multi-bahasa #

Default bahasa: detect dari browser Accept-Language, fallback id. User toggle di header [ID][EN].

Translatable string: di file lang/id.json, lang/en.json. Property-specific copy (homepage, room desc) editable di admin UI dengan kolom per locale.


12. Theme & branding #

Owner config di admin:

Template baseline: 3 design preset ("Boutique", "Resort", "Modern") yang bisa di-pick + override.


13. Tracking / analytics #

Embed (BYOK):

E-commerce events fired di booking flow: view_item, add_to_cart, begin_checkout, purchase.


14. Performance & SEO #


15. Security #


16. PWA #

/portal/* route boleh di-install sebagai PWA — tamu tap "Add to Home" → app icon hotel di phone, akses cepat selama stay.

Phase 2.


17. Open questions #

  1. Booking engine — single page (modern, app-like) atau multi-step (familiar)? Default: multi-step accordion di MVP.
  2. Apakah pre-check-in mandatory atau optional? Beberapa hotel pengen mandatory untuk efisiensi.
  3. Custom domain handling per tenant (SaaS) — pakai Cloudflare for SaaS atau setup manual ACME?
  4. Apakah guest harus daftar akun untuk booking, atau guest checkout (no account) cukup? Default: guest checkout, optional account creation.