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

  1. Look at the chained cause (usually 'unable to list notification profiles') to find the root failure
  2. Fix the repository/storage access problem reported by the inner error
  3. Validate notification profile configuration in the repository
  4. 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

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


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)