Technical audit · 06.09.2026

getapro.ee

Marketplace for finding tradesmen and specialists

A marketplace for finding tradesmen — a single capture across 17 pages, 1813 requests, 288 nodes. The OneTrust consent platform and Google Consent Mode deny storage by default, and consent is never given across the whole session: the state across all analytics requests stays 'denied'. Even so, Google Ads conversion tracking and the Google Tag Manager container load straight from the page markup before the consent mechanism appears, and the AdSense requests transmit page_view and the page URL to Google's ad accounts. The browser meanwhile sent DNT: 1. The security headers are weak: on a marketplace where tradesmen leave their personal ID code and payment details, the site sets neither HSTS, nor Content-Security-Policy, nor referrer-policy.

Request timeline

+0 ms · homepage load
Served via Microsoft-IIS/10.0 (Azure infrastructure). Security headers are weak: only X-Frame-Options: SAMEORIGIN and Cache-Control: private are set; no HSTS, no Content-Security-Policy, no Referrer-Policy, no Permissions-Policy, no X-Content-Type-Options. The browser sent DNT: 1.
+378 ms · Google Ads conversion tracking
www.googleadservices.com/pagead/conversion.js — the Google Ads conversion script, inserted straight into the page markup (initiator — parser), before the consent platform appears.
+414 ms · tag container
www.googletagmanager.com — Google Tag Manager, also from the page markup, before the consent platform. At +413 ms the Azure Application Insights telemetry script starts in parallel.
+1060…+1581 ms · Google advertising requests
pagead2.googlesyndication.com/ccm/collect — page_view events with the full page URL go to the ad accounts AW-413167288 and AW-10975410146. At +1645 ms — a GA4 page_view (G-YSEKMQW0QE).
+7764 ms · embedded YouTube
www.youtube.com — an embedded video; its player pulls in googleads.g.doubleclick.net. On the /job order page, Google Maps (maps.googleapis.com) runs separately — a functional map.
OneTrust panel · vendor list
When the OneTrust panel operates, the browser requests deviceStorage.json / disclosures.json files from hundreds of IAB TCF nodes (adition, samba.tv, tcf.adtech.app and the tail). This is vendor disclosure: the nodes receive the IP address and referer, but no behavioural payload is transmitted to them.

Declared versus actual

✓ Controller (Ettevõte / GetaPro) — AllePal OÜ, registry code 12209337, Pärnu mnt 141, Tallinn 11314, contact@getapro.ee — declared
✓ On registration of a tradesman/client the following are collected: first and last name, phone, email, order address (for the client), payment details (for the tradesman), personal ID code or company name and registration number, technical data — declared
✓ Technical data — browser type, OS, IP address; needed to analyse use of the site; 'not used to personalise the user' — declared
✓ Statistics cookies: _ga, _gid, _gat_UA-, _gclxxxx, ai_session — counting visits; the data is 'aggregated into statistics and therefore anonymous' — declared
✓ Targeting cookies: _fbp (first party), www.facebook.com (third party), youtube.com — set by advertising partners, identify the browser and device for targeted advertising — declared
✓ Third-party cookies are used 'for the purposes of our advertising and marketing activity' — declared
✓ Strictly necessary cookies: OptanonConsent, OptanonAlertBoxClosed, ARRAffinity, ASP.NET_SessionId and others — declared
✓ The IAB TCF vendor list is available as a separate listing (getapro.ee); it names Google, Adform, Criteo and others — declared
✓ Consent settings are passed to vendors adhering to the Transparency and Consent Framework standard — declared
+ Google Ads conversion tracking (accounts AW-413167288, AW-10975410146) — not named as a recipient — not declared
+ That the advertising scripts (Google Ads, GTM) load from the page markup before the consent platform — not declared
+ That page_view events and the page URL go to Google while the consent state is 'denied' — not declared
+ The divergence between the statement 'technical data is not used for personalisation / statistics are anonymous' and the actual advertising stack with IAB TCF targeted advertising — not declared
+ The Facebook Pixel (_fbp) is declared in the cookie declaration but did not fire in this capture — there are no requests to facebook.com — not declared

Transfer timings

+378 ms www.googleadservices.com

Google Ads conversion.js, inserted into the page markup, before the CMP.

+414 ms www.googletagmanager.com

Google Tag Manager from the page markup, before the CMP.

+1031 ms cdn.cookielaw.org

OneTrust loads only after the advertising scripts.

+1060 ms pagead2.googlesyndication.com

ccm/collect, page_view and page URL, gcs=G100. Accounts AW-413167288, AW-10975410146.

+1645 ms region1.google-analytics.com

GA4 page_view (G-YSEKMQW0QE), gcs=G100.

+1813 ms dc.services.visualstudio.com

