.NET Backend SDK
The Hyppot .NET Backend SDK enables server-side feature experimentation in your .NET applications. This approach is ideal for backend logic, API behavior changes, and ensuring consistent cross-client experiences.
Installation and configuration
In-process installation via Hyppot.AspnetCore
If Hyppot is hosted in-process within your ASP.NET Core application using Hyppot.AspNetCore, interfaces are already configured and registered in .NET ServiceCollection. No additional configuration needed.
SDK configuration
If you want to access Hyppot from a different .Net application (e.g. a different app module or a Docker-hosted Hyppot instance), you need to install and configure Hyppot.Sdk package:
- install
Hyppot.Sdkin your .Net application - go to "Configuration" tab in your Hyppot Administrative interface and generate the new API key,
- in your IoC configuration (typically your
Program.cs), add the following code to register SDK and provide the generated API key:using Hyppot.Sdk;
// ...
services.AddHyppotSdk(cfg =>
{
cfg.BaseUrl = "https://address.to.your.hyppot.instance";
cfg.ApiKey = "key_Xyz...";
// cfg.PathPrefix = "/custom-prefix"; // if different than default
})
// ...
Basic Usage
Dependency Injection
After you have configured Hyppot, you can resolve IRolloutResolver and IRolloutTracker from IoC container:
// Services are available through DI
public class MyController : ControllerBase
{
private readonly IRolloutResolver _resolver;
private readonly IRolloutTracker _tracker;
public MyController(
IRolloutResolver resolver,
IRolloutTracker tracker)
{
_resolver = resolver;
_tracker = tracker;
}
}
Resolving Feature Toggles
Use IRolloutResolver to resolve feature toggles for a user. Feature toggles always return a VariantInstance (never null). If the user is outside of the toggle audience, the resolver returns the Off variant with the toggle’s off-configuration.
using Hyppot.Definition;
using Hyppot.Definition.Audience;
using Hyppot.Definition.Variables;
using Hyppot.Resolving;
// Resolve a specific feature toggle for a user
var toggle = await _resolver.ResolveFeatureToggleAsync(
new RolloutId("new-checkout"),
new UserId("user-123"));
// Check whether the feature is enabled for this user
if (toggle.IsActiveFeature)
{
// Read variables from the toggle's "On" configuration
var buttonColor = toggle.Variables
.First(v => v.Name == new VariableName("button-color"))
.Value.Get<string>();
// Use values in your logic
return new FeatureResponse
{
ButtonColor = buttonColor
};
}
else
{
// Fallback when feature is off for the user
return new FeatureResponse
{
ButtonColor = "gray"
};
}
Notes:
ResolveFeatureToggleAsyncthrows if the feature toggle does not exist.- Feature toggles do not produce impressions; impression tracking applies to experiments.
Resolving Experiments
Use IRolloutResolver to get experiment variants for users:
// Resolve a specific experiment for a user
var experiment = _resolver.ResolveExperimentAsync(
new RolloutId("button-color-test"),
new UserId("user-123"));
if (experiment != null)
{
// Get variable values
var buttonColor = experiment.Variables
.First(v => v.Name == new VariableName("button-color"))
.Value.Get<string>();
// Use the values in your logic
return new FeatureResponse
{
ButtonColor = buttonColor,
};
}
Tracking Events
Impression Tracking
Track when users are exposed to experiment variants:
// Track impression when user sees the experiment
await _tracker.TrackImpressionAsync(
Impression.Create(
new RolloutId("button-color-test"),
new VariantId("red-variant"),
new UserId("user-123"),
DateTime.UtcNow
));
// Track impression with deduplication key
await _tracker.TrackImpressionAsync(
Impression.Create(
new RolloutId("button-color-test"),
new VariantId("red-variant"),
new UserId("user-123"),
DateTime.UtcNow,
deduplicationKey: "page-view-123"
));
Conversion Tracking
Track user actions as conversions:
// Track simple conversion
await _tracker.TrackConversionAsync(
Conversion.Create(
"button-click",
DateTime.UtcNow,
new UserId("user-123")
));
// Track conversion with metrics
var metrics = new VariableInstance[]
{
new VariableInstance(
new VariableName("revenue"),
new VariableValue<double>(125.50)
),
new VariableInstance(
new VariableName("product-category"),
new VariableValue<string>("electronics")
),
new VariableInstance(
new VariableName("is-premium"),
new VariableValue<bool>(true)
)
};
await _tracker.TrackConversionAsync(
Conversion.Create(
"purchase-completed",
DateTime.UtcNow,
new UserId("user-123"),
deduplicationKey: "order-456",
metrics: metrics
));
User aliasing
When the same person can have multiple identities (e.g. anonymous and logged-in), use user aliasing so Hyppot treats them as one user for contamination detection and excludes contaminated impressions from statistics. Inject IUserAliasService and call it when you know two IDs belong to the same person:
// After login: link anonymous and logged-in IDs
await _userAliasService.AliasUsersAsync(
new[] { new UserId(anonymousId), new UserId(loggedInUserId) });
// Optional: keep aliases until a specific date (e.g. experiment end)
await _userAliasService.AliasUsersAsync(
new[] { new UserId(anonymousId), new UserId(loggedInUserId) },
keepAtLeastUntil: experimentEndDate);
See Contaminated data cleanup for the full guide and API details.
Best Practices
- Always provide fallbacks - Never let experiments break your application
- Use dependency injection - Leverage ASP.NET Core's built-in DI
- Track impressions early - Track when users are exposed to experiments
- Validate experiment data - Don't trust experiment variables blindly
- Handle errors gracefully - Log errors but don't fail the user experience
Next Steps
- Create experiments - Learn how to set up A/B tests in the admin panel
- JavaScript SDK - Add frontend experiments to complement backend tests
- Configuration - Fine-tune your Hyppot setup