Webhooks
A Wherewolf webhook sends guests or bookings to an endpoint of yours as they change. Customers add, change and pause their webhooks themselves in the Dashboard, under Settings › Webhooks, on plans that include webhooks. Setting one up, and checking each request and what the endpoint answered, is described in the help centre: Webhooks: sending guests and bookings to your own systems.
This page is for whoever builds the endpoint.
The request
- A
POSTto the webhook’s URL, with a JSON body andContent-Type: application/json. Use anhttpsURL. - Authentication: the webhook’s Auth Field and Auth Value are sent as a header,
<Auth Field>: <Auth Value>, for exampleX-API-KEY: your-key. A webhook with no Auth Value sends no header. Some webhooks Wherewolf set up before the Dashboard managed them sendAuthorization: Basic <base64 of field:value>instead. - Only what the customer chose: each webhook sends the fields its whitelist names, plus the fields listed below as always sent.
- Only changes made after the webhook is added are sent. Changes made within a few seconds of each other arrive as one request with the latest state, and a booking that the booking system sends again unchanged is not sent again.
Guest webhooks
Sent when a guest completes a waiver, and again whenever the guest changes: they check in on arrival, staff edit them, their status changes and so on.
{
"guest": {
"activities": ["harbourcruise"],
"email": "alex@example.com",
"lastVisit": "2026-11-04T21:00:00.000Z",
"name": "Alex Example",
"returnedToBase": "Still out",
"id": "abc123_newGuest441298_1762034567890",
"TMP_id": "abc123_newGuest441298_1762034567890",
"deleted": false,
"reservationsID": "385210441",
"reservationsService": "fareharbor",
"status": "Checked In"
}
}
Always sent:
| Field | Meaning |
|---|---|
id | The guest’s ID. TMP_id repeats it for older integrations. |
status | Active, Checked In, Deleted, Finalised, Incomplete, Ineligible, No-Show or Blank |
deleted | true when status is Deleted |
reservationsID | The booking the guest belongs to, as the booking system identifies it; absent for a walk-in |
reservationsService | The App’s booking system, such as fareharbor, rezdy or none |
Any other guest field can be chosen, the App’s custom fields among them, under each custom field’s property name (returnedToBase above). lastVisit is in UTC. A guest that skipped a question has no value for it.
Booking webhooks
Sent when a booking from the App’s booking system is created, updated or cancelled, for the events the webhook receives.
{
"event": "updated",
"changedFields": ["pax", "startTime"],
"booking": {
"customer": { "email": "alex@example.com", "name": "Alex Example", "phoneNumber": "+64 21 000 0000" },
"pax": 3,
"startTime": "2026-11-04T21:00:00.000Z",
"waiverLink": "https://web.wherewolf.co.nz/xk4p2q",
"id": "385210441",
"pool": "abc123",
"provider": "fareharbor",
"status": "Active"
}
}
| Field | Meaning |
|---|---|
event | created, updated or cancelled. A rebooking is updated, with status Rebooked. |
changedFields | For updated only: the booking fields that changed |
booking.id | The booking system’s ID for the booking; a guest’s reservationsID holds the same value |
booking.pool | The Wherewolf App’s ID |
booking.provider | The booking system |
booking.status | Active, Deleted (cancelled), Pending or Rebooked |
The booking fields a webhook can choose:
| Field | Meaning |
|---|---|
activities | The IDs of the booked activities |
activitiesAsObjects | Each booked activity’s id and name |
bookedSessions | Each booked session’s activityId, activityName, startsAt and endsAt |
bookingLabel | A short summary, such as the customer’s name, the activity and the number of people |
customer | name, and email and phoneNumber when the booking system has them |
displayId | The booking number the booking system shows its customers |
endTime, startTime | When the booking ends and starts, in UTC |
name | The name the booking is under |
paid | The payment status, in the booking system’s own words |
pax | The number of people booked |
waiverLink | The booking’s waiver link, as the pre-arrival email sends it; null for a cancelled booking. Anyone with it can open that booking’s waiver. |
Booking webhooks carry no participants and no custom fields; custom fields belong to guests.
Answering
Return a successful final response, normally 200 OK. Wherewolf records the request as delivered only when the final answer is a 2xx, is not an HTML page, and its body does not say "success": false, "ok": false, or "status": "error" or "failed". Any other body, including an empty one, is fine. This confirms your endpoint’s acknowledgement; it does not prove that downstream work has finished.
Redirects
Wherewolf follows up to ten redirects and validates the final response using the same rules as a direct response. A redirect by itself does not confirm delivery.
| Redirect | Request to the next URL |
|---|---|
301, 302, 303 | A GET, without the original POST body |
307, 308 | The original method and JSON body |
The configured authentication header is removed when a redirect changes origin (scheme, host or port). Keep authentication on the receiving endpoint; do not require that header on a receipt hosted at another origin.
Google Apps Script’s ContentService processes the POST and redirects to its response on script.googleusercontent.com. Configure the webhook with the deployed script’s /exec URL, rather than copying the temporary content URL. Return a plain-text or JSON acknowledgement, such as {"ok": true}, and make the deployment accessible without an interactive Google sign-in. Wherewolf follows the content redirect with a GET and checks the final response. Google documents this flow in its Content Service guide. A login page, an error page, a negative acknowledgement or a redirect loop cannot confirm delivery, even if a page returns HTTP 200.
Failures and retries
- A direct
4xxanswer (other than408), or an address that cannot be resolved or refuses the connection, is recorded as Failed. Eligible definite rejections may be retried immediately up to three times, with later attempts about 5 minutes later and about 25 minutes after that, while the webhook remains enabled. - A
5xx, a timeout, an HTML page or a negative acknowledgement is recorded as Sent: sent, but not confirmed. Wherewolf does not automatically resend an uncertain POST, because your endpoint may already have processed it. - After any redirect, an unconfirmed final response stays Sent, even if the receipt returns a
4xxor cannot be reached. The original POST is not resent automatically. Check your service’s records before deciding whether the guest or booking needs to be sent again.
An x-request-id header on a successful answer is shown with the delivery in the Dashboard as its reference.
Every attempt’s request (URL, headers, body) and final answer (status, headers, final URL, redirect chain and up to 256 KB of the body) is saved, and the customer can open it from Discover › Automations in the Dashboard. The saved request includes the auth header.