Privacy Has a Postcode: Testing VPN Website Cookie Choices Across 3 Locations

Privacy Has a Postcode: different website cookie-choice paths in Germany, California and Kenya
39Measured attempts
32Complete visits
2Same-day passes
1Calendar day

The same VPN website offered a direct decline-all button in Germany, a settings-panel route in California, and no consent controls in our Kenyan homepage observation. Fresh-session refusal tests also showed why a saved “off” setting, a cookie jar, and network silence are three different things.

This one-day study covers five sampled websites, with usable fresh-session homepage observations for four. It reports what our browser observed, without ranking VPN services or drawing legal conclusions.

The question behind the test

A VPN company’s homepage is often the first place a prospective customer encounters its approach to privacy. Before downloading an app or opening an account, visitors may already be asked to accept cookies, open a settings panel, or acknowledge a notice.

We wanted to examine a concrete question: does the same VPN website offer the same cookie choices when the visitor’s connection appears to come from Germany, California, or Kenya—and what can we observe after choosing refusal?

This is a study of public marketing websites. It does not test VPN traffic logging, encryption, app security, or what a provider does inside a customer account. For the separate question of what a VPN records, see our guide to VPN logging policies.

Why we ran a second round

Our first pass covered five websites across three connections, with roughly ten seconds of observation per page. It used a browser that retained earlier visits. On Surfshark, Germany produced “Accept all,” “Decline all,” and “Cookie preferences,” while California produced “OK, understood” and “Privacy controls.” A second comparison, performed in the reverse location order, reproduced those two interfaces.

That was an interesting lead, but retained browser state could affect both notices and stored cookies. We therefore added a separate round with isolated browser contexts, longer observation windows, explicit choices where available, and a reload after refusal. The two rounds remain separate datasets.

The first notice offered different routes to refusal

Fresh sessions reproduced the Germany–California difference on Surfshark. In Germany, “Decline all” appeared on the initial notice alongside “Accept all.” In California, the initial notice instead offered “OK, understood” and “Privacy controls.” Opening Privacy controls revealed an explicit decline-all choice.

That is a concrete difference in the path a visitor must take: one click from the German notice, two from the California notice in our measured visits. It does not mean California lacked a refusal option.

On the native Kenyan connection, the fresh Surfshark homepage observation exposed neither the consent notice nor a settings button. Its saved rendered text included a Cookie policy link, but no corresponding privacy-controls text. We therefore recorded refusal and acceptance as unavailable on that sampled homepage, rather than trying to manufacture a choice. This does not establish that controls are never available to Kenyan visitors.

ConnectionSurfshark controls observedRefusal tested?
Germany, via VPNAccept all; Decline all; Cookie preferencesYes, directly from the notice
California, via VPNOK, understood; Privacy controlsYes, through Privacy controls → Decline all
Kenya, native ISPNo consent notice or settings button observedUnavailable on the sampled homepage
Surfshark’s German notice in a fresh untouched session
Germany: the untouched notice still displayed an explicit “Decline all” button at the final checkpoint.
Surfshark’s Californian notice in a fresh untouched session
California: the untouched notice offered a Privacy controls button instead of a direct decline-all button.
Surfshark’s Kenyan homepage at the end of a fresh untouched observation
Kenya: the visible pop-up promoted an offer; it was not a cookie-consent notice. Absence of consent controls was also checked against the saved rendered text.

Refusal changed the settings, but did not silence all requests

On Surfshark, we selected the explicit “Decline all” button, observed for sixty seconds, and reloaded. In Germany, the notice stayed closed through the reload. Separate confirmations in Germany and California then reopened the panel after refusal and reload: both optional switches—Analytical and Marketing—showed off. An earlier extra German confirmation failed to locate the decline button within its bounded wait; that failure is retained and is not counted as a successful replication.

Surfshark’s Californian privacy panel with optional switches off after refusal and reload
This supplementary UI check confirms a saved refusal state. It is separate from the measured sixty-second network visit.

