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"
}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
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
Type : Date String - Required
Inclusive arrival date used to personalise app experience and subscribe to 'on holiday' notification topics
Type : Date String - Required
Inclusive departure date used to personalise app experience and unsubscribe to 'on holiday' notification topics
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.
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
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.
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
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
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
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
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.
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.
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.
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.
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.
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
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.
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.
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.
This is a single PMS Balance due date and amount for PMSs that support different payment schedules.
{
"toPay": 200.00,
"due": "2026-02-25"
}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.
Type : Date String - Required
Date this payment schedule item is due by.
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"
]
}If a date is sent as a readable string we use the format YYYY-MM-DD
{
"arrival": "2023-09-09",
"validUntil": "2024-02-28"
}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
}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
]
}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"
}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",
]
}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"
}Added 'seniors', 'infants', 'teenagers', 'unitgroup', 'unitgroupID', 'unittypeID', and 'balances' properties
Added 'isOTA' property
Added 'extraDetails' property
Added 'site' property
Added 'isTouring' and 'location' properties