PHPackages                             wireboard/laravel-cmp - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. wireboard/laravel-cmp

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

wireboard/laravel-cmp
=====================

Consent management platform for Laravel with WireBoard Analytics, GA4, and Google Funding Choices support

1.4.0(2mo ago)131MITPHPPHP ^8.1

Since Jan 28Pushed 2mo ago1 watchersCompare

[ Source](https://github.com/wireboard/laravel-cmp)[ Packagist](https://packagist.org/packages/wireboard/laravel-cmp)[ RSS](/packages/wireboard-laravel-cmp/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (3)Versions (6)Used By (0)

WireBoard Laravel CMP
=====================

[](#wireboard-laravel-cmp)

A consent management platform for Laravel with support for [WireBoard Analytics](https://wireboard.io), Google Analytics 4, and Google Funding Choices.

[![WireBoard Laravel CMP](wireboard-laravel-cmp.png)](wireboard-laravel-cmp.png)

> **Disclaimer:** This package provides tools to help manage user consent. It is your responsibility to ensure your implementation meets applicable privacy regulations (GDPR, ePrivacy, etc.) for your jurisdiction. Consult with a legal professional for compliance advice.

Features
--------

[](#features)

- **Consent Mode v2** - All storage types denied by default until user consent
- **Flexible CMP Options** - Google Funding Choices (for AdSense sites) or vanilla-cookieconsent (custom CMP)
- **Automatic Regional Fallback** - Falls back to Custom CMP in regions where Google doesn't show banners (Brazil, South Africa, etc.)
- **Google Analytics 4** - Consent-gated loading (only loads after user consent)
- **[WireBoard Analytics](https://wireboard.io)** - Configurable loading mode (cookieless first or consent required)
- **Third-Party Scripts** - Load any analytics/marketing scripts after consent with ``
- **Fully Configurable** - Theme colors, button layouts, cookie categories, languages
- **Reject All Button** - Optional "Reject all" button for quick opt-out
- **Floating Settings Button** - Cookie icon button to reopen preferences after consent
- **13 Languages** - English, French, German, Spanish, Italian, Dutch, Portuguese, Polish, Danish, Swedish, Norwegian, Finnish, Hungarian
- **Publishable Assets** - Customize CSS, JS, translations, and views

Requirements
------------

[](#requirements)

- PHP 8.1+
- Laravel 10.x, 11.x, or 12.x

Installation
------------

[](#installation)

```
composer require wireboard/laravel-cmp
```

The package auto-registers via Laravel's package discovery.

### Publish Assets

[](#publish-assets)

```
# Publish everything (recommended for first install)
php artisan vendor:publish --tag=cmp

# Or publish individually:
php artisan vendor:publish --tag=cmp-config       # Config file
php artisan vendor:publish --tag=cmp-assets       # JS/CSS files
php artisan vendor:publish --tag=cmp-translations # Translation files
php artisan vendor:publish --tag=cmp-views        # Blade views
php artisan vendor:publish --tag=cmp-source       # Source files (for custom builds)
php artisan vendor:publish --tag=cmp-react        # React components (Inertia.js)
php artisan vendor:publish --tag=cmp-vue          # Vue components (Inertia.js)
```

Configuration
-------------

[](#configuration)

Add these environment variables to your `.env` file:

```
# Enable/Disable CMP (default: true)
CMP_ENABLED=true

# Google AdSense (determines which CMP to use)
CMP_ADSENSE_ENABLED=false
CMP_ADSENSE_PUB_ID=pub-XXXXXXXXXX

# Google Analytics 4 (requires user consent)
CMP_GA4_ENABLED=true
CMP_GA4_ID=G-XXXXXXXXXX

# WireBoard Analytics
CMP_WIREBOARD_ENABLED=false
CMP_WIREBOARD_LOADING_MODE=cookieless_first  # 'cookieless_first' or 'consent_required'
CMP_WIREBOARD_PIPELINE=pipeline-0.collector.wireboard.io
CMP_WIREBOARD_APP_ID=your-app-id
CMP_WIREBOARD_PUBLISHER=your-publisher-id
```

Usage
-----

[](#usage)

### Quick Start (All-in-One)

[](#quick-start-all-in-one)

Add a single component in your layout's ``:

```

```

### Individual Components

[](#individual-components)

For more control, use individual components:

```

    {{-- 1. Consent Mode v2 Defaults - MUST be first --}}

    {{-- 2. CMP Script (Google Funding Choices or vanilla-cookieconsent) --}}

    {{-- 3. Consent State Tracker --}}

    {{-- 4. Google Analytics 4 (consent-gated) --}}

    {{-- 5. WireBoard Analytics --}}

```

### Cookie Preferences Link (Custom CMP Only)

[](#cookie-preferences-link-custom-cmp-only)

Add a link to let users manage their cookie preferences.

#### Blade

[](#blade)

```

    {{-- Or with custom text and class --}}

```

#### React / Inertia.js

[](#react--inertiajs)

Publish the React component:

```
php artisan vendor:publish --tag=cmp-react
```

Then use it in your components:

```
import { CookiePreferencesLink, useCookieConsent } from '@/components/CookiePreferencesLink';

// As a component

// Or use the hook
const { showPreferences, hasValidConsent } = useCookieConsent();
Cookie Settings
```

#### Vue / Inertia.js

[](#vue--inertiajs)

Publish the Vue component:

```
php artisan vendor:publish --tag=cmp-vue
```

Then use it in your components:

```

import CookiePreferencesLink from '@/components/CookiePreferencesLink.vue';
// Or use the composable
import { useCookieConsent } from '@/composables/useCookieConsent';

const { showPreferences } = useCookieConsent();

    Cookie Settings

```

> **Note:** These components only work with the Custom CMP. For Google Funding Choices, users manage preferences through Google's built-in UI.

### Third-Party Scripts (On-Consent)

[](#third-party-scripts-on-consent)

Load any third-party scripts only after the user grants consent. You can use either the Blade component or JavaScript approach.

#### Option 1: Blade Component

[](#option-1-blade-component)

```
{{-- Load analytics script after consent --}}

    try{ clicky.init(123456); }catch(e){}

{{-- Load marketing/ads script after consent --}}

```

**Built-in category mappings:**

- `analytics` - Maps to `analytics_storage` consent
- `marketing` (or `ads`) - Maps to `ad_storage` consent

You can use any category name you define in your `config/cmp.php`. See [Adding a Marketing Category](#adding-a-marketing-category) for a complete example.

#### Option 2: JavaScript Event Listener

[](#option-2-javascript-event-listener)

```
window.addEventListener('consent.update', function(e) {
    if (e.detail.analytics_storage === 'granted') {
        // Load Clicky, Matomo, Plausible, etc.
    }
    if (e.detail.ad_storage === 'granted') {
        // Load marketing/ads scripts
    }
});
```

Both approaches work with external scripts, inline scripts, and any HTML content.

Configuration Options
---------------------

[](#configuration-options)

After publishing the config, edit `config/cmp.php`:

### Enable/Disable CMP

[](#enabledisable-cmp)

```
'enabled' => env('CMP_ENABLED', true),
```

### AdSense / CMP Mode Selection

[](#adsense--cmp-mode-selection)

This setting determines which CMP is used:

```
'adsense' => [
    'enabled' => env('CMP_ADSENSE_ENABLED', false),  // true = Google Funding Choices, false = Custom CMP
    'pub_id' => env('CMP_ADSENSE_PUB_ID'),           // Your AdSense publisher ID (pub-XXXXXXXXXX)
],
```

### WireBoard Loading Mode

[](#wireboard-loading-mode)

Choose how WireBoard loads relative to user consent:

```
'wireboard' => [
    'enabled' => true,
    'loading_mode' => 'cookieless_first', // or 'consent_required'
    // ...
],
```

**Available modes:**

ModeBehavior`cookieless_first`Load immediately in cookieless mode (no cookies/localStorage). Upgrade to full tracking after consent. Best for maximum data collection while respecting privacy.`consent_required`Only load after user grants analytics consent (like GA4). No tracking at all until consent. Best for strict privacy compliance.```
# Set via environment variable
CMP_WIREBOARD_LOADING_MODE=cookieless_first
```

---

Custom CMP Options
------------------

[](#custom-cmp-options)

The following options only apply when using the **Custom CMP** (AdSense disabled):

### Theme Customization

[](#theme-customization)

```
'theme' => [
    'primary_bg' => '#1a73e8',        // Primary button background
    'primary_hover_bg' => '#1557b0',  // Primary button hover
    'primary_color' => '#ffffff',     // Primary button text
    'secondary_bg' => 'transparent',  // Secondary button background
    'secondary_border' => '#dadce0',  // Secondary button border
    'secondary_color' => '#1a73e8',   // Secondary button text
    'secondary_hover_bg' => '#f8f9fa',// Secondary button hover
    'modal_bg' => '#ffffff',          // Modal background
    'text_color' => '#202124',        // Main text color
    'border_radius' => '8px',         // Modal border radius
],
```

### GUI Options

[](#gui-options)

```
'custom_cmp' => [
    'gui_options' => [
        'consent_modal' => [
            'layout' => 'box inline',       // 'box', 'box inline', 'cloud', 'bar'
            'position' => 'middle center',  // Position on screen
            'equal_weight_buttons' => true, // Equal width buttons
            'flip_buttons' => true,         // [Manage] [Accept] order
        ],
        'preferences_modal' => [
            'layout' => 'box',
            'position' => 'middle center',
            'equal_weight_buttons' => true,
            'flip_buttons' => true,
        ],
    ],
],
```

### Reject All Button

[](#reject-all-button)

Show or hide the "Reject all" button on both modals:

```
'custom_cmp' => [
    'show_reject_button' => true,  // Set to false to hide
],
```

### Floating Settings Button

[](#floating-settings-button)

After the user makes their consent choice, a floating cookie icon appears allowing them to reopen their preferences:

```
'custom_cmp' => [
    'show_settings_button' => true,       // Show/hide the floating button
    'settings_button_position' => 'bottom_left', // 'bottom_left' or 'bottom_right'
],
```

### Legal Links

[](#legal-links)

Add privacy policy and terms of service links to the consent modal footer:

```
'custom_cmp' => [
    'privacy_policy_url' => '/privacy-policy',
    'terms_url' => '/terms-of-service',
],
```

Links are automatically translated to the user's language.

### Cookie Categories

[](#cookie-categories)

The package comes with two default categories: `necessary` and `analytics`. You can customize these and add new ones.

```
'custom_cmp' => [
    'categories' => [
        'necessary' => [
            'enabled' => true,
            'read_only' => true,  // Cannot be disabled by user
        ],
        'analytics' => [
            'enabled' => true,    // Pre-toggled ON
            'read_only' => false,
            'auto_clear' => [     // Cookies to clear when disabled
                '/^_ga/',
                '_gid',
            ],
        ],
    ],
],
```

### Adding a Marketing Category

[](#adding-a-marketing-category)

To add a "Marketing" category for ads, pixels, and tracking scripts:

**Step 1: Add the category in `config/cmp.php`:**

```
'categories' => [
    'necessary' => [
        'enabled' => true,
        'read_only' => true,
    ],
    'analytics' => [
        'enabled' => true,
        'read_only' => false,
        'auto_clear' => ['/^_ga/', '_gid'],
    ],
    // Add marketing category
    'marketing' => [
        'enabled' => false,           // Pre-toggled OFF (user must opt-in)
        'read_only' => false,
        'auto_clear' => ['/^_fbp/', '/^_gcl/', '/^_fbc/'],  // Facebook, Google Ads cookies
    ],
],
```

**Step 2: Add translations for the new category.**

Publish translations if you haven't already:

```
php artisan vendor:publish --tag=cmp-translations
```

Edit `public/vendor/cmp/translations/en.json` and add a section for marketing:

```
{
    "consentModal": {
        "title": "We use cookies",
        "description": "We use cookies and similar technologies to improve your experience and analyze traffic.",
        "acceptAllBtn": "Accept all",
        "acceptNecessaryBtn": "Reject all",
        "showPreferencesBtn": "Manage preferences"
    },
    "preferencesModal": {
        "title": "Cookie preferences",
        "acceptAllBtn": "Accept all",
        "acceptNecessaryBtn": "Reject all",
        "savePreferencesBtn": "Save preferences",
        "closeIconLabel": "Close",
        "sections": [
            {
                "title": "Necessary cookies",
                "description": "These cookies are essential for the website to function properly.",
                "linkedCategory": "necessary"
            },
            {
                "title": "Analytics cookies",
                "description": "These cookies help us understand how visitors interact with our website.",
                "linkedCategory": "analytics"
            },
            {
                "title": "Marketing cookies",
                "description": "These cookies are used to deliver personalized ads and track ad performance across websites.",
                "linkedCategory": "marketing"
            }
        ]
    }
}
```

> **Note:** Repeat this for each language file (fr.json, de.json, etc.) you want to support.

**Step 3: Load marketing scripts only after consent:**

```

        !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');

```

The `marketing` category automatically maps to `ad_storage` in Google Consent Mode v2.

### Adding Languages

[](#adding-languages)

1. Publish translations: `php artisan vendor:publish --tag=cmp-translations`
2. Create a new JSON file in `public/vendor/cmp/translations/` (e.g., `ja.json`)
3. Add the language code to `supported_languages` in config:

```
'supported_languages' => ['en', 'fr', 'de', 'ja'], // Added Japanese
```

How It Works
------------

[](#how-it-works)

This package supports **two CMP modes** that are automatically selected based on your configuration:

### Mode 1: Google Funding Choices (AdSense Sites)

[](#mode-1-google-funding-choices-adsense-sites)

When `CMP_ADSENSE_ENABLED=true`, the package uses **Google Funding Choices** as the CMP.

```
CMP_ADSENSE_ENABLED=true
CMP_ADSENSE_PUB_ID=pub-XXXXXXXXXX
```

**How it works:**

- Loads Google's official CMP script from `fundingchoicesmessages.google.com`
- Fully managed by Google - design and behavior configured in your [Google AdSense Funding Choices settings](https://fundingchoices.google.com/)
- Required for sites running Google AdSense ads
- Supports TCF 2.0 / IAB framework
- Consent choices sync across Google's ad network
- **Automatic fallback**: In regions where Google doesn't show consent banners (Brazil, South Africa, Thailand, etc.), the package automatically falls back to the Custom CMP to ensure users can still grant consent

**Best for:** Sites monetized with Google AdSense that need Google's certified CMP.

#### Required: Google AdSense Configuration

[](#required-google-adsense-configuration)

For Google Funding Choices to work properly with GA4 and other analytics, you **must enable Consent Mode** in your AdSense account:

1. Go to **Google AdSense** → **Privacy &amp; messaging** → **European regulation** (or GDPR)
2. Enable the following options:
    - **Enable consent mode for advertising purposes**
    - **Enable consent mode for analytics purposes**
3. Save your settings

Without this configuration, the consent signals won't be passed to Google Analytics, and GA4 will never load even after the user grants consent.

> **Note:** You may also need to configure consent messages for other regions (California/CCPA, etc.) depending on your audience.

#### Automatic Fallback for Unsupported Regions

[](#automatic-fallback-for-unsupported-regions)

Google Funding Choices only shows consent banners in specific regions (EU, UK, California, etc.). For users in other regions like Brazil (LGPD), South Africa (POPIA), or Thailand (PDPA), Google returns a "not applicable" status and doesn't show any banner.

This package automatically detects this situation and falls back to the Custom CMP (vanilla-cookieconsent) to show a consent banner. This ensures:

- Users in all regions can grant or deny consent
- Your site remains compliant with privacy regulations worldwide
- GA4 and other analytics can load after consent is granted

This fallback is completely automatic - no additional configuration required.

### Mode 2: Custom CMP (vanilla-cookieconsent)

[](#mode-2-custom-cmp-vanilla-cookieconsent)

When `CMP_ADSENSE_ENABLED=false` (default), the package uses **vanilla-cookieconsent** as a fully customizable CMP.

```
CMP_ADSENSE_ENABLED=false
```

**How it works:**

- Uses the open-source [vanilla-cookieconsent](https://github.com/orestbida/cookieconsent) library
- Fully customizable design via `config/cmp.php` and publishable assets
- Google-like appearance out of the box
- 13 languages included
- Features: Reject All button, floating settings button, legal links, custom categories

**Best for:** Sites without AdSense that want full control over their consent UI.

### Feature Comparison

[](#feature-comparison)

FeatureGoogle Funding ChoicesCustom CMPConfigurationGoogle AdSense dashboard`config/cmp.php`Customizable designLimitedFull controlLanguagesGoogle managed13 included + customReject All buttonGoogle managedConfigurableFloating settings buttonNoYesLegal links (Privacy/Terms)NoYesAdSense compatibleRequiredNot neededTCF 2.0YesNo (Consent Mode v2)Regional coverageEU, UK, California onlyWorldwideAutomatic fallbackFalls back to Custom CMPN/A### Consent Flow

[](#consent-flow)

```
+------------------------------------------------------------------+
|                           PAGE LOAD                              |
+------------------------------------------------------------------+
                               |
                               v
+------------------------------------------------------------------+
|  1. CONSENT MODE DEFAULTS                                        |
|     gtag('consent', 'default', { analytics_storage: 'denied' })  |
+------------------------------------------------------------------+
                               |
                               v
                 +-----------------------------+
                 |   CMP_ADSENSE_ENABLED ?     |
                 +-----------------------------+
                        |             |
                   YES  |             |  NO
                        v             v
          +------------------+  +------------------+
          | Google Funding   |  | Custom CMP       |
          | Choices loads    |  | (cookieconsent)  |
          +------------------+  +------------------+
                        |             |
                        +------+------+
                               |
                               v
+------------------------------------------------------------------+
|  2. CONSENT MODAL SHOWN (first visit)                            |
|     User sees: [Reject All] [Manage Preferences] [Accept All]    |
+------------------------------------------------------------------+
                               |
                               v
+------------------------------------------------------------------+
|  3. USER MAKES CHOICE                                            |
+------------------------------------------------------------------+
                               |
                               v
+------------------------------------------------------------------+
|  4. CONSENT UPDATE                                               |
|     - gtag('consent', 'update', {...})                           |
|     - window.dispatchEvent('consent.update')                     |
+------------------------------------------------------------------+
                               |
                               v
                 +-----------------------------+
                 | analytics_storage granted?  |
                 +-----------------------------+
                        |             |
                   YES  |             |  NO
                        v             v
          +------------------+  +------------------+
          | 5a. GA4 LOADS    |  | 5b. GA4 blocked  |
          | Full tracking    |  | No tracking      |
          +------------------+  +------------------+
                               |
                               v
+------------------------------------------------------------------+
|  6. WIREBOARD (if enabled)                                       |
|     Runs in cookieless mode, can upgrade if consent granted      |
+------------------------------------------------------------------+

```

### About GA4 and Consent

[](#about-ga4-and-consent)

This package loads GA4 only after explicit user consent because:

- GA4 sets cookies and transfers data to Google's servers
- Some EU Data Protection Authorities have raised concerns about Google Analytics
- Loading GA4 after consent provides a safer approach

### About WireBoard Analytics

[](#about-wireboard-analytics)

[WireBoard](https://wireboard.io) is a privacy-focused analytics platform designed for modern web applications. Unlike traditional analytics tools, WireBoard offers:

- **Cookieless mode** - Can run without cookies or local storage for basic analytics
- **Privacy-first architecture** - Designed with privacy regulations in mind
- **Real-time analytics** - See your data as it happens
- **Lightweight** - Minimal impact on page performance

This package supports two loading modes for WireBoard:

**`cookieless_first` (default):**

- Loads immediately in cookieless mode (`useCookies: false`, `useLocalStorage: false`)
- Upgrades to full tracking after user grants consent
- Best for maximum data collection while respecting privacy

**`consent_required`:**

- Only loads after user grants analytics consent
- Full tracking enabled from the start (with consent)
- Best for strict privacy compliance (like GA4)

Learn more at [wireboard.io](https://wireboard.io).

> **Note:** Whether any analytics tool requires consent depends on your specific use case, jurisdiction, and legal interpretation. Consult with a legal professional.

JavaScript Events
-----------------

[](#javascript-events)

Listen for consent changes in your JavaScript:

```
window.addEventListener('consent.update', function(e) {
    console.log('Consent state:', e.detail);
    // e.detail = {
    //   ad_storage: 'denied',
    //   analytics_storage: 'granted',
    //   ad_user_data: 'denied',
    //   ad_personalization: 'denied'
    // }
});
```

Testing
-------

[](#testing)

### Check Which CMP Mode is Active

[](#check-which-cmp-mode-is-active)

```
console.log('CMP type:', window.__cmpType);  // 'google' or 'custom'
```

### Testing Custom CMP (vanilla-cookieconsent)

[](#testing-custom-cmp-vanilla-cookieconsent)

```
// Check consent state
console.log('Consent state:', window.__consentState);
console.log('GA4 loaded:', window.__ga4Loaded);

// Reset consent to see modal again
CookieConsent.reset(true);
location.reload();

// Open preferences modal
CookieConsent.showPreferences();
```

### Testing Google Funding Choices

[](#testing-google-funding-choices)

```
// Check if Google FC is loaded
console.log('Google FC:', typeof window.googlefc);

// Check consent values
if (window.googlefc && window.googlefc.getGoogleConsentModeValues) {
    console.log('Consent:', window.googlefc.getGoogleConsentModeValues());
}

// Note: Google FC consent reset must be done through browser cookie clearing
// or the Google-provided UI
```

### Testing Regional Fallback

[](#testing-regional-fallback)

To test the automatic fallback to Custom CMP (for regions where Google doesn't show banners):

1. Use a VPN to connect from Brazil, South Africa, Thailand, or another unsupported region
2. Visit your site - you should see the Custom CMP banner instead of Google's
3. Check the console for CMP type:

```
// Should show 'custom' when fallback is active
console.log('CMP type:', window.__cmpType);

// Check if fallback was triggered
console.log('Custom CMP initialized:', window.__customCMPInitialized);
```

**Expected behavior by region:**

RegionCMP ShownEU/UKGoogle Funding ChoicesCaliforniaGoogle Funding ChoicesBrazilCustom CMP (fallback)South AfricaCustom CMP (fallback)Other regionsCustom CMP (fallback)### Verify Analytics Loading

[](#verify-analytics-loading)

```
// Check if GA4 loaded after consent
console.log('GA4 loaded:', window.__ga4Loaded);
console.log('Has _ga cookie:', document.cookie.includes('_ga'));
```

Building Assets (Development)
-----------------------------

[](#building-assets-development)

If you need to rebuild the minified assets:

```
cd vendor/wireboard/laravel-cmp

# Install dependencies
npm install

# Build for production (minified)
npm run build

# Build for development (not minified)
npm run dev

# Watch for changes
npm run watch
```

Facade
------

[](#facade)

You can also use the facade in your code:

```
use Wireboard\Cmp\Facades\Cmp;

if (Cmp::isEnabled()) {
    // CMP is active
}

if (Cmp::isGa4Enabled()) {
    $measurementId = Cmp::getGa4MeasurementId();
}

$config = Cmp::getConfig();
```

Version
-------

[](#version)

v1.3.0

Credits
-------

[](#credits)

This package includes the following open-source software:

- **[vanilla-cookieconsent](https://github.com/orestbida/cookieconsent)** by Orest Bida - MIT License

License
-------

[](#license)

MIT License - see [LICENSE](LICENSE) for full details including third-party licenses.

This is open-source software. You are free to use, modify, and distribute it under the terms of the MIT License.

###  Health Score

40

—

FairBetter than 87% of packages

Maintenance89

Actively maintained with recent releases

Popularity9

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~3 days

Total

5

Last Release

86d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/1b2ca267125f1e8ad937ec8e4f3e67d73977860934a6af1080ca7c02c65a60f4?d=identicon)[wireboard](/maintainers/wireboard)

---

Top Contributors

[![ligoo](https://avatars.githubusercontent.com/u/2145088?v=4)](https://github.com/ligoo "ligoo (7 commits)")

---

Tags

laravelanalyticsgdprprivacycookie-consentconsentTCFga4cmpwireboard

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/wireboard-laravel-cmp/health.svg)

```
[![Health](https://phpackages.com/badges/wireboard-laravel-cmp/health.svg)](https://phpackages.com/packages/wireboard-laravel-cmp)
```

###  Alternatives

[statikbe/laravel-cookie-consent

Cookie consent modal for EU

213396.7k](/packages/statikbe-laravel-cookie-consent)[olssonm/l5-very-basic-auth

Laravel stateless HTTP basic auth without the need for a database

1662.5M1](/packages/olssonm-l5-very-basic-auth)[devrabiul/laravel-cookie-consent

A GDPR-compliant cookie consent solution for Laravel applications with fully customizable cookie banners, granular consent control, and enterprise-grade compliance features.

17633.8k1](/packages/devrabiul-laravel-cookie-consent)[scaler-tech/laravel-saml2

SAML2 Service Provider integration for Laravel applications, based on OneLogin toolkit

2737.5k](/packages/scaler-tech-laravel-saml2)[truckersmp/steam-socialite

Laravel Socialite provider for Steam OpenID.

1516.7k](/packages/truckersmp-steam-socialite)[pschocke/laravel-telegram-login-widget

Easily integrate Telegrams login widget into your Laravel application to send Telegram messages

1610.4k](/packages/pschocke-laravel-telegram-login-widget)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