Network activity continued. The German refused visit recorded six POST requests to behaviour.surfshark.events/com.surfshark/engagement in its sixty-second comparison window. The California refused visit also recorded requests to that endpoint, as well as hosts including bat.bing.com and bzr.openai.com. We report those as observed destinations, without assigning every request a purpose.

The reload checks matter here. In both locations, the reloaded refused page again requested the engagement endpoint and paths including /fpomup/gs/ccm/collect on surfshark.com. The California reload did not reproduce every external host observed immediately after the original refusal. Those are different phases and should not be combined into a single claim about continued activity.

The evidence therefore supports a narrower finding than “refusal failed”: the interface saved an off state in the California confirmation, while storage and some browser-visible requests remained. We did not capture the query values or request bodies needed to establish the contents and consent semantics of those requests. Scripts loaded before the click can also contribute activity immediately afterward.

First pass: Surfshark sessions by choice

Cookie entries at the end of the sixty-second window. Each bar is a different session, not a deletion experiment on one cookie jar.

Germany

Untouched7
Decline all8
Accept all22

California

Untouched22
Decline all23
Accept all23
Both panels use a zero-to-twenty-five scale. Kenya has no refusal/acceptance bars because the sampled homepage exposed no consent controls. A retained cookie is not proof that its value was sent after refusal.

To separate a refusal interface from actual transmission, compare our privacy-request form investigation with the later VPN, NetShield and browser-blocker study. Their samples and collection windows differ from this pilot. For implementation guidance, see cookie consent testing and implementation.

Cookies are a separate measurement

In the first pass, the German Surfshark visits ended their sixty-second windows with seven cookie entries untouched, eight after refusal, and twenty-two after explicit acceptance. California ended with twenty-two untouched and twenty-three after either explicit refusal or acceptance. Each condition used a separate fresh context, so these are observations from separate visits, not a before-and-after deletion experiment on one cookie jar.

Counts include cookies with the same name on different domains. They are not counts of trackers, and more cookies do not automatically mean a worse privacy outcome. In particular, remembering a refusal can itself require storage. Our browser cookies guide explains the storage categories behind these counts. The names and domains—not cookie values—are retained in the private evidence.

First pass: untouched homepage cookie entries

One completed fresh session per provider and connection. Endpoint: after the sixty-second comparison window.

GermanyCaliforniaKenya
Cookie entries after an untouched fresh visitGermany, California, Kenya respectively: Mullvad zero, zero, zero; IVPN two, two, two; Proton VPN four, four, four; Surfshark seven, twenty-two, twenty-three. NordVPN is excluded, not zero.0510152025000Mullvad222IVPN444Proton VPN72223Surfshark
Cookie entries are not tracker counts or privacy scores. NordVPN is omitted because all three fresh homepage attempts showed security challenges. Exact values also appear in the table below.
HomepageGermany: untouchedCalifornia: untouchedKenya: untouched
Mullvad000
IVPN222
Proton VPN444
Surfshark72223
NordVPNExcludedExcludedExcluded

First-pass cookie entries present at the end of each untouched sixty-second comparison window, following the initial checkpoint. NordVPN returned a security challenge in all three fresh-session groups; those pages are excluded, not treated as zero-cookie homepages.

Mullvad, IVPN and Proton did not expose consent controls in these homepage visits, so we did not run artificial acceptance/refusal conditions for them. IVPN’s entries had _pk_ names, consistent with its disclosed Matomo setup. Proton’s four entries included the same cookie name on two domains. These facts describe this page and window, not the complete tracking behavior of either provider.

The first pass contains twenty measured attempts: sixteen complete visits and four exclusions. The exclusions are NordVPN’s three challenges and one California Surfshark visit that was blank at the initial checkpoint while resources were still loading. A single retry with a bounded render wait succeeded; the failed attempt remains in the dataset. Exploratory and supplementary UI checks are outside that denominator.

Second pass: what a same-day repeat changed

The second pass contained 19 measured attempts and 16 complete visits. NordVPN again presented a security challenge in each connection group. Surfshark again offered a direct decline button in Germany, a Privacy controls route in California, and no consent controls in the sampled Kenyan homepage visit. Separate confirmations again showed Analytical and Marketing off after refusal and reload.

