BioduxPMS Booking API
    • Back to home
    • Booking Flow
    • Book On Hold
    • Pay Now
    • Pay At Hotel

    Book On Hold

    Payment Flow — Book on Hold#

    This flow applies when a guest selects Book on Hold as their payment method. The guest secures a reservation without making any payment upfront. The booking is held pending further action — either payment confirmation or check-in, depending on the hotel's policy.
    payMethodId: 1

    Page Flow Overview#

    Image-2.png#

    🏠 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#

    Response:
    {
        "errorCode": 0,
        "errorMessage": "Successfully retrieved available rooms.",
        "types": [
            {
                "roomTypeId": 2,
                "roomType": "Business Suite",
                "rate": 50000,
                "available": 1,
                "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": "Dr",
            "firstName": "Emeka",
            "lastName": "Okafor",
            "phone": "08050000002",
            "email": "emeka.okafor@example.com",
            "sex": "Male",
            "occupation": "Consultant",
            "country": "Nigeria",
            "state": "Rivers",
            "address1": "12, Palm Close",
            "address2": "GRA Phase 2",
            "city": "Port Harcourt"
        },
        "errorCode": 0,
        "errorMessage": "Guest detail retrieved successfully."
    }
    Response — New Guest:
    {
        "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#

    DataSource
    Room type & rateBooking Page → POST /Reservation/Availability
    Check-in & check-out datesBooking Page → guest input
    Number of adults & childrenBooking Page → guest input
    Guest name & contact detailsGuest Detail Page → GET /Guest/Detail or manual input
    Total amountCalculated: 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#

    Response:
    {
        "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 Book on Hold, no payment is collected. Submit the reservation directly with reference and transaction left empty and amount set to 0.00.

    Add Reservation#

    Response — Success:
    {
        "bookingRef": "T7XNQ2",
        "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#

    Response:
    {
        "guest": {
            "firstName": "Emeka",
            "lastName": "Okafor",
            "email": "emeka.okafor@example.com"
        },
        "reservations": [
            {
                "roomType": "Business Suite",
                "bookingRef": "T7XNQ2",
                "checkInDate": "2025-09-15",
                "checkOutDate": "2025-09-17",
                "arrivalTime": "01:00 PM",
                "quantity": 1,
                "rate": 50000
            }
        ],
        "errorCode": 0,
        "errorMessage": "Reservation details retrieved successfully."
    }
    📋 Display the bookingRef prominently. The guest will need it to look up or cancel their reservation.
    🔒 Inform the guest that their room is held but not fully confirmed until payment is received or they check in, depending on the hotel's policy.
    📩 Send a confirmation email to the guest with their bookingRef, hold status, check-in/out dates, and instructions on what to do next.

    Payment Object Reference#

    FieldValueDescription
    payTypeId1Hold / pending payment
    payMethodId1Book on Hold
    reference""Leave empty — no transaction initiated
    transaction""Leave empty — no transaction initiated
    amount0.00No payment collected at this stage

    Field Sources — Quick Reference#

    Field in POST /Reservation/AddSource PageAPI / Input
    guest.countryIdGuest Detail PageGET /Country/GetSelectList → id
    guest.stateIdGuest Detail PageGET /State/GetSelectList → id
    reservations[].roomTypeIdBooking PagePOST /Reservation/Availability → types[].roomTypeId
    reservations[].rateBooking PagePOST /Reservation/Availability → types[].rate
    reservations[].checkInDateBooking PageGuest input (YYYY-MM-DD)
    reservations[].checkOutDateBooking PageGuest input (YYYY-MM-DD)
    reservations[].arrivalTimeGuest Detail PageGuest input (HH:MM AM/PM)
    payment.payMethodIdCheckout PageGET /Paymode/ActiveList → items[].id
    payment.reference—Leave empty for Book on Hold
    payment.amount—0.00 — no payment collected

    Important Notes#

    💡 A Book on Hold reservation does not guarantee the room indefinitely. The hotel may release held bookings that are not confirmed within a set window. Check GET /Rule/Detail for the minCheckInWindow to understand the hold expiry policy.
    ⚠️ If the guest later decides to pay online, a Paystack transaction can be initiated separately and the reservation updated accordingly.
    Modified at 2026-03-24 12:26:04
    Next
    Pay Now
    Built with