Expiring Links in Emails: Explain Recovery When the Link Is Too Old

Expiring Links in Emails: Explain Recovery When the Link Is Too Old

Design expired email links with accurate lifecycle states, safe replacement requests and recovery copy that helps the recipient finish the original task.

SendDart Team

TL;DR

  • Treat an expired email link as an expected, designed state: explain the link’s purpose, whether time matters, and how the recipient can recover without weakening the original access boundary.
  • Use differentiated handling and a clear recovery page: distinguish expired, revoked, used or malformed links and present an appropriate next step that preserves authorization checks.
  • Prevent abuse and verify behavior: apply rate limits and eligibility checks for replacements, decide how new links affect old ones, and test time boundaries and changed permissions.

Expiry is part of the user journey

An email link can be valid when sent and unavailable when the recipient eventually opens it. That is an expected state to design, not merely an error to catch. The email and destination should explain what the link does, whether time matters and how to recover.

Start with the action's purpose. A document download, invitation and password-reset link have different risks and recovery needs. Do not choose one expiry duration for every workflow simply because a shared helper already accepts that value.

The useful outcome is that the recipient can reach the right next step without weakening the original access boundary.

Separate expiry from other unavailable states

A link can be expired, revoked, already used, malformed or associated with an object that no longer exists. These states may look similar to a recipient, but the application should understand the difference.

For an illustrative workspace invitation, expiry can mean the invitation needs renewal. Revocation can mean the workspace owner deliberately withdrew access. Already used can mean the recipient should sign in to the workspace rather than request another invitation.

Avoid a universal “link expired” message that offers renewal even when the action was intentionally revoked. The recovery option must match the authoritative state.

Make the original email's promise accurate

If the email gives an expiry time, generate it from the same policy used by the server. Include an understandable timezone or duration where appropriate, and avoid relative wording that becomes misleading after a delivery delay.

For a document link, “Available until Friday at 17:00 UTC” is an illustrative form of precise copy, but only use such wording when the system can honor it. A message should not promise availability beyond the lifetime of the credentials or underlying resource that makes the link work.

Keep the expiry fact consistent in the HTML and plain-text versions, including any preview text that mentions how long the action remains available.

Design a recovery page that answers the next question

A useful expired-state page identifies the type of action without exposing unnecessary account information, explains that the current link can no longer perform it and presents the appropriate next step.

For the invitation example, the next step might be contacting the workspace owner or requesting a renewed invitation through a controlled flow. For a download, an authenticated account page may be the right place to generate fresh access if the user still has permission.

Do not automatically revive the original token. A replacement should be issued through the workflow's normal authorization and eligibility checks.

Keep replacement requests from becoming an abuse path

A “send another link” button can create repeated messages if it has no limits or state checks. Define rate controls, the eligible recipient and what happens when a recent replacement already exists.

For password resets, OWASP's guidance covers expiring, single-use tokens and consistent responses that avoid disclosing account existence. Apply the relevant protections to that sensitive workflow rather than exposing whether a submitted address has an account.

Other actions may need different wording and permissions, but they still require a deliberate replacement policy. Convenience should not bypass the reason the original link was scoped or time-limited.

Decide how newer links affect older ones

Document whether issuing a replacement invalidates previous links, and make the behavior understandable when recipients have several messages in their inbox. The policy should fit the operation and security requirements.

For an invitation, multiple active tokens for the same membership decision can complicate support and revocation. For a document download, the behavior may differ. Do not assume the same rule suits both.

Test the case where the user opens the oldest message after requesting a new one. The destination should guide them appropriately without entering an endless cycle of replacement emails.

Related reading: How to Stop Spam Emails in Gmail: A Practical Inbox Cleanup Guide.

Test time boundaries and changed permissions

Use fixtures just before and after expiry, along with revoked and already-completed actions. Check which clock and authoritative server state determines validity. A client-side countdown should not be the security mechanism.

Include a user who had access when the email was sent but no longer does. A fresh link must not be issued solely because the old message reached their inbox.

Also test a passive preview request. The application should not consume an ordinary one-time account action merely because the URL was inspected before the person acted.

Record state transitions without exposing tokens

Support staff need to understand whether a link expired naturally, was replaced or was revoked. Store appropriate identifiers and timestamps while avoiding raw bearer tokens in ordinary logs or public troubleshooting screenshots.

SendDart can deliver the initial and replacement messages that the application authorizes. The application owns the lifecycle and recovery policy. Treating expiry as a designed state makes that boundary clearer and gives recipients a practical path forward when an old email is no longer actionable.

Related reading: Scheduled Email Delivery: Store the Time, Content and Cancellation State.