Skip to main content

Third-party Webhooks

Configure webhooks in supported PMS that send data payloads in real time.

Overviewā€‹

When an event occurs in a third-party platform, such as a change to end user data, that platform can be configured to send Calry a webhook with a data payload to give you real-time updates regardless of the rate at which Calry syncs data.

Third-party Webhooks

Follow the setup instructions below to enable Calry to receive third-party webhooks for a linked account.


Automatic Webhook Configurationā€‹

Calry is able to automatically create webhooks in supported third-party APIs to alert Calry of changes. This means neither you nor your end user needs to do the manual setup of a webhook per Linked Account.

Automatic webhooks are not enabled by default. To enable automatic webhooks, here are the steps:

  1. Go to the particular integration account and click on the Webhook tab.

Automatic Webhook Configuration

  1. Enter the name of the webhook, the URL that you want Calry to send a POST request to, toggle enable the webhook, and select the event types that you want to trigger the webhook.
  2. Click the Create button to create the webhook.

You will be notified the success message once the webhook is created. You can update or delete the webhook by clicking the respective buttons.


Manual Webhook Configurationā€‹

There are a few third-party applications that do not support automatic webhook creation via API, but do support manual webhook creation via UI.

The only way to set up webhooks for these integrations is:

  1. Have your end user manually configure the webhook subscriptions in their third-party app instance. See our supported integrations page to configure webhooks in the third party.
  2. Enter the name of the webhook, the URL that you want Calry to send a POST request to, toggle enable the webhook, and select the event types that you want to trigger the webhook.
  3. Click the Create button to create the webhook.

Manual Webhook Configuration

  1. Once your webhooks are configured, the third-party application will send webhooks to the Calry Listener URLs.

Webhooks will be sent from Calry to your system for all relevant Calry Webhooks you have set up, allowing real-time updates to flow from the PMS all the way to your system.

Calry ensures you have all the data you need in the webhooks' payload. For PMSs that don't include all the data you need in webhook events, we call their relevant end-points via API in real time and ensure you receive clean, normalized data updates.

Events typesā€‹

These are the events that are triggered by changes to a specific entity, such as when a reservation is created, updated, or deleted.

  1. Reservation Events
    1. reservation.created - A reservation has been created.
    2. reservation.updated - A reservation has been updated.
    3. reservation.deleted - A reservation has been deleted.
  2. Conversation Events
    1. conversation.updated - A conversation has been updated.

Payload Propertiesā€‹

The payload that Calry sends to your webhook endpoint will contain the following properties:

  1. hook - Object
    • id - string
      • The ID of the webhook that was triggered.
    • timestamp - string
      • The date and time that the webhook was triggered.
    • eventType - string
      • The type of event that triggered the webhook.
    • source - string
      • The source of the webhook that was triggered. [PMS_WEBHOOK]
  2. data - Object
    • integrationAccountId - string
      • The unique identifier for the Integration Account.
    • workspaceId - string
      • The unique identifier for the Workspace.
    • record - Object
      • The record that was created or updated or deleted.
    • result - SUCCESS | FAILURE
      • The result of the event that triggered the webhook.

