May 18, 2026 • 8 min read • By Madhawa Sadil

Building a Zero-Third-Party Cookie Consent Engine That Truly Respects User Privacy

Why off-the-shelf CMPs degrade performance, and how to build a lightweight, GDPR/CCPA compliant consent system with conditional script injection.

#Privacy #TypeScript #GDPR #Web Performance
Virtually every website today displays a cookie banner, yet the overwhelming majority of third-party Consent Management Platforms (CMPs) are bloated monstrosities. Off-the-shelf CMP scripts frequently download between 300KB and 800KB of external JavaScript, inject tracking trackers of their own, delay page load times, and degrade Core Web Vitals. Here is how we engineered an ultra-clean, zero-dependency consent manager in under 150 lines of code.

The Bloat and Hypocrisy of Commercial CMPs

Commercial consent banners like OneTrust or Cookiebot are often heavier than the actual website they sit on. Worse, many track user behavior across domains to build consent telemetry profiles, subverting the very privacy laws they claim to satisfy.

From an engineering standpoint, cookie consent requires very little: an accessible UI modal, a local key-value persistence store (localStorage), and a clean event emitter that gates external script injection until the user clicks 'Accept'.

Architecting a State-Driven Consent Model

Under GDPR and ePrivacy regulations, tracking scripts (including Google Analytics and Google AdSense personalized tags) must remain strictly un-injected until explicit, informed consent is granted. A common blunder is loading the script tags in the HTML `<head>` and simply hiding the visual ads—this violates compliance because tracking cookies are set upon script download.

Our solution keeps external tracking tags completely absent from the initial HTML payload. A dedicated React hook monitors the user's consent status and dynamically loads tags only after confirmation.

typescript
// Lightweight Conditional Script Injection Hook
export type ConsentStatus = 'pending' | 'accepted' | 'declined';

export function useCookieConsent(adSensePublisherId?: string, gaTrackingId?: string) {
  const [status, setStatus] = useState<ConsentStatus>(() => {
    return (localStorage.getItem('user_cookie_consent') as ConsentStatus) || 'pending';
  });

  const injectExternalScripts = useCallback(() => {
    // 1. Conditionally inject Google AdSense
    if (adSensePublisherId && !document.getElementById('adsense-script')) {
      const adScript = document.createElement('script');
      adScript.id = 'adsense-script';
      adScript.src = `https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=${adSensePublisherId}`;
      adScript.async = true;
      adScript.crossOrigin = 'anonymous';
      document.head.appendChild(adScript);
    }

    // 2. Conditionally inject Google Analytics
    if (gaTrackingId && !document.getElementById('gtag-script')) {
      const gaScript = document.createElement('script');
      gaScript.id = 'gtag-script';
      gaScript.src = `https://www.googletagmanager.com/gtag/js?id=${gaTrackingId}`;
      gaScript.async = true;
      document.head.appendChild(gaScript);
    }
  }, [adSensePublisherId, gaTrackingId]);

  const accept = () => {
    localStorage.setItem('user_cookie_consent', 'accepted');
    setStatus('accepted');
    injectExternalScripts();
  };

  const decline = () => {
    localStorage.setItem('user_cookie_consent', 'declined');
    setStatus('declined');
  };

  useEffect(() => {
    if (status === 'accepted') {
      injectExternalScripts();
    }
  }, [status, injectExternalScripts]);

  return { status, accept, decline };
}

Designing a Non-Intrusive, Accessible Banner

Cookie notices should not hostage the user experience with full-screen dark overlays or deceptive color tricks that trick visitors into clicking 'Accept All'.

In our implementation, the banner rests unobtrusively at the bottom edge of the screen, styled with monochrome contrast, clear 'Accept' and 'Decline' buttons of equal visual hierarchy, and full keyboard tab accessibility.

GDPR Consent Requirement Under EU guidelines, rejecting cookies must be as easy as accepting them. Ensure your 'Decline' button has equivalent visual clarity and does not require navigating through multi-step nested option menus.

Zero Impact on Page Speed and Core Web Vitals

By writing our consent banner in native React without external dependencies, our consent system adds exactly 0KB of extra network requests and executes in under 1ms. Visitors experience lightning-fast initial page loads while maintaining complete control over their digital privacy.