Official Piwik PRO .NET SDK — the complete package. Installs both PiwikPRO.Analytics (fluent query builder, reporting, sessions, real-time events, goals) and PiwikPRO.Tracking (server-side event tracking, JavaScript snippet generation) with all dependencies. The easiest way to integrate Piwik PRO analytics and tracking into your .NET 8 application.
$ dotnet add package PiwikPROThe official Piwik PRO .NET SDK — the complete package. This meta-package installs everything you need to integrate Piwik PRO analytics and tracking into your .NET 8 application.
dotnet add package PiwikPRO
This installs both PiwikPRO.Analytics and PiwikPRO.Tracking (which include PiwikPRO.Core automatically).
Tip: If you only need analytics or only tracking, install the individual packages to keep your dependency footprint smaller.
You need credentials from your Piwik PRO instance:
using PiwikPRO.Analytics.Extensions;
using PiwikPRO.Tracking.Extensions;
var builder = WebApplication.CreateBuilder(args);
// Register analytics services (query builder, sessions, real-time events, goals)
builder.Services.AddPiwikProAnalytics(options =>
{
options.BaseUrl = "https://your-instance.piwik.pro";
options.ClientId = "your-client-id";
options.ClientSecret = "your-client-secret";
options.WebSiteId = "your-website-id";
});
// Register tracking services (server-side tracking, JS code generation)
builder.Services.AddPiwikProTracking(options =>
{
options.BaseUrl = "https://your-instance.piwik.pro";
options.ClientId = "your-client-id";
options.ClientSecret = "your-client-secret";
options.WebSiteId = "your-website-id";
});
using PiwikPRO.Analytics;
using PiwikPRO.Analytics.Constants;
public class DashboardService
{
private readonly IAnalyticsService _analytics;
public DashboardService(IAnalyticsService analytics) => _analytics = analytics;
public async Task<QueryResponse> GetVisitorsByDate()
{
return await _analytics.QueryAsync(builder =>
builder.AddDimension(Dimensions.Date.DateDimension)
.AddMetric(Metrics.Sessions.Visitors)
.AddMetric(Metrics.Pages.PageViews)
.SetLastDays(30)
.OrderByDescending(Metrics.Sessions.Visitors)
.Limit(100));
}
}
using PiwikPRO.Tracking;
public class EventService
{
private readonly ITrackingService _tracking;
public EventService(ITrackingService tracking) => _tracking = tracking;
public async Task TrackPurchase()
{
await _tracking.TrackPageViewAsync(
url: "https://example.com/checkout/complete",
actionName: "Purchase Complete");
await _tracking.TrackGoalAsync(goalId: "purchase-goal", revenue: 99.99m);
}
}
using PiwikPRO.Tracking;
var trackingCode = codeGenerator.GenerateTrackingCode();
var tagManagerCode = codeGenerator.GenerateTagManagerTrackingCode();
| Property | Type | Default | Description |
|---|---|---|---|
BaseUrl | string | Required | Your Piwik PRO instance URL |
ClientId | string | — | OAuth client ID |
ClientSecret | string | — | OAuth client secret |
AccessToken | string? | — | Static access token (alternative to OAuth) |
WebSiteId | string? | — | Default website ID (can be overridden per query) |
TimeoutSeconds | int | 30 | HTTP request timeout |
EnableRateLimitHandling | bool | true | Automatic retry on HTTP 429 and 5xx errors |
MaxRetryAttempts | int | 3 | Maximum retry attempts |
RetryDelaySeconds | int | 2 | Base delay between retries (exponential backoff) |
MaxRetryDelaySeconds | int | 30 | Maximum delay between retries |
Dimensions.*) and metrics (Metrics.*)DateRangeUtilities.LastDays(30), .CurrentMonth(), .CurrentQuarter(), etc.WhereContains, WhereIn, WhereEquals and moreSum, Average, Min, Max, UniqueCountIAsyncEnumerable support for large datasetsRetry-After headers| Package | Description |
|---|---|
| PiwikPRO.Analytics | Analytics and reporting only |
| PiwikPRO.Tracking | Server-side tracking only |
| PiwikPRO.Core | Core infrastructure only |