Skip to content

Configuration Reference — Provider Options, Health Checks & Telemetry

This page documents all configuration options, health checks, and OpenTelemetry instrumentation for the notification engine and its providers.

{
"Notifications": {
"MaxParallelDeliveries": 8
}
}
PropertyDefaultDescription
MaxParallelDeliveries8Max concurrent delivery messages (Wolverine queue parallelism)
{
"Notifications": {
"Email": {
"Provider": "Smtp",
"SenderAddress": "[email protected]",
"SenderName": "Clinic Portal"
}
}
}
{
"Notifications": {
"Smtp": {
"Host": "smtp.example.com",
"Port": 587,
"UseSsl": true,
"Username": "user",
"Password": "vault:secret/data/smtp#password",
"TimeoutSeconds": 30
}
}
}
{
"Notifications": {
"Brevo": {
"ApiKey": "vault:secret/data/brevo#api-key",
"DefaultSenderEmail": "[email protected]",
"DefaultSenderName": "Clinic Portal",
"DefaultSmsSenderId": "CLINIC",
"BaseUrl": "https://api.brevo.com/v3",
"TimeoutSeconds": 30
}
}
}
{
"Notifications": {
"Email": {
"SendGrid": {
"ApiKey": "vault:secret/data/sendgrid#api-key",
"DefaultSenderEmail": "[email protected]",
"DefaultSenderName": "Clinic Portal",
"SandboxMode": false,
"TimeoutSeconds": 30
}
}
}
}
{
"Notifications": {
"Twilio": {
"AccountSid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"AuthToken": "vault:secret/data/twilio#auth-token",
"DefaultSmsFrom": "+15551234567",
"DefaultWhatsAppFrom": "whatsapp:+14155238886",
"MessagingServiceSid": null,
"TimeoutSeconds": 30
}
}
}
{
"Notifications": {
"Sms": {
"Provider": "Brevo",
"SenderId": "CLINIC"
}
}
}
{
"Notifications": {
"MobilePush": {
"Provider": "GoogleFcm",
"GoogleFcm": {
"ProjectId": "my-firebase-project",
"ServiceAccountJson": "vault:secret/data/fcm#service-account",
"BaseAddress": "https://fcm.googleapis.com/",
"TimeoutSeconds": 30
}
}
}
}
{
"AzureCommunicationServices": {
"Email": {
"ConnectionString": "endpoint=...;accesskey=...",
"SenderAddress": "[email protected]",
"TimeoutSeconds": 120
}
}
}
{
"AzureCommunicationServices": {
"Sms": {
"ConnectionString": "endpoint=...;accesskey=...",
"FromPhoneNumber": "+15551234567",
"TimeoutSeconds": 30
}
}
}
{
"Notifications": {
"Sms": {
"AwsSns": {
"Region": "eu-west-1",
"SenderId": "MYAPP",
"SmsType": "Transactional",
"TimeoutSeconds": 30
}
}
}
}
PropertyDefaultDescription
RegionAWS region (required)
SenderIdnullAlphanumeric sender ID (1-11 chars, region-dependent)
SmsType"Transactional""Transactional" or "Promotional"
OriginationNumbernullE.164 originating number
AccessKeyIdnullAWS access key (uses default credential chain when null)
SecretAccessKeynullAWS secret key (required if AccessKeyId set)
{
"Notifications": {
"MobilePush": {
"AwsSns": {
"Region": "eu-west-1",
"PlatformApplicationArn": "arn:aws:sns:eu-west-1:123456789:app/GCM/my-app",
"TimeoutSeconds": 30
}
}
}
}
PropertyDefaultDescription
RegionAWS region (required)
PlatformApplicationArnSNS Platform Application ARN (required)
AccessKeyIdnullAWS access key (uses default credential chain when null)
SecretAccessKeynullAWS secret key (required if AccessKeyId set)
{
"Notifications": {
"AzureNotificationHubs": {
"ConnectionString": "Endpoint=sb://...",
"HubName": "my-notification-hub",
"TimeoutSeconds": 30
}
}
}
{
"Notifications": {
"SignalR": {
"RedisConnectionString": "redis:6379"
}
}
}
{
"Notifications": {
"Push": {
"VapidSubject": "mailto:[email protected]",
"VapidPublicKey": "BFx...",
"VapidPrivateKey": "vault:secret/data/webpush#private-key"
}
}
}
{
"Notifications": {
"Sse": {
"HeartbeatIntervalSeconds": 30,
"MaxConnectionsPerUser": 10,
"MaxBufferSize": 100
}
}
}
OptionDefaultDescription
HeartbeatIntervalSeconds30Keep-alive interval through proxies
MaxConnectionsPerUser10Concurrent SSE connections per user (covers multiple tabs/devices)
MaxBufferSize100Messages buffered per connection before oldest are dropped
{
"Notifications": {
"Zulip": {
"DefaultStream": "alerts",
"DefaultTopic": "system",
"Bot": {
"BaseUrl": "https://zulip.example.com",
"BotEmail": "[email protected]",
"ApiKey": "vault:secret/data/zulip#api-key",
"TimeoutSeconds": 30
}
}
}
}

Notification channel providers register opt-in health checks:

builder.Services.AddHealthChecks()
.AddGranitSmtpHealthCheck()
.AddGranitAwsSesHealthCheck()
.AddGranitBrevoHealthCheck()
.AddGranitAcsEmailHealthCheck()
.AddGranitAcsSmsHealthCheck()
.AddGranitAzureNotificationHubsHealthCheck()
.AddGranitAwsSnsSmsHealthCheck()
.AddGranitAwsSnsMobilePushHealthCheck()
.AddGranitScalewayEmailHealthCheck()
.AddGranitSendGridHealthCheck()
.AddGranitTwilioHealthCheck()
.AddGranitZulipHealthCheck();
ProviderExtensionProbeTags
SMTPAddGranitSmtpHealthCheck()EHLO handshake via MailKitreadiness
SESAddGranitAwsSesHealthCheck()GetAccount() — Degraded if sending pausedreadiness, startup
BrevoAddGranitBrevoHealthCheck()GET /accountreadiness
ACS EmailAddGranitAcsEmailHealthCheck()SendAsync probereadiness
ACS SMSAddGranitAcsSmsHealthCheck()SendAsync probereadiness
Azure Notification HubsAddGranitAzureNotificationHubsHealthCheck()Hub description retrievalreadiness
SNS SMSAddGranitAwsSnsSmsHealthCheck()SNS API connectivity checkreadiness, startup
SNS Mobile PushAddGranitAwsSnsMobilePushHealthCheck()SNS Platform Application checkreadiness, startup
Scaleway TEMAddGranitScalewayEmailHealthCheck()GET /emails?page_size=1readiness, startup
SendGridAddGranitSendGridHealthCheck()GET /scopesreadiness, startup
TwilioAddGranitTwilioHealthCheck()GET /Accounts/{sid}.jsonreadiness, startup
ZulipAddGranitZulipHealthCheck()GET /api/v1/users/me (Bot auth)readiness

All checks sanitize error messages — credentials, hostnames, and API keys are never exposed in the health check response. Every check enforces a 10-second defensive timeout via .WaitAsync() to prevent blocking Kubernetes probe cycles.

All fan-out and delivery operations are traced via ActivitySource:

Activity nameDescription
notifications.fanoutFan-out of a NotificationTrigger into delivery commands
notifications.deliverDelivery of a single DeliverNotificationCommand via a channel

Tags: notifications.type, notifications.channel, notifications.delivery_id, notifications.notification_id, notifications.recipient_count, notifications.delivery_count, notifications.success.