Skip to content

Unsubscribing from project emails

Every invitation and reminder email the app sends contains an unsubscribe link. This is what happens when a contributor clicks it.

The unsubscribe page is intentionally simple. The link carries a token and a project ID; the page validates them and fires the unsubscribe immediately — no “are you sure?” dialog. The contributor sees a confirmation message and is done.

sequenceDiagram
    actor Contributor
    participant App as Your app

    Contributor->>App: Click unsubscribe link in email
    App->>App: Validate token + project ID
    App->>App: Unsubscribe (no confirmation prompt)
    App-->>Contributor: Show confirmation

The link’s token and project ID are also immediately removed from the address bar so they don’t sit in browser history.

StageTranslation key
While unsubscribingauth.Unsubscribe.unsubscribing — “Unsubscribing from email reminders…”
Successauth.Unsubscribe.unsubscribe-success — “You have been unsubscribed from email reminders for this project”
No token in URLauth.Unsubscribe.no-token
No project ID in URLauth.Unsubscribe.no-project
Unsubscribe failed (server error)auth.Unsubscribe.unsubscribe-failed

The page does not require sign-in — anyone with a valid link can use it.

All four messages live under auth.Unsubscribe.* in tep-configuration/translations/{locale}/main/auth.json. Override per client.

The unsubscribe URL pattern is part of your client configuration (unsubscribeUrl, with ${inviteToken} and ${projectId} placeholders). Per the invitation email design — see Inviting a contributor — what you can customise — this is one of the three URL templates a customer sets at deployment.

The flow is the same across all clients. The only thing that varies is the unsubscribe URL template (your unsubscribeUrl config) and the translations.

For the URL-sanitisation pattern (token + projectId stripped from URL on mount) and the mutation, see Unsubscribing (engineering).