{"record":{"id":"44d8276f5675a68a","repo":"knadh/listmonk","slug":"unknown-messenger-s-on-campaign-s","errorCode":null,"errorMessage":"unknown messenger %s on campaign %s","messagePattern":"unknown messenger (.+?) on campaign (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/manager/pipe.go","lineNumber":31,"sourceCode":"type pipe struct {\n\tcamp       *models.Campaign\n\trate       *ratecounter.RateCounter\n\twg         *sync.WaitGroup\n\tsent       atomic.Int64\n\tlastID     atomic.Uint64\n\terrors     atomic.Uint64\n\tstopped    atomic.Bool\n\twithErrors atomic.Bool\n\n\tm *Manager\n}\n\n// newPipe adds a campaign to the process queue.\nfunc (m *Manager) newPipe(c *models.Campaign) (*pipe, error) {\n\t// Validate messenger.\n\tif _, ok := m.messengers[c.Messenger]; !ok {\n\t\tm.store.UpdateCampaignStatus(c.ID, models.CampaignStatusCancelled)\n\t\treturn nil, fmt.Errorf(\"unknown messenger %s on campaign %s\", c.Messenger, c.Name)\n\t}\n\n\t// Resolve any inline images before compiling the template.\n\tif err := m.LoadInlineImages(c); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Load the template.\n\tif err := c.CompileTemplate(m.TemplateFuncs(c)); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Load any media/attachments.\n\tif err := m.attachMedia(c); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Add the campaign to the active map.","sourceCodeStart":13,"sourceCodeEnd":49,"githubUrl":"https://github.com/knadh/listmonk/blob/670c01717d48647093335cc23a6be6f4b79c3b6b/internal/manager/pipe.go#L13-L49","documentation":"newPipe validates that the campaign's Messenger field names a messenger registered with the manager. If it doesn't, the campaign is immediately marked cancelled in the store and this error is returned, so the campaign will never send with an unknown backend.","triggerScenarios":"scanCampaigns picks up a 'running' campaign whose messenger value doesn't match any registered messenger name — e.g. campaign configured for a messenger/provider that isn't initialized (disabled in config, provider not added via AddMessenger, or renamed).","commonSituations":"Config disabling a messenger (e.g. SMTP) while campaigns still target it, renaming a messenger and leaving old campaigns pointing at the old name, database imported from another instance with different messenger names, or initCaptcha-style provider init failing silently so the messenger was never registered.","solutions":["Register the missing messenger in configuration so AddMessenger is called for the name the campaign uses","Update the campaign's messenger field to an installed/registered messenger name","Check campaign Messenger value against the names returned by each messenger's Name() (case-sensitive match)","Note the campaign was auto-cancelled — after fixing config, reset the campaign status to draft/running to resend"],"exampleFix":"// before\nmessenger = \"mailgun\" // mailgun not configured on this instance\n// after\nmessenger = \"smtp\" // registered provider, matches msg.Name()","handlingStrategy":"validation","validationCode":"// Before setting a campaign live, confirm the messenger is registered\nif !mgr.HasMessenger(campaign.Messenger) {\n    return fmt.Errorf(\"messenger %q is not configured on this instance\", campaign.Messenger)\n}","typeGuard":null,"tryCatchPattern":"if _, err := m.newPipe(c); err != nil {\n    if strings.Contains(err.Error(), \"unknown messenger\") {\n        // campaign was auto-cancelled; fix config, reset status, requeue\n        return fixMessengerAndRequeue(c)\n    }\n    return err\n}","preventionTips":["Keep campaign messenger values in sync with configured messenger names (exact, case-sensitive)","When renaming a messenger, migrate all campaigns referencing the old name","Don't disable a messenger provider in config while campaigns still target it","After importing data from another instance, remap messenger names to local ones"],"tags":["messenger","campaign","configuration","not-found"],"backgroundTag":"unknown-messenger","analyzedSha":"670c01717d48647093335cc23a6be6f4b79c3b6b","analyzedAt":"2026-09-01T03:39:35.452Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}