kopia/kopia · error
unable to get notification senders
Error message
unable to get notification senders
What it means
SendInternal is the entry point for sending kopia notifications. It first gathers senders via notificationSendersFromRepo; if that fails (most commonly the profile listing error 1094), it wraps the cause with 'unable to get notification senders' and aborts the send.
Solutions
- Look at the chained cause (usually 'unable to list notification profiles') to find the root failure
- Fix the repository/storage access problem reported by the inner error
- Validate notification profile configuration in the repository
- Retry the event/operation that triggered the notification
Defensive patterns
Strategy: try-catch
Validate before calling
// verify senders can be built before sending
if _, err := notificationSendersFromRepo(ctx, rep, severity); err != nil {
return fmt.Errorf("senders unavailable: %w", err)
} Try / catch
err := notification.Send(ctx, rep, tpl, args)
if err != nil {
if strings.Contains(err.Error(), "unable to get notification senders") {
log.Warn("notification skipped: senders unavailable", "cause", err)
return
}
return err
} Prevention
- Unwrap the full error chain to reach the root cause before fixing
- Validate notification profile setup after repository migration or restore
- Ensure AdditionalSenders and profiles are configured before enabling events
When it happens
Trigger: SendInternal (or Send / handleSendNotificationRequest) is invoked for an event and notificationSendersFromRepo returns an error — repository read failure while listing profiles or constructing per-profile senders.
Common situations: Notifications triggered by scheduled snapshot jobs while the repository/storage is temporarily unavailable; misconfigured notification profiles that fail sender construction.
Related errors
- unable to delete notification profile
- unable to get notification profile
- unable to list notification profiles
- unable to list notification profiles
- unable to save notification profile
AI-assisted analysis of kopia/kopia@82495e54b5 (2026-09-07).
Data as JSON: /api/errors/45da9d34fac48ecc.
Report an issue: GitHub.
Appendix: source
Thrown at notification/notification_send.go:142
}
if err := rem.SendNotification(ctx, templateName, jsonData, eventArgs.EventArgsType(), int32(sev)); err != nil {
log(ctx).Warnw("unable to send notification", "err", err)
}
return
}
if err := SendInternal(ctx, rep, templateName, eventArgs, sev, opt); err != nil {
log(ctx).Warnw("unable to send notification", "err", err)
}
}
// SendInternal sends a notification for the given event and returns an error.
func SendInternal(ctx context.Context, rep repo.Repository, templateName string, eventArgs notifydata.TypedEventArgs, sev Severity, opt notifytemplate.Options) error {
senders, err := notificationSendersFromRepo(ctx, rep, sev)
if err != nil {
return errors.Wrap(err, "unable to get notification senders")
}
senders = append(senders, AdditionalSenders...)
var resultErr error
for _, s := range senders {
if err := SendTo(ctx, rep, s, templateName, eventArgs, sev, opt); err != nil {
resultErr = stderrors.Join(resultErr, err)
}
}
return resultErr
}
// MakeTemplateArgs wraps event-specific arguments into TemplateArgs object.
func MakeTemplateArgs(eventArgs notifydata.TypedEventArgs) TemplateArgs {
now := clock.Now()View on GitHub (pinned to 82495e54b5)