Login / Sign Up

PMS Booking Connection Packet

The holidaymaker™ app surfaces have the ability to request booking information from various PMS connections. The reason for this is to personalise the app experience for the guest by giving them a countdown to their holiday and easy to access core information about their booking. The large advantage to the holiday park is user segmentation. Both offers, home alert boxes, and information boxes can be filtered to only show to guests who are either logged in, or logged and during their holiday stay. There is also the ability to target push notifications to these same segments. The holidaymaker™ stats layer offers this information on nearly all data collection, so the park can understand who is using their app.

Login Process

The login process requires at least two pieces of information depending on the PMS. This can be flexible, and more than two can be added for security depending on the new connection. Depending if the login is a single booking login (eg using a booking ID) or a user logic (eg using an email address) depends if the packet of data includes a single booking object, or several. Either way these are presented in the same format as an array of ‘bookings’

  • ParcVu Booking Experts: Booking ID & Surname – returns single booking
  • ParcVu Classic: Booking ID & Surname – returns single booking
  • GemaPark: Booking ID & Password – returns single booking
  • Prophet Bookings: Email & Password – returns multiple booking
  • RMS Cloud: Booking ID & Surname – returns single booking
  • CampManager: Booking ID & Surname – returns single booking
  • Elite Dynamics: Booking ID & Surname – returns single booking
  • Bespoke: Booking ID & Surname – returns single or multiple bookings

Background Refresh

Once the user is successfully logged in, a background request it made after a cache time of 60 minutes. This refresh is triggered however by active usage of the app, so all logged in devices will not be making API contact every 60 minutes, only if a guest uses the app after the 60 minutes cache time has expired since the last refresh request. This request can use tokenised customer IDs for systems that use a password (we DO NOT store raw passwords in anyway), or can use the stored booking ID and surname.

Validity

If the booking is no longer available, or tokens have expired, or the booking has been cancelled, then the user will have the booking removed from the app, and prompted to login again.

Notes on data packet

The below data packet is received by the holidaymaker app surfaces, and the app treats it the same, regardless of the PMS. Some of the information may not be available or relevant, such as the isTouring and isOTA flags, and segmented party details.

Because of the generic nature of this booking packet, the party is simply split into adults, children, and dogs. It would be up to the incoming data to wrangle existing party makeup to fit these (Eg grouping under 16s and under 6s simply as children)

Structure

{
  "userid": "11223344",
  "customerid": "11223344",      
  "firstname": "Jamie",
  "lastname": "Test",
  "email": "hello@holidaymakerapp.co.uk",
  "mobile": "0123456789",
  "marketing": true,
  "groupSiteKey": "park-two",
  "secureUrls": false,
  "pms": "bex",
  "bookings": [ 
    {
      // At least one booking
    },
    {
      // Some PMS systems can include several bookings
    },
  ]
}

Properties

userid

Type : String - Required

The user ID may be a mix of data types in different PMS systems, so we store and treat as a string. This is often the unique id for the user. This is not visible to the end user, however is available to the app to make refresh requests to the PMS if required. If a user ID is not available then any string can be used eg "na".

customerid

Type : String - Optional

This could be the same as the user ID, however some PMS integrations include a different hash, or ID to identify a customer. This is not visible to the end user, however is available to the app to make refresh requests to the PMS if required. If a user ID is not available then any string can be used eg "na".

firstname

Type : String - Optional

First name of the customer. This is used as a greeting to personalise the app to the end user as part of the booking countdown. Eg 'Hi Jamie - 5 sleeps left'. If this is not present then the default word 'Guest' will be used.

lastname

Type : String - Optional

First name of the customer. This is not displayed to the end user, however for some PMS systems is used for subsequent booking refresh requests. This is marked as optional, however if your PMS integration uses the surname as identification, then it is required.

email

Type : String - Optional

Email address of user. Note that this is only used if the client also uses our live chat module, and if the PMS has this information available.

mobile

Type : Phone Number String - Optional

Mobile number of user. Note that this is only used if the client also uses our live chat module, and if the PMS has this information available.

marketing

Type : Boolean - Optional

Marketing preference of user. Note that this is only used if the client also uses our live chat module, and if the PMS has this information available.

groupSiteKey

Type : String - Required

Holidaymaker group site key of the whole packet IF the PMS is a single booking login PMS. if not the individual bookings 'site' property will be used instead. This is only required if the client is a group site user.

secureUrls

Type : Boolean - Optional

Should the app surface request secure tokenised login urls for this customer. This will default to false if not present, and only works on selected PMSs that integrate with holidaymaker. If this is set to true then the manage booking/payment urls will be requested as secure login. Rebooking enagement CTAs and Event booking urls can optionally also be requested as secure login if this is set to true.

