> ## Documentation Index
> Fetch the complete documentation index at: https://docs.way.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Room Charge Integration

> Let hotel guests pay for experiences by posting the charge to their room folio instead of a credit card

Room charge lets a guest pay for an experience by adding it to their hotel bill: instead of entering a card, they enter their reservation or room number at checkout, and Way posts the charge to their folio in the hotel's Property Management System (PMS).

This guide covers only what changes relative to the card flow. Follow [Build a Booking Integration](/guides/build-a-booking-integration) through cart assembly (steps 1-5), then come back here - room charge replaces the payment-intent and Stripe steps with one validation call, and the booking confirms synchronously.

## Supported PMS integrations

| PMS                | `integrationType` (validate URL) | `pmsType` (booking payload) |
| ------------------ | -------------------------------- | --------------------------- |
| Oracle OPERA Cloud | `opera`                          | `opera`                     |
| StayNTouch         | `stayntouch`                     | `stayntouch`                |
| Infor HMS          | `infor`                          | `infor`                     |
| Mews               | `mews`                           | `mews`                      |

The flow is identical for all four - only the `integrationType` in the validate URL and the `pmsType` in the booking payload change.

**Prerequisite:** the brand's PMS connection is configured in the Way dashboard under **Settings → Integrations** (your Way representative helps set this up). You can check what a brand has connected with [Get integrations](/api-reference/integrations/get-integrations).

<Steps>
  <Step title="Validate the guest's reservation">
    Before booking, verify the reservation exists and is chargeable with [Validate room charge](/api-reference/integrations/validate-room-charge). It takes the guest's last name plus the identifier they entered at checkout:

    ```bash theme={null}
    curl -X POST "$WAY_API/v1/brands/$WAY_BRAND_ID/room-charge/opera/validate" \
      --header "Authorization: Bearer $WAY_API_KEY" \
      --header "Content-Type: application/json" \
      --data '{ "lastName": "Rivera", "reservationNumber": "84213" }'
    ```

    All four PMS integrations accept a confirmation/reservation number or a **room number** as `reservationNumber` (always paired with the last name), so a simple "room number + last name" checkout form works everywhere.

    ```json theme={null}
    {
      "data": {
        "reservationId": "212990",
        "confirmationId": "377649",
        "arrivalDate": "2026-08-12",
        "departureDate": "2026-08-18",
        "status": "Reserved",
        "guests": [{ "firstName": "Alice", "lastName": "Rivera" }]
      }
    }
    ```

    This call matters for two reasons: it confirms the reservation is in a chargeable status, and it returns the **`reservationId`** the booking call needs. If the reservation can't be found or isn't chargeable, the response has no `data` - don't proceed to booking; ask the guest to re-check their details or pay by card.

    <Note>
      The session being booked must fall between the reservation's `arrivalDate` and `departureDate` - Way can't post charges to a folio for dates the guest isn't staying.
    </Note>
  </Step>

  <Step title="Create the booking with paymentMethod room-charge">
    Make the same [Create a booking](/api-reference/carts-and-checkout/create-booking) call as the card flow, but with `paymentMethod: "room-charge"` and a `paymentDetail` object carrying the validation results. **Skip the payment intent entirely** - there is no Stripe involvement.

    ```bash theme={null}
    curl -X POST "$WAY_API/v1/brands/$WAY_BRAND_ID/book-bulk" \
      --header "Authorization: Bearer $WAY_API_KEY" \
      --header "Content-Type: application/json" \
      --data '{
        "cartId": "c4a1b2c3-d4e5-4f6a-8b9c-0d1e2f3a4b5c",
        "purchaser": {
          "firstName": "Alice",
          "lastName": "Rivera",
          "emailAddress": "alice@example.com"
        },
        "data": [ { ...cart items, exactly as in the card flow... } ],
        "paymentMethod": "room-charge",
        "paymentDetail": {
          "pmsType": "opera",
          "lastName": "Rivera",
          "methodNumber": "84213",
          "reservationId": "212990"
        },
        "siteLanguage": "en",
        "deviceType": "pc"
      }'
    ```

    The `paymentDetail` fields:

    | Field           | Value                                                                                                   |
    | --------------- | ------------------------------------------------------------------------------------------------------- |
    | `pmsType`       | The PMS identifier - same value as the `integrationType` you validated against                          |
    | `lastName`      | The guest's last name, as validated                                                                     |
    | `methodNumber`  | The identifier the guest entered at checkout (what you sent as `reservationNumber` to validate)         |
    | `reservationId` | **From the validate response** - pass it through unchanged; this is what the folio charge posts against |

    Because no card confirmation is pending, the booking is **`confirmed` synchronously** in the book-bulk response - no `processing` state, no webhook wait, and the guest gets their confirmation email immediately. Way posts the charge to the folio and records a note on the reservation with the Way confirmation code.
  </Step>

  <Step title="Verify and handle failures">
    Verify exactly as in the card flow: [Get bookings](/api-reference/bookings/get-bookings) filtered by `cartConfirmationCode` or `cartId`. Room-charge bookings carry `paymentMethod: "room-charge"` and the folio reference in their payment details.

    If book-bulk fails (folio rejected, reservation status changed between validate and book), rotate to a fresh `cartId` before retrying - same rule as the card flow. Refunds for cancelled room-charge bookings post back to the folio as negative charges.
  </Step>
</Steps>

## PMS-specific notes

<AccordionGroup>
  <Accordion title="Oracle OPERA Cloud">
    Validate resolves the reservation by confirmation number, reservation code, external reference, or room number + last name (leading zeros tolerated). Way posts a fixed charge to the reservation - or a live billing charge when today is the departure date - and adds a reservation note with the booking details. Reservations designated as paying by credit card skip charge posting (the note is still added).
  </Accordion>

  <Accordion title="StayNTouch">
    Validate resolves by reservation/confirmation number + last name (cancelled reservations excluded) or room number + last name, and additionally returns `arrivalTime` and `departureTime`. Checked-out, no-show, and cancelled reservations are not chargeable.
  </Accordion>

  <Accordion title="Infor HMS">
    Validate runs a folio inquiry by last name + room number, confirmation number, or last name + CRS confirmation number. Charges post as an add-on item to the reservation (or directly to the folio on departure day). Checked-out, no-show, and cancelled folios are not chargeable.
  </Accordion>

  <Accordion title="Mews">
    Validate resolves by reservation number + last name or room number + last name; if the guest enters a UUID, it's treated as the Mews reservation ID directly. Way adds an accounting item linked to the reservation, priced net or gross per the brand's configuration.
  </Accordion>
</AccordionGroup>
