Setting up Webhooks

Prev Next

This feature is available on these plans (view pricing)

Kick Starter
Nail & Scale

Receive BookingTimes events in your webhook endpoint

Overview

Create an event destination to receive events at an HTTPS webhook endpoint. After you register a webhook endpoint, BookingTimes can push event data to your webhook endpoint as they happen in your BookingTimes website.

You can register and create one endpoint to handle several different event types at the same time, or set up individual endpoints for specific events.

Events are sent by a background process that runs about once a minute, so an event normally arrives within a minute or two of the action that raised it.

To enable, you must be on the Nail & Scale plan and contact BookingTimes to enable.

Steps

  1. Navigate to Setup > Integrations > Webhooks

  2. Click "Add Webhook"

  3. Add the Webhook's Endpoint URL, Description and API Key. The Endpoint URL must start with https://. The API Key is sent to your endpoint in the x-api-key header of every call.

  4. The API Secret is optional. When one is set, every call is signed so your endpoint can prove it came from BookingTimes (see Verifying the signature below).

  5. Select which events are going to the endpoint. You can create multiple endpoints.

Event Type

Description

client.create POST

Fired on new client records.

client.update POST

Fired on updates to existing client records.

client.membership POST

Fired when a client is added to or removed from a membership.

booking.create POST

Fired on new bookings.

booking.update POST

Fired on updates to existing bookings, including when a booking is paid.

booking.cancel POST

Fired when a booking is cancelled.

booking.pass POST

Fired when a booking is marked as passed.

booking.fail POST

Fired when a booking is marked as failed.

booking.postbooking POST

Fired once, about 15 minutes after a booking's end time, for a booking that took place.

payment.received POST

Fired when a booking, package, voucher, account top-up, deposit or online shop order is paid.

payment.refunded POST

Fired when a refund is recorded. Every amount on the payload is negative.

payment.cancelled POST

Fired when a payment is cancelled (reversed) on a booking or sale. The payload carries the amounts that were cancelled.


Delivery and retries

Every event is an HTTPS POST to your Endpoint URL with a JSON body, Content-Type: application/json, and your API Key in the x-api-key header.

Respond with any 2xx status code (for example 200 or 204) to confirm receipt. Any other response, or no response at all, is treated as a failed attempt. A failed event is retried on each later run, up to 5 attempts, for up to a week after the event was raised. After that it is no longer sent automatically and can be resent from the Webhook Event History.

A retried delivery is a fresh call with the same body and the same WebhookEventId. Use WebhookEventId to ignore an event you have already processed.

Verifying the signature

When your webhook has an API Secret, every call also carries two headers:

Header

Description

x-timestamp

The send time in Unix seconds (UTC).

x-signature

Lowercase hex HMAC-SHA256, keyed with your API Secret, of the string {x-timestamp}.{body}: the timestamp, a full stop, then the exact request body.

To verify a call:

  1. Read the raw request body as bytes before any JSON parsing.

  2. Compute HMAC-SHA256 with your API Secret as the key over the x-timestamp header value, a full stop, then the body bytes.

  3. Hex-encode the result in lowercase and compare it to x-signature using a constant-time comparison.

  4. Reject the call if the signatures differ, or if x-timestamp is more than 5 minutes from your clock.

Each attempt is signed afresh, so a retried delivery carries a new timestamp and signature. A webhook with no API Secret is sent without these headers.


Webhook Event History

Steps

  1. You can click on the webhook to view the events that have been sent.

  1. Click on the eye icon to view the JSON request and the response that was received, or the Resend button to resend the event to your server. An event that has not been tried yet shows as Pending, and a failed attempt shows its response code in red while it is being retried.


Client JSON

Sent for:

  • client.create

  • client.update

Dates and times are in your business's local time unless the description says otherwise.

Field

Type

Description

Event

String

The event type

Example: client.update

SiteUrl

String

The website the event came from

