Įvadas
CookiePilot – tai slapukų sutikimų valdymo platforma (CMP), atitinkanti BDAR (Bendrasis duomenų apsaugos reglamentas), Lietuvos Elektroninių ryšių įstatymą bei Google Consent Mode v2. Šių reikalavimų laikymąsi Lietuvoje prižiūri Valstybinė duomenų apsaugos inspekcija (VDAI).
Kam skirta
- Svetainių savininkams: įdiegimas be programavimo.
- Programuotojams: API, įvykiai, integracijos su GTM.
- Agentūroms: white-label sprendimas, kelių domenų valdymas.
Greitas startas
1 žingsnis: registracija
- Susikurkite paskyrą app.cookiepilot.io/register.
- Pridėkite domeną valdymo skydelyje ir nukopijuokite API raktą (formatas
cp_live_...).
2 žingsnis: kodo įdiegimas
Tiesioginis įdiegimas – tai du skriptai <head> sekcijoje, būtent šia tvarka.
2a žingsnis: numatytieji sutikimai (inline stub). Įklijuokite jį pirmąjį, prieš bet kurį kitą skriptą (cookiepilot.js, GA, GTM, reklamos ir sekimo žymas):
<script>"use strict";(function(){window.dataLayer=window.dataLayer||[];var d={ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied",functionality_storage:"denied",personalization_storage:"denied",security_storage:"granted",wait_for_update:500},h=false;try{for(var i=0;i<window.dataLayer.length;i++){var x=window.dataLayer[i];if(x&&x[0]==="consent"&&x[1]==="default"){h=true;break}}}catch(err){}if(!h&&window.dataLayer.length)window.dataLayer.unshift(["consent","default",d]);window.gtag=function(){window.dataLayer.push(arguments)};if(!h)window.gtag("consent","default",d);var a=document.cookie.match(/(^|)cookiepilot_consent=([^;]+)/);if(a){try{var e=JSON.parse(decodeURIComponent(a[2]));window.gtag("consent","update",{analytics_storage:e.analytics?"granted":"denied",ad_storage:e.marketing?"granted":"denied",ad_user_data:e.marketing?"granted":"denied",ad_personalization:e.marketing?"granted":"denied",functionality_storage:e.preferences?"granted":"denied",personalization_storage:e.preferences?"granted":"denied",security_storage:"granted"})}catch(err){}}})();</script>
Šis inline kodo fragmentas iškart nustato visas kategorijas į denied (su wait_for_update: 500), tad numatytoji Google Consent Mode v2 būsena būna paruošta dar prieš tai, kai užkraunama bet kas kita. Grįžtančiam lankytojui jis iškart perskaito išsaugotą sutikimą iš slapuko ir paleidžia consent update.
2b žingsnis: banerio skriptas. Pridėkite jį iškart po inline stub:
<!-- CookiePilot -->
<script async src="https://cdn.cookiepilot.io/cookiepilot.js" data-cpkey="TWOJ_KLUCZ"></script>
3 žingsnis: banerio konfigūracija
Valdymo skydelyje: Domenas → Konfigūracija → Išvaizda:
- banerio padėtis (viršuje, apačioje, modalas),
- spalvos ir tekstai,
- plaukiojantis mygtukas „Slapukų nustatymai“ grįžtantiems lankytojams.
Integracija su Google Tag Manager
Per GTM CookiePilot įdiegiate viena Custom HTML žyma, kuri iškart nustato numatytuosius sutikimus ir užkrauna banerį ankstyviausioje GTM fazėje. Atskiro stub failo ar antros žymos nereikia.
Žyma: CookiePilot - Consent Init + Banner
GTM sukurkite Custom HTML žymą (Žymos → Naujas → Tinkintas HTML kodas) ir įklijuokite:
<script>"use strict";
(function() {
window.dataLayer=window.dataLayer||[];var d={ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied",functionality_storage:"denied",personalization_storage:"denied",security_storage:"granted",wait_for_update:500},h=false;try{for(var i=0;i<window.dataLayer.length;i++){var x=window.dataLayer[i];if(x&&x[0]==="consent"&&x[1]==="default"){h=true;break}}}catch(err){}if(!h&&window.dataLayer.length)window.dataLayer.unshift(["consent","default",d]);window.gtag=function(){window.dataLayer.push(arguments)};if(!h)window.gtag("consent","default",d);var a=document.cookie.match(/(^|)cookiepilot_consent=([^;]+)/);if(a){try{var e=JSON.parse(decodeURIComponent(a[2]));window.gtag("consent","update",{analytics_storage:e.analytics?"granted":"denied",ad_storage:e.marketing?"granted":"denied",ad_user_data:e.marketing?"granted":"denied",ad_personalization:e.marketing?"granted":"denied",functionality_storage:e.preferences?"granted":"denied",personalization_storage:e.preferences?"granted":"denied",security_storage:"granted"})}catch(err){}}
var s = document.createElement('script');
s.src = 'https://cdn.cookiepilot.io/cookiepilot.js?cpkey=' + encodeURIComponent('TWOJ_KLUCZ');
document.head.appendChild(s);
})();
</script>
Trigeris: Consent Initialization - All Pages. Žyma turi suveikti vieną kartą per puslapį. Google žymos (GA4, Google Ads), Facebook Pixel ir kitos rinkodaros žymos Consent Initialization trigerio NENAUDOJA – jos suveikia vėliau (Consent Checks arba nuo sutikimo priklausantis trigeris). Išsaugokite žymą ir paskelbkite GTM konteinerį.
Tvarka ir trigeriai
| Tvarka | Žyma | Trigeris |
|---|---|---|
| 1 | CookiePilot - Consent Init + Banner | Consent Initialization - All Pages |
| 2 | GA4, Google Ads, UET | All Pages (Consent Mode pats apdoros sutikimus) |
| 3 | Facebook Pixel, TikTok, LinkedIn ir kt. | Custom Event cookiepilot_consent_update + sutikimo sąlyga (žr. žemiau) |
Žymos ne iš Google (Facebook Pixel, TikTok, LinkedIn)
Google Consent Mode apdoroja tik Google žymas. Kitiems skriptams valdiklis prie kiekvieno sutikimo pakeitimo perduoda į dataLayer įvykį:
dataLayer.push({
event: 'cookiepilot_consent_update',
cookiepilot_consent: {
necessary: true,
analytics: true,
marketing: true,
preferences: false
}
});
Įvykis siunčiamas ir kiekvieną kartą grįžtančiam lankytojui apsilankius (kai valdiklis perskaito slapuką su sutikimu), tad GTM trigeris suveiks kiekvieno apsilankymo metu, ne tik priimant pirmąjį sprendimą.
Bendras šablonas (atlikite vieną kartą)
Šiuos tris elementus sukonfigūruojate vieną kartą, paskui naudojate visoms ne Google žymoms.
- Trigeris (Triggers → New → Custom Event): įvykio pavadinimas
cookiepilot_consent_update. Be sąlygų, be „Once per page“ (žyma turi galėti suveikti dar kartą pakeitus sprendimą). - Data Layer Variable kiekvienai naudojamai kategorijai:
- Name
cookiepilot_consent.marketing→ kintamasis, pvz.dlv.cp_marketing - Name
cookiepilot_consent.analytics→ kintamasis, pvz.dlv.cp_analytics - Name
cookiepilot_consent.preferences→ kintamasis, pvz.dlv.cp_preferences
- Name
- Trigger Group arba sąlyga trigeryje:
dlv.cp_marketing equals true(rinkodaros žymoms) arba atitinkamas laukas.
Kiekviename žemiau pateiktame pavyzdyje Trigger yra tas pats Custom Event su pridėta sąlyga atitinkamam kintamajam.
Facebook Pixel
Žyma GTM: Tags → New → Custom HTML.
<script>
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
document,'script','https://connect.facebook.net/en_US/fbevents.js');
fbq('init', 'YOUR_PIXEL_ID');
fbq('track', 'PageView');
</script>
- Trigeris:
cookiepilot_consent_update+ sąlygadlv.cp_marketing equals true. - Tag firing options: Once per page.
Pasirinktinai, kad būtų visiškai laikomasi Facebook Limited Data Use, pridėkite antrą žymą, kuri iškviečia fbq('consent','revoke') su trigeriu dlv.cp_marketing equals false.
TikTok Pixel
Žyma GTM: Tags → New → Custom HTML.
<script>
!function (w, d, t) {
w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie","holdConsent","revokeConsent","grantConsent"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var r="https://analytics.tiktok.com/i18n/pixel/events.js",o=n&&n.partner;ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=r,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};n=document.createElement("script");n.type="text/javascript",n.async=!0,n.src=r+"?sdkid="+e+"&lib="+t;e=document.getElementsByTagName("script")[0];e.parentNode.insertBefore(n,e)};
ttq.load('YOUR_TIKTOK_PIXEL_ID');
ttq.grantConsent();
ttq.page();
}(window, document, 'ttq');
</script>
- Trigeris:
cookiepilot_consent_update+ sąlygadlv.cp_marketing equals true. - Tag firing options: Once per page.
ttq.grantConsent() – tai naujasis TikTok API (nuo 2024 m.). Be jo TikTok gauna maišos (hash) duomenis be sutikimo, o tai pažeidžia naudojimo sąlygas.
LinkedIn Insight Tag
<script type="text/javascript">
_linkedin_partner_id = "YOUR_LINKEDIN_PARTNER_ID";
window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
window._linkedin_data_partner_ids.push(_linkedin_partner_id);
</script>
<script type="text/javascript">
(function(l) {
if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
window.lintrk.q=[]}
var s = document.getElementsByTagName("script")[0];
var b = document.createElement("script");
b.type = "text/javascript";b.async = true;
b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
s.parentNode.insertBefore(b, s);})(window.lintrk);
</script>
- Trigeris:
cookiepilot_consent_update+ sąlygadlv.cp_marketing equals true. - Tag firing options: Once per page.
Hotjar
<script>
(function(h,o,t,j,a,r){
h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
h._hjSettings={hjid:YOUR_HOTJAR_ID,hjsv:6};
a=o.getElementsByTagName('head')[0];
r=o.createElement('script');r.async=1;
r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
a.appendChild(r);
})(window,document,'https://static.hotjar.com/c/hotjar-',".js?sv=");
</script>
- Trigeris:
cookiepilot_consent_update+ sąlygadlv.cp_analytics equals true. - Tag firing options: Once per page.
Hotjar priskiriamas analytics, ne marketing (jis matuoja elgseną, o ne reklamą). Pasitikrinkite savo slapukų politiką – kai kurios įmonės Hotjar klasifikuoja kitaip.
Microsoft Clarity
<script type="text/javascript">
(function(c,l,a,r,i,t,y){
c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
})(window, document, "clarity", "script", "YOUR_CLARITY_PROJECT_ID");
</script>
- Trigeris:
cookiepilot_consent_update+ sąlygadlv.cp_analytics equals true. - Tag firing options: Once per page.
Pinterest Tag
<script>
!function(e){if(!window.pintrk){window.pintrk = function () {
window.pintrk.queue.push(Array.prototype.slice.call(arguments))};var
n=window.pintrk;n.queue=[],n.version="3.0";var
t=document.createElement("script");t.async=!0,t.src=e;var
r=document.getElementsByTagName("script")[0];
r.parentNode.insertBefore(t,r)}}("https://s.pinimg.com/ct/core.js");
pintrk('load', 'YOUR_PINTEREST_TAG_ID');
pintrk('page');
</script>
- Trigeris:
cookiepilot_consent_update+ sąlygadlv.cp_marketing equals true. - Tag firing options: Once per page.
Microsoft Ads (UET)
UET palaiko Google Consent Mode nuo 2023 m. pabaigos, tad Custom Event trigerio nereikia. Įdėkite žymą įprastai (All Pages, Once per page), o UET pats nuskaitys ad_storage iš GCM, kurią nustato valdiklis.
Kategorijų atvaizdavimas (santrauka)
| Žyma | Kategorija | Laukas cookiepilot_consent |
|---|---|---|
| Facebook Pixel | marketing | marketing |
| TikTok Pixel | marketing | marketing |
| LinkedIn Insight | marketing | marketing |
| marketing | marketing | |
| Hotjar | analytics | analytics |
| Microsoft Clarity | analytics | analytics |
| Mixpanel, Amplitude | analytics | analytics |
| Intercom, Drift, Crisp | preferences | preferences |
| GA4, Google Ads, UET | (GCM, be trigerio) | apdorojama per gtag('consent','update') |
API nuoroda
CookiePilot pateikia objektą window.CookiePilot:
| Metodas | Aprašymas |
|---|---|
CookiePilot.getConsent() | Dabartinė sutikimų būsena arba null, jei sprendimo nėra. |
CookiePilot.acceptAll() | Sutikimas visoms kategorijoms. |
CookiePilot.rejectAll() | Atmeta viską, išskyrus necessary. |
CookiePilot.updateConsent(partial) | Atnaujina pasirinktas kategorijas, pvz. { analytics: true }. |
CookiePilot.showSettings() | Atidaro nustatymų modalą. |
CookiePilot.hideSettings() | Uždaro nustatymų modalą. |
CookiePilot.showMyConsent() / hideMyConsent() | Rodo / paslepia plaukiojantį mygtuką. |
Pavyzdys
const consent = CookiePilot.getConsent();
// { necessary: true, analytics: true, marketing: false, preferences: false }
CookiePilot.updateConsent({ analytics: true });
document.getElementById('cookie-settings').addEventListener('click', () => {
CookiePilot.showSettings();
});
Nuoroda „Tvarkyti slapukus“ poraštėje
<a href="#" onclick="CookiePilot.showSettings(); return false;">Tvarkyti slapukus</a>
JavaScript įvykiai
Valdiklis išsiunčia natyvų įvykį cookiepilot:consent į window. Klausytojas turi būti užregistruotas prieš užkraunant valdiklį, jei norite pagauti įvykį grįžtančiam lankytojui (išsiuntimas įvyksta iškart po valdiklio paleidimo):
<script>
window.addEventListener('cookiepilot:consent', (e) => {
if (e.detail.marketing) {
fbq('init', 'YOUR_PIXEL_ID');
}
});
</script>
<script src="https://cdn.cookiepilot.io/cookiepilot.js" data-cpkey="TWOJ_KLUCZ"></script>
e.detail turi tą patį turinį (payload) kaip ir getConsent(). Integracijai per GTM verčiau naudokite aukščiau aprašytą dataLayer įvykį, nes dataLayer yra nuolatinis masyvas (persistent array) ir GTM apdoroja istorinius įvykius.
Sutikimų kategorijos
| Kategorija | Aprašymas | Numatytoji būsena |
|---|---|---|
necessary | Būtini svetainės veikimui | Visada aktyvūs |
analytics | Statistika ir analitika | Reikalingas sutikimas |
marketing | Reklama ir remarketingas | Reikalingas sutikimas |
preferences | Personalizavimas, kalba | Reikalingas sutikimas |
Atvaizdavimas į Google Consent Mode
| CookiePilot kategorija | Consent Mode laukai |
|---|---|
analytics | analytics_storage |
marketing | ad_storage, ad_user_data, ad_personalization |
preferences | functionality_storage, personalization_storage |
| (visada) | security_storage: granted |
Google Consent Mode v2
2-oji versija pridėjo ad_user_data ir ad_personalization (privaloma nuo 2024 m. kovo ES/EEE teritorijoje, vykdant Google reklamą).
| Parametras | Aprašymas |
|---|---|
ad_storage | Reklamos slapukai |
analytics_storage | Analitikos slapukai |
ad_user_data | Naudotojo duomenų siuntimas į Google |
ad_personalization | Reklamos personalizavimas |
functionality_storage | Funkciniai slapukai |
personalization_storage | Personalizavimo slapukai |
security_storage | Visada granted |
Mechanizmas:
- Stub sinchroniškai nustato visus laukus į
denied, suwait_for_update: 500. - Naudotojui priėmus sprendimą, valdiklis paleidžia
gtag('consent', 'update', {...})su aukščiau pateiktu atvaizdavimu. - Grįžtančiam lankytojui 2 punktas suveikia iškart po valdiklio paleidimo, remiantis slapuku.
Išvaizdos konfigūracija
Valdymo skydelyje: Domenas → Konfigūracija:
- Išvaizda: padėtis, spalvos, išdėstymas (BAR / BOX / MODAL).
- Tekstai: antraštė, aprašymas, mygtukų etiketės, kategorijų aprašymai. 13 kalbų (EN, PL, DE, FR, ES, IT, NL, PT, SV, CS, RO, EL, HU).
- Sutikimų mygtukas: plaukiojantis mygtukas „Slapukų nustatymai“, matomas po pirmojo sprendimo (apačioje kairėje / dešinėje).
- Custom CSS: laukas savo stiliams. Valdiklis atvaizduojamas Shadow DOM, tad pagrindinio dokumento CSS selektoriai neveiks. Tik per šį lauką.
Prieinamumas (WCAG 2.1 AA)
- ✅ Navigacija klaviatūra (Tab, Shift+Tab, Enter, Escape).
- ✅ ARIA etiketės, role="dialog", aria-modal.
- ✅ Fokuso gaudyklė (focus trap) modale.
- ✅ Ekrano skaitytuvas (live regions būsenos pokyčiui).
- ✅ Pritaikymas įvairiems ekranams.
Integracijos
WordPress
Turime oficialų įskiepį: CookiePilot WordPress.org svetainėje.
- WordPress administravimas → Įskiepiai → Pridėti naują → ieškokite „CookiePilot“.
- Įdiekite ir suaktyvinkite.
- Nustatymai → CookiePilot → įklijuokite API raktą iš valdymo skydelio.
Įskiepis pats įterpia stub ir žymą <head> (su teisinga tvarka prieš kitus skriptus) ir pateikia trumpinį [cookiepilot_settings] nuorodai „Tvarkyti slapukus“ poraštėje.
Jei norite be įskiepio: naudokite „Insert Headers and Footers“ ir įklijuokite kodo fragmentą iš Greito starto 2 žingsnio į Header sekciją.
Shopify
- Parduotuvė → Temos → Redaguoti kodą.
- Faile
theme.liquidįklijuokite kodo fragmentą prieš</head>.
Next.js
// app/layout.tsx
import Script from 'next/script';
export default function RootLayout({ children }) {
return (
<html>
<head>
<Script
src="https://cdn.cookiepilot.io/cookiepilot.js"
data-cpkey="TWOJ_KLUCZ"
strategy="beforeInteractive"
/>
</head>
<body>{children}</body>
</html>
);
}
strategy="beforeInteractive" užtikrina, kad banerio skriptas suveiks anksti. Atminkite, kad inline stub iš 2a žingsnio (numatytieji sutikimai) pridedate atskirai, <head> sekcijoje prieš šį skriptą, pvz. per next/script su dangerouslySetInnerHTML arba tiesiai app/layout.tsx.
DUK
Ar skriptas lėtina svetainę?
Paketas (bundle) – apie 12 KB gzip, užkraunamas asinchroniškai. Neturi įtakos Core Web Vitals.
Kiek laiko saugomi sutikimai?
Slapukas su naudotojo sprendimu: numatytai 365 dienos (konfigūruojama valdymo skydelyje). Analitikos įvykiai: 2 metai (ClickHouse TTL).
Ar įvykis cookiepilot_consent_update siunčiamas grįžtančiam lankytojui?
Taip. Valdiklis paleidimo metu perskaito slapuką ir perduoda įvykį į dataLayer. Custom Event trigeris GTM suveiks kiekvieno apsilankymo metu, ne tik priimant pirmąjį sprendimą.
Kur pranešti apie problemą?
kontakt@cookiepilot.io arba per pokalbį valdymo skydelyje.
Patikros sąrašas po įdiegimo
Įdiegę CookiePilot, prieš paleisdami reklamos kampanijas patikrinkite konfigūraciją.
1. Testas prieš naudotojo sutikimą
- Atidarykite svetainę inkognito režimu ir išvalykite domeno slapukus.
- Atidarykite DevTools → Network ir atnaujinkite puslapį.
- Prieš spustelėdami sutikimą įsitikinkite, kad:
- nesukuriami analitikos / rinkodaros slapukai, pvz.
_ga,_gcl_*,_fbp,_ttp, - rinkodaros žymos nesiunčia užklausų į Meta / TikTok / LinkedIn prieš rinkodaros sutikimą,
dataLayernustatyta numatytojideniedbūsena laukamsad_storage,ad_user_data,ad_personalizationiranalytics_storage.
- nesukuriami analitikos / rinkodaros slapukai, pvz.
2. Testas po sutikimų priėmimo
- Spustelėkite „Priimti visus“.
- DevTools patikrinkite, ar atsirado įvykis
cookiepilot_consent_update. - Google žymoms GTM Preview / Tag Assistant patikrinkite, ar Consent Mode pakeitė būseną į
grantedatitinkamoms kategorijoms. - GA4 atveju DebugView patikrinkite, ar įvykiai pradėjo plaukti po sutikimo.
- Meta Pixel / TikTok / LinkedIn atveju patikrinkite, ar žymos suveikia tik po įvykio
cookiepilot_consent_updateir rinkodaros sutikimo sąlygos.
3. Sutikimų atmetimo testas
- Išvalykite slapukus ir atnaujinkite puslapį.
- Spustelėkite „Atmesti visus“.
- Įsitikinkite, kad rinkodaros slapukai ir užklausos vis dar nepaleidžiami.
- Įsitikinkite, kad būtinos svetainės funkcijos vis dar veikia.
4. Dažniausios klaidos
- GA4 / Google Ads žyma suveikia ties
Consent Initialization, o ne vėlesniu trigeriu. - Meta Pixel ar TikTok Pixel neturi sąlygos ties
cookiepilot_consent.marketing. - Svetainėje liko senas, įkoduotas (hardcoded) trekeris
<head>sekcijoje prieš CookiePilot. - Dokumentacijoje ar šablone liko pasenęs skripto URL arba senas identifikatoriaus atributas vietoj dabartinio
cookiepilot.jssudata-cpkey.