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โ
| Parameter | Type | Description |
|---|---|---|
id | integer | Booking ID |
Request Bodyโ
| Field | Type | Required | Description |
|---|---|---|---|
method | string|null | No | The 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โ
| Value | Description | Can carry a discount? |
|---|---|---|
cash | Cash | Yes |
bank_transfer | Bank transfer | Yes |
other | Other offline method | Yes |
credit_card | Credit / debit card | No โ clears the discount |
stripe | Stripe (online card) | No โ clears the discount |
stripe_terminal | Tap to Pay (terminal) | No โ clears the discount |
manual | Manual payment | No โ clears the discount |
ota | OTA / channel | No โ clears the discount |
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.
| Field | Type | Description |
|---|---|---|
id | integer | Booking ID |
total | number | Booking total including tax, after the discount. |
amount_due | number | Outstanding balance after the discount (total minus payments already taken). Never negative. |
payment_status | string | unpaid, partial, paid, or refunded. |
payment_method_discount | object|null | null when no discount is applied, otherwise the applied discount. |
payment_method_discount.rate | number | Discount percentage applied (e.g. 3 = 3%). |
payment_method_discount.amount | number | Discount amount in the booking's currency. |
payment_method_discount.label | string | Human-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โ
| Status | Code | When |
|---|---|---|
| 401 | authentication_required | No API key provided. |
| 401 | invalid_api_key | Invalid API key. |
| 403 | insufficient_scope | API key lacks the bookings:write scope. |
| 403 | forbidden | The booking belongs to a different supplier. |
| 404 | resource_not_found | No booking with that id. |
| 409 | conflict | The booking is cancelled โ a discount cannot be applied. |
| 422 | validation_error | method 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.