pms

Type : PMS Booking Type - Optional

String of the current PMS type so checks can be made in our app surfaces if required against the current set PMS.

bookings

Type : Array of Booking - Required

This is an array of bookings. This can often be a single booking, if the user has logged in as a booking. However if the login to the PMS is on a user level, then this can be several bookings. Once the departure date of one booking is over, it will countdown to the next booking if one is available, to cater for guests who book multiple stays. If there are multiple parks involved then the booking should include the groupsite key or an identifier our systems can know which park to use.

Required Type Definitions

Booking - Reveal

Single holidaymaker booking entity. Used to personalise the app, and easy information access to the guest. The arrival and departure dates are also used for push notification segmentation, and some information used for stats tracking to build user demographics.

{
  "id": "11223344",
  "reference": "11223344", 
  "arrival": "2023-09-09",
  "departure": "2023-09-11",
  "unittype": "Standard Electric Pitch",
  "unittypeID": "1234",
  "unitgroup": "Pitches",
  "unitgroupID": "5678",
  "location": "Touring & Camping - Caravan", 
  "isTouring" : true,
  "isOTA" : false,
  "cancelled": false,
  "seniors": 0,
  "adults": 2,
  "teenagers": 1,
  "children": 1,
  "infants": 0,
  "pets": 0,
  "bookingUrl": "https://portal.managebooking.pmssystem",
  "due": "2026-04-25", 
  "toPay": 600.5,
  "balances": [
    {
      "toPay": 300.25,
      "due": "2026-02-25"
    },
    {
      "toPay": 300.25,
      "due": "2026-04-25"
    }
  ],
  "site": "park-one",
  "extraDetails": "You are in pitch #TF04#BREAK#Our barriers will open automatically for the reg number XXXX XXX" 
}

id

Type : String - Required

Booking ID which can be a database ID, hash of some kind, or the user facing ID. This is used for background booking/balance requests on some PMS integrations


reference

Type : String - Required

User facing booking reference. Depending on the PMS system, this is often the same as the booking id. This will be displayed to the user in the app in the My Holiday section and would be familiar to the user as the piece of data the need to quote on enquiries, or logging in


arrival

Type : Date String - Required

Inclusive arrival date used to personalise app experience and subscribe to 'on holiday' notification topics


departure

Type : Date String - Required

Inclusive departure date used to personalise app experience and unsubscribe to 'on holiday' notification topics


unittype

Type : String - Optional

Name of the unit type the user is staying in which is displayed to the user on the My Holiday section of the app.


unittypeID

Type : String - Optional

ID of the unit type the user is staying in. This is not rendered in the app anywhere but is instead used in our personalisation engine. This data could be an integer in your PMS, but we use a string to be universal across different systems


unitgroup

Type : String - Optional

Name of the unit group type the user is staying in. This is currently not rendered in the app but is collected for future use if we needed/wanted to use it.


unitgroupID

Type : String - Optional

ID of the unit group type the user is staying in. This is not rendered in the app anywhere but is instead used in our personalisation engine. This data could be an integer in your PMS, but we use a string to be universal across different systems


location

Type : String - Optional

Name of location of unit type. Not displayed by the user, but can be used for stats tracking, and push notification segmentatation


isTouring

Type : Boolean - Optional

Is this booking considered a 'Touring and Camping' booking - can be used by holiday parks to segment push notifications between touring and self catering guests


isOTA

Type : Boolean - Optional

If this is set to true then the booking is marked as being made by an OTA. This is then used by the HM engagement module to segment users, and potentially upsell them to direct rebookings etc


cancelled

Type : Boolean - Optional

If this is included and is true, then the app will disregard this booking. This is more relevant in PMS connections which supply multiple bookings.


adults

Type : Integer - Required

How many adults in the party


seniors

Type : Integer - Optional

If your PMS segments seniors differently than adults you can optionally send this down as a separate value. This will render differently in the app as well as being used in our personalisation engine.


children

Type : Integer - Required

How many children, if any, are in the party


teenagers

Type : Integer - Optional

If your PMS segments teenagers/adolescents differently than adults and children you can optionally send this down as a separate value. This will render differently in the app as well as being used in our personalisation engine.


infants

Type : Integer - Optional

If your PMS segments infants differently than adults and children you can optionally send this down as a separate value. This will render differently in the app as well as being used in our personalisation engine.


pets

Type : Integer - Optional

How many pets (typically dogs), if any, are attached to this booking


bookingUrl

Type : Url String - Optional

