Test Page - This page is for testing purposes only. It is not intended for production use. All Tests

Customer.io — reservation events & transactional emails

Two ways in. Send a scenario (below left) fires a lifecycle moment on synthetic data — use it to check that the templates render and the emails arrive. Fire a real record (below it) fires the same moment for an existing reservation or day pass, with that record's own guest and data — use it to check what a given booking actually sends.

The scenario form fires one reservation lifecycle moment at the real Customer.io workspace: the person identify (profile + active_* mirror), the lifecycle event, and — when you tick the box — the transactional email for that moment. Everything is synthetic: the profile is guest_99xxxx, it is flagged test_profile = true for Customer.io's test audience, and the email goes only to the address you type here — so no real guest is ever touched and no live automation picks the data up. The guest, reservation (CIO-99xxxx) and day pass behind that id are saved in the PMS, so you can reuse the same guest id later and inspect the very same records.

Send a scenario

Check-in has no transactional template, so it sends data only.
The transactional email is delivered here — use an inbox you can open. Marketing's shared test profile is cio_test_guest_20260612_001@example.invalid (segment testing only — that domain receives no mail).
Becomes guest_<id> in Customer.io. Only 990000–999999 is allowed — real guest profiles cannot be overwritten from here.
Removes the synthetic profile and its timeline from Customer.io so you can replay from scratch. The PMS records stay — the next run re-identifies them.

Fire a real record

Runs the production path for an existing record: the same core fields, traits and event names the queued jobs build — only synchronously, so you see every payload and response. This writes to the real guest's Customer.io profile, so the email half keeps every gate (app key, CUSTOMERIO_TRANSACTIONAL_ENABLED, the QA recipient override and the never-email-twice row). A moment the guest already received is reported, not re-sent — replay without limits is what the synthetic form above is for.

Check-in / check-out and the mirror refresh send data only, never an email.
PMS id of the reservation / day pass, not the confirmation number.

Current setup

Track credentials missing
App API key (transactional) missing
Region us
Integration connection enabled
Automatic syncing (observers) off — only this page sends
Transactional gate off
Automatic sending to guests off
Forced recipient (QA) —
This page ignores the connection / automatic-sync / transactional gates on purpose — it only needs the credentials, so you can test before the integration is switched on for real guests.

Message ids

booking_confirmation 2
reservation_modification 3
cancellation_confirmation 4
day_pass_confirmation 30
day_pass_modification 31
day_pass_cancellation 32