plandex-ai/plandex · error
error validating email verification: %v
Error message
error validating email verification: %v
What it means
Wraps a failure from db.ValidateEmailVerification(req.Email, req.Pin) during non-local-mode sign-in. The email verification pin did not validate — wrong/expired pin, missing verification row, or a DB error.
Source
Thrown at app/server/handlers/auth_helpers.go:344
user, err = db.GetUserByEmail(req.Email)
if err != nil {
log.Printf("Error getting user: %v\n", err)
return nil, fmt.Errorf("error getting user: %v", err)
}
if user == nil {
log.Printf("User not found for email: %v\n", req.Email)
return nil, fmt.Errorf("not found")
}
// only validate email in non-local mode
if !isLocalMode {
emailVerificationId, err = db.ValidateEmailVerification(req.Email, req.Pin)
if err != nil {
log.Printf("Error validating email verification: %v\n", err)
return nil, fmt.Errorf("error validating email verification: %v", err)
}
log.Println("Email verification successful")
}
}
var token string
var authTokenId string
err = db.WithTx(r.Context(), "validate and sign in", func(tx *sqlx.Tx) error {
var err error
// create auth token
token, authTokenId, err = db.CreateAuthToken(user.Id, tx)
if err != nil {
log.Printf("Error creating auth token: %v\n", err)
return fmt.Errorf("error creating auth token: %v", err)
}View on GitHub (pinned to e2d772072e)
Solutions
- Have the user request a fresh verification pin and retry
- Verify isLocalMode expectation — dev bypass only applies when local mode is enabled
- Check expiry window/TTL configuration for email verifications
- Confirm email delivery is working so users actually receive pins
Example fix
// before
return nil, fmt.Errorf("error validating email verification: %v", err)
// after
log.Printf("email verification failed email=%s: %v", req.Email, err)
return nil, fmt.Errorf("error validating email verification: %v", err) Defensive patterns
Strategy: retry
Validate before calling
// client-side: ensure a pin was actually entered before submitting
if len(strings.TrimSpace(pin)) == 0 {
return errors.New("enter the verification pin from your email")
} Try / catch
user, err := ValidateAndSignIn(w, r, req)
if err != nil {
if strings.HasPrefix(err.Error(), "error validating email verification") {
http.Error(w, "invalid or expired pin — request a new one", http.StatusUnauthorized)
return
}
http.Error(w, err.Error(), http.StatusUnauthorized)
} Prevention
- Request a fresh pin on failure rather than retrying the same one
- Keep pin TTL generous enough for email delivery delay
- Verify email delivery pipeline health (bounce/complaint monitoring)
- In dev, enable isLocalMode to bypass verification
When it happens
Trigger: isLocalMode is false and the client's email+pin fails ValidateEmailVerification: pin mismatch, pin expired, verification record absent, or underlying DB error.
Common situations: User enters an old or mistyped pin; verification pin TTL expired; emails not delivered so user never got a fresh pin; clock skew invalidating expiry windows.
Related errors
- error verifying email: %v
- error creating email verification: %v
- error verifying email: %v
- User not found
- User email does not match
AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05).
Data as JSON: /api/errors/f9ad6b32b8e14de2.
Report an issue: GitHub.