Technical audit · 27.09.2026

roccaalmare.ee

Website of the Rocca al Mare Shopping Centre in Tallinn

The website of the Rocca al Mare shopping centre — one capture, nine pages and three policy files, 766 requests. Google Analytics runs in denied mode and stores nothing. reCAPTCHA, however, loads on every page before any choice, although the site's own cookie rules classify it as marketing. The banner's first layer asks for consent only to analytics, yet the 'Accept all' button also switches on advertising categories. There are two cookie lists, and they contradict each other: the banner lists Yandex Metrica and Meta data among the 'necessary', while the rules page shows a snapshot of a platform the site no longer uses. It is unclear to whom the visitor is giving consent: the banner names the shopping centre, the policy — two different Citycon companies.

Request timeline

+0 s · entering the homepage
Redirect roccaalmare.ee → www.roccaalmare.ee. The site runs on WordPress behind nginx 1.21.1. There is no Content-Security-Policy header and not a single Set-Cookie header.
+1.9 s · consent platform and reCAPTCHA
cm.nxtm.pl/dist/next-cookie-app.js and, simultaneously, www.google.com/recaptcha/api.js (reCAPTCHA v3). At +3.2 s, the reCAPTCHA service frame opens on www.google.com, followed by Google fonts and a worker script.
+2.1…+2.7 s · Google tags
The GTM-5W3W6WT container, gtag for G-77YWDWFH2T, and the legacy analytics.js.
+8.0 s · analytics in denied mode
region1.google-analytics.com — page_view with gcs=G100. Each subsequent page gets a new client identifier and a first-visit marker: nothing is stored between pages.
all pages · reCAPTCHA before any choice
On all nine HTML pages — the homepage, shops, offers, news, cookie rules — reCAPTCHA loads anew along with the frame on www.google.com. Over the capture, 90 reCAPTCHA-related requests to Google hosts.

Declared versus actual

✓ Banner: the controller is 'Rocca al Mare'; the 'Nõustun kõigiga' button gives consent to analytics cookies; consent can be withdrawn at any time — declared
✓ Banner second layer: categories 'Vajalik', 'Liigitamata', 'Analüütilised', 'Turundus', 'Kasutajaandmed reklaami eesmärgil', 'Andmete isikupärastamine reklaami eesmärgil' — declared
✓ Banner declaration: _grecaptcha, _ym_uid and other Yandex Metrica entries, lastExternalReferrer — 'Vajalik'; _fbp, _gcl_au — 'Turundus'; _ga, _clck, _clsk — 'Analüütilised' — declared
✓ Cookie rules on the site — the rules of Citycon Oyj; a Cookiebot list, update date '4/10/26': rc::a–rc::f — necessary, GUEST_LANGUAGE_ID — preferences, _ga, _gid, sentryReplaySession — statistics, _GRECAPTCHA — marketing — declared
✓ Policy: controllers — Citycon Finland Oy and Citycon Oyj, each responsible for Rocca al Mare and Kristiine — declared
✓ Policy: cookies and pixels are used, among other things, to build user profiles and for targeted marketing — declared
✓ Policy: withdrawal of consent — by email to info@citycon.com; data questions — privacy@citycon.com; complaints — to the Andmekaitse Inspektsioon — declared
+ reCAPTCHA loads on all pages before any choice, although the site's rules classify its cookie as marketing — not declared
+ The 'Nõustun kõigiga' button switches on marketing and advertising categories that the banner's first layer does not mention — not declared
+ The banner declaration does not include the reCAPTCHA service entries (rc::a–rc::f), the language cookie, or Sentry session recording — not declared
+ The cookie rules page does not include Yandex Metrica, Microsoft Clarity, Meta, Google Ads, or the other entries from the banner — not declared
+ The cookie rules page shows a Cookiebot list, while the site uses a different consent platform — not declared
+ WordPress Emoji (s.w.org) is not named in either list — not declared

Transfer timings

+1.9 s www.google.com

reCAPTCHA v3 api.js; the _GRECAPTCHA cookie is marketing according to the site's rules.

