Skip to content

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.

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.

A table of the company’s current users with name and email columns.

Visible textTranslation key
Page headingAdmin.users.title
”Add user” buttonAdmin.users.addUser
Table titleAdmin.users.table.title

Opens when the admin clicks “Add user”.

FieldTranslation key
Modal titleAdmin.users.addUser
Name field labelAdmin.users.table.columns.name
Email field labelAdmin.users.table.columns.email
”Create New User” buttonAdmin.users.createNewUser
”Cancel” buttoncommon.cancel

Field validation errors use keys under Admin.users.addNewUser.*.

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 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

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 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.

The flow is the same across all clients. Differences are only in:

  • Translations (your Admin.users.* overrides)
  • The company-user-invite MJML template (your branding)

For code paths, mutation orchestration, the admin-permission code path, and the email-send logic, see Inviting a team member (engineering).