We check for the tag on every page we can reach
Tag detected
Yes
Last seen 12 seconds ago
Pages covered
94%
7 templates missing the tag
Consent signal
OK
CMP connected
Median load impact
8.6 KB
Async, non-blocking
Paste into the <head> of every page
<script>
(function (t, s) {
t.TravelSpy = t.TravelSpy || function () { (t.TravelSpy.q = t.TravelSpy.q || []).push(arguments); };
var e = s.createElement('script'); e.async = 1;
e.src = 'https://cdn.travelspy.io/ts.js';
s.head.appendChild(e);
})(window, document);
TravelSpy('init', { workspace: 'ws_live_9f21c480', region: 'eu' });
</script>
Loads asynchronously and makes no network call until a consent decision is recorded.
Required before any profile is created
TravelSpy('consent', {
analytics: true,
personalisation: true,
advertising: false
});
Call this from your CMP callback. Until it runs, the tag stays dormant.
The signals the models care about most
TravelSpy('track', 'destination_viewed', {
destination: 'JP', region: 'Kansai',
trip_type: 'culture', nights: 11,
party: { adults: 2, children: 0 }
});
TravelSpy('track', 'search_performed', {
origin: 'MAN', destination: 'KIX',
depart: '2026-04-11', return: '2026-04-22',
cabin: 'economy', results: 38
});
TravelSpy('track', 'booking_completed', {
booking_ref: 'MJ-88213', value: 6656, currency: 'GBP'
});
Anything custom becomes a feature you can segment on within 24 hours.
Use these values in the snippet
ws_live_9f21c480eucdn.travelspy.iows_test_10bb44e1Pick whichever your team owns
| Method | Effort | Status |
|---|---|---|
| Direct in <head>Recommended | 5 min | Active |
| Google Tag ManagerCustom HTML tag | 10 min | Available |
| Segment destinationServer-side | 15 min | Available |
| Server-side APIPOST /v1/events | 1–2 days | Partial |
Templates we have not seen the tag on
| Template | Views (7d) | |
|---|---|---|
| /checkout/confirmation | 4,102 | Missing |
| /brochure-request | 1,880 | Missing |
| /departures/legacy | 640 | Stale tag |