+2.6 s www.gstatic.com

The reCAPTCHA script; 45 requests over the capture.

+3.0 s s.w.org

WordPress emoji icons; 44 requests over the capture.

+3.2 s www.google.com

The reCAPTCHA service frame (api2/anchor).

+8.0 s region1.google-analytics.com

page_view, gcs=G100; the identifier changes on every page.

Detected trackers

Indicators of GDPR non-compliance

Context

roccaalmare.ee is the website of the Rocca al Mare shopping centre in Tallinn, part of the Citycon group. The site runs on WordPress and is served by nginx 1.21.1. There is no Content-Security-Policy header, and no response sets Set-Cookie. Consent is managed by a platform loaded from the host cm.nxtm.pl.

The measurement is a single capture: the homepage four times, the shop list, offers, news, the cookie rules page twice, and three openings of the privacy policy files — Estonian and English. In total, 766 requests to 12 hosts. Of these, 9 requests to edge.microsoft.com are a browser service; they have nothing to do with the site and are excluded from the review.

Processing is described by three texts: the banner itself with its cookie declaration, the “Küpsiste kasutamise eeskiri” page, and Citycon’s privacy policy in PDF.

Who receives data directly

Before any choice — Google (reCAPTCHA, Tag Manager, Analytics in denied mode, fonts), WordPress.org (emoji icons), and the cm.nxtm.pl consent platform.

Declared versus actual

The technical side here is tidier than the descriptive side. Google Analytics 4 runs in denied mode throughout the capture: all 11 requests carry gcs=G100. On every page, analytics receives a new identifier and a first-visit marker, meaning nothing is stored between pages. There are no advertising pixels in the capture at all. The discrepancies lie in reCAPTCHA and in what the site says about itself.

First — reCAPTCHA runs everywhere and before any choice. The invisible reCAPTCHA v3 loads at +1.9 s on every page opened — the homepage, the shop list, offers, news, the cookie rules. Along with it, a service frame opens on www.google.com, and Google fonts and a worker script are loaded: 90 requests over the capture. It could be regarded as form protection, but the site itself classifies it differently. The cookie rules page lists the _GRECAPTCHA cookie under marketing. The declaration in the banner, meanwhile, places the _grecaptcha storage under ’necessary’. The site, in other words, has not decided what this is. Under one of its own classifications, it is marketing that runs without consent on every page.

Second — it is unclear who the controller is. The banner states that the controller is “Rocca al Mare”. But that is the name of a shopping centre, not a legal entity. The privacy policy names two controllers: Citycon Finland Oy is responsible for Rocca al Mare and Kristiine, and in the next section Citycon Oyj is responsible for the same Rocca al Mare and Kristiine. There is no mention of joint controllership. The cookie rules page calls itself the rules of Citycon Oyj. When consenting in the banner, a visitor does not know whom they are dealing with. The policy suggests withdrawing consent by email to info@citycon.com — that is, not to the entity named in the banner.

Third — consent is not informed, and the cookie lists contradict each other. The banner’s first layer speaks of one thing: partners’ analytics cookies, with the “Nõustun kõigiga” button meaning consent to analytics. The second layer shows that the same button also switches on marketing and two advertising categories — collecting user data for advertising and personalizing advertising. The policy, for its part, states outright that cookies and pixels serve, among other things, to build user profiles and for targeted marketing.

There are two cookie lists, and comparing them is instructive. The banner declaration looks like the output of a scan run from a site editor’s browser. It contains the account settings of WordPress administrators, data from browser extensions — crypto wallets and password managers — and a host of services absent from the capture: Yandex Metrica, Microsoft Clarity, Meta, Google Ads, call tracking, and legacy Universal Analytics counters. Worse, the Yandex Metrica identifiers and the Meta data are filed under ’necessary’, i.e. the category that does not require consent. The cookie rules page shows a different list — a Cookiebot snapshot, although Cookiebot does not load on the site. That list contains what the banner lacks: the reCAPTCHA service entries rc::a–rc::f, the language cookie GUEST_LANGUAGE_ID, and Sentry session recording. Neither list describes the site as it actually runs in the capture.

