Skip to main content
Way supports three kinds of promotional mechanics at checkout: coupon codes (discounts), access codes (unlock gated listings), and credit codes (stored value). All are configured by the brand in the dashboard; your integration validates them and passes them into the booking payload.

Coupon codes

Validate a code the guest entered with Validate coupon code:
A valid code returns its discount details:
  • value + discountType tell you how to present the discount (percentage vs fixed amount).
  • experienceIds, when present, scopes the coupon to specific experiences - apply it only to matching cart items.
  • An invalid or expired code returns an error status; show the guest a clear “code not valid” message.
Apply it by passing couponCode in the checkout calls - on the cart item (data[].couponCode) for item-scoped coupons or at the top level of the book-bulk payload for cart-wide ones. The payment intent call accepts the same fields, so the discounted total flows into totalNetAmount before the guest pays - validate first, then price.

Access codes

Access codes gate exclusive listings (listings with isExclusive: true are backed by access-code-protected experiences). The guest enters a code; you check it with Validate access code:
On success, unlock the gated listing in your UI and pass accessCode in the cart item (data[].accessCode) when booking - book-bulk enforces it server-side, so skipping this fails the booking for gated experiences.

Credit codes

Credits are prepaid/stored-value codes applied at booking time via data[].appliedCreditCodes in the book-bulk payload:
appliedValue is how much of the credit to consume against this item, and sequence controls the order when several codes apply (they’re processed ascending). There is no public validation endpoint for credit codes - the values are validated at booking time.

Where discounts show up

The discounted total appears in the payment intent’s totalNetAmount and the booking’s amount. To show a running total as the guest applies codes, call Create a payment intent with "getOnlyTotalNetAmount": true - it prices the cart (including promotion fields) without initializing a payment.