Technical audit · 08.09.2026

airport.ee

Tallinn Airport website

Tallinn Airport's website — a single capture of a flight-information page, 42 requests, 9 nodes, about a second. The Complianz consent management platform is present on the page and runs in opt-in mode: the banner is shown, the 'Statistics' and 'Marketing' categories are switched off. Nevertheless, on load, without consent, GA4 sends page_view and scroll (and with the status gcs=- — consent mode not configured), and the Facebook / Meta Pixel sends a PageView to Meta. The Complianz blocker does not hold these trackers; the browser's tracking prevention merely blocked their access to storage, but the requests to Google and Meta took place. The security headers are set partially.

Request timeline

+0 ms · flight-page load
A WordPress site, served via Cloudflare. The security headers are set partially: HSTS, X-Frame-Options SAMEORIGIN and X-Content-Type-Options nosniff are present; Content-Security-Policy, Referrer-Policy and Permissions-Policy are absent. The Complianz consent platform (cookieblocker.min.js, banner banner-1-optin.css) is loaded.
+389 ms · Cloudflare Web Analytics
static.cloudflareinsights.com/beacon.min.js — an analytics beacon from the page markup.
+416…+450 ms · tag container
www.googletagmanager.com/gtm.js and gtag/js — Google Tag Manager, from which the analytics and the pixel start.
+538…+544 ms · GA4
region1.analytics.google.com — a measurement/conversion request, then two g/collect: page_view and scroll, counter G-KTS3XHH4LF, gcs=-. The page URL and title go to Google.
+644…+940 ms · Facebook / Meta Pixel
connect.facebook.net/fbevents.js and signals/config/1114129963…, then www.facebook.com/tr at +940 ms — a PageView event of pixel 1114129963021443, response 200, with the fbp browser identifier.

Declared versus actual

✓ Controller — AS Tallinna Lennujaam (Tallinn Airport); privacy policy (Privaatsuspoliitika) — declared
✓ The policy names Google (Analytics) and Meta — declared
✓ Consent management — the Complianz platform (a banner with the categories 'Functionality', 'Statistics', 'Marketing', opt-in mode) — declared
✓ Payment components — Maksekeskus and Apple Pay — declared
✓ Supervisory authority — Andmekaitse Inspektsioon — declared
+ Cloudflare Web Analytics — an analytics beacon, not named in the policy — not declared
+ The Complianz consent platform — not separately described in the policy — not declared
+ That GA4 and the Facebook pixel fire while the opt-in banner is shown with the categories switched off — that is, they are not conditioned on consent — not declared
+ That GA4 runs without a consent signal (gcs=-) — not declared

Transfer timings

+389 ms static.cloudflareinsights.com

Analytics beacon from the markup. Not named in the policy.

+543 ms region1.analytics.google.com

GA4 page_view, G-KTS3XHH4LF, gcs=- (consent mode not configured).

+544 ms region1.analytics.google.com

GA4 scroll, the same counter.

+940 ms www.facebook.com

PageView, pixel 1114129963021443, GET /tr, response 200, fbp identifier. Banner shown, marketing off.

Detected trackers

Indicators of GDPR non-compliance

Context

airport.ee is the website of Tallinn Airport; the controller is AS Tallinna Lennujaam. The site is built on WordPress and served via Cloudflare. Consent is managed by the Complianz plugin in opt-in mode. The security headers are set partially: HSTS, X-Frame-Options SAMEORIGIN and X-Content-Type-Options nosniff are present; Content-Security-Policy, Referrer-Policy and Permissions-Policy are absent.

The capture is a single recording of a flight-information page (/lennuinfo/): 42 requests, 9 nodes, about a second, recorded on 8 September 2026.

Who receives data directly

Google (Analytics), Meta (Facebook Pixel), Cloudflare (analytics beacon) — all before consent. Functionally — the Maksekeskus and Apple Pay payment components.

Declared vs. actual

The discrepancy here is on plain display: a consent banner is shown on the page, and the trackers ignore it.

