GDPR compliant website: forms, consent, cookies and privacy policy
Blog
Tutorials

GDPR compliant website: forms, consent, cookies and privacy policy

Legal bases for contact forms and newsletters, a cookie banner that complies with Poland's Electronic Communications Law, analytics, third-party scripts, data processing agreements and the typical mistakes on company websites and online stores

DualFroz - VulCode CEODualFroz - VulCode CEO·26 September 2026·23 min read

A GDPR compliant website comes down to a few questions you need to be able to answer in writing: what data you collect and why, on what legal basis, who you share it with, how long you keep it, and whether you have the visitor's consent before storing anything in their browser where the law requires it. A mandatory checkbox under a form and a banner with a single "I accept" button answer none of these questions.

Below we go through a company website and an online store element by element, with the provision the obligation comes from and how to implement it in code.

In short
  • A contact form usually does not need consent: the basis is responding to an enquiry (Article 6(1)(b) or (f) GDPR). It does, however, need the Article 13 GDPR information at the moment data is collected.
  • Marketing emails require prior consent under Article 398 of Poland's Electronic Communications Law. The consent box must not be pre-ticked or combined with accepting the terms of service.
  • Storing and reading information in the browser that is not necessary for the site to work requires consent before the script runs (Article 399 of the Electronic Communications Law). Refusing must be as easy as accepting.
  • Every provider that processes data on your behalf, from hosting to a contractor with database access, needs a data processing agreement under Article 28 GDPR.
  • The privacy policy has to describe the tools that actually run on the site. Every new script is a change to the policy.
i
Note

Legal status as of 26 September 2026. This article describes the regulations from the perspective of a company that builds websites and online stores, and it is not legal advice. The legal bases for processing and the content of the privacy policy are determined by the data controller, ideally with a lawyer or a data protection officer. The contractor's job is to make sure the site works exactly as the policy describes.

Which laws apply to a company website

The foundation is the GDPR, Regulation (EU) 2016/679, which has applied directly in all EU countries since 25 May 2018. In Poland, the Personal Data Protection Act of 10 May 2018 supplements it with, among other things, provisions on the supervisory authority, which is the President of UODO, Poland's Personal Data Protection Office.

The second law is the Electronic Communications Law (Prawo komunikacji elektronicznej, PKE) of 12 July 2024, in force since 10 November 2024. Three of its provisions matter for a website: Article 399 on storing information on a user's device, which covers cookies among other things, Article 398 on consent to commercial communications sent, for example, by email, and Article 400, which requires the data protection rules to be applied to those consents. The earlier ban in Article 10 of the Act on Providing Services by Electronic Means was repealed on the same day.

Who is responsible for what

AreaProvisionAuthority
Processing personal data from forms, accounts, orders and analyticsGDPR, Personal Data Protection ActPresident of UODO
Cookies and other storing or reading of information in the browserArticle 399 PKEPresident of UKE
Emails and text messages with commercial contentArticle 398 PKEPresident of UKE

For breaching Articles 398 and 399 PKE, the President of UKE, Poland's Office of Electronic Communications, can impose a fine of up to 3% of the previous year's revenue (Articles 444 and 446 PKE). Personal data collected through cookies and scripts is still subject to the GDPR, so a single mistake in a banner can concern both authorities.

Who is who: controller, processor, joint controller

The company that owns the website is the data controller: it decides why and how data is processed. The obligations described below come from that role, regardless of who built the site.

A processor is anyone who processes data on the controller's behalf: the hosting company, the email provider, the newsletter system, the CRM, the ticketing tool, and also the contractor who has access to the production database during maintenance or a migration. Each of them needs a data processing agreement under Article 28 GDPR.

The third role sometimes comes as a surprise. In its Fashion ID judgment of 29 July 2019 (C-40/17), the CJEU held that the operator of a website with an embedded Facebook "Like" button can be a joint controller together with Facebook for the collection and transmission of visitors' data. Every embedded element that sends data to an outside company therefore needs to be assessed.

A contact form without a mandatory checkbox

A common pattern is a form with an "I consent to the processing of my personal data" box that cannot be skipped. It looks safe, but it rests on the wrong legal basis.

