mattermost-community/focalboard · error
The email already exists
Error message
The email already exists
What it means
RegisterUser returns this when a user with the requested email already exists. The store lookup by email found a live record, so registration is refused to keep emails unique.
Source
Thrown at server/app/auth.go:167
if username != "" {
var err error
user, err = a.store.GetUserByUsername(username)
if err != nil && !model.IsErrNotFound(err) {
return err
}
if user != nil {
return errors.New("The username already exists")
}
}
if user == nil && email != "" {
var err error
user, err = a.store.GetUserByEmail(email)
if err != nil && !model.IsErrNotFound(err) {
return err
}
if user != nil {
return errors.New("The email already exists")
}
}
// TODO: Move this into the config
passwordSettings := auth.PasswordSettings{
MinimumLength: 6,
}
err := auth.IsPasswordValid(password, passwordSettings)
if err != nil {
return errors.Wrap(err, "Invalid password")
}
_, err = a.store.CreateUser(&model.User{
ID: utils.NewID(utils.IDTypeUser),
Username: username,
Email: email,
Password: auth.HashPassword(password),View on GitHub (pinned to a84bbb65e3)
Solutions
- Use a different email address
- Detect the existing account and send a 'you already have an account' / login link instead of registering
- Pre-check with store.GetUserByEmail and handle ModelErrNotFound before calling
Example fix
// before
err := app.RegisterUser(sameEmail, name, password)
// after
if existing, _ := app.Store.GetUserByEmail(sameEmail); existing != nil {
return errors.New("an account with this email already exists; please log in")
}
err := app.RegisterUser(sameEmail, name, password) Defensive patterns
Strategy: validation
Validate before calling
if existing, err := store.GetUserByEmail(email); err == nil && existing != nil {
return fmt.Errorf("an account with email %s already exists", email)
} Type guard
func emailTaken(u *model.User) bool { return u != nil } Try / catch
err := a.RegisterUser(email, username, password)
if err != nil {
if strings.Contains(err.Error(), "already exists") {
return ErrEmailTaken
}
return errors.Wrap(err, "registration failed")
} Prevention
- Pre-check email availability before submitting registration
- Use model.IsErrNotFound(err) to distinguish 'not found' from real store errors
- Normalize/trim email addresses (lowercase) before checking and storing
When it happens
Trigger: a.RegisterUser(email, ...) with a non-empty email where store.GetUserByEmail(email) returns an existing user.
Common situations: Second signup with the same email; re-inviting an already-registered member; import data containing emails of existing users; dev DBs copied between environments.
Related errors
AI-assisted analysis of mattermost-community/focalboard@a84bbb65e3 (2026-08-30).
Data as JSON: /api/errors/73d7e73f6b68d3f4.
Report an issue: GitHub.