Identify what the address controls

An account email may be a sign-in name, password recovery destination, order receipt destination and fraud alert channel. Changing it is therefore more than editing a contact card. An attacker with a stolen active session could replace the address, request a password reset at the new inbox and lock out the customer. A legitimate customer might also mistype a new address or lose access to the old inbox. OWASP treats an email change as an identity change and recommends re-authentication, notice to the existing address and confirmation of the proposed address. The precise flow should reflect the account’s risk and whether multifactor authentication is enrolled.

Map every system that uses the address before promising an instant update. Authentication, password reset, invoices, delivery notices, support tickets and marketing subscriptions may have separate records and different consent rules. Decide which value is the account identifier and which is merely a communication preference. Use a stable internal account ID so an address change does not silently create a new customer, split order history or reassociate another person’s records. Preserve the original address for display and communication while applying a documented comparison policy; OWASP cautions against casually applying provider-specific tricks such as removing dots from Gmail names.

The first decision is who is allowed to begin the change. A valid signed-in session is the starting point, not sufficient proof for a sensitive change. Ask for a recent check with an existing authenticator: for example the enrolled multifactor method, or the current password when that is the available factor. Explain why the check is required in the interface without exposing whether a proposed address belongs to another account. If the customer cannot use the existing factor, send them through a separate account recovery route with its own safeguards. Do not let support staff bypass the check merely because a caller knows an order number.

Keep the request pending until checks finish

Store the proposed address as a pending change rather than replacing the active address at submission. Send a confirmation request to the new inbox, using a random, single-use, time-limited link or code tied to that specific account and proposed value. Notify the current inbox that a change was requested and show a clear path to report an unrecognised request. OWASP’s authentication guidance offers a stricter two-address confirmation process for password-only accounts, while its broader email guidance says to consider confirming both for high-risk systems. Choose and document the appropriate level; a notification alone is not proof that anyone read it.

Make the state visible to the customer. The account page should show that the old address remains active, the proposed address is awaiting verification, and what action is needed next. Allow a fresh confirmation message within reasonable rate limits and let the customer cancel a request they recognise as mistaken. An expired token should leave the current address unchanged and explain how to start again. If a second request supersedes the first, invalidate the old token so an outdated email cannot later switch the account unexpectedly. Define what happens if the new address is already associated with another account without revealing account membership to an unauthenticated observer.

A successful confirmation is a controlled handover, not a database field update in isolation. Change the active account address once the selected checks are complete, update the sign-in and recovery mapping together, and make sure future order messages use the intended destination. Decide whether existing sessions need to be ended or challenged again based on the risk of the account and the authentication design. Send a final notice to the old address so the customer can spot an unexpected completed change. Keep an auditable event trail of the request and outcome, but never store confirmation tokens or full tokenised URLs in ordinary logs.

Test the awkward cases before launch

Consider a small shop whose customer signs in with an email address and has several open orders. She changes from an old work inbox to a personal inbox. A safe test starts with her existing session, challenges her with the chosen existing factor, then shows a pending change while the old login and order notifications continue to work. Only after the new inbox is confirmed does the active sign-in and recovery address move. The team then checks an order confirmation and a password reset destination using test accounts, without sending real customer mail. This verifies the relationship between identity and communications, rather than merely seeing a green success message.

Now test the failure branches. What if the new inbox never receives mail, the link expires, the customer opens two tabs, or an old confirmation arrives after a new request? What if a hijacked session submits the attacker’s address but the legitimate customer clicks the alert in the old inbox? The interface must make cancellation and escalation possible before completion, and support must have a documented way to freeze a suspicious request. A user without access to the old inbox needs a separate recovery decision; quietly skipping old-address safeguards inside the ordinary change flow makes the security rule meaningless.

Finish with communication that matches the actual state. Do not say “your email has changed” while it is merely pending. Tell the customer which inbox received the confirmation, how to retry, and where to get help without sharing sensitive account details. Audit both language versions for the same distinction between requested, confirmed, expired, cancelled and completed. Monitor failed challenges, repeated requests and unexpected cancellations as signals for review, while limiting what personal data appears in logs. The useful launch criterion is that every state preserves the correct account owner and directs receipts and recovery to the intended verified address.

Decide how the team handles exceptions

Treat email deliverability as part of the security design. A confirmation message might be delayed, rejected or routed to junk mail. Show the proposed destination with suitable masking, offer a controlled resend, and explain when the customer should contact support. Do not automatically activate the new address merely because delivery failed; the failure means ownership is still unproved. If the old-address notification bounces, record that as a risk signal and follow the documented exception process. A mail provider’s accepted response is not proof that the recipient controlled the inbox or read the message.

Decide in advance what happens to operational messages during the pending period. A receipt for a newly placed order may need to continue going to the current verified address until the new one is confirmed; the account page should say so clearly. Marketing consent should not silently transfer or reset merely because the sign-in address changes. If an invoice must be reissued to a different recipient, that may be a separate customer-service decision with its own checks. Keeping these streams separate avoids a rushed implementation where one field update changes every communication route without the customer understanding the effect.

Support needs a narrow, testable escalation route. Staff should see the request state, timestamps and whether the required checks succeeded, without seeing reusable verification links. If a customer says they did not request the change, support can suspend the pending change and guide them through account protection. If a customer has lost the old inbox, support should not simply mark that inbox as confirmed; a separate recovery policy must define alternative evidence and who can approve it. Record the decision and restrict access to the case. These boundaries protect both staff and customers during a stressful conversation.

Before implementation, draw the state transitions on one page: current, pending, confirmed, expired, cancelled and disputed. For each transition, name the actor, proof required, message sent and effect on sign-in and recovery. Test that an old link cannot complete a superseded request, that a replayed code fails, and that two simultaneous confirmations cannot produce conflicting account records. The final interface copy should be reviewed against this diagram in both languages. A short state model catches omissions that a happy-path screen review misses, especially when separate teams own authentication, customer data and transactional email.

The flow also needs a clear policy for accounts that share an inbox. A family or small company may use one address for several customer records, while another system assumes email is unique. Define the account identity and duplicate-address rule before launch; never silently merge histories on the basis of an inbox match. When the proposed new address conflicts with an existing record, keep the current account unchanged and give the signed-in customer a safe support route. Test that an attacker cannot use this message to enumerate other accounts. This is especially important when the same address acts as both a login name and a receipt destination, because a mistaken merge could expose orders.

Before you release the change

  • Challenge the request with an existing authenticator and keep the new address pending.
  • Confirm the proposed inbox and give the current inbox a route to report an unexpected change.
  • Test expiration, repeated requests, order mail and password recovery with test accounts.

Sources & further reading