PHPackages                             br33f/php-ga4-mp - 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. [API Development](/categories/api)
4. /
5. br33f/php-ga4-mp

ActiveLibrary[API Development](/categories/api)

br33f/php-ga4-mp
================

PHP GoogleAnalytics4 Measurement Protocol Library

v0.1.6(5mo ago)961.3M↓11.1%19[11 issues](https://github.com/br33f/php-GA4-Measurement-Protocol/issues)[1 PRs](https://github.com/br33f/php-GA4-Measurement-Protocol/pulls)6MITPHPPHP &gt;=7.3

Since Jun 25Pushed 5mo ago5 watchersCompare

[ Source](https://github.com/br33f/php-GA4-Measurement-Protocol)[ Packagist](https://packagist.org/packages/br33f/php-ga4-mp)[ RSS](/packages/br33f-php-ga4-mp/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (7)Dependencies (4)Versions (8)Used By (6)

Google Analytics 4 Measurement Protocol PHP Library
===================================================

[](#google-analytics-4-measurement-protocol-php-library)

[![Coverage Status](https://camo.githubusercontent.com/c709864138bb970bc59024826ff77e727a2619654e59fcc33e125c0c35e36f7e/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f62723333662f7068702d4741342d4d6561737572656d656e742d50726f746f636f6c2f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/br33f/php-GA4-Measurement-Protocol?branch=master)[![PHP Version Require](https://camo.githubusercontent.com/72c1710d90ef10e16f19215815bb38ee545befbc7732c60a2776bdb6e7a40aff/68747470733a2f2f706f7365722e707567782e6f72672f62723333662f7068702d6761342d6d702f726571756972652f706870)](https://packagist.org/packages/br33f/php-ga4-mp)[![Latest Stable Version](https://camo.githubusercontent.com/bbeee5bdce6779128004cc7fa962873bbea6d5720f98ba14140e841412ec30c6/68747470733a2f2f706f7365722e707567782e6f72672f62723333662f7068702d6761342d6d702f76)](https://packagist.org/packages/br33f/php-ga4-mp)[![Total Downloads](https://camo.githubusercontent.com/59664567eae6f111b3c46b4dca90d33f3363941e7e9aa66288f7e860c964dae1/68747470733a2f2f706f7365722e707567782e6f72672f62723333662f7068702d6761342d6d702f646f776e6c6f616473)](https://packagist.org/packages/br33f/php-ga4-mp)

Overview
--------

[](#overview)

This is a PHP Library facilitating the use of Google Analytics 4 (GA4) Measurement Protocol. Measurement Protocol allows developers to send events directly from server-side PHP to Google Analytics.

Full documentation is available here:

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

[](#requirements)

- PHP &gt;= 7.3
- ext-json
- guzzlehttp/guzzle: ^6.5.5 || ^7.0.0

dev:

- phpunit/phpunit: "^9.5"
- fakerphp/faker: "^1.14"

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

[](#installation)

The recommended way to install this library is via [Composer](https://getcomposer.org/ "Composer") (packagist package: [br33f/php-ga4-mp](https://packagist.org/packages/br33f/php-ga4-mp "br33f/php-ga4-mp")).

Install by composer command:

```
composer require br33f/php-ga4-mp

```

or `package.json`

```
{
    "require": {
        "br33f/php-ga4-mp": "^0.1.0"
    }
}

```

Usage
-----

[](#usage)

### Send View Item Event

[](#send-view-item-event)

```
use Br33f\Ga4\MeasurementProtocol\Service;
use Br33f\Ga4\MeasurementProtocol\Dto\Request\BaseRequest;
use Br33f\Ga4\MeasurementProtocol\Dto\Event\ViewItemEvent;
use Br33f\Ga4\MeasurementProtocol\Dto\Parameter\ItemParameter;

// Create service instance
$ga4Service = new Service('MEASUREMENT_PROTOCOL_API_SECRET');
$ga4Service->setMeasurementId('MEASUREMENT_ID');

// Create base request
$baseRequest = new BaseRequest();
$baseRequest->setClientId('CLIENT_ID');

// Create Event Data
$viewItemEventData = new ViewItemEvent();
$viewItemEventData
    ->setValue(51.10)
    ->setCurrency('EUR');

// Create Item
$viewedItem = new ItemParameter();
$viewedItem
    ->setItemId('ITEM_ID')
    ->setItemName('ITEM_NAME')
    ->setPrice(25.55)
    ->setQuantity(2);

// Add this item to viewItemEventData
$viewItemEventData->addItem($viewedItem);

// Add event to base request (you can add up to 25 events to single request)
$baseRequest->addEvent($viewItemEventData);

// We have all the data we need. Just send the request.
$ga4Service->send($baseRequest);
```

### Send Purchase Event

[](#send-purchase-event)

```
use Br33f\Ga4\MeasurementProtocol\Service;
use Br33f\Ga4\MeasurementProtocol\Dto\Request\BaseRequest;
use Br33f\Ga4\MeasurementProtocol\Dto\Event\PurchaseEvent;
use Br33f\Ga4\MeasurementProtocol\Dto\Parameter\ItemParameter;

// Create service instance
$ga4Service = new Service('MEASUREMENT_PROTOCOL_API_SECRET');
$ga4Service->setMeasurementId('MEASUREMENT_ID');

// Create base request
$baseRequest = new BaseRequest();
$baseRequest->setClientId('CLIENT_ID');

// Create Event Data
$purchaseEventData = new PurchaseEvent();
$purchaseEventData
    ->setValue(250.00)
    ->setCurrency('USD');

// Create Item
$purchasedItem1 = new ItemParameter();
$purchasedItem1
    ->setItemId('FIRST_ITEM_ID')
    ->setItemName('FIRST_ITEM_NAME')
    ->setPrice(100.00)
    ->setQuantity(2);

// Add this item to purchaseEventData
$purchaseEventData->addItem($purchasedItem1);

// You can also fill item data via constructor
$purchaseEventData->addItem(new ItemParameter([
    'item_id' => 'SECOND_ITEM_ID',
    'item_name' => 'SECOND_ITEM_NAME',
    'price' => 50.00,
    'quantity' => 1
]));

// Add event to base request (you can add up to 25 events to single request)
$baseRequest->addEvent($purchaseEventData);

// We have all the data we need. Just send the request.
$ga4Service->send($baseRequest);
```

At the moment, the library contains the defined structures of the following events:

Event nameStructureDocumentationadd\_payment\_infoAddPaymentInfoEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#add_payment_info)add\_shipping\_infoAddShippingInfoEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#add_shipping_info)add\_to\_cartAddToCartEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#add_to_cart)add\_to\_wishlistAddToWishlistEvent[see documentation](https://developers.google.com/analytics/devguides/collection/ga4/reference/events?hl=fr&client_type=gtag#add_to_wishlist)begin\_checkoutBeginCheckoutEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#begin_checkout)loginLoginEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#login)purchasePurchaseEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#purchase)refundRefundEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#refund)remove\_from\_cartRemoveFromCartEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#remove_from_cart)searchSearchEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#search)select\_itemSelectItemEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#select_item)sign\_upSignUpEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#sign_up)view\_cartViewCartEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#view_cart)view\_itemViewItemEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#view_item)view\_search\_resultsViewSearchResultsEvent[see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#view_search_results)These events are sent analogously to the examples presented above.

### Other events

[](#other-events)

In order to send any event one can use `BaseEvent` structure and add any data. Please note that specific event structure should be used instead if already defined, since BaseEvent does not force any structure or provide data validation.

```
use Br33f\Ga4\MeasurementProtocol\Service;
use Br33f\Ga4\MeasurementProtocol\Dto\Request\BaseRequest;
use Br33f\Ga4\MeasurementProtocol\Dto\Event\BaseEvent;

// Create Service and request same as above
// ...

// Create Base Event Data (for example: 'share' event - https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events#share)
$eventName = 'share';
$anyEventData = new BaseEvent($eventName);
$anyEventData
    ->setMethod('Twitter')
    ->setContentType('Post')
    ->setItemId('example_item_id')
    ->setAnyParamYouWish('test'); // means 'any_param_you_wish' is set

// Add event to base request (you can add up to 25 events to single request) and send, same as above
// ...
```

### Firebase Support

[](#firebase-support)

It is possible to use this library to send Firebase events. To do so, just initialize Service and BaseRequest as in following example:

```
use Br33f\Ga4\MeasurementProtocol\Service;
use Br33f\Ga4\MeasurementProtocol\Dto\Request\BaseRequest;

// Create service instance
$ga4Service = new Service('MEASUREMENT_PROTOCOL_API_SECRET');
$ga4Service->setFirebaseId('FIREBASE_APP_ID'); // instead of setMeasurementId(...)

// Create base request
$baseRequest = new BaseRequest();
$baseRequest->setAppInstanceId('APP_INSTANCE_ID'); // instead of setClientId(...)
```

### Consent mode v2

[](#consent-mode-v2)

This library supports consent mode v2 : [see documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference?client_type=firebase#payload_consent)

```
use Br33f\Ga4\MeasurementProtocol\Dto\Request\BaseRequest;
use Br33f\Ga4\MeasurementProtocol\Dto\Common\ConsentProperty;
use Br33f\Ga4\MeasurementProtocol\Enum\ConsentCode;

// Create consent property with :
// - ad_user_data = GRANTED
// - ad_personalization = DENIED
$consent = new ConsentProperty();
$consent->setAdUserData(ConsentCode::GRANTED);
$consent->setAdPersonalization(ConsentCode::DENIED);

// Create base request
$baseRequest = new BaseRequest();
$baseRequest->setConsent($consent);
```

This mode replaces now obsolete / deprecated `non_personalized_ads` :

```
$baseRequest = new BaseRequest();
$baseRequest->setNonPersonalizedAds(true);

// Is replaced by :

$consent = new ConsentProperty();
$consent->setAdPersonalization(ConsentCode::GRANTED);
$baseRequest->setConsent($consent);
```

Debug event data and requests
-----------------------------

[](#debug-event-data-and-requests)

Debuging event data is possible by sending them to debug endpoint (Measurement Protocol Validation Server), since default endpoint for Google Analytics 4 Measurement Protocol does not return any HTTP error codes or messages. In order to validate event one should use `sendDebug($request)` method instead of `send($request)`.

Method `sendDebug($request)` returns `DebugResponse` object, which is hydrated with response data such as: `status_code` and `validation_messages`.

### Example:

[](#example)

```
use Br33f\Ga4\MeasurementProtocol\Service;
use Br33f\Ga4\MeasurementProtocol\Dto\Request\BaseRequest;
use Br33f\Ga4\MeasurementProtocol\Dto\Event\AddToCartEvent;
use Br33f\Ga4\MeasurementProtocol\Dto\Parameter\ItemParameter;

// Create service instance
$ga4Service = new Service('MEASUREMENT_PROTOCOL_API_SECRET');
$ga4Service->setMeasurementId('MEASUREMENT_ID');

// Create base request
$baseRequest = new BaseRequest();
$baseRequest->setClientId('CLIENT_ID');

// Create Invalid Event Data
$addToCartEventData = new AddToCartEvent();
$addToCartEventData
    ->setValue(99.99)
    ->setCurrency('SOME_INVALID_CURRENCY_CODE'); // invalid currency code

// addItem
$addToCartEventData->addItem(new ItemParameter([
    'item_id' => 'ITEM_ID',
    'item_name' => 'ITEM_NAME',
    'price' => 99.99,
    'quantity' => 1
]));

// Add event to base request (you can add up to 25 events to single request)
$baseRequest->addEvent($addToCartEventData);

// Instead of sending data to production Measurement Protocol endpoint
// $ga4Service->send($baseRequest);
// Send data to validation endpoint, which responds with status cude and validation messages.
$debugResponse = $ga4Service->sendDebug($baseRequest);

// Now debug response contains status code, and validation messages if request is invalid
var_dump($debugResponse->getStatusCode());
var_dump($debugResponse->getValidationMessages());
```

Get response as stream
----------------------

[](#get-response-as-stream)

It is possible to get response as stream. This is useful when you want to process response further and you don't want the stream to be consumed in BaseResponse.

Method `sendStream($request)` returns `StreamResponse` object, which is hydrated with response data such as: `status_code` (just as usual) and `body` which is a stream resource.

### Example:

[](#example-1)

```
use Br33f\Ga4\MeasurementProtocol\Service;
use Br33f\Ga4\MeasurementProtocol\Dto\Request\BaseRequest;
use Br33f\Ga4\MeasurementProtocol\Dto\Event\AddToCartEvent;
use Br33f\Ga4\MeasurementProtocol\Dto\Parameter\ItemParameter;

// Create service instance
$ga4Service = new Service('MEASUREMENT_PROTOCOL_API_SECRET');
$ga4Service->setMeasurementId('MEASUREMENT_ID');

// Create base request
$baseRequest = new BaseRequest();
$baseRequest->setClientId('CLIENT_ID');

// Create Invalid Event Data
$addToCartEventData = new AddToCartEvent();
$addToCartEventData
    ->setValue(99.99)
    ->setCurrency('SOME_INVALID_CURRENCY_CODE'); // invalid currency code

// addItem
$addToCartEventData->addItem(new ItemParameter([
    'item_id' => 'ITEM_ID',
    'item_name' => 'ITEM_NAME',
    'price' => 99.99,
    'quantity' => 1
]));

// Add event to base request (you can add up to 25 events to single request)
$baseRequest->addEvent($addToCartEventData);

// Instead of $ga4Service->send($baseRequest);
// That way we can get response as stream in StreamResponse class body property
$streamResponse = $ga4Service->sendStream($baseRequest);

var_dump($debugResponse->getBody());
```

Unit Testing
------------

[](#unit-testing)

Unit Testing for this module is done using PHPUnit 9.

Running unit tests:

```
composer install
php vendor/bin/phpunit

```

License
-------

[](#license)

This library is released under the MIT License.

###  Health Score

51

—

FairBetter than 96% of packages

Maintenance69

Regular maintenance activity

Popularity56

Moderate usage in the ecosystem

Community30

Small or concentrated contributor base

Maturity41

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 61.3% 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 ~271 days

Recently: every ~300 days

Total

7

Last Release

162d ago

PHP version history (2 changes)v0.1.0PHP &gt;=7.1

v0.1.6PHP &gt;=7.3

### Community

Maintainers

![](https://www.gravatar.com/avatar/d9012b4f2f18ee29850ce9e85cc9f7f60650ac5e74a4d2b9daa55d17b2c99375?d=identicon)[br33f](/maintainers/br33f)

---

Top Contributors

[![br33f](https://avatars.githubusercontent.com/u/14214995?v=4)](https://github.com/br33f "br33f (46 commits)")[![AlexisPPLIN](https://avatars.githubusercontent.com/u/82219937?v=4)](https://github.com/AlexisPPLIN "AlexisPPLIN (8 commits)")[![DerManoMann](https://avatars.githubusercontent.com/u/47783?v=4)](https://github.com/DerManoMann "DerManoMann (6 commits)")[![bradjones1](https://avatars.githubusercontent.com/u/981966?v=4)](https://github.com/bradjones1 "bradjones1 (4 commits)")[![w1cerg](https://avatars.githubusercontent.com/u/5260476?v=4)](https://github.com/w1cerg "w1cerg (2 commits)")[![mm-sam](https://avatars.githubusercontent.com/u/10527951?v=4)](https://github.com/mm-sam "mm-sam (2 commits)")[![roelvanduijnhoven](https://avatars.githubusercontent.com/u/91910?v=4)](https://github.com/roelvanduijnhoven "roelvanduijnhoven (2 commits)")[![uncle-roma](https://avatars.githubusercontent.com/u/84439111?v=4)](https://github.com/uncle-roma "uncle-roma (1 commits)")[![denisdulici](https://avatars.githubusercontent.com/u/5254835?v=4)](https://github.com/denisdulici "denisdulici (1 commits)")[![theeldarka](https://avatars.githubusercontent.com/u/39298674?v=4)](https://github.com/theeldarka "theeldarka (1 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (1 commits)")[![Luxato](https://avatars.githubusercontent.com/u/15067643?v=4)](https://github.com/Luxato "Luxato (1 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/br33f-php-ga4-mp/health.svg)

```
[![Health](https://phpackages.com/badges/br33f-php-ga4-mp/health.svg)](https://phpackages.com/packages/br33f-php-ga4-mp)
```

###  Alternatives

[tencentcloud/tencentcloud-sdk-php

TencentCloudApi php sdk

3731.2M42](/packages/tencentcloud-tencentcloud-sdk-php)[convertkit/convertkitapi

Kit PHP SDK for the Kit API

2167.1k1](/packages/convertkit-convertkitapi)[mapado/rest-client-sdk

Rest Client SDK for hydra API

1125.9k2](/packages/mapado-rest-client-sdk)

PHPackages © 2026

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