mixpanel/mixpanel-php
Official Mixpanel PHP library for tracking events and updating user profiles. Send server-side analytics data (events, people, groups) to Mixpanel using a simple API, with support for batching, async transport options, and configurable endpoints.
Installation
composer require mixpanel/mixpanel-php
Add the service provider and facade to config/app.php:
'providers' => [
// ...
Mixpanel\Mixpanel::class,
],
'aliases' => [
// ...
'Mixpanel' => Mixpanel\Facades\Mixpanel::class,
],
Configuration Publish the config file:
php artisan vendor:publish --provider="Mixpanel\MixpanelServiceProvider"
Update .env with your Mixpanel API token:
MIXPANEL_TOKEN=your_api_token_here
First Event Track a user's first action (e.g., login):
use Mixpanel\Facades\Mixpanel;
$userId = 'user123';
$properties = [
'$first_name' => 'John',
'$email' => 'john@example.com',
'plan' => 'premium',
];
Mixpanel::track($userId, 'Login', $properties);
Verify in Mixpanel
Check the Events tab in your Mixpanel dashboard for the Login event.
config/mixpanel.php): Adjust timeout, proxy, or batch settings.track(), identify(), people_set(), people_increment() (see API Reference).// Track a custom event (e.g., "Checkout Started")
Mixpanel::track('user123', 'Checkout Started', [
'items' => 3,
'value' => 99.99,
'device' => 'mobile',
]);
// Set core user traits (runs `$identify`)
Mixpanel::identify('user123', [
'$first_name' => 'Jane',
'$email' => 'jane@example.com',
'account_created' => '2023-01-01',
]);
// Update a single property (e.g., plan upgrade)
Mixpanel::people_set('user123', 'plan', 'enterprise');
// Increment a numeric property (e.g., "lifetime_value")
Mixpanel::people_increment('user123', 'lifetime_value', 50.00);
// Append to a list (e.g., "purchased_items")
Mixpanel::people_append('user123', 'purchased_items', 'product_456');
Enable batching in config/mixpanel.php:
'batch' => [
'enabled' => true,
'max_events' => 100,
'flush_interval' => 60, // seconds
],
Middleware for Auto-Tracking
Attach to kernel.php to track requests:
Mixpanel::track('user123', 'Page View', [
'page' => request()->path(),
'referrer' => request()->header('referer'),
]);
Event Service Providers
Dispatch events (e.g., UserRegistered) and track them:
event(new UserRegistered($user));
// In listener:
Mixpanel::track($user->id, 'User Registered', ['source' => 'email']);
Queue Workers for Async Tracking
Offload tracking to a queue (e.g., trackEvent job):
dispatch(new TrackEventJob($userId, 'Video Watched', $properties));
| Use Case | Example Code |
|---|---|
| Feature Flags | Mixpanel::track('user123', 'Feature:Dark Mode', ['enabled' => true]) |
| A/B Testing | Mixpanel::track('user123', 'Experiment:Navbar', ['variant' => 'B']) |
| Error Tracking | Mixpanel::track('user123', 'Error:Checkout', ['error' => $e->getMessage()]) |
Rate Limits
Duplicate Events
track() calls (e.g., in middleware + controller).if (!Mixpanel::hasTracked($userId, 'Login', $properties)) {
Mixpanel::track($userId, 'Login', $properties);
}
Property Size Limits
json_encode()).Async Delays
flush_interval seconds to appear).Mixpanel::flush() to force-sync critical events.Mixpanel::setDebug(true); // Logs requests to `storage/logs/mixpanel.log`
try-catch:
try {
Mixpanel::track($userId, 'Event');
} catch (\Exception $e) {
Log::error("Mixpanel error: " . $e->getMessage());
}
$properties = json_decode(json_encode($properties), true);
Custom HTTP Client
Override the default Guzzle client in MixpanelServiceProvider:
$this->app->singleton('mixpanel.client', function () {
return new \GuzzleHttp\Client(['timeout' => 30]);
});
Event Transformers Pre-process events before sending:
Mixpanel::extend(function ($tracker) {
$tracker->beforeTrack(function ($event) {
$event['properties']['env'] = app()->environment();
});
});
Webhook Fallback For critical events, duplicate to a webhook:
$response = Mixpanel::track($userId, 'Payment Success', $properties);
if (!$response->success()) {
Http::post('https://your-fallback-webhook.com', $properties);
}
'timeout' => 10,
'proxy' => [
'http' => 'http://proxy.example.com:8080',
'https' => 'http://proxy.example.com:8080',
],
'verify_ssl' => false,
How can I help you explore Laravel packages today?