Payment Flow — Pay at the Hotel#
This flow applies when a guest selects Pay at the Hotel as their payment method. The guest reserves the room online but settles the full payment in person upon arrival at the hotel.
Page Flow Overview#
🏠 Home Page (Loading Reference Data)#
The first page the guest lands on. API calls are made when the page loads to prepare the booking experience with hotel information and room data.API Calls#
Load All Room Types#
Fetches all room types with names, images, rates, and capacity. Used to display the room catalogue on the home page.
Load Hotel Details#
Fetches hotel name, address, contact info, slogan, and social media links. Used to populate the hotel branding and information section.
Load Hotel Rules#
Fetches check-in/out times, min/max stay length, and advance booking windows. Used to enforce booking constraints before the guest selects dates.
📅 Booking Page (Checking Room Availability)#
The guest selects their check-in date, check-out date, number of adults, and number of children. An API call is triggered to return only rooms available for those specific dates.API Call#
Check Availability#
{
"errorCode": 0,
"errorMessage": "Successfully retrieved available rooms.",
"types": [
{
"roomTypeId": 3,
"roomType": "Premium Suite",
"rate": 40000,
"available": 3,
"currencySymbol": "₦"
}
]
}
💾 Store roomTypeId and rate for the room the guest selects — both are required on the Checkout Page.
⚠️ Only display rooms where available > 0.
👤 Guest Detail Page (Entry for Guest Details)#
The guest fills in their personal details. An API call is made to check if the guest already exists in the system using their email address — allowing the form to be pre-filled for returning guests.API Call#
Look Up Existing Guest#
Response — Returning Guest:{
"detail": {
"title": "Mrs",
"firstName": "Jane",
"lastName": "Smith",
"phone": "08030000001",
"email": "jane.smith@example.com",
"sex": "Female",
"occupation": "Doctor",
"country": "Nigeria",
"state": "FCT",
"address1": "5, Sample Avenue",
"address2": "",
"city": "Abuja"
},
"errorCode": 0,
"errorMessage": "Guest detail retrieved successfully."
}
{
"detail": null,
"errorCode": -200,
"errorMessage": "Guest not found."
}
💡 If errorCode is -200, the guest is new — display a blank form for them to fill in their details manually.
💾 Store all guest details — they are required in the reservation payload on the Checkout Page.
Supporting Reference Data#
Load these in parallel to populate the form dropdowns:
📋 Booking Preview (Review and Confirm Details Filled)#
The guest reviews all their filled details — selected room, dates, guest information, and total cost — before proceeding to checkout. No new API calls are made on this page. All data displayed here is pulled from what was collected on the previous pages.Data Displayed#
| Data | Source |
|---|
| Room type & rate | Booking Page → POST /Reservation/Availability |
| Check-in & check-out dates | Booking Page → guest input |
| Number of adults & children | Booking Page → guest input |
| Guest name & contact details | Guest Detail Page → GET /Guest/Detail or manual input |
| Total amount due at hotel | Calculated: rate × nights × quantity |
✅ This is the guest's last chance to review and edit before checkout. Provide a Back button to return to the Guest Detail Page if needed.
💳 Checkout Page (Choose Method of Payment)#
The guest selects their preferred payment method. An API call loads the available options configured for the hotel.API Call#
Load Active Payment Methods#
{
"items": [
{ "id": 1, "name": "Book On Hold" },
{ "id": 2, "name": "Pay at the Hotel" },
{ "id": 4, "name": "Paystack" }
],
"errorCode": 0,
"errorMessage": "Successfully retrieved payment methods."
}
💾 Store the selected id as payMethodId — required in the reservation payload.
Since the guest selects Pay at the Hotel, no online payment is collected. Submit the reservation directly with reference and transaction left empty and the full room amount set in amount.Add Reservation#
{
"bookingRef": "K3PLW9",
"errorCode": 0,
"errorMessage": "Reservations made successfully"
}
Response — Validation Error:{
"bookingRef": "",
"errorCode": -100,
"errorMessage": "Validation failed. Guest first name is required."
}
💾 Store the bookingRef — used on the next page to retrieve and display the booking confirmation.
✅ Payment Success Page (Reservation Confirmed)#
The guest lands on this page after a successful reservation. An API call is made using the bookingRef from the previous step to retrieve and display the full booking summary.API Call#
Get Booking Detail#
{
"guest": {
"firstName": "Jane",
"lastName": "Smith",
"email": "jane.smith@example.com"
},
"reservations": [
{
"roomType": "Premium Suite",
"bookingRef": "K3PLW9",
"checkInDate": "2025-09-15",
"checkOutDate": "2025-09-16",
"arrivalTime": "03:00 PM",
"quantity": 1,
"rate": 40000
}
],
"errorCode": 0,
"errorMessage": "Reservation details retrieved successfully."
}
📋 Display the bookingRef prominently. The guest will need it to look up or cancel their reservation.
🏨 Remind the guest to present their booking reference and a valid ID at the front desk upon arrival.
📩 Send a confirmation email to the guest containing their bookingRef, check-in time, check-out time, and the total amount due on arrival.
Payment Object Reference#
| Field | Value | Description |
|---|
payTypeId | 2 | Pay on arrival |
payMethodId | 2 | Pay at the Hotel |
reference | "" | Leave empty — no online transaction |
transaction | "" | Leave empty — no online transaction |
amount | in naira | Total reservation amount due at hotel |
Field Sources — Quick Reference#
Field in POST /Reservation/Add | Source Page | API / Input |
|---|
guest.countryId | Guest Detail Page | GET /Country/GetSelectList → id |
guest.stateId | Guest Detail Page | GET /State/GetSelectList → id |
reservations[].roomTypeId | Booking Page | POST /Reservation/Availability → types[].roomTypeId |
reservations[].rate | Booking Page | POST /Reservation/Availability → types[].rate |
reservations[].checkInDate | Booking Page | Guest input (YYYY-MM-DD) |
reservations[].checkOutDate | Booking Page | Guest input (YYYY-MM-DD) |
reservations[].arrivalTime | Guest Detail Page | Guest input (HH:MM AM/PM) |
payment.payMethodId | Checkout Page | GET /Paymode/ActiveList → items[].id |
payment.reference | — | Leave empty for Pay at the Hotel |
payment.amount | Booking Preview | Calculated: rate × nights × quantity |
Important Notes#
💡 The room is held for the guest but not guaranteed beyond the hotel's cancellation window. Check GET /Rule/Detail for the minCheckInWindow to understand when a held reservation may be released.
⚠️ The hotel reserves the right to release the room if the guest does not arrive by the standard check-in time without prior notice.
Modified at 2026-03-24 13:31:39