This is the url used by the app to navigate the user when clicking on either the make payment button, or manage booking button. This is not visible as such to the user, however could be visible in the external web browser when they navigate. This means you can include tokens or hashes to allow auto login, however we cannot guarantee that the user will not be able to see/copy and paste this from their browser when it tries to load.


due

Type : Date String - Optional

The date the remainder of the balance is due by


toPay

Type : Floating Point Numeric - Optional

The amount which is still due to pay on this booking. If this is 0 or not provided, then the payments box will not show on the My Holiday page


balances

Type : Array of Booking Balance Item - Optional

A list of payment schedules if your CMS supports multiple balance and due dates for a holiday payment. If this is used your should still provide a cumulative 'toPay' and 'due' for the whole booking.


site

Type : String - Optional

For multi-park installs, you should also include the groupsite key within the booking. This is so the app can automatically select the park for the user when logging in. If multiple bookings are included when logging in then this key can then change the users park they are currently logged in as.


extraDetails

Type : Rich Text / Multiline String - Optional

Additional details to be rendered in the app by the booking reference. This information can be dynamic between different booking systems. Examples of information could be pitch numbers, ANPR reg numbers, door/gate codes, or even information about extras in the order, such as bed linen or a baby cot rental. Note: Only include information in this that you would be happy for someone to access using the authentication of the app. For example if the user logs in with booking ID and surname, then only supply information you would be happy to give using just those details.

Booking Balance Item - Reveal

This is a single PMS Balance due date and amount for PMSs that support different payment schedules.

{
  "toPay": 200.00,
  "due": "2026-02-25"
}

toPay

Type : Floating Point Numeric - Required

How much is due to be paid as a floating point number. The app will render this with two decimal places.


due

Type : Date String - Required

Date this payment schedule item is due by.

Boolean - Reveal

As we connect to different systems using a range of different languages, we can interpret several things as a true. Generally speaking holidaymaker will use a standard true/false JSON boolean, however we also read a lower case string and checked if they are "1", "true", "yes", or "on" to then create the positive boolean. Unless explicitly noted, all booleans are defaulted as false if the node doesn't exist.

{
  "optionOne": true,
  "optionTwo": false,
  "allTheseAreValidTrues" : [
    1, "1", true, "true", "on", "yes"
  ]
}

Date String - Reveal

If a date is sent as a readable string we use the format YYYY-MM-DD

{
  "arrival": "2023-09-09",
  "validUntil": "2024-02-28"
}

Floating Point Numeric - Reveal

Float and Double values are handled as normal JSON. Depending on the precision of the language sending/receiving the data can depend on the truncation of the decimal points. However due to the context of our data, only location lat/lng numbers will normally have more than 2-3 points.

{
  "cost": 55.5,
  "lat": 50.71245750791539,
  "lng":  -2.4619866156242995
}

Integer - Reveal

Standard JSON Integer - 0 is commonly considered to be a default value, unless it is an valid ID when -1 is used. For sort priorities 99 is used as the default.

{
  "key1": 9,
  "key2": 42,
  "arrayOfInts": [
    2,
    3,
    5,
    8
  ] 
}

Phone Number String - Reveal

A phone number is sent the same as a string. It however requires to be strict on what characters appear. It should be a valid phone number structure. For example it can start with '+' symbol and should only contain numerical characters. We do some sanitisation of this in our surfaces, but best practice is to send it down already formatted.

{
  "phone": "+441234567890"
}

PMS Booking Type - Reveal

This is string definition to set which PMS Booking login the app should use. The options available are :
• "guest" - Do not have a login process for whole app (Single Site Guest Mode)
• "manual" - Manual booking process (User adds own arrival / departure etc)
• "bex" - ParcVu Booking Experts PMS login
• "parcvu" - ParcVu Classic PMS login
• "gemapark" - GemaPark PMS login
• "rms" - RMS Cloud PMS login
• "elite" - Elite Dynamics PMS login
• "campmanager" - Campmanager PMS login
• "prophet" - Prophet Bookings PMS login
• "bespoke" - In-house / Bespoke PMS login

{
  "pmsType": "bex"
}

Rich Text / Multiline String - Reveal

Acts the same as the standard String type, however If text is assumed to include line breaks then we use a place holder of #BREAK#. These will then be replaced by the relevant line breaks depending on the language, and device that is rendering the text. This is commonly used in entity copy, and addresses. Rich text should not include HTML or other markup. There should always be a contextual consideration as well - for example if you copy includes a html anchor link to 'Read More' - then simply removing the markup will then leave the text 'Read More' which will be a redundant, none clickable piece of text within the app surfaces.

