Technical audit · 30.08.2026

soov.ee

Estonian classifieds portal

Postimees media group classifieds portal — one recording, 19 navigations, 10,956 requests, over 200 third-party nodes. A full advertising stack deploys across pages: Google Ad Manager and AdSense, the Setupad monetisation platform, and, via the consent banner, over two hundred RTB exchanges and identifier sync services. A consent management platform is present — Google Funding Choices — but it appears at +1462 ms, while the tag container, mediator, Facebook SDK, and Google ad slot library all start earlier, and the first RTB sync request fires 17 ms before the banner. The privacy terms meanwhile explicitly state that personalised advertising cookies are not enabled automatically and require consent. The browser sent the DNT: 1 header during recording.

Request timeline

+0 ms · navigation
Portal opens. The first-party application serves markup and static assets. Already at +285 ms, third-party monetisation scripts load from the markup: stpd.cloud and core.dimatter.ai (Setupad mediator). The browser sent the DNT: 1 header.
+439–+938 ms · advertising and analytics infrastructure
www.googletagmanager.com (tag container) at +439 ms, Facebook SDK (connect.facebook.net) at +794 ms, Google ad slot library securepubads.g.doubleclick.net at +938 ms. All of this precedes the consent banner.
+2912 ms · Google Analytics 4
region1.google-analytics.com/g/collect — page_view for property G-TPRKVMLJHF with page URL, referrer, and session parameters. No consent mode signal (gcs) in the request.
throughout session · RTB auction
Full auction unfolds: SmartAdServer, SmileWanted, Rubicon/Magnite, PubMatic, AdForm, BidSwitch, Presage/Ogury, OneTag, 1RX, Eskimi, Sharethrough, OpenX, Sparteo, The Trade Desk, Everest/Adobe, Sovrn/Lijit, Outbrain, and others — over 200 third-party nodes. Some requests carry a TCF consent string (gdpr=1); others carry the flag gdpr=0.
+247055 ms · Google ad display
securepubads.g.doubleclick.net/gampad/ads — Google Ad Manager auction requests during continued navigation; pagead2.googlesyndication.com (AdSense) at +247374 ms.

Declared versus actual

✓ Controller — AS Postimees Grupp, reg. code 10184643, Tallinn, Tartu mnt 80; portal administered by Postimees (user agreement) — declared
✓ Cookies divided into necessary, statistical, preference, and personalised advertising (including tracking cookies) (cl. 11.5) — declared
✓ Personalised advertising cookies not enabled automatically; visitor gives consent for them (cl. 11.7.2(d)) — declared
✓ Processors request consent for advertising cookies (cl. 11.7.1) — declared
✓ Facebook named explicitly; transfer to the USA acknowledged with reference to Schrems II (cl. 11.8) — declared
✓ Some advertising served through automated programmatic platforms in real time (cl. 11.11, added 20.05.2026) — declared
✓ Cookie management by category via link at the bottom of the page (cl. 11.9) — declared
✓ Consent banner export declares 238 partners and lists them by name — declared
+ Automatic activation of the advertising layer (Setupad mediator, Google slot library, RTB identifier sync) before interaction with the consent banner — not declared
+ gdpr=0 flag in some RTB requests — signals to partners that GDPR mode does not apply (204 requests) — not declared
+ Google Analytics (G-TPRKVMLJHF, G-F3J5Z078Y0) as a recipient — not named in the privacy terms — not declared
+ Google Ad Manager / AdSense and the Setupad mediator — not named in the privacy terms — not declared
+ Absence of a consent mode signal (gcs) in Google Analytics 4 requests — not declared

Transfer timings

+285 ms stpd.cloud / core.dimatter.ai

Setupad monetisation mediator, embedded in the page markup.

+439 ms www.googletagmanager.com

Google Tag Manager container.

+794 ms connect.facebook.net

Facebook SDK, pixel 4289539706311. No /tr events sent in the recording.

+938 ms securepubads.g.doubleclick.net

Google ad slot library (GPT).

+1445 ms gum.criteo.com

Criteo identifier sync — 17 ms before the consent banner appears.

+1462 ms fundingchoicesmessages.google.com

Google Funding Choices — appears after transmissions have begun.

+2912 ms region1.google-analytics.com