A person asking about your services is asking for a reply. The basis for processing is then taking steps at their request before entering into a contract (Article 6(1)(b) GDPR), and for general correspondence the controller's legitimate interest (Article 6(1)(f)). Consent that is a condition of submitting the form can hardly be considered freely given (Article 7(4)), and on top of that it can be withdrawn at any time (Article 7(3)). A company that relied on consent should stop processing the data once it is withdrawn, even if it is in the middle of preparing a quote.

What the form does need is the Article 13 GDPR information at the moment the data is collected. The full list is long, so in practice there are two layers: a short notice right next to the submit button and a link to the privacy policy with the rest. An example first layer:

Example notice under a form

The data controller is [company name, address, email]. We process the data from this form to reply to your enquiry and prepare a quote (Article 6(1)(b) GDPR). Information on how long we keep the data, who receives it and your rights can be found in our [privacy policy].

The data minimisation principle (Article 5(1)(c)) also applies to forms. If you reply by email, the phone number does not need to be mandatory. If the quote does not depend on the company name, that field is unnecessary. Every field that is not there is data you do not have to protect, describe or delete.

A submission ends up in a mailbox, and sometimes in a CRM, server logs or a third-party form service. Each of these places should have a defined retention period (Article 5(1)(e)), and each run by an outside company needs a data processing agreement. Third-party spam protection that loads the provider's script and stores data in the browser also has to be assessed against Article 399 PKE and described in the policy. A hidden honeypot field and a server-side submission limit do not require sending data to anyone.

Sending commercial information by email or text message requires the recipient's prior consent (Article 398(1) PKE). Consent can be given by providing an email address for the purpose of receiving commercial information (Article 398(2)), which is what a typical newsletter sign-up is. Processing the address itself also needs a GDPR basis: consent or legitimate interest, because according to Recital 47 GDPR direct marketing may be regarded as carried out for a legitimate interest.

Consent must meet the GDPR conditions, which Article 400 PKE refers to. In practice this means several requirements for the form:

  • The box is not pre-ticked. Recital 32 GDPR states plainly that silence, pre-ticked boxes or inactivity do not constitute consent.
  • Separate from other declarations. The request for consent must be clearly distinguishable from other matters (Article 7(2)). A single "I accept the terms of service and want to receive the newsletter" box combines two different things.
  • No making the service conditional on it. An order in a store cannot require consent to marketing that is not needed to fulfil the order (Article 7(4)).
  • Withdrawing is as easy as giving. An unsubscribe link in every message, and that link actually working (Article 7(3)). A person who objects to direct marketing must no longer receive such messages (Article 21(3)).
  • Proof. The controller must be able to demonstrate that consent was given (Article 7(1)).

The last point is a job for the code. A consent log should record who consented, when, to what and with which version of the form, and when they withdrew consent:

consent_log.sql · sql
CREATE TABLE consent_log (
  id            bigserial   PRIMARY KEY,
  subject_email text        NOT NULL,
  purpose       text        NOT NULL,  -- for example 'newsletter'
  consent_text  text        NOT NULL,  -- text shown next to the consent box
  form_version  text        NOT NULL,  -- version of the form
  source        text        NOT NULL,  -- for example 'footer', 'cart'
  granted_at    timestamptz NOT NULL,
  withdrawn_at  timestamptz
);

Confirming a sign-up through a link sent to the address provided (double opt-in) is not required by law, but it makes it easier to show that the address was given by its owner.

Cookies and the consent banner under Article 399 PKE

Article 399 PKE allows information to be stored on a user's device, or accessed there, only if the user has first been clearly informed of the purpose and has given consent. The provision talks about information in general, so it covers not only cookies but also, for example, localStorage. Consent is not needed when storage is necessary to transmit a communication or to provide a service the user has requested (Article 399(3)).

Categories of browser storage

ExampleDoes it require consent
Logged-in user session, cart contents, form security tokenNo, if it serves the service the user is asking for
Visit statistics with an identifier in a cookieYes
Advertising pixel, remarketing, campaign conversion trackingYes
Embedded video or map that sets its own cookiesYes; loading only after a click moves that moment, but does not remove the need for an assessment
Chat that stores a visitor identifier from the moment they arriveDepends on the configuration and the purpose of the storage