First — consent is shown but not asked in substance. The Complianz platform runs in opt-in mode: its blocker cookieblocker.min.js and the banner banner-1-optin.css, in which the ‘Statistics’ and ‘Marketing’ categories are switched off by default, are loaded on the page. The logic of opt-in means that before these categories are enabled, the corresponding requests should not go out. In fact they go out on page load: Google analytics (G-KTS3XHH4LF) sends page_view and scroll, as well as a conversions request, and the Facebook / Meta Pixel (1114129963021443) sends PageView to Meta. All of this before anything in the banner is enabled or clicked.

Second — the analytics runs without a consent signal. GA4 sends its events with the status gcs=- — that is, Google’s consent mode is not configured on the site at all. For a site that shows a managed-consent banner, this is an internal contradiction: the interface offers to manage statistics and marketing, while the counter transmits data without any consent signal.

Third — the blocker does not hold these trackers. The browser’s own tracking prevention flagged the GA4 and Facebook pixel requests and blocked their access to storage — but the requests to Google and Meta themselves took place. That is, the trackers fire regardless of both the choice in the banner and the Complianz blocker; what held them was only the browser’s built-in protection, not the site itself.

Fourth — some recipients are undisclosed. The privacy policy names Google (Analytics) and Meta. But the Cloudflare analytics beacon and the Complianz platform itself are not mentioned in it.

Proven: the consent banner is shown, the categories are off. The Complianz platform in opt-in mode displays a banner with ‘Statistics’ and ‘Marketing’ switched off by default; no choice in it was made at the time of the transfers.

Proven: the trackers transmit data before consent. GA4 page_view and scroll go out at +543…+544 ms, the Facebook pixel PageView at +940 ms (response 200). All while the banner is shown with the categories not enabled.

Proven: the analytics runs without a consent mode. All GA4 requests carry gcs=- — there is no Google consent signal.

Proven: the browser’s protection held them, not the site. In the session, the GA4 and Facebook pixel requests are flagged by the browser’s built-in protection as tracking, with access to storage blocked; nevertheless the network requests to Google and Meta took place.

Observation boundaries

The capture covers one page — the flight information — and records browser behaviour, not the services’ internal workings: server-side processing, the configuration of the tag container and contracts with recipients are not verified by a browser-level capture. Cookie values in requests were removed during redaction (Cookie headers are absent from the file), so the consent state is established not from cookies but from a combination of signs: the opt-in banner shown with the categories switched off, the gcs=- status of GA4, and the actual delivery of the GA4 and Facebook pixel requests. The Maksekeskus and Apple Pay payment components are classified as the functional part.

The file is published redacted of personal data. Response headers, statuses, the load order and initiators are preserved, so the composition of the requests, the gcs=- status and the delivery of the Facebook pixel are verified directly against the published file.

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

Conclusion

Tallinn Airport’s website shows a Complianz managed-consent banner in opt-in mode — with statistics and marketing switched off by default — but the statistics and advertising requests bypass this banner. On page load, before the categories are enabled and before any choice, Google analytics sends page_view and scroll (and with no consent signal at all, gcs=-), and the Facebook / Meta Pixel sends PageView to Meta. The Complianz blocker does not hold these trackers; their access to storage was cut off only by the browser’s built-in protection, but the network requests to Google and Meta took place anyway.

The privacy policy names Google and Meta, but does not mention the Cloudflare analytics beacon or the consent platform itself. The consent interface on display turns out to be decorative for the analytics and the pixel: they are not wired to it and transmit data independently of the user’s choice.

Remediation: wire GA4, the Facebook pixel and the Cloudflare beacon to the consent platform so that before the ‘Statistics’ and ‘Marketing’ categories are enabled none of these requests goes out; configure Google’s consent mode (currently gcs=-) so that the consent state is passed to GA4; name the Cloudflare analytics and the Complianz platform in the privacy policy; and complete the set of protective headers — Content-Security-Policy, Referrer-Policy and Permissions-Policy.

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/airport-ee-2026-09-08.har
SHA-256: f03f9200fa57c65dda77d9a8c41c05188583ca0512105a19fa5f563fef7afa6b
Re-check snapshot
Awaiting changes
HAR files are stored on EU infrastructure (Proton Drive). SHA-256 is published for integrity verification.