Inviting a team member
This is how a company admin adds a new person to their organisation. The person receives an invitation email, follows the link, and accepts. Once accepted, they appear in the team list and can access projects.
What happens
Section titled “What happens”sequenceDiagram
actor Admin
participant App as Your app
actor Invitee
Admin->>App: Open /admin/users → click "Add user"
Admin->>App: Enter name + email, submit
App->>Invitee: Send invitation email
Invitee->>App: Click "Join" link in email
Invitee->>App: Confirm joining the company
App-->>Invitee: Redirect to projects list
The invitee’s side of the journey (clicking the link and confirming) is documented in Joining a company.
What the admin sees
Section titled “What the admin sees”The users list page
Section titled “The users list page”A table of the company’s current users with name and email columns.
| Visible text | Translation key |
|---|---|
| Page heading | Admin.users.title |
| ”Add user” button | Admin.users.addUser |
| Table title | Admin.users.table.title |
The Add User modal
Section titled “The Add User modal”Opens when the admin clicks “Add user”.
| Field | Translation key |
|---|---|
| Modal title | Admin.users.addUser |
| Name field label | Admin.users.table.columns.name |
| Email field label | Admin.users.table.columns.email |
| ”Create New User” button | Admin.users.createNewUser |
| ”Cancel” button | common.cancel |
Field validation errors use keys under Admin.users.addNewUser.*.
After submitting
Section titled “After submitting”A success snackbar appears with Admin.users.addUserSuccess and the table refreshes to include the new user (in a “pending” state until they accept the invitation).
If the email already belongs to a user of this company, the form shows an error (translated from a server error code that maps to the duplicate-user case).
The invitation email
Section titled “The invitation email”The new user receives a company-user-invite email with:
- Your client’s branding
- The inviter’s name and the company name
- A “Join” button that takes them to the join-company confirmation page (with the invitation token in the URL)
- A support email link for help
What you can customise
Section titled “What you can customise”Translations
Section titled “Translations”All admin UI text lives under Admin.users.* in tep-configuration/translations/{locale}/main/admin.json. Override per client in clients/{client}/translations/{locale}/overrides.json.
The invitation email
Section titled “The invitation email”The company-user-invite email can be customised per client. Provide your own {client}-company-user-invite.mjml to override the default; otherwise you inherit tep-company-user-invite.mjml.
The email subject line is constructed server-side as "Invitation to join {company name} on {system name}" and is not currently localised — see Known gap below.
Variations for your deployment
Section titled “Variations for your deployment”The flow is the same across all clients. Differences are only in:
- Translations (your
Admin.users.*overrides) - The
company-user-inviteMJML template (your branding)
Need more detail?
Section titled “Need more detail?”For code paths, mutation orchestration, the admin-permission code path, and the email-send logic, see Inviting a team member (engineering).