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.
What happens
Section titled “What happens”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.
What the user sees
Section titled “What the user sees”| Stage | Translation key |
|---|---|
| While unsubscribing | auth.Unsubscribe.unsubscribing — “Unsubscribing from email reminders…” |
| Success | auth.Unsubscribe.unsubscribe-success — “You have been unsubscribed from email reminders for this project” |
| No token in URL | auth.Unsubscribe.no-token |
| No project ID in URL | auth.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.
What you can customise
Section titled “What you can customise”Translations
Section titled “Translations”All four messages live under auth.Unsubscribe.* in tep-configuration/translations/{locale}/main/auth.json. Override per client.
Where the link points
Section titled “Where the link points”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.
Variations for your deployment
Section titled “Variations for your 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.
Need more detail?
Section titled “Need more detail?”For the URL-sanitisation pattern (token + projectId stripped from URL on mount) and the mutation, see Unsubscribing (engineering).