Ievads
CookiePilot ir sīkdatņu piekrišanas pārvaldības platforma (CMP), kas atbilst Vispārīgajai datu aizsardzības regulai (VDAR), Elektronisko sakaru likumam un Google Consent Mode v2 prasībām. Šo regulējumu Latvijā uzrauga Datu valsts inspekcija (DVI).
Kam paredzēts
- Vietņu īpašniekiem: ieviešana bez programmēšanas.
- Izstrādātājiem: API, notikumi, integrācijas ar GTM.
- Aģentūrām: white-label risinājums, vairāku domēnu pārvaldība.
Ātrā darba sākšana
1. solis: Reģistrācija
- Izveidojiet kontu vietnē app.cookiepilot.io/register.
- Pievienojiet domēnu vadības panelī un nokopējiet API atslēgu (formāts
cp_live_...).
2. solis: Koda instalēšana
Tieša instalēšana ir divi skripti <head> sadaļā, šādā secībā.
2.a solis: Noklusētā piekrišana (inline stub). Ievietojiet to kā pirmo, pirms jebkura cita skripta (cookiepilot.js, GA, GTM, reklāmu un izsekošanas tagi):
<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 fragments uzreiz iestata visas kategorijas uz denied (ar wait_for_update: 500), tāpēc Google Consent Mode v2 noklusētais stāvoklis ir gatavs vēl pirms tam, kad ielādējas jebkas cits. Atgriežoties lietotājam tas uzreiz nolasa saglabāto piekrišanu no sīkdatnes un nosūta consent update.
2.b solis: Bannera skripts. Pievienojiet uzreiz pēc inline stub:
<!-- CookiePilot -->
<script async src="https://cdn.cookiepilot.io/cookiepilot.js" data-cpkey="TWOJ_KLUCZ"></script>
3. solis: Bannera konfigurācija
Vadības panelī: Domēns → Konfigurācija → Izskats:
- bannera novietojums (augšā, apakšā, modālajā logā),
- krāsas un teksti,
- peldošā poga "Sīkdatņu iestatījumi" atgriežošajiem lietotājiem.
Integrācija ar Google Tag Manager
Izmantojot GTM, CookiePilot instalējat ar vienu Custom HTML tagu, kas uzreiz iestata noklusēto piekrišanu un ielādē banneri pašā agrākajā GTM fāzē. Atsevišķs stub fails vai otrs tags nav nepieciešams.
Tags: CookiePilot - Consent Init + Banner
GTM izveidojiet Custom HTML tagu (Tags → New → Custom HTML) un ielīmējiet:
<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. Tagam ir jānostrādā vienu reizi katrā lapā. Google tagi (GA4, Google Ads), Facebook Pixel un citi mārketinga tagi NEIZMANTO Consent Initialization trigeri, bet tiek aktivizēti vēlāk (Consent Checks vai no piekrišanas atkarīgs trigeris). Saglabājiet tagu un publicējiet GTM konteineru.
Secība un trigeri
| Secība | Tags | Trigeris |
|---|---|---|
| 1 | CookiePilot - Consent Init + Banner | Consent Initialization - All Pages |
| 2 | GA4, Google Ads, UET | All Pages (Consent Mode pats apstrādās piekrišanas) |
| 3 | Facebook Pixel, TikTok, LinkedIn u.c. | Custom Event cookiepilot_consent_update + piekrišanas nosacījums (skat. zemāk) |
Tagi ārpus Google (Facebook Pixel, TikTok, LinkedIn)
Google Consent Mode apstrādā tikai Google tagus. Pārējiem skriptiem logrīks pie katras piekrišanas izmaiņas nosūta uz dataLayer notikumu:
dataLayer.push({
event: 'cookiepilot_consent_update',
cookiepilot_consent: {
necessary: true,
analytics: true,
marketing: true,
preferences: false
}
});
Notikums tiek nosūtīts arī pie katra atgriežošā lietotāja apmeklējuma (kad logrīks nolasa sīkdatni ar piekrišanu), tāpēc GTM trigeris nostrādās pie katra apmeklējuma, ne tikai pie pirmā lēmuma.
Kopīgais paraugs (izpildiet vienu reizi)
Šos trīs elementus konfigurējat vienu reizi un pēc tam izmantojat visiem tagiem ārpus Google.
- Trigeris (Triggers → New → Custom Event): notikuma nosaukums
cookiepilot_consent_update. Bez nosacījumiem, bez "Once per page" (tagam ir jāspēj nostrādāt atkārtoti pēc lēmuma maiņas). - Data Layer Variable katrai izmantotajai kategorijai:
- Name
cookiepilot_consent.marketing→ mainīgais, piemēram,dlv.cp_marketing - Name
cookiepilot_consent.analytics→ mainīgais, piemēram,dlv.cp_analytics - Name
cookiepilot_consent.preferences→ mainīgais, piemēram,dlv.cp_preferences
- Name
- Trigger Group vai nosacījums trigerī:
dlv.cp_marketing equals true(mārketinga tagiem) vai attiecīgais lauks.
Katrā no zemāk dotajiem piemēriem Trigger ir tas pats Custom Event ar pievienotu nosacījumu uz pareizo mainīgo.
Facebook Pixel
Tags 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+ nosacījumsdlv.cp_marketing equals true. - Tag firing options: Once per page.
Pēc izvēles, lai nodrošinātu pilnu atbilstību Facebook Limited Data Use, pievienojiet otru tagu, kas izsauc fbq('consent','revoke') ar trigeri dlv.cp_marketing equals false.
TikTok Pixel
Tags 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+ nosacījumsdlv.cp_marketing equals true. - Tag firing options: Once per page.
ttq.grantConsent() ir jaunais TikTok API (no 2024. gada). Bez tā TikTok saņem jauktos (hashed) datus bez piekrišanas, kas pārkāpj noteikumus.
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+ nosacījumsdlv.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+ nosacījumsdlv.cp_analytics equals true. - Tag firing options: Once per page.
Hotjar pieder pie analytics, nevis marketing (tas mēra uzvedību, nevis reklāmas). Pārbaudiet savu sīkdatņu politiku — dažas firmas Hotjar klasificē citādi.
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+ nosacījumsdlv.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+ nosacījumsdlv.cp_marketing equals true. - Tag firing options: Once per page.
Microsoft Ads (UET)
UET atbalsta Google Consent Mode kopš 2023. gada beigām, tāpēc Custom Event trigeris jums nav nepieciešams. Ievietojiet tagu standarta veidā (All Pages, Once per page), un UET pats nolasa ad_storage no GCM, ko iestata logrīks.
Kategoriju kartēšana (kopsavilkums)
| Tags | Kategorija | Lauks 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, bez trigera) | apstrādā gtag('consent','update') |
API atsauce
CookiePilot nodrošina objektu window.CookiePilot:
| Metode | Apraksts |
|---|---|
CookiePilot.getConsent() | Pašreizējais piekrišanas stāvoklis vai null, ja lēmuma nav. |
CookiePilot.acceptAll() | Piekrišana visām kategorijām. |
CookiePilot.rejectAll() | Noraida visu, izņemot necessary. |
CookiePilot.updateConsent(partial) | Atjaunina izvēlētās kategorijas, piemēram, { analytics: true }. |
CookiePilot.showSettings() | Atver preferenču modālo logu. |
CookiePilot.hideSettings() | Aizver preferenču modālo logu. |
CookiePilot.showMyConsent() / hideMyConsent() | Parāda/paslēpj peldošo pogu. |
Piemērs
const consent = CookiePilot.getConsent();
// { necessary: true, analytics: true, marketing: false, preferences: false }
CookiePilot.updateConsent({ analytics: true });
document.getElementById('cookie-settings').addEventListener('click', () => {
CookiePilot.showSettings();
});
Saite "Pārvaldīt sīkdatnes" kājenē
<a href="#" onclick="CookiePilot.showSettings(); return false;">Pārvaldīt sīkdatnes</a>
JavaScript notikumi
Logrīks nosūta (dispatch) natīvu notikumu cookiepilot:consent uz window. Klausītājam ir jābūt reģistrētam pirms logrīka ielādes, ja vēlaties noķert notikumu atgriežošajam lietotājam (nosūtīšana notiek uzreiz pēc logrīka palaišanas):
<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 satur to pašu saturu (payload) kā getConsent(). Integrācijai caur GTM šī vietā izmantojiet iepriekš aprakstīto dataLayer notikumu, jo dataLayer ir persistents masīvs un GTM apstrādā arī vēsturiskos notikumus.
Piekrišanas kategorijas
| Kategorija | Apraksts | Pēc noklusējuma |
|---|---|---|
necessary | Nepieciešamas vietnes darbībai | Vienmēr aktīvas |
analytics | Statistika un analītika | Nepieciešama piekrišana |
marketing | Reklāmas un remārketings | Nepieciešama piekrišana |
preferences | Personalizācija, valoda | Nepieciešama piekrišana |
Kartēšana uz Google Consent Mode
| CookiePilot kategorija | Consent Mode lauki |
|---|---|
analytics | analytics_storage |
marketing | ad_storage, ad_user_data, ad_personalization |
preferences | functionality_storage, personalization_storage |
| (vienmēr) | security_storage: granted |
Google Consent Mode v2
Versija 2 pievienoja ad_user_data un ad_personalization (obligāti kopš 2024. gada marta ES/EEZ teritorijā, izmantojot Google reklāmas).
| Parametrs | Apraksts |
|---|---|
ad_storage | Reklāmas sīkdatnes |
analytics_storage | Analītikas sīkdatnes |
ad_user_data | Lietotāja datu nosūtīšana Google |
ad_personalization | Reklāmu personalizācija |
functionality_storage | Funkcionālās sīkdatnes |
personalization_storage | Personalizācijas sīkdatnes |
security_storage | Vienmēr granted |
Mehānisms:
- Stub sinhroni iestata visus laukus uz
denied, arwait_for_update: 500. - Pēc lietotāja lēmuma logrīks nosūta
gtag('consent', 'update', {...})ar augstāk doto kartējumu. - Atgriežošajam lietotājam 2. punkts izpildās uzreiz pēc logrīka palaišanas, balstoties uz sīkdatni.
Izskata konfigurācija
Vadības panelī: Domēns → Konfigurācija:
- Izskats: novietojums, krāsas, izkārtojums (BAR / BOX / MODAL).
- Teksti: virsraksts, apraksts, pogu apzīmējumi, kategoriju apraksti. 13 valodas (EN, PL, DE, FR, ES, IT, NL, PT, SV, CS, RO, EL, HU).
- Piekrišanas poga: peldošā poga "Sīkdatņu iestatījumi", redzama pēc pirmā lēmuma (apakšā pa kreisi/pa labi).
- Custom CSS: lauks pašu stiliem. Logrīks tiek renderēts Shadow DOM, tāpēc galvenā dokumenta CSS selektori nedarbosies. Tikai caur šo lauku.
Pieejamība (WCAG 2.1 AA)
- ✅ Navigācija ar tastatūru (Tab, Shift+Tab, Enter, Escape).
- ✅ ARIA labels, role="dialog", aria-modal.
- ✅ Fokusa slazds (focus trap) modālajā logā.
- ✅ Ekrāna lasītājs (live regions stāvokļa izmaiņām).
- ✅ Atsaucīgums (responsivitāte).
Integrācijas
WordPress
Mums ir oficiāls spraudnis: CookiePilot vietnē WordPress.org.
- WordPress administrēšana → Spraudņi → Pievienot jaunu → meklējiet "CookiePilot".
- Instalējiet un aktivizējiet.
- Iestatījumi → CookiePilot → ielīmējiet API atslēgu no vadības paneļa.
Spraudnis pats ievieto stub un tagu <head> sadaļā (ar pareizu secību pirms citiem skriptiem) un nodrošina shortcode [cookiepilot_settings] saitei "Pārvaldīt sīkdatnes" kājenē.
Ja vēlaties bez spraudņa: izmantojiet "Insert Headers and Footers" un ielīmējiet fragmentu no ātrās darba sākšanas 2. soļa Header sadaļā.
Shopify
- Veikals → Motīvi (Themes) → Rediģēt kodu.
- Failā
theme.liquidielīmējiet fragmentu pirms</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" nodrošina, ka bannera skripts izpildās agri. Atcerieties, ka inline stub no 2.a soļa (noklusētā piekrišana) pievienojat atsevišķi, <head> sadaļā pirms šī skripta, piemēram, izmantojot next/script ar dangerouslySetInnerHTML vai tieši failā app/layout.tsx.
BUJ
Vai skripts palēnina vietni?
Pakotne (bundle) ir aptuveni 12 KB gzip, ielādēta asinhroni. Bez ietekmes uz Core Web Vitals.
Cik ilgi tiek glabāta piekrišana?
Sīkdatne ar lietotāja lēmumu: pēc noklusējuma 365 dienas (konfigurējams vadības panelī). Notikumi analītikā: 2 gadi (ClickHouse TTL).
Vai notikums cookiepilot_consent_update tiek nosūtīts atgriežošajam lietotājam?
Jā. Logrīks palaišanas brīdī nolasa sīkdatni un nosūta notikumu uz dataLayer. Custom Event trigeris GTM nostrādās pie katra apmeklējuma, ne tikai pie pirmā lēmuma.
Kur ziņot par problēmu?
kontakt@cookiepilot.io vai čats vadības panelī.
Pārbaudes saraksts pēc ieviešanas
Pēc CookiePilot instalēšanas pārbaudiet konfigurāciju pirms reklāmas kampaņu publicēšanas.
1. Tests pirms lietotāja piekrišanas
- Atveriet vietni inkognito režīmā un notīriet domēna sīkdatnes.
- Atveriet DevTools → Network un atsvaidziniet lapu.
- Pirms piekrišanas nospiešanas pārbaudiet, ka:
- netiek izveidotas analītikas/mārketinga sīkdatnes, piemēram,
_ga,_gcl_*,_fbp,_ttp, - mārketinga tagi nesūta pieprasījumus uz Meta/TikTok/LinkedIn pirms mārketinga piekrišanas,
dataLayerir iestatīts noklusētais stāvoklisdeniedlaukiemad_storage,ad_user_data,ad_personalizationunanalytics_storage.
- netiek izveidotas analītikas/mārketinga sīkdatnes, piemēram,
2. Tests pēc piekrišanas akceptēšanas
- Nospiediet „Pieņemt visas”.
- DevTools pārbaudiet, vai parādījās notikums
cookiepilot_consent_update. - Google tagiem GTM Preview / Tag Assistant pārbaudiet, vai Consent Mode mainīja stāvokli uz
grantedattiecīgajām kategorijām. - GA4 pārbaudiet DebugView, vai notikumi sāka pienākt pēc piekrišanas.
- Meta Pixel / TikTok / LinkedIn pārbaudiet, vai tagi tiek aktivizēti tikai pēc notikuma
cookiepilot_consent_updateun mārketinga piekrišanas nosacījuma.
3. Tests piekrišanas noraidīšanai
- Notīriet sīkdatnes un atsvaidziniet lapu.
- Nospiediet „Noraidīt visas”.
- Pārbaudiet, ka mārketinga sīkdatnes un pieprasījumi joprojām netiek palaisti.
- Pārbaudiet, ka vietnes nepieciešamās funkcijas joprojām darbojas.
4. Biežākās kļūdas
- GA4/Google Ads tags tiek aktivizēts uz
Consent Initialization, nevis vēlāka trigera. - Meta Pixel vai TikTok Pixel nav nosacījuma uz
cookiepilot_consent.marketing. - Vietnē palicis vecs, kodā ierakstīts (hardcoded) izsekotājs
<head>sadaļā pirms CookiePilot. - Dokumentācijā vai veidnē palicis neaktuāls skripta URL vai vecs identifikatora atribūts aktuālā
cookiepilot.jsardata-cpkeyvietā.