Separately, on WordPress Emoji. The 44 requests to s.w.org for emoji images hand the visitor’s IP address to WordPress.org servers. This host is not named in either list. It is not recorded as a separate violation, but it can be fixed with a single setting.

Proven: reCAPTCHA loads before any choice on all pages. The first request fires at +1.9 s and repeats on each of the nine HTML pages — 90 requests to three Google hosts over the capture.

Proven: the site itself classifies the reCAPTCHA cookie as marketing. Cookie rules page: _GRECAPTCHA — “Turustamine”. Banner declaration: _grecaptcha — “Vajalik”.

Proven: Google Analytics respects the denial. All 11 requests carry gcs=G100, and the client identifier is new on every page.

Proven: the cookie lists diverge. A comparison of both saved lists: seven items from the rules page are absent from the banner, and dozens of banner items are absent from the rules page.

Not established: whether reCAPTCHA creates a cookie in the visitor’s browser. Cookie headers were removed during cleaning, and the file contains no Set-Cookie. The finding rests on the loading and on the site’s own classification, not on the presence of a cookie.

Not verified: what switches on after consent. No consent was given in the capture, and the GTM container body was removed. Which tags would fire after “Nõustun kõigiga” is not established by a browser-based measurement.

Boundaries of this observation

The measurement covers the site’s public pages and the policy files. The mobile app, the loyalty programme, and the newsletter were not examined. The observation records browser behavior, not server-side processing. What Google does with reCAPTCHA and analytics data is not verified by a browser-based measurement.

The review uses the Estonian version of the privacy policy, which was opened during the capture. The file’s metadata gives a creation date of February 2023, although it is published in the uploads section for April 2026.

The banner declaration and the cookie rules page were saved in full. The discrepancies between them can be verified directly from the saved files. The HAR file has been published cleaned: Cookie headers and most script bodies were removed, including the GTM container and the consent platform’s data. Google client identifiers are not reproduced in this review.

Legal assessment falls to the competent authority — the Andmekaitse Inspektsioon, which is named in the policy itself.

Conclusion

The site’s technical setup is restrained: Google Analytics runs in denied mode and stores no identifiers, and there are no advertising pixels. The exception is reCAPTCHA. It loads on every page before any choice, while the site’s own rules classify its cookie as marketing.

The descriptive side is worse. The banner asks for consent to analytics but switches on advertising. The banner declaration lists Yandex Metrica and Meta data as ’necessary’ and includes traces of browser extensions and editors’ accounts. The rules page shows a snapshot of a platform the site does not use. The banner names a shopping centre as the controller; the policy names two different companies with the same area of responsibility. A visitor can understand neither what they are consenting to nor with whom.

Remedy: load reCAPTCHA only on pages with forms and only when they are used, or make it conditional on consent; settle the classification of its cookie; rewrite the banner’s first layer so that it names every category switched on by the “Nõustun kõigiga” button; run a fresh cookie scan from a clean browser and replace both declarations with it, removing from ’necessary’ everything that does not belong there; remove the Cookiebot snapshot from the rules page; name a single, legally identified controller in the banner, the rules, and the policy, or describe joint controllership under Article 26; disable emoji loading from s.w.org.

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/roccaalmare-ee-2026-09-27.har
SHA-256: 328be356e1a832a01d884e44418dd035a73f328bfd834638f7e4deb7da19ed43
Screenshot
Скриншот интерфейса
The banner's first layer (Estonian): the text speaks only of partners' analytics cookies; 'Keeldumine' and 'Näita üksikasju' as links, 'Nõustun kõigiga' as a bright button · 27.09.2026
Скриншот интерфейса
The banner's second layer, 'Küpsiste deklaratsioon': besides analytics — 'Turundus', 'Kasutajaandmed reklaami eesmärgil', and 'Andmete isikupärastamine reklaami eesmärgil' · 27.09.2026
Re-check snapshot
Awaiting changes
HAR files are stored on EU infrastructure (Proton Drive). SHA-256 is published for integrity verification.