How a banner should look is shown in documents from the European data protection authorities. EDPB Guidelines 05/2020 on consent state that scrolling a page is not consent, and that making access to content conditional on accepting cookies (a so-called cookie wall) means consent is not freely given. The report of the EDPB cookie banner taskforce from January 2023 discusses practices raised in complaints: no reject option on the layer with the accept button, pre-ticked boxes, highlighting the accept button with colour and contrast, cookies wrongly labelled as "essential" and no easy way to withdraw consent. The vast majority of authorities considered the lack of a reject option a breach, and colours and contrast are to be assessed on whether they mislead.

In the Planet49 judgment of 1 October 2019 (C-673/17), the CJEU ruled that a pre-ticked box does not constitute consent to cookies, and that users should know how long cookies will remain active and whether third parties have access to them.

The most important part is what you cannot see in the banner: scripts that require consent must not run before the user decides. A banner sitting on top of analytics that is already running is decoration. In code, this means such scripts are added to the page only after consent:

consent.js · javascript
const CONSENT_KEY = 'consent-v1';

function loadScript(src) {
  const script = document.createElement('script');
  script.src = src;
  script.async = true;
  document.head.appendChild(script);
}

function applyConsent(consent) {
  if (consent.analytics) loadScript('/js/analytics.js');
  if (consent.marketing) loadScript('https://ads.example/pixel.js');
}

function saveConsent(consent) {
  const record = { ...consent, savedAt: new Date().toISOString() };
  localStorage.setItem(CONSENT_KEY, JSON.stringify(record));
  applyConsent(record);
}

const saved = JSON.parse(localStorage.getItem(CONSENT_KEY) || 'null');
if (saved) {
  applyConsent(saved);
} else {
  showBanner({
    onAcceptAll: () => saveConsent({ analytics: true, marketing: true }),
    onRejectAll: () => saveConsent({ analytics: false, marketing: false }),
    onSave: (choice) => saveConsent(choice),
  });
}

showBanner is the banner component with three equally weighted actions: accept, reject and choose categories. The version in the key lets you ask again after the list of tools changes. You also need a permanent "Cookie settings" link in the footer, because withdrawing consent must be as easy as giving it. With an off-the-shelf consent management platform, check in the developer tools that no non-essential cookies are set and no requests go out to analytics providers before the click.

The banner is also an interface element like any other. If it slides in above the content, it shifts the page layout and hurts the CLS metric, as we describe in Core Web Vitals in practice. If it sticks to the bottom of the screen, it must not hide the element with keyboard focus, and its buttons must work without a mouse, which is a WCAG 2.2 requirement covered in our article on digital accessibility for websites and online stores.

Cookie-based analytics requires consent under Article 399 PKE, whoever the provider is.

Google offers Consent Mode in two variants, described in Google's documentation. In the basic variant, Google tags are blocked until the user makes a choice in the banner and send no data before that. In the advanced variant, tags load immediately with a "denied" setting and, until consent is given, send cookieless pings to Google that are used to model the missing data. The advanced variant is worth discussing with whoever is responsible for data protection, because data reaches the provider before the user decides.

The second issue is transferring data to the US. Under Commission Implementing Decision (EU) 2023/1795 of 10 July 2023, data can go to US companies that have joined the EU-US Data Privacy Framework programme. On 3 September 2025 the General Court dismissed an action against that decision (T-553/23, Latombe v Commission), and on 31 October 2025 the applicant lodged an appeal with the Court of Justice (C-703/25 P). At the time of publication the decision is in force. You can check whether a given provider is certified on the list of programme participants.

The alternative is analytics running on your own server in the EU, or analysing server logs. That solves the transfer problem but does not take you out of the GDPR: in the Breyer case (C-582/14), the CJEU held that a dynamic IP address can be personal data for a website operator. A cookieless tool still processes personal data, so it needs a basis under Article 6 GDPR and a description in the privacy policy. Whether it also needs consent under Article 399 PKE depends on how it works technically. In its Guidelines 2/2023 of October 2024, the EDPB takes the view that the EU provision that Article 399 PKE implements in Poland can also cover tracking through pixels, through URLs and based on the IP address alone. So it is best to leave the assessment of a specific tool to a lawyer.

Third-party elements: fonts, maps, video, chat and pixels

Every element loaded from someone else's server, whether a font, a map, a video player, a chat widget, a reviews script or an advertising pixel, sends at least the visitor's IP address to its provider when the page loads. Some of them also set cookies. Sometimes even the site owner who pasted the code from the provider's panel does not know this.

