Skip to main content

Apply Payment-Method Discount

Apply (or clear) the in-person payment-method discount on a booking before you record the payment.

Some suppliers offer a small discount for paying in person with cash, debit / Interac, or bank transfer โ€” a percentage off the full price (never a credit-card surcharge). This endpoint applies that configured discount to the booking so your client can show the discounted total and amount due before the customer settles. Taxes are recomputed automatically on the discounted amount.

The discount math lives in one shared service, so the result is identical whether it is applied from the web booking screen, the mobile app, or this API.

Endpointโ€‹

PUT /v1/bookings/{id}/payment-method-discount

Authenticationโ€‹

Requires an API key with the bookings:write scope. The booking must belong to the requesting supplier.

Path Parametersโ€‹

ParameterTypeDescription
idintegerBooking ID

Request Bodyโ€‹

FieldTypeRequiredDescription
methodstring|nullNoThe payment method the customer will use. A discounted offline method (cash, bank_transfer, other) applies the percentage configured for that method in Settings. Any other method (e.g. credit_card), a method with no configured discount, or null clears any existing discount.

The discount percentages are configured per method in Settings โ†’ Payments โ†’ Payment methods and are exposed via GET /v1/settings under features.payment_methods. Only the offline methods can carry a discount.

Accepted Method Valuesโ€‹

ValueDescriptionCan carry a discount?
cashCashYes
bank_transferBank transferYes
otherOther offline methodYes
credit_cardCredit / debit cardNo โ€” clears the discount
stripeStripe (online card)No โ€” clears the discount
stripe_terminalTap to Pay (terminal)No โ€” clears the discount
manualManual paymentNo โ€” clears the discount
otaOTA / channelNo โ€” clears the discount
note

Applying a method that has no discount configured (or sending null) is the canonical way to remove a previously applied payment-method discount and restore the full price.

Example Requestโ€‹

curl -X PUT "https://app.equipdash.com/api/v1/bookings/123/payment-method-discount" \
-H "Authorization: Bearer eqd_live_abc123xyz789..." \
-H "Content-Type: application/json" \
-d '{
"method": "cash"
}'

Clearing the discountโ€‹

curl -X PUT "https://app.equipdash.com/api/v1/bookings/123/payment-method-discount" \
-H "Authorization: Bearer eqd_live_abc123xyz789..." \
-H "Content-Type: application/json" \
-d '{
"method": null
}'

Responseโ€‹

Success (200 OK)โ€‹

{
"data": {
"booking": {
"id": 123,
"total": 270.00,
"amount_due": 270.00,
"payment_status": "unpaid",
"payment_method_discount": {
"rate": 3,
"amount": 9.00,
"label": "Cash discount"
}
}
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-06-16T12:00:00+00:00"
}
}

When the discount is cleared, payment_method_discount is null and the totals return to the full price:

{
"data": {
"booking": {
"id": 123,
"total": 281.00,
"amount_due": 281.00,
"payment_status": "unpaid",
"payment_method_discount": null
}
},
"meta": {
"request_id": "req_abc124",
"timestamp": "2026-06-16T12:00:05+00:00"
}
}

Response Fieldsโ€‹

The data.booking object reflects the booking after the discount has been applied (or cleared) and the totals recomputed.

FieldTypeDescription
idintegerBooking ID
totalnumberBooking total including tax, after the discount.
amount_duenumberOutstanding balance after the discount (total minus payments already taken). Never negative.
payment_statusstringunpaid, partial, paid, or refunded.
payment_method_discountobject|nullnull when no discount is applied, otherwise the applied discount.
payment_method_discount.ratenumberDiscount percentage applied (e.g. 3 = 3%).
payment_method_discount.amountnumberDiscount amount in the booking's currency.
payment_method_discount.labelstringHuman-readable label, e.g. "Cash discount".

The same payment_method_discount object is also surfaced inside the pricing block of every booking โ€” see Get Booking.

Recording the Paymentโ€‹

This endpoint only prices the discount โ€” it does not record a payment. After showing the discounted total, take the payment with Add Payment using the same offline method:

curl -X POST "https://app.equipdash.com/api/v1/bookings/123/payments" \
-H "Authorization: Bearer eqd_live_abc123xyz789..." \
-H "Content-Type: application/json" \
-d '{
"amount": 270.00,
"method": "manual"
}'

Errorsโ€‹

StatusCodeWhen
401authentication_requiredNo API key provided.
401invalid_api_keyInvalid API key.
403insufficient_scopeAPI key lacks the bookings:write scope.
403forbiddenThe booking belongs to a different supplier.
404resource_not_foundNo booking with that id.
409conflictThe booking is cancelled โ€” a discount cannot be applied.
422validation_errormethod is not one of the accepted values.

Cancelled Bookingโ€‹

{
"error": {
"code": "conflict",
"message": "Cannot apply a discount to a cancelled booking."
},
"meta": {
"request_id": "req_def456"
}
}

Invalid Methodโ€‹

{
"error": {
"code": "validation_error",
"message": "The given data was invalid.",
"details": [
{
"field": "method",
"message": "The selected method is invalid."
}
]
},
"meta": {
"request_id": "req_def457"
}
}

Notesโ€‹

  • This is a discount for paying in person, never a credit-card surcharge. It comes off the full price, and taxes recompute on the discounted base.
  • Applying or clearing the discount is idempotent โ€” calling it again with the same method has no extra effect.
  • The endpoint mirrors the web booking screen and mobile app exactly; all three share one calculation, so the discounted total is consistent everywhere.