Technical audit · 08.09.2026

tallink.com

Tallink pre-order shop

The ferry operator's main site passed the audit without findings, so its pre-order shop was additionally captured. A single capture of the shop's homepage, 213 requests, 10 nodes, about forty seconds. The audit is clean: Tallink's consent management platform and tag container are first-party (consent.tallink.com, analytics.tallink.com), and the statistics-and-marketing stack declared in the cookie declaration — Google Analytics, Facebook — does not fire in this capture: the GTM container loads, but no analytics request follows it. Of the external nodes, the functional ones remain: the Cloudinary image network, reCAPTCHA, Google Fonts and a single metering pixel from the TrackJS error monitoring. No violations are recorded; the caveats are that the TrackJS pixel goes out before consent, and that not all of the protective headers are set.

Request timeline

+2681 ms · TrackJS metering pixel
usage.trackjs.com/usage.gif — a metering request from the TrackJS error monitoring, with the site token and a correlationId. A single request, before any consent choice; it carries no behavioural payload.
+2861…+3213 ms · reCAPTCHA
www.google.com/recaptcha and www.gstatic.com/recaptcha — bot protection for the shop's forms. The IP address goes to Google.

Declared versus actual

✓ Controller — AS Tallink Grupp ('Tallink') and its subsidiaries; privacy policy (Privaatsuspoliitika) — declared
✓ Cookie declaration (Tallink Silja Line): 'By accepting all cookies, you consent to the use of statistics and marketing cookies' — declared
✓ The cookie declaration discloses Google (Analytics) and Facebook / Meta — statistics and marketing categories — declared
✓ Cookie categories with consent configuration; consent management — Tallink's own platform — declared
✓ Supervisory authority — Andmekaitse Inspektsioon — declared
+ TrackJS — error monitoring; the metering pixel goes out before consent, and it is not named in the policy or the cookie declaration — not declared
+ reCAPTCHA, Google Fonts, Cloudinary — functional third-party resources, not separately named in the cookie declaration — not declared

Transfer timings

+672 ms analytics.tallink.com

First-party GTM container (GTM-K85PJ8Q). No measurement requests.

+674 ms consent.tallink.com

Tallink's own consent platform.

+1693 ms www.googletagmanager.com

The real GTM, pulled in by the first-party container. No downstream requests.

+2681 ms usage.trackjs.com

TrackJS error-monitoring usage.gif; token + correlationId, no behavioural payload. Not named in the policy.

+2861 ms www.google.com / www.gstatic.com

Bot protection; IP address to Google.

Detected trackers

Context

shopping.tallink.com is the ferry operator’s pre-order shop: passengers choose goods for their voyage. The shop was audited as a follow-up: the audit of Tallink’s main site turned up no problems, and it was decided to additionally capture its commercial part — the shop. The controller is AS Tallink Grupp (‘Tallink’) and its subsidiaries. Consent is managed by Tallink’s own platform at the domain consent.tallink.com, and the tag container is served from the first-party domain analytics.tallink.com — that is, the consent and tag infrastructure is hosted under the company’s own subdomains. The site is served by the Tallink server and sets HSTS and X-Frame-Options; Content-Security-Policy, Referrer-Policy, Permissions-Policy and X-Content-Type-Options are not set on the main document.

The capture is a single recording of the shop’s homepage: 213 requests, 10 nodes, about forty seconds, recorded on 8 September 2026. Processing is described by Tallink’s privacy policy and a cookie-use declaration.

Who receives data directly

Functionally — Cloudinary (product images), Google reCAPTCHA (form protection), Google Fonts, and a single metering pixel from the TrackJS error monitoring. There are no actual analytics or advertising recipients in this capture; the Google Tag Manager container generates no request to analytics.

Declared vs. actual

Here the declared and the actual line up, and the actual turns out to be cleaner.

The cookie-use declaration discloses the statistics-and-marketing stack the shop uses when consent is present: Google Analytics and Facebook / Meta. In fact, in this capture none of them fired. The Google Tag Manager container is served from the first-party domain analytics.tallink.com and pulls in the real googletagmanager.com, but no measurement request follows it — neither to google-analytics.com nor to the first-party endpoint analytics.tallink.com. The requests that look like ‘collect’ in the recording belong to the shop’s own API (/api/collection/... — product collections), not to analytics. The consent management platform, like the tag container, is hosted under Tallink’s own subdomains — a detail notably in favour of privacy.

