Webhooks Integration

By setting up a web hook, TimeTap can send you notifications anytime your clients or staff members book an appointment for your business.

Our Notification service consists of a 3-step process:

  1.  A client or staff member books an appointment

  2.  TimeTap posts the notification with the appointment information as a JSON object to your webserver endpoint

  3.  Your webserver application processes the JSON object

Requirements:

  • A webserver running an endpoint application capable of receiving a POST request

Notes:

  • Any update made to an appointment will cause a webhook to get fired - not just appointment booking but also appointment editing and appointment deletion

  • Webhooks are specific to appointments. Any changes made to staff or client objects not involved with an appointment will not generate a webhook.

In this guide, we'll cover:

 


Webserver Requirements

 

To receive a notification from TimeTap, you'll need to set up an endpoint to handle a POST request from our system. The post request will contain a JSON object (example shown below) with appointment data.

Once your endpoint is setup, provide the URL by going to Settings → Integrations in the backoffice, then scroll down to the Other Integrations section and click on the Webhook icon to expand:

With the Webhook area expanded, click the Activate Webhook button: 

Enter the endpoint  URL and click the "Update Webhook URL" button: 




Appointment Object Relational Structure 


Appointment JSON Object Structure and Example

Appointment objects have several top-level properties, whose types can be viewed here: Appointment Object Values

In addition, appointment objects also have child objects for: Reasons (Service or Class), Client, Staff, Location, and an array of Custom Fields.

Here's the basic structure of an Appointment object:

{ "top-level properties" : "...", "reason" { Object }, "client" { Object }, "staff" { Object }, "location" { Object }, "fields" { Array } }



Here's an abbreviated example of what the Appointment JSON object looks like:

Appointment JSON Object
{ "calendarid":10390617, "businessId":20398, "startTime":800, "endTime":845, "clientStartTime":800, "clientEndTime":845, "reason":{ "reasonId":96439, "businessId":20398, "visitMinutes":45, "reasonDesc":"Service3" }, "client":{ "clientId":2530974, "firstName":"Jon", "lastName":"Snow", "emailAddress":"jsnow@castleblack.mil", "city":"Victoria", "notes":"Jon would like a notification before his appointment.", }, "staff":{ "professionalId" : 42441, "businessId":20398, "userName":"DrJones2", "email": "djones2@marshallcollege.edu" "timeZoneCode":{ "timeZoneId":78, "timeZoneCode":"America/New_York", "timeZoneDesc":"America/New_York", }, "location":{ "locationId":29945, "locationName":"MyOffice", "businessId":20398, "locationType":"Office" }, "fields": [ { "required" : false, "serviceIds" : [ 107292 ], "userDefinedField" : false, "dataType" : "AREA", "active" : true, "code" : "UDF", "visibleOnScheduler" : true, "validationRegex" : null, "sortOrder" : 21, "businessId" : 23144, "hint" : null, "filterByService" : true, "oldFieldIds" : null, "createdUser" : "mpbtest138", "labelTag" : "%CUSTOM_FIELD_107740_LABEL%", "modifiedDate" : 1488575155000, "tagName" : null, "modifiedUser" : "MPBTEST138", "label" : "Comments", "createdDate" : 1488394066000, "value" : "These are comments ", "extendedValue" : "These are comments ", "validationError" : null, "fieldValues" : null, "visible" : true, "schedulerPreferenceFieldDefnId" : 107740, "mode" : "APPT", "valueTag" : "%CUSTOM_FIELD_107740%" }, { "required" : null, "serviceIds" : null, "userDefinedField" : true, "dataType" : "TXT", "active" : true, "code" : "UDF", "visibleOnScheduler" : true, "validationRegex" : null, "sortOrder" : 22, "businessId" : 23144, "hint" : null, "filterByService" : false, "oldFieldIds" : null, "createdUser" : "MPBTEST138", "labelTag" : "%CUSTOM_FIELD_108594_LABEL%", "modifiedDate" : 1488575322000, "tagName" : null, "modifiedUser" : "MPBTEST138", "label" : "My Custom Field", "createdDate" : 1488575322000, "value" : "Custom field value", "extendedValue" : "Custom field value", "validationError" : null, "fieldValues" : null, "visible" : true, "schedulerPreferenceFieldDefnId" : 108594, "mode" : "APPT", "valueTag" : "%CUSTOM_FIELD_108594%" } ], }




Object Values

Reason Object 

Reason object value types can be found here: Reason Object Value Types

"reason" : { "modifiedUser" : "MPBTEST138", "internalDisplayName" : "Service 1", "serviceLocations" : null, "reasonId" : 107292, "apptHrMin" : null, "emailInstructions2" : null, "taxable" : false, "professionalServiceList" : null, "businessId" : 23144, "rescheduleType" : null, "maxWaitListPerClass" : null, "visitMinutes" : 60, "customWorkSchedule" : 0, "reasonType" : "SERVICE", "numberSessions" : null, "bufferBefore" : null, "personal" : false, "privateUrl" : null, "embedCode" : null, "screeningQuestion" : null, "emailInstructions" : null, "currencySymbol" : null, "apptDayMax" : null, "professionalId" : null, "durationList" : null, "quotaType" : null, "allowOnline" : true, "allowWaitList" : false, "active" : true, "price" : null, "color" : null, "discountedPrice" : null, "sortWeight" : 0, "customFieldForm" : null, "bufferAfter" : null, "internalName" : null, "quotaFilled" : null, "depositAmount" : null, "allowPrePay" : false, "reasonDetail" : null, "quota" : null, "reasonDesc" : "Service 1" }




Client Object 

Client objects contain top-level properties, as well as a nested array of Custom Fields.

Client object value types can be found here: Client Object Value Types

 


Staff Object 

Staff object value types can be found here: Staff Object Value Types

 


Location Object 

Location object value types can be found here: Location Object Value Types

 


Custom Fields Object 

Custom Field Value Types:

Property Name

Type

Description

Property Name

Type

Description

required

boolean

Signifies if the field is required when booking an appointment

serviceIds

integer array

Identifies which services this field is attached to

userDefinedField

boolean

Signifies if the field is user-generated or TimeTap system field

dataType

string

Signifies the type of field, ex. "TXT" = text field

active

boolean

Signifies if the field is active

code

string

Signifies if the field is user-generated or TimeTap system field

visibleOnScheduler

boolean

Signifies if the field is visible on the client-facing scheduler

validationRegex

string

Signifies a regular expression used to validate the field's value

sortOrder

integer

Signifies the field's display order in relation to other fields

businessId

integer

The account business id

hint

string

The "field hint" value

filterByService

boolean

Filters custom field by service

createdUser

string

The username of the user that created the field

labelTag

string

A special tag used to identify the field

modifiedDate

integer

The last date the field was modified

tagName

string

A special tag used to identify the field

modifiedUser

string

The username of the user who last modified the field

label

string

The field's label

createdDate

integer

The date on which the field was created

value

string

The field's value, entered by the user or user's client when booking an appointment

extendedValue

string

The field's value, entered by the user or user's client when booking an appointment

fieldValues

string

Values for LIST-type custom fields

visible

boolean

Signifies if the field is visible on the client scheduler

mode

string

Signifies if the field belongs to client record or appointment record. Ex, "CLIENT", "APPT"

valueTag

string

A special tag used to identify the field