CRM Integration (Salesforce, Microsoft Dynamics)
Keep a record of every experience booking on the guest's contact in Salesforce or Dynamics 365 — pushed by Turneo, or pulled from the Turneo API on your schedule.
What is this integration?
The Turneo CRM integration keeps a record of every experience booking in your hotel's CRM — Salesforce or Microsoft Dynamics 365. When a guest books a sunset cruise, a spa treatment or a wine tasting through Turneo, the booking shows up on that guest's contact in your CRM, alongside their stays, requests and marketing history.
Your CRM becomes the single view of the guest: not only when they stayed, but what they did.
What does it do?
For every Turneo booking:
- Finds or creates the guest in your CRM (matched on email address)
- Creates a booking record linked to that guest, with the experience, date, participants and price
- Keeps the record up to date when the booking is confirmed, changed or cancelled
What you'll see in your CRM:
- On the guest's contact: a list of their Turneo bookings, past and upcoming
- On each booking record: experience name, date and time, number of participants, price paid, booking status and a link to the full booking in Turneo Hub
- In reports and segments: filter guests by what they booked ("everyone who did a wellness experience in the last year"), total experience spend per guest, most popular experiences per property
Two ways to connect: push or pull
There are two ways to get bookings from Turneo into your CRM. Which one is right depends on who manages your CRM and how much control your team wants.
| Push — Turneo sends bookings to your CRM | Pull — your CRM fetches bookings from Turneo | |
|---|---|---|
| How it works | Turneo connects to your CRM and writes each booking as it happens | Your CRM (or your integration platform) calls the Turneo API on a schedule and imports what's new |
| Timing | Near real-time — a booking appears within a minute | On your schedule — typically every 15 minutes to once a day |
| Set up by | Turneo, using access you grant to your CRM | Your CRM team or integration partner, using a Turneo API key |
| Maintained by | Turneo | Your team |
| Control over field mapping | Standard Turneo booking record, configured with you during setup | Full — you decide which fields go where |
| Good for | Hotels that want it working without involving their IT team | Hotel groups with an existing integration platform (MuleSoft, Power Automate, Make, Zapier) or strict rules about who writes to the CRM |
Both approaches produce the same result: one record per booking, attached to the guest.
Push: Turneo writes into your CRM
With push, you give Turneo an integration user in your CRM, and Turneo does the rest. Every time a booking is created, confirmed, rescheduled or cancelled, Turneo updates the matching record in your CRM.
Booking flow
Guest books an experience on Turneo
↓
Turneo looks up the guest in your CRM (by email)
↓
Booking record created and linked to the guest
↓
Booking confirmed / changed / cancelled → record updated
↓
Your team sees it in the CRM within a minute
Pull: your CRM fetches from the Turneo API
With pull, nothing is installed in your CRM by Turneo. Your team builds a scheduled job — in your integration platform or directly in the CRM — that asks Turneo "what bookings changed since I last checked?" and writes them in.
The Turneo API offers two ways to ask that question:
- List bookings changed since a time — returns full booking details for anything modified after a given moment. Best for a straightforward "sync the latest" job.
- Activity feed — a running log of booking events (created, confirmed, cancelled, rejected), each with a snapshot of the booking at that moment. Best when you want to log each change as a separate activity on the guest.
Both are documented in the Turneo developer documentation. Your integration will need a Turneo API key, which we issue per partner account — ask your Turneo contact.
Pull flow
Every 15 minutes, your CRM job calls the Turneo API
↓
Turneo returns bookings changed since the last run
↓
Your job matches each booking to a guest (by email)
↓
Records created or updated in your CRM
What booking information is included?
Whichever way the data flows, this is the information available for each booking:
| Field | Example | Notes |
|---|---|---|
| Booking code | TB-4K7P2 | Short reference the guest also sees; unique per booking |
| Status | Confirmed | See status meanings below |
| Experience | Sunset Wine Tasting Tour | With the organizer's name |
| Date and time | 15 January 2026, 6:00 PM | In the experience's local time |
| Participants | 2 adults, 1 child | Broken down by participant type |
| Price | €125.00 | The total the guest paid, including add-ons and discounts |
| Payment | Paid by card / Charged to room / Pay at venue | How and whether it was paid |
| Guest | John Smith, john.smith@example.com, +1 555-0123 | The main traveler's contact details |
| Property | Jade Beach Resort | Which of your hotels sold the booking |
| Reference | RES-778812 | Your own reference, e.g. the PMS reservation number or loyalty id, when captured at checkout |
| Source | Website / Concierge / Guest app | Where the booking was made |
| Link | View in Turneo Hub | Opens the full booking, including vouchers and messages |
If you use Turneo's guest questions at checkout (dietary requirements, pick-up location and so on), those answers can be included too.
How guests are matched
Turneo matches bookings to CRM contacts using this priority:
- Your reference (PMS reservation number, loyalty id) — when the booking was made from a place that knows the guest, such as your guest app or a concierge
- Email address — the most common method
If no contact matches, a new contact is created with the guest's name, email and phone. If several contacts share an email, the most recently updated one is used.
Tip: the more bookings are made from channels that know the guest — the guest app, your website behind a login, the concierge — the more reliable matching becomes. Bookings from an anonymous website visitor can only be matched by email.
What happens when bookings change?
Booking confirmed
Bookings on experiences that need the organizer's approval start as Pending and become Confirmed when the organizer accepts. The record's status updates.
Booking rescheduled or amended
Date, time, participants and price are updated on the existing record. There is never more than one record per booking.
Booking cancelled
The record's status changes to Cancelled and the details stay visible for your history. If a cancellation fee applies, the price field shows what the guest was charged.
Multiple bookings in one order
A guest who books three experiences in one checkout gets three records, each with its own booking code, all linked to the same contact.
Where does it fit with our other systems?
| System | What Turneo sends there | Why |
|---|---|---|
| PMS (Mews, Apaleo, Oracle Opera) | A note on the guest's reservation and, optionally, a charge on their folio | Operations: front desk and billing for the current stay |
| CRM (Salesforce, Dynamics 365) | A record on the guest's contact | Relationships: guest history, segmentation, marketing, loyalty |
Hotels typically use both. The PMS integration is described in Oracle Opera Integration.
Setup: what you need
Push to Salesforce
To let Turneo write to your Salesforce org, your Salesforce administrator provides:
| What we need | Where to find it | Purpose |
|---|---|---|
| Connected App with Consumer Key and Consumer Secret | Setup → App Manager → New Connected App (OAuth enabled) | Lets Turneo authenticate |
| Integration user | Setup → Users; assign a permission set with access to Contacts and the Turneo booking object | The user Turneo acts as — its name appears in record history |
| Instance URL | Your Salesforce login URL, e.g. https://yourhotel.my.salesforce.com |
Where Turneo sends data |
| Sandbox URL (optional) | Your sandbox org | Lets us test before touching production |
During setup we'll agree with you where bookings live in Salesforce. The default is a custom Turneo Booking object related to Contact; some hotels prefer bookings as Opportunities or Activities, which we can accommodate.
Push to Microsoft Dynamics 365
To let Turneo write to Dynamics 365 (Dataverse), your Microsoft 365 administrator provides:
| What we need | Where to find it | Purpose |
|---|---|---|
| App registration with Application (client) ID and Client Secret | Azure Portal → Microsoft Entra ID → App registrations | Lets Turneo authenticate |
| Directory (tenant) ID | Azure Portal → Microsoft Entra ID → Overview | Identifies your organisation |
| Environment URL | Power Platform admin centre → Environments, e.g. https://yourhotel.crm4.dynamics.com |
Where Turneo sends data |
| Application user with a security role | Power Platform admin centre → Environment → Settings → Application users | Grants the app access to Contacts and the Turneo booking table |
The default in Dynamics is a custom Turneo Booking table related to Contact. If your team uses Dynamics 365 Customer Insights for segmentation, the booking table can be included as a data source.
Pull (either CRM)
For a pull integration you need from Turneo:
- A Turneo API key for your partner account
- The developer documentation, which describes the bookings and activity-feed endpoints and the fields listed above
And on your side:
- Somewhere to run a scheduled job: Power Automate (natural for Dynamics), MuleSoft or Salesforce Flow with an external service, or a platform like Make or Zapier
- A decision on how often to sync and how to match guests
Our team is happy to review your field mapping before you go live.
How to get started
- Decide push or pull using the comparison above — your CRM administrator is usually the right person to ask
- Gather the credentials listed for your CRM (push), or request an API key (pull)
- Send them to your Turneo contact — for push, we'll set up the connection in a sandbox first and send a few test bookings
- Confirm the records look right, then we switch to production
Quick reference
Where to find booking info in your CRM
- Open the guest's Contact
- Look for the Turneo Bookings related list (Salesforce) or tab (Dynamics)
- Open a booking to see the details, or click the Turneo Hub link for vouchers, messages and payment details
What each booking status means
- Pending: booked and paid or reserved, waiting for the organizer to confirm
- Confirmed: the organizer has accepted; the guest will attend
- Completed: the experience has taken place
- Cancelled: cancelled by the guest, the hotel or the organizer
- Rejected: the organizer could not accommodate the booking; the guest was refunded
- No-show: the guest did not turn up
Frequently asked questions
Does this replace the PMS integration? No. The PMS integration handles the current stay (reservation notes, room charges). The CRM integration handles the guest relationship over time. Most hotels run both.
Can bookings that happened before we connected be imported? Yes. For push, we backfill your booking history during setup. For pull, your first sync can start from any date.
What about guest privacy? Turneo only sends the guest details the guest provided at checkout, and only to the CRM you own. Guests agree to your privacy policy when they book. If a guest asks you to delete their data, delete the contact in your CRM as usual and contact Turneo to remove the booking's personal details on our side.
Can we sync to HubSpot or another CRM? The pull approach works with any system that can call an API. Ask your Turneo contact about push support for other CRMs.
Who do we contact if a booking doesn't appear? Check the guest's email on the booking in Turneo Hub matches the contact in your CRM — mismatched emails are the most common cause. If it still doesn't appear, contact Turneo support with the booking code.