Example: www.yourdrivingschool.com.au

ClientId

Integer

Unique Client ID

Example: 1122345

WebhookEventId

Integer

Unique ID of this event. The same value is sent again on a retry or resend

Example: 774316

FirstName

String

The client's first name

Example: Bradley

LastName

String

The client's last name

Example: Jones

Email

String

The client's primary Email address

Example: bradley@bookingtimes.com

DateOfBirth

Date

The client's date of birth (yyyy-MM-dd). Omitted when not recorded

Example: 2015-04-21

Gender

String

Male, Female, NonBinary or Other. Null when not recorded

Example: Male

Mobile

String

The client's mobile phone number. Omitted when blank

Example: 011 222 3333

HomePhone

String

The client's home phone number. Null when blank

Example: 02 9999 1111

WorkPhone

String

The client's work phone number. Null when blank

Example: 02 9999 2222

Active

Boolean

Whether the client record is active

Example: true

AddressLine1

String

Address line 1. Null when blank

Example: 1 Test Street

AddressLine2

String

Address line 2. Null when blank

Example: Unit 4

AddressSuburb

String

Suburb or city. Null when blank

Example: Melbourne

AddressState

String

State or province. Null when blank

Example: VIC

AddressPostCode

String

Post code or ZIP. Null when blank

Example: 3000

CreatedDate

DateTime

When the client record was created (yyyy-MM-ddTHH:mm:ss, server time)

Example: 2026-10-04T22:03:11

CreatedBy

String

Client when the client signed up online, Staff when a staff member added them, Import when imported

Example: Client

LastModDate

DateTime

When the client record was last changed (yyyy-MM-ddTHH:mm:ss, server time, like CreatedDate)

Example: 2026-10-16T13:32:16

LastModBy

String

Staff when a staff member made the last change, otherwise Client

Example: Client

ReferredByTypeDescr

String

How the client said they heard about you. Omitted when blank

Example: Internet

MembershipNumber

String

The client's membership number. Only sent when your site shows the Membership Number field, and omitted when blank

Example: 4889568400

IsAuthenticated

Boolean

Whether the client has verified their login

Example: true

NewsletterSubscriber

Boolean

Marketing consent: the client receives newsletters, bulk SMS and marketing sequences

Example: true

UnsubscribeDate

DateTime

When the client unsubscribed from marketing. Null while subscribed

Example: 2026-09-30T08:15:00

ReceiveReminders

Boolean

Communication consent: the client receives reminders about their bookings

Example: true

TermsAccepted

Boolean

Whether the client has accepted your terms, which they do when they first log in

Example: true

TermsAcceptedDate

DateTime

When the client first logged in and accepted your terms. Null until they have logged in

Example: 2026-10-04T22:05:40

TermsAcceptedIp

String

The IP address the terms were accepted from. Null until they have logged in

Example: 203.0.113.10

TermsAcceptedCountry

String

The country the terms were accepted from. Null until they have logged in

Example: AU

Memberships

Array

The memberships the client currently holds. Empty when none

Example: [{"MembershipId": 2898, "MembershipName": "Gold Member"}]

Attribution

Object

The marketing source recorded when the client signed up. Omitted when there is none

Example: See Attribution JSON


Client Membership JSON

Sent for:

  • client.membership

Field

Type

Description

Event

String

The event type

Example: client.membership

WebhookEventId

Integer

Unique ID of this event. The same value is sent again on a retry or resend

Example: 774318

ClientId

String

Unique Client ID, sent as a string

Example: "1122345"

MembershipId

String

Unique Membership ID, sent as a string

Example: "2898"

Membership

String

The membership's name

Example: Gold Member

Active

Boolean

true when the client was added to the membership, false when removed

Example: true


Booking JSON

Sent for:

  • booking.create

  • booking.update

  • booking.cancel

  • booking.pass

  • booking.fail

  • booking.postbooking