The technical solutions are simple and make the site faster as a side effect:

  • Fonts hosted on your own domain instead of being downloaded from an external server on every visit.
  • Video and maps as a facade: a static image from your own server with a button that loads the player or map only after a click.
  • Chat loaded on demand, after clicking the icon, not on every page visit.
  • Advertising pixels only after consent to the marketing category, never hard-coded into the page template.

Before launch, open the site in a private window, switch on the network tab in the developer tools and write down the domains the page sends requests to before any interaction. That list is the starting point for the privacy policy and the agreements with providers.

A privacy policy that describes your website

The privacy policy fulfils the Article 13 GDPR information obligation for every place where the site collects data, in a concise and intelligible form, using clear and plain language (Article 12(1)). The obligation does not depend on the size of the company.

What a privacy policy must contain

Element from Article 13 GDPRWhat it looks like on the website
Controller and contact details, and the data protection officer if there is oneFull company name, address, email for personal data matters
Purposes and legal basesSeparately for the form, accounts, orders, newsletter, analytics, marketing
Legitimate interestsWhich ones, if the basis is Article 6(1)(f)
Recipients of the dataHosting, email, newsletter system, payment gateway, courier company, accounting
Transfers outside the EEATo which country and on what basis, for example a Commission decision
Retention periodA specific period, or the criteria for determining it, for each purpose
Data subject rightsAccess, rectification, erasure, restriction, portability, objection, withdrawal of consent, complaint to the President of UODO
Whether providing data is voluntaryWhich fields are required and what happens if you do not fill them in
ProfilingWhether it is used and with what effect

It happens that a template policy describes tools the site does not have and leaves out the ones it does. It is better to build it from the list of actual scripts and providers from the previous step, with a section on cookies (tool, category, purpose, duration) and the date of the last change. A new pixel, chat or newsletter system is a change to the policy, not just to the code.

Data processing agreements: a list of providers to check

Article 28 GDPR allows you to use only processors that provide sufficient guarantees, and requires a contract setting out the subject matter, duration, nature and purpose of the processing, the type of data and the categories of data subjects. Among other things, the contract obliges the provider to act only on the controller's documented instructions, to ensure its staff keep the data confidential, to apply the security measures under Article 32, to help handle data subject requests and breaches, to delete or return the data when the cooperation ends, and to allow audits.

A typical list for a company website and an online store:

1
Hosting and server

stores the database, files and logs.

2
Email

stores form submissions and correspondence.

3
Newsletter and marketing automation

the address list, the history of opens and clicks.

4
CRM and ticketing

customer data and contact history.

5
Analytics, chat, session recording tools

depending on the configuration, a processor or a separate controller, which you need to check in the provider's terms.

6
Backups in an external service

a database backup is the same personal data.

7
The website contractor

if it has access to the production database during maintenance, a migration or bug fixing.

Large providers often make the data processing agreement available as part of their terms or for acceptance in the panel. Keep a copy and check the list of sub-processors, because under Article 28(2) the provider may only use them with the controller's authorisation. We wrote about what to check in a contract with a software contractor in How to choose a software house.

Security, breaches and user rights

Article 32 GDPR requires security appropriate to the risk and lists, among other things, encryption, the ability to ensure the confidentiality, integrity, availability and resilience of systems, the ability to restore data quickly after an incident, and regular testing of security measures. On a website this means, among other things, HTTPS, up-to-date dependencies, separate panel accounts with permissions matched to the role, two-factor login for administrators and backups with tested restores. We described how to organise this after launch in our article on monitoring and maintenance after launch.

If a personal data breach occurs, for example a leak of a store's customer database, the controller reports it to the President of UODO without undue delay and, where feasible, within 72 hours of becoming aware of it, unless the breach is unlikely to result in a risk to people (Article 33). Where the risk is high, the data subjects must also be notified (Article 34). A processor, for example the hosting provider, reports the breach to the controller without undue delay. It is worth having a procedure with contacts ready in advance, because the 72 hours also run over the weekend.

The people whose data you process have the right of access, rectification, erasure, restriction of processing, data portability and objection. A request must be answered within one month, which can be extended by two months in complex cases (Article 12(3)). In a store or a panel with user accounts, it is worth having this in the code: exporting a customer's data, and deleting or anonymising an account while keeping the documents that must be retained under other laws. Manually searching for a customer across several tables easily ends with some of the data being missed.