The cookie counts were not identical in every condition. California’s refused session ended with 11 entries rather than the first pass’s 23. Its pre-choice, final and post-reload counts were 10, 11 and 12; the corresponding first-pass counts were 11, 23 and 24. The untreated Kenyan Surfshark visit ended with 22 rather than 23. Its first-pass endpoint list included a test_cookie entry absent from the second-pass endpoint list.

California refusal: two observed endpoint counts

Same-day sessions, explicit Decline all, sixty-second comparison windows. Counts include retained and consent-related cookies.

First pass23
Second pass — same-day repeat11
A zero-to-twenty-five scale. These are two observations, not an average, confidence interval or privacy ranking. The experiment does not establish why the counts differed.
Surfshark cookie entries at the comparison endpoint, by separate fresh session.
ConnectionConditionFirst passSecond pass (same day)
Germanyuntouched77
Germanyrefused88
Germanyaccepted2222
Californiauntouched2222
Californiarefused2311
Californiaaccepted2323
Untouched endpoint counts: eleven of twelve usable pairs matched. NordVPN is excluded in both passes.
ConnectionHomepageFirst passSecond pass (same day)
GermanyMullvad00
GermanyIVPN22
GermanyProton VPN44
GermanySurfshark77
GermanyNordVPNExcludedExcluded
CaliforniaMullvad00
CaliforniaIVPN22
CaliforniaProton VPN44
CaliforniaSurfshark2222
CaliforniaNordVPNExcludedExcluded
KenyaMullvad00
KenyaIVPN22
KenyaProton VPN44
KenyaSurfshark2322
KenyaNordVPNExcludedExcluded

The second California refused visit recorded fourteen request starts in its comparison phase: seven to behaviour.surfshark.events, four to www.google.com, one to googleads.g.doubleclick.net, and two to surfshark.com. The German refused visit again recorded six POST requests to the engagement endpoint. Destinations and timing do not establish request contents or consent semantics.

Matching cookie counts also hid early loading differences on other homepages. Mullvad made additional connection-check requests without setting cookies, while IVPN and Proton reached their earlier endpoint counts after different initial checkpoints. These findings support reporting individual visits, not treating a single count as a provider-wide rule.

The second pass used the same browser and routing setup, with the bounded extra render wait applied consistently. That wait was introduced during the first pass after its blank California page. Both passes retained the fixed connection order and shared infrastructure, so they do not isolate a geographic cause or establish consistency across days.

View reviewed second-pass screenshots
Germany: initial fresh-session checkpoint with a direct decline-all button.
Germany: initial fresh-session checkpoint with a direct decline-all button. These observations were collected on the same date as the first pass.
California: initial fresh-session checkpoint offering Privacy controls.
California: initial fresh-session checkpoint offering Privacy controls. These observations were collected on the same date as the first pass.
Kenya: final untouched checkpoint. The visible offer popup is not a consent notice.
Kenya: final untouched checkpoint. The visible offer popup is not a consent notice. These observations were collected on the same date as the first pass.
Supplementary second-pass California confirmation: Analytical and Marketing switches off after refusal and reload
Additional UI-only confirmation after the measured collection. The view was enlarged to 1280×1200 to show the full panel; this does not change the measured 1280×800 visits or the nineteen-attempt denominator.

Read the second-pass research report, download its dataset, or inspect the comparison data. All 293 original evidence files were checked against their saved checksums; none were overwritten.

Every second-pass attempt — same-day repeat

This ledger preserves all 19 attempts in this pass. The first pass includes the unsuccessful California Surfshark visit and its successful retry. “Unavailable” means there is no completed comparison window for that attempt. Request counts describe page activity, including ordinary assets; they are not tracker counts. Reload traffic is a separate phase.