Azure Application Insights — site performance monitoring.

+7764 ms www.youtube.com / googleads.g.doubleclick.net

Embedded video and the DoubleClick pulled in by its player.

No exact timing

OneTrust panel IAB TCF (hundreds of nodes)deviceStorage.json / disclosures.json. The nodes receive the IP address and referer, no payload.

Detected trackers

Show data recipients (14)
  • OneTrust (cdn.cookielaw.org) — consent management platform; loads at +1031 ms, already after the first advertising scripts
  • Google Ads conversion (www.googleadservices.com/pagead/conversion.js) — conversion tracking; loads at +378 ms straight from the page markup, before the consent platform; page_view events go to the ad accounts AW-413167288 and AW-10975410146
  • Google AdSense / Ads (pagead2.googlesyndication.com/ccm/collect) — transmits page_view and the full page URL to Google in consent state gcs=G100
  • Google Tag Manager (www.googletagmanager.com) — the container, loads at +414 ms from the page markup, before the consent platform
  • Google Analytics 4 (region1.google-analytics.com, G-YSEKMQW0QE) — analytics; consent state gcs=G100 (both storages denied), pings are cookieless
  • Google DoubleClick (googleads.g.doubleclick.net) — pulled in by the embedded YouTube player
  • Google Maps (maps.googleapis.com) — a map on the /job order page, functional
  • Google Fonts (fonts.gstatic.com, fonts.googleapis.com) — web fonts, the IP address goes to Google
  • YouTube (www.youtube.com) — an embedded video; the VISITOR_INFO1_LIVE, YSC cookies are declared in the cookie declaration
  • Apple Sign-In (appleid.cdn-apple.com) — Apple ID login, functional (SSO)
  • Microsoft Azure Application Insights (dc.services.visualstudio.com, az416426.vo.msecnd.net) — site performance telemetry and monitoring, functional
  • Azure Blob Storage / CDN (getaprolv.blob.core.windows.net, getaproee.azureedge.net) — hosting of the site's resources, first party on Microsoft infrastructure
  • IAB TCF vendor list (imagesrv.adition.com, pixel.mtrcs.samba.tv, tcf.adtech.app and a tail of hundreds of nodes) — device-disclosure files of the OneTrust panel; they receive the IP address and referer on request, but no behavioural payload is transmitted to them
  • The Facebook Pixel (_fbp) is declared in the cookie declaration but did not fire in this capture — there are no requests to facebook.com in the recording

Indicators of GDPR non-compliance

Context

getapro.ee is a marketplace that connects tradesmen and specialists (Tegija) with clients (Klient) looking for their services. The operator is AllePal OÜ, registry code 12209337, Pärnu mnt 141, Tallinn 11314, contact@getapro.ee. The site is hosted on Microsoft Azure infrastructure: served via Microsoft-IIS/10.0, resources from getaprolv.blob.core.windows.net and getaproee.azureedge.net, monitoring via Azure Application Insights.

The capture is a single recording across 17 pages: the homepage, the Russian version, tradesman registration, the order page, services, and the door-installation category with filters. In total 1813 requests, 288 nodes, about eleven minutes, recorded on 6 September 2026, in a browser with language ru. Processing is described by the terms of use with a privacy and cookie section, the OneTrust banner text, and a separate IAB TCF vendor list.

Who receives data directly

Google (Ads conversion, AdSense, Analytics, Tag Manager, DoubleClick, Maps, Fonts, YouTube). Functionally — Apple ID login, Microsoft Azure telemetry, and resource hosting on Azure.

Declared vs. actual

It is worth noting to the site’s credit: the getapro policy is more honest than a number of sister platforms. It contains no false claim that ‘we do not transfer data to third parties’, openly describes the use of third-party cookies ‘for advertising and marketing activity’, names the advertising and statistics cookies explicitly, and provides a separate IAB vendor list. Against this backdrop the discrepancies concern not the fact of disclosure but the load order and the accuracy of particular wordings.

First — the advertising scripts get ahead of consent. The consent infrastructure is in place: OneTrust and Google Consent Mode with storage denied by default. But the load order bypasses it. The Google Ads conversion tracking script (conversion.js) is inserted straight into the page markup and executes at +378 ms, the Google Tag Manager container at +414 ms, whereas the OneTrust platform script itself is not pulled in until +1031 ms. The ccm/collect advertising requests transmit a page_view event and the full page URL to the Google Ads accounts AW-413167288 and AW-10975410146. Across the whole session consent was never given — the state across all analytics and advertising requests stays gcs=G100. Google analytics does honour the storage denial (the pings are cookieless), but the advertising scripts load and transmit data regardless of consent.

