Skip to main content

Surcharges

A shop can charge more on chosen days of the week or dates - a weekend rate, a holiday rate. Each surcharge is one rule: on <days or dates> add <amount>, shown as <label>.

How they apply. A booking that falls on a surcharge day gets a surcharge line of its own, inside the pre-tax subtotal, so it is taxed and discounted like the items. Days are the shop's own calendar days, in its time zone.

  • percent - that percent of each matching item's price. A hire that runs over several days pays it on the share of its days that fall on surcharge days: a Friday-to-Monday hire covering Friday, Saturday, Sunday and Monday pays a weekend rate on half its price.
  • per_booking - once, when anything in the booking falls on a surcharge day.
  • per_person - per person on the sessions that fall on a surcharge day (the largest party of any one session), or per unit of gear on a surcharge day, whichever is more.

When two rules match, both apply, each as its own line. A booking keeps the rule it was sold with - rate, unit and days or dates: changing or deleting a rule later never reprices a booking already taken. A rule added later reaches an existing booking only when its dates or items are edited. Staff can waive a surcharge on a single booking (below).

You do not have to read these rules to get the right total: POST /v1/bookings applies them, and POST /v1/pricing/calculate quotes them. These endpoints are for integrations that manage the rules themselves.

Endpoints​

GET    /v1/settings/surcharges
GET /v1/settings/surcharges/{id}
POST /v1/settings/surcharges
PUT /v1/settings/surcharges/{id}
DELETE /v1/settings/surcharges/{id}

Authentication​

GET requires the settings:read scope. POST, PUT and DELETE require settings:write.

The shape of a surcharge​

FieldTypeDescription
idintegerRead-only.
labelstringWhat customers see on the booking, up to 80 characters.
applies_onstringdays or dates.
daysarray of integersFor days: 0 Sunday to 6 Saturday. A weekend is [6, 0].
datesarrayFor dates: {"start": "YYYY-MM-DD", "end": "YYYY-MM-DD"} ranges, both ends included. A single day has the same start and end. Up to 100 per surcharge.
amountnumber or nullThe surcharge. null or 0 switches it off. A percent can be at most 100.
unitstringpercent, per_booking or per_person.
activebooleanRead-only: true when it has an amount and at least one day or date.
whenstringRead-only: the days or dates in words, e.g. Sat, Sun.

Create a surcharge​

curl -X POST "https://app.equipdash.com/api/v1/settings/surcharges" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"label": "Weekend surcharge",
"applies_on": "days",
"days": [6, 0],
"amount": 15,
"unit": "percent"
}'

Success (201 Created)​

{
"data": {
"id": 4,
"label": "Weekend surcharge",
"applies_on": "days",
"days": [0, 6],
"dates": [],
"amount": 15,
"unit": "percent",
"active": true,
"when": "Sat, Sun"
},
"meta": { "request_id": "...", "timestamp": "..." }
}

Refused (422)​

{
"error": { "code": "validation_error", "message": "A percent surcharge can be at most 100%.", "details": [] },
"meta": { "request_id": "...", "timestamp": "..." }
}

Update and delete​

PUT /v1/settings/surcharges/{id} takes any of the fields above and leaves the rest as they are. DELETE returns 204. A rule from another shop answers 404.

On a booking​

Every booking carries the surcharges it was charged:

"surcharges": [
{ "id": 31, "label": "Weekend surcharge", "unit": "percent", "rate": 15, "amount": 12.00, "waived": false }
],
"surcharge_total": 12.00

amount is what the line adds to the booking; a waived line reads 0. POST /v1/pricing/calculate returns the same lines under surcharges, and summary.surcharge_total, and includes them in summary.subtotal_with_delivery.

Waive a surcharge on one booking​

POST /v1/bookings/{id}/surcharges/{lineId}/waive

Requires bookings:write. lineId is the id from the booking's surcharges. Send {"waived": false} to put it back; the default is true. The booking is re-totaled and the change noted in its history, and the updated booking is returned. A cancelled booking answers 422; another shop's booking answers 404.