Dates and times are in the location's local time unless the description says otherwise.

Field

Type

Description

EventCode

String

The event type

Example: booking.create

SiteUrl

String

The website the event came from

Example: www.yourdrivingschool.com.au

BookingId

Integer

Unique booking ID

Example: 778899

BookingDate

String

Date of the booking (yyyy-MM-dd)

Example: 2025-10-22

BookingTime

String

Time of the booking (HH:mm, 24-hour)

Example: 09:00

BookingDateTimeUtc

DateTime

The booking's start in UTC

Example: 2025-10-21T22:00:00Z

LocationName

String

Name of the location

Example: Sydney

StaffId

Integer

Unique ID of the assigned staff member

Example: 9318

StaffFirstName

String

First name of the assigned staff member

Example: Jelena

StaffLastName

String

Last name of the assigned staff member

Example: Jones

StaffEmail

String

Email address of the assigned staff member

Example: jelena@bookingtimes.com

StaffAccreditation

String

The staff member's accreditation (National Provider ID# on US sites). Blank when not recorded

Example: DI12345

ClientId

Integer

Unique Client ID

Example: 1122345

ClientName

String

Client's full name

Example: William Smith

ClientFirstName

String

Client's first name

Example: William

ClientLastName

String

Client's last name

Example: Smith

ClientEmail

String

Client's primary Email address

Example: william@bookingtimes.com

ClientMobile

String

Client's mobile phone number

Example: 011 222 3333

ClientServiceCount

Integer

How many bookings this client has had for the services on this booking, counting this one

Example: 4

BookingStatus

String

Booked, Paid, Cancelled or No Show

Example: Booked

ServiceNames

String

Services associated with the booking, comma separated

Example: Remote Online Meeting

WebhookEventId

Integer

Unique ID of this event. The same value is sent again on a retry or resend

Example: 774294

DurationMinutes

Integer

The booked length in minutes across all services on the booking

Example: 60

SuburbName

String

Pick-up suburb. Blank when not set

Example: Stafford Heights

PostCode

String

Pick-up post code. Blank when not set

Example: 4053

DropOffSuburbName

String

Drop-off suburb. Blank when not set

Example: Stafford Heights

DropOffPostCode

String

Drop-off post code. Blank when not set

Example: 4053

BookingSource

String

Client when booked online by the client, Staff when made by a staff member, Recurring when generated by a repeating booking, Import when imported

Example: Client

CreatedDate

DateTime

When the booking was made (yyyy-MM-ddTHH:mm:ss, server time)

Example: 2026-10-04T21:49:19

PaidDate

DateTime

When the booking was paid. Null while unpaid

Example: 2026-10-04T21:49:22

RetailPrice

Decimal

Full retail price of the booking's services

Example: 93.00

SalePrice

Decimal

Price charged after any discount

Example: 93.00

AmountPaid

Decimal

Total paid so far, including voucher and account balance redemptions

Example: 93.00

VoucherAmount

Decimal

The part of AmountPaid that was paid by voucher or package

Example: 0.00

PaymentStatus

String

Unpaid, Deposit (a deposit or part payment is held against an outstanding balance), Paid, or Refunded (a cancellation credited the payment back)

Example: Paid

InvoiceNbr

Integer

The booking's invoice number. Null when none has been issued

Example: 3729

InvoiceUrl

String

Admin link to the booking, relative to https://SiteUrl

Example: /Admin/Booking?Bki=778899

PaymentMethod

String

Cash, Card, Eft, Other, Voucher, ClientAccount or OrganisationAccount; Mixed when more than one carries the payment. Null while unpaid

Example: Card

PaymentGateway

String

The online payment gateway used. Blank for a manual payment

Example: Stripe

GatewayTransactionId

String

The gateway's transaction reference. Blank for a manual payment

Example: pi_3Q7h2k...

CreditCardSurchargeAmt

Decimal