Fresh-session extension, October 13, 2026. Cookie counts include duplicate names on different domains.
Connection / providerConditionResultWindow (s)Cookies before / afterRequests initial / comparisonReload cookies / requests
Germany
IVPN
untouchedComplete60.0440 / 225 / 2Not applicable
Germany
Mullvad
untouchedComplete60.0530 / 075 / 13Not applicable
Germany
NordVPN
untouchedChallengeUnavailable1 / —8 / —Not applicable
Germany
Proton VPN
untouchedComplete60.0482 / 461 / 129Not applicable
Germany
Surfshark
acceptedComplete60.0594 / 2241 / 54Not applicable
Germany
Surfshark
refusedComplete60.0405 / 856 / 79 / 57
Germany
Surfshark
untouchedComplete60.0645 / 747 / 12Not applicable
Kenya
IVPN
untouchedComplete60.0430 / 225 / 2Not applicable
Kenya
Mullvad
untouchedComplete60.0590 / 087 / 1Not applicable
Kenya
NordVPN
untouchedChallengeUnavailable1 / —18 / —Not applicable
Kenya
Proton VPN
untouchedComplete60.0544 / 4182 / 0Not applicable
Kenya
Surfshark
untouchedComplete60.05823 / 2289 / 6Not applicable
California
IVPN
untouchedComplete60.0342 / 227 / 0Not applicable
California
Mullvad
untouchedComplete60.0470 / 079 / 9Not applicable
California
NordVPN
untouchedChallengeUnavailable1 / —6 / —Not applicable
California
Proton VPN
untouchedComplete60.0613 / 4160 / 30Not applicable
California
Surfshark
acceptedComplete60.0556 / 2355 / 31Not applicable
California
Surfshark
refusedComplete60.06110 / 1166 / 1412 / 60
California
Surfshark
untouchedComplete60.0516 / 2248 / 40Not applicable

The initial interval includes navigation, rendering and any choice-panel interaction before the sixty-second comparison window. It is not a standardized sixty-second pre-consent interval. Exact timestamps, hosts, failures and response statuses are in the downloadable dataset.

Two same-day passes: measured attempt outcomes

Measured attempt outcomes across both passes32 complete visits, 6 security challenges and 1 incomplete page, out of 39 measured attempts on one calendar day.39measured attempts
32 Complete visits (82.1%)6 Security challenges (15.4%)1 Incomplete page (2.6%)
These percentages describe completion of this pilot’s attempts, not the proportion of VPN websites with any privacy behavior. The failed Surfshark attempt remains alongside its successful retry. Percentages are rounded. Exploratory and UI-confirmation visits are outside this denominator.

How we measured

The sample consists of the public homepages of Mullvad, IVPN, Proton VPN, NordVPN, and Surfshark. It is a deliberately small sample, not a representative survey of the VPN industry.

The setup record notes Proton’s malware-only NetShield default and no selected optional ad/tracker filtering; default protection differences remain a potential network confound. The two VPN-routed groups use a Proton VPN subscription supplied for this project. Proton VPN is also one of the sampled websites; the routing service and the website measurement are separate parts of the setup.

The extension uses local Google Chrome 155.0.8059.39 controlled through Playwright. Every measured visit starts in a new, non-persistent browser context with no imported cookies or site storage. We hold language at English, timezone at UTC, and viewport at 1280 × 800. We disable the HTTP cache for the measured page. The browser runs headless; automation and browser defaults can affect the experience a site serves.

We record an initial checkpoint at least ten seconds after navigation begins. For an untouched visit, we then observe for sixty seconds without making a consent choice. For refusal or acceptance, the sixty-second window follows the completed choice. A refused session also gets a reload and another observation of at least ten seconds. Navigation delays and actual timings are recorded, rather than assuming every page loads instantly. For your own routing checks, use our VPN testing checklist.

Each visit saves cookie metadata, local and session storage key names, visible interface controls, screenshots, and network request/response/failure metadata. We remove cookie values, URL queries, headers and request bodies from the saved network evidence. Our local validation page supplies a known redirect, a fetch request, two cookies and a storage entry; we also check that a second context starts without the first context’s state.

