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
Transactional gate off
Automatic sending to guests off
Forced recipient (QA)
This page ignores the connection / 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 11
day_pass_modification — not configured —
day_pass_cancellation — not configured —