Second — the security headers are weak. The site on Microsoft-IIS/10.0 sets, on the main document, only X-Frame-Options and Cache-Control. There is no HSTS, no Content-Security-Policy, no Referrer-Policy, no Permissions-Policy, no X-Content-Type-Options. This is notable on a marketplace where, on registration, a tradesman leaves their personal ID code (isikukood) and payment details, and a client an order address: the basic set of protective headers expected for a platform with this composition of data is absent here.

Third — ‘anonymous’ and ’no personalisation’ diverge from the advertising stack. In the technical-data section the policy states that the IP address and other technical data are ’not used to personalise the user’, and that the statistics cookies provide ‘anonymous’ statistics. But at the same time the site runs Google Ads conversion tracking, AdSense and the IAB TCF framework with hundreds of vendors — and its own declaration, in the targeting-cookie category, describes this as ‘unique identification of the browser and device’ for targeted advertising. Two places in the same document say different things about one and the same matter: the technical section promises the absence of personalisation, the advertising section describes it.

Separately: the Facebook pixel is declared in the cookie declaration (_fbp, www.facebook.com), but it did not fire in this capture — there are no requests to facebook.com in the recording.

Proven: consent was not given during the session. Across 17 pages and 1813 requests, the consent state across all GA4 and AdSense requests is gcs=G100 (both storages denied). The GA client identifier is cookieless, consistent with the denied mode.

Proven: the advertising scripts get ahead of the consent platform. The Google Ads conversion.js goes out at +378 ms, GTM at +414 ms, whereas the OneTrust script loads at +1031 ms. Both advertising scripts are inserted straight into the page markup (initiator — parser); there is no consent condition before them.

Proven: the advertising requests transmit data under the denial. ccm/collect at +1060…+1581 ms transmits page_view and the full page URL to two Google Ads accounts under the state gcs=G100.

Proven: the browser signalled a refusal to be tracked. The DNT: 1 header is present in 1073 requests. It had no effect on the composition of the transfers.

Not proven, and not claimed: the firing of the Facebook pixel. The _fbp cookie is declared, but in this capture there are no requests to facebook.com; no conclusion is drawn about its operation.

Observation boundaries

The capture covers 17 pages of the marketplace and records browser behaviour, not the services’ internal workings: server-side processing and contracts with recipients are not verified by a browser-level capture. The tail of hundreds of IAB TCF nodes (adition, samba.tv, tcf.adtech.app and others) in the recording are device-disclosure files (deviceStorage.json, disclosures.json) that the OneTrust panel requests when displaying the vendor list. Each such node receives the IP address and a referer pointing to getapro.ee, but no payload assembled from behaviour is transmitted to it in this capture; the profile transfer is recorded to Google.

Functional components are separated from tracking: Apple ID login (appleid.cdn-apple.com) is an SSO mechanism; Azure Application Insights telemetry (dc.services.visualstudio.com, az416426.vo.msecnd.net) is site performance monitoring; Google Maps on the order page is a location map. Resource delivery from getaprolv.blob.core.windows.net and getaproee.azureedge.net is first party on Azure infrastructure.

The file is published redacted of personal data: cookie values in requests have been removed. Response bodies and markup are preserved, so the insertion of the advertising scripts, the load order and the request parameters are verified directly against the published file. Service identification relies on domains and URL schemes: Google — by google-analytics.com, googletagmanager.com, googleadservices.com, googlesyndication.com with counter and ad-account numbers; Microsoft — by visualstudio.com and msecnd.net.

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

Conclusion

The tradesman-finding marketplace keeps the OneTrust consent platform and Google Consent Mode with storage denied by default, and Google analytics does honour that denial — the pings are cookieless. But the advertising part bypasses that frame: the Google Ads conversion tracking script and the Google Tag Manager container are inserted straight into the page markup and load before the consent mechanism appears, and the AdSense requests transmit a page_view event and the page URL to Google’s ad accounts — even though consent was never given across the session and the browser sent DNT: 1.

Added to this is the weakness of the security headers: on a platform where tradesmen leave their personal ID code and payment details, the site sets neither HSTS, nor Content-Security-Policy, nor referrer-policy. At the same time the privacy policy itself is more honest than a number of sister platforms — it discloses the advertising and third-party cookies and the IAB vendor list — but its statement that technical data is ’not used for personalisation’ diverges from the advertising stack of targeted advertising that is actually running.

Remediation: condition the loading and firing of the advertising scripts (Google Ads conversion, Google Tag Manager, AdSense) on actual consent, so that before the user’s choice they neither load from the markup nor transmit page_view to the ad accounts; set the basic set of protective headers (HSTS, Content-Security-Policy, Referrer-Policy, Permissions-Policy, X-Content-Type-Options), especially given the collection of the personal ID code and payment details; and reconcile the wording that technical data is ’not used for personalisation’ with the actual advertising stack, or qualify it.

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