{"record":{"id":"45da9d34fac48ecc","repo":"kopia/kopia","slug":"unable-to-get-notification-senders","errorCode":null,"errorMessage":"unable to get notification senders","messagePattern":"unable to get notification senders","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"notification/notification_send.go","lineNumber":142,"sourceCode":"\t\t}\n\n\t\tif err := rem.SendNotification(ctx, templateName, jsonData, eventArgs.EventArgsType(), int32(sev)); err != nil {\n\t\t\tlog(ctx).Warnw(\"unable to send notification\", \"err\", err)\n\t\t}\n\n\t\treturn\n\t}\n\n\tif err := SendInternal(ctx, rep, templateName, eventArgs, sev, opt); err != nil {\n\t\tlog(ctx).Warnw(\"unable to send notification\", \"err\", err)\n\t}\n}\n\n// SendInternal sends a notification for the given event and returns an error.\nfunc SendInternal(ctx context.Context, rep repo.Repository, templateName string, eventArgs notifydata.TypedEventArgs, sev Severity, opt notifytemplate.Options) error {\n\tsenders, err := notificationSendersFromRepo(ctx, rep, sev)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"unable to get notification senders\")\n\t}\n\n\tsenders = append(senders, AdditionalSenders...)\n\n\tvar resultErr error\n\n\tfor _, s := range senders {\n\t\tif err := SendTo(ctx, rep, s, templateName, eventArgs, sev, opt); err != nil {\n\t\t\tresultErr = stderrors.Join(resultErr, err)\n\t\t}\n\t}\n\n\treturn resultErr\n}\n\n// MakeTemplateArgs wraps event-specific arguments into TemplateArgs object.\nfunc MakeTemplateArgs(eventArgs notifydata.TypedEventArgs) TemplateArgs {\n\tnow := clock.Now()","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/kopia/kopia/blob/82495e54b584c1ef6073c9e1be048f57f8aef078/notification/notification_send.go#L124-L160","documentation":"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.","triggerScenarios":"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.","commonSituations":"Notifications triggered by scheduled snapshot jobs while the repository/storage is temporarily unavailable; misconfigured notification profiles that fail sender construction.","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"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// verify senders can be built before sending\nif _, err := notificationSendersFromRepo(ctx, rep, severity); err != nil {\n    return fmt.Errorf(\"senders unavailable: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"err := notification.Send(ctx, rep, tpl, args)\nif err != nil {\n    if strings.Contains(err.Error(), \"unable to get notification senders\") {\n        log.Warn(\"notification skipped: senders unavailable\", \"cause\", err)\n        return\n    }\n    return err\n}","preventionTips":["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"],"tags":["notification","repository","sender"],"backgroundTag":"upstream-api-error","analyzedSha":"82495e54b584c1ef6073c9e1be048f57f8aef078","analyzedAt":"2026-09-07T20:35:21.689Z","contentChangedAt":"2026-09-07T20:35:21.689Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}