A few caveats remain, not raised to the level of a violation. The TrackJS error monitoring sends a single metering pixel usage.gif (with the site token and a correlationId) at +2681 ms, before any consent choice; this request carries no behavioural payload — it is TrackJS’s own service counter — but the recipient is a third party (TrackJS) and it is not named in the policy. reCAPTCHA, Google Fonts and Cloudinary are functional third-party resources that send the IP address to Google and Cloudinary; they are not separately listed in the cookie declaration. And the security headers are not fully set: HSTS and X-Frame-Options are present, but Content-Security-Policy, Referrer-Policy, Permissions-Policy and X-Content-Type-Options are not.

Proven: the declared stack did not fire in this capture. No request to Google Analytics, Facebook / Meta or any other recipient from the cookie declaration across 213 requests. The Google Tag Manager container (first-party and real) generates no downstream request to analytics.

Proven: the consent and tag infrastructure is first-party. The consent platform is served from consent.tallink.com, the tag container from analytics.tallink.com; both under Tallink’s own subdomains.

Proven: TrackJS sends a single metering pixel before consent. The usage.trackjs.com/usage.gif request goes out at +2681 ms; it carries the site token and a correlationId, but not behavioural data.

Not proven, and not required: the exact consent state. Since no tag with a consent signal fired, there is no machine flag of ‘given/refused’ in the recording. What matters is that the declared stack made no outward request.

Observation boundaries

The capture covers one page — the shop homepage shopping.tallink.com — and records browser behaviour, not the services’ internal workings. The main site tallink.com was audited separately and is not within the scope of this card; the conclusions below concern the shop. The configuration of the Google Tag Manager container (including the server side on analytics.tallink.com), server-side processing and contracts with recipients are not verified by a browser-level capture. The absence of measurement requests in the recording means that no analytics collection is observed in the browser in this capture; what the container would send under a different consent state or on the server side is not established from the recording. The GTM container body is redacted, so its configuration is not analysed. The SSO domain sso.tallink.com and the image network res.cloudinary.com are classified as the functional part.

The file is published redacted of personal data: cookie values in requests have been removed; the TrackJS token in the published request is scrubbed. Response headers, the load order and initiators are preserved, so the composition of the requests and the absence of downstream analytics are verified directly against the published file.

The legal assessment is made by the competent authority — Andmekaitse Inspektsioon.

Conclusion

The audit is clean. The pre-order shop keeps its consent management platform and tag container under its own subdomains, discloses its statistics-and-marketing stack — Google Analytics, Facebook — in the cookie declaration, and launches none of it in this capture: the Google Tag Manager container loads, but generates no request to analytics. The declared lines up with the actual, and the actual turns out to be cleaner.

The caveats concern not advertising-and-analytics tracking but service and functional requests: the TrackJS error-monitoring metering pixel goes out before the consent choice and is not named in the policy; reCAPTCHA, Google Fonts and Cloudinary send the IP address to Google and Cloudinary; of the protective headers, HSTS and X-Frame-Options are set, but not CSP, Referrer-Policy, Permissions-Policy and X-Content-Type-Options.

Remediation (as hardening, not as a fix for a violation): condition the TrackJS metering pixel on consent, or name TrackJS in the policy and cookie declaration as a processor for error monitoring; consider self-hosting the fonts; and complete the set of protective headers — Content-Security-Policy, Referrer-Policy, Permissions-Policy and X-Content-Type-Options.

Evidence

How to verify: download the file and compute its checksum — sha256sum file.har (Linux, macOS) or certutil -hashfile file.har SHA256 (Windows); it must match the one shown. The conclusions apply to the scope of this measurement — see the limitations of the method.

Original (audit)
HAR file: ee/tallink-com-2026-09-08.har
SHA-256: 5418241ce9a5fafe552aaad241f9e0a3dd840bdebde1e10f20a912cdcde07309
HAR files are stored on EU infrastructure (Proton Drive). SHA-256 is published for integrity verification.