Card surcharge charged on top of the price

Example: 1.40

CancelledDate

DateTime

When the booking was cancelled. Null while the booking stands

Example: 2026-10-04T20:29:25

CancelledBy

String

Client or Staff. Blank while the booking stands

Example: Client

CancelledReason

String

The cancellation reason code. Blank while the booking stands

Example: RESCHED

CancelledReasonText

String

Free-text cancellation note. Blank when none

Example: Car in for service

Attribution

Object

The marketing source recorded when the booking was made. Omitted when there is none

Example: See Attribution JSON


Payment JSON

Sent for:

  • payment.received

  • payment.refunded

  • payment.cancelled

On payment.refunded every amount is negative. On payment.cancelled the amounts are those that were cancelled.

Amount is money actually received. A voucher, package or account balance redemption spends money that was received when the voucher, package or top-up was sold, so it is reported in its own field and left out of Amount. A payment made wholly by voucher or account balance has an Amount of 0.

A payment on a booking carries the booking's totals to date, so a booking paid in several part payments reports the running total each time.

Field

Type

Description

Event

String

The event type

Example: payment.received

SiteUrl

String

The website the event came from

Example: www.yourdrivingschool.com.au

WebhookEventId

Integer

Unique ID of this event. The same value is sent again on a retry or resend

Example: 774320

CurrencyCode

String

ISO 4217 code every amount on the payment is in

Example: AUD

SaleType

String

B for a booking, S for a product sale or refund, W for an online shop order

Example: B

SaleId

Integer

The booking, sale or order ID, as SaleType says

Example: 778899

InvoiceNbr

Integer

The invoice number. A deposit sale has its own invoice number, separate from its booking's

Example: 3729

InvoiceUrl

String

Admin link to the booking, sale, refund or order, relative to https://SiteUrl

Example: /Admin/Booking?Bki=778899

BookingId

Integer

The booking paid for, or the booking a deposit or cancellation fee sale was taken for. Null for any other sale

Example: 778899

PaidDate

DateTime

When the payment was taken, in your business's local time

Example: 2026-10-09T16:16:36

PaidDateUtc

DateTime

When the payment was taken, in UTC

Example: 2026-10-09T06:16:36Z

Amount

Decimal

Money received: CashAmt + CreditAmt + EftAmt + HealthInsuranceAmt + MedicareAmt + DvaAmt + OtherAmt + CreditCardSurchargeAmt. Negative on a refund

Example: 71.40

CashAmt

Decimal

Paid in cash

Example: 70.00

CreditAmt

Decimal

Paid by card

Example: 0.00

EftAmt

Decimal

Paid by bank transfer (including POLi, PayTo and account-to-account online payments)

Example: 0.00

HealthInsuranceAmt

Decimal

Paid by health insurance claim

Example: 0.00

MedicareAmt

Decimal

Paid by Medicare claim

Example: 0.00

DvaAmt

Decimal

Paid by DVA claim

Example: 0.00

OtherAmt

Decimal

Paid by another method

Example: 0.00

VoucherAmt

Decimal

Redeemed from a voucher or package. Not included in Amount

Example: 0.00

ClientAccountAmt

Decimal

Redeemed from the client's account balance. Not included in Amount

Example: 0.00

OrganisationAccountAmt

Decimal

Redeemed from an organisation's account balance. Not included in Amount

Example: 0.00

CreditCardSurchargeAmt

Decimal

Card surcharge charged on top of the price

Example: 1.40

VatAmount

Decimal

Tax (GST, VAT or sales tax) included in the payment

Example: 6.49

Tips

Decimal

Tip included in the payment

Example: 0.00

PaymentGateway

String

The online payment gateway used. Blank for a manual payment

Example: Stripe

GatewayTransactionId

String

The gateway's transaction reference. Blank for a manual payment

Example: pi_3Q7h2k...

PaymentMethod

String