GA4 page_view (G-TPRKVMLJHF) without consent mode signal gcs.

Detected trackers

Show data recipients (89)
  • Google Ad Manager / AdSense — ad slots, auction, display: securepubads.g.doubleclick.net, pagead2.googlesyndication.com, tpc.googlesyndication.com, googleads.g.doubleclick.net, ade.googlesyndication.com, partner.googleadservices.com, www.googletagservices.com, ad.doubleclick.net, cm.g.doubleclick.net, stats.g.doubleclick.net, s0.2mdn.net, *.safeframe.googlesyndication.com (ad rendering in a safe frame), afs.googleusercontent.com, syndicatedsearch.goog, www.google.com, www.google.ee, cdn.ampproject.org
  • Google Tag Manager (www.googletagmanager.com) — tag container
  • Google Analytics 4 (G-TPRKVMLJHF, G-F3J5Z078Y0) — region1.google-analytics.com, region1.analytics.google.com, www.google-analytics.com; page_view without a consent mode signal
  • Google Funding Choices (fundingchoicesmessages.google.com) — consent management platform, banner at +1462 ms
  • Google Ad Traffic Quality (ep1.adtrafficquality.google, ep2.adtrafficquality.google) — traffic quality assessment
  • Google Fonts (fonts.googleapis.com, fonts.gstatic.com, www.gstatic.com, csi.gstatic.com) — fonts
  • Setupad — monetisation platform and auction mediator: node.setupad.com, wb.setupad.com, prebid-stag.setupad.net, analytics.setupad.io, stpd.cloud, core.dimatter.ai, adx.digitalmatter.services, pbjs.digitalmatter.services
  • Criteo — identifiers and RTB bidding: static.criteo.net, gum.criteo.com, ssp-sync.criteo.com, dis.criteo.com, ads.eu.criteo.com, rtb.fr3.eu.criteo.com, cat.fr3.eu.criteo.com, client-side-metrics.fr3.eu.criteo.net, imageproxy.eu.criteo.net, ag.gbc.criteo.com, gem.gbc.criteo.com, grid-bidder.criteo.com
  • SmartAdServer / Equativ — RTB: rtb-csync.smartadserver.com, ssb-global.smartadserver.com, sync.smartadserver.com, ssbsync.smartadserver.com, ssbsync-global.smartadserver.com, csync-eu.smartadserver.com, csync-global.smartadserver.com, apps.smartadserver.com, prg.smartadserver.com, equativ-match.dotomi.com
  • SmileWanted — RTB: csync.smilewanted.com, prebid.smilewanted.com, static.smilewanted.com
  • Presage / Ogury — RTB: ms-cookie-sync.presage.io, mweb-hb.presage.io, ms-ads-monitoring-events.presage.io, ogury-match.dotomi.com
  • OneTag (onetag-sys.com) — RTB
  • 1RX / RhythmOne (sync.1rx.io) — RTB
  • BidSwitch (x.bidswitch.net) — RTB
  • Rubicon / Magnite — RTB: eus.rubiconproject.com, token.rubiconproject.com, pixel.rubiconproject.com, fastlane.rubiconproject.com, secure-assets.rubiconproject.com
  • PubMatic — RTB: ads.pubmatic.com, image6.pubmatic.com, image8.pubmatic.com
  • AdForm — RTB: c1.adform.net, cm.adform.net, adx.adform.net, s1.adform.net, track.adform.net
  • Eskimi — RTB: ittpx.eskimi.com, ittr.eskimi.com
  • Xandr / AppNexus (Microsoft) — RTB: secure.adnxs.com, ib.adnxs.com
  • Index Exchange — RTB: js-sec.indexww.com, htlb.casalemedia.com, ssum-sec.casalemedia.com
  • The Trade Desk (match.adsrvr.org) — RTB
  • Adobe Advertising / Everest (sync-tm.everesttech.net) — identifier syncing
  • Sharethrough (match.sharethrough.com) — RTB
  • Sovrn / Lijit — RTB: ap.lijit.com, ce.lijit.com
  • Outbrain — RTB: b1sync.outbrain.com; Zemanta (Outbrain DSP): b1sync.zemanta.com
  • OpenX — RTB: u.openx.net, eu-u.openx.net, rtb.openx.net, postimees-d.openx.net
  • Sparteo — RTB: sync.sparteo.com, bid.sparteo.com
  • Yahoo / Nexxen — RTB: ups.analytics.yahoo.com
  • Opera Ads — RTB: t.adx.opera.com, t.oa.opera.com
  • ID5 — identifier: id5-sync.com, cdn.id5-sync.com, lb.eu-1-id5-sync.com, lbs.eu-1-id5-sync.com
  • LiveRamp — identifier: id.rlcdn.com, pbs-cs.yellowblue.io
  • Lotame (id.crwdcntrl.net) — data management platform
  • 33Across — RTB: ssc-cms.33across.com, lexicon.33across.com
  • Quantcast — CMP/RTB: cms.quantserve.com
  • AdMatic — RTB: prebid.admatic.de, dsp-service.admatic.de, static.cdn.admatic.de, postimees.rtb.admatic.de
  • Cootlogix — RTB: exchange.cootlogix.com, sync.cootlogix.com
  • AMX / AlgoriX (euw2-cs.amx1.net) — RTB
  • A-Mo / AdsWizz — RTB: sync.a-mo.net, prebid.a-mo.net
  • PMB Monetize (sync.pmbmonetize.live) — RTB
  • BetweenDigital (ads.betweendigital.com) — RTB
  • 360Yield / Improve Digital — RTB: ice.360yield.com, ad.360yield.com, dsp.360yield.com
  • LoopMe (csync.loopme.me) — RTB
  • Smaato (s.ad.smaato.net) — RTB
  • AdManMedia (cs.admanmedia.com) — RTB
  • TrustedStack (hb.trustedstack.com) — RTB
  • TripleLift (eb2.3lift.com) — RTB
  • DeepIntent (match.deepintent.com) — RTB
  • ContextWeb / PulsePoint (bh.contextweb.com) — RTB
  • Beeswax / bidr (match.prod.bidr.io) — RTB
  • 4dex — RTB: u-ams.4dex.io, usync.4dex.io, mp.4dex.io, script.4dex.io
  • Bidmatic (adapter.bidmatic.io, sync.bidmatic.io) — RTB
  • ConnectAd (i.connectad.io, sync.connectad.io) — RTB
  • Hadron / Audigent (id.hadron.ad.gt) — identifier
  • AdRoll (d.adroll.com) — RTB
  • Adition / Virtual Minds (dsp-cookie.adfarm1.adition.com) — RTB
  • StackAdapt (sync.srv.stackadapt.com) — RTB
  • Ingage (ex.ingage.tech) — RTB
  • Amazon Ad System (s.amazon-adsystem.com) — RTB
  • Media.net — RTB: cs.media.net, hbx.media.net
  • Turn / Amobee (ad.turn.com) — RTB
  • YM Mobi (gw-iad-bid.ymmobi.com) — RTB
  • Chocolate Platform (cpm.chocolateplatform.com) — RTB
  • MediaGo / Baidu (go.mediagotechnology.com) — RTB
  • Bricks (pbsj.bricks-co.com) — RTB
  • WP.pl / Wirtualna Polska (ssp.wp.pl) — RTB
  • CtnsNet (i.ctnsnet.com) — RTB
  • SiteScout / Centro (pixel-sync.sitescout.com) — RTB
  • RichAudience (sync.richaudience.com) — RTB
  • AdotMob (sync.adotmob.com) — RTB
  • VISX (sync.visx.net) — RTB
  • FreeWheel (Comcast) (user-sync.fwmrm.net) — RTB
  • Omnitag / Adyoulike (visitor.omnitagjs.com) — RTB
  • RFI Hub / Rocket Fuel (p.rfihub.com) — RTB
  • IQM (pxl.iqm.com) — RTB
  • Simpli.fi (um.simpli.fi) — RTB
  • Kueez RTB (sync.kueezrtb.com) — RTB
  • MathTag / MediaMath (sync.mathtag.com) — RTB
  • Company-Target (s.company-target.com) — RTB
  • BTtrack (bttrack.com) — RTB
  • KueezRTB, dnacdn.net, measureadv.com, xqnzlnc.pa-cd.com, a.bids.ws, bids.ws, tag.aticdn.net — ad network delivery and sync CDNs
  • Disqus (ssp.disqus.com) — comment advertising sync
  • AdObject / dotomi (Conversant/Epsilon): ogury-match.dotomi.com, equativ-match.dotomi.com, stx-match.dotomi.com
  • Facebook (connect.facebook.net) — SDK, pixel 4289539706311; no /tr events sent in the recording
  • Adobe Typekit (use.typekit.net, p.typekit.net) — web fonts
  • jsDelivr (cdn.jsdelivr.net) — library CDN
  • Cloudflare Insights (static.cloudflareinsights.com) — RUM telemetry
  • Postimees (owner media group): v.postimees.ee, services.postimees.ee, f.pmo.ee, f7.pmo.ee, f8.pmo.ee, f10.pmo.ee, f11.pmo.ee — internal advertising and group services
  • cvkeskus.ee — Postimees group jobs portal (cross-promotion)
  • temu.com — advertiser whose ads loaded into slots