Example Payloadsā€‹

  1. reservation.created event:
{
"hook": {
"id": "4f4c9f55-cb22-4004-8340-91c2010e04b1",
"eventType": "reservation.created",
"timestamp": "2024-08-21T13:13:15.449Z",
"source": "PMS_WEBHOOK"
},
"data": {
"integrationAccountId": "3fab694d-5403-4f79-ae16-2e36c3a69226",
"workspaceId": "a0f19bc2-3e69-4ea8-8893-8031ba0b0a0a",
"record": {
"id": "31696085",
"createdAt": "2024-08-21T13:11:45.000Z",
"updatedAt": "2024-08-21T13:11:45.000Z",
"cancelledAt": "",
"arrivalDate": "2025-03-19T00:00:00.000Z",
"departureDate": "2025-03-26T00:00:00.000Z",
"previousArrivalDate": "",
"previousDepartureDate": "",
"nights": 7,
"propertyId": "275807",
"numberOfGuests": 2,
"primaryGuest": {
"name": "Dolund Trump",
"nameFirst": "Dolund",
"nameLast": "Trump",
"emails": [
"dolund@trumptowers.com"
],
"mobileNumbers": [
"+18005550100"
],
"preferredLanguage": {
"code": "en",
"name": "ENGLISH"
},
"address": {
"line1": null,
"postal_code": null,
"city": "Phoenix",
"country": "US"
},
"pictures": [
null
]
},
"numberOfAdults": null,
"numberOfChildren": 1,
"numberOfInfants": null,
"numberOfPets": null,
"source": "HOMEAWAY",
"totalPrice": 7233,
"currency": "CAD",
"status": "CONFIRMED",
"arrivalEstimatedTime": "2024-08-21T12:00:00.000Z",
"departureEstimatedTime": "2024-08-21T11:00:00.000Z",
"codes": {
"accessCode": [
"2321912"
],
"confirmationCode": null
},
"notes": "Need parking spot near the property.",
"verification": {
"isIdentityVerified": false,
"isEmailVerified": false,
"isPhoneVerified": false,
"isGovernmentIdVerified": false
},
"finances": {
"totalPrice": 7233,
"currency": "CAD",
"remainingBalance": null,
"paymentStatus": "Unknown",
"basePrice": {
"totalBasePrice": 7000,
"breakdown": [
{
"name": "Base rate",
"description": "Base rate",
"type": "BASE_PRICE",
"units": 1,
"total": 7000,
"isMandatory": true
}
]
},
"fee": {
"totalFee": 137,
"breakdown": [
{
"name": "Cleaning fee",
"description": "Cleaning fee",
"type": "CLEANING_FEE",
"units": 1,
"total": 137,
"isMandatory": true
},
{
"type": "OTHER_FEE",
"total": null,
"isMandatory": false
}
]
},
"tax": {
"totalTax": 96,
"breakdown": [
{
"name": "City / Tourism tax",
"description": "City / Tourism tax",
"type": "CITY_TOURISM_TAX",
"units": 1,
"total": 11,
"isMandatory": true
},
{
"name": "Hotel tax",
"description": "Hotel tax",
"type": "HOTEL_TAX",
"units": 1,
"total": 11,
"isMandatory": true
},
{
"name": "Lodging tax",
"description": "Lodging tax",
"type": "LODGING_TAX",
"units": 1,
"total": 11,
"isMandatory": true
},
{
"name": "Occupancy tax",
"description": "Occupancy tax",
"type": "TRANSIENT_OCCUPANCY_TAX",
"units": 1,
"total": 11,
"isMandatory": true
},
{
"name": "Other taxes",
"description": "Other taxes",
"type": "OTHER_TAX",
"units": 1,
"total": 11,
"isMandatory": true
},
{
"name": "Room tax",
"description": "Room tax",
"type": "ROOM_TAX",
"units": 1,
"total": 11,
"isMandatory": true
},
{
"name": "Sales tax",
"description": "Sales tax",
"type": "SALES_TAX",
"units": 1,
"total": 10,
"isMandatory": true
},
{
"name": "VAT / GST",
"description": "VAT / GST",
"type": "VAT_GST",
"units": 1,
"total": 20,
"isMandatory": true
}
]
},
"discount": {
"totalDiscount": 0,
"breakdown": []
}
},
"customFields": [
{
"id": 55380,
"name": "Access Code",
"type": "text",
"value": "w0we921",
"defaultValue": null
}
]
},
"result": "SUCCESS"
}
}
  1. reservation.updated event:
{
"data": {
"record": {
"id": "12345678-1234-1234-1234-1234567890ab",
"codes": {
"accessCode": [],
"confirmationCode": null
},
"notes": "",
"nights": 2,
"source": "Booking.com",
"status": "CONFIRMED",
"currency": "USD",
"finances": {
"fee": {
"totalFee": 300.00,
"breakdown": [
{
"name": "",
"type": "CLEANING_FEE",
"total": 250.00
},
{
"name": "Service Charge",
"type": "OTHER_FEE",
"total": 50.00
}
]
},
"tax": {
"totalTax": 120.00,
"breakdown": [
{
"name": "",
"type": "OTHER_TAX",
"total": 20.00
},
{
"name": "Service Charge Tax",
"type": "FEE_TAX",
"total": 5.00
},
{
"name": "Accommodation Tax",
"type": "ROOM_TAX",
"total": 95.00,
"isMandatory": true
},
{
"name": "Security Deposit",
"type": "RENT_TAX",
"total": 0
}
]
},
"currency": "USD",
"basePrice": {
"breakdown": [
{
"name": "Base Price",
"type": "BASE_PRICE",
"total": 400.00,
"isMandatory": true
},
{
"name": "Base Price",
"type": "BASE_PRICE",
"total": 400.00,
"isMandatory": true
},
{
"name": "Base Price",
"type": "BASE_PRICE",
"total": 400.00,
"isMandatory": true
}
],
"totalBasePrice": 1200.00
},
"totalPrice": 1620.00
},
"createdAt": "2024-08-12T10:00:00.000Z",
"updatedAt": "2024-08-21T14:30:00.000Z",
"propertyId": "7890abcd-5678-1234-5678-abcdef123456",
"totalPrice": 1620.00,
"arrivalDate": "2024-08-16T16:00:00.000Z",
"customFields": [],
"numberOfPets": 0,
"primaryGuest": {
"name": "JohnDoe",
"emails": [
"johndoe@example.com"
],
"address": {
"city": "New York",
"line1": "123 Main St",
"country": "US",
"postal_code": "10001"
},
"nameLast": "Doe",
"nameFirst": "John",
"mobileNumbers": [
"+11234567890",
"+10987654321"
],
"preferredLanguage": {
"code": "EN",
"name": "English"
}
},
"departureDate": "2024-08-19T10:00:00.000Z",
"numberOfAdults": 2,
"numberOfGuests": 4,
"numberOfInfants": 0,
"numberOfChildren": 2,
"arrivalEstimatedTime": "2024-08-16T16:00:00.000Z",
"departureEstimatedTime": "2024-08-19T10:00:00.000Z"
},
"result": "SUCCESS",
"workspaceId": "abcd1234-abcd-1234-abcd-1234567890ab",
"integrationAccountId": "abcd5678-abcd-5678-abcd-1234567890ab"
},
"hook": {
"id": "5678abcd-1234-5678-abcd-1234567890ab",
"source": "PMS_WEBHOOK",
"eventType": "reservation.updated",
"timestamp": "2024-08-21T14:30:00.000Z"
}
}
  1. reservation.deleted event:
{
"data": {
"record": {
"id": 98765432
},
"result": "SUCCESS",
"workspaceId": "abcd1234-abcd-1234-abcd-1234567890ab",
"integrationAccountId": "1234abcd-5678-abcd-5678-abcdef123456"
},
"hook": {
"id": "87654321-abcd-5678-efgh-1234567890ab",
"source": "PMS_WEBHOOK",
"eventType": "reservation.deleted",
"timestamp": "2024-08-19T15:25:39.980Z"
}
}
  1. conversation.updated event:
{
"hook": {
"id": "53fd790f-4870-4e9d-95d1-25d50f0737df",
"eventType": "conversation.updated",
"timestamp": "2024-08-21T12:36:19.602Z",
"source": "PMS_WEBHOOK"
},
"data": {
"integrationAccountId": "3fab694d-5403-4f79-ae16-2e36c3a69226",
"workspaceId": "a0f19bc2-3e69-4ea8-8893-8031ba0b0a0a",
"record": {
"id": "19268317",
"reservationId": [
"29559109"
],
"propertyId": [
"275807"
],
"type": "host-guest-email",
"recipient": {
"name": "Lex Fridman",
"email": "daval.pravin@gmail.com",
"phone": "",
"picture": null
},
"updatedAt": "2024-08-21T12:32:31.000Z",
"messages": [
{
"id": "172337938",
"body": "What's the easiest way to reach your location from the local train station?",
"senderType": "Guest",
"createdAt": "2024-08-21T12:36:06.000Z",
"updatedAt": "2024-08-21T12:36:06.000Z",
"seenStatus": "unseen",
"attachments": []
},
{
"id": "172337396",
"body": "Thanks for the information. Looking forward to the stay!",
"senderType": "Guest",
"createdAt": "2024-08-21T12:33:32.000Z",
"updatedAt": "2024-08-21T12:33:32.000Z",
"seenStatus": "unseen",
"attachments": []
},
{
"id": "172337209",
"body": "Dear Lex,\n\nThank you for your inquiry.\n\nYes, we do have parking available on our property. There are no extra charges for parking; it is included in your reservation.\n\nRegarding your question about a swimming pool on the property, I regret to inform you that we do not have a swimming pool available. However, there are plenty of outdoor activities near the lake for you to enjoy during your stay.\n\nIf you have any further questions or need assistance with anything else, please feel free to let us know.\n\nBest regards.",
"senderType": "Owner",
"createdAt": "2024-08-21T12:32:31.000Z",
"updatedAt": "2024-08-21T12:32:32.000Z",
"seenStatus": "seen",
"attachments": []
},
{
"id": "167090000",
"body": "Do you have a swimming pool in your property?\n\nIs there an extra cost for that?\n\nBest,\n\nLex",
"senderType": "Guest",
"createdAt": "2024-08-05T12:25:05.000Z",
"updatedAt": "2024-08-05T12:25:05.000Z",
"seenStatus": "unseen",
"attachments": []
},
{
"id": "153160392",
"body": "Do you have parking available in your property?\n\nIf there are any extra charges, what is it?\n\nBest,\n\nLex",
"senderType": "Guest",
"createdAt": "2024-06-24T13:15:06.000Z",
"updatedAt": "2024-06-24T13:15:06.000Z",
"seenStatus": "unseen",
"attachments": []
},
{
"id": "152250861",
"body": "Will do, thanks!\n\nAre there any kayaking centres near your resort? Iā€™d like to book one\n\nduring our stay.",
"senderType": "Guest",
"createdAt": "2024-06-21T09:53:04.000Z",
"updatedAt": "2024-06-21T09:53:04.000Z",
"seenStatus": "unseen",
"attachments": []
},
{
"id": "152250494",
"body": "<p>Hey, thanks for making the reservation. I'm your host, please feel free to text me back for any assistance.</p>",
"senderType": "Owner",
"createdAt": "2024-06-21T09:50:59.000Z",
"updatedAt": "2024-06-21T09:50:59.000Z",
"seenStatus": "seen",
"attachments": []
}
]
},
"result": "SUCCESS"
}
}