Cash, Card, Eft, Other, Voucher, ClientAccount or OrganisationAccount; Mixed when more than one carries the payment

Example: Cash

ClientId

Integer

Unique Client ID of the client the booking or sale belongs to

Example: 1122345

ClientFirstName

String

Client's first name

Example: William

ClientLastName

String

Client's last name

Example: Smith

ClientEmail

String

Client's primary Email address

Example: william@bookingtimes.com

ClientMobile

String

Client's mobile phone number

Example: 011 222 3333

PaidByClientId

Integer

The client who made the payment: the client themselves, or someone paying on their behalf such as a parent. Null when not recorded

Example: 1122300

PaidBy

String

Full name of the client who made the payment. Null when not recorded

Example: Karen Smith

CreatedDate

DateTime

When this payment, refund or cancellation was recorded

Example: 2026-10-17T10:00:00

CreatedBy

String

Staff when a staff member recorded this payment, refund or cancellation, otherwise Client, including a payment the client made online and a saved card charged automatically

Example: Staff

StaffId

Integer

The staff member on the booking or sale. Null when none

Example: 9318

LocationName

String

Name of the location

Example: Sydney

Items

Array

The product lines on the sale. Empty for a booking with no products

Example: See Payment Item JSON

Attribution

Object

The marketing source recorded for the booking or order. Omitted when there is none

Example: See Attribution JSON

Payment Item JSON

Each entry in Items. On a refund the unit price, line total and tax are negative. The item lines' tax adds up to the product tax only: the payment's VatAmount also carries the tax on a booking's services and on the card surcharge.

Field

Type

Description

ProductId

Integer

Unique product ID

Example: 45678

ProductName

String

The product's name

Example: 5 Lesson Package

ProductTypeCd

String

A account adjustment, B bundle, F downloadable file, G physical product, I external course, L online course, M gift certificate, R membership, S general item or service, V voucher

Example: V

CategoryName

String

The product's category. Null when it has none

Example: Vouchers

Quantity

Decimal

Quantity sold

Example: 5

RetailUnitPrice

Decimal

The price of one

Example: 69.00

RetailPrice

Decimal

The line's price across its whole quantity

Example: 345.00

VatAmount

Decimal

The tax on the line across its whole quantity

Example: 31.36


Attribution JSON

The Attribution object on booking, payment and client events. It is only sent when BookingTimes recorded the marketing source of the visit that made the booking, order or sign-up, which requires the Traffic+ add-on. When there is no attribution the key is left out of the payload altogether.

Field

Type

Description

Source

String

Where the visit came from. The campaign source (utm_source) when the link carried one, otherwise the search engine or ad network (google, bing, facebook), the referring site's domain, or newsletter or sequence for your own emails. Null for a direct visit. On client events this is the visit on which the client signed up

Example: google

Medium

String

Campaign medium (utm_medium)

Example: cpc

Campaign

String

Campaign name (utm_campaign)

Example: Spring Lessons

CampaignId

String

Campaign ID (utm_id)

Example: 21345678901

AdClickId

String

The ad click ID the visit arrived with (gclid, fbclid, gbraid, wbraid, ttclid and similar)

Example: CjwKCAjw...

Keywords

String

Campaign keywords (utm_term)

Example: driving lessons sydney

AdContentDesc

String

Campaign content (utm_content)

Example: banner-a

UrlReferrer

String

The referring page

Example: https://www.google.com/

LandingPage

String

The first page of the visit

Example: /driving-lessons

IsPaid

Boolean

The visit came from paid advertising

Example: true

IsOrganic

Boolean

The visit came from an organic search result

Example: false

IsReferral

Boolean

The visit came from a link on another website

Example: false

IsDirect

Boolean

The visitor typed the address or used a bookmark

Example: false


Contact and Support

For additional assistance or to report issues with Webhooks, please contact support@bookingtimes.com or visit our Support Page.