Indicators of GDPR non-compliance

Context

soov.ee is a classifieds portal (goods, property, jobs, and services), administered by AS Postimees Grupp (registration code 10184643, Tallinn, Tartu mnt 80), part of the Postimees media group. Data processing is described in two documents: the portal’s user agreement (in Russian) and the general privacy terms of MM Grupp media companies, section 11 of which (“Küpsised”) covers cookies. The materials include a consent banner export with a partner list and a banner screenshot.

The recording consists of a single session with nineteen navigations: the homepage followed by a sequence of classifieds section pages. 10,956 requests, over 200 third-party nodes, recording duration approximately eleven minutes. Captured on 30 August 2026. The file is dense: of all requests, the first-party share is the smaller portion; the bulk is the advertising layer.

Who receives data directly

Google (Ad Manager, AdSense, Analytics, Funding Choices, Fonts), Setupad, Criteo, SmartAdServer, SmileWanted, Rubicon/Magnite, PubMatic, AdForm, BidSwitch, Presage/Ogury, OneTag, 1RX, Eskimi, The Trade Desk, OpenX, Sharethrough, Sovrn/Lijit, Outbrain, ID5, 33Across, Facebook, and over two hundred other advertising and identifier services.

Declared versus actual

The privacy terms are detailed and unambiguous on advertising. Clause 11.5 divides cookies into necessary, statistical, preference, and personalised advertising cookies, to which tracking cookies are explicitly assigned. Clause 11.7.2(d) states that personalised advertising cookies are not enabled automatically and that visitors give consent for them; clause 11.7.1 states that processors request consent for advertising cookies. Facebook is named explicitly (clause 11.8), with acknowledgement of transfers to the USA and a reference to Schrems II. The consent banner export declares 238 partners and lists them by name.