Article 30 GDPR requires a record of processing activities. Companies with fewer than 250 employees are exempt, but only if the processing is occasional, does not pose a risk and does not include special categories of data. A form and a store operate every day, so they can hardly be considered occasional processing. In 2026 the EU institutions were working on extending this exemption to larger companies, so check the current wording of Article 30(5) before you assess it. Even when it is not mandatory, a record is the simplest way to know what the site does with data.

Typical mistakes on company websites and online stores

Mistakes and fixes

MistakeWhy it is a problemFix
Mandatory consent under a contact formThe consent is not freely given, and the basis is responding to the enquiry anywayRemove the box, add the Article 13 information
Marketing consent pre-tickedRecital 32 GDPR and the Planet49 judgmentAn empty box the user ticks
Analytics running before the choice in the bannerArticle 399 PKE requires consent before storageLoad scripts only after consent
Banner with no reject buttonRefusing must be as accessible as acceptingA "Reject" button next to "Accept"
No way to change the decisionArticle 7(3) GDPRA "Cookie settings" link in the footer
Template policy that does not match the siteThe Article 13 information is untrueA policy built from the list of actual tools
No agreement with the hosting provider or newsletter systemArticle 28 GDPRA list of providers and accepted agreements
Form submissions kept in the mailbox foreverThe storage limitation principleA defined period and regular deletion
Fonts, maps and video from external servers with no informationThe IP address reaches the provider when the page loadsLocal hosting or loading on click

Fines and liability

The President of UODO can impose an administrative fine of up to EUR 10 million or 2% of total worldwide annual turnover for breaching the obligations of the controller and the processor, and up to EUR 20 million or 4% of turnover for breaching the basic principles of processing, including the conditions for consent, and data subjects' rights. In both cases, whichever amount is higher applies (Article 83 GDPR). Separately from fines, anyone who has suffered material or non-material damage as a result of a breach can claim compensation from the controller or the processor (Article 82). For breaches of Articles 398 and 399 PKE, the President of UKE imposes a fine of up to 3% of revenue.

What may change

On 19 November 2025 the European Commission presented a package of changes to digital legislation (the so-called Digital Omnibus). Among other things, it includes changes to the GDPR and to the rules on cookies intended to reduce the number of banners, allow consent to be given with a single click and allow preferences to be saved in browser settings. At the time of publication this is a proposal going through the legislative procedure of the European Parliament and the Council, so the rules described above apply.

Frequently asked questions

Does a contact form require consent to data processing?

Usually not. When someone asks about your services, the basis is taking steps at their request before entering into a contract (Article 6(1)(b) GDPR), and for general correspondence it is legitimate interest. The form does need the Article 13 GDPR information, ideally a short version next to the submit button and the full version in the privacy policy.

Does a site without Google Analytics need a cookie banner?

If the site stores in the browser only information necessary for the service the user is asking for, for example a login session or a cart, consent under Article 399 PKE is not required. Do check, though, whether embedded maps, videos, chat or spam protection set cookies.

Is a banner with an "I accept" button enough?

No. Consent must be freely given, so the user should be able to refuse as easily as they can agree. According to the 2023 EDPB report, the vast majority of European data protection authorities considered a banner that offers no reject option on any layer with an accept button to be a breach. Scripts that require consent must also not run before the user decides.

Can Google Analytics be used in line with the GDPR?

At the time of publication, yes, provided there is cookie consent before the script runs, a description in the privacy policy, and the transfer to the US is based on the Commission decision on the Data Privacy Framework. The judgment upholding that decision has been appealed to the Court of Justice of the EU.

Who is responsible for GDPR on a website built by a contractor?

The company that owns the website, as the data controller. The contractor is responsible for making the site work according to what was agreed in the contract, and if it has access to personal data, it is a processor and needs a data processing agreement.

A GDPR compliant website starts in the project scope

GDPR compliance is easiest when the data requirements are part of the project scope: the list of scripts and providers, blocking them until consent, retention periods, and functions for exporting and deleting data in the panel. The content of the policy and the legal bases are determined by the data controller with a lawyer. The contractor's job is to make the code do exactly what the policy promises.

If you are planning a website or an online store and want to go through these points before the quote, get in touch through the contact form. You will find the types of projects we deliver on the offer page, and how we work on the process page. After handover you get full rights to the code and documentation.