Where a complete untouched visit exposes no consent interface, we mark acceptance and refusal unavailable. We do not invent a refusal by dismissing a notice, and we do not treat a generic “OK” as an explicit accept-all choice. Security challenges are exclusions, not successful homepage observations.

A location label was not enough

The German and California groups use Proton VPN WireGuard connections. The Kenyan group uses the local ISP connection. These are different network types, which introduces a confound: a website may react to a VPN address or its reputation as well as its apparent location.

During the earlier pilot, Proton’s Nairobi-labelled Smart Routing endpoint produced conflicting country results. NordVPN’s IP checker reported Kenya; Surfshark’s reported France. We excluded that endpoint from the Kenyan comparison and used the native connection after both checkers reported Kenya.

For the extension, we check location again around each group. NordVPN’s checker was challenged in the separate browser. Germany and California used Surfshark plus IPinfo as usable checks. The Kenyan start check used Surfshark plus IPWHOIS after IPinfo supplied no country field. Failed and empty responses are unavailable, not agreement. Agreement between services increases confidence in the apparent location; it does not establish that their underlying databases are independent or that the endpoint is physically located there.

What the evidence can establish

The interface is directly observable: we can document the labels presented, the choices made, and what the settings show afterward. Cookies and requests provide another layer of evidence, but require more care.

An advertising-associated cookie name is a lead for investigation, not proof of what was transmitted in a particular request. A request to a tag manager does not identify every tag it might execute. First-party hosting does not make a request harmless, and a third-party request is not automatically advertising.

Likewise, a cookie that remains after refusal is not, by itself, proof that the site continues to use it. NordVPN’s cookie policy expressly distinguishes retained cookies from receiving information from them after a change of choice. We therefore report storage and observed network activity separately.

Nor does a request after refusal automatically establish that a consent choice was ignored. Google’s consent-mode documentation describes an advanced implementation that can send measurements without cookies when storage consent is denied. We have not established whether any particular observed request uses that implementation. Identifying its consent state and contents would require a separate, carefully scoped inspection; our evidence deliberately excludes request bodies and query values.

Provider disclosures also matter. IVPN describes self-hosted Matomo analytics, Proton describes its own analytics tools, Mullvad describes necessary website cookies, and Surfshark describes necessary, analytic, marketing and affiliate categories. Those statements help interpret observations; they do not substitute for measuring a particular visit. Website owners can compare this distinction with our cookie consent implementation guide.

Limits readers should keep in view

This is a one-day pilot with a single measurement setup and two same-day passes. Each pass has one complete visit per available condition; these are not independent calendar-day replications. Visits share connection infrastructure and browser software, even though their cookie and site-storage contexts are isolated. The fixed visit order leaves time and order effects unresolved.

We do not inspect account areas, complete purchases, test every page, send an automated privacy signal, or measure mobile browsers. Sixty seconds cannot establish what happens over days, across return visits, or inside a provider’s systems. Captured requests establish browser-visible activity within the observation window, not the complete server-side handling of the data.

The Germany–California comparison can show an association with the connection used. It cannot isolate geography from IP reputation, experiments, delivery infrastructure, or other site behavior. It also cannot establish that a law caused a particular design or that an observed implementation violates a law.

Every first-pass attempt

This ledger preserves all 20 attempts in this pass. The first pass includes the unsuccessful California Surfshark visit and its successful retry. “Unavailable” means there is no completed comparison window for that attempt. Request counts describe page activity, including ordinary assets; they are not tracker counts. Reload traffic is a separate phase.