The recording reveals several divergences.

Consent arrives late — this is the central issue. A consent management platform is present: Google Funding Choices, with the banner interface requested at +1462 ms. But by that point the advertising and analytics infrastructure is already deployed. The Setupad monetisation mediator (stpd.cloud, core.dimatter.ai) loads at +285 ms, the Google Tag Manager container at +439 ms, the Facebook SDK at +794 ms, and the Google ad slot library (securepubads) at +938 ms. The first RTB sync request to Criteo (gum.criteo.com) fires at +1445 ms — 17 ms before the banner appears — with simultaneous requests to 33Across, Lotame, ID5, and Hadron. In other words, the layer that the policy promises to activate only upon consent activates automatically on page load, before any interaction with the banner.

Google Analytics transmits data without a consent signal. At +2912 ms, a page_view is sent to GA4 (property G-TPRKVMLJHF) with the page URL, referrer, and session parameters. The Google Consent Mode signal (gcs) is entirely absent — meaning consent mode for analytics has not been set.

Within a single session, the site signals both the applicability and non-applicability of GDPR. Over 2,800 RTB requests carry a TCF consent string with gdpr=1, but 204 requests carry gdpr=0 — signalling to partners that GDPR mode does not apply. For an Estonian site and a visitor in the EU, the gdpr=0 flag is incorrect and removes the recipients’ obligations under TCF.

The recipient set is exceptionally broad. The recording contains over 200 third-party advertising and identifier nodes. The privacy terms name only Facebook explicitly; the list of 238 partners is placed in the consent banner. Google Analytics, Google Ad Manager, and the Setupad mediator are not named as recipients of web data in the privacy terms themselves. Facebook is present in practice: the SDK (connect.facebook.net) with pixel ID 4289539706311 loads, although no /tr events were sent in the recording.

