File specification and export guidelines for hotel IT teams and PMS vendors
Version 2.0 · October 2026
About this document
If your hotel's PMS is not connected to the TrustYou Customer Data Platform (CDP) through a direct API, your guest, reservation and revenue data can be delivered as CSV files via SFTP. This document describes exactly how these files must be structured so that they are imported completely and without errors.
Who should read it: your IT team and your PMS vendor, who will build and schedule the export.
How to use it:
- Share this document with your PMS vendor and agree on which PMS fields fill each column (section 3 onwards).
- Pay special attention to the mandatory fields (highlighted in blue in every table) and the accepted values (section 2.2). These are the most common causes of failed imports.
- Produce a sample export and provide these with your TrustYou onboarding contact.
Why precision matters
The importer reads values exactly as delivered. A single unknown value in a field with a fixed list (for example a reservation status of Confirmed instead of Booked) or a date in the wrong format stops the import of that file. In reservations.csv this stops the entire daily import, so no guests, reservations or revenues are updated until the file is corrected.
1. File overview
Seven CSV files are delivered. They are loaded together and then ingested in the order below, because later files refer to records in earlier ones.
| # | File | One row = | Unique key | Refers to |
|---|---|---|---|---|
| 1 | locations.csv |
one hotel | source_id |
- |
| 2 | rooms.csv |
one physical room / unit | source_id |
location |
| 3 | guests.csv |
one guest or company profile | source_id |
location (optional) |
| 4 | reservations.csv |
one room booked for one stay | source_id |
location, room |
| 5 | guest_reservation_mappings.csv |
one guest's role on one reservation |
source_reservation_id + source_guest_id
|
reservation, guest |
| 6 | guest_reservation_infos.csv |
one guest's stay dates on one reservation |
source_reservation_id + source_guest_id
|
reservation, guest |
| 7 | revenues.csv |
one posted revenue line (e.g. one room night, one breakfast) | source_id |
reservation, debtor (guest) |
1.1 Mandatory fields per file
These fields must be present and filled with a valid value in every row. Rows that miss them are skipped or stop the import.
| File | Mandatory fields |
|---|---|
locations.csv |
source_id, secondary_source_id, name, room_count (integer) |
rooms.csv |
source_id, source_location_id
|
guests.csv |
source_id, type, full_name
|
reservations.csv |
source_id, source_location_id, arrival, departure
|
guest_reservation_mappings.csv |
source_reservation_id, source_guest_id, is_main_guest, type
|
guest_reservation_infos.csv |
source_reservation_id, source_guest_id, arrival, departure
|
revenues.csv |
source_id, source_created_at, type, count (integer), amount, source_reservation_id, source_debtor_idThe columns name, source_category_id and source_category must exist in the header (values may be empty). |
2. General file requirements
These rules apply to all files. The right-hand column shows what happens if a rule is not followed.
| Topic | Rule | If not followed |
|---|---|---|
| File names | Exactly as listed in section 1, lower case (e.g. reservations.csv). |
File is not picked up. |
| Encoding | UTF-8 (a BOM is tolerated). Check that names such as Müller, Dvořák or Øresund display correctly. | Non-UTF-8 files (e.g. Windows-1252 or UTF-16 saved from Excel) are dropped entirely, with 0 rows imported. |
| Delimiter | Semicolon ; between fields. |
With a comma, every row fails and 0 rows are imported. |
| Header row | First line contains the column names exactly as in this document: lower case, with underscores, case-sensitive (including the spelling is_accomodation). Column order does not matter. Additional columns are ignored; optional columns may be omitted. |
A misspelled column is treated as missing. |
| Row length | Every row has the same number of fields as the header. | A row with more fields than the header is skipped. |
| Quoting | If a value contains ;, a line break or ", wrap the value in double quotes and double any quote inside it, e.g. "Smith; Jones". |
Fields shift and the row is skipped or misread. |
| Date / time format | ISO 8601: YYYY-MM-DD HH:mm:ss.fff (milliseconds optional), or YYYY-MM-DD for dates. No time zone offset. |
Non-ISO formats such as 03.11.2026 or 11/03/2026 stop the file import (for reservations: the whole daily import). |
| Time zone | All timestamps in UTC. Exception: arrival and departure dates are sent as the stay date at 00:00:00.000. |
Check-in/out times are shifted by hours. |
| Booleans | Use TRUE / FALSE. |
TRUE, 1 and YES (any case) are read as true. Any other value is read as false, so Y or X silently becomes false. |
| Numbers | Dot as decimal separator, no thousands separator, no currency symbol, no % sign: 1234.50, 19. |
Revenue amounts that cannot be read stop the revenue import. Reservation amounts that cannot be read are stored as empty. |
| IDs | Plain text, kept exactly as in the PMS (leading zeros, case). IDs must be unique across all hotels you deliver, not just within one hotel. | IDs that repeat across hotels overwrite each other. Excel can turn 00123 into 123 or 1.23E+10. |
| Duplicates | Each key appears only once per file. | If a key appears twice, the last row in the file wins. |
| Empty values | Leave optional fields empty. Do not use placeholders such as N/A, 0000, 1900-01-01 or noemail@hotel.com. |
Placeholders are imported as real data and can merge unrelated guests. |
2.1 References between files
Every reference must point to a record that exists in the referenced file. Rows with a broken reference are skipped individually; the rest of the file continues.
| File | Column | Must exist as | If not found |
|---|---|---|---|
| rooms | source_location_id |
locations.source_id |
Room is skipped |
| guests |
source_location_id (optional) |
locations.source_id |
- |
| reservations | source_location_id |
locations.source_id or locations.secondary_source_id
|
Reservation is skipped |
| reservations |
source_room_id (optional) |
rooms.source_id |
Reservation is imported without a room |
| guest_reservation_mappings |
source_reservation_idsource_guest_id
|
reservations.source_idguests.source_id
|
Mapping is skipped |
| guest_reservation_infos |
source_reservation_idsource_guest_id
|
reservations.source_idguests.source_id
|
Row is skipped |
| revenues |
source_reservation_idsource_debtor_id
|
reservations.source_idguests.source_id
|
Revenue is skipped |
2.2 Accepted values at a glance
The following fields only accept the values listed. Values are case-sensitive and must be spelled exactly as shown. Map your PMS codes to these values in the export.
| File and column | Accepted values | Notes |
|---|---|---|
reservations.status |
Booked, CheckedIn, CheckedOut, NoShow, Cancelled (or empty) |
Any other value (e.g. Confirmed, In-House, Canceled) stops the whole daily import. |
revenues.type |
Room, Item
|
Room = room/accommodation postings, Item = everything else. |
guests.type |
Person, Company
|
Mandatory. |
guests.gender |
Male, Female, Diverse, Unknown (empty = Unknown) |
Any other value (e.g. M, F, Other) stops the guest import. |
guest_reservation_mappings.type |
MainGuest, Booker, AdditionalGuest, Debtor
|
Any other value (e.g. CompanyContact, Guest) stops the mapping import. |
| All Boolean columns |
TRUE, FALSE
|
See Booleans in section 2. |
2.3 File delivery via SFTP
- TrustYou provides the SFTP credentials and the target folder. Files are placed in that folder with the fixed names from section 1.
- Files are picked up once per day. They are not moved or deleted after pickup, so each new export simply overwrites the previous file.
- Full and incremental exports both work. Records are created or updated by their key. Records that are missing from a later file stay unchanged in the CDP; nothing is deleted.
- Because nothing is deleted, a cancellation or change must be sent as an updated row with the same
source_id(e.g. statusCancelled), never by removing the row. - Recommended initial load: all reservations of the agreed history period (e.g. the last 2 years) plus all future reservations. Afterwards, a daily export of everything created or modified since the last export (based on
source_modified_at).
3. locations.csv
Hotel / property master data. Usually one row per hotel; a group with 10 hotels sends 10 rows. All other files refer to these records.
Key: source_id · Ingested: 1st
| Column | Type | Required | Description and accepted values |
|---|---|---|---|
source_id |
Text | Yes | Unique hotel / property code as used in the PMS (e.g. AMSTY, 1042). |
secondary_source_id |
Text | Yes | Alternative code for the hotel (e.g. CRS or channel manager code). If there is none, repeat source_id. |
source_created_at |
DateTime | No | When the record was created in the PMS (UTC). |
source_modified_at |
DateTime | No | When the record was last modified in the PMS (UTC). |
name |
Text | Yes | Public hotel name, e.g. Hotel Amsterdam Centre. |
room_count |
Integer | Yes | Total number of rooms, whole number greater than 0. |
Guidelines
- Write
source_ididentically wherever it is used (source_location_idin all other files): same case, no leading or trailing spaces. - Other files may refer to a hotel by either
source_idorsecondary_source_id. Choose one and use it consistently;source_idis recommended. - Use the proper public hotel name, not an internal abbreviation. It is visible to users in the CDP.
-
room_countshould match the number of rows inrooms.csvwithis_accomodation = TRUE. A large difference usually means rooms are missing from the export.
4. rooms.csv
Room / unit inventory of each hotel.
Key: source_id · Refers to: locations · Ingested: 2nd
| Column | Type | Required | Description and accepted values |
|---|---|---|---|
source_id |
Text | Yes | Unique room ID. Must be unique across all hotels, e.g. AMSTY-207. |
source_created_at |
DateTime | No | Created in the PMS (UTC). |
source_modified_at |
DateTime | No | Last modified in the PMS (UTC). |
name |
Text | No | Room number or name as shown to staff, e.g. 207, 207c. |
category |
Text | No | Room type code from the PMS, e.g. DBL, STD, B4T. |
is_accommodation |
Boolean | No |
TRUE = bookable guest room. FALSE = non-guest unit (meeting room, parking space, dummy / virtual room). |
bed_count |
Integer | No | Number of beds, e.g. 2. |
source_location_id |
Text | Yes | The hotel this room belongs to. Must exist in locations.csv. |
Guidelines
- Room IDs must be unique across all hotels. Rooms are identified by
source_idonly, so room101in two hotels would overwrite each other. If your PMS reuses room numbers, prefix them with the hotel code:AMSTY-101,BERHB-101. - Set
is_accommodation = FALSEfor placeholder units that many PMSs exports, such as "no room assigned", "PM" (pseudo room), meeting rooms or parking. - Use the same codes in
categoryas inreservations.csv→room_category. - Leave
bed_countempty if unknown instead of writing0.
5. guests.csv
Guest and company profiles from the PMS.
Key: source_id · Refers to: locations (optional) · Ingested: 3rd
| Column | Type | Required | Description and accepted values |
|---|---|---|---|
source_id |
Text | Yes | Unique, permanent profile ID from the PMS. Must be unique across all hotels. |
source_created_at |
DateTime | No | Created in the PMS (UTC). |
source_modified_at |
DateTime | No | Last modified in the PMS (UTC). |
type |
Text | Yes | Accepted values: Person, Company. |
first_name |
Text | No | First name. |
last_name |
Text | No | Last name. |
full_name |
Text | Yes | Persons: last_name, first_name (e.g. Rossi, Giulia). Companies: the company name. |
country |
Text | No | Country of residence. Recommended: ISO 3166-1 alpha-2 code, e.g. DE, GB, IT. |
birthday |
Date | No | Date of birth, YYYY-MM-DD, e.g. 1987-04-23. |
email |
Text | No | One email address, lower case, no spaces. |
phone |
Text | No | Recommended: international format with + and country code, no spaces, e.g. +393471234567. |
gender |
Text | No | Accepted values: Male, Female, Diverse, Unknown. Empty is read as Unknown. |
source_location_id |
Text | No | Hotel where the profile was created (only if the PMS keeps one profile database per hotel). |
address |
Text | No | Street and house number. |
city |
Text | No | City. |
nationality |
Text | No | Recommendation: ISO 3166-1 alpha-2 code, e.g. IT. |
state |
Text | No | State / province, only where relevant (US, CA, AU, ...), e.g. CA. |
zip |
Text | No | Postal code as text, so leading zeros are kept, e.g. 01067. |
language |
Text | No | Preferred language. Recommended: ISO 639-1 code, e.g. en, de, it. |
Guidelines
Why this file matters most
The CDP merges profiles from all sources into one de-duplicated profile per real person, based on name, email, phone and birthday. Clean, consistent values in these columns directly improve how well duplicates are recognized and how well guests can be reached.
-
Map gender codes before export. PMS values such as
M,F,W,X,Mr,Otherare not accepted and stop the guest import. Map them toMale,Female,DiverseorUnknown, or leave the field empty. -
typeis mandatory and must be exactlyPersonorCompany. -
full_nameis mandatory even whenfirst_nameandlast_nameare filled. Build it from the two fields if the PMS does not provide it. - Keep
source_idstable: the same person must keep the same ID in every export, so the existing profile is updated instead of a new one being created. - Export companies, travel agents and groups as profiles with
type = Company. They are needed as debtors inrevenues.csvand asBooker/Debtorin the mappings. Leave person-only fields (birthday,gender) empty for them. - Do not send placeholder values such as
noemail@hotel.com,test@test.com,0000000000,1900-01-01orN/A. Leave the field empty. Placeholders shared by many guests can cause unrelated people to be merged into one profile. - OTA relay emails (e.g.
@guest.booking.com) are real but temporary addresses. Send them as they are. - The ISO formats for
country,nationality,phoneandlanguageare not enforced by the importer, but strongly recommended for matching quality and segmentation. - An invalid
birthdayformat (e.g.23.04.1987) stops the guest import. UseYYYY-MM-DDor leave it empty. - Only export personal data you are permitted to transfer, and exclude guests who must not be processed according to your data protection rules.
6. reservations.csv
Room reservations. One row = one room for one stay.
Key: source_id · Refers to: locations, rooms · Ingested: 4th
| Column | Type | Required | Description and accepted values |
|---|---|---|---|
source_id |
Text | Yes | Unique, permanent reservation ID. Must be unique across all hotels. |
source_created_at |
DateTime | No | Booking date (UTC). |
source_modified_at |
DateTime | No | Last modification (UTC). |
source_room_id |
Text | No | Assigned room. Must exist in rooms.csv if filled. |
room_name |
Text | No | Room number / name, e.g. 207. |
room_category |
Text | No | Booked room type code, same codes as rooms.category. |
booking_source_id |
Text | No | Not evaluated. May be left empty. |
booking_source |
Text | No | Booking channel. See guidelines for recognised names. |
is_direct_booking |
Boolean | No |
TRUE for direct bookings, otherwise FALSE. |
rate_id |
Text | No | ID of the rate plan. |
rate |
Text | No | Rate plan code / name, e.g. BAR, NONREF, CORP-ACME. |
arrival |
DateTime | Yes | Planned arrival date at 00:00:00.000, e.g. 2026-11-03 00:00:00.000. |
departure |
DateTime | Yes | Planned departure date at 00:00:00.000. Must be after arrival. |
checked_in_at |
DateTime | No | Actual check-in time (UTC). |
checked_out_at |
DateTime | No | Actual check-out time (UTC). |
duration |
Integer | No | Not evaluated. The CDP calculates nights from departure minus arrival. |
has_checked_in |
Boolean | No |
TRUE once the guest has checked in. |
has_cancelled |
Boolean | No |
TRUE if the reservation is cancelled. |
has_paid |
Boolean | No |
TRUE if the reservation is paid. |
source_location_id |
Text | Yes | Hotel of the reservation. Must exist in locations.csv. |
status |
Text | No | Accepted values: Booked, CheckedIn, CheckedOut, NoShow, Cancelled, or empty. |
cancelled_at |
DateTime | No | Cancellation time (UTC). |
adults_count |
Integer | No | Number of adults. |
children_count |
Integer | No | Number of children (0 if none). |
pax_count |
Integer | No | Total guests = adults_count + children_count. |
market_segment |
Text | No | Your market segment code, e.g. LEISURE, CORP, GROUP. |
cancellation_policy |
Text | No | Cancellation policy code / description. |
forecast_revenue |
Decimal | No | Gross expected revenue of the stay in the reservation currency, e.g. 398.00. |
forecast_revenue_net |
Decimal | No | Net expected revenue (excl. VAT) in the reservation currency. |
forecast_revenue_eurforecast_revenue_usdforecast_revenue_net_eurforecast_revenue_net_usd
|
Decimal | No | Not evaluated. The CDP converts from currency and forecast_revenue automatically. Leave empty. |
currency |
Text | No | ISO 4217 code, e.g. EUR, GBP, CHF, USD. |
gds_number |
Text | No | GDS booking reference, if any. |
Guidelines
Reservation status: accepted values only
An unknown status value stops the entire daily import: reservations, guest mappings, stay infos and revenues are then not updated. Map every PMS status to one of the five values below before export.
| Value | Typical PMS statuses | has_checked_in |
has_cancelled |
checked_in_at |
checked_out_at |
cancelled_at |
|---|---|---|---|---|---|---|
Booked |
Confirmed, Reserved, Guaranteed, Definite | FALSE |
FALSE |
empty | empty | empty |
CheckedIn |
In-House, Arrived, Checked in | TRUE |
FALSE |
filled | empty | empty |
CheckedOut |
Departed, Checked out | TRUE |
FALSE |
filled | filled | empty |
NoShow |
No-Show | FALSE |
FALSE |
empty | empty | empty |
Cancelled |
Cancelled, Canceled, Void | FALSE |
TRUE |
empty | empty | filled |
- Status and flag columns describe the same thing and must not contradict each other (see table above). Note the spelling
Cancelledwith double "l". -
One row = one room for one stay. If a guest books 3 rooms in one booking, send 3 rows, each with its own
source_id. -
Reservations contain no guest ID. Guests are linked to reservations only through
guest_reservation_mappings.csv. A reservation without a mapping has no guest in the CDP. - Send
arrivalanddepartureas dates at00:00:00.000. The number of nights is calculated as departure minus arrival in whole days. If times are attached (arrival 15:00, departure 11:00), a 2-night stay is counted as 1 night. Actual times belong inchecked_in_at/checked_out_at. - Keep
source_idstable for the whole life of the reservation. Modifications and cancellations are sent again with the same ID and an updatedsource_modified_at, not as a new row. - If no room is assigned yet (typical for future bookings), leave
source_room_idempty but fillroom_category. An unknownsource_room_iddoes not reject the reservation; it is imported without a room. - A reservation with an empty or unknown
source_location_idis skipped. -
booking_sourceis free text. These names are recognised automatically (not case-sensitive, also as part of a longer name):-
booking.com→ Booking.com ·expedia→ Expedia ·agoda→ Agoda ·airbnb→ Airbnb ·hotelbeds→ Hotelbeds -
direct,direkt,web,online,pms→ Direct -
portal→ Portal - Any other value is kept as delivered and reported under "Other".
-
- Use the OTA brand name for OTA bookings (e.g.
Expedia), not generic terms. A value like "Online Travel Agency" contains "online" and would be classified as Direct. Use the same spelling every time. - Revenue amounts: dot as decimal separator, no symbols (
1234.50, not1.234,50or€1,234.50). An unreadableforecast_revenueamount is stored as empty. -
adults_count+children_count=pax_count. Use whole numbers and0rather than empty when there are no children.
7. guest_reservation_mappings.csv
Defines who is on a reservation and in which role. This is the only link between guests and reservations, so it must never be skipped.
Key: source_reservation_id + source_guest_id · Refers to: reservations, guests · Ingested: 5th
| Column | Type | Required | Description and accepted values |
|---|---|---|---|
source_reservation_id |
Text | Yes | Reservation ID. Must exist in reservations.csv. |
source_guest_id |
Text | Yes | Guest profile ID. Must exist in guests.csv. |
is_main_guest |
Boolean | Yes |
TRUE for the main guest of the reservation, otherwise FALSE. |
type |
Text | Yes | Accepted values: MainGuest, Booker, AdditionalGuest, Debtor. |
Guidelines
- One row per guest per reservation. The combination reservation + guest is the key. If the same pair appears twice, the later row overwrites the earlier one.
- If one person has several roles (e.g. books and stays), send one row with the most important role, in this order:
MainGuest>Booker>Debtor>AdditionalGuest. -
Exactly one main guest per reservation: one row with
type = MainGuestandis_main_guest = TRUE. This is the person staying in the room, who normally receives guest communication such as surveys. - Accompanying guests:
AdditionalGuest,FALSE. Someone who booked but does not stay:Booker,FALSE. A company or agency paying the bill:Debtor,FALSE(the company must exist as a profile inguests.csv). - Any other
typevalue (e.g.CompanyContact,Guest,Companion) stops the mapping import. - Roles of an already imported guest/reservation pair are currently not updated by later files. Make sure
typeandis_main_guestare correct in the first delivery. - Every non-cancelled reservation should have at least one mapping row.
Examples
| Situation | Rows for reservation R1 (guest → type, is_main_guest) |
|---|---|
| Guest books and stays alone | G1 → MainGuest, TRUE
|
| Assistant books for her manager | G2 (manager) → MainGuest, TRUEG3 (assistant) → Booker, FALSE
|
| Two colleagues share a room, company pays | G4 → MainGuest, TRUEG5 → AdditionalGuest, FALSEC1 (company profile) → Debtor, FALSE
|
8. guest_reservation_infos.csv
Stay dates of each individual guest on a reservation. Usually identical to the reservation dates; they differ when guests share a room but not the whole stay (e.g. a colleague joins on night 2).
Key: source_reservation_id + source_guest_id · Refers to: reservations, guests · Ingested: 6th
| Column | Type | Required | Description and accepted values |
|---|---|---|---|
source_reservation_id |
Text | Yes | Reservation ID. Must exist in reservations.csv. |
source_guest_id |
Text | Yes | Guest profile ID. Must exist in guests.csv. |
arrival |
DateTime | Yes | Guest's arrival date at 00:00:00.000. |
departure |
DateTime | Yes | Guest's departure date at 00:00:00.000. |
checked_in_at |
DateTime | No | Actual check-in time (UTC). |
checked_out_at |
DateTime | No | Actual check-out time (UTC). |
pre_checked_in_at |
DateTime | No | Time of online pre-check-in, if offered (UTC). |
pre_checked_out_at |
DateTime | No | Time of express / pre-check-out, if offered (UTC). |
cancelled_at |
DateTime | No | Cancellation time, if cancelled (UTC). |
Guidelines
- One row per guest per reservation; the pair
source_reservation_id+source_guest_idmust be unique. - Both IDs must exist in their files, otherwise the row is skipped.
- The guest's
arrival/departureshould fall within the reservation'sarrival/departure. - If the PMS does not track per-guest dates, create one row per mapped guest and copy the dates from the reservation.
- Leave
pre_checked_in_at/pre_checked_out_atempty if the hotel does not offer online check-in or express check-out.
9. revenues.csv
Posted revenue lines linked to a reservation.
Key: source_id · Refers to: reservations, guests (debtor) · Ingested: 7th (last)
| Column | Type | Required | Description and accepted values |
|---|---|---|---|
source_id |
Text | Yes | Unique posting ID. Must be unique across all hotels. |
source_created_at |
DateTime | Yes | Posting date / time (UTC). |
source_modified_at |
DateTime | No | Last modification (UTC). |
name |
Text | Column required | Description of the posting, e.g. Room Night, Breakfast. Column must exist; value may be empty. |
type |
Text | Yes | Accepted values: Room, Item. |
source_category_id |
Text | Column required | ID of the PMS revenue group. Column must exist; value may be empty. |
source_category |
Text | Column required | Name of the PMS revenue group, e.g. Accommodation, Food, Spa. Column must exist; value may be empty. |
count |
Integer | Yes | Quantity, whole number, e.g. 1, 2. |
currency |
Text | No | ISO 4217 code, e.g. EUR. If empty, the hotel's default currency is used. |
amount |
Decimal | Yes | Gross amount (incl. VAT) in the posting currency, e.g. 179.00. Negative for corrections / refunds. |
amount_net |
Decimal | No | Net amount (excl. VAT) in the posting currency. |
amount_euramount_usdamount_net_euramount_net_usd
|
Decimal | No | Not evaluated. The CDP converts automatically. Leave empty. |
vat_percent |
Decimal | No | VAT rate as a number, e.g. 7, 19, 8.1. |
source_location_id |
Text | No | Not evaluated. The hotel is taken from the linked reservation. |
source_reservation_id |
Text | Yes | Reservation the posting belongs to. Must exist in reservations.csv. |
source_debtor_id |
Text | Yes | Who pays: the guest, or a company / agency profile. Must exist in guests.csv. |
Guidelines
-
type: useRoomfor room rate / accommodation postings andItemfor everything else (food, beverage, spa, parking, extras). Any other value stops the revenue import. Put the detailed PMS revenue group intosource_category. -
amountandcountmust be valid numbers. An unreadable value (e.g.1.234,50or1,5or2.5incount) stops the revenue import. - One row per posting. A 3-night stay with breakfast typically produces 3 room rows plus 3 breakfast rows (or 1 breakfast row with
count = 3). Corrections and refunds are separate rows with negative amounts; do not edit the original row. -
amountincludes VAT,amount_netexcludes it:amount ≈ amount_net × (1 + vat_percent / 100). -
vat_percentis the rate as a number:19, not0.19and not19%. - Every revenue must belong to a reservation. Revenue without a stay (e.g. restaurant walk-ins, spa day guests) cannot be imported and should not be exported.
-
source_debtor_idmust exist inguests.csv, otherwise the posting is skipped. Export the company / agency profiles that appear as debtors. - Plausibility check: after check-out, the sum of
amountfor a reservation should be close to itsforecast_revenue.
10. Worked example: one stay across all files
Giulia Rossi books a double room at the Amsterdam hotel for 2 nights through Booking.com. Her partner Marco stays with her. She has breakfast both mornings. Timestamps are in UTC; only the most relevant columns are shown for reservations and revenues (the real files contain all columns, with unused ones left empty).
locations.csv
| Column | Row 1 |
|---|---|
source_id |
AMSTY |
secondary_source_id |
AMSTY |
source_created_at |
2024-01-10 08:00:00.000 |
source_modified_at |
2026-05-02 12:12:00.000 |
name |
Hotel Amsterdam Centre |
room_count |
120 |
rooms.csv
| Column | Row 1 |
|---|---|
source_id |
AMSTY-207 |
source_created_at |
2024-01-10 08:00:00.000 |
source_modified_at |
2024-01-10 08:00:00.000 |
name |
207 |
category |
DBL |
is_accomodation |
TRUE |
bed_count |
2 |
source_location_id |
AMSTY |
guests.csv
| Column | Row 1 | Row 2 |
|---|---|---|
source_id |
G-1001 | G-1002 |
source_created_at |
2026-09-01 16:22:10.000 | 2026-11-03 14:40:00.000 |
source_modified_at |
2026-11-05 10:03:00.000 | 2026-11-03 14:40:00.000 |
type |
Person | Person |
first_name |
Giulia | Marco |
last_name |
Rossi | Bianchi |
full_name |
Rossi, Giulia | Bianchi, Marco |
country |
IT | IT |
birthday |
1987-04-23 | |
email |
giulia.rossi@example.com | |
phone |
+393471234567 | |
gender |
Female | Male |
source_location_id |
AMSTY | AMSTY |
address |
Via Roma 12 | |
city |
Milan | |
nationality |
IT | IT |
state |
||
zip |
20121 | |
language |
it | it |
reservations.csv (selected columns)
| Column | Row 1 |
|---|---|
source_id |
R-5001 |
source_room_id |
AMSTY-207 |
room_category |
DBL |
booking_source |
Booking.com |
is_direct_booking |
FALSE |
rate |
BAR |
arrival |
2026-11-03 00:00:00.000 |
departure |
2026-11-05 00:00:00.000 |
checked_in_at |
2026-11-03 14:41:00.000 |
checked_out_at |
2026-11-05 09:55:00.000 |
has_checked_in |
TRUE |
has_cancelled |
FALSE |
status |
CheckedOut |
source_location_id |
AMSTY |
adults_count |
2 |
children_count |
0 |
pax_count |
2 |
forecast_revenue |
398.00 |
currency |
EUR |
guest_reservation_mappings.csv
| Column | Row 1 | Row 2 |
|---|---|---|
source_reservation_id |
R-5001 | R-5001 |
source_guest_id |
G-1001 | G-1002 |
is_main_guest |
TRUE | FALSE |
type |
MainGuest | AdditionalGuest |
guest_reservation_infos.csv
| Column | Row 1 | Row 2 |
|---|---|---|
source_reservation_id |
R-5001 | R-5001 |
source_guest_id |
G-1001 | G-1002 |
arrival |
2026-11-03 00:00:00.000 | 2026-11-03 00:00:00.000 |
departure |
2026-11-05 00:00:00.000 | 2026-11-05 00:00:00.000 |
checked_in_at |
2026-11-03 14:41:00.000 | 2026-11-03 14:41:00.000 |
checked_out_at |
2026-11-05 09:55:00.000 | 2026-11-05 09:55:00.000 |
pre_checked_in_at |
2026-11-02 19:10:00.000 | |
pre_checked_out_at |
||
cancelled_at |
revenues.csv (selected columns)
| Column | Row 1 | Row 2 | Row 3 |
|---|---|---|---|
source_id |
REV-1 | REV-2 | REV-3 |
source_created_at |
2026-11-03 23:00:00.000 | 2026-11-04 23:00:00.000 | 2026-11-05 08:30:00.000 |
name |
Room Night | Room Night | Breakfast |
type |
Room | Room | Item |
source_category_id |
10 | 10 | 20 |
source_category |
Accommodation | Accommodation | Food |
count |
1 | 1 | 2 |
currency |
EUR | EUR | EUR |
amount |
179.00 | 179.00 | 40.00 |
amount_net |
164.22 | 164.22 | 36.70 |
vat_percent |
9 | 9 | 9 |
source_reservation_id |
R-5001 | R-5001 | R-5001 |
source_debtor_id |
G-1001 | G-1001 | G-1001 |
Things to notice
-
AMSTY,AMSTY-207,G-1001andR-5001are written identically in every file. - Giulia booked and stays, so she has one mapping row as
MainGuest/TRUE. Marco isAdditionalGuest/FALSE. - Arrival and departure are dates at
00:00:00.000(2 nights); actual check-in/out times are in UTC. - Breakfast is
Item; the detail "Food" goes intosource_category. - Room revenue (2 × 179.00) + breakfast (40.00) = 398.00 =
forecast_revenue.
Comments
0 comments
Please sign in to leave a comment.