{
  "textWithBullets": "This paragraph will now have two line breaks, and then a list of bullets#BREAK##BREAK#• Bullet 1#BREAK#• Bullet 2#BREAK#• Bullet 3",
  "address": "Holidaymaker App Ltd#BREAK#Stowey House#BREAK#Bridport Road#BREAK#Dorchester#BREAK#DT12SB"
}

String - Reveal

Standard JSON String - Often will have certain characters escaped depending what system is writing the JSON packet, however our parser only requires to have double quotes (") escaped. UTF-8 encoding is our standard, but others may be accepted if required. If line breaks are required in the text then the Rich Text / Multiline String type is used instead.

{
  "key1": "A string value",
  "key2": "Another string with an some \"quotes\" that need escaping",
  "arrayOfStrings": [
    "Item one as a string",
    "Item two as a string",
    "Item three as a string",
  ] 
}

Url String - Reveal

A Url is sent the same as a string. If our system knows this is a url it will check if it starts with http or https - Note that navigating from both iOS and Android should use https.

{
  "bookingUrl" : "https://portal.managebooking.pmssystem"
}

Full Packet Example

//Single Booking Example on single park

{
  "userid": "11223344",
  "customerid": "11223344", 
  "firstname": "Jamie",
  "lastname": "Test",
  "email": "hello@holidaymakerapp.co.uk",
  "mobile": "0123456789",
  "marketing": true,
  "groupSiteKey": "park-two",
  "pms": "bex",
  "bookings": [   
    {
      "id": "11223344",
      "reference": "11223344", 
      "arrival": "2023-09-09",
      "departure": "2023-09-11",
      "unittype": "Standard Electric Pitch",
      "unittypeID": "1234",
      "unitgroup": "Pitches",
      "unitgroupID": "5678",
      "location": "Touring & Camping - Caravan", 
      "isTouring" : true,
      "isOTA": false,
      "cancelled": false,
      "seniors": 0,
      "adults": 2,
      "teenagers": 1,
      "children": 1,
      "infants": 0,
      "dogs": 0,
      "bookingUrl": "https://portal.managebooking.pmssystem",
      "due": "2023-08-09",     
      "toPay": 60.5,
      "site": "park-two"          
    }
  ]
}

//Multiple Booking Example with different parks
{
  "userid": "11223344",
  "customerid": "11223344", 
  "firstname": "Jamie",
  "lastname": "Test",
  "bookings": [   
    {
      "id": "11223344",
      "reference": "11223344", 
      "arrival": "2023-09-09",
      "departure": "2023-09-11",
      "unittype": "Standard Electric Pitch",
      "unittypeID": "1234",
      "unitgroup": "Pitches",
      "unitgroupID": "5678",
      "location": "Touring & Camping - Caravan", 
      "isTouring" : true,
      "cancelled": false,
      "seniors": 1,
      "adults": 2,
      "teenagers": 0,
      "children": 1,
      "infants": 1,
      "dogs": 0,
      "bookingUrl": "https://portal.managebooking.pmssystem",
      "due": "2023-08-09",     
      "toPay": 60.5
    },
    {
      "id": "11223345",
      "reference": "11223345", 
      "arrival": "2026-05-01",
      "departure": "2026-05-06",
      "unittype": "Hot-Tub Lodge",
      "unittypeID": "9999",
      "unitgroup": "Lodges",
      "unitgroupID": "1111",
      "location": "Seeview Lodges", 
      "isTouring" : false,
      "cancelled": false,
      "adults": 2,
      "children": 0,
      "teenagers": 0,
      "seniors": 1,
      "dogs": 0,
      "bookingUrl": "https://portal.managebooking.pmssystem",
      "due": "2026-04-25",     
      "toPay": 600.50,
      "balances": [
        {
          "toPay": 300.25,
          "due": "2026-02-25"
        },
        {
          "toPay": 300.25,
          "due": "2026-04-25"
        }
      ],
    }
  ]
}

Data Changes

12/02/2026 - Booking

Added 'seniors', 'infants', 'teenagers', 'unitgroup', 'unitgroupID', 'unittypeID', and 'balances' properties

11/02/2026 - PMS Booking Connection Packet

Added 'email', 'mobile', 'marketing', 'groupSiteKey', and 'pms' options

11/02/2026 - PMS Booking Type

Added ParcVu Booking Experts option

21/11/2025 - PMS Booking Connection Packet

Added 'secureUrls' boolean option

19/06/2024 - Booking

Added 'isOTA' property

06/10/2023 - Booking

Added 'extraDetails' property

25/08/2023 - Booking

Added 'site' property

01/02/2021 - Booking

Added 'isTouring' and 'location' properties