Established: a consent platform is present on the site. Requests to Google Funding Choices (fundingchoicesmessages.google.com) are visible in the recording; the banner interface is requested at +1462 ms.

Established: the advertising layer and analytics start before the banner. The Setupad mediator (+285 ms), tag container (+439 ms), Facebook SDK (+794 ms), and Google slot library (+938 ms) all precede the consent interface request; the first RTB sync (+1445 ms) fires before the banner. The order is readable from the timings and initiators in the recording.

Established: Google Analytics requests carry no consent mode signal. The page_view request (+2912 ms) contains no gcs parameter.

Established: some RTB requests signal gdpr=0. The gdpr parameter equals zero in 204 requests; it equals one with a TCF consent string in over 2,800 requests.

Not established and not asserted: the content of the user’s banner choice. Whether the accept or reject button was pressed cannot be determined conclusively from the network recording; what is recorded is the order — the advertising infrastructure and the first RTB sync requests precede the appearance of the banner. The conclusion rests on this ordering, not on a reconstruction of button presses.

Not established and not asserted: Facebook event transmission. The Facebook SDK is loaded and Facebook can see the visitor’s IP address, but no /tr event requests appear in the recording; whether Facebook collects data by other means is not determinable through a browser recording.

Separately: the browser sent the DNT: 1 header during recording. This had no effect on the composition or destination of requests.

Scope of observation

The recording covers nineteen pages of the portal. The observation captures browser behaviour, not the internal workings of services: server-side processing, contractual arrangements with recipients, and their own configurations are not verifiable through a browser recording. Legal assessment is a matter for the competent authority — in Estonia, the Andmekaitse Inspektsioon.

The file was published sanitised under the “lean” profile: cookie values in requests were removed, Cookie and Set-Cookie headers were stripped, response bodies and static assets were removed; the sanitisation log records 2,166 edits and a checksum. The conclusion about the consent platform arriving late is based on the network layer — node composition, URLs, timings, and request initiators are fully readable from the recording, and it is visible that the advertising infrastructure and the first RTB sync requests precede the consent interface request. Full identifiers and consent strings are not reproduced in the analysis.

Service identification is based on domains, URL patterns, and cross-referencing with the consent banner export: Google — via google-analytics.com, googletagmanager.com, googlesyndication.com, doubleclick.net with property numbers; consent platform — via fundingchoicesmessages.google.com; mediator — via setupad.com, stpd.cloud, dimatter.ai; RTB vendors — via their domains (criteo, smartadserver, rubiconproject, pubmatic, adform, bidswitch, presage.io, 1rx.io, and others). The gdpr flag and TCF consent string are read from the parameters of the requests themselves. Facebook — via connect.facebook.net and the pixel identifier.

Conclusion

The Postimees media group classifieds portal deploys a full advertising stack across its pages: Google Ad Manager and AdSense, the Setupad monetisation platform, and, via the consent banner, over two hundred RTB exchanges and identifier sync services. A consent management platform is present — Google Funding Choices — but it appears at +1462 ms, after the mediator, tag container, Facebook SDK, and Google ad slot library are already initialised, and after the first RTB sync request has already reached Criteo. This directly contradicts the site’s own privacy terms, where personalised advertising cookies are described as not enabled automatically and requiring consent. Google Analytics transmits page_view without a consent mode signal, and some RTB requests signal gdpr=0 to partners — claiming GDPR mode does not apply — while other requests carry a consent string with gdpr=1.

Remediation: do not activate the advertising layer, monetisation mediator, Google ad slot library, Facebook SDK, or RTB identifier sync before consent is obtained — gate their loading under actual control of the consent platform so that no requests reach advertising or identifier recipients before the user makes a choice; set the consent mode signal (gcs) in Google Analytics requests and align the gdpr flag in RTB requests with the actual applicability of GDPR, eliminating gdpr=0 for EEA visitors; name the actual recipients of web data in the privacy terms explicitly, including Google Analytics, Google Ad Manager, and the Setupad mediator, rather than only categories and a list buried in the consent banner.

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