Cookie Banner — Copy & Logic
Versi v0.1 (Draf — Belum Direview Pengacara) Berlaku Sejak: [Tanggal akan diisi sebelum publikasi]
Filosofi Klaritas Tentang Cookies
Berbeda dengan kebanyakan website yang membungkus dark pattern di balik banner cookies, Klaritas memegang tiga prinsip:
- Default-off untuk yang non-esensial. Tidak ada cookie tracking yang aktif sebelum user secara eksplisit setuju.
- Tidak ada "tombol terima" yang lebih besar dari "tolak". Equal hierarchy.
- Tidak ada pelacakan pihak ketiga di domain klaritas.id. Analytics yang dipakai first-party + anonymized.
Dengan pendekatan ini, banner cookies kami bisa tampil singkat dan jujur — bukan kalimat panjang berbusa-busa untuk menyembunyikan jualan data.
Banner Utama (First Visit)
Layout
Banner muncul di bagian bawah layar, full-width, dengan elevation halus dari background. Tidak menutupi konten utama. Tidak modal blocking. User tetap bisa scroll & baca website.
┌────────────────────────────────────────────────────────────────────┐
│ │
│ Klaritas memakai cookies seperlunya. │
│ │
│ Kami pakai cookies wajib untuk menjalankan layanan (login, │
│ akses laporan, persetujuan). Kami tidak memakai cookies │
│ pelacakan pihak ketiga di domain ini. │
│ │
│ Untuk analytics anonim opsional, butuh persetujuanmu. │
│ │
│ [ Tolak Opsional ] [ Atur Detail ] [ Terima Semua ] │
│ │
│ ──── │
│ Pelajari di Kebijakan Privasi · Kebijakan Cookies │
└────────────────────────────────────────────────────────────────────┘
Visual Treatment
- Background:
--paper(full opacity, bukan transparan blur) - Border-top:
1px solid --vellum - Shadow: ringan, hangat (
0 -4px 24px rgba(15,21,48,0.06)) - Padding:
--space-6(32px) di desktop,--space-5(24px) di mobile - Typography body: Inter 14px, line-height 1.65
- Tombol: 3 buah, semua memakai pattern button yang sama (size sama, padding sama). Tidak boleh "Terima Semua" lebih besar atau di-highlight dengan warna mencolok.
Tombol Behavior
| Tombol | Action | State |
|---|---|---|
| Tolak Opsional | Set klaritas-consent={"essential":true,"analytics":false} cookie 1 tahun. Tutup banner. |
--ink-deep outline button |
| Atur Detail | Buka modal granular control | Ghost button (text only) |
| Terima Semua | Set klaritas-consent={"essential":true,"analytics":true} cookie 1 tahun. Tutup banner. |
--ink-deep filled button |
Penting: "Terima Semua" dan "Tolak Opsional" punya visual weight setara. Tidak ada manipulasi.
Modal "Atur Detail"
Saat user klik "Atur Detail", buka modal center-screen dengan kontrol granular.
Layout
┌──────────────────────────────────────────────────────┐
│ │
│ Atur Cookie Preferences [×] │
│ │
│ ───── │
│ │
│ Cookies Wajib │
│ ──────────────────────────────── ✓ Selalu Aktif │
│ │
│ Diperlukan untuk operasi dasar — autentikasi, │
│ akses laporan, dan persetujuan. Tanpa ini, │
│ layanan tidak bisa berjalan. │
│ │
│ Daftar cookie: klaritas-session, report-view- │
│ token, klaritas-consent │
│ │
│ ───── │
│ │
│ Analytics Anonim │
│ ──────────────────────────────── [○ Off] │
│ │
│ Membantu kami memahami halaman mana yang berguna │
│ dan mana yang membingungkan. Data anonim, │
│ first-party (tidak dibagikan ke Google atau │
│ pihak ketiga). │
│ │
│ Daftar cookie: _klaritas_analytics │
│ │
│ ───── │
│ │
│ Marketing & Pelacakan │
│ ──────────────────────────────── — Tidak Pernah │
│ │
│ Klaritas tidak memakai cookie marketing pihak │
│ ketiga di domain ini. Tidak ada Facebook Pixel, │
│ Google Ads, atau cookies retargeting lainnya. │
│ │
│ Daftar cookie: (tidak ada) │
│ │
│ ───── │
│ │
│ [ Simpan Preferensi ] [ Terima Semua ] │
│ │
└──────────────────────────────────────────────────────┘
Visual Treatment
- Modal max-width: 560px desktop, full-width mobile
- Background:
--paper - Setiap kategori dipisahkan dengan hairline
--vellum - Toggle switch: custom Klaritas style (bukan default browser checkbox)
- Header kategori: Tenor Sans 18px
- Body kategori: Inter 14px, color
--ink-soft - Daftar cookie: monospace 12px, color
--ink-soft
Cookie Categories — Detailed
Wajib (Always Active)
| Cookie | Tujuan | Retensi | Domain |
|---|---|---|---|
klaritas-session |
Authentication admin panel | 30 menit setelah aktivitas terakhir | klaritas.id |
report-view-token |
Akses laporan setelah verifikasi OTP | 60 menit | klaritas.id |
klaritas-consent |
Menyimpan preferensi cookie ini sendiri | 1 tahun | klaritas.id |
next-csrf |
CSRF protection untuk form | Per-session | klaritas.id |
Dasar hukum (UU PDP Pasal 20): Lawful basis = pelaksanaan perjanjian dan kepentingan sah keamanan. Tidak butuh consent terpisah karena cookies ini esensial untuk layanan.
Analytics Anonim (Opt-in)
| Cookie | Tujuan | Retensi | Domain |
|---|---|---|---|
_klaritas_analytics |
First-party analytics — page view, scroll depth, engagement | 90 hari | klaritas.id |
_klaritas_session_id |
Session linking untuk analytics flow | Per-session | klaritas.id |
Dasar hukum: Persetujuan eksplisit user. Bila user belum setuju, cookies ini tidak di-set.
Data yang dikumpulkan:
- Halaman yang dikunjungi
- Waktu di halaman
- Scroll depth
- Click pada elemen tertentu (button, link)
- Source/referer
- Device class (mobile/desktop), bukan model spesifik
- Country dari IP (kota tidak)
Data yang TIDAK dikumpulkan:
- IP address full (di-hash sebelum disimpan)
- User agent string detail
- Identifier yang bisa men-tracking lintas sesi
- Apapun yang bisa di-link ke pemesan/pasangan spesifik
Marketing & Pelacakan Pihak Ketiga
Tidak ada. Klaritas secara prinsipiel tidak memakai:
- Facebook Pixel
- Google Ads / DoubleClick
- LinkedIn Insight Tag
- TikTok Pixel
- Hotjar / FullStory / session replay
- Cookies retargeting apapun
Bila kami suatu saat menambahkan, wajib opt-in eksplisit terpisah dengan re-consent flow.
Mekanisme Re-consent
User dapat mengubah preferensi cookies kapan saja:
- Footer setiap halaman ada link "Preferensi Cookies".
- Klik membuka kembali modal "Atur Detail".
- Perubahan disimpan ke cookie
klaritas-consent, expire 1 tahun.
Re-consent otomatis dipicu bila:
- Versi kebijakan cookies berubah (mis.
cookie-policy-version=2) - Cookies wajib bertambah signifikan
- Kami menambahkan cookies dari kategori baru
Saat re-consent dipicu, banner muncul kembali dengan label "Kebijakan cookies telah diperbarui".
Implementation Notes (Engineering)
Storage Schema
// Cookie: klaritas-consent
{
v: 1, // schema version
ts: 1715603200, // unix timestamp set
essential: true, // always true (immutable)
analytics: false, // user choice
marketing: false, // always false in v1
policyVersion: "2026-05-13" // matches CookiePolicy version
}
Behavior Rules
- Pre-consent state: Hanya cookies wajib di-set. Analytics scripts tidak di-load.
- Post-consent denied: Analytics scripts tetap tidak di-load. Hanya cookies wajib.
- Post-consent allowed: Analytics scripts di-load setelah hydration (tidak blocking page load).
- Mid-session change: Bila user mengubah dari allow → deny, halaman tidak perlu reload, tapi analytics script di-unload dan cookies analytics dihapus.
Server-Side Detection
Untuk page yang server-rendered, baca cookie klaritas-consent di Next.js Server Component:
import { cookies } from 'next/headers';
import { z } from 'zod';
const ConsentSchema = z.object({
v: z.literal(1),
ts: z.number(),
essential: z.literal(true),
analytics: z.boolean(),
marketing: z.boolean(),
policyVersion: z.string(),
});
export async function getConsentState() {
const raw = (await cookies()).get('klaritas-consent')?.value;
if (!raw) return null;
try {
return ConsentSchema.parse(JSON.parse(raw));
} catch {
return null;
}
}
Compliance Logging
Setiap setting/perubahan consent di-log untuk audit trail:
// Audit log entry
{
actor_type: 'pemesan' | 'partner' | 'visitor',
action: 'consent.cookie.set' | 'consent.cookie.updated',
metadata: {
essential: true,
analytics: false,
marketing: false,
policy_version: '2026-05-13',
user_agent_class: 'mobile_safari',
ip_hash: '...',
},
created_at: timestamp,
}
Copy Variations (A/B Testing — Optional)
Untuk eksplorasi setelah launch, bisa di-test variasi tone:
A — Direct (default, recommended)
Klaritas memakai cookies seperlunya. Kami pakai cookies wajib untuk menjalankan layanan. Untuk analytics anonim opsional, butuh persetujuanmu.
B — Editorial
Kami percaya pada transparansi. Cookies wajib kami pakai untuk autentikasi dan akses laporan — tanpa itu, layanan tidak bisa berjalan. Analytics anonim opsional, dan tergantung kamu.
C — Minimal
Cookies wajib aktif. Analytics anonim opsional. Kami tidak memakai cookies pelacakan pihak ketiga.
Pilihan A direkomendasikan untuk launch — jelas, ringkas, on-brand dewasa.
Aksesibilitas
- Banner harus dapat di-dismiss dengan keyboard (Esc menutup banner sebagai "Tolak Opsional" implisit dengan re-confirm di footer)
- Focus order: Tolak → Atur Detail → Terima Semua
- ARIA:
role="region"danaria-label="Notifikasi cookies" - Modal:
role="dialog",aria-modal="true", focus trap aktif - Kontras teks/tombol: minimum WCAG AA 4.5:1
Footer Link Permanen
Di footer setiap halaman, ada 3 link legal:
Kebijakan Privasi · Syarat & Ketentuan · Preferensi Cookies
"Preferensi Cookies" akan trigger banner/modal re-buka, supaya user bisa mengubah pilihan kapan saja tanpa perlu navigasi ke halaman terpisah.
Klausul Tambahan: Children
Layanan Klaritas tidak ditujukan untuk pengguna < 18 tahun. Bila kami terdeteksi mengumpulkan data anak di bawah usia tersebut (mis. via tampak dari konteks pendaftaran), data dihapus permanen dalam 7 hari.
Dengan menggunakan layanan kami, kamu menyetujui implementasi cookie banner ini sesuai dengan pilihan yang kamu buat.
[Draf v0.1 — Wajib review pengacara sebelum publikasi]