Fresh-session extension, October 13, 2026. Cookie counts include duplicate names on different domains.
Connection / providerConditionResultWindow (s)Cookies before / afterRequests initial / comparisonReload cookies / requests
Germany
IVPN
untouchedComplete60.0432 / 227 / 0Not applicable
Germany
Mullvad
untouchedComplete60.0400 / 087 / 1Not applicable
Germany
NordVPN
untouchedChallengeUnavailable1 / —15 / —Not applicable
Germany
Proton VPN
untouchedComplete60.0714 / 4190 / 0Not applicable
Germany
Surfshark
acceptedComplete60.0415 / 2262 / 31Not applicable
Germany
Surfshark
refusedComplete60.0668 / 852 / 79 / 55
Germany
Surfshark
untouchedComplete60.0758 / 756 / 5Not applicable
Kenya
IVPN
untouchedComplete60.0402 / 227 / 0Not applicable
Kenya
Mullvad
untouchedComplete60.0430 / 087 / 1Not applicable
Kenya
NordVPN
untouchedChallengeUnavailable1 / —18 / —Not applicable
Kenya
Proton VPN
untouchedComplete60.0624 / 4182 / 0Not applicable
Kenya
Surfshark
untouchedComplete60.05724 / 2381 / 7Not applicable
California
IVPN
untouchedComplete60.0422 / 227 / 0Not applicable
California
Mullvad
untouchedComplete60.0540 / 087 / 1Not applicable
California
NordVPN
untouchedChallengeUnavailable1 / —16 / —Not applicable
California
Proton VPN
untouchedComplete60.0664 / 4161 / 0Not applicable
California
Surfshark
accepted (retry)Complete60.06811 / 2372 / 18Not applicable
California
Surfshark
refused (retry)Complete60.05911 / 2373 / 1524 / 53
California
Surfshark
untouched (retry)Complete60.06011 / 2276 / 16Not applicable
California
Surfshark
untouchedIncompleteUnavailable2 / —36 / —Not applicable

The initial interval includes navigation, rendering and any choice-panel interaction before the sixty-second comparison window. It is not a standardized sixty-second pre-consent interval. Exact timestamps, hosts, failures and response statuses are in the downloadable dataset.

Frequently asked questions

Did refusing cookies stop every request?

No. Some browser-visible requests continued in the German and California Surfshark refusal visits. Separate UI confirmations showed Analytical and Marketing off after refusal and reload. We did not inspect request bodies or query values, so continuing requests do not by themselves prove that the consent choice was ignored.

Does a cookie count measure how private a VPN is?

No. These counts describe public marketing homepages during short browser visits. They include necessary and consent-related storage and duplicate cookie names across domains. The experiment does not test VPN app traffic, logging, encryption or server-side data handling.

Why are NordVPN’s results excluded?

The fresh test browser received a security challenge in Germany, California and Kenya. We did not bypass the challenges. A challenge page is not a valid observation of the ordinary homepage, so it must not be plotted as a zero-cookie result.

Was refusal tested from Kenya?

The completed fresh Kenyan Surfshark homepage visit exposed no consent notice or settings button, so acceptance and refusal were unavailable there. We did not pretend to submit a choice. This single observation cannot establish that controls are never available to Kenyan visitors.

Can these differences be attributed to privacy laws?

This pilot does not establish a legal cause. It holds several browser settings constant, but location, VPN versus native routing, IP reputation, experiments and time can influence the experience. It also does not establish a legal violation.

Can I reuse the findings in my own research?

The reviewed summary dataset, protocol and collection scripts are linked below. Cite FreePolicyTools, the article title and the October 13, 2026 observation date, and retain the sample, timing and exclusion notes. Raw evidence remains separate from the public downloads.

Reproduction and supporting material

The accompanying summary dataset, extension protocol, collector, and summary generator describe and implement the measurements. The earlier pilot report preserves the original observations and exclusions. Screenshots in this article have been reviewed for disclosure; raw evidence remains private.

The next study should repeat the available conditions across days and additional networks, inspect consent signals and selected request contents with appropriate redaction, and test other browsers. That would help resolve the questions this pilot cannot: how consistent the interfaces are, what the remaining requests communicate, and whether the behavior changes beyond this short window.

Explore the evidence

Download the reviewed data and method. The full research archive lives with this project, with raw evidence excluded from public assets and Git.

Affiliate disclosure: This article contains Proton VPN affiliate links. FreePolicyTools may earn a commission if you purchase through them. These offers are separate from the research findings and do not constitute a comparative product